Skip to content

Commit ee4c98b

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

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

ledger/common/address.go

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

1717
import (
1818
"fmt"
19+
"strings"
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 strings.ToLower(addr) != 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)

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)