From ae1d90e7102ba0404668e08d773126aa079b71ad Mon Sep 17 00:00:00 2001 From: Alex Mylonas Date: Wed, 17 May 2023 11:29:56 +0300 Subject: [PATCH] internal/ethapi: make NewAccount return EIP-55 format (#26973) This change implements returning the address as EIP-55 encoded when creating a new account. --- common/types.go | 13 +++++++++++++ common/types_test.go | 24 ++++++++++++++++++++++++ internal/ethapi/api.go | 11 ++++++----- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/common/types.go b/common/types.go index 0b68a19dd..3712df2fe 100644 --- a/common/types.go +++ b/common/types.go @@ -429,3 +429,16 @@ func (ma *MixedcaseAddress) ValidChecksum() bool { func (ma *MixedcaseAddress) Original() string { return ma.original } + +// AddressEIP55 is an alias of Address with a customized json marshaller +type AddressEIP55 Address + +// String returns the hex representation of the address in the manner of EIP55. +func (addr AddressEIP55) String() string { + return Address(addr).Hex() +} + +// MarshalJSON marshals the address in the manner of EIP55. +func (addr AddressEIP55) MarshalJSON() ([]byte, error) { + return json.Marshal(addr.String()) +} diff --git a/common/types_test.go b/common/types_test.go index 88c642522..ad892671b 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -559,3 +559,27 @@ func TestHash_Format(t *testing.T) { }) } } + +func TestAddressEIP55(t *testing.T) { + addr := HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") + addrEIP55 := AddressEIP55(addr) + + if addr.Hex() != addrEIP55.String() { + t.Fatal("AddressEIP55 should match original address hex") + } + + blob, err := addrEIP55.MarshalJSON() + if err != nil { + t.Fatal("Failed to marshal AddressEIP55", err) + } + if strings.Trim(string(blob), "\"") != addr.Hex() { + t.Fatal("Address with checksum is expected") + } + var dec Address + if err := json.Unmarshal(blob, &dec); err != nil { + t.Fatal("Failed to unmarshal AddressEIP55", err) + } + if addr != dec { + t.Fatal("Unexpected address after unmarshal") + } +} diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 5ebb6924e..9a821be0c 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -354,19 +354,20 @@ func (s *PersonalAccountAPI) DeriveAccount(url string, path string, pin *bool) ( } // NewAccount will create a new account and returns the address for the new account. -func (s *PersonalAccountAPI) NewAccount(password string) (common.Address, error) { +func (s *PersonalAccountAPI) NewAccount(password string) (common.AddressEIP55, error) { ks, err := fetchKeystore(s.am) if err != nil { - return common.Address{}, err + return common.AddressEIP55{}, err } acc, err := ks.NewAccount(password) if err == nil { - log.Info("Your new key was generated", "address", acc.Address) + addrEIP55 := common.AddressEIP55(acc.Address) + log.Info("Your new key was generated", "address", addrEIP55.String()) log.Warn("Please backup your key file!", "path", acc.URL.Path) log.Warn("Please remember your password!") - return acc.Address, nil + return addrEIP55, nil } - return common.Address{}, err + return common.AddressEIP55{}, err } // fetchKeystore retrieves the encrypted keystore from the account manager.