diff --git a/x/gamm/types/account.go b/x/gamm/types/account.go index cae8ec04114..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,7 +8,6 @@ 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" @@ -463,85 +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 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"` -} - -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 - } - - 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: pa.PoolAssets, - }) - - 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 - } - - 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: pa.PoolAssets, - }) -} - -// 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 = alias.PoolAssets - - return nil -} diff --git a/x/gamm/types/account_test.go b/x/gamm/types/account_test.go index 9a48b778518..468112f5eea 100644 --- a/x/gamm/types/account_test.go +++ b/x/gamm/types/account_test.go @@ -1,17 +1,13 @@ 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" - - appParams "github.com/c-osmosis/osmosis/app/params" ) var ( @@ -573,87 +569,3 @@ func TestPoolAccountPokeTokenWeights(t *testing.T) { } } - -func TestPoolAccountMarshalYAML(t *testing.T) { - appParams.SetAddressPrefixes() - 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: osmo1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrlsa3tz - 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: "107374182400" - - token: - denom: test2 - amount: "50000" - weight: "214748364800" -` - 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..fde51dd178d --- /dev/null +++ b/x/gamm/types/marshal.go @@ -0,0 +1,127 @@ +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 (asset PoolAsset) prettify() poolAssetPretty { + return poolAssetPretty{ + Weight: sdk.NewDecFromInt(asset.Weight).QuoInt64(GuaranteedWeightPrecision), + Token: asset.Token, + } +} + +// 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. +func (pa PoolAsset) MarshalYAML() (interface{}, error) { + bz, err := yaml.Marshal(pa.prettify()) + if err != nil { + return nil, err + } + s := string(bz) + 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.Dec `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 { + 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 + } + + decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight).QuoInt64(GuaranteedWeightPrecision) + + bz, err := yaml.Marshal(poolAccountPretty{ + Address: accAddr, + PubKey: "", + AccountNumber: pa.AccountNumber, + Id: pa.Id, + PoolParams: pa.PoolParams, + FuturePoolGovernor: pa.FuturePoolGovernor, + TotalWeight: decTotalWeight, + TotalShare: pa.TotalShare, + PoolAssets: pa.PoolAssets, + }) + + if err != nil { + return nil, err + } + + return string(bz), 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 + } + + decTotalWeight := sdk.NewDecFromInt(pa.TotalWeight) + + return json.Marshal(poolAccountPretty{ + Address: accAddr, + PubKey: "", + AccountNumber: pa.AccountNumber, + Id: pa.Id, + PoolParams: pa.PoolParams, + FuturePoolGovernor: pa.FuturePoolGovernor, + TotalWeight: decTotalWeight, + TotalShare: pa.TotalShare, + PoolAssets: pa.PoolAssets, + }) +} + +// 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.RoundInt() + pa.TotalShare = alias.TotalShare + pa.PoolAssets = 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..50799e1332e --- /dev/null +++ b/x/gamm/types/marshal_test.go @@ -0,0 +1,183 @@ +package types + +import ( + "encoding/json" + "fmt" + "strings" + "testing" + "time" + + "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" +) + +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)), + }, +} + +func TestPoolAccountMarshalYAML(t *testing.T) { + appParams.SetAddressPrefixes() + pacc, err := NewPoolAccount(defaultPoolId, PoolParams{ + SwapFee: defaultSwapFee, + ExitFee: defaultExitFee, + }, ymlAssetTest, defaultFutureGovernor, defaultCurBlockTime) + require.NoError(t, err) + + bs, err := yaml.Marshal(pacc) + require.NoError(t, err) + + want := `| + address: osmo1m48tfmd0e6yqgfhraxl9ddt7lygpsnsrlsa3tz + 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: "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 TestLBPPoolAccountMarshalYAML(t *testing.T) { + appParams.SetAddressPrefixes() + 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) + + 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 + sequence: 0 + id: 10 + pool_params: + swap_fee: "0.025000000000000000" + exit_fee: "0.025000000000000000" + smooth_weight_change_params: + start_time: %s + 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" +`, expectedStartTimeString) + 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()) +}