-
Notifications
You must be signed in to change notification settings - Fork 1
/
types.go
153 lines (126 loc) · 3.22 KB
/
types.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
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
150
151
152
153
package wallet
import (
"bytes"
"encoding/binary"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire"
)
type Utxo struct {
TxHash chainhash.Hash
Outpoint uint32
Value uint64
PkScript []byte
}
func (u Utxo) Bytes() []byte {
var buf bytes.Buffer
buf.Write(u.TxHash[:])
binary.Write(&buf, binary.BigEndian, u.Outpoint)
binary.Write(&buf, binary.BigEndian, u.Value)
buf.Write(u.PkScript)
return buf.Bytes()
}
func UtxoFromBytes(b []byte) Utxo {
buf := bytes.NewBuffer(b)
u := Utxo{}
hash, _ := chainhash.NewHash(buf.Next(32))
u.TxHash = *hash
binary.Read(buf, binary.BigEndian, &u.Outpoint)
binary.Read(buf, binary.BigEndian, &u.Value)
copy(u.PkScript, buf.Bytes())
return u
}
type StealthUtxo struct {
Utxo Utxo
EncOTK []byte
}
func (su StealthUtxo) Bytes() []byte {
var buf bytes.Buffer
wire.WriteVarBytes(&buf, 0, su.EncOTK)
buf.Write(su.Utxo.Bytes())
return buf.Bytes()
}
func StealthUtxoFromBytes(b []byte) StealthUtxo {
buf := bytes.NewBuffer(b)
su := StealthUtxo{}
encOtk, _ := wire.ReadVarBytes(buf, 0, 150, "encotk")
su.EncOTK = encOtk
su.Utxo = UtxoFromBytes(buf.Bytes())
return su
}
type OpenAssetUtxo struct {
AssetID []byte
Utxo Utxo
AssetValue uint64
Ours bool
}
func (oau OpenAssetUtxo) Bytes() []byte {
var buf bytes.Buffer
wire.WriteVarBytes(&buf, 0, oau.AssetID)
binary.Write(&buf, binary.BigEndian, oau.AssetValue)
binary.Write(&buf, binary.BigEndian, oau.Ours)
buf.Write(oau.Utxo.Bytes())
return buf.Bytes()
}
func OpenAssetUtxoFromBytes(b []byte) OpenAssetUtxo {
buf := bytes.NewBuffer(b)
oau := OpenAssetUtxo{}
assetId, _ := wire.ReadVarBytes(buf, 0, 80, "assetId")
oau.AssetID = assetId
binary.Read(buf, binary.BigEndian, &oau.AssetValue)
binary.Read(buf, binary.BigEndian, &oau.Ours)
oau.Utxo = UtxoFromBytes(buf.Bytes())
return oau
}
type OpenAssetIssuanceOutput struct {
RecipientPkh [20]byte
Value uint64
}
type OpenAssetTransferOutput struct {
AssetID []byte
RecipientPkh [20]byte
Value uint64
}
type OpenAssetTransaction struct {
NormalInputs []Utxo
AssetInputs []OpenAssetUtxo
Issuances []OpenAssetIssuanceOutput
Transfers []OpenAssetTransferOutput
ChangeAddress [20]byte
Metadata OpenAssetMetadata
}
type OpenAssetMetadata struct {
Ticker string
Decimals uint8
}
type OpenAsset struct {
AssetID []byte
Metadata OpenAssetMetadata
Follow bool
}
func (oa *OpenAsset) Bytes() []byte {
var buf bytes.Buffer
wire.WriteVarBytes(&buf, 0, oa.AssetID)
wire.WriteVarBytes(&buf, 0, []byte(oa.Metadata.Ticker))
binary.Write(&buf, binary.BigEndian, oa.Metadata.Decimals)
binary.Write(&buf, binary.BigEndian, oa.Follow)
return buf.Bytes()
}
func OpenAssetFromBytes(b []byte) *OpenAsset {
buf := bytes.NewBuffer(b)
oa := new(OpenAsset)
assetId, _ := wire.ReadVarBytes(buf, 0, 80, "assetId")
oa.AssetID = assetId
tickerBytes, _ := wire.ReadVarBytes(buf, 0, 80, "ticker")
oa.Metadata.Ticker = string(tickerBytes)
binary.Read(buf, binary.BigEndian, &oa.Metadata.Decimals)
binary.Read(buf, binary.BigEndian, &oa.Follow)
return oa
}
type StealthTransaction struct {
RecipientPubKey [33]byte
Amount uint64
}
type SendTransaction struct {
RecipientPkh [20]byte
Amount uint64
}