Skip to content

Commit 1f89beb

Browse files
committed
feat(address): improved NewAddress to support both bech32/base58
Signed-off-by: Ales Verbic <[email protected]>
1 parent d5143a0 commit 1f89beb

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

ledger/common/address.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package common
1616

1717
import (
1818
"fmt"
19+
"unicode"
1920

2021
"github.com/blinklabs-io/gouroboros/base58"
2122
"github.com/blinklabs-io/gouroboros/bech32"
@@ -53,15 +54,25 @@ type Address struct {
5354
extraData []byte
5455
}
5556

56-
// NewAddress returns an Address based on the provided bech32 address string
57+
// NewAddress returns an Address based on the provided bech32/base58 address string
58+
// It detects if the string has mixed case assumes it is a base58 encoded address
59+
// otherwise, it assumes it is bech32 encoded
5760
func NewAddress(addr string) (Address, error) {
58-
_, data, err := bech32.DecodeNoLimit(addr)
59-
if err != nil {
60-
return Address{}, err
61-
}
62-
decoded, err := bech32.ConvertBits(data, 5, 8, false)
63-
if err != nil {
64-
return Address{}, err
61+
var decoded []byte
62+
var err error
63+
64+
if isMixedCase(addr) {
65+
// Mixed case detected: Assume Base58 encoding (e.g., Byron addresses)
66+
decoded = base58.Decode(addr)
67+
} else {
68+
_, data, err := bech32.DecodeNoLimit(addr)
69+
if err != nil {
70+
return Address{}, err
71+
}
72+
decoded, err = bech32.ConvertBits(data, 5, 8, false)
73+
if err != nil {
74+
return Address{}, err
75+
}
6576
}
6677
a := Address{}
6778
err = a.populateFromBytes(decoded)
@@ -286,3 +297,20 @@ func (a Address) String() string {
286297
func (a Address) MarshalJSON() ([]byte, error) {
287298
return []byte(`"` + a.String() + `"`), nil
288299
}
300+
301+
// isMixedCase checks if the string contains both uppercase and lowercase letters
302+
// returns true if it does, false otherwise
303+
func isMixedCase(s string) bool {
304+
hasUpper, hasLower := false, false
305+
for _, r := range s {
306+
if unicode.IsUpper(r) {
307+
hasUpper = true
308+
} else if unicode.IsLower(r) {
309+
hasLower = true
310+
}
311+
if hasUpper && hasLower {
312+
return true
313+
}
314+
}
315+
return false
316+
}

ledger/common/address_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"testing"
1919

2020
"github.com/blinklabs-io/gouroboros/internal/test"
21+
"github.com/stretchr/testify/assert"
2122
)
2223

2324
func TestAddressFromBytes(t *testing.T) {
@@ -225,3 +226,11 @@ func TestAddressStakeAddress(t *testing.T) {
225226
}
226227
}
227228
}
229+
230+
func TestAddressPaymentAddress_MixedCase(t *testing.T) {
231+
// address with mixed case Byron address
232+
mixedCaseAddress := "Ae2tdPwUPEYwFx4dmJheyNPPYXtvHbJLeCaA96o6Y2iiUL18cAt7AizN2zG"
233+
addr, err := NewAddress(mixedCaseAddress)
234+
assert.Nil(t, err, "Expected no error when decoding a mixed-case address")
235+
assert.NotNil(t, addr, "Expected a valid address object after decoding")
236+
}

0 commit comments

Comments
 (0)