Skip to content

Commit

Permalink
internal/ethapi: make NewAccount return EIP-55 format (ethereum#26973)
Browse files Browse the repository at this point in the history
This change implements returning the address as EIP-55 encoded when creating a new account.
  • Loading branch information
alexmylonas authored and devopsbo3 committed Nov 10, 2023
1 parent b373df4 commit 0c076b9
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 5 deletions.
13 changes: 13 additions & 0 deletions common/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
}
24 changes: 24 additions & 0 deletions common/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}
11 changes: 6 additions & 5 deletions internal/ethapi/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit 0c076b9

Please sign in to comment.