@@ -16,6 +16,7 @@ package common
16
16
17
17
import (
18
18
"fmt"
19
+ "unicode"
19
20
20
21
"github.com/blinklabs-io/gouroboros/base58"
21
22
"github.com/blinklabs-io/gouroboros/bech32"
@@ -53,15 +54,25 @@ type Address struct {
53
54
extraData []byte
54
55
}
55
56
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
57
60
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
+ }
65
76
}
66
77
a := Address {}
67
78
err = a .populateFromBytes (decoded )
@@ -286,3 +297,20 @@ func (a Address) String() string {
286
297
func (a Address ) MarshalJSON () ([]byte , error ) {
287
298
return []byte (`"` + a .String () + `"` ), nil
288
299
}
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
+ }
0 commit comments