This repository has been archived by the owner on Oct 24, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
wallet.go
81 lines (66 loc) · 1.47 KB
/
wallet.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
package wallet
import (
"sync"
"encoding/json"
"github.com/btcsuite/btcutil"
"github.com/superstas/gcoin/gcoin/keys"
)
// Wallet represents a container with generated keys
type Wallet struct {
keys []*keys.Keys
sync.RWMutex
}
// Init creates a wallet with N pre-generated keys
func Init(n int) (*Wallet, error) {
k := make([]*keys.Keys, n)
for i := 0; i < n; i++ {
p, err := keys.New()
if err != nil {
return nil, err
}
k[i] = p
}
return &Wallet{keys: k}, nil
}
// Keys returns all existing keys in the wallet
func (w *Wallet) Keys() []*keys.Keys {
w.RLock()
defer w.RUnlock()
return w.keys
}
// AddKeys adds keys to the wallet
func (w *Wallet) AddKeys(k *keys.Keys) {
w.Lock()
defer w.Unlock()
w.keys = append(w.keys, k)
}
// Addresses returns all addresses for all existed keys
func (w *Wallet) Addresses() []*btcutil.AddressPubKeyHash {
w.RLock()
defer w.RUnlock()
addresses := make([]*btcutil.AddressPubKeyHash, len(w.keys))
for i, k := range w.keys {
addresses[i] = k.AddressPKH
}
return addresses
}
// MarshalJSON implements Marshaler interface
func (w *Wallet) MarshalJSON() ([]byte, error) {
k := struct {
Keys []*keys.Keys `json:"keys"`
}{w.Keys()}
return json.Marshal(&k)
}
// UnmarshalJSON implements Unmarshaler interface
func (w *Wallet) UnmarshalJSON(d []byte) error {
var k struct {
Keys []*keys.Keys `json:"keys"`
}
if err := json.Unmarshal(d, &k); err != nil {
return err
}
w.Lock()
w.keys = k.Keys
w.Unlock()
return nil
}