-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathwallet_json_rpc.py
290 lines (223 loc) · 9.03 KB
/
wallet_json_rpc.py
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
import requests
import json
import accountancy
from params import wallet_jsonrpc_ip, wallet_jsonrpc_port, maturation_time
from log_module import logger
wallet_jsonrpc_ip_port = wallet_jsonrpc_ip + ':' + str(wallet_jsonrpc_port)
pool_public_key = 0
wallet_ok = False
# TODO wallet lock/unlock feature not ready yet
wallet_password = ""
class NoEmptyAccountError(Exception):
pass
class WalletCommError(Exception):
pass
class WalletPubKeyError(Exception):
pass
class WalletInvalidOperationError(Exception):
pass
class WalletNotReadyError(Exception):
pass
class WalletInvalidTargetAccountError(Exception):
pass
class InputParameterError(Exception):
pass
def get_block_reward(block):
msg = {"jsonrpc": "2.0", "method": "getblock", "params": {"block": block}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if "result" not in response:
print("From wallet jsonrpc: " + str(response))
return False
return response["result"]["reward"] + response["result"]["fee"]
def is_block_matured(block):
msg = {"jsonrpc": "2.0", "method": "getblock", "params": {"block": block}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if "result" not in response:
print("From wallet jsonrpc: " + str(response))
return False
return bool(response["result"]["maturation"] >= maturation_time)
def check_block_pubkey(block):
global pool_public_key
msg = {"jsonrpc": "2.0", "method": "getblock", "params": {"block": block}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if "result" not in response:
print("From wallet jsonrpc: " + str(response))
return False
enc_pubkey = response["result"]["enc_pubkey"]
return bool(enc_pubkey == pool_public_key)
def get_last_block():
msg = {"jsonrpc": "2.0", "method": "getblockcount", "params": {"last": 1}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
last_block = response["result"]
return last_block
def get_last_account():
data = {"jsonrpc": "2.0", "method": "getwalletaccountscount", "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
msg = {"jsonrpc":"2.0","method":"getwalletaccounts","params":{"start":response["result"]-5},"id":123}
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
response = json.loads(response_raw.text)
wallet = {"account": response["result"][0]["account"], "balance":response["result"][0]["balance"]}
return wallet
def get_a_zero_balance_account_number():
msg = {"jsonrpc": "2.0", "method": "getwalletaccounts", "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
response = json.loads(response_raw.text)
except:
raise WalletCommError
for account in response["result"]:
if account["balance"] == 0:
return account["account"]
raise NoEmptyAccountError
def unlock_wallet():
msg = {"jsonrpc": "2.0", "method": "unlock", "params": {"pwd": wallet_password}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if response["result"] is False:
print("Wallet can't be unlocked.")
def lock_wallet():
msg = {"jsonrpc": "2.0", "method": "lock", "id": 123}
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
response = json.loads(response_raw.text)
def send_payment(from_account, to_account, amount, block):
if wallet_ok is False:
raise WalletNotReadyError
payload = "pool share, block: " + str(block)
payload = payload.encode('utf-8')
msg = {"jsonrpc":"2.0","method":"sendto","params":{"sender":from_account,"target":to_account,"amount":amount,"fee":accountancy.payment_fee,"payload":payload.hex(),"payload_method":"none","pwd":wallet_password},"id":123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=msg)
except:
raise WalletCommError
response = json.loads(response_raw.text)
logger.info("PAYMENT to wallet: " + json.dumps(msg))
logger.info("PAYMENT from wallet: " + response_raw.text)
if "result" in response:
logger.info("Payment sent from: " + str(from_account) + " to: " + str(to_account) + ", amount: " + str(amount))
else:
if response["error"]["code"] == 1004:
print("Payment ERROR from: " + str(from_account) + " to: " + str(to_account) + ", amount: " + str(
amount) + " " + response["error"]["message"])
raise WalletInvalidOperationError
elif response["error"]["code"] == 1005: # invalid public key -> orphan
raise WalletPubKeyError
elif response["error"]["code"] == 1002:
raise WalletInvalidTargetAccountError
else:
raise Exception
def wallet_has_nodes():
global wallet_ok
try:
data = {"jsonrpc": "2.0", "method": "nodestatus", "params": {}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if response["result"]["ready"] is False and response["result"]["ready_s"] == "Alone in the world...":
wallet_ok = False
return False
else:
wallet_ok = True
return True
except Exception as e:
logger.error("Wallet has nodes error: " + str(e))
wallet_ok = False
return False
def wait_for_wallet_start():
global wallet_ok
try:
while True:
data = {"jsonrpc": "2.0", "method": "nodestatus", "params": {}, "id": 123}
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
response = json.loads(response_raw.text)
if "status_s" in response["result"]:
if response["result"]["status_s"] == "Running":
wallet_ok = True
return True
return False
except Exception as e:
print("Wallet start error. Check if the wallet is running!")
logger.error("Wait for wallet start error: " + str(e))
wallet_ok = False
return False
def get_public_key():
global pool_public_key
try:
data = {"jsonrpc": "2.0", "method": "getwalletpubkeys", "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
pool_public_key = response["result"][0]["enc_pubkey"]
except Exception as e:
print("Get public key error: " + str(e))
logger.error("Get public key error: " + str(e))
wallet_ok = False
return False
def get_account_balance(account):
data = {"jsonrpc": "2.0", "method": "getaccount", "params":{"account":account}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
return response["result"]["balance"]
def get_current_block():
data = {"jsonrpc": "2.0", "method": "getblockcount", "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
current_block = response["result"]
print(current_block)
return current_block
def get_net_hashrate(current_block):
data = {"jsonrpc": "2.0", "method": "getblock", "params":{"block":current_block-1}, "id": 123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
nethash_khs = response["result"]["hashratekhs"]
nethash_ghs = round((nethash_khs/1000000), 2) #divides by 1000000 to get MHs, and rounds to 2 decimals
return nethash_ghs
def change_key(new_pubkey, acc_number):
data = {"jsonrpc":"2.0","method":"changekey","params":{"account":acc_number,"new_b58_pubkey": new_pubkey,"fee":0,"payload":"","payload_method":"none"},"id":123}
try:
response_raw = requests.post(wallet_jsonrpc_ip_port, json=data)
except:
raise WalletCommError
response = json.loads(response_raw.text)
if "error" in response:
print(response)
if "Invalid public key" in response["error"]["message"]:
raise InputParameterError
else:
raise WalletCommError
return True