1
1
package bitcoin
2
2
3
3
import (
4
+ "fmt"
5
+
4
6
"github.com/btcsuite/btcd/chaincfg"
5
7
"github.com/btcsuite/btcutil"
6
8
"github.com/btcsuite/btcutil/base58"
7
9
"github.com/renproject/multichain/api/address"
8
- "github.com/renproject/pack"
9
10
)
10
11
11
12
// AddressEncodeDecoder implements the address.EncodeDecoder interface
@@ -37,11 +38,12 @@ func NewAddressEncoder(params *chaincfg.Params) AddressEncoder {
37
38
38
39
// EncodeAddress implements the address.Encoder interface
39
40
func (encoder AddressEncoder ) EncodeAddress (rawAddr address.RawAddress ) (address.Address , error ) {
41
+ // Validate that the base58 address is in fact in correct format.
40
42
encodedAddr := base58 .Encode ([]byte (rawAddr ))
41
43
if _ , err := btcutil .DecodeAddress (encodedAddr , encoder .params ); err != nil {
42
- // Check that the address is valid.
43
44
return address .Address ("" ), err
44
45
}
46
+
45
47
return address .Address (encodedAddr ), nil
46
48
}
47
49
@@ -58,10 +60,21 @@ func NewAddressDecoder(params *chaincfg.Params) AddressDecoder {
58
60
}
59
61
60
62
// DecodeAddress implements the address.Decoder interface
61
- func (decoder AddressDecoder ) DecodeAddress (addr address.Address ) (pack.Bytes , error ) {
62
- if _ , err := btcutil .DecodeAddress (string (addr ), decoder .params ); err != nil {
63
- // Check that the address is valid.
64
- return nil , err
63
+ func (decoder AddressDecoder ) DecodeAddress (addr address.Address ) (address.RawAddress , error ) {
64
+ // Decode the checksummed base58 format address.
65
+ decoded , ver , err := base58 .CheckDecode (string (addr ))
66
+ if err != nil {
67
+ return nil , fmt .Errorf ("checking: %v" , err )
68
+ }
69
+ if len (decoded ) != 20 {
70
+ return nil , fmt .Errorf ("expected len 20, got len %v" , len (decoded ))
71
+ }
72
+
73
+ // Validate the address format.
74
+ switch ver {
75
+ case decoder .params .PubKeyHashAddrID , decoder .params .ScriptHashAddrID :
76
+ return address .RawAddress (base58 .Decode (string (addr ))), nil
77
+ default :
78
+ return nil , fmt .Errorf ("unexpected address prefix" )
65
79
}
66
- return pack .NewBytes (base58 .Decode (string (addr ))), nil
67
80
}
0 commit comments