-
Notifications
You must be signed in to change notification settings - Fork 11
/
txAsset.go
82 lines (68 loc) · 2.19 KB
/
txAsset.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
80
81
82
package cxcTransaction
import (
"errors"
"strings"
)
func getTransferPayload(to AssetTransfer) []byte {
ret := []byte(AssetTransferSign)
sellfirstBytes, err := reverseHexToBytes(to.FirstSellTxID)
if err != nil {
return nil
}
ret = append(ret, sellfirstBytes...)
ret = append(ret, uint64ToLittleEndianBytes(to.Amount)...)
return ret
}
func getTransferAssetWithPayload(tos []AssetTransfer, addressPrefix AddressPrefix) (*[]TxOut, error) {
var prefixStr string
var p2pkhPrefixByte []byte
var p2wpkhPrefixByte []byte
prefixStr = addressPrefix.Bech32Prefix
p2pkhPrefixByte = addressPrefix.P2PKHPrefix
p2wpkhPrefixByte = addressPrefix.P2WPKHPrefix
ret := make([]TxOut, 0)
for _, to := range tos {
if strings.Index(to.Address, prefixStr) == 0 {
redeem, err := Bech32Decode(to.Address)
if err != nil {
return nil, errors.New("Invalid bech32 type address!")
}
redeem = append([]byte{byte(len(redeem))}, redeem...)
redeem = append([]byte{0x00}, redeem...)
payload := getTransferPayload(to)
if payload == nil {
return nil, errors.New("Failed to get asset payload!")
}
redeem = append(redeem, byte(len(payload)))
redeem = append(redeem, payload...)
redeem = append(redeem, OpDrop)
ret = append(ret, TxOut{uint64ToLittleEndianBytes(0), redeem})
}
prefix, hash, err := DecodeCheck(to.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!")
}
payload := getTransferPayload(to)
if payload == nil {
return nil, errors.New("Failed to get asset payload!")
}
hash = append(hash, byte(len(payload)))
hash = append(hash, payload...)
hash = append(hash, OpDrop)
ret = append(ret, TxOut{uint64ToLittleEndianBytes(0), hash})
}
return &ret, nil
}