-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbchaddr.go
More file actions
162 lines (135 loc) · 3.15 KB
/
bchaddr.go
File metadata and controls
162 lines (135 loc) · 3.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package bchaddr
import (
"github.com/btcsuite/btcutil/base58"
"errors"
"github.com/thoas/go-funk"
)
type decod struct {
hash []uint8
format string
network string
tp string
}
var VERSION_BYTE = map[string]map[string]byte{
"mainnet":{"P2PKH":0,"P2SH":5},
"testnet":{"P2PKH":111,"P2SH":196},
"regtest":{"P2PKH":111,"P2SH":196},
}
/**
* Translates the given address into cashaddr format.
*/
func ToCashAddress (address string, flag bool) (string, error) {
var prefix string
//prefix:= "bchreg"
d,err := decodeAddress(address)
if !flag{
if d.network == "mainnet"{
prefix = "bitcoincash"
}else{
prefix = "bchtest"
}
}else{
prefix = "bchreg"
}
addr,err := encode(prefix,d.tp,d.hash)
return addr,err
}
/*
func ToCashAddressRGT (address string) (string, error) {
prefix:= "bchreg"
d,err := decodeAddress(address)
addr,err := encode(prefix,d.tp,d.hash)
return addr,err
}*/
/**
* Translates the given address into legacy format.
*/
func ToLegacyAddress (address string) (string,error) {
decoded,err := decodeCashAddress(address)
if (decoded.format == "legacy") {
return address,err
}
return encodeAsLegacy(decoded),err
}
/**
* Encodes the given decoded address into legacy format.
*/
func encodeAsLegacy (dec decod) (string) {
var versionByte = VERSION_BYTE[dec.network][dec.tp]
return base58.CheckEncode(dec.hash,versionByte)
}
/**
* Attempts to decode the given address assuming it is a base58 address.
*/
func decodeAddress(addr string) (dec decod,err error) {
res,ver,err:=base58.CheckDecode(addr)
if err!=nil{
return dec,err
}
a:=concat([]uint8{ver},res)
versByte := a[0]
sl := a[1:]
var hh []uint8
for _,t := range sl{
hh=append(hh,uint8(t))
}
dec.hash = hh
switch versByte {
case 0:
dec.tp="P2PKH"
dec.network="mainnet"
dec.format="legacy"
case 5:
dec.tp="P2SH"
dec.network="mainnet"
dec.format="legacy"
case 111:
dec.tp="P2PKH"
dec.network="testnet"
dec.format="legacy"
case 196:
dec.tp="P2SH"
dec.network="testnet"
dec.format="legacy"
default:
return dec,errors.New("Wrong versByte")
}
return dec,nil
}
/**
* Attempts to decode the given address assuming it is a cashaddr address.
*/
func decodeCashAddress (address string)(dec decod, err error) {
if (funk.IndexOf(address,":") != -1) {
return decodeCashAddressWithPrefix(address)
}else{
return decod{},errors.New("Missed prefix")
}
/*else {
prefixes := []string{"bitcoincash", "bchtest", "bchreg"}
for i := 0; i < len(prefixes); i++ {
var prefix = prefixes[i]
return decodeCashAddressWithPrefix(prefix + ':' + address)
}
}*/
}
/**
* Attempts to decode the given address assuming it is a cashaddr address with explicit prefix.Ы
*/
func decodeCashAddressWithPrefix (address string)(dec decod, err error) {
decoded, err := decode(address)
dec.format="cashaddr"
dec.tp=decoded.tp
dec.hash=decoded.hash
switch (decoded.prefix) {
case "bitcoincash":
dec.network="mainnet"
case "bchtest":
dec.network="testnet"
case "bchreg":
dec.network="regtest"
default:
err=errors.New("Wrong prefix")
}
return dec,nil
}