-
Notifications
You must be signed in to change notification settings - Fork 19
/
wallet.go
126 lines (103 loc) · 2.93 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
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
// Copyright (c) 2022 Gobalsky Labs Limited
//
// Use of this software is governed by the Business Source License included
// in the LICENSE.VEGA file and at https://www.mariadb.com/bsl11.
//
// Change Date: 18 months from the later of the date of the first publicly
// available Distribution of this version of the repository, and 25 June 2022.
//
// On the date above, in accordance with the Business Source License, use
// of this software will be governed by version 3 or later of the GNU General
// Public License.
package nullchain
import (
"context"
"errors"
vgrand "code.vegaprotocol.io/vega/libs/rand"
api "code.vegaprotocol.io/vega/protos/vega/api/v1"
walletpb "code.vegaprotocol.io/vega/protos/vega/wallet/v1"
storev1 "code.vegaprotocol.io/vega/wallet/wallet/store/v1"
"code.vegaprotocol.io/vega/wallet/wallets"
)
var ErrFailedSubmission = errors.New("failed to submit transaction")
type Party struct {
wallet string
pubkey string
}
type Wallet struct {
handler *wallets.Handler
store *storev1.FileStore
passphrase string
}
func NewWallet(root, passphrase string) *Wallet {
store, _ := storev1.InitialiseStore(root)
return &Wallet{
handler: wallets.NewHandler(store),
store: store,
passphrase: passphrase,
}
}
func (w *Wallet) MakeParties(n uint64) ([]*Party, error) {
parties := make([]*Party, 0, n)
var err error
defer func() {
if err != nil {
w.DeleteParties(parties)
}
}()
// make n wallet's each with a single key
passphrase := "pin"
for i := uint64(0); i < n; i++ {
walletName := vgrand.RandomStr(10)
if _, err = w.handler.CreateWallet(walletName, passphrase); err != nil {
return nil, err
}
if err := w.handler.LoginWallet(walletName, passphrase); err != nil {
return nil, err
}
kp, err := w.handler.GenerateKeyPair(walletName, passphrase, nil)
if err != nil {
return nil, err
}
parties = append(parties, &Party{
wallet: walletName,
pubkey: kp.PublicKey(),
})
}
return parties, nil
}
func (w *Wallet) DeleteParties(party []*Party) {
ctx := context.Background()
for _, party := range party {
_ = w.store.DeleteWallet(ctx, party.wallet)
}
}
func (w *Wallet) Login(wallet string) {
_ = w.handler.LoginWallet(wallet, w.passphrase)
}
func (w *Wallet) SubmitTransaction(conn *Connection, party *Party, txn *walletpb.SubmitTransactionRequest) error {
blockHeight, _ := conn.LastBlockHeight()
w.Login(party.wallet)
// Add public key to the transaction
txn.PubKey = party.pubkey
chainID, err := conn.NetworkChainID()
if err != nil {
return err
}
signedTx, err := w.handler.SignTx(party.wallet, txn, blockHeight, chainID)
if err != nil {
return err
}
submitReq := &api.SubmitTransactionRequest{
Tx: signedTx,
Type: api.SubmitTransactionRequest_TYPE_SYNC,
}
submitResponse, err := conn.core.SubmitTransaction(context.Background(), submitReq)
if err != nil {
return err
}
if !submitResponse.Success {
return ErrFailedSubmission
}
return nil
}