aboutsummaryrefslogtreecommitdiff
path: root/utils/python-rpc
diff options
context:
space:
mode:
Diffstat (limited to 'utils/python-rpc')
-rw-r--r--utils/python-rpc/framework/__init__.py0
-rw-r--r--utils/python-rpc/framework/daemon.py198
-rw-r--r--utils/python-rpc/framework/rpc.py83
-rw-r--r--utils/python-rpc/framework/wallet.py592
4 files changed, 873 insertions, 0 deletions
diff --git a/utils/python-rpc/framework/__init__.py b/utils/python-rpc/framework/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/utils/python-rpc/framework/__init__.py
diff --git a/utils/python-rpc/framework/daemon.py b/utils/python-rpc/framework/daemon.py
new file mode 100644
index 000000000..11d5f5845
--- /dev/null
+++ b/utils/python-rpc/framework/daemon.py
@@ -0,0 +1,198 @@
+# Copyright (c) 2018 The Monero Project
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification, are
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this list of
+# conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice, this list
+# of conditions and the following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors may be
+# used to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Daemon class to make rpc calls and store state."""
+
+from .rpc import JSONRPC
+
+class Daemon(object):
+
+ def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0):
+ self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else 18180+idx))
+
+ def getblocktemplate(self, address):
+ getblocktemplate = {
+ 'method': 'getblocktemplate',
+ 'params': {
+ 'wallet_address': address,
+ 'reserve_size' : 1
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(getblocktemplate)
+
+ def send_raw_transaction(self, tx_as_hex, do_not_relay = False):
+ send_raw_transaction = {
+ 'tx_as_hex': tx_as_hex,
+ 'do_not_relay': do_not_relay,
+ }
+ return self.rpc.send_request("/send_raw_transaction", send_raw_transaction)
+
+ def submitblock(self, block):
+ submitblock = {
+ 'method': 'submitblock',
+ 'params': [ block ],
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(submitblock)
+
+ def getblock(self, height=0):
+ getblock = {
+ 'method': 'getblock',
+ 'params': {
+ 'height': height
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(getblock)
+
+ def getlastblockheader(self):
+ getlastblockheader = {
+ 'method': 'getlastblockheader',
+ 'params': {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(getlastblockheader)
+
+ def getblockheaderbyhash(self, hash):
+ getblockheaderbyhash = {
+ 'method': 'getblockheaderbyhash',
+ 'params': {
+ 'hash': hash,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(getblockheaderbyhash)
+
+ def getblockheaderbyheight(self, height):
+ getblockheaderbyheight = {
+ 'method': 'getblockheaderbyheight',
+ 'params': {
+ 'height': height,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(getblockheaderbyheight)
+
+ def get_connections(self):
+ get_connections = {
+ 'method': 'get_connections',
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_connections)
+
+ def get_info(self):
+ get_info = {
+ 'method': 'get_info',
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_info)
+
+ def hard_fork_info(self):
+ hard_fork_info = {
+ 'method': 'hard_fork_info',
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(hard_fork_info)
+
+ def generateblocks(self, address, blocks=1):
+ generateblocks = {
+ 'method': 'generateblocks',
+ 'params': {
+ 'amount_of_blocks' : blocks,
+ 'reserve_size' : 20,
+ 'wallet_address': address
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(generateblocks)
+
+ def get_height(self):
+ get_height = {
+ 'method': 'get_height',
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_request("/get_height", get_height)
+
+ def pop_blocks(self, nblocks = 1):
+ pop_blocks = {
+ 'nblocks' : nblocks,
+ }
+ return self.rpc.send_request("/pop_blocks", pop_blocks)
+
+ def start_mining(self, miner_address, threads_count = 0, do_background_mining = False, ignore_battery = False):
+ start_mining = {
+ 'miner_address' : miner_address,
+ 'threads_count' : threads_count,
+ 'do_background_mining' : do_background_mining,
+ 'ignore_battery' : ignore_battery,
+ }
+ return self.rpc.send_request('/start_mining', start_mining)
+
+ def stop_mining(self):
+ stop_mining = {
+ }
+ return self.rpc.send_request('/stop_mining', stop_mining)
+
+ def mining_status(self):
+ mining_status = {
+ }
+ return self.rpc.send_request('/mining_status', mining_status)
+
+ def get_transaction_pool(self):
+ get_transaction_pool = {
+ }
+ return self.rpc.send_request('/get_transaction_pool', get_transaction_pool)
+
+ def get_transaction_pool_hashes(self):
+ get_transaction_pool_hashes = {
+ }
+ return self.rpc.send_request('/get_transaction_pool_hashes', get_transaction_pool_hashes)
+
+ def flush_txpool(self, txids = []):
+ flush_txpool = {
+ 'method': 'flush_txpool',
+ 'params': {
+ 'txids': txids
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(flush_txpool)
diff --git a/utils/python-rpc/framework/rpc.py b/utils/python-rpc/framework/rpc.py
new file mode 100644
index 000000000..b857be4d2
--- /dev/null
+++ b/utils/python-rpc/framework/rpc.py
@@ -0,0 +1,83 @@
+# Copyright (c) 2018 The Monero Project
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification, are
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this list of
+# conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice, this list
+# of conditions and the following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors may be
+# used to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import requests
+import json
+
+class Response(dict):
+ def __init__(self, d):
+ for k in d.keys():
+ if type(d[k]) == dict:
+ self[k] = Response(d[k])
+ elif type(d[k]) == list:
+ self[k] = []
+ for i in range(len(d[k])):
+ if type(d[k][i]) == dict:
+ self[k].append(Response(d[k][i]))
+ else:
+ self[k].append(d[k][i])
+ else:
+ self[k] = d[k]
+
+ def __getattr__(self, key):
+ return self[key]
+ def __setattr__(self, key, value):
+ self[key] = value
+ def __eq__(self, other):
+ if type(other) == dict:
+ return self == Response(other)
+ if self.keys() != other.keys():
+ return False
+ for k in self.keys():
+ if self[k] != other[k]:
+ return False
+ return True
+
+class JSONRPC(object):
+ def __init__(self, url):
+ self.url = url
+
+ def send_request(self, path, inputs, result_field = None):
+ res = requests.post(
+ self.url + path,
+ data=json.dumps(inputs),
+ headers={'content-type': 'application/json'})
+ res = res.json()
+
+ assert 'error' not in res, res
+
+ if result_field:
+ res = res[result_field]
+
+ return Response(res)
+
+ def send_json_rpc_request(self, inputs):
+ return self.send_request("/json_rpc", inputs, 'result')
+
+
+
diff --git a/utils/python-rpc/framework/wallet.py b/utils/python-rpc/framework/wallet.py
new file mode 100644
index 000000000..e9f13667b
--- /dev/null
+++ b/utils/python-rpc/framework/wallet.py
@@ -0,0 +1,592 @@
+# Copyright (c) 2018 The Monero Project
+#
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification, are
+# permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this list of
+# conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice, this list
+# of conditions and the following disclaimer in the documentation and/or other
+# materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors may be
+# used to endorse or promote products derived from this software without specific
+# prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Daemon class to make rpc calls and store state."""
+
+from .rpc import JSONRPC
+
+class Wallet(object):
+
+ def __init__(self, protocol='http', host='127.0.0.1', port=0, idx=0):
+ self.rpc = JSONRPC('{protocol}://{host}:{port}'.format(protocol=protocol, host=host, port=port if port else 18090+idx))
+
+ def make_uniform_destinations(self, address, transfer_amount, transfer_number_of_destinations=1):
+ destinations = []
+ for i in range(transfer_number_of_destinations):
+ destinations.append({"amount":transfer_amount,"address":address})
+ return destinations
+
+ def make_destinations(self, addresses, transfer_amounts):
+ destinations = []
+ for i in range(len(addresses)):
+ destinations.append({'amount':transfer_amounts[i],'address':addresses[i]})
+ return destinations
+
+ def transfer(self, destinations, account_index = 0, subaddr_indices = [], priority = 0, ring_size = 0, unlock_time = 0, payment_id = '', get_tx_key = True, do_not_relay = False, get_tx_hex = False, get_tx_metadata = False):
+ transfer = {
+ 'method': 'transfer',
+ 'params': {
+ 'destinations': destinations,
+ 'account_index': account_index,
+ 'subaddr_indices': subaddr_indices,
+ 'priority': priority,
+ 'ring_size' : ring_size,
+ 'unlock_time' : unlock_time,
+ 'payment_id' : payment_id,
+ 'get_tx_key' : get_tx_key,
+ 'do_not_relay' : do_not_relay,
+ 'get_tx_hex' : get_tx_hex,
+ 'get_tx_metadata' : get_tx_metadata,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(transfer)
+
+ def transfer_split(self, destinations, account_index = 0, subaddr_indices = [], priority = 0, ring_size = 0, unlock_time = 0, payment_id = '', get_tx_key = True, do_not_relay = False, get_tx_hex = False, get_tx_metadata = False):
+ transfer = {
+ "method": "transfer_split",
+ "params": {
+ 'destinations': destinations,
+ 'account_index': account_index,
+ 'subaddr_indices': subaddr_indices,
+ 'priority': priority,
+ 'ring_size' : ring_size,
+ 'unlock_time' : unlock_time,
+ 'payment_id' : payment_id,
+ 'get_tx_key' : get_tx_key,
+ 'do_not_relay' : do_not_relay,
+ 'get_tx_hex' : get_tx_hex,
+ 'get_tx_metadata' : get_tx_metadata,
+ },
+ "jsonrpc": "2.0",
+ "id": "0"
+ }
+ return self.rpc.send_json_rpc_request(transfer)
+
+ def get_bulk_payments(self, payment_ids = [], min_block_height = 0):
+ get_bulk_payments = {
+ 'method': 'get_bulk_payments',
+ 'params': {
+ 'payment_ids': payment_ids,
+ 'min_block_height': min_block_height,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_bulk_payments)
+
+ def describe_transfer(self, unsigned_txset):
+ describe_transfer = {
+ 'method': 'describe_transfer',
+ 'params': {
+ 'unsigned_txset': unsigned_txset,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(describe_transfer)
+
+ def create_wallet(self, index=''):
+ create_wallet = {
+ 'method': 'create_wallet',
+ 'params': {
+ 'filename': 'testWallet' + index,
+ 'password' : '',
+ 'language' : 'English'
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(create_wallet)
+
+ def get_balance(self, account_index = 0, address_indices = [], all_accounts = False):
+ get_balance = {
+ 'method': 'get_balance',
+ 'params': {
+ 'account_index': account_index,
+ 'address_indices': address_indices,
+ 'all_accounts': all_accounts,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_balance)
+
+ def sweep_dust(self):
+ sweep_dust = {
+ 'method': 'sweep_dust',
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(sweep_dust)
+
+ def sweep_all(self, address):
+ sweep_all = {
+ 'method': 'sweep_all',
+ 'params' : {
+ 'address' : ''
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(sweep_all)
+
+ def get_address(self, account_index = 0, subaddresses = []):
+ get_address = {
+ 'method': 'get_address',
+ 'params' : {
+ 'account_index' : account_index,
+ 'address_index': subaddresses
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_address)
+
+ def create_account(self, label = ""):
+ create_account = {
+ 'method': 'create_account',
+ 'params' : {
+ 'label': label
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(create_account)
+
+ def create_address(self, account_index = 0, label = ""):
+ create_address = {
+ 'method': 'create_address',
+ 'params' : {
+ 'account_index': account_index,
+ 'label': label
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(create_address)
+
+ def label_address(self, subaddress_index, label):
+ label_address = {
+ 'method': 'label_address',
+ 'params' : {
+ 'index': { 'major': subaddress_index[0], 'minor': subaddress_index[1]},
+ 'label': label
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(label_address)
+
+ def label_account(self, account_index, label):
+ label_account = {
+ 'method': 'label_account',
+ 'params' : {
+ 'account_index': account_index,
+ 'label': label
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(label_account)
+
+ def get_address_index(self, address):
+ get_address_index = {
+ 'method': 'get_address_index',
+ 'params' : {
+ 'address': address
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_address_index)
+
+ def query_key(self, key_type):
+ query_key = {
+ 'method': 'query_key',
+ 'params' : {
+ 'key_type': key_type
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(query_key)
+
+ def restore_deterministic_wallet(self, seed = '', seed_offset = '', filename = '', restore_height = 0, password = '', language = ''):
+ restore_deterministic_wallet = {
+ 'method': 'restore_deterministic_wallet',
+ 'params' : {
+ 'restore_height': restore_height,
+ 'filename': filename,
+ 'seed': seed,
+ 'seed_offset': seed_offset,
+ 'password': password,
+ 'language': language
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(restore_deterministic_wallet)
+
+ def generate_from_keys(self, restore_height = 0, filename = "", password = "", address = "", spendkey = "", viewkey = ""):
+ generate_from_keys = {
+ 'method': 'generate_from_keys',
+ 'params' : {
+ 'restore_height': restore_height,
+ 'filename': filename,
+ 'address': address,
+ 'spendkey': spendkey,
+ 'viewkey': viewkey,
+ 'password': password,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(generate_from_keys)
+
+ def close_wallet(self):
+ close_wallet = {
+ 'method': 'close_wallet',
+ 'params' : {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(close_wallet)
+
+ def refresh(self):
+ refresh = {
+ 'method': 'refresh',
+ 'params' : {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(refresh)
+
+ def incoming_transfers(self, transfer_type='all', account_index = 0, subaddr_indices = []):
+ incoming_transfers = {
+ 'method': 'incoming_transfers',
+ 'params' : {
+ 'transfer_type': transfer_type,
+ 'account_index': account_index,
+ 'subaddr_indices': subaddr_indices,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(incoming_transfers)
+
+ def get_transfers(self, in_ = True, out = True, pending = True, failed = True, pool = True, min_height = None, max_height = None, account_index = 0, subaddr_indices = [], all_accounts = False):
+ get_transfers = {
+ 'method': 'get_transfers',
+ 'params' : {
+ 'in': in_,
+ 'out': out,
+ 'pending': pending,
+ 'failed': failed,
+ 'pool': pool,
+ 'min_height': min_height,
+ 'max_height': max_height,
+ 'filter_by_height': min_height or max_height,
+ 'account_index': account_index,
+ 'subaddr_indices': subaddr_indices,
+ 'all_accounts': all_accounts,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_transfers)
+
+ def make_integrated_address(self, standard_address = '', payment_id = ''):
+ make_integrated_address = {
+ 'method': 'make_integrated_address',
+ 'params' : {
+ 'standard_address': standard_address,
+ 'payment_id': payment_id,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(make_integrated_address)
+
+ def split_integrated_address(self, integrated_address):
+ split_integrated_address = {
+ 'method': 'split_integrated_address',
+ 'params' : {
+ 'integrated_address': integrated_address,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(split_integrated_address)
+
+ def auto_refresh(self, enable, period = 0):
+ auto_refresh = {
+ 'method': 'auto_refresh',
+ 'params' : {
+ 'enable': enable,
+ 'period': period
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(auto_refresh)
+
+ def set_daemon(self, address, trusted = False, ssl_support = "autodetect", ssl_private_key_path = "", ssl_certificate_path = "", ssl_allowed_certificates = [], ssl_allowed_fingerprints = [], ssl_allow_any_cert = False):
+ set_daemon = {
+ 'method': 'set_daemon',
+ 'params' : {
+ 'address': address,
+ 'trusted': trusted,
+ 'ssl_support': ssl_support,
+ 'ssl_private_key_path': ssl_private_key_path,
+ 'ssl_certificate_path': ssl_certificate_path,
+ 'ssl_allowed_certificates': ssl_allowed_certificates,
+ 'ssl_allowed_fingerprints': ssl_allowed_fingerprints,
+ 'ssl_allow_any_cert': ssl_allow_any_cert,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(set_daemon)
+
+ def is_multisig(self):
+ is_multisig = {
+ 'method': 'is_multisig',
+ 'params' : {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(is_multisig)
+
+ def prepare_multisig(self):
+ prepare_multisig = {
+ 'method': 'prepare_multisig',
+ 'params' : {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(prepare_multisig)
+
+ def make_multisig(self, multisig_info, threshold, password = ''):
+ make_multisig = {
+ 'method': 'make_multisig',
+ 'params' : {
+ 'multisig_info': multisig_info,
+ 'threshold': threshold,
+ 'password': password,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(make_multisig)
+
+ def exchange_multisig_keys(self, multisig_info, password = ''):
+ exchange_multisig_keys = {
+ 'method': 'exchange_multisig_keys',
+ 'params' : {
+ 'multisig_info': multisig_info,
+ 'password': password,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(exchange_multisig_keys)
+
+ def export_multisig_info(self):
+ export_multisig_info = {
+ 'method': 'export_multisig_info',
+ 'params' : {
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(export_multisig_info)
+
+ def import_multisig_info(self, info = []):
+ import_multisig_info = {
+ 'method': 'import_multisig_info',
+ 'params' : {
+ 'info': info
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(import_multisig_info)
+
+ def sign_multisig(self, tx_data_hex):
+ sign_multisig = {
+ 'method': 'sign_multisig',
+ 'params' : {
+ 'tx_data_hex': tx_data_hex
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(sign_multisig)
+
+ def submit_multisig(self, tx_data_hex):
+ submit_multisig = {
+ 'method': 'submit_multisig',
+ 'params' : {
+ 'tx_data_hex': tx_data_hex
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(submit_multisig)
+
+ def sign_transfer(self, unsigned_txset, export_raw = False, get_tx_keys = False):
+ sign_transfer = {
+ 'method': 'sign_transfer',
+ 'params' : {
+ 'unsigned_txset': unsigned_txset,
+ 'export_raw': export_raw,
+ 'get_tx_keys': get_tx_keys,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(sign_transfer)
+
+ def submit_transfer(self, tx_data_hex):
+ submit_transfer = {
+ 'method': 'submit_transfer',
+ 'params' : {
+ 'tx_data_hex': tx_data_hex,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(submit_transfer)
+
+ def get_tx_key(self, txid):
+ get_tx_key = {
+ 'method': 'get_tx_key',
+ 'params' : {
+ 'txid': txid,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_tx_key)
+
+ def check_tx_key(self, txid = '', tx_key = '', address = ''):
+ check_tx_key = {
+ 'method': 'check_tx_key',
+ 'params' : {
+ 'txid': txid,
+ 'tx_key': tx_key,
+ 'address': address,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(check_tx_key)
+
+ def get_tx_proof(self, txid = '', address = '', message = ''):
+ get_tx_proof = {
+ 'method': 'get_tx_proof',
+ 'params' : {
+ 'txid': txid,
+ 'address': address,
+ 'message': message,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_tx_proof)
+
+ def check_tx_proof(self, txid = '', address = '', message = '', signature = ''):
+ check_tx_proof = {
+ 'method': 'check_tx_proof',
+ 'params' : {
+ 'txid': txid,
+ 'address': address,
+ 'message': message,
+ 'signature': signature,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(check_tx_proof)
+
+ def get_reserve_proof(self, all_ = True, account_index = 0, amount = 0, message = ''):
+ get_reserve_proof = {
+ 'method': 'get_reserve_proof',
+ 'params' : {
+ 'all': all_,
+ 'account_index': account_index,
+ 'amount': amount,
+ 'message': message,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(get_reserve_proof)
+
+ def check_reserve_proof(self, address = '', message = '', signature = ''):
+ check_reserve_proof = {
+ 'method': 'check_reserve_proof',
+ 'params' : {
+ 'address': address,
+ 'message': message,
+ 'signature': signature,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(check_reserve_proof)
+
+ def sign(self, data):
+ sign = {
+ 'method': 'sign',
+ 'params' : {
+ 'data': data,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(sign)
+
+ def verify(self, data, address, signature):
+ verify = {
+ 'method': 'verify',
+ 'params' : {
+ 'data': data,
+ 'address': address,
+ 'signature': signature,
+ },
+ 'jsonrpc': '2.0',
+ 'id': '0'
+ }
+ return self.rpc.send_json_rpc_request(verify)