From fb5d84d3f59eb997c3bc847802c9445beb020cfd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 17:27:49 +0000 Subject: [PATCH 1/2] Bump github.com/google/uuid from 1.5.0 to 1.6.0 (#1819) * Bump github.com/google/uuid from 1.5.0 to 1.6.0 Bumps [github.com/google/uuid](https://github.com/google/uuid) from 1.5.0 to 1.6.0. - [Release notes](https://github.com/google/uuid/releases) - [Changelog](https://github.com/google/uuid/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/uuid/compare/v1.5.0...v1.6.0) --- updated-dependencies: - dependency-name: github.com/google/uuid dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Updated Changelog --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: dependabot[bot] --- CHANGELOG.md | 2 +- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c15849bb..c9dbf74a2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,7 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Dependencies - Bump `bufbuild/buf-setup-action` from 1.27.1 to 1.28.1 ([#1724](https://github.com/provenance-io/provenance/pull/1724), [#1744](https://github.com/provenance-io/provenance/pull/1744), [#1750](https://github.com/provenance-io/provenance/pull/1750)) -- Bump `github.com/google/uuid` from 1.3.1 to 1.5.0 ([#1723](https://github.com/provenance-io/provenance/pull/1723), [#1781](https://github.com/provenance-io/provenance/pull/1781)) +- Bump `github.com/google/uuid` from 1.3.1 to 1.6.0 ([#1723](https://github.com/provenance-io/provenance/pull/1723), [#1781](https://github.com/provenance-io/provenance/pull/1781), [#1819](https://github.com/provenance-io/provenance/pull/1819)) - Bump `github.com/gorilla/mux` from 1.8.0 to 1.8.1 ([#1734](https://github.com/provenance-io/provenance/pull/1734)) - Bump `golang.org/x/text` from 0.13.0 to 0.14.0 ([#1735](https://github.com/provenance-io/provenance/pull/1735)) - Bump `cosmossdk.io/math` from 1.1.2 to 1.2.0 ([#1739](https://github.com/provenance-io/provenance/pull/1739)) diff --git a/go.mod b/go.mod index 497994514b..799a00b375 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/ghodss/yaml v1.0.0 github.com/gogo/protobuf v1.3.3 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.5.0 + github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/otiai10/copy v1.14.0 diff --git a/go.sum b/go.sum index 4e95720d18..19561fcd7d 100644 --- a/go.sum +++ b/go.sum @@ -632,8 +632,8 @@ github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= From eb95a0874f7ffbe2c0ba2a9bc65466a43bad2c12 Mon Sep 17 00:00:00 2001 From: Matt Witkowski Date: Wed, 24 Jan 2024 14:50:15 -0500 Subject: [PATCH 2/2] Add nav unit conversion to upgrade handler. (#1816) * Add CHANGELOG entry. * Add function to get marker addr from key. * Add conversion func to upgrade handler, and an iterate all function to marker keeper. * Update changelog entry. * Add tests for upgrade. * Add test for upgrade. * Add test for GetMarkerFromNetAssetValue and fix bug. * Add additional test case for ConvertNAVUnits. * Add test for IterateAllNetAssetMarkers. * Add error checks. --- CHANGELOG.md | 1 + app/upgrades.go | 26 ++++++++ app/upgrades_test.go | 115 ++++++++++++++++++++++++++++++++- x/marker/keeper/keeper.go | 18 ++++++ x/marker/keeper/keeper_test.go | 94 +++++++++++++++++++++++++++ x/marker/types/key.go | 7 ++ x/marker/types/key_test.go | 8 +++ 7 files changed, 267 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9dbf74a2b..74689cb160 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features * Add the ibcratelimit module [#1498](https://github.com/provenance-io/provenance/issues/1498). +* Add fix for NAV units to tourmaline upgrade handler [#1815](https://github.com/provenance-io/provenance/issues/1815). ### Improvements diff --git a/app/upgrades.go b/app/upgrades.go index 0568160020..204c9891c1 100644 --- a/app/upgrades.go +++ b/app/upgrades.go @@ -127,6 +127,7 @@ var upgrades = map[string]appUpgrade{ } removeInactiveValidatorDelegations(ctx, app) + convertNavUnits(ctx, app) return vm, nil }, @@ -141,6 +142,7 @@ var upgrades = map[string]appUpgrade{ } removeInactiveValidatorDelegations(ctx, app) + convertNavUnits(ctx, app) return vm, nil }, @@ -349,3 +351,27 @@ func updateIbcMarkerDenomMetadata(ctx sdk.Context, app *App) { }) ctx.Logger().Info("Done updating ibc marker denom metadata") } + +// convertNavUnits iterates all the net asset values and updates their units if they are using usd. +func convertNavUnits(ctx sdk.Context, app *App) { + ctx.Logger().Info("Converting NAV units") + err := app.MarkerKeeper.IterateAllNetAssetValues(ctx, func(markerAddr sdk.AccAddress, nav markertypes.NetAssetValue) (stop bool) { + if nav.Price.Denom == markertypes.UsdDenom { + nav.Price.Amount = nav.Price.Amount.Mul(math.NewInt(10)) + marker, err := app.MarkerKeeper.GetMarker(ctx, markerAddr) + if err != nil { + ctx.Logger().Error(fmt.Sprintf("Unable to get marker for address: %s, error: %s", markerAddr, err)) + return false + } + err = app.MarkerKeeper.SetNetAssetValue(ctx, marker, nav, "upgrade") + if err != nil { + ctx.Logger().Error(fmt.Sprintf("Unable to set net asset value for marker: %s, error: %s", markerAddr, err)) + return false + } + } + return false + }) + if err != nil { + ctx.Logger().Error(fmt.Sprintf("Unable to iterate all net asset values error: %s", err)) + } +} diff --git a/app/upgrades_test.go b/app/upgrades_test.go index a431946155..643f408fda 100644 --- a/app/upgrades_test.go +++ b/app/upgrades_test.go @@ -425,13 +425,17 @@ func (s *UpgradeTestSuite) TestSaffron() { } func (s *UpgradeTestSuite) TestTourmalineRC1() { - expInLog := []string{} + expInLog := []string{ + "INF Converting NAV units", + } s.AssertUpgradeHandlerLogs("tourmaline-rc1", expInLog, nil) } func (s *UpgradeTestSuite) TestTourmaline() { - expInLog := []string{} + expInLog := []string{ + "INF Converting NAV units", + } s.AssertUpgradeHandlerLogs("tourmaline", expInLog, nil) } @@ -780,3 +784,110 @@ func (s *UpgradeTestSuite) TestSetExchangeParams() { }) } } + +func (s *UpgradeTestSuite) TestConvertNAVUnits() { + tests := []struct { + name string + markerNavs []sdk.Coins + expected []sdk.Coins + }{ + { + name: "should work with no markers", + markerNavs: []sdk.Coins{}, + expected: []sdk.Coins{}, + }, + { + name: "should work with one marker no usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + }, + expected: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + }, + }, + { + name: "should work with multiple markers no usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2)), + }, + expected: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2)), + }, + }, + { + name: "should work with one marker with usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(markertypes.UsdDenom, 2)), + }, + expected: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(markertypes.UsdDenom, 20)), + }, + }, + { + name: "should work with multiple markers with usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(markertypes.UsdDenom, 3)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2), sdk.NewInt64Coin(markertypes.UsdDenom, 4)), + }, + expected: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(markertypes.UsdDenom, 30)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2), sdk.NewInt64Coin(markertypes.UsdDenom, 40)), + }, + }, + } + + for _, tc := range tests { + s.Run(tc.name, func() { + // Create the marker + for i, prices := range tc.markerNavs { + address := sdk.AccAddress(fmt.Sprintf("marker%d", i)) + marker := markertypes.NewEmptyMarkerAccount(fmt.Sprintf("coin%d", i), address.String(), []markertypes.AccessGrant{}) + marker.Supply = sdk.OneInt() + s.Require().NoError(s.app.MarkerKeeper.AddMarkerAccount(s.ctx, marker), "AddMarkerAccount() error") + + var navs []markertypes.NetAssetValue + for _, price := range prices { + navs = append(navs, markertypes.NewNetAssetValue(price, uint64(1))) + navAddr := sdk.AccAddress(price.Denom) + if acc, _ := s.app.MarkerKeeper.GetMarkerByDenom(s.ctx, price.Denom); acc == nil { + navMarker := markertypes.NewEmptyMarkerAccount(price.Denom, navAddr.String(), []markertypes.AccessGrant{}) + navMarker.Supply = sdk.OneInt() + s.Require().NoError(s.app.MarkerKeeper.AddMarkerAccount(s.ctx, navMarker), "AddMarkerAccount() error") + } + } + s.Require().NoError(s.app.MarkerKeeper.AddSetNetAssetValues(s.ctx, marker, navs, "AddSetNetAssetValues() error")) + } + + // Test Logic + convertNavUnits(s.ctx, s.app) + for i := range tc.markerNavs { + marker, err := s.app.MarkerKeeper.GetMarkerByDenom(s.ctx, fmt.Sprintf("coin%d", i)) + s.Require().NoError(err, "GetMarkerByDenom() error") + var prices sdk.Coins + + s.app.MarkerKeeper.IterateNetAssetValues(s.ctx, marker.GetAddress(), func(state markertypes.NetAssetValue) (stop bool) { + prices = append(prices, state.Price) + return false + }) + s.Require().EqualValues(tc.expected[i], prices, "should update prices correctly for nav") + } + + // Destroy the marker + for i, prices := range tc.markerNavs { + coin := fmt.Sprintf("coin%d", i) + marker, err := s.app.MarkerKeeper.GetMarkerByDenom(s.ctx, coin) + s.Require().NoError(err, "GetMarkerByDenom() error") + s.app.MarkerKeeper.RemoveMarker(s.ctx, marker) + + // We need to remove the nav markers + for _, price := range prices { + if navMarker, _ := s.app.MarkerKeeper.GetMarkerByDenom(s.ctx, price.Denom); navMarker != nil { + s.app.MarkerKeeper.RemoveMarker(s.ctx, navMarker) + } + } + } + }) + } +} diff --git a/x/marker/keeper/keeper.go b/x/marker/keeper/keeper.go index 2b53938583..3b1b633d6b 100644 --- a/x/marker/keeper/keeper.go +++ b/x/marker/keeper/keeper.go @@ -324,6 +324,24 @@ func (k Keeper) IterateNetAssetValues(ctx sdk.Context, markerAddr sdk.AccAddress return nil } +// IterateAllNetAssetValues iterates all net asset values +func (k Keeper) IterateAllNetAssetValues(ctx sdk.Context, handler func(sdk.AccAddress, types.NetAssetValue) (stop bool)) error { + store := ctx.KVStore(k.storeKey) + it := sdk.KVStorePrefixIterator(store, types.NetAssetValuePrefix) + defer it.Close() + for ; it.Valid(); it.Next() { + markerAddr := types.GetMarkerFromNetAssetValueKey(it.Key()) + var markerNav types.NetAssetValue + err := k.cdc.Unmarshal(it.Value(), &markerNav) + if err != nil { + return err + } else if handler(markerAddr, markerNav) { + break + } + } + return nil +} + // RemoveNetAssetValues removes all net asset values for a marker func (k Keeper) RemoveNetAssetValues(ctx sdk.Context, markerAddr sdk.AccAddress) { store := ctx.KVStore(k.storeKey) diff --git a/x/marker/keeper/keeper_test.go b/x/marker/keeper/keeper_test.go index a24fc1d6a2..9573a388a9 100644 --- a/x/marker/keeper/keeper_test.go +++ b/x/marker/keeper/keeper_test.go @@ -1588,6 +1588,100 @@ func TestAddRemoveSendDeny(t *testing.T) { } } +func TestIterateAllNetAssetValues(t *testing.T) { + app := simapp.Setup(t) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + + tests := []struct { + name string + markerNavs []sdk.Coins + expected int + }{ + { + name: "should work with no markers", + markerNavs: []sdk.Coins{}, + expected: 0, + }, + { + name: "should work with one marker no usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + }, + expected: 1, + }, + { + name: "should work with multiple markers no usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2)), + }, + expected: 2, + }, + { + name: "should work with one marker with usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(types.UsdDenom, 2)), + }, + expected: 2, + }, + { + name: "should work with multiple markers with usd denom", + markerNavs: []sdk.Coins{ + sdk.NewCoins(sdk.NewInt64Coin("jackthecat", 1), sdk.NewInt64Coin(types.UsdDenom, 3)), + sdk.NewCoins(sdk.NewInt64Coin("georgethedog", 2), sdk.NewInt64Coin(types.UsdDenom, 4)), + }, + expected: 4, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + // Create the marker + for i, prices := range tc.markerNavs { + address := sdk.AccAddress(fmt.Sprintf("marker%d", i)) + marker := types.NewEmptyMarkerAccount(fmt.Sprintf("coin%d", i), address.String(), []types.AccessGrant{}) + marker.Supply = sdk.OneInt() + require.NoError(t, app.MarkerKeeper.AddMarkerAccount(ctx, marker), "AddMarkerAccount() error") + + var navs []types.NetAssetValue + for _, price := range prices { + navs = append(navs, types.NewNetAssetValue(price, uint64(1))) + navAddr := sdk.AccAddress(price.Denom) + if acc, _ := app.MarkerKeeper.GetMarkerByDenom(ctx, price.Denom); acc == nil { + navMarker := types.NewEmptyMarkerAccount(price.Denom, navAddr.String(), []types.AccessGrant{}) + navMarker.Supply = sdk.OneInt() + require.NoError(t, app.MarkerKeeper.AddMarkerAccount(ctx, navMarker), "AddMarkerAccount() error") + } + } + require.NoError(t, app.MarkerKeeper.AddSetNetAssetValues(ctx, marker, navs, "AddSetNetAssetValues() error")) + } + + // Test Logic + count := 0 + app.MarkerKeeper.IterateAllNetAssetValues(ctx, func(aa sdk.AccAddress, nav types.NetAssetValue) (stop bool) { + count += 1 + return false + }) + assert.Equal(t, tc.expected, count, "should iterate the correct number of times") + + // Destroy the marker + for i, prices := range tc.markerNavs { + coin := fmt.Sprintf("coin%d", i) + marker, err := app.MarkerKeeper.GetMarkerByDenom(ctx, coin) + require.NoError(t, err, "GetMarkerByDenom() error") + app.MarkerKeeper.RemoveMarker(ctx, marker) + + // We need to remove the nav markers + for _, price := range prices { + if navMarker, _ := app.MarkerKeeper.GetMarkerByDenom(ctx, price.Denom); navMarker != nil { + app.MarkerKeeper.RemoveMarker(ctx, navMarker) + } + } + } + }) + } +} + func TestReqAttrBypassAddrs(t *testing.T) { // Tests both GetReqAttrBypassAddrs and IsReqAttrBypassAddr. expectedNames := []string{ diff --git a/x/marker/types/key.go b/x/marker/types/key.go index 38f8d8a3d6..827b57bdb1 100644 --- a/x/marker/types/key.go +++ b/x/marker/types/key.go @@ -99,3 +99,10 @@ func NetAssetValueKeyPrefix(markerAddr sdk.AccAddress) []byte { func NetAssetValueKey(markerAddr sdk.AccAddress, denom string) []byte { return append(NetAssetValueKeyPrefix(markerAddr), denom...) } + +// GetMarkerFromNetAssetValueKey returns the marker address in the NetAssetValue key. +func GetMarkerFromNetAssetValueKey(key []byte) sdk.AccAddress { + markerKeyLen := key[1] + markerAddr := sdk.AccAddress(key[2 : markerKeyLen+2]) + return markerAddr +} diff --git a/x/marker/types/key_test.go b/x/marker/types/key_test.go index b82c8265fb..aa479d4ac9 100644 --- a/x/marker/types/key_test.go +++ b/x/marker/types/key_test.go @@ -55,6 +55,14 @@ func TestNetAssetValueKey(t *testing.T) { assert.Equal(t, "nhash", string(navKey[denomArrLen+2:])) } +func TestGetMarkerFromNetAssetValueKey(t *testing.T) { + addr, err := MarkerAddress("nhash") + require.NoError(t, err) + navKey := NetAssetValueKey(addr, "nhash") + addr2 := GetMarkerFromNetAssetValueKey(navKey) + assert.Equal(t, addr, addr2, "should match original marker address") +} + func TestDenySendMarkerPrefix(t *testing.T) { addr, err := MarkerAddress("nhash") require.NoError(t, err, "MarkerAddress(nhash)")