Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make PoolAccount marshalling marshal weights as decimals #139

Merged
merged 12 commits into from
May 3, 2021
84 changes: 0 additions & 84 deletions x/gamm/types/account.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package types

import (
"encoding/json"
"errors"
"fmt"
"sort"
"strings"
"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"
Expand Down Expand Up @@ -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
}
88 changes: 0 additions & 88 deletions x/gamm/types/account_test.go
Original file line number Diff line number Diff line change
@@ -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 (
Expand Down Expand Up @@ -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())
}
127 changes: 127 additions & 0 deletions x/gamm/types/marshal.go
Original file line number Diff line number Diff line change
@@ -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 {
ValarDragon marked this conversation as resolved.
Show resolved Hide resolved
// 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
}
Loading