Skip to content

Commit

Permalink
Fixed a serialization bug of the Profile type
Browse files Browse the repository at this point in the history
Signed-off-by: riccardo.montagnin <riccardo.montagnin@gmail.com>
  • Loading branch information
RiccardoM committed May 6, 2021
1 parent 25f713a commit 0e8ce06
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 14 deletions.
44 changes: 40 additions & 4 deletions x/profiles/types/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,32 @@ func (p *Profile) GetAccount() authtypes.AccountI {
return p.Account.GetCachedValue().(authtypes.AccountI)
}

// setAccount sets the given account as the underlying account instance.
// This should be called after updating anything about the account (eg. after calling SetSequence).
func (p *Profile) setAccount(account authtypes.AccountI) error {
accAny, err := codectypes.NewAnyWithValue(account)
if err != nil {
return err
}

p.Account = accAny
return nil
}

// GetAddress implements authtypes.AccountI
func (p *Profile) GetAddress() sdk.AccAddress {
return p.GetAccount().GetAddress()
}

// SetAddress implements authtypes.AccountI
func (p *Profile) SetAddress(addr sdk.AccAddress) error {
return p.GetAccount().SetAddress(addr)
acc := p.GetAccount()
err := acc.SetAddress(addr)
if err != nil {
return err
}

return p.setAccount(acc)
}

// GetPubKey implements authtypes.AccountI
Expand All @@ -65,7 +83,13 @@ func (p *Profile) GetPubKey() cryptotypes.PubKey {

// SetPubKey implements authtypes.AccountI
func (p *Profile) SetPubKey(pubKey cryptotypes.PubKey) error {
return p.GetAccount().SetPubKey(pubKey)
acc := p.GetAccount()
err := acc.SetPubKey(pubKey)
if err != nil {
return err
}

return p.setAccount(acc)
}

// GetAccountNumber implements authtypes.AccountI
Expand All @@ -75,7 +99,13 @@ func (p *Profile) GetAccountNumber() uint64 {

// SetAccountNumber implements authtypes.AccountI
func (p *Profile) SetAccountNumber(accountNumber uint64) error {
return p.GetAccount().SetAccountNumber(accountNumber)
acc := p.GetAccount()
err := acc.SetAccountNumber(accountNumber)
if err != nil {
return err
}

return p.setAccount(acc)
}

// GetSequence implements authtypes.AccountI
Expand All @@ -85,7 +115,13 @@ func (p *Profile) GetSequence() uint64 {

// SetSequence implements authtypes.AccountI
func (p *Profile) SetSequence(sequence uint64) error {
return p.GetAccount().SetSequence(sequence)
acc := p.GetAccount()
err := acc.SetSequence(sequence)
if err != nil {
return err
}

return p.setAccount(acc)
}

// UnpackInterfaces implements codectypes.UnpackInterfacesMessage
Expand Down
50 changes: 40 additions & 10 deletions x/profiles/types/account_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,34 +26,64 @@ func assertNoProfileError(profile *types.Profile, err error) *types.Profile {
func TestProfile_Serialization(t *testing.T) {
cdc := app.MakeTestEncodingConfig().Marshaler

// Crete a BaseAccount
addr, err := sdk.AccAddressFromBech32("cosmos1y54exmx84cqtasvjnskf9f63djuuj68p7hqf47")
require.NoError(t, err)

protoAccount := authtypes.NewBaseAccountWithAddress(addr)

// Create a profile
protoAccount := &authtypes.BaseAccount{
Address: "",
PubKey: nil,
AccountNumber: 0,
Sequence: 0,
}
accountAny, err := codectypes.NewAnyWithValue(protoAccount)
require.NoError(t, err)

profile := &types.Profile{
Account: accountAny,
}

// Update the sequence
err = profile.SetSequence(profile.GetSequence() + 1)
bz, err := cdc.MarshalInterface(profile)
require.NoError(t, err)

var original authtypes.AccountI
err = cdc.UnmarshalInterface(bz, &original)
require.NoError(t, err)

// Update the data
addr2, err := sdk.AccAddressFromBech32("cosmos1tdgrkvx2qgjk0uqsmdhm6dcz6wvwh9f8t37x0k")
err = profile.SetAddress(addr2)
require.NoError(t, err)

pubKey, err := sdk.GetPubKeyFromBech32(
sdk.Bech32PubKeyTypeAccPub,
"cosmospub1addwnpepqtkndttcutq2sehejxs2x3jl2uhxzuds4705u8nkgayuct0khqkzjd0vvln",
)
require.NoError(t, err)
err = profile.SetPubKey(pubKey)
require.NoError(t, err)

err = profile.SetAccountNumber(100)
require.NoError(t, err)

err = profile.SetSequence(20)
require.NoError(t, err)

// Serialize
bz, err := cdc.MarshalInterface(profile)
bz, err = cdc.MarshalInterface(profile)
require.NoError(t, err)

// Deserialize
var serialized authtypes.AccountI
err = cdc.UnmarshalInterface(bz, &serialized)
require.NoError(t, err)

// Check the sequence
// Check the data
require.False(t, serialized.GetAddress().Equals(original.GetAddress()), "address not updated")
require.NotEqual(t, serialized.GetPubKey(), original.GetPubKey(), "pub key not updated")
require.NotEqual(t, serialized.GetAccountNumber(), original.GetAccountNumber(), "account number not updated")
require.NotEqual(t, serialized.GetSequence(), original.GetSequence(), "sequence not updated")

require.True(t, profile.GetAddress().Equals(serialized.GetAddress()), "addresses do not match")
require.Equal(t, profile.GetPubKey(), serialized.GetPubKey(), "pub keys do not match")
require.Equal(t, profile.GetAccountNumber(), serialized.GetAccountNumber(), "account numbers do not match")
require.Equal(t, profile.GetSequence(), serialized.GetSequence(), "sequences do not match")
}

Expand Down

0 comments on commit 0e8ce06

Please sign in to comment.