-
Notifications
You must be signed in to change notification settings - Fork 11
/
txOut.go
79 lines (65 loc) · 2.04 KB
/
txOut.go
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
package cxcTransaction
import (
"errors"
"strings"
)
type TxOut struct {
amount []byte
lockScript []byte
}
func newTxOutForEmptyTrans(vout []Vout, addressPrefix AddressPrefix) ([]TxOut, error) {
if vout == nil || len(vout) == 0 {
return nil, errors.New("No address to send when create an empty transaction!")
}
var ret []TxOut
var prefixStr string
var p2pkhPrefixByte []byte
var p2wpkhPrefixByte []byte
prefixStr = addressPrefix.Bech32Prefix
p2pkhPrefixByte = addressPrefix.P2PKHPrefix
p2wpkhPrefixByte = addressPrefix.P2WPKHPrefix
for _, v := range vout {
amount := uint64ToLittleEndianBytes(v.Amount)
if strings.Index(v.Address, prefixStr) == 0 {
redeem, err := Bech32Decode(v.Address)
if err != nil {
return nil, errors.New("Invalid bech32 type address!")
}
redeem = append([]byte{byte(len(redeem))}, redeem...)
redeem = append([]byte{0x00}, redeem...)
ret = append(ret, TxOut{amount, redeem})
}
prefix, hash, err := DecodeCheck(v.Address)
if err != nil {
return nil, errors.New("Invalid address to send!")
}
if len(hash) != 0x14 {
return nil, errors.New("Invalid address to send!")
}
hash = append([]byte{byte(len(hash))}, hash...)
hash = append([]byte{OpCodeHash160}, hash...)
if byteArrayCompare(prefix, p2pkhPrefixByte) {
hash = append(hash, OpCodeEqualVerify, OpCodeCheckSig)
hash = append([]byte{OpCodeDup}, hash...)
} else if byteArrayCompare(prefix, p2wpkhPrefixByte) {
hash = append(hash, OpCodeEqual)
} else {
return nil, errors.New("Invalid address to send!")
}
ret = append(ret, TxOut{amount, hash})
}
return ret, nil
}
func (out TxOut) toBytes() ([]byte, error) {
if out.amount == nil || len(out.amount) != 8 {
return nil, errors.New("Invalid amount for a transaction output!")
}
if out.lockScript == nil || len(out.lockScript) == 0 {
return nil, errors.New("Invalid lock script for a transaction output!")
}
ret := []byte{}
ret = append(ret, out.amount...)
ret = append(ret, byte(len(out.lockScript)))
ret = append(ret, out.lockScript...)
return ret, nil
}