From 804f24a418b14f17001d3a17b7a96504bb48d2fc Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 17:51:39 -0700 Subject: [PATCH 01/11] In printing out a pool's deets, convert pool asset weight to decimal --- x/gamm/types/account.go | 59 ++++++++++++++++++++++++++++-------- x/gamm/types/account_test.go | 4 +-- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/x/gamm/types/account.go b/x/gamm/types/account.go index cae8ec04114..3dca1eda3e1 100644 --- a/x/gamm/types/account.go +++ b/x/gamm/types/account.go @@ -13,6 +13,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -464,17 +465,45 @@ func (pa PoolAccount) SetSequence(seq uint64) error { return fmt.Errorf("not supported for pool accounts") } +type poolAssetPretty struct { + Weight sdk.Dec `json:"weight" yaml:"weight"` + Token types.Coin `json:"token" yaml:"token"` +} + +func (pa PoolAccount) getAllPoolAssetPretty() []poolAssetPretty { + prettyPoolAssets := make([]poolAssetPretty, len(pa.PoolAssets)) + for i, v := range pa.PoolAssets { + prettyPoolAssets[i] = poolAssetPretty{ + Weight: sdk.NewDecFromInt(v.Weight).QuoInt64(GuaranteedWeightPrecision), + Token: v.Token, + } + } + return prettyPoolAssets +} + +func uglifyPrettyPoolAssets(prettyAssets []poolAssetPretty) []PoolAsset { + // don't be mean to the standard assets D: + uglyPoolAssets := make([]PoolAsset, len(prettyAssets)) + for i, v := range prettyAssets { + uglyPoolAssets[i] = PoolAsset{ + Weight: v.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), + Token: v.Token, + } + } + return uglyPoolAssets +} + type poolAccountPretty struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - PubKey string `json:"public_key" yaml:"public_key"` - AccountNumber uint64 `json:"account_number" yaml:"account_number"` - Sequence uint64 `json:"sequence" yaml:"sequence"` - Id uint64 `json:"id" yaml:"id"` - PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` - FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` - TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` - TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` - PoolAssets []PoolAsset `json:"pool_assets" yaml:"pool_assets"` + Address sdk.AccAddress `json:"address" yaml:"address"` + PubKey string `json:"public_key" yaml:"public_key"` + AccountNumber uint64 `json:"account_number" yaml:"account_number"` + Sequence uint64 `json:"sequence" yaml:"sequence"` + Id uint64 `json:"id" yaml:"id"` + PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` + FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` + TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` + TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` + PoolAssets []poolAssetPretty `json:"pool_assets" yaml:"pool_assets"` } func (pa PoolAccount) String() string { @@ -489,6 +518,8 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { return nil, err } + prettyPoolAssets := pa.getAllPoolAssetPretty() + bs, err := yaml.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", @@ -498,7 +529,7 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { FuturePoolGovernor: pa.FuturePoolGovernor, TotalWeight: pa.TotalWeight, TotalShare: pa.TotalShare, - PoolAssets: pa.PoolAssets, + PoolAssets: prettyPoolAssets, }) if err != nil { @@ -515,6 +546,8 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { return nil, err } + prettyPoolAssets := pa.getAllPoolAssetPretty() + return json.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", @@ -524,7 +557,7 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { FuturePoolGovernor: pa.FuturePoolGovernor, TotalWeight: pa.TotalWeight, TotalShare: pa.TotalShare, - PoolAssets: pa.PoolAssets, + PoolAssets: prettyPoolAssets, }) } @@ -541,7 +574,7 @@ func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { pa.FuturePoolGovernor = alias.FuturePoolGovernor pa.TotalWeight = alias.TotalWeight pa.TotalShare = alias.TotalShare - pa.PoolAssets = alias.PoolAssets + pa.PoolAssets = uglifyPrettyPoolAssets(alias.PoolAssets) return nil } diff --git a/x/gamm/types/account_test.go b/x/gamm/types/account_test.go index f994178dfc7..222a927c5d4 100644 --- a/x/gamm/types/account_test.go +++ b/x/gamm/types/account_test.go @@ -613,11 +613,11 @@ func TestPoolAccountMarshalYAML(t *testing.T) { - token: denom: test1 amount: "10000" - weight: "107374182400" + weight: "100.000000000000000000" - token: denom: test2 amount: "50000" - weight: "214748364800" + weight: "200.000000000000000000" ` require.Equal(t, want, string(bs)) } From b3792f7c49e49b61f3c81ac76ea71712094d9957 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 17:54:03 -0700 Subject: [PATCH 02/11] Move marshalling code to its own file --- x/gamm/types/account.go | 117 --------------------------------- x/gamm/types/account_test.go | 85 ------------------------ x/gamm/types/marshal.go | 124 +++++++++++++++++++++++++++++++++++ x/gamm/types/marshal_test.go | 94 ++++++++++++++++++++++++++ 4 files changed, 218 insertions(+), 202 deletions(-) create mode 100644 x/gamm/types/marshal.go create mode 100644 x/gamm/types/marshal_test.go diff --git a/x/gamm/types/account.go b/x/gamm/types/account.go index 3dca1eda3e1..286f6e49a2c 100644 --- a/x/gamm/types/account.go +++ b/x/gamm/types/account.go @@ -1,7 +1,6 @@ package types import ( - "encoding/json" "errors" "fmt" "sort" @@ -9,11 +8,9 @@ import ( "time" "github.com/tendermint/tendermint/crypto" - "gopkg.in/yaml.v2" cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" - types "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" ) @@ -464,117 +461,3 @@ func (pa PoolAccount) SetPubKey(pubKey cryptotypes.PubKey) error { func (pa PoolAccount) SetSequence(seq uint64) error { return fmt.Errorf("not supported for pool accounts") } - -type poolAssetPretty struct { - Weight sdk.Dec `json:"weight" yaml:"weight"` - Token types.Coin `json:"token" yaml:"token"` -} - -func (pa PoolAccount) getAllPoolAssetPretty() []poolAssetPretty { - prettyPoolAssets := make([]poolAssetPretty, len(pa.PoolAssets)) - for i, v := range pa.PoolAssets { - prettyPoolAssets[i] = poolAssetPretty{ - Weight: sdk.NewDecFromInt(v.Weight).QuoInt64(GuaranteedWeightPrecision), - Token: v.Token, - } - } - return prettyPoolAssets -} - -func uglifyPrettyPoolAssets(prettyAssets []poolAssetPretty) []PoolAsset { - // don't be mean to the standard assets D: - uglyPoolAssets := make([]PoolAsset, len(prettyAssets)) - for i, v := range prettyAssets { - uglyPoolAssets[i] = PoolAsset{ - Weight: v.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), - Token: v.Token, - } - } - return uglyPoolAssets -} - -type poolAccountPretty struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - PubKey string `json:"public_key" yaml:"public_key"` - AccountNumber uint64 `json:"account_number" yaml:"account_number"` - Sequence uint64 `json:"sequence" yaml:"sequence"` - Id uint64 `json:"id" yaml:"id"` - PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` - FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` - TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` - TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` - PoolAssets []poolAssetPretty `json:"pool_assets" yaml:"pool_assets"` -} - -func (pa PoolAccount) String() string { - out, _ := pa.MarshalYAML() - return out.(string) -} - -// MarshalYAML returns the YAML representation of a PoolAccount. -func (pa PoolAccount) MarshalYAML() (interface{}, error) { - accAddr, err := sdk.AccAddressFromBech32(pa.Address) - if err != nil { - return nil, err - } - - prettyPoolAssets := pa.getAllPoolAssetPretty() - - bs, err := yaml.Marshal(poolAccountPretty{ - Address: accAddr, - PubKey: "", - AccountNumber: pa.AccountNumber, - Id: pa.Id, - PoolParams: pa.PoolParams, - FuturePoolGovernor: pa.FuturePoolGovernor, - TotalWeight: pa.TotalWeight, - TotalShare: pa.TotalShare, - PoolAssets: prettyPoolAssets, - }) - - if err != nil { - return nil, err - } - - return string(bs), nil -} - -// MarshalJSON returns the JSON representation of a PoolAccount. -func (pa PoolAccount) MarshalJSON() ([]byte, error) { - accAddr, err := sdk.AccAddressFromBech32(pa.Address) - if err != nil { - return nil, err - } - - prettyPoolAssets := pa.getAllPoolAssetPretty() - - return json.Marshal(poolAccountPretty{ - Address: accAddr, - PubKey: "", - AccountNumber: pa.AccountNumber, - Id: pa.Id, - PoolParams: pa.PoolParams, - FuturePoolGovernor: pa.FuturePoolGovernor, - TotalWeight: pa.TotalWeight, - TotalShare: pa.TotalShare, - PoolAssets: prettyPoolAssets, - }) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a PoolAccount. -func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { - var alias poolAccountPretty - if err := json.Unmarshal(bz, &alias); err != nil { - return err - } - - pa.BaseAccount = authtypes.NewBaseAccount(alias.Address, nil, alias.AccountNumber, alias.Sequence) - pa.Id = alias.Id - pa.PoolParams = alias.PoolParams - pa.FuturePoolGovernor = alias.FuturePoolGovernor - pa.TotalWeight = alias.TotalWeight - pa.TotalShare = alias.TotalShare - pa.PoolAssets = uglifyPrettyPoolAssets(alias.PoolAssets) - - return nil -} diff --git a/x/gamm/types/account_test.go b/x/gamm/types/account_test.go index 222a927c5d4..468112f5eea 100644 --- a/x/gamm/types/account_test.go +++ b/x/gamm/types/account_test.go @@ -1,13 +1,11 @@ package types import ( - "encoding/json" "fmt" "testing" "time" "github.com/stretchr/testify/require" - yaml "gopkg.in/yaml.v2" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -571,86 +569,3 @@ func TestPoolAccountPokeTokenWeights(t *testing.T) { } } - -func TestPoolAccountMarshalYAML(t *testing.T) { - var poolId uint64 = 10 - - ymlAssetTest := []PoolAsset{ - { - Weight: sdk.NewInt(200), - Token: sdk.NewCoin("test2", sdk.NewInt(50000)), - }, - { - Weight: sdk.NewInt(100), - Token: sdk.NewCoin("test1", sdk.NewInt(10000)), - }, - } - pacc, err := NewPoolAccount(poolId, PoolParams{ - SwapFee: defaultSwapFee, - ExitFee: defaultExitFee, - }, ymlAssetTest, defaultFutureGovernor, defaultCurBlockTime) - require.NoError(t, err) - - bs, err := yaml.Marshal(pacc) - require.NoError(t, err) - - want := `| - address: cosmos1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrhtwpas - public_key: "" - account_number: 0 - sequence: 0 - id: 10 - pool_params: - swap_fee: "0.025000000000000000" - exit_fee: "0.025000000000000000" - smooth_weight_change_params: null - future_pool_governor: "" - total_weight: "322122547200" - total_share: - denom: gamm/pool/10 - amount: "0" - pool_assets: - - token: - denom: test1 - amount: "10000" - weight: "100.000000000000000000" - - token: - denom: test2 - amount: "50000" - weight: "200.000000000000000000" -` - require.Equal(t, want, string(bs)) -} - -func TestPoolAccountJson(t *testing.T) { - var poolId uint64 = 10 - - jsonAssetTest := []PoolAsset{ - { - Weight: sdk.NewInt(200), - Token: sdk.NewCoin("test2", sdk.NewInt(50000)), - }, - { - Weight: sdk.NewInt(100), - Token: sdk.NewCoin("test1", sdk.NewInt(10000)), - }, - } - pacc, err := NewPoolAccount(poolId, PoolParams{ - SwapFee: defaultSwapFee, - ExitFee: defaultExitFee, - }, jsonAssetTest, defaultFutureGovernor, defaultCurBlockTime) - require.NoError(t, err) - - paccInternal := pacc.(*PoolAccount) - - bz, err := json.Marshal(pacc) - require.NoError(t, err) - - bz1, err := paccInternal.MarshalJSON() - require.NoError(t, err) - require.Equal(t, string(bz1), string(bz)) - - var a PoolAccount - require.NoError(t, json.Unmarshal(bz, &a)) - require.Equal(t, pacc.String(), a.String()) -} diff --git a/x/gamm/types/marshal.go b/x/gamm/types/marshal.go new file mode 100644 index 00000000000..65566935666 --- /dev/null +++ b/x/gamm/types/marshal.go @@ -0,0 +1,124 @@ +package types + +import ( + "encoding/json" + + sdk "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + "gopkg.in/yaml.v2" +) + +type poolAssetPretty struct { + Token types.Coin `json:"token" yaml:"token"` + Weight sdk.Dec `json:"weight" yaml:"weight"` +} + +func (pa PoolAccount) getAllPoolAssetPretty() []poolAssetPretty { + prettyPoolAssets := make([]poolAssetPretty, len(pa.PoolAssets)) + for i, v := range pa.PoolAssets { + prettyPoolAssets[i] = poolAssetPretty{ + Weight: sdk.NewDecFromInt(v.Weight).QuoInt64(GuaranteedWeightPrecision), + Token: v.Token, + } + } + return prettyPoolAssets +} + +func uglifyPrettyPoolAssets(prettyAssets []poolAssetPretty) []PoolAsset { + // don't be mean to the standard assets D: + uglyPoolAssets := make([]PoolAsset, len(prettyAssets)) + for i, v := range prettyAssets { + uglyPoolAssets[i] = PoolAsset{ + Weight: v.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), + Token: v.Token, + } + } + return uglyPoolAssets +} + +type poolAccountPretty struct { + Address sdk.AccAddress `json:"address" yaml:"address"` + PubKey string `json:"public_key" yaml:"public_key"` + AccountNumber uint64 `json:"account_number" yaml:"account_number"` + Sequence uint64 `json:"sequence" yaml:"sequence"` + Id uint64 `json:"id" yaml:"id"` + PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` + FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` + TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` + TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` + PoolAssets []poolAssetPretty `json:"pool_assets" yaml:"pool_assets"` +} + +func (pa PoolAccount) String() string { + out, _ := pa.MarshalYAML() + return out.(string) +} + +// MarshalYAML returns the YAML representation of a PoolAccount. +func (pa PoolAccount) MarshalYAML() (interface{}, error) { + accAddr, err := sdk.AccAddressFromBech32(pa.Address) + if err != nil { + return nil, err + } + + prettyPoolAssets := pa.getAllPoolAssetPretty() + + bs, err := yaml.Marshal(poolAccountPretty{ + Address: accAddr, + PubKey: "", + AccountNumber: pa.AccountNumber, + Id: pa.Id, + PoolParams: pa.PoolParams, + FuturePoolGovernor: pa.FuturePoolGovernor, + TotalWeight: pa.TotalWeight, + TotalShare: pa.TotalShare, + PoolAssets: prettyPoolAssets, + }) + + if err != nil { + return nil, err + } + + return string(bs), nil +} + +// MarshalJSON returns the JSON representation of a PoolAccount. +func (pa PoolAccount) MarshalJSON() ([]byte, error) { + accAddr, err := sdk.AccAddressFromBech32(pa.Address) + if err != nil { + return nil, err + } + + prettyPoolAssets := pa.getAllPoolAssetPretty() + + return json.Marshal(poolAccountPretty{ + Address: accAddr, + PubKey: "", + AccountNumber: pa.AccountNumber, + Id: pa.Id, + PoolParams: pa.PoolParams, + FuturePoolGovernor: pa.FuturePoolGovernor, + TotalWeight: pa.TotalWeight, + TotalShare: pa.TotalShare, + PoolAssets: prettyPoolAssets, + }) +} + +// UnmarshalJSON unmarshals raw JSON bytes into a PoolAccount. +func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { + var alias poolAccountPretty + if err := json.Unmarshal(bz, &alias); err != nil { + return err + } + + pa.BaseAccount = authtypes.NewBaseAccount(alias.Address, nil, alias.AccountNumber, alias.Sequence) + pa.Id = alias.Id + pa.PoolParams = alias.PoolParams + pa.FuturePoolGovernor = alias.FuturePoolGovernor + pa.TotalWeight = alias.TotalWeight + pa.TotalShare = alias.TotalShare + pa.PoolAssets = uglifyPrettyPoolAssets(alias.PoolAssets) + + return nil +} diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go new file mode 100644 index 00000000000..6885674b439 --- /dev/null +++ b/x/gamm/types/marshal_test.go @@ -0,0 +1,94 @@ +package types + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + yaml "gopkg.in/yaml.v2" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func TestPoolAccountMarshalYAML(t *testing.T) { + var poolId uint64 = 10 + + ymlAssetTest := []PoolAsset{ + { + Weight: sdk.NewInt(200), + Token: sdk.NewCoin("test2", sdk.NewInt(50000)), + }, + { + Weight: sdk.NewInt(100), + Token: sdk.NewCoin("test1", sdk.NewInt(10000)), + }, + } + pacc, err := NewPoolAccount(poolId, PoolParams{ + SwapFee: defaultSwapFee, + ExitFee: defaultExitFee, + }, ymlAssetTest, defaultFutureGovernor, defaultCurBlockTime) + require.NoError(t, err) + + bs, err := yaml.Marshal(pacc) + require.NoError(t, err) + + want := `| + address: cosmos1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrhtwpas + public_key: "" + account_number: 0 + sequence: 0 + id: 10 + pool_params: + swap_fee: "0.025000000000000000" + exit_fee: "0.025000000000000000" + smooth_weight_change_params: null + future_pool_governor: "" + total_weight: "322122547200" + total_share: + denom: gamm/pool/10 + amount: "0" + pool_assets: + - token: + denom: test1 + amount: "10000" + weight: "100.000000000000000000" + - token: + denom: test2 + amount: "50000" + weight: "200.000000000000000000" +` + require.Equal(t, want, string(bs)) +} + +func TestPoolAccountJson(t *testing.T) { + var poolId uint64 = 10 + + jsonAssetTest := []PoolAsset{ + { + Weight: sdk.NewInt(200), + Token: sdk.NewCoin("test2", sdk.NewInt(50000)), + }, + { + Weight: sdk.NewInt(100), + Token: sdk.NewCoin("test1", sdk.NewInt(10000)), + }, + } + pacc, err := NewPoolAccount(poolId, PoolParams{ + SwapFee: defaultSwapFee, + ExitFee: defaultExitFee, + }, jsonAssetTest, defaultFutureGovernor, defaultCurBlockTime) + require.NoError(t, err) + + paccInternal := pacc.(*PoolAccount) + + bz, err := json.Marshal(pacc) + require.NoError(t, err) + + bz1, err := paccInternal.MarshalJSON() + require.NoError(t, err) + require.Equal(t, string(bz1), string(bz)) + + var a PoolAccount + require.NoError(t, json.Unmarshal(bz, &a)) + require.Equal(t, pacc.String(), a.String()) +} From de657c163a44420b9ec91786c5cdb5921db03792 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 18:27:39 -0700 Subject: [PATCH 03/11] Make PoolAsset Marshal differently directly, instead of indirectly --- x/gamm/types/marshal.go | 92 ++++++++++++++++++++++-------------- x/gamm/types/marshal_test.go | 6 ++- 2 files changed, 60 insertions(+), 38 deletions(-) diff --git a/x/gamm/types/marshal.go b/x/gamm/types/marshal.go index 65566935666..f0bed184b78 100644 --- a/x/gamm/types/marshal.go +++ b/x/gamm/types/marshal.go @@ -14,40 +14,64 @@ type poolAssetPretty struct { Weight sdk.Dec `json:"weight" yaml:"weight"` } -func (pa PoolAccount) getAllPoolAssetPretty() []poolAssetPretty { - prettyPoolAssets := make([]poolAssetPretty, len(pa.PoolAssets)) - for i, v := range pa.PoolAssets { - prettyPoolAssets[i] = poolAssetPretty{ - Weight: sdk.NewDecFromInt(v.Weight).QuoInt64(GuaranteedWeightPrecision), - Token: v.Token, - } +func (asset PoolAsset) prettify() poolAssetPretty { + return poolAssetPretty{ + Weight: sdk.NewDecFromInt(asset.Weight).QuoInt64(GuaranteedWeightPrecision), + Token: asset.Token, } - return prettyPoolAssets } -func uglifyPrettyPoolAssets(prettyAssets []poolAssetPretty) []PoolAsset { - // don't be mean to the standard assets D: - uglyPoolAssets := make([]PoolAsset, len(prettyAssets)) - for i, v := range prettyAssets { - uglyPoolAssets[i] = PoolAsset{ - Weight: v.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), - Token: v.Token, - } +func (asset poolAssetPretty) uglify() PoolAsset { + return PoolAsset{ + Weight: asset.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), + Token: asset.Token, } - return uglyPoolAssets +} + +// MarshalJSON returns the JSON representation of a PoolAsset. +func (pa PoolAsset) MarshalJSON() ([]byte, error) { + return json.Marshal(pa.prettify()) +} + +// UnmarshalJSON unmarshals raw JSON bytes into a PoolAsset. +func (pa *PoolAsset) UnmarshalJSON(bz []byte) error { + var alias poolAssetPretty + if err := json.Unmarshal(bz, &alias); err != nil { + return err + } + + validAsset := alias.uglify() + + pa.Weight = validAsset.Weight + pa.Token = validAsset.Token + + return nil +} + +// MarshalYAML returns the YAML representation of a PoolAsset. +// This is assumed to not be called on a stand-alone instance, so it removes the first marshalled line. +func (pa PoolAsset) MarshalYAML() (interface{}, error) { + bz, err := yaml.Marshal(pa.prettify()) + if err != nil { + return nil, err + } + s := string(bz) + // lines := strings.Split(s, "\n") + // s = strings.Join(lines[1:], "") + return s, nil } type poolAccountPretty struct { - Address sdk.AccAddress `json:"address" yaml:"address"` - PubKey string `json:"public_key" yaml:"public_key"` - AccountNumber uint64 `json:"account_number" yaml:"account_number"` - Sequence uint64 `json:"sequence" yaml:"sequence"` - Id uint64 `json:"id" yaml:"id"` - PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` - FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` - TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` - TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` - PoolAssets []poolAssetPretty `json:"pool_assets" yaml:"pool_assets"` + Address sdk.AccAddress `json:"address" yaml:"address"` + PubKey string `json:"public_key" yaml:"public_key"` + AccountNumber uint64 `json:"account_number" yaml:"account_number"` + Sequence uint64 `json:"sequence" yaml:"sequence"` + Id uint64 `json:"id" yaml:"id"` + PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` + FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` + TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` + TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` + PoolAssets []PoolAsset `json:"pool_assets" yaml:"pool_assets"` } func (pa PoolAccount) String() string { @@ -62,9 +86,7 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { return nil, err } - prettyPoolAssets := pa.getAllPoolAssetPretty() - - bs, err := yaml.Marshal(poolAccountPretty{ + bz, err := yaml.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", AccountNumber: pa.AccountNumber, @@ -73,14 +95,14 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { FuturePoolGovernor: pa.FuturePoolGovernor, TotalWeight: pa.TotalWeight, TotalShare: pa.TotalShare, - PoolAssets: prettyPoolAssets, + PoolAssets: pa.PoolAssets, }) if err != nil { return nil, err } - return string(bs), nil + return string(bz), nil } // MarshalJSON returns the JSON representation of a PoolAccount. @@ -90,8 +112,6 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { return nil, err } - prettyPoolAssets := pa.getAllPoolAssetPretty() - return json.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", @@ -101,7 +121,7 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { FuturePoolGovernor: pa.FuturePoolGovernor, TotalWeight: pa.TotalWeight, TotalShare: pa.TotalShare, - PoolAssets: prettyPoolAssets, + PoolAssets: pa.PoolAssets, }) } @@ -118,7 +138,7 @@ func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { pa.FuturePoolGovernor = alias.FuturePoolGovernor pa.TotalWeight = alias.TotalWeight pa.TotalShare = alias.TotalShare - pa.PoolAssets = uglifyPrettyPoolAssets(alias.PoolAssets) + pa.PoolAssets = alias.PoolAssets return nil } diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 6885674b439..90fc90d3894 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -48,11 +48,13 @@ func TestPoolAccountMarshalYAML(t *testing.T) { denom: gamm/pool/10 amount: "0" pool_assets: - - token: + - | + token: denom: test1 amount: "10000" weight: "100.000000000000000000" - - token: + - | + token: denom: test2 amount: "50000" weight: "200.000000000000000000" From a2f28635f12bf26b45023745ac9704664ce2b2d5 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 18:31:42 -0700 Subject: [PATCH 04/11] Change serialization of TotalWeight --- x/gamm/types/marshal.go | 14 ++++++++------ x/gamm/types/marshal_test.go | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/x/gamm/types/marshal.go b/x/gamm/types/marshal.go index f0bed184b78..3c92201a645 100644 --- a/x/gamm/types/marshal.go +++ b/x/gamm/types/marshal.go @@ -56,8 +56,6 @@ func (pa PoolAsset) MarshalYAML() (interface{}, error) { return nil, err } s := string(bz) - // lines := strings.Split(s, "\n") - // s = strings.Join(lines[1:], "") return s, nil } @@ -69,7 +67,7 @@ type poolAccountPretty struct { Id uint64 `json:"id" yaml:"id"` PoolParams PoolParams `json:"pool_params" yaml:"pool_params"` FuturePoolGovernor string `json:"future_pool_governor" yaml:"future_pool_governor"` - TotalWeight sdk.Int `json:"total_weight" yaml:"total_weight"` + TotalWeight sdk.Dec `json:"total_weight" yaml:"total_weight"` TotalShare sdk.Coin `json:"total_share" yaml:"total_share"` PoolAssets []PoolAsset `json:"pool_assets" yaml:"pool_assets"` } @@ -86,6 +84,8 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { return nil, err } + decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight).QuoInt64(GuaranteedWeightPrecision) + bz, err := yaml.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", @@ -93,7 +93,7 @@ func (pa PoolAccount) MarshalYAML() (interface{}, error) { Id: pa.Id, PoolParams: pa.PoolParams, FuturePoolGovernor: pa.FuturePoolGovernor, - TotalWeight: pa.TotalWeight, + TotalWeight: decTotalWeight, TotalShare: pa.TotalShare, PoolAssets: pa.PoolAssets, }) @@ -112,6 +112,8 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { return nil, err } + decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight).QuoInt64(GuaranteedWeightPrecision) + return json.Marshal(poolAccountPretty{ Address: accAddr, PubKey: "", @@ -119,7 +121,7 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { Id: pa.Id, PoolParams: pa.PoolParams, FuturePoolGovernor: pa.FuturePoolGovernor, - TotalWeight: pa.TotalWeight, + TotalWeight: decTotalWeight, TotalShare: pa.TotalShare, PoolAssets: pa.PoolAssets, }) @@ -136,7 +138,7 @@ func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { pa.Id = alias.Id pa.PoolParams = alias.PoolParams pa.FuturePoolGovernor = alias.FuturePoolGovernor - pa.TotalWeight = alias.TotalWeight + pa.TotalWeight = alias.TotalWeight.MulInt64(GuaranteedWeightPrecision).RoundInt() pa.TotalShare = alias.TotalShare pa.PoolAssets = alias.PoolAssets diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 90fc90d3894..54fab2a4923 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -43,7 +43,7 @@ func TestPoolAccountMarshalYAML(t *testing.T) { exit_fee: "0.025000000000000000" smooth_weight_change_params: null future_pool_governor: "" - total_weight: "322122547200" + total_weight: "300.000000000000000000" total_share: denom: gamm/pool/10 amount: "0" From e388a406e10aa8dfa9edd224e98406fb2ce8c7b0 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 18:42:48 -0700 Subject: [PATCH 05/11] Undo changes to how PoolAsset serializes to JSON, only change its YML serialization --- x/gamm/types/marshal.go | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/x/gamm/types/marshal.go b/x/gamm/types/marshal.go index 3c92201a645..c401f59f82a 100644 --- a/x/gamm/types/marshal.go +++ b/x/gamm/types/marshal.go @@ -21,32 +21,13 @@ func (asset PoolAsset) prettify() poolAssetPretty { } } -func (asset poolAssetPretty) uglify() PoolAsset { - return PoolAsset{ - Weight: asset.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), - Token: asset.Token, - } -} - -// MarshalJSON returns the JSON representation of a PoolAsset. -func (pa PoolAsset) MarshalJSON() ([]byte, error) { - return json.Marshal(pa.prettify()) -} - -// UnmarshalJSON unmarshals raw JSON bytes into a PoolAsset. -func (pa *PoolAsset) UnmarshalJSON(bz []byte) error { - var alias poolAssetPretty - if err := json.Unmarshal(bz, &alias); err != nil { - return err - } - - validAsset := alias.uglify() - - pa.Weight = validAsset.Weight - pa.Token = validAsset.Token - - return nil -} +// D: at name +// func (asset poolAssetPretty) uglify() PoolAsset { +// return PoolAsset{ +// Weight: asset.Weight.MulInt64(GuaranteedWeightPrecision).RoundInt(), +// Token: asset.Token, +// } +// } // MarshalYAML returns the YAML representation of a PoolAsset. // This is assumed to not be called on a stand-alone instance, so it removes the first marshalled line. From abbf41ab33c178231ab5a4d3730b4fb278f4eb56 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 18:44:24 -0700 Subject: [PATCH 06/11] Make only YML serialization only do truncation --- x/gamm/types/marshal.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/gamm/types/marshal.go b/x/gamm/types/marshal.go index c401f59f82a..fde51dd178d 100644 --- a/x/gamm/types/marshal.go +++ b/x/gamm/types/marshal.go @@ -93,7 +93,7 @@ func (pa PoolAccount) MarshalJSON() ([]byte, error) { return nil, err } - decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight).QuoInt64(GuaranteedWeightPrecision) + decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight) return json.Marshal(poolAccountPretty{ Address: accAddr, @@ -119,7 +119,7 @@ func (pa *PoolAccount) UnmarshalJSON(bz []byte) error { pa.Id = alias.Id pa.PoolParams = alias.PoolParams pa.FuturePoolGovernor = alias.FuturePoolGovernor - pa.TotalWeight = alias.TotalWeight.MulInt64(GuaranteedWeightPrecision).RoundInt() + pa.TotalWeight = alias.TotalWeight.RoundInt() pa.TotalShare = alias.TotalShare pa.PoolAssets = alias.PoolAssets From 8dc0a459234c3079c8a29c55a0ac1b6714928a87 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 19:02:38 -0700 Subject: [PATCH 07/11] Add LBP YML serialization test --- x/gamm/types/marshal_test.go | 104 ++++++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 54fab2a4923..59c4ea5971d 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -3,6 +3,7 @@ package types import ( "encoding/json" "testing" + "time" "github.com/stretchr/testify/require" yaml "gopkg.in/yaml.v2" @@ -10,20 +11,19 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) -func TestPoolAccountMarshalYAML(t *testing.T) { - var poolId uint64 = 10 +var ymlAssetTest = []PoolAsset{ + { + Weight: sdk.NewInt(200), + Token: sdk.NewCoin("test2", sdk.NewInt(50000)), + }, + { + Weight: sdk.NewInt(100), + Token: sdk.NewCoin("test1", sdk.NewInt(10000)), + }, +} - ymlAssetTest := []PoolAsset{ - { - Weight: sdk.NewInt(200), - Token: sdk.NewCoin("test2", sdk.NewInt(50000)), - }, - { - Weight: sdk.NewInt(100), - Token: sdk.NewCoin("test1", sdk.NewInt(10000)), - }, - } - pacc, err := NewPoolAccount(poolId, PoolParams{ +func TestPoolAccountMarshalYAML(t *testing.T) { + pacc, err := NewPoolAccount(defaultPoolId, PoolParams{ SwapFee: defaultSwapFee, ExitFee: defaultExitFee, }, ymlAssetTest, defaultFutureGovernor, defaultCurBlockTime) @@ -62,6 +62,84 @@ func TestPoolAccountMarshalYAML(t *testing.T) { require.Equal(t, want, string(bs)) } +func TestLBPPoolAccountMarshalYAML(t *testing.T) { + lbpParams := SmoothWeightChangeParams{ + Duration: time.Hour, + TargetPoolWeights: []PoolAsset{ + { + Weight: sdk.NewInt(300), + Token: sdk.NewCoin("test2", sdk.NewInt(0)), + }, + { + Weight: sdk.NewInt(700), + Token: sdk.NewCoin("test1", sdk.NewInt(0)), + }, + }, + } + pacc, err := NewPoolAccount(defaultPoolId, PoolParams{ + SwapFee: defaultSwapFee, + ExitFee: defaultExitFee, + SmoothWeightChangeParams: &lbpParams, + }, ymlAssetTest, defaultFutureGovernor, defaultCurBlockTime) + require.NoError(t, err) + + bs, err := yaml.Marshal(pacc) + require.NoError(t, err) + + want := `| + address: cosmos1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrhtwpas + public_key: "" + account_number: 0 + sequence: 0 + id: 10 + pool_params: + swap_fee: "0.025000000000000000" + exit_fee: "0.025000000000000000" + smooth_weight_change_params: + start_time: 2021-04-17T15:53:20-07:00 + duration: 1h0m0s + initial_pool_weights: + - | + token: + denom: test1 + amount: "0" + weight: "100.000000000000000000" + - | + token: + denom: test2 + amount: "0" + weight: "200.000000000000000000" + target_pool_weights: + - | + token: + denom: test1 + amount: "0" + weight: "700.000000000000000000" + - | + token: + denom: test2 + amount: "0" + weight: "300.000000000000000000" + future_pool_governor: "" + total_weight: "300.000000000000000000" + total_share: + denom: gamm/pool/10 + amount: "0" + pool_assets: + - | + token: + denom: test1 + amount: "10000" + weight: "100.000000000000000000" + - | + token: + denom: test2 + amount: "50000" + weight: "200.000000000000000000" +` + require.Equal(t, want, string(bs)) +} + func TestPoolAccountJson(t *testing.T) { var poolId uint64 = 10 From d830ae4e00d0d4ce4da7f9e5f57aeb5e38f2fb10 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 19:16:57 -0700 Subject: [PATCH 08/11] Fix merge issue --- x/gamm/types/marshal_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 59c4ea5971d..83bca142746 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" yaml "gopkg.in/yaml.v2" + appParams "github.com/c-osmosis/osmosis/app/params" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -23,6 +24,7 @@ var ymlAssetTest = []PoolAsset{ } func TestPoolAccountMarshalYAML(t *testing.T) { + appParams.SetAddressPrefixes() pacc, err := NewPoolAccount(defaultPoolId, PoolParams{ SwapFee: defaultSwapFee, ExitFee: defaultExitFee, @@ -63,6 +65,7 @@ func TestPoolAccountMarshalYAML(t *testing.T) { } func TestLBPPoolAccountMarshalYAML(t *testing.T) { + appParams.SetAddressPrefixes() lbpParams := SmoothWeightChangeParams{ Duration: time.Hour, TargetPoolWeights: []PoolAsset{ From 705efc579763117a18650ca806032120c245a947 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 19:23:53 -0700 Subject: [PATCH 09/11] Fix second merge conflict --- x/gamm/types/account_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/x/gamm/types/account_test.go b/x/gamm/types/account_test.go index 35038a27263..468112f5eea 100644 --- a/x/gamm/types/account_test.go +++ b/x/gamm/types/account_test.go @@ -8,8 +8,6 @@ import ( "github.com/stretchr/testify/require" sdk "github.com/cosmos/cosmos-sdk/types" - - appParams "github.com/c-osmosis/osmosis/app/params" ) var ( From 69932dd31e7654c5b34d55b05adeb73c777a5624 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 19:27:56 -0700 Subject: [PATCH 10/11] Fix merge conflict #3 --- x/gamm/types/marshal_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 83bca142746..482328de4a3 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -35,7 +35,7 @@ func TestPoolAccountMarshalYAML(t *testing.T) { require.NoError(t, err) want := `| - address: cosmos1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrhtwpas + address: osmo1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrlsa3tz public_key: "" account_number: 0 sequence: 0 @@ -90,7 +90,7 @@ func TestLBPPoolAccountMarshalYAML(t *testing.T) { require.NoError(t, err) want := `| - address: cosmos1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrhtwpas + address: osmo1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrlsa3tz public_key: "" account_number: 0 sequence: 0 From 1c2986360b89df3bbcf14a214e4f4e7eadc2f203 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Sun, 2 May 2021 19:45:14 -0700 Subject: [PATCH 11/11] Make start_time serialization deterministic --- x/gamm/types/marshal_test.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/x/gamm/types/marshal_test.go b/x/gamm/types/marshal_test.go index 482328de4a3..50799e1332e 100644 --- a/x/gamm/types/marshal_test.go +++ b/x/gamm/types/marshal_test.go @@ -2,6 +2,8 @@ package types import ( "encoding/json" + "fmt" + "strings" "testing" "time" @@ -89,7 +91,11 @@ func TestLBPPoolAccountMarshalYAML(t *testing.T) { bs, err := yaml.Marshal(pacc) require.NoError(t, err) - want := `| + expectedStartTimeBz, err := yaml.Marshal(defaultCurBlockTime) + expectedStartTimeString := strings.Trim(string(expectedStartTimeBz), "\n") + require.NoError(t, err) + + want := fmt.Sprintf(`| address: osmo1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrlsa3tz public_key: "" account_number: 0 @@ -99,7 +105,7 @@ func TestLBPPoolAccountMarshalYAML(t *testing.T) { swap_fee: "0.025000000000000000" exit_fee: "0.025000000000000000" smooth_weight_change_params: - start_time: 2021-04-17T15:53:20-07:00 + start_time: %s duration: 1h0m0s initial_pool_weights: - | @@ -139,7 +145,7 @@ func TestLBPPoolAccountMarshalYAML(t *testing.T) { denom: test2 amount: "50000" weight: "200.000000000000000000" -` +`, expectedStartTimeString) require.Equal(t, want, string(bs)) }