From 23819b1ce524db302837f8cb707c2e6a89fef8d8 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Fri, 4 Jan 2019 14:09:39 -0800 Subject: [PATCH] Merge PR #3159: Add address interface * Add address interface * Add test for addresses * Address comments --- PENDING.md | 1 + types/address.go | 22 +++++++++++++++++++--- types/address_test.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/PENDING.md b/PENDING.md index 1def7cd422..908e98abf6 100644 --- a/PENDING.md +++ b/PENDING.md @@ -61,6 +61,7 @@ IMPROVEMENTS * Gaia CLI (`gaiacli`) * Gaia + * [\#2186](https://github.com/cosmos/cosmos-sdk/issues/2186) Add Address Interface * [\#3158](https://github.com/cosmos/cosmos-sdk/pull/3158) Validate slashing genesis * [\#3172](https://github.com/cosmos/cosmos-sdk/pull/3172) Support minimum fees in a local testnet. diff --git a/types/address.go b/types/address.go index 36eb5ac32b..a1663aebb5 100644 --- a/types/address.go +++ b/types/address.go @@ -31,6 +31,22 @@ const ( Bech32PrefixConsPub = "cosmosvalconspub" ) +// Address is a common interface for different types of addresses used by the SDK +type Address interface { + Equals(Address) bool + Empty() bool + Marshal() ([]byte, error) + MarshalJSON() ([]byte, error) + Bytes() []byte + String() string + Format(s fmt.State, verb rune) +} + +// Ensure that different address types implement the interface +var _ Address = AccAddress{} +var _ Address = ValAddress{} +var _ Address = ConsAddress{} + // ---------------------------------------------------------------------------- // account // ---------------------------------------------------------------------------- @@ -65,7 +81,7 @@ func AccAddressFromBech32(address string) (addr AccAddress, err error) { } // Returns boolean for whether two AccAddresses are Equal -func (aa AccAddress) Equals(aa2 AccAddress) bool { +func (aa AccAddress) Equals(aa2 Address) bool { if aa.Empty() && aa2.Empty() { return true } @@ -181,7 +197,7 @@ func ValAddressFromBech32(address string) (addr ValAddress, err error) { } // Returns boolean for whether two ValAddresses are Equal -func (va ValAddress) Equals(va2 ValAddress) bool { +func (va ValAddress) Equals(va2 Address) bool { if va.Empty() && va2.Empty() { return true } @@ -303,7 +319,7 @@ func GetConsAddress(pubkey crypto.PubKey) ConsAddress { } // Returns boolean for whether two ConsAddress are Equal -func (ca ConsAddress) Equals(ca2 ConsAddress) bool { +func (ca ConsAddress) Equals(ca2 Address) bool { if ca.Empty() && ca2.Empty() { return true } diff --git a/types/address_test.go b/types/address_test.go index 51c44a12cd..f3c44e4d34 100644 --- a/types/address_test.go +++ b/types/address_test.go @@ -221,3 +221,31 @@ func TestConfiguredPrefix(t *testing.T) { } } + +func TestAddressInterface(t *testing.T) { + var pub ed25519.PubKeyEd25519 + rand.Read(pub[:]) + + addrs := []types.Address{ + types.ConsAddress(pub.Address()), + types.ValAddress(pub.Address()), + types.AccAddress(pub.Address()), + } + + for _, addr := range addrs { + switch addr := addr.(type) { + case types.AccAddress: + _, err := types.AccAddressFromBech32(addr.String()) + require.Nil(t, err) + case types.ValAddress: + _, err := types.ValAddressFromBech32(addr.String()) + require.Nil(t, err) + case types.ConsAddress: + _, err := types.ConsAddressFromBech32(addr.String()) + require.Nil(t, err) + default: + t.Fail() + } + } + +}