mirror of
https://github.com/monero-project/research-lab.git
synced 2024-12-23 03:59:40 +00:00
179 lines
5.2 KiB
Python
179 lines
5.2 KiB
Python
|
#The following code is taken for the most part from
|
||
|
#https://github.com/moneroexamples/python-json-rpc.git
|
||
|
#I've slightly modified it to fit the cherry py server better
|
||
|
|
||
|
import requests
|
||
|
import json
|
||
|
import os
|
||
|
import binascii
|
||
|
|
||
|
def send(destination_address, amount, payment_id, mixin):
|
||
|
# simple wallet is running on the localhost and port of 18082
|
||
|
url = "http://localhost:18082/json_rpc"
|
||
|
# standard json header
|
||
|
headers = {'content-type': 'application/json'}
|
||
|
# cryptonote amount format is different then
|
||
|
# that normally used by people.
|
||
|
# thus the float amount must be changed to
|
||
|
# something that cryptonote understands
|
||
|
int_amount = int(get_amount(amount))
|
||
|
|
||
|
# just to make sure that amount->coversion->back
|
||
|
# gives the same amount as in the initial number
|
||
|
assert amount == float(get_money(str(int_amount))), "Amount conversion failed"
|
||
|
|
||
|
|
||
|
# send specified xmr amount to the given destination_address
|
||
|
recipents = [{"address": destination_address,
|
||
|
"amount": int_amount}]
|
||
|
|
||
|
# simplewallet' procedure/method to call
|
||
|
rpc_input = {
|
||
|
"method": "transfer",
|
||
|
"params": {"destinations": recipents,
|
||
|
"mixin": mixin,
|
||
|
"payment_id" : payment_id}
|
||
|
}
|
||
|
|
||
|
# add standard rpc values
|
||
|
rpc_input.update({"jsonrpc": "2.0", "id": "0"})
|
||
|
|
||
|
# execute the rpc request
|
||
|
response = requests.post(
|
||
|
url,
|
||
|
data=json.dumps(rpc_input),
|
||
|
headers=headers)
|
||
|
|
||
|
# print the payment_id
|
||
|
print("#payment_id: ", payment_id)
|
||
|
|
||
|
# pretty print json output
|
||
|
print(json.dumps(response.json(), indent=4))
|
||
|
|
||
|
|
||
|
def get_amount(amount):
|
||
|
"""encode amount (float number) to the cryptonote format. Hope its correct.
|
||
|
|
||
|
Based on C++ code:
|
||
|
https://github.com/monero-project/bitmonero/blob/master/src/cryptonote_core/cryptonote_format_utils.cpp#L211
|
||
|
"""
|
||
|
|
||
|
CRYPTONOTE_DISPLAY_DECIMAL_POINT = 12
|
||
|
|
||
|
str_amount = str(amount)
|
||
|
|
||
|
fraction_size = 0
|
||
|
|
||
|
if '.' in str_amount:
|
||
|
|
||
|
point_index = str_amount.index('.')
|
||
|
|
||
|
fraction_size = len(str_amount) - point_index - 1
|
||
|
|
||
|
while fraction_size < CRYPTONOTE_DISPLAY_DECIMAL_POINT and '0' == str_amount[-1]:
|
||
|
print(44)
|
||
|
str_amount = str_amount[:-1]
|
||
|
fraction_size = fraction_size - 1
|
||
|
|
||
|
if CRYPTONOTE_DISPLAY_DECIMAL_POINT < fraction_size:
|
||
|
return False
|
||
|
|
||
|
str_amount = str_amount[:point_index] + str_amount[point_index+1:]
|
||
|
|
||
|
if not str_amount:
|
||
|
return False
|
||
|
|
||
|
if fraction_size < CRYPTONOTE_DISPLAY_DECIMAL_POINT:
|
||
|
str_amount = str_amount + '0'*(CRYPTONOTE_DISPLAY_DECIMAL_POINT - fraction_size)
|
||
|
|
||
|
return str_amount
|
||
|
|
||
|
|
||
|
def get_money(amount):
|
||
|
"""decode cryptonote amount format to user friendly format. Hope its correct.
|
||
|
|
||
|
Based on C++ code:
|
||
|
https://github.com/monero-project/bitmonero/blob/master/src/cryptonote_core/cryptonote_format_utils.cpp#L751
|
||
|
"""
|
||
|
|
||
|
CRYPTONOTE_DISPLAY_DECIMAL_POINT = 12
|
||
|
|
||
|
s = amount
|
||
|
|
||
|
if len(s) < CRYPTONOTE_DISPLAY_DECIMAL_POINT + 1:
|
||
|
# add some trailing zeros, if needed, to have constant width
|
||
|
s = '0' * (CRYPTONOTE_DISPLAY_DECIMAL_POINT + 1 - len(s)) + s
|
||
|
|
||
|
idx = len(s) - CRYPTONOTE_DISPLAY_DECIMAL_POINT
|
||
|
|
||
|
s = s[0:idx] + "." + s[idx:]
|
||
|
|
||
|
return s
|
||
|
|
||
|
|
||
|
def balance():
|
||
|
|
||
|
# simple wallet is running on the localhost and port of 18082
|
||
|
url = "http://localhost:18082/json_rpc"
|
||
|
|
||
|
# standard json header
|
||
|
headers = {'content-type': 'application/json'}
|
||
|
|
||
|
# simplewallet' procedure/method to call
|
||
|
rpc_input = {
|
||
|
"method": "getbalance"
|
||
|
}
|
||
|
|
||
|
# add standard rpc values
|
||
|
rpc_input.update({"jsonrpc": "2.0", "id": "0"})
|
||
|
|
||
|
# execute the rpc request
|
||
|
response = requests.post(
|
||
|
url,
|
||
|
data=json.dumps(rpc_input),
|
||
|
headers=headers)
|
||
|
|
||
|
# amounts in cryptonote are encoded in a way which is convenient
|
||
|
# for a computer, not a user. Thus, its better need to recode them
|
||
|
# to something user friendly, before displaying them.
|
||
|
#
|
||
|
# For examples:
|
||
|
# 4760000000000 is 4.76
|
||
|
# 80000000000 is 0.08
|
||
|
#
|
||
|
# In example 3 "Basic example 3: get incoming transfers" it is
|
||
|
# shown how to convert cryptonote values to user friendly format.
|
||
|
|
||
|
# pretty print json output
|
||
|
print(json.dumps(response.json(), indent=4))
|
||
|
|
||
|
def myAddress():
|
||
|
# simple wallet is running on the localhost and port of 18082
|
||
|
url = "http://localhost:18082/json_rpc"
|
||
|
|
||
|
# standard json header
|
||
|
headers = {'content-type': 'application/json'}
|
||
|
|
||
|
"""return the wallet's address"""
|
||
|
|
||
|
rpc_input = {
|
||
|
"method": "getaddress"
|
||
|
}
|
||
|
|
||
|
response = do_rpc(url, headers, rpc_input)
|
||
|
|
||
|
return response.json()
|
||
|
|
||
|
def do_rpc(url,headers, rpc_input):
|
||
|
"""does the rpc calls"""
|
||
|
|
||
|
# add standard rpc values
|
||
|
rpc_input.update({"jsonrpc": "2.0", "id": "0"})
|
||
|
|
||
|
# execute the rpc requrest
|
||
|
response = requests.post(
|
||
|
url,
|
||
|
data=json.dumps(rpc_input),
|
||
|
headers=headers)
|
||
|
|
||
|
return response
|