From 1a28da163ddf316fb0d7f39e89fa88ae0b4cd021 Mon Sep 17 00:00:00 2001 From: kfangw Date: Tue, 17 Nov 2020 17:30:38 +0900 Subject: [PATCH] Revert "Mege PR #6749: auth: remove custom JSON marshaling" This reverts commit c25136154a56932778042caf0fae6ee58505020d. --- x/auth/types/account.go | 46 ++++++++++++++++++++++++++++++++++++ x/auth/types/account_test.go | 26 ++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/x/auth/types/account.go b/x/auth/types/account.go index 4aa5753117..a8d919a385 100644 --- a/x/auth/types/account.go +++ b/x/auth/types/account.go @@ -2,6 +2,7 @@ package types import ( "bytes" + "encoding/json" "errors" "time" @@ -167,3 +168,48 @@ func (acc BaseAccount) MarshalYAML() (interface{}, error) { return string(bz), err } + +// MarshalJSON returns the JSON representation of a BaseAccount. +func (acc BaseAccount) MarshalJSON() ([]byte, error) { + alias := baseAccountPretty{ + Address: acc.Address, + Coins: acc.Coins, + AccountNumber: acc.AccountNumber, + Sequence: acc.Sequence, + } + + if acc.PubKey != nil { + pks, err := sdk.Bech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, acc.PubKey) + if err != nil { + return nil, err + } + + alias.PubKey = pks + } + + return json.Marshal(alias) +} + +// UnmarshalJSON unmarshals raw JSON bytes into a BaseAccount. +func (acc *BaseAccount) UnmarshalJSON(bz []byte) error { + var alias baseAccountPretty + if err := json.Unmarshal(bz, &alias); err != nil { + return err + } + + if alias.PubKey != "" { + pk, err := sdk.GetPubKeyFromBech32(sdk.Bech32PubKeyTypeAccPub, alias.PubKey) + if err != nil { + return err + } + + acc.PubKey = pk + } + + acc.Address = alias.Address + acc.Coins = alias.Coins + acc.AccountNumber = alias.AccountNumber + acc.Sequence = alias.Sequence + + return nil +} diff --git a/x/auth/types/account_test.go b/x/auth/types/account_test.go index 14236172a8..7be6a25e56 100644 --- a/x/auth/types/account_test.go +++ b/x/auth/types/account_test.go @@ -1,6 +1,7 @@ package types import ( + "encoding/json" "errors" "testing" @@ -128,3 +129,28 @@ func TestGenesisAccountValidate(t *testing.T) { }) } } + +func TestBaseAccountJSON(t *testing.T) { + pubkey := secp256k1.GenPrivKey().PubKey() + addr := sdk.AccAddress(pubkey.Address()) + coins := sdk.NewCoins(sdk.NewInt64Coin("test", 5)) + baseAcc := NewBaseAccount(addr, coins, pubkey, 10, 50) + + bz, err := json.Marshal(baseAcc) + require.NoError(t, err) + + bz1, err := baseAcc.MarshalJSON() + require.NoError(t, err) + require.Equal(t, string(bz1), string(bz)) + + var a BaseAccount + require.NoError(t, json.Unmarshal(bz, &a)) + require.Equal(t, baseAcc.String(), a.String()) + + bz, err = ModuleCdc.MarshalJSON(baseAcc) + require.NoError(t, err) + + var b BaseAccount + require.NoError(t, ModuleCdc.UnmarshalJSON(bz, &b)) + require.Equal(t, baseAcc.String(), b.String()) +}