@@ -5,10 +5,15 @@ import (
5
5
"crypto/tls"
6
6
"crypto/x509"
7
7
"encoding/hex"
8
+ "errors"
8
9
"fmt"
9
10
"io/ioutil"
11
+ "os"
10
12
"path/filepath"
11
13
14
+ "google.golang.org/grpc/codes"
15
+ "google.golang.org/grpc/status"
16
+
12
17
pb "decred.org/dcrwallet/v2/rpc/walletrpc"
13
18
"google.golang.org/grpc"
14
19
"google.golang.org/grpc/credentials"
@@ -24,29 +29,35 @@ var (
24
29
)
25
30
26
31
func main () {
32
+ if err := run (); err != nil {
33
+ fmt .Println (err )
34
+ os .Exit (1 )
35
+ }
36
+ os .Exit (0 )
37
+ }
38
+
39
+ func run () error {
40
+ ctx , cancel := context .WithCancel (context .Background ())
41
+ defer cancel ()
27
42
serverCAs := x509 .NewCertPool ()
28
43
serverCert , err := ioutil .ReadFile (certificateFile )
29
44
if err != nil {
30
- fmt .Println (err )
31
- return
45
+ return err
32
46
}
33
47
if ! serverCAs .AppendCertsFromPEM (serverCert ) {
34
- fmt .Printf ("no certificates found in %s\n " , certificateFile )
35
- return
48
+ return fmt .Errorf ("no certificates found in %s\n " , certificateFile )
36
49
}
37
50
keypair , err := tls .LoadX509KeyPair (walletClientCertFile , walletClientKeyFile )
38
51
if err != nil {
39
- fmt .Println (err )
40
- return
52
+ return err
41
53
}
42
54
creds := credentials .NewTLS (& tls.Config {
43
55
Certificates : []tls.Certificate {keypair },
44
56
RootCAs : serverCAs ,
45
57
})
46
58
conn , err := grpc .Dial ("localhost:19111" , grpc .WithTransportCredentials (creds ))
47
59
if err != nil {
48
- fmt .Println (err )
49
- return
60
+ return err
50
61
}
51
62
defer conn .Close ()
52
63
c := pb .NewWalletServiceClient (conn )
@@ -55,33 +66,34 @@ func main() {
55
66
AccountNumber : 0 ,
56
67
RequiredConfirmations : 1 ,
57
68
}
58
- balanceResponse , err := c .Balance (context . Background () , balanceRequest )
69
+ balanceResponse , err := c .Balance (ctx , balanceRequest )
59
70
if err != nil {
60
- fmt .Println (err )
61
- return
71
+ return err
62
72
}
63
73
64
74
fmt .Println ("Spendable balance: " , dcrutil .Amount (balanceResponse .Spendable ))
65
75
66
- decodedTx := func (tx string ) {
76
+ decodedTx := func (tx string ) error {
67
77
rawTx , _ := hex .DecodeString (tx )
68
78
dmClient := pb .NewDecodeMessageServiceClient (conn )
69
79
decodeRequest := & pb.DecodeRawTransactionRequest {
70
80
SerializedTransaction : rawTx ,
71
81
}
72
- decodeResponse , err := dmClient .DecodeRawTransaction (context . Background () , decodeRequest )
82
+ decodeResponse , err := dmClient .DecodeRawTransaction (ctx , decodeRequest )
73
83
if err != nil {
74
- fmt .Println (err )
75
- return
84
+ return err
76
85
}
77
86
78
87
// tj, _ := json.MarshalIndent(decodeResponse.Transaction, "", " ")
79
88
// fmt.Println(string(tj))
80
89
fmt .Println (prototext.MarshalOptions {Multiline : true }.Format (decodeResponse .Transaction ))
90
+ return nil
81
91
}
82
92
83
93
for _ , tx := range txns {
84
- decodedTx (tx )
94
+ if err := decodedTx (tx ); err != nil {
95
+ return err
96
+ }
85
97
}
86
98
87
99
wsClient := pb .NewWalletServiceClient (conn )
@@ -91,39 +103,98 @@ func main() {
91
103
// testing wallet.
92
104
scriptB , err := hex .DecodeString (script )
93
105
if err != nil {
94
- fmt .Println (err )
95
- return
106
+ return err
96
107
}
97
108
importScriptRequest := & pb.ImportScriptRequest {
98
109
Script : scriptB ,
99
110
}
100
- _ , err = wsClient .ImportScript (context . Background () , importScriptRequest )
111
+ _ , err = wsClient .ImportScript (ctx , importScriptRequest )
101
112
if err != nil {
102
- fmt .Println (err )
103
- return
113
+ return err
104
114
}
105
115
}
106
116
107
- // Add an owned address to validated addresses.
108
- nextAddressResp , err := wsClient .NextAddress (context .Background (), new (pb.NextAddressRequest ))
117
+ const acctName = "testing_acct"
118
+ var (
119
+ seed [32 ]byte
120
+ acctPass = []byte ("pass123" )
121
+ acctN uint32
122
+ )
123
+ seed [31 ] = 1
124
+
125
+ // Import a voting account from seed.
126
+ importVAFSRequest := & pb.ImportVotingAccountFromSeedRequest {
127
+ Seed : seed [:],
128
+ Name : acctName ,
129
+ Passphrase : acctPass ,
130
+ }
131
+ importVAFSReqResp , err := wsClient .ImportVotingAccountFromSeed (ctx , importVAFSRequest )
109
132
if err != nil {
110
- fmt .Println (err )
111
- return
133
+ if status .Code (err ) != codes .AlreadyExists {
134
+ return err
135
+ }
136
+ acctsResp , err := wsClient .Accounts (ctx , & pb.AccountsRequest {})
137
+ if err != nil {
138
+ return err
139
+ }
140
+ var found bool
141
+ for _ , acct := range acctsResp .Accounts {
142
+ if acct .AccountName == acctName {
143
+ found = true
144
+ acctN = acct .AccountNumber
145
+ }
146
+ }
147
+ if ! found {
148
+ return errors .New ("testing account not found" )
149
+ }
150
+ } else {
151
+ acctN = importVAFSReqResp .Account
112
152
}
113
- validateAddrs = append (validateAddrs , nextAddressResp .Address )
153
+
154
+ fmt .Println ("Testing account number is" , acctN )
155
+ fmt .Println ()
156
+
157
+ // Add requests for addresses from the voting account which should fail.
158
+ nextAddrs = append (nextAddrs ,
159
+ nextAddr {name : "imported voting account external" , acct : acctN , branch : 0 , wantErr : true },
160
+ nextAddr {name : "imported voting account internal" , acct : acctN , branch : 1 , wantErr : true })
161
+
162
+ for _ , addr := range nextAddrs {
163
+ // Add an owned address to validated addresses.
164
+ nextAddrReq := & pb.NextAddressRequest {
165
+ Account : addr .acct ,
166
+ Kind : addr .branch ,
167
+ GapPolicy : pb .NextAddressRequest_GAP_POLICY_IGNORE ,
168
+ }
169
+ nextAddressResp , err := wsClient .NextAddress (context .Background (), nextAddrReq )
170
+ if addr .wantErr {
171
+ if err != nil {
172
+ continue
173
+ }
174
+ return fmt .Errorf ("nextAddrs: expected error for %s" , addr .name )
175
+ }
176
+ if err != nil {
177
+ return err
178
+ }
179
+ validateAddrs = append (validateAddrs , nextAddressResp .Address )
180
+ }
181
+
182
+ fmt .Println ("ValidateAddress..." )
183
+ fmt .Println ()
114
184
115
185
for _ , addr := range validateAddrs {
116
186
validateAddrRequest := & pb.ValidateAddressRequest {
117
187
Address : addr ,
118
188
}
119
- validateAddrResp , err := wsClient .ValidateAddress (context . Background () , validateAddrRequest )
189
+ validateAddrResp , err := wsClient .ValidateAddress (ctx , validateAddrRequest )
120
190
if err != nil {
121
- fmt .Println (err )
122
- return
191
+ return err
123
192
}
124
193
fmt .Println (validateAddrResp .ScriptType )
125
194
fmt .Println (prototext.MarshalOptions {Multiline : true }.Format (validateAddrResp ))
126
195
}
196
+
197
+ return nil
127
198
}
128
199
129
200
var txns = []string {
@@ -168,4 +239,17 @@ var validateAddrs = []string{
168
239
"TcfdqCrK2fiFJBZnGj5N6xs6rMsbQBsJBYf" , // TSPEND
169
240
"TcrzaAVMbFURm1PpukWru8yE2uBTjvQePoa" , // 2 of 2 multisig
170
241
"TckSpBht36nMZgnDDjv7xaHUrgCyJpxQiLA" , // NonStandard
242
+
243
+ "TsSAzyUaa2KSytEuu1hiGdeYJqu4om63ZQb" , // Address at imported account/0/0
171
244
}
245
+
246
+ type nextAddr struct {
247
+ name string
248
+ acct uint32
249
+ branch pb.NextAddressRequest_Kind
250
+ wantErr bool
251
+ }
252
+
253
+ var nextAddrs = []nextAddr {{
254
+ name : "default external" ,
255
+ }}
0 commit comments