From 19a9519aea84155bd7092b8ef0383d9ff2fa7e9c Mon Sep 17 00:00:00 2001 From: Jeffrey Ryan Date: Sun, 31 Jan 2021 21:18:05 -0600 Subject: [PATCH 1/5] Initial Daemon Expansion Changes: 1. Added a JSONRPCDaemon method for every Monero Daemon RPC Command that is not obsolete or binary. 2. Added a restricted() method to JSONRPCDaemon which returns whether the node is in restricted mode. 3. Added the ability to not pass any POST data to raw_request(). 4. Added RestrictedRPC exception to monero/backends/jsonrpc/exceptions.py 5. Added a DaemonIsBusy exception to monero/exceptions.py Motivation: I wanted to add comprehensive daemon RPC functionality to JSONRPCDaemon, which right now only supports a handful of all the available commands. While it is possible to perform any RPC command with raw_request() and raw_jsonrpc_request(), I wanted the user to able to know which commands are available, what inputs the command takes, what output it gives, and leverage the command's power while knowing the least amount of implementaton details as possible. The Monero Daemon RPC commands do not necessarily have the most consistent and simple interface, and that is what this commit brings to the table. The new methods also have the benefit of local input validation, which allows for fewer, more easily decipherable bugs for the user. Note: The vast majority of the lines in this commit are documentation. I tried to be as comprehensive as possible. --- monero/backends/jsonrpc/daemon.py | 1372 ++++++++++++++++++++++++- monero/backends/jsonrpc/exceptions.py | 3 + monero/exceptions.py | 3 + 3 files changed, 1342 insertions(+), 36 deletions(-) mode change 100644 => 100755 monero/backends/jsonrpc/daemon.py mode change 100644 => 100755 monero/backends/jsonrpc/exceptions.py diff --git a/monero/backends/jsonrpc/daemon.py b/monero/backends/jsonrpc/daemon.py old mode 100644 new mode 100755 index a62cd47..297f58d --- a/monero/backends/jsonrpc/daemon.py +++ b/monero/backends/jsonrpc/daemon.py @@ -1,17 +1,19 @@ from __future__ import unicode_literals import binascii from datetime import datetime +from decimal import Decimal import json import logging import requests import six +from ... import address from ... import exceptions from ...block import Block from ...const import NET_MAIN, NET_TEST, NET_STAGE -from ...numbers import from_atomic +from ...numbers import from_atomic, to_atomic from ...transaction import Transaction -from .exceptions import RPCError, Unauthorized +from .exceptions import RPCError, MethodNotFound, Unauthorized _log = logging.getLogger(__name__) @@ -22,7 +24,10 @@ RESTRICTED_MAX_TRANSACTIONS = 100 class JSONRPCDaemon(object): """ - JSON RPC backend for Monero daemon + JSON RPC backend for Monero daemon. + The offical documentation for the Monero Daemon RPC Protocol can be found at the link below. + https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#on_get_block_hash + Much of the in-code documentation of this class is derived from this document. :param protocol: `http` or `https` :param host: host name or IP @@ -35,7 +40,21 @@ class JSONRPCDaemon(object): to enable it when you need to retrieve transaction binary blobs. """ + _METHOD_NOT_FOUND_CODE = -32601 + _KNOWN_LOG_CATEGORIES = [ + '*', 'default', 'net', 'net.http', 'net.p2p', + 'logging', 'net.throttle', 'blockchain.db', 'blockchain.db.lmdb', 'bcutil', + 'checkpoints', 'net.dns', 'net.dl', 'i18n', 'perf', + 'stacktrace', 'updates', 'account', 'cn', 'difficulty', + 'hardfork', 'miner', 'blockchain', 'txpool', 'cn.block_queue', + 'net.cn', 'daemon', 'debugtools.deserialize', 'debugtools.objectsizes', 'device.ledger', + 'wallet.gen_multisig', 'multisig', 'bulletproofs', 'ringct', 'daemon.rpc', + 'wallet.simplewallet', 'WalletAPI', 'wallet.ringdb', 'wallet.wallet2', 'wallet.rpc' + 'tests.core'] + _KNOWN_LOG_LEVELS = ['FATAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'TRACE'] + _net = None + _restricted = None def __init__(self, protocol='http', host='127.0.0.1', port=18081, path='/json_rpc', user='', password='', timeout=30, verify_ssl_certs=True, proxy_url=None, @@ -52,14 +71,6 @@ class JSONRPCDaemon(object): self.proxies = {protocol: proxy_url} self.prune_transactions = prune_transactions - def _set_net(self, info): - if info['mainnet']: - self._net = NET_MAIN - if info['testnet']: - self._net = NET_TEST - if info['stagenet']: - self._net = NET_STAGE - def info(self): info = self.raw_jsonrpc_request('get_info') self._set_net(info) @@ -71,6 +82,12 @@ class JSONRPCDaemon(object): self.info() return self._net + def restricted(self): + if self._restricted is None: + self._set_restricted() + + return self._restricted + def send_transaction(self, blob, relay=True): res = self.raw_request('/sendrawtransaction', { 'tx_as_hex': six.ensure_text(binascii.hexlify(blob)), @@ -135,7 +152,8 @@ class JSONRPCDaemon(object): Returns a list of transactions for given hashes. Automatically chunks the request into amounts acceptable by a restricted RPC server. """ - hashes = list(hashes) + + hashes = self._validate_hashlist(hashes) result = [] while len(hashes): result.extend( @@ -145,35 +163,14 @@ class JSONRPCDaemon(object): hashes = hashes[RESTRICTED_MAX_TRANSACTIONS:] return result - def _do_get_transactions(self, hashes, prune): - res = self.raw_request('/get_transactions', { - 'txs_hashes': hashes, - 'decode_as_json': True, - 'prune': prune}) - if res['status'] != 'OK': - raise exceptions.BackendException(res['status']) - txs = [] - for tx in res.get('txs', []): - as_json = json.loads(tx['as_json']) - fee = as_json.get('rct_signatures', {}).get('txnFee') - txs.append(Transaction( - hash=tx['tx_hash'], - fee=from_atomic(fee) if fee else None, - height=None if tx['in_pool'] else tx['block_height'], - timestamp=datetime.fromtimestamp( - tx['block_timestamp']) if 'block_timestamp' in tx else None, - blob=binascii.unhexlify(tx['as_hex']) or None, - json=as_json)) - return txs - - def raw_request(self, path, data): + def raw_request(self, path, data=None): hdr = {'Content-Type': 'application/json'} _log.debug(u"Request: {path}\nData: {data}".format( path=path, data=json.dumps(data, indent=2, sort_keys=True))) auth = requests.auth.HTTPDigestAuth(self.user, self.password) rsp = requests.post( - self.url + path, headers=hdr, data=json.dumps(data), auth=auth, + self.url + path, headers=hdr, data=json.dumps(data) if data else None, auth=auth, timeout=self.timeout, verify=self.verify_ssl_certs, proxies=self.proxies) if rsp.status_code != 200: raise RPCError("Invalid HTTP status {code} for path {path}.".format( @@ -201,14 +198,1317 @@ class JSONRPCDaemon(object): raise RPCError("Invalid HTTP status {code} for method {method}.".format( code=rsp.status_code, method=method)) + result = rsp.json() _ppresult = json.dumps(result, indent=2, sort_keys=True) _log.debug(u"Result:\n{result}".format(result=_ppresult)) if 'error' in result: err = result['error'] + code = err['code'] + msg = err['message'] + + if code == self._METHOD_NOT_FOUND_CODE: + raise MethodNotFound('Daemon method "{}" not found'.format(method)) + _log.error(u"JSON RPC error:\n{result}".format(result=_ppresult)) raise RPCError( "Method '{method}' failed with RPC Error of unknown code {code}, " - "message: {message}".format(method=method, data=data, result=result, **err)) + "message: {msg}".format(method=method, data=data, result=result, code=code, msg=msg)) + elif 'status' in result['result'] and result['result']['status'] == 'BUSY': + raise exceptions.DaemonIsBusy( + "In JSONRPC method '{method}': daemon at {url} is in BUSY mode. RPC command results will be unpredictable " + "until daemon is fully synced.".format(method=method, url=self.url)) + return result['result'] + + # JSON RPC Methods (https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#json-rpc-methods) + + def get_block_count(self): + """ + Look up how many blocks are in the longest chain known to the node. + + Output: + { + "count": unsigned int; Number of blocks in longest chain seen by the node. + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + return self.raw_jsonrpc_request('get_block_count') + + def on_get_block_hash(self, height): + """ + Look up a block's hash by its height. + + :param int height: height of the block + + Output: str; block hash + """ + + height = int(height) + + if height < 0: + raise ValueError('height < 0') + + return self.raw_jsonrpc_request('on_get_block_hash', params=[height]) + + def get_block_template(self, wallet_address, reserve_size): + """ + Get a block template on which mining a new block. + + :param str wallet_address: Address of wallet to receive coinbase transactions for successful block. + :param int reserve_size: number of bytes to make reserved space, maximum is 127 + + Output: + { + "blocktemplate_blob": str; Blob on which to try to mine a new block. + "blockhashing_blob": str; Blob on which to try to find a valid nonce. + "difficulty": unsigned int; Bottom 64 bits of difficulty of next block. + "difficuly_top64": unsigned int; Top 64 bits of difficulty of next block. + "wide_difficulty": str; hex str of difficulty of next block. + "expected_reward": unsigned int; Coinbase reward expected to be received if block is successfully mined. + "height": unsigned int; Height on which to mine. + "prev_hash": str; Hash of the most recent block on which to mine the next block. + "reserved_offset": unsigned int; Offset in bytes to reserved space in block blob. + "seed_hash": str; + "seed_height": unsigned int; + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode + } + """ + + try: + address.address(wallet_address) + except ValueError: + raise ValueError('wallet_address is not in a recognized address form') + + if reserve_size not in range(128): + raise ValueError('reserve_size {} is out of bounds'.format(reserve_size)) + + return self.raw_jsonrpc_request('get_block_template', params={ + 'wallet_address': wallet_address, + 'reserve_size': reserve_size}) + + def submit_block(self, blobs): + """ + Submit a mined block to the network. + + :param list blobs: list of block hex strs or raw bytes objects + + Output: + { + "status": str; Block submit status + } + """ + + if isinstance(blobs, (bytes, str)): + blobs = [blobs] + + blobs = [binascii.hexlify(b).decode() if isinstance(b, bytes) else six.ensure_text(b) for b in blobs] + + return self.raw_jsonrpc_request('submit_block', params=blobs) + + def get_last_block_header(self): + """ + Block header information for the most recent block is easily retrieved with this method. + + Output: + { + "block_header": { + "block_size": unsigned int; The block size in bytes. + "depth": unsigned int; The number of blocks succeeding this block on the blockchain. A larger number means an older block. + "difficulty" unsigned int; The strength of the Monero network based on mining power. + "hash": str; The hash of this block. + "height": unsigned int; The number of blocks preceding this block on the blockchain. + "major_version": unsigned int; The major version of the monero protocol at this block height. + "minor_version": unsigned int; The minor version of the monero protocol at this block height. + "nonce": unsigned int; a cryptographic random one-time number used in mining a Monero block. + "num_txes": unsigned int; Number of transactions in the block, not counting the coinbase tx. + "orphan_status": bool; Usually false. If true, this block is not part of the longest chain. + "prev_hash": str; The hash of the block immediately preceding this block in the chain. + "reward": unsigned int; The amount of new atomic units generated in this block and rewarded to the miner. Note: 1 XMR = 1e12 atomic units. + "timestamp": unsigned int; The unix time at which the block was recorded into the blockchain. + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode + } + """ + + return self.raw_jsonrpc_request('get_last_block_header') + + def get_block_header_by_hash(self, blk_hash): + """ + Block header information can be retrieved using a block's hash + + :param str blk_hash: block hash + + Output: + { + "block_header": { + "block_size": unsigned int; The block size in bytes. + "depth": unsigned int; The number of blocks succeeding this block on the blockchain. A larger number means an older block. + "difficulty" unsigned int; The strength of the Monero network based on mining power. + "hash": str; The hash of this block. + "height": unsigned int; The number of blocks preceding this block on the blockchain. + "major_version": unsigned int; The major version of the monero protocol at this block height. + "minor_version": unsigned int; The minor version of the monero protocol at this block height. + "nonce": unsigned int; a cryptographic random one-time number used in mining a Monero block. + "num_txes": unsigned int; Number of transactions in the block, not counting the coinbase tx. + "orphan_status": bool; Usually false. If true, this block is not part of the longest chain. + "prev_hash": str; The hash of the block immediately preceding this block in the chain. + "reward": unsigned int; The amount of new atomic units generated in this block and rewarded to the miner. Note: 1 XMR = 1e12 atomic units. + "timestamp": unsigned int; The unix time at which the block was recorded into the blockchain. + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode + } + """ + + if not self._is_valid_256_hex(blk_hash): + raise ValueError('blk_hash "{}" is not a valid hash'.format(blk_hash)) + + return self.raw_jsonrpc_request('get_block_header_by_hash', params={'hash': blk_hash}) + + def get_block_header_by_height(self, height): + """ + Block header information can be retrieved using a block's height + + :param int height: block height + + Output: + { + "block_header": { + "block_size": unsigned int; The block size in bytes. + "depth": unsigned int; The number of blocks succeeding this block on the blockchain. A larger number means an older block. + "difficulty" unsigned int; The strength of the Monero network based on mining power. + "hash": str; The hash of this block. + "height": unsigned int; The number of blocks preceding this block on the blockchain. + "major_version": unsigned int; The major version of the monero protocol at this block height. + "minor_version": unsigned int; The minor version of the monero protocol at this block height. + "nonce": unsigned int; a cryptographic random one-time number used in mining a Monero block. + "num_txes": unsigned int; Number of transactions in the block, not counting the coinbase tx. + "orphan_status": bool; Usually false. If true, this block is not part of the longest chain. + "prev_hash": str; The hash of the block immediately preceding this block in the chain. + "reward": unsigned int; The amount of new atomic units generated in this block and rewarded to the miner. Note: 1 XMR = 1e12 atomic units. + "timestamp": unsigned int; The unix time at which the block was recorded into the blockchain. + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode + } + """ + + if height < 0: + raise ValueError('height < 0') + + return self.raw_jsonrpc_request('get_block_header_by_height', params={'height': height}) + + def get_block_headers_range(self, start_height, end_height): + """ + Similar to get_block_header_by_height, but for a range of blocks. The range is inclusive, + so the number of blocks returned will be equal to end_height - start_height + 1 + + :param int start_height: starting height + :param int end_height: ending height + + Output: + { + "headers": list; block_header structures (get_last_block_header) for the blocks in height range. + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode + } + """ + + start_height = int(start_height) + end_height = int(end_height) + + if start_height < 0: + raise ValueError('start_height < 0') + if end_height < start_height: + raise ValueError('end_height < start_height') + + return self.raw_jsonrpc_request('get_block_headers_range', params={ + 'start_height': start_height, + 'end_height': end_height}) + + def get_block(self, height=None, hash=None): + """ + Full block information can be retrieved by either block height or hash. Either height OR + hash must be specified, but not both. + + :param int height: block height + :param str hash: block hash + + Output: + { + "blob": str; Hexadecimal blob of block information. + "block_header": A structure containing block header information. See get_last_block_header. + "json": str; JSON formatted string details: + "major_version": unsigned int; The major version of the monero protocol at this block height. + "minor_version": unsigned int; The minor version of the monero protocol at this block height. + "timestamp": unsigned int; The unix time at which the block was recorded into the blockchain. + "prev_id": str; The hash of the block immediately preceding this block in the chain. + "nonce": unsigned int; a cryptographic random one-time number used in mining a Monero block. + "miner_tx": { + "version": unsigned int; Transaction version number. + "unlock_time": unsigned int; The block height when the coinbase transaction becomes spendable. + "vin": list; List of transaction inputs with the following structure: + { + "gen": { (note: miner txs are coinbase txs or "gen") + "height": This block height, a.k.a. when the coinbase is generated. + } + } + "vout": list; List of transaction outputs with the following structures: + { + "amount"; unsigned int; The amount of the output, in atomic units. + "target": { + "key": str; public key of one-time output of miner tx. + } + } + "extra"; list; List of integers 0-255, usually the "transaction ID" but can be used to include byte string. + "rct_signatures" - Contain signatures of tx signers. Coinbased txs do not have signatures. + "miner_tx_hash": str; hash of the coinbase transaction which belongs to this block. + "tx_hashes": list; List of str hex hashes of non-coinbase transactions in the block. + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + if height is None and hash is None: + raise ValueError('height or hash must be provided') + elif height is not None and hash is not None: + raise ValueError('height and hash can not both be provided') + + if height is not None: + if height < 0: + raise ValueError('{} is not a valid height'.format(height)) + + params = {'height': int(height)} + else: + if not self._is_valid_256_hex(hash): + raise ValueError('blk_hash "{}" is not a valid hash'.format(hash)) + + params = {'hash': hash} + + return self.raw_jsonrpc_request('get_block', params=params) + + def get_connections(self): + """ + Retrieve information about incoming and outgoing connections to your node. + + Output: + { + "connections": list; List of all connections and their info with the following structure: + { + "address": str; The peer's address, actually IPv4 & port + "avg_download": unsigned int; Average bytes of data downloaded by node. + "avg_upload": unsigned int; Average bytes of data uploaded by node. + "connection_id": str; The connection ID + "current_download": unsigned int; Current bytes downloaded by node. + "current_upload": unsigned int; Current bytes uploaded by node. + "height": unsigned int; The peer height + "host": str; The peer host + "incoming": bool; Is the node getting information from your node? + "ip": str; The node's IP address. + "live_time": unsigned int + "local_ip": bool + "localhost": bool + "peer_id": str; The node's ID on the network. + "port": str; The port that the node is using to connect to the network. + "recv_count": unsigned int + "recv_idle_time": unsigned int + "send_count": unsigned int + "send_idle_time": unsigned int + "state": str + "support_flags": unsigned int + } + } + """ + + return self.raw_jsonrpc_request('get_connections') + + def get_info(self): + """ + Retrieve general information about the state of your node and the network. + + Output: + { + "alt_blocks_count": unsigned int; Number of alternative blocks to main chain. + "block_size_limit": unsigned int; Maximum allowed block size + "block_size_median": unsigned int; Median block size of latest 100 blocks + "bootstrap_daemon_address": str; bootstrap node to give immediate usability to wallets while syncing by proxying RPC to it. + "busy_syncing": bool; States if new blocks are being added (true) or not (false). + "cumulative_difficulty": unsigned int; Cumulative difficulty of all blocks in the blockchain. + "difficulty": unsigned int; Network difficulty (analogous to the strength of the network) + "free_space": unsigned int; Available disk space on the node. + "grey_peerlist_size": unsigned int; Grey Peerlist Size + "height": unsigned int; Current length of longest chain known to daemon. + "height_without_bootstrap": unsigned int; Current length of the local chain of the daemon. + "incoming_connections_count": unsigned int; Number of peers connected to and pulling from your node. + "mainnet": bool; States if the node is on the mainnet (true) or not (false). + "offline": bool; States if the node is offline (true) or online (false). + "outgoing_connections_count": unsigned int; Number of peers that you are connected to and getting information from. + "rpc_connections_count": unsigned int; Number of RPC client connected to the daemon (Including this RPC request). + "stagenet": bool; States if the node is on the stagenet (true) or not (false). + "start_time": unsigned int; Start time of the daemon, as UNIX time. + "status": str; General RPC error code. "OK" means everything looks good. + "synchronized": bool; States if the node is synchronized (true) or not (false). + "target": unsigned int; Current target for next proof of work. + "target_height": unsigned int; The height of the next block in the chain. + "testnet": bool; States if the node is on the testnet (true) or not (false). + "top_block_hash": str; Hash of the highest block in the chain. + "tx_count": unsigned int; Total number of non-coinbase transaction in the chain. + "tx_pool_size": unsigned int; Number of transactions that have been broadcast but not included in a block. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + "was_bootstrap_ever_used": bool; States if a bootstrap node has ever been used since the daemon started. + "white_peerlist_size": unsigned int; White Peerlist Size + } + """ + + return self.raw_jsonrpc_request('get_info') + + def hard_fork_info(self): + """ + Look up information regarding hard fork voting and readiness. + + Output: + { + "earliest_height": unsigned int; Block height at which hard fork would be enabled if voted in. + "enabled": bool; Tells if hard fork is enforced. + "state": unsigned int; Current hard fork state: 0 (There is likely a hard fork), 1 (An update is needed to fork properly), or 2 (Everything looks good). + "status": str; General RPC error code. "OK" means everything looks good. + "threshold": unsigned int; Minimum percent of votes to trigger hard fork. Default is 80. + "version": unsigned int; The major block version for the fork. + "votes": unsigned int; Number of votes towards hard fork. + "voting": unsigned int; Hard fork voting status. + "window": unsigned int; Number of blocks over which current votes are cast. Default is 10080 blocks. + } + """ + + return self.raw_jsonrpc_request('hard_fork_info') + + def set_bans(self, bans): + """ + Ban (or uban) other nodes by IP for a certain length of time. + + :param bans: list of dict ban entries with the following structure: + + ban = { + "host": str; Host to ban (IP in A.B.C.D form - will support I2P address in the future), + "ip": unsigned int; IP address to ban, in int format, + "ban": bool; Set true to ban, + "seconds": unsigned int; Number of seconds to ban node + } + + Notes: + * For a given entry, only one of "host" or "ip" must be provided, but both may be provided so long as they match. + * "seconds" does not need to be provided if "ban" is False + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + if isinstance(bans, dict): + bans = [bans] + + # Validate bans + for ban_info in bans: + host = ban_info.get('host') + ip = ban_info.get('ip') + ban = ban_info.get('ban') + seconds = ban_info.get('seconds') + if host is None and ip is None: + raise ValueError('host or ip must be provided for each ban') + elif ban is None: + raise ValueError('"ban" value must be provided for each ban entry') + elif seconds is None and ban: + raise ValueError('"seconds" value must be provided when an IP is banned') + if host: + if len(host.split('.')) != 4: + raise ValueError('host "{}" is incorrectly formatted'.format(host)) + for ip_part in host.split('.'): + try: + ip_part_num = int(ip_part) + if ip_part_num < 0 or ip_part_num >= 256: + raise ValueError('host "{}" is incorrectly formatted'.format(host)) + except ValueError: + raise ValueError('host "{}" is incorrectly formatted'.format(host)) + if ip and (ip < 0 or ip >= 2**32): + raise ValueError('ip number {} is out of range'.format(host)) + if host is not None and ip is not None: + # check that "host" represents same logical address as "ip" + # both have already individually been checked for validity + # We could use the ipaddress package, but it is only standard after Python 3.3 + a, b, c, d = map(int, host.split('.')) + ip_from_host = (a << 24) | (b << 16) | (c << 8) | d + if ip_from_host != ip: + raise ValueError('host "{}" does not represent ip "{}"'.format(host, ip)) + if not isinstance(seconds, (NoneType, int)): + raise TypeError('"seconds" key in bans must be an int not a {}'.format(type(seconds))) + elif not isinstance(ban, bool): + raise TypeError('"ban" key in bans must be a bool not a {}'.format(type(ban))) + + return self.raw_jsonrpc_request('set_bans', params={'bans': bans}) + + def get_bans(self): + """ + Get list of ban entries. For structure of ban entires, see documentation of set_bans method. + + Output: + { + "bans": list; banned nodes with following structure + { + "host": str; Banned host (IP in A.B.C.D form). + "ip": unsigned int; Banned IP address, in Int format. + "seconds": unsigned int; Local Unix time that IP is banned until. + } + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + resp = self.raw_jsonrpc_request('get_bans') + + # When there are no ban entries, the node returns a responses with no "bans" field. + # This is counterintuitive for the user, so I add an empty field if it's not provided. + if 'bans' not in resp: + resp['bans'] = [] + + return resp + + def flush_txpool(self, txids=None): + """ + Flush tx ids from transaction pool + + :param list txids: list of str; transactions IDs to flush from mempool (all tx ids flushed if empty). + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + txids = self._validate_hashlist(txids) + + return self.raw_jsonrpc_request('flush_txpool', params={'txids': txids}) + + def get_output_histogram(self, amounts, min_count=None, max_count=None, unlocked=None, recent_cutoff=None): + """ + Get a histogram of output amounts. For all amounts (possibly filtered by parameters), gives the number + of outputs on the chain for that amount. RingCT outputs counts as 0 amount. + + :param list amounts: list of unsigned ints in atomic units, or Decimals as full monero amounts + :min_count: unsigned int lower bound for output number + :min_count: unsigned int upper bound for output number + :unlocked: boolean for whether to count only unlocked + :recent_cutoff: unsigned int + + + Output: + { + "histogram": list; histogram entries with the following structure + { + "amount": unsigned int; Output amount in atomic units. + "total_instances": unsigned int; number of total instances for given amount. + "unlocked_instances": unsigned int; number of unlocked instances for given amount. + "recent_instances": unsigned int; number of recent instances for given amount. + } + "status - string; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + # Coerce amounts paramter + if isinstance(amounts, (int, Decimal)): + amounts = [to_atomic(amounts) if isinstance(amounts, Decimal) else amounts] + elif not amounts: + raise ValueError('amounts must have at least one element') + amounts = list(map(lambda a: to_atomic(a) if isinstance(a, Decimal) else int(a), amounts)) + + # Construct RPC parameters + params = {'amounts': amounts} + if min_count is not None: + params['min_count'] = int(min_count) + if max_count is not None: + params['max_count'] = int(max_count) + if unlocked is not None: + params['unlocked'] = bool(unlocked) + if recent_cutoff is not None: + params['recent_cutoff'] = int(recent_cutoff) + + return self.raw_jsonrpc_request('get_output_histogram', params=params) + + def get_coinbase_tx_sum(self, height, count): + """ + Get the coinbase amount and the fees amount for n last blocks starting at particular height. + + :param int height: unsigned int; block height from which getting the amounts + :param int count: unsigned int; number of blocks to include in the sum + + Output: + { + "emission_amount": unsigned int; amount of coinbase reward in atomic units + "fee_amount": unsigned int; amount of fees in atomic units + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + if height < 0: + raise ValueError('height < 0') + elif count < 0: + raise ValueError('count < 0') + + return self.raw_jsonrpc_request('get_coinbase_tx_sum', params={'height': height, 'count': count}) + + def get_version(self): + """ + Get the node's current version. + + Output: + { + "version": unsigned int; + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + return self.raw_jsonrpc_request('get_version') + + def get_fee_estimate(self, grace_blocks=None): + """ + Gives an estimation on fees per byte. + + :param int grace_blocks: Optional; number of previous blocks to include in fee calculation + + Output: + { + "fee": unsigned int; Amount of fees estimated per byte in atomic units + "quantization_mask": unsigned int; Final fee should be rounded up to an even multiple of this value + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + params = None if not grace_blocks else {'grace_blocks': grace_blocks} + return self.raw_jsonrpc_request('get_fee_estimate', params=params) + + def get_alternate_chains(self): + """ + Display alternative chains seen by the node. + + + Output: + { + "chains": list; chain informations with the following structure + { + "block_hash": str; the block hash of the first diverging block of this alternative chain. + "difficulty": unsigned int; the cumulative difficulty of all blocks in the alternative chain. + "height": unsigned int; the block height of the first diverging block of this alternative chain. + "length": unsigned int; the length in blocks of this alternative chain, after divergence. + } + "status": str; General RPC error code. "OK" means everything looks good. + } + + """ + return self.raw_jsonrpc_request('get_alternate_chains') + + def relay_tx(self, txids): + """ + Relay a list of transaction IDs. + + :param list txids: list of transaction IDs to relay + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + txids = self._validate_hashlist(txids) + + return self.raw_jsonrpc_request('relay_tx', params={'txids': txids}) + + def sync_info(self): + """ + Get synchronisation information. + + Output: + { + "height": unsigned int; current height + "peers": list; peer informations with the following structure + { + "info": dict; structure of connection info, as defined in get_connections + } + "spans": list; span informations with the follwing structure (absent if node is fully synced) + { + "connection_id": str; connection ID. + "nblocks": unsigned int; number of blocks in that span. + "rate": unsigned int; connection rate. + "remote_address": str; peer address the node is downloading (or has downloaded) the span from. + "size": unsigned int; total number of bytes in that span's blocks (including txes). + "speed": unsigned int; connection speed. + "start_block_height": unsigned int; block height of the first block in that span. + } + "status": str; General RPC error code. "OK" means everything looks good. + "target_height": unsigned int; target height the node is syncing from (will be undefined if node is fully synced) + } + """ + + return self.raw_jsonrpc_request('sync_info') + + def get_txpool_backlog(self): + """ + Get all transaction pool backlog. + + Output: + { + "backlog": list; list of tx_backlog_entry with the following structure (in binary form) + { + "blob_size": unsigned int (in binary form). + "fee": unsigned int (in binary form). + "time_in_pool": unsigned int (in binary form). + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + return self.raw_jsonrpc_request('get_txpool_backlog') + + def get_output_distribution(self, amounts, cumulative=False, from_height=0, to_height=0): + """ + Get distribution of outputs for givens amount on the blockchain in a certain range of heights. + RingCT outputs are found with amount 0. + + :param list amounts: amounts to look for of type int for atomic units, or Decimal for full Monero amounts + :param bool cumulative: true if the result should be cumulative + :param int from_height: starting height to check from + :param int to_height: ending height to check up to + + Output: + { + "distributions": list; distribution informations with the following structure + { + "amount": unsigned int + "base": unsigned int + "distribution": array of unsigned int + "start_height": unsigned int + } + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + # Coerce amounts paramter + if isinstance(amounts, (int, Decimal)): + amounts = [to_atomic(amounts) if isinstance(amounts, Decimal) else amounts] + elif not amounts: + raise ValueError('amounts must have at least one element') + amounts = list(map(lambda a: to_atomic(a) if isinstance(a, Decimal) else int(a), amounts)) + + return self.raw_jsonrpc_request('get_output_distribution', params={ + 'amounts': amounts, + 'cumulative': cumulative, + 'from_height': from_height, + 'to_height': to_height}) + + # Other RPC Methods (https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#other-daemon-rpc-calls) + + def get_height(self): + """ + Get the node's current height. + + Outputs: + { + "height": unsigned int; Current length of longest chain known to daemon. + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + return self.raw_request('/get_height') + + def get_transactions(self, tx_hashes, decode_as_json=False, prune=False): + """ + Look up one or more transactions by hash. + + :param list txs_hashes: List of transaction hashes to look up. + :param bool decode_as_json: Optional (false by default). If true, the returned tx info will be decoded into JSON. + :param bool prune: Optional (false by default). If true, prune blob data, greatly cutting down on response size. + + + Output: + { + "missed_tx": list; (Optional - returned if not empty) Transaction hashes that could not be found. + "status": str; General RPC error code. "OK" means everything looks good. + "txs": list; transaction informations with the following structure + { + "as_hex": stri; Full transaction information as a hex string. + "as_json": json str; JSON formatted as follows + { + "version": unsigned int; Transaction version + "unlock_time": unsigned int; If not 0, this tells when a transaction output is spendable. + "vin": list; transaction inputs with the following structure + { + "key": + { + "amount": unsigned int; The amount of the input, in atomic units. + "key_offsets": list; integer offets to the input. + "k_image": str; The key image for the given input + } + + } + "vout": list; transaction inputs with the following structure + { + "amount": unsigned int; Amount of transaction output, in atomic units. + "target": + { + "key": str; The stealth public key of the receiver. + } + } + "extra"; list; List of integers 0-255, usually the "transaction ID" but can be used to include byte string. + signatures - List of signatures used in ring signature to hide the true origin of the transaction. + } + "block_height": unsigned int; block height including the transaction + "block_timestamp": unsigned int; Unix time at chich the block has been added to the blockchain + "double_spend_seen": boolean; States if the transaction is a double-spend (true) or not (false) + "in_pool": bool; States if the transaction is in pool (true) or included in a block (false) + "output_indices": list; list of the tx's output's globals indexes as unsigned ints + "tx_hash": str; transaction hash + } + "txs_as_hex": str; Full transaction information as a hex string (old compatibility parameter) + "txs_as_json": json str; (Optional - returned if set in inputs. Old compatibility parameter) List of transaction as in as_json above: + } + """ + + tx_hashes = self._validate_hashlist(tx_hashes) + + return self.raw_request('/get_transactions', data={ + 'txs_hashes': tx_hashes, + 'decode_as_json': decode_as_json, + 'prune': prune}) + + def get_alt_block_hashes(self): + """ + Get the known blocks hashes which are not on the main chain. + + Output: + { + "blks_hashes"; list; alternative blocks hashes to main chain + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + return self.raw_request('/get_alt_block_hashes') + + def is_key_image_spent(self, key_images): + """ + Check if outputs have been spent using the key image associated with the output. + + :param list key_images: List of key image hex strings to check. + + Key Image Status Legend: + 0 = unspent + 1 = spent in blockchain + 2 = spent in transaction pool + + Outputs: + { + "spent_status": list of unsigned ints; List of statuses for each image checked. + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + key_images = self._validate_hashlist(key_images) + + return self.raw_request('/is_key_image_spent', data={'key images': key_images}) + + def send_raw_transaction(self, tx_as_hex, do_not_relay=False): + """ + Broadcast a raw transaction to the network. + + :param str tx_as_hex: Full transaction information as hexidecimal string. + :param bool do_not_relay: Optional; Stop relaying transaction to other nodes (default is false). + + Output: + { + "double_spend": bool; Transaction is a double spend (true) or not (false). + "fee_too_low": bool; Fee is too low (true) or OK (false). + "invalid_input": bool; Input is invalid (true) or valid (false). + "invalid_output": bool; Output is invalid (true) or valid (false). + "low_mixin": bool; Mixin count is too low (true) or OK (false). + "not_rct": bool; Transaction is a standard ring transaction (true) or a ring confidential transaction (false). + "not_relayed": bool; Transaction was not relayed (true) or relayed (false). + "overspend": bool; Transaction uses more money than available (true) or not (false). + "reason": str; Additional information. Currently empty or "Not relayed" if transaction was accepted but not relayed. + "too_big": bool; Transaction size is too big (true) or OK (false). + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + tx_as_hex = six.ensure_text(tx_as_hex) + + return self.raw_request('/send_raw_transaction', data={ + 'tx_as_hex': tx_as_hex, + 'do_not_relay': do_not_relay}) + + def start_mining(self, do_background_mining, ignore_battery, miner_address, threads_count): + """ + Start mining on the daemon. + + :param bool do_background_mining: States if the mining should run in background (true) or foreground (false). + :param bool ignore_battery: States if batery state (on laptop) should be ignored (true) or not (false). + :param str miner_address: Account address to mine to. + :param int threads_count: Number of mining thread to run. + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + try: + address.address(miner_address) + except ValueError: + raise ValueError('miner_address "{}" does not match any recognized wallet format'.format(miner_address)) + + if threads_count < 0: + raise ValueError('threads_count < 0') + + return self.raw_request('/start_mining', data={ + 'do_background_mining': do_background_mining, + 'ignore_battery': ignore_battery, + 'miner_address': miner_address, + 'threads_count': threads_count}) + + def stop_mining(self): + """ + Stop mining on the daemon. + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.raw_request('/stop_mining') + + def mining_status(self): + """ + Get the mining status of the daemon. + + Output: + { + "active": bool; States if mining is enabled (true) or disabled (false). + "address": str; Account address daemon is mining to. Empty if not mining. + "is_background_mining_enabled": bool; States if the mining is running in background (true) or foreground (false). + "speed": unsigned int; Mining power in hashes per seconds. + "threads_count": unsigned int; Number of running mining threads. + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.raw_request('/mining_status') + + def save_bc(self): + """ + Save the blockchain. The blockchain does not need saving and is always saved when modified, however it does a sync to + flush the filesystem cache onto the disk for safety purposes against Operating System or Harware crashes. + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.raw_request('/save_bc') + + def get_peer_list(self): + """ + Get the known peer list. + + Outputs: + { + "gray_list": list; offline peer informations with the following structure + { + "host": unsigned int; IP address in integer format. + "id": stri; Peer id. + "ip": unsigned int; IP address in integer format. + "last_seen": unsigned int; unix time at which the peer has been seen for the last time. + "port": unsigned int; TCP port the peer is using to connect to monero network. + } + "white_list": list; online peer informations with the above structure ^^^ + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.raw_request('/get_peer_list') + + def set_log_hashrate(self, visible): + """ + Set the log hash rate display mode. + + :param bool visible: States if hash rate logs should be visible (true) or hidden (false) + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.set_log_hashrate('/set_log_hashrate', data={'visible': visible}) + + def set_log_level(self, level): + """ + Set the daemon log level. By default, log level is set to 0. + + :param int level: daemon log level to set from 0 (less verbose) to 4 (most verbose) + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + if level not in range(5): + raise ValueError('level must an integer between 0 (less verbose) and 4 (more verbose), inclusive') + + return self.raw_request('/set_log_level', data={'level': level}) + + def set_log_categories(self, categories=None): + """ + Set the daemon log categories. Categories are represented as a comma separated list of + : (similarly to syslog standard :). + To get a list of all log categories known by this library, call JSONRPCDaemon.get_all_known_log_categories(). + To get a list of all log levels known by this library, call JSONRPCDaemon.get_all_known_log_levels(). + + :param categories: str or list; Optional, daemon log categories to enable. Accepts list or comma-seperated string. + + Output: + { + "categories": str; comma-seperated string list of daemon log enabled categories + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + if not categories: + return self.raw_request('/set_log_categories') + elif isinstance(categories, str): + categories = categories.split(',') + + # Validate categories + for cat_str in categories: + try: + category, level = cat_str.split(':') + + if category not in self._KNOWN_LOG_CATEGORIES: + _log.warn(u"Unrecognized log category: \"{}\"",format(category)) + + if level not in self._KNOWN_LOG_LEVELS: + _log.warn(u"Unrecognized log level: \"{}\"".format(level)) + except ValueError: + raise ValueError('malformed category string: "{}"'.format(cat_str)) + + final_category_str = ','.join(categories) + + return self.raw_request('/set_log_categories', data={'categories': final_category_str}) + + def get_transaction_pool(self): + """ + Show information about valid transactions seen by the node but not yet mined into a block, + as well as spent key image information for the txpool in the node's memory. + + Output: + { + "spent_key_images": list; spent output key images with following structure + { + "id_hash": str; Key image. + "txs_hashes": list; tx hashes of the txes (usually one) spending that key image. + } + "transactions": list; transactions in the mempool with the following structure + { + "blob_size": unsigned int; The size of the full transaction blob. + "double_spend_seen": bool; States if this transaction has been seen as double spend. + "do_not_relay": bool; States if this transaction should not be relayed + "fee": unsigned int; The amount of the mining fee included in the transaction, in atomic units. + "id_hash": str; The transaction ID hash. + "kept_by_block": bool; States if the tx was included in a block at least once (true) or not (false). + "last_failed_height": unsigned int; If the transaction validation has previously failed, this tells at what height that occured. + "last_failed_id_hash": str; Like the previous, this tells the previous transaction ID hash. + "last_relayed_time": unsigned int; Last unix time at which the transaction has been relayed. + "max_used_block_height": unsigned int; Tells the height of the most recent block with an output used in this transaction. + "max_used_block_hash": str; Tells the hash of the most recent block with an output used in this transaction. + "receive_time": unsigned int; The Unix time that the transaction was first seen on the network by the node. + "relayed": bool; States if this transaction has been relayed + "tx_blob": unsigned int; Hexadecimal blob represnting the transaction. + "tx_json": json string; JSON structure of all information in the transaction (see get_transactions() for structure information) + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + return self.raw_request('/get_transaction_pool') + + def get_transaction_pool_stats(self): + """ + Get the transaction pool statistics. + + Output: + { + "pool_stats": { + "bytes_max": unsigned int; Max transaction size in pool. + "bytes_med" unsigned int; Median transaction size in pool. + "bytes_min" unsigned int; Min transaction size in pool. + "bytes_total": unsigned int; total size of all transactions in pool. + "histo": { + "txs": unsigned int; number of transactions. + "bytes": unsigned int; size in bytes. + } + "histo_98pc": unsigned int; the time 98% of txes are "younger" than. + "num_10m": unsigned int; number of transactions in pool for more than 10 minutes. + "num_double_spends": unsigned int; number of double spend transactions. + "num_failing": unsigned int; number of failing transactions. + "num_not_relayed": unsigned int; number of non-relayed transactions. + "oldest": unsigned int; unix time of the oldest transaction in the pool + "txs_total": unsigned int; total number of transactions. + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + return self.raw_request('/get_transaction_pool_stats') + + def stop_daemon(self): + """ + Send a command to the daemon to safely disconnect and shut down. + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + return self.raw_request('/stop_daemon') + + def get_limit(self): + """ + Get daemon bandwidth limits. + + Outputs: + { + "limit_down": unsigned int; Download limit in kBytes per second + "limit_up": unsigned int; Upload limit in kBytes per second + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + return self.raw_request('/get_limit') + + def set_limit(self, limit_down=-1, limit_up=-1): + """ + Set daemon bandwidth limits. + + :param int limit_down: Download limit in kBytes per second (-1 reset to default, 0 don't change the current limit) + :param int limit_up: Upload limit in kBytes per second (-1 reset to default, 0 don't change the current limit) + + Output: + { + "limit_down": - unsigned int; Download limit in kBytes per second + "limit_up": unsigned int; Upload limit in kBytes per second + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + if limit_down < -1: + raise ValueError('invalid limit_down: {}'.format(limit_down)) + elif limit_up < -1: + raise ValueError('invalid limit_up: {}'.format(limit_up)) + + return self.raw_request('/set_limit', data={'limit_down': limit_down, 'limit_up': limit_up}) + + def out_peers(self, out_peers_arg): + """ + Limit number of outgoing peers. + + :param int out_peers_arg: Max number of outgoing peers + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + out_peers_arg = int(out_peers_arg) + + return self.raw_request('/out_peers', data={'out_peers': out_peers_arg}) + + def in_peers(self, in_peers_arg): + """ + Limit number of Incoming peers. + + :param int in_peers_arg: Max number of incoming peers + + Output: + { + "status": str; General RPC error code. "OK" means everything looks good. Any other value means that something went wrong. + } + """ + + in_peers_arg = int(in_peers_arg) + + return self.raw_request('/in_peers', data={'in_peers': in_peers_arg}) + + def get_outs(self, outputs, get_txid=True): + """ + Get information about one-time outputs (stealth addresses). + + + :param list outputs: array of output structures, as defined below + :param bool get_txid: If true, a txid will included for each output in the response. + + Structure for outputs parameter: + { + "amount": unsigned int in atomic units or Decimal in full monero units (1e12 atmomic units) + "index": unsigned int; output's global index + } + + Output: + { + "outs": list; output informations with the following structure + { + "height": unsigned int; block height of the output + "key": str; the public key of the output + "mask": str; + "txid": str; transaction id + "unlocked": bool; States if output is locked (false) or not (true) + } + "status": str; General RPC error code. "OK" means everything looks good. + "untrusted": bool; True for bootstrap mode, False for full sync mode. + } + """ + + # Validate outputs paramter + if isinstance(outputs, dict): + outputs = [outputs] + for i, out in enumerate(outputs): + if 'amount' not in out or 'index' not in out: + raise ValueError('structure of outputs is malformed') + amount, index = out['amount'], out['index'] + if isinstance(amount, Decimal): + amount = to_atomic(amount) + outputs[i] = {'amount': amount, 'index': index} + + return self.raw_request('/get_outs', data={ + 'outputs': outputs, + 'get_txid': get_txid}) + + def update(self, command, path=None): + """ + Update daemon. + + + :param str command: Command to use, either "check" or "download". + :param str path: Optional, path where to download the update. + + + Output: + { + "auto_uri": str; + "hash": str; + "path": str; path to download the update. + "update": bool; States if an update is available to download (true) or not (false). + "user_uri": str; + "version": str; Version available for download. + "status": str; General RPC error code. "OK" means everything looks good. + } + """ + + command = six.ensure_text(command) + path = six.ensure_text(path) if path is not None else None + + if command not in ('check', 'download'): + raise ValueError('unrecognized command: "{}"'.format(command)) + + data = {'command': command} + + if path is not None: + data['path'] = path + + return self.raw_request('/update', data=data) + + # Supporting class methods + + @classmethod + def get_all_known_log_categories(cls): + return cls._KNOWN_LOG_CATEGORIES + + @classmethod + def get_all_known_log_levels(cls): + return cls._KNOWN_LOG_LEVELS + + # private methods + + def _set_net(self, info): + if info['mainnet']: + self._net = NET_MAIN + if info['testnet']: + self._net = NET_TEST + if info['stagenet']: + self._net = NET_STAGE + + def _set_restricted(self): + try: + self.sync_info() + + self._restricted = False + except MethodNotFound: + self._restricted = True + + def _do_get_transactions(self, hashes, prune): + res = self.raw_request('/get_transactions', { + 'txs_hashes': hashes, + 'decode_as_json': True, + 'prune': prune}) + if res['status'] != 'OK': + raise exceptions.BackendException(res['status']) + txs = [] + for tx in res.get('txs', []): + as_json = json.loads(tx['as_json']) + fee = as_json.get('rct_signatures', {}).get('txnFee') + txs.append(Transaction( + hash=tx['tx_hash'], + fee=from_atomic(fee) if fee else None, + height=None if tx['in_pool'] else tx['block_height'], + timestamp=datetime.fromtimestamp( + tx['block_timestamp']) if 'block_timestamp' in tx else None, + blob=binascii.unhexlify(tx['as_hex']) or None, + json=as_json)) + + return txs + + def _is_valid_256_hex(self, hexhash): + try: + bytes.fromhex(hexhash) + + return len(hexhash) == 64 + except ValueError: + return False + + def _validate_hashlist(self, hashes): + if not hashes: + return [] + else: + if isinstance(hashes, str): + hashes = [hashes] + else: + coerce_compatible_str = lambda s: six.ensure_text(str(s)) + hashes = list(map(coerce_compatible_str, hashes)) + + not_valid = lambda h: not self._is_valid_256_hex(h) + + if any(map(not_valid, hashes)): + raise ValueError('hashes contains an invalid hash') + + return hashes diff --git a/monero/backends/jsonrpc/exceptions.py b/monero/backends/jsonrpc/exceptions.py old mode 100644 new mode 100755 index f56a21d..470e53a --- a/monero/backends/jsonrpc/exceptions.py +++ b/monero/backends/jsonrpc/exceptions.py @@ -10,3 +10,6 @@ class Unauthorized(RPCError): class MethodNotFound(RPCError): pass + +class RestrictedRPC(RPCError): + pass diff --git a/monero/exceptions.py b/monero/exceptions.py index 38ecf53..ad8e9ee 100644 --- a/monero/exceptions.py +++ b/monero/exceptions.py @@ -7,6 +7,9 @@ class BackendException(MoneroException): class NoDaemonConnection(BackendException): pass +class DaemonIsBusy(BackendException): + pass + class AccountException(MoneroException): pass From ac43a16292c67a51b25cc82057d3e5fbcbc2417a Mon Sep 17 00:00:00 2001 From: Jeffrey Ryan Date: Fri, 5 Feb 2021 23:16:26 -0600 Subject: [PATCH 2/5] Make set_bans() input more intuitive Instead of passing a list a specificly crafted dictionaries, you can now just pass the ip, ban, and seconds parameters each. They can be single elements or lists of the same size. --- monero/backends/jsonrpc/daemon.py | 113 +++++++++++++++++------------- 1 file changed, 65 insertions(+), 48 deletions(-) diff --git a/monero/backends/jsonrpc/daemon.py b/monero/backends/jsonrpc/daemon.py index 297f58d..b2a2912 100755 --- a/monero/backends/jsonrpc/daemon.py +++ b/monero/backends/jsonrpc/daemon.py @@ -587,22 +587,23 @@ class JSONRPCDaemon(object): return self.raw_jsonrpc_request('hard_fork_info') - def set_bans(self, bans): + def set_bans(self, ip, ban, seconds): """ - Ban (or uban) other nodes by IP for a certain length of time. + Ban (or unban) other nodes by IP for a certain length of time. - :param bans: list of dict ban entries with the following structure: - - ban = { - "host": str; Host to ban (IP in A.B.C.D form - will support I2P address in the future), - "ip": unsigned int; IP address to ban, in int format, - "ban": bool; Set true to ban, - "seconds": unsigned int; Number of seconds to ban node - } + :param ip: ip address of node to ban in two forms: 'a.b.c.d' str or 32-bit unsigned integer + :param bool ban: Whether to ban (True) or unban (False) + :param int seconds: Number of seconds to ban Notes: - * For a given entry, only one of "host" or "ip" must be provided, but both may be provided so long as they match. - * "seconds" does not need to be provided if "ban" is False + * Params "ip", "ban", and "seconds" can be single elements or they can be iterables of the same length. For example: + + ips = ['229.52.8.67', 611282986] + should_ban = [True, False] + seconds = [10000, None] + daemon.set_bans(ips, should_ban, seconds) + + * "seconds" can be 0 or None if "ban" is False Output: { @@ -610,45 +611,61 @@ class JSONRPCDaemon(object): } """ - if isinstance(bans, dict): - bans = [bans] - - # Validate bans - for ban_info in bans: - host = ban_info.get('host') - ip = ban_info.get('ip') - ban = ban_info.get('ban') - seconds = ban_info.get('seconds') - if host is None and ip is None: - raise ValueError('host or ip must be provided for each ban') - elif ban is None: - raise ValueError('"ban" value must be provided for each ban entry') - elif seconds is None and ban: - raise ValueError('"seconds" value must be provided when an IP is banned') - if host: - if len(host.split('.')) != 4: - raise ValueError('host "{}" is incorrectly formatted'.format(host)) - for ip_part in host.split('.'): + def is_valid_ip(ip): + if isinstance(ip, (int)): + return 0 <= ip < 2 ** 32 + else: + if len(ip.split('.')) != 4: + return False + for ip_part in ip.split('.'): try: ip_part_num = int(ip_part) if ip_part_num < 0 or ip_part_num >= 256: - raise ValueError('host "{}" is incorrectly formatted'.format(host)) - except ValueError: - raise ValueError('host "{}" is incorrectly formatted'.format(host)) - if ip and (ip < 0 or ip >= 2**32): - raise ValueError('ip number {} is out of range'.format(host)) - if host is not None and ip is not None: - # check that "host" represents same logical address as "ip" - # both have already individually been checked for validity - # We could use the ipaddress package, but it is only standard after Python 3.3 - a, b, c, d = map(int, host.split('.')) - ip_from_host = (a << 24) | (b << 16) | (c << 8) | d - if ip_from_host != ip: - raise ValueError('host "{}" does not represent ip "{}"'.format(host, ip)) - if not isinstance(seconds, (NoneType, int)): - raise TypeError('"seconds" key in bans must be an int not a {}'.format(type(seconds))) - elif not isinstance(ban, bool): - raise TypeError('"ban" key in bans must be a bool not a {}'.format(type(ban))) + return False + except: + return False + return True + + if isinstance(ip, (str, int)): # If single element paramters + user_bans = [{ + 'ip': ip, + 'ban': ban, + 'seconds': seconds + }] + else: # If params are iterables, contrust the list of ban entries + if not (len(ip) == len(ban) == len(seconds)): + raise ValueError('"ip", "ban", and "seconds" are not the same length') + + user_bans = [{ + 'ip': ip[i], + 'ban': ban[i], + 'seconds': seconds[i] + } for i in range(len(ip))] + + # Construct the bans parameter to be passed to the RPC command + bans = [] + for ban_entry in user_bans: + curr_ip = ban_entry['ip'] + curr_ban = bool(ban_entry['ban']) + curr_seconds = ban_entry['seconds'] + + if not is_valid_ip(curr_ip): + raise ValueError('"{}" is not a valid IP address'.format(ip)) + elif curr_ban and curr_seconds is None: + raise ValueError('Whenever "ban" is True, "seconds" must not be None') + elif curr_seconds is not None and curr_seconds < 0: + raise ValueError('"seconds" can not be less than zero') + + ban = {} + if isinstance(curr_ip, int): + ban['ip'] = curr_ip + else: + ban['host'] = curr_ip + if curr_seconds is not None: + ban['seconds'] = curr_seconds + ban['ban'] = curr_ban + + bans.append(ban) return self.raw_jsonrpc_request('set_bans', params={'bans': bans}) From 27b3c4b54c41379b99b2e131c46a86f3fa6bb70c Mon Sep 17 00:00:00 2001 From: Jeffrey Ryan Date: Tue, 9 Feb 2021 13:41:27 -0600 Subject: [PATCH 3/5] Tests Cases for JSON RPC Methods and Minor Tweaks Changes: 1. Added test cases for the JSON_RPC methods (not the old RPC methods) 2. Tweaked a couple of the methods to make input and output more intuitive --- monero/backends/jsonrpc/daemon.py | 59 +- requirements.txt | 1 + .../test_jsonrpcdaemon/test_flush_txpool.json | 8 + .../test_get_alternate_chains.json | 13 + .../test_jsonrpcdaemon/test_get_bans.json | 35 ++ .../test_get_block_2288515.json | 56 ++ .../test_get_block_count_2287024.json | 9 + ...est_get_block_header_by_hash_90f6fd3f.json | 34 + ...st_get_block_header_by_height_2288495.json | 34 + ...t_block_headers_range_2288491_2288500.json | 252 ++++++++ .../test_get_block_template_481SgRxo_64.json | 20 + .../test_get_coinbase_tx_sum_2200000.json | 16 + .../test_get_connections.json | 334 ++++++++++ .../test_get_fee_estimate.json | 12 + .../test_jsonrpcdaemon/test_get_info.json | 48 ++ .../test_get_last_block_header_BUSY.json | 32 + .../test_get_last_block_header_success.json | 34 + .../test_get_output_histogram_1and5.json | 24 + .../test_jsonrpcdaemon/test_get_version.json | 10 + .../test_hard_fork_info.json | 18 + .../test_method_not_found.json | 8 + .../test_on_get_block_hash_2000000.json | 5 + .../test_jsonrpcdaemon/test_relay_tx.json | 7 + .../test_jsonrpcdaemon/test_set_bans.json | 8 + .../test_submit_block_failure.json | 8 + .../test_jsonrpcdaemon/test_sync_info.json | 288 +++++++++ tests/test_jsonrpcdaemon.py | 579 +++++++++++++++++- 27 files changed, 1920 insertions(+), 32 deletions(-) create mode 100644 tests/data/test_jsonrpcdaemon/test_flush_txpool.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_alternate_chains.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_bans.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_2288515.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_count_2287024.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_header_by_hash_90f6fd3f.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_header_by_height_2288495.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_headers_range_2288491_2288500.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_block_template_481SgRxo_64.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_coinbase_tx_sum_2200000.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_connections.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_fee_estimate.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_info.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_last_block_header_BUSY.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_last_block_header_success.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_output_histogram_1and5.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_version.json create mode 100644 tests/data/test_jsonrpcdaemon/test_hard_fork_info.json create mode 100644 tests/data/test_jsonrpcdaemon/test_method_not_found.json create mode 100644 tests/data/test_jsonrpcdaemon/test_on_get_block_hash_2000000.json create mode 100644 tests/data/test_jsonrpcdaemon/test_relay_tx.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_bans.json create mode 100644 tests/data/test_jsonrpcdaemon/test_submit_block_failure.json create mode 100644 tests/data/test_jsonrpcdaemon/test_sync_info.json diff --git a/monero/backends/jsonrpc/daemon.py b/monero/backends/jsonrpc/daemon.py index b2a2912..7d31cd4 100755 --- a/monero/backends/jsonrpc/daemon.py +++ b/monero/backends/jsonrpc/daemon.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import binascii from datetime import datetime from decimal import Decimal +import ipaddress import json import logging import requests @@ -587,13 +588,13 @@ class JSONRPCDaemon(object): return self.raw_jsonrpc_request('hard_fork_info') - def set_bans(self, ip, ban, seconds): + def set_bans(self, ip, ban, seconds=None): """ Ban (or unban) other nodes by IP for a certain length of time. :param ip: ip address of node to ban in two forms: 'a.b.c.d' str or 32-bit unsigned integer :param bool ban: Whether to ban (True) or unban (False) - :param int seconds: Number of seconds to ban + :param int seconds: Number of seconds to ban. Optional if "ban" is False Notes: * Params "ip", "ban", and "seconds" can be single elements or they can be iterables of the same length. For example: @@ -611,21 +612,6 @@ class JSONRPCDaemon(object): } """ - def is_valid_ip(ip): - if isinstance(ip, (int)): - return 0 <= ip < 2 ** 32 - else: - if len(ip.split('.')) != 4: - return False - for ip_part in ip.split('.'): - try: - ip_part_num = int(ip_part) - if ip_part_num < 0 or ip_part_num >= 256: - return False - except: - return False - return True - if isinstance(ip, (str, int)): # If single element paramters user_bans = [{ 'ip': ip, @@ -649,9 +635,10 @@ class JSONRPCDaemon(object): curr_ban = bool(ban_entry['ban']) curr_seconds = ban_entry['seconds'] - if not is_valid_ip(curr_ip): - raise ValueError('"{}" is not a valid IP address'.format(ip)) - elif curr_ban and curr_seconds is None: + # validate IP + ipaddress.IPv4Address(curr_ip) + + if curr_ban and curr_seconds is None: raise ValueError('Whenever "ban" is True, "seconds" must not be None') elif curr_seconds is not None and curr_seconds < 0: raise ValueError('"seconds" can not be less than zero') @@ -708,7 +695,12 @@ class JSONRPCDaemon(object): txids = self._validate_hashlist(txids) - return self.raw_jsonrpc_request('flush_txpool', params={'txids': txids}) + resp = self.raw_jsonrpc_request('flush_txpool', params={'txids': txids}) + + if 'transactions' not in resp: + resp['transactions'] = [] + + return resp def get_output_histogram(self, amounts, min_count=None, max_count=None, unlocked=None, recent_cutoff=None): """ @@ -716,10 +708,10 @@ class JSONRPCDaemon(object): of outputs on the chain for that amount. RingCT outputs counts as 0 amount. :param list amounts: list of unsigned ints in atomic units, or Decimals as full monero amounts - :min_count: unsigned int lower bound for output number - :min_count: unsigned int upper bound for output number - :unlocked: boolean for whether to count only unlocked - :recent_cutoff: unsigned int + :param int min_count: lower bound for output number + :param int max_count: upper bound for output number + :param bool unlocked: whether to count only unlocked + :pramrm int recent_cutoff: unsigned int Output: @@ -735,12 +727,12 @@ class JSONRPCDaemon(object): "untrusted": bool; True for bootstrap mode, False for full sync mode. } """ + # Coerce amounts paramter if isinstance(amounts, (int, Decimal)): amounts = [to_atomic(amounts) if isinstance(amounts, Decimal) else amounts] - elif not amounts: - raise ValueError('amounts must have at least one element') - amounts = list(map(lambda a: to_atomic(a) if isinstance(a, Decimal) else int(a), amounts)) + elif amounts is None: + raise ValueError('amounts is None') # Construct RPC parameters params = {'amounts': amounts} @@ -805,7 +797,12 @@ class JSONRPCDaemon(object): } """ - params = None if not grace_blocks else {'grace_blocks': grace_blocks} + if not isinstance(grace_blocks, (int, type(None))): + raise TypeError("grace_blocks is not an int") + elif grace_blocks is not None and grace_blocks < 0: + raise ValueError("grace_blocks < 0") + + params = {'grace_blocks': grace_blocks} if grace_blocks else None return self.raw_jsonrpc_request('get_fee_estimate', params=params) def get_alternate_chains(self): @@ -826,6 +823,7 @@ class JSONRPCDaemon(object): } """ + return self.raw_jsonrpc_request('get_alternate_chains') def relay_tx(self, txids): @@ -919,7 +917,6 @@ class JSONRPCDaemon(object): amounts = [to_atomic(amounts) if isinstance(amounts, Decimal) else amounts] elif not amounts: raise ValueError('amounts must have at least one element') - amounts = list(map(lambda a: to_atomic(a) if isinstance(a, Decimal) else int(a), amounts)) return self.raw_jsonrpc_request('get_output_distribution', params={ 'amounts': amounts, @@ -1507,7 +1504,7 @@ class JSONRPCDaemon(object): def _is_valid_256_hex(self, hexhash): try: - bytes.fromhex(hexhash) + bytearray.fromhex(hexhash) return len(hexhash) == 64 except ValueError: diff --git a/requirements.txt b/requirements.txt index 028dbd7..cbc3c9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ pysha3 requests six>=1.12.0 +ipaddress \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_flush_txpool.json b/tests/data/test_jsonrpcdaemon/test_flush_txpool.json new file mode 100644 index 0000000..d857320 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_flush_txpool.json @@ -0,0 +1,8 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "status": "OK", + "untrusted": false + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_alternate_chains.json b/tests/data/test_jsonrpcdaemon/test_get_alternate_chains.json new file mode 100644 index 0000000..b0b01f7 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_alternate_chains.json @@ -0,0 +1,13 @@ +{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "chains": [{ + "block_hash": "697cf03c89a9b118f7bdf11b1b3a6a028d7b3617d2d0ed91322c5709acf75625", + "difficulty": 14114729638300280, + "height": 1562062, + "length": 2 + }], + "status": "OK" + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_bans.json b/tests/data/test_jsonrpcdaemon/test_get_bans.json new file mode 100644 index 0000000..79c3da0 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_bans.json @@ -0,0 +1,35 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "bans": [ + { + "host": "145.239.118.5", + "ip": 91680657, + "seconds": 72260 + }, + { + "host": "146.59.156.116", + "ip": 1956395922, + "seconds": 69397 + }, + { + "host": "213.32.121.162", + "ip": 2725847253, + "seconds": 3564 + }, + { + "host": "51.83.81.237", + "ip": 3981529907, + "seconds": 70687 + }, + { + "host": "54.39.75.54", + "ip": 910894902, + "seconds": 80571 + } + ], + "status": "OK", + "untrusted": false + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_2288515.json b/tests/data/test_jsonrpcdaemon/test_get_block_2288515.json new file mode 100644 index 0000000..ca43ccc --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_2288515.json @@ -0,0 +1,56 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "blob": "0e0efef0e880066d78ace422007a2cefb423553b39f8b58f6067698eac8162b25732d0b99988d37dc2002302bfd78b0101ff83d78b0101d58aa8aaa02202e90b5189598861b8dc3250b05847efd4ddb31d33b667037ae75572f4fef176c43401d3edb9548f1f68cb3de38f597e087e7514e8533ad2911480c4afffde217cb0dc02110000041b31710e950000000000000000000011b6b1fe267ec2a0f4c6937ebbe2e94969341d293293f148b2fe4e6f1c618b57a86c769da02b54ecac61d85f19b359401dd5595eebaaf488875e8165542e9eef522072a2929728e4e316744588f108b258c449072c19656b57ce1b9ba1a34e534d95619c252275642a394396ece0e218f6f4003e58bf307a02e03f09a59d53e5637dbb101aa4d3c6c58b484f7e580d89b52d70b0a9e67471e64ada3930bdae66c8bb4531547be88cd8601f8490688b5461889c4ca78977000844e015aac51698cf922df5547d43de3e260cb9a87342498fffa89f3cc31564b6a41cef61320b85695d454ac941ac2f7ca00e673a019066e7874b9d1f9055f0d6c7b6c47bc3efc52de13150199cb907b06d0c5fe009b64258662e29bdcc58f53d88be4cb044a50352f9c8c3549e9df079cd0b75f87937152ec5bdb9c8b68695ec80a129f9770ad80b05dbd5c025270fc38366f06d037a43ee0db46892ac471a61328d9733d197c6c1ecfdf344bac1a2795a179e10d15cffe66701c3f53d9410b2f63998a1fbab3332c471f2f16e24ab9475d0cd656aa49a0bce7fb38f82795ce6935b4602b03f0d0cddba5bd9abcb5ae50698e5f735e31ae2c10a673b763434594beea09a5990c02f3e82c4eafb438223df4022cd146bfcadd8e3c1da70b8113c626a7bc4d8780ca6009a0f3043c1eccf3519e26137a618a446844105f0e3a87f60104a4c2244212aed1c72b4f4b442d4f4b562c153b438711ae9069aa2bdf3426a4209ba91db2dec", + "block_header": { + "block_size": 33101, + "block_weight": 33101, + "cumulative_difficulty": 86655943855900269, + "cumulative_difficulty_top64": 0, + "depth": 13, + "difficulty": 239419211907, + "difficulty_top64": 0, + "hash": "1c68300646dda11a89cc9ca4001100745fcbd192e0e6efb6b06bd4d25851662b", + "height": 2288515, + "long_term_weight": 33101, + "major_version": 14, + "miner_tx_hash": "e31c38097769b1c49d31e7b041823da00915cdba77b9794d63ccb3d6571f2565", + "minor_version": 14, + "nonce": 587252349, + "num_txes": 17, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "6d78ace422007a2cefb423553b39f8b58f6067698eac8162b25732d0b99988d3", + "reward": 1176909776213, + "timestamp": 1612331134, + "wide_cumulative_difficulty": "0x133dd1f2f35066d", + "wide_difficulty": "0x37be7f4083" + }, + "credits": 0, + "json": "{\n \"major_version\": 14, \n \"minor_version\": 14, \n \"timestamp\": 1612331134, \n \"prev_id\": \"6d78ace422007a2cefb423553b39f8b58f6067698eac8162b25732d0b99988d3\", \n \"nonce\": 587252349, \n \"miner_tx\": {\n \"version\": 2, \n \"unlock_time\": 2288575, \n \"vin\": [ {\n \"gen\": {\n \"height\": 2288515\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 1176909776213, \n \"target\": {\n \"key\": \"e90b5189598861b8dc3250b05847efd4ddb31d33b667037ae75572f4fef176c4\"\n }\n }\n ], \n \"extra\": [ 1, 211, 237, 185, 84, 143, 31, 104, 203, 61, 227, 143, 89, 126, 8, 126, 117, 20, 232, 83, 58, 210, 145, 20, 128, 196, 175, 255, 222, 33, 124, 176, 220, 2, 17, 0, 0, 4, 27, 49, 113, 14, 149, 0, 0, 0, 0, 0, 0, 0, 0, 0\n ], \n \"rct_signatures\": {\n \"type\": 0\n }\n }, \n \"tx_hashes\": [ \"b6b1fe267ec2a0f4c6937ebbe2e94969341d293293f148b2fe4e6f1c618b57a8\", \"6c769da02b54ecac61d85f19b359401dd5595eebaaf488875e8165542e9eef52\", \"2072a2929728e4e316744588f108b258c449072c19656b57ce1b9ba1a34e534d\", \"95619c252275642a394396ece0e218f6f4003e58bf307a02e03f09a59d53e563\", \"7dbb101aa4d3c6c58b484f7e580d89b52d70b0a9e67471e64ada3930bdae66c8\", \"bb4531547be88cd8601f8490688b5461889c4ca78977000844e015aac51698cf\", \"922df5547d43de3e260cb9a87342498fffa89f3cc31564b6a41cef61320b8569\", \"5d454ac941ac2f7ca00e673a019066e7874b9d1f9055f0d6c7b6c47bc3efc52d\", \"e13150199cb907b06d0c5fe009b64258662e29bdcc58f53d88be4cb044a50352\", \"f9c8c3549e9df079cd0b75f87937152ec5bdb9c8b68695ec80a129f9770ad80b\", \"05dbd5c025270fc38366f06d037a43ee0db46892ac471a61328d9733d197c6c1\", \"ecfdf344bac1a2795a179e10d15cffe66701c3f53d9410b2f63998a1fbab3332\", \"c471f2f16e24ab9475d0cd656aa49a0bce7fb38f82795ce6935b4602b03f0d0c\", \"ddba5bd9abcb5ae50698e5f735e31ae2c10a673b763434594beea09a5990c02f\", \"3e82c4eafb438223df4022cd146bfcadd8e3c1da70b8113c626a7bc4d8780ca6\", \"009a0f3043c1eccf3519e26137a618a446844105f0e3a87f60104a4c2244212a\", \"ed1c72b4f4b442d4f4b562c153b438711ae9069aa2bdf3426a4209ba91db2dec\"\n ]\n}", + "miner_tx_hash": "e31c38097769b1c49d31e7b041823da00915cdba77b9794d63ccb3d6571f2565", + "status": "OK", + "top_hash": "", + "tx_hashes": [ + "b6b1fe267ec2a0f4c6937ebbe2e94969341d293293f148b2fe4e6f1c618b57a8", + "6c769da02b54ecac61d85f19b359401dd5595eebaaf488875e8165542e9eef52", + "2072a2929728e4e316744588f108b258c449072c19656b57ce1b9ba1a34e534d", + "95619c252275642a394396ece0e218f6f4003e58bf307a02e03f09a59d53e563", + "7dbb101aa4d3c6c58b484f7e580d89b52d70b0a9e67471e64ada3930bdae66c8", + "bb4531547be88cd8601f8490688b5461889c4ca78977000844e015aac51698cf", + "922df5547d43de3e260cb9a87342498fffa89f3cc31564b6a41cef61320b8569", + "5d454ac941ac2f7ca00e673a019066e7874b9d1f9055f0d6c7b6c47bc3efc52d", + "e13150199cb907b06d0c5fe009b64258662e29bdcc58f53d88be4cb044a50352", + "f9c8c3549e9df079cd0b75f87937152ec5bdb9c8b68695ec80a129f9770ad80b", + "05dbd5c025270fc38366f06d037a43ee0db46892ac471a61328d9733d197c6c1", + "ecfdf344bac1a2795a179e10d15cffe66701c3f53d9410b2f63998a1fbab3332", + "c471f2f16e24ab9475d0cd656aa49a0bce7fb38f82795ce6935b4602b03f0d0c", + "ddba5bd9abcb5ae50698e5f735e31ae2c10a673b763434594beea09a5990c02f", + "3e82c4eafb438223df4022cd146bfcadd8e3c1da70b8113c626a7bc4d8780ca6", + "009a0f3043c1eccf3519e26137a618a446844105f0e3a87f60104a4c2244212a", + "ed1c72b4f4b442d4f4b562c153b438711ae9069aa2bdf3426a4209ba91db2dec" + ], + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_count_2287024.json b/tests/data/test_jsonrpcdaemon/test_get_block_count_2287024.json new file mode 100644 index 0000000..b45eb97 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_count_2287024.json @@ -0,0 +1,9 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "count": 2287024, + "status": "OK", + "untrusted": false + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_header_by_hash_90f6fd3f.json b/tests/data/test_jsonrpcdaemon/test_get_block_header_by_hash_90f6fd3f.json new file mode 100644 index 0000000..3230084 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_header_by_hash_90f6fd3f.json @@ -0,0 +1,34 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 17130, + "block_weight": 17130, + "cumulative_difficulty": 86641187797059581, + "cumulative_difficulty_top64": 0, + "depth": 4, + "difficulty": 239025076303, + "difficulty_top64": 0, + "hash": "90f6fd3fe29c7518f15afd2da31734e890cc24247b5da10dc9ac2ea215ae844b", + "height": 2288453, + "long_term_weight": 17130, + "major_version": 14, + "miner_tx_hash": "5e8d9531ae078ef5630e3c9950eb768b87b31481652c2b8dafca25d57e9c0c3f", + "minor_version": 14, + "nonce": 1040830456, + "num_txes": 11, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "a78d9e631f743806b0b8d3a70bb85758db466633eb3b4620737dd29b0548eb21", + "reward": 1176972120146, + "timestamp": 1612323209, + "wide_cumulative_difficulty": "0x133cfb3858fc7fd", + "wide_difficulty": "0x37a701384f" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_header_by_height_2288495.json b/tests/data/test_jsonrpcdaemon/test_get_block_header_by_height_2288495.json new file mode 100644 index 0000000..75cdefa --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_header_by_height_2288495.json @@ -0,0 +1,34 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 8415, + "block_weight": 8415, + "cumulative_difficulty": 86651164421641270, + "cumulative_difficulty_top64": 0, + "depth": 3, + "difficulty": 238154836806, + "difficulty_top64": 0, + "hash": "966c1a70358ce998e7d5fb243b155971f9bffe06030c92dbd70486d398c40c05", + "height": 2288495, + "long_term_weight": 8415, + "major_version": 14, + "miner_tx_hash": "408dd52531cab37e51db5a9a581bf25691b5534d8d0037b38e68061691b976e1", + "minor_version": 14, + "nonce": 1275098057, + "num_txes": 5, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "47751e6eb31230e92a5ee98242aa34d79bfd48657f2727c9a9b3cbad6aee88bb", + "reward": 1176760892780, + "timestamp": 1612328193, + "wide_cumulative_difficulty": "0x133d8c662b9d436", + "wide_difficulty": "0x3773226b46" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_headers_range_2288491_2288500.json b/tests/data/test_jsonrpcdaemon/test_get_block_headers_range_2288491_2288500.json new file mode 100644 index 0000000..f4c2ef3 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_headers_range_2288491_2288500.json @@ -0,0 +1,252 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "headers": [ + { + "block_size": 49559, + "block_weight": 49559, + "cumulative_difficulty": 86650214633914049, + "cumulative_difficulty_top64": 0, + "depth": 19, + "difficulty": 236253710852, + "difficulty_top64": 0, + "hash": "01a5a129515e752055af9883ac98cdbd9eb90db16ab69ea187a1eb24eb7d0c66", + "height": 2288491, + "long_term_weight": 49559, + "major_version": 14, + "miner_tx_hash": "22c3dd706931fe0606e086147dcb8a984b504a5bd0eabd1cf7dabb9456154cd4", + "minor_version": 14, + "nonce": 922780730, + "num_txes": 26, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "6bd071b487be697128142b9b132be8d2c3e4ee9660f73d811c3d23e4526e56ac", + "reward": 1178084560299, + "timestamp": 1612327847, + "wide_cumulative_difficulty": "0x133d7e93ef73ec1", + "wide_difficulty": "0x3701d18a04" + }, + { + "block_size": 48848, + "block_weight": 48848, + "cumulative_difficulty": 86650451549481310, + "cumulative_difficulty_top64": 0, + "depth": 18, + "difficulty": 236915567261, + "difficulty_top64": 0, + "hash": "b2b91f81acec7fac2918cdee624f98df32c6b161160b4728ade336526a4ff51a", + "height": 2288492, + "long_term_weight": 48848, + "major_version": 14, + "miner_tx_hash": "9f74f1ff0e6cda328c07449fd1329d23a711cb1a65abc518d186ff152bb02dd9", + "minor_version": 14, + "nonce": 69257, + "num_txes": 21, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "01a5a129515e752055af9883ac98cdbd9eb90db16ab69ea187a1eb24eb7d0c66", + "reward": 1178167575913, + "timestamp": 1612328034, + "wide_cumulative_difficulty": "0x133d820683be95e", + "wide_difficulty": "0x372944aa9d" + }, + { + "block_size": 6013, + "block_weight": 6013, + "cumulative_difficulty": 86650688345313996, + "cumulative_difficulty_top64": 0, + "depth": 17, + "difficulty": 236795832686, + "difficulty_top64": 0, + "hash": "c85bfe6255447d117d68f90aa0cd2719542e92ee3bffed43b6109efbd87456cf", + "height": 2288493, + "long_term_weight": 6013, + "major_version": 14, + "miner_tx_hash": "7b7fb7509f54139b96434c351d855377a18d44304143cc7ed2eb93a940dd06ee", + "minor_version": 14, + "nonce": 2164859383, + "num_txes": 3, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "b2b91f81acec7fac2918cdee624f98df32c6b161160b4728ade336526a4ff51a", + "reward": 1176808541531, + "timestamp": 1612328052, + "wide_cumulative_difficulty": "0x133d8578a5d92cc", + "wide_difficulty": "0x372221a96e" + }, + { + "block_size": 25305, + "block_weight": 25305, + "cumulative_difficulty": 86650926266804464, + "cumulative_difficulty_top64": 0, + "depth": 16, + "difficulty": 237921490468, + "difficulty_top64": 0, + "hash": "47751e6eb31230e92a5ee98242aa34d79bfd48657f2727c9a9b3cbad6aee88bb", + "height": 2288494, + "long_term_weight": 25305, + "major_version": 14, + "miner_tx_hash": "c3146d227b3ec5288ee97fe48d7ab75dd172d038851e70f66ee3c2e2bd2299ba", + "minor_version": 14, + "nonce": 493060, + "num_txes": 12, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "c85bfe6255447d117d68f90aa0cd2719542e92ee3bffed43b6109efbd87456cf", + "reward": 1177608932154, + "timestamp": 1612328162, + "wide_cumulative_difficulty": "0x133d88eef9768f0", + "wide_difficulty": "0x376539d624" + }, + { + "block_size": 8415, + "block_weight": 8415, + "cumulative_difficulty": 86651164421641270, + "cumulative_difficulty_top64": 0, + "depth": 15, + "difficulty": 238154836806, + "difficulty_top64": 0, + "hash": "966c1a70358ce998e7d5fb243b155971f9bffe06030c92dbd70486d398c40c05", + "height": 2288495, + "long_term_weight": 8415, + "major_version": 14, + "miner_tx_hash": "408dd52531cab37e51db5a9a581bf25691b5534d8d0037b38e68061691b976e1", + "minor_version": 14, + "nonce": 1275098057, + "num_txes": 5, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "47751e6eb31230e92a5ee98242aa34d79bfd48657f2727c9a9b3cbad6aee88bb", + "reward": 1176760892780, + "timestamp": 1612328193, + "wide_cumulative_difficulty": "0x133d8c662b9d436", + "wide_difficulty": "0x3773226b46" + }, + { + "block_size": 116231, + "block_weight": 116231, + "cumulative_difficulty": 86651402586533952, + "cumulative_difficulty_top64": 0, + "depth": 14, + "difficulty": 238164892682, + "difficulty_top64": 0, + "hash": "b13413f9072dc7d64bfb7fd41468de816896bb003cd1f2b83650f50c3b7cb181", + "height": 2288496, + "long_term_weight": 116231, + "major_version": 14, + "miner_tx_hash": "086f9403f409146cfe3f42ad92656215c3528c6467bf2249969cbd8c8959e566", + "minor_version": 14, + "nonce": 248137, + "num_txes": 47, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "966c1a70358ce998e7d5fb243b155971f9bffe06030c92dbd70486d398c40c05", + "reward": 1179976778411, + "timestamp": 1612328551, + "wide_cumulative_difficulty": "0x133d8fdd675b040", + "wide_difficulty": "0x3773bbdc0a" + }, + { + "block_size": 16270, + "block_weight": 16270, + "cumulative_difficulty": 86651640852406342, + "cumulative_difficulty_top64": 0, + "depth": 13, + "difficulty": 238265872390, + "difficulty_top64": 0, + "hash": "2abd2e1f66237274e2c81ae9b399c35fb276256a2f74bb7417f46b1df9bef05c", + "height": 2288497, + "long_term_weight": 16270, + "major_version": 14, + "miner_tx_hash": "00f859466dc3d2a640139f11fa651ceb6505def6087b0b70481abc6bdaff46bb", + "minor_version": 14, + "nonce": 72020, + "num_txes": 9, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "b13413f9072dc7d64bfb7fd41468de816896bb003cd1f2b83650f50c3b7cb181", + "reward": 1177235044047, + "timestamp": 1612328631, + "wide_cumulative_difficulty": "0x133d93550366046", + "wide_difficulty": "0x3779c0b006" + }, + { + "block_size": 114710, + "block_weight": 114710, + "cumulative_difficulty": 86651878958176077, + "cumulative_difficulty_top64": 0, + "depth": 12, + "difficulty": 238105769735, + "difficulty_top64": 0, + "hash": "85b650768a99d15b10dd2b3e3b0a2783fd4f328a09051234eeb502df53a466ef", + "height": 2288498, + "long_term_weight": 114710, + "major_version": 14, + "miner_tx_hash": "2ae0f790f203ef5f68a705cb9328b20bf281b0a28b4f87ce1cdf4c1d14632db8", + "minor_version": 14, + "nonce": 3255005723, + "num_txes": 50, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "2abd2e1f66237274e2c81ae9b399c35fb276256a2f74bb7417f46b1df9bef05c", + "reward": 1205727544686, + "timestamp": 1612329017, + "wide_cumulative_difficulty": "0x133d96cc06c174d", + "wide_difficulty": "0x377035b707" + }, + { + "block_size": 18142, + "block_weight": 18142, + "cumulative_difficulty": 86652117438434601, + "cumulative_difficulty_top64": 0, + "depth": 11, + "difficulty": 238480258524, + "difficulty_top64": 0, + "hash": "d7a49b741aaedb95fbcc4c8d2033268a411f8de535d4abb7099b16d442dcfee6", + "height": 2288499, + "long_term_weight": 18142, + "major_version": 14, + "miner_tx_hash": "d0a4fe27cc361006a3a8677677d5f0cda200d57d263e2169f79cd1d3d7f96cfc", + "minor_version": 14, + "nonce": 4043900084, + "num_txes": 11, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "85b650768a99d15b10dd2b3e3b0a2783fd4f328a09051234eeb502df53a466ef", + "reward": 1198576000330, + "timestamp": 1612329127, + "wide_cumulative_difficulty": "0x133d9a446f40d29", + "wide_difficulty": "0x378687f5dc" + }, + { + "block_size": 64084, + "block_weight": 64084, + "cumulative_difficulty": 86652355952824805, + "cumulative_difficulty_top64": 0, + "depth": 10, + "difficulty": 238514390204, + "difficulty_top64": 0, + "hash": "3fd48fc38c69e63e274a7340f3cb1de82ffde0abfe85fc417789a06e16528d5d", + "height": 2288500, + "long_term_weight": 64084, + "major_version": 14, + "miner_tx_hash": "56d8ab6a4e7826d63020adf3e3d6ebe3364da645a3be016ef912d9b2401b0866", + "minor_version": 14, + "nonce": 134273718, + "num_txes": 32, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "d7a49b741aaedb95fbcc4c8d2033268a411f8de535d4abb7099b16d442dcfee6", + "reward": 1188932565978, + "timestamp": 1612329382, + "wide_cumulative_difficulty": "0x133d9dbcf84d1e5", + "wide_difficulty": "0x378890c4bc" + } + ], + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_block_template_481SgRxo_64.json b/tests/data/test_jsonrpcdaemon/test_get_block_template_481SgRxo_64.json new file mode 100644 index 0000000..cc8d0c6 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_block_template_481SgRxo_64.json @@ -0,0 +1,20 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "blockhashing_blob": "0e0ec890de8006fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd270000000067ec6d160094c242a6e4aee48103c5c80f100e8a7055ed5ff7964216f8fc47561c", + "blocktemplate_blob": "0e0ec890de8006fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd270000000002fecb8b0101ffc2cb8b0101d5fea9bbae220232e3df54fbf87eb29983853b3a4c6e3505949b011459334647ef459d304f6b53630102aeb562f6095dddf3ddd07d7703e047c274639bdaab3df83ac366d471db1d14024000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b313357d05b6bede5aa4797627a17e728f6577438bbd616f763efc06f6f09535a2c0ea18d5cda3019cef79db816e4a7e1b18d49385b44a77fb8e6b4d22762190b6c54d1d099d7d4179601a792f38c0aa14df8e40685215a53f92b9a4b54d2a2c8b69e0ded589859e3f1e310e99a754612c331052aec895950948eadf2a4e98d597f252fba93b2bd7c77b4e2a826a8e0fd6f11e96bfc16e0c7e390affc4a22032064099c83439afcd9f3805deb15407582dccdb2ffd62af8f0ed55a1fa6c4fff4e8e492e36cad4bf5481b57e37137df5c097a26f28c16b9e563d7291feebd9775e207e205f533853fdeacc33da212567dff2ebcb235cb046c0ccc39c59ba6a98b97732ce2a27332a397344a7a40b452d23c999a06497731a3289a7470281f8725e7f3d14f62b05156db38d190c1391e3c3e17e277375c4ce4f5a8bed6d4f0bd472021de649597df2eabf40badaeee8e66e56fdf9d345b4731fed35f8ba601c1373a4dbba49ee4fec380fe3616ca53341f8c9f2aa89e6715ff774bc8e24af78d851a5a88deed42f90de59115db74841b6e90cf6bfb1671cd7ff843b4918c0601dea4dc63d9beca34d6e76c4544c98a9e6c68c3b9cd0a43b371832b4a086755c81d5b415f618f4d69209b99472b4e14d07b05299bf2700de70d7680be47a97922adeda28495ac40d74a0f01d282d85832ccbfb880d6a3031ab13326f784c0ddcc625bfcfba2f95a71450c1c66ed558ecdf131ccf98085831e3e48c4b92f60b4ca7040b977717abe4a3ef1b030fd7c51e9182ec6829f104e5ee8e9f5ec3049634524162798328af418467129946357b26debaefa4b4b29676c199a7b120cb97f91b186c5d9d5c1c68b0ac6c188ded8993f893a9feee37afc5a8113c1de57a07a5df1046e9065b3e0a0f894e18b00d73ea5850998feadf31dc3278bf438350aba7b43f06311b60dfe9948d58012598626fbdb4058764198f6d4e44a4599b62cf826e6ec530f056f44b1cc6f5886472f68a70c2af78d2e2651d427fb292daa3bcbe18c255ebc7e7f82e97d948ced5998c661555bcf72225a8e97dbea7ec85f09f2200034119572300475d4ec4a0ede8ea7a8f6a7362865c34b797967592a3562df6e745bc63c240589509757e217ac7c42e93614dc99bd0462a7cabb9deda505f5ce83c96f0a14cd80e0dd485a1d6671ee0845fa0bc56b3e294975d878f05733505564b", + "difficulty": 232871166515, + "difficulty_top64": 0, + "expected_reward": 1180703555413, + "height": 2287042, + "next_seed_hash": "", + "prev_hash": "fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd27", + "reserved_offset": 130, + "seed_hash": "d432f499205150873b2572b5f033c9c6e4b7c6f3394bd2dd93822cd7085e7307", + "seed_height": 2285568, + "status": "OK", + "untrusted": false, + "wide_difficulty": "0x3638340233" + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_coinbase_tx_sum_2200000.json b/tests/data/test_jsonrpcdaemon/test_get_coinbase_tx_sum_2200000.json new file mode 100644 index 0000000..fd57528 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_coinbase_tx_sum_2200000.json @@ -0,0 +1,16 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "emission_amount": 139291580971286, + "emission_amount_top64": 0, + "fee_amount": 505668215000, + "fee_amount_top64": 0, + "status": "OK", + "top_hash": "", + "untrusted": false, + "wide_emission_amount": "0x7eaf59343916", + "wide_fee_amount": "0x75bc2ca0d8" + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_connections.json b/tests/data/test_jsonrpcdaemon/test_get_connections.json new file mode 100644 index 0000000..93e19e4 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_connections.json @@ -0,0 +1,334 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "connections": [ + { + "address": "193.70.78.196:12497", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "0f359103657e4a7bb8fb8c2a70139224", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "193.70.78.196", + "incoming": false, + "ip": "193.70.78.196", + "live_time": 145, + "local_ip": false, + "localhost": false, + "peer_id": "aa41b836feea9fb7", + "port": "12497", + "pruning_seed": 0, + "recv_count": 66396, + "recv_idle_time": 2, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 111307, + "send_idle_time": 2, + "state": "synchronizing", + "support_flags": 1 + }, + { + "address": "52.60.218.210:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "9c52aa37e83c4c16a18d410aef473a8d", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "52.60.218.210", + "incoming": false, + "ip": "52.60.218.210", + "live_time": 257, + "local_ip": false, + "localhost": false, + "peer_id": "08135737091b21ce", + "port": "18080", + "pruning_seed": 0, + "recv_count": 138613, + "recv_idle_time": 4, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 110233, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "24.101.115.189:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "6f77a8afc5144a2ea4a0634d7a9fcaf7", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "24.101.115.189", + "incoming": false, + "ip": "24.101.115.189", + "live_time": 351, + "local_ip": false, + "localhost": false, + "peer_id": "845cfad73a20ea83", + "port": "18080", + "pruning_seed": 390, + "recv_count": 188693, + "recv_idle_time": 8, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 178782, + "send_idle_time": 7, + "state": "normal", + "support_flags": 1 + }, + { + "address": "97.91.211.35:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 30, + "connection_id": "76085153221a4ea2a39ad92125842aa0", + "current_download": 0, + "current_upload": 44, + "height": 2265888, + "host": "97.91.211.35", + "incoming": false, + "ip": "97.91.211.35", + "live_time": 505, + "local_ip": false, + "localhost": false, + "peer_id": "6fb43c7e734dd1d7", + "port": "18080", + "pruning_seed": 0, + "recv_count": 55316, + "recv_idle_time": 6, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 15975280, + "send_idle_time": 4, + "state": "normal", + "support_flags": 1 + }, + { + "address": "54.180.125.82:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "982f50cefae94991b4dd2857cc1ad9fd", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "54.180.125.82", + "incoming": false, + "ip": "54.180.125.82", + "live_time": 457, + "local_ip": false, + "localhost": false, + "peer_id": "84050758addac752", + "port": "18080", + "pruning_seed": 0, + "recv_count": 327996, + "recv_idle_time": 3, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 218244, + "send_idle_time": 6, + "state": "normal", + "support_flags": 1 + }, + { + "address": "158.69.245.223:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "e0bebcf53db74a5a884ba403450a3b49", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "158.69.245.223", + "incoming": false, + "ip": "158.69.245.223", + "live_time": 548, + "local_ip": false, + "localhost": false, + "peer_id": "a45f3600853895a7", + "port": "18080", + "pruning_seed": 0, + "recv_count": 288659, + "recv_idle_time": 7, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 270778, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "47.100.185.97:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "6ca6e860bbc94d5a81a758ef37dffd0b", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "47.100.185.97", + "incoming": false, + "ip": "47.100.185.97", + "live_time": 596, + "local_ip": false, + "localhost": false, + "peer_id": "67aa8c69d30b6a61", + "port": "18080", + "pruning_seed": 0, + "recv_count": 314165, + "recv_idle_time": 5, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 287678, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "94.2.65.190:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "148d6af9c1c246b58947511c9530023a", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "94.2.65.190", + "incoming": false, + "ip": "94.2.65.190", + "live_time": 598, + "local_ip": false, + "localhost": false, + "peer_id": "8dfddb88ee5e7c67", + "port": "18080", + "pruning_seed": 0, + "recv_count": 312873, + "recv_idle_time": 2, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 288696, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "80.241.217.144:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "da26125daf9345919e497adf204bb640", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "80.241.217.144", + "incoming": false, + "ip": "80.241.217.144", + "live_time": 565, + "local_ip": false, + "localhost": false, + "peer_id": "bd1d992806bb8927", + "port": "18080", + "pruning_seed": 0, + "recv_count": 299445, + "recv_idle_time": 5, + "rpc_credits_per_hash": 1677721, + "rpc_port": 18081, + "send_count": 261093, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "148.251.85.3:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "ec3ca1222f5d462a8df762ccbf3f38bf", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "148.251.85.3", + "incoming": false, + "ip": "148.251.85.3", + "live_time": 598, + "local_ip": false, + "localhost": false, + "peer_id": "2d62a098dde2d88a", + "port": "18080", + "pruning_seed": 0, + "recv_count": 314075, + "recv_idle_time": 5, + "rpc_credits_per_hash": 0, + "rpc_port": 18088, + "send_count": 308837, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "197.245.222.218:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "68b7957705be42c9a6e11e53d85e5932", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "197.245.222.218", + "incoming": false, + "ip": "197.245.222.218", + "live_time": 45, + "local_ip": false, + "localhost": false, + "peer_id": "12763cc92ac5bb37", + "port": "18080", + "pruning_seed": 0, + "recv_count": 32941, + "recv_idle_time": 4, + "rpc_credits_per_hash": 0, + "rpc_port": 18089, + "send_count": 21562, + "send_idle_time": 5, + "state": "normal", + "support_flags": 1 + }, + { + "address": "112.215.205.229:18080", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "bc14510a700943dba892b38d858e786b", + "current_download": 0, + "current_upload": 0, + "height": 2288915, + "host": "112.215.205.229", + "incoming": false, + "ip": "112.215.205.229", + "live_time": 592, + "local_ip": false, + "localhost": false, + "peer_id": "2ade87c2d76672f0", + "port": "18080", + "pruning_seed": 0, + "recv_count": 313614, + "recv_idle_time": 2, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 297173, + "send_idle_time": 7, + "state": "normal", + "support_flags": 1 + } + ], + "status": "OK", + "untrusted": false + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_fee_estimate.json b/tests/data/test_jsonrpcdaemon/test_get_fee_estimate.json new file mode 100644 index 0000000..02e2f0b --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_fee_estimate.json @@ -0,0 +1,12 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "fee": 7790, + "quantization_mask": 10000, + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_info.json b/tests/data/test_jsonrpcdaemon/test_get_info.json new file mode 100644 index 0000000..537c9d8 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_info.json @@ -0,0 +1,48 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "adjusted_time": 1612377295, + "alt_blocks_count": 0, + "block_size_limit": 600000, + "block_size_median": 300000, + "block_weight_limit": 600000, + "block_weight_median": 300000, + "bootstrap_daemon_address": "", + "busy_syncing": false, + "credits": 0, + "cumulative_difficulty": 86754859378339639, + "cumulative_difficulty_top64": 0, + "database_size": 120378499072, + "difficulty": 258886688222, + "difficulty_top64": 0, + "free_space": 275984478208, + "grey_peerlist_size": 5000, + "height": 2288923, + "height_without_bootstrap": 2288923, + "incoming_connections_count": 0, + "mainnet": true, + "nettype": "mainnet", + "offline": false, + "outgoing_connections_count": 12, + "rpc_connections_count": 1, + "stagenet": false, + "start_time": 1612375367, + "status": "OK", + "synchronized": true, + "target": 120, + "target_height": 2288923, + "testnet": false, + "top_block_hash": "d41401b43220e54ec2567a889e0ad65196ba28d98e61b24d20491ddd060317a1", + "top_hash": "", + "tx_count": 11295065, + "tx_pool_size": 21, + "untrusted": false, + "update_available": false, + "version": "0.17.1.9-release", + "was_bootstrap_ever_used": false, + "white_peerlist_size": 1000, + "wide_cumulative_difficulty": "0x1343715bfc8ef37", + "wide_difficulty": "0x3c46d95dde" + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_last_block_header_BUSY.json b/tests/data/test_jsonrpcdaemon/test_get_last_block_header_BUSY.json new file mode 100644 index 0000000..8fbad9e --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_last_block_header_BUSY.json @@ -0,0 +1,32 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 0, + "cumulative_difficulty": 0, + "cumulative_difficulty_top64": 0, + "depth": 0, + "difficulty": 0, + "difficulty_top64": 0, + "hash": "", + "height": 0, + "major_version": 0, + "miner_tx_hash": "", + "minor_version": 0, + "nonce": 0, + "num_txes": 0, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "", + "reward": 0, + "timestamp": 0, + "wide_cumulative_difficulty": "", + "wide_difficulty": "" + }, + "credits": 0, + "status": "BUSY", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_last_block_header_success.json b/tests/data/test_jsonrpcdaemon/test_get_last_block_header_success.json new file mode 100644 index 0000000..1e93644 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_last_block_header_success.json @@ -0,0 +1,34 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 65605, + "block_weight": 65605, + "cumulative_difficulty": 86426998743673801, + "cumulative_difficulty_top64": 0, + "depth": 0, + "difficulty": 253652891944, + "difficulty_top64": 0, + "hash": "a55ec867052340715c4b8b4dcd2de53bc2a195e666058d10a224037932ccdc40", + "height": 2287573, + "long_term_weight": 65605, + "major_version": 14, + "miner_tx_hash": "42219818a7f30910a89e0d0d9fc479950137b93820e5955fc071fa8f4e3c2400", + "minor_version": 14, + "nonce": 37920, + "num_txes": 34, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "7ca630666d7040f0cadbaaf9da92db4797ef67b60ca8f15324b94236ffe0b3a8", + "reward": 1181081601887, + "timestamp": 1612215053, + "wide_cumulative_difficulty": "0x1330ce5bf1eabc9", + "wide_difficulty": "0x3b0ee3f928" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_output_histogram_1and5.json b/tests/data/test_jsonrpcdaemon/test_get_output_histogram_1and5.json new file mode 100644 index 0000000..142bb83 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_output_histogram_1and5.json @@ -0,0 +1,24 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "histogram": [ + { + "amount": 1000000000000, + "recent_instances": 874619, + "total_instances": 874619, + "unlocked_instances": 874619 + }, + { + "amount": 5000000000000, + "recent_instances": 255089, + "total_instances": 255089, + "unlocked_instances": 255089 + } + ], + "status": "OK", + "top_hash": "", + "untrusted": false + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_version.json b/tests/data/test_jsonrpcdaemon/test_get_version.json new file mode 100644 index 0000000..22911b7 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_version.json @@ -0,0 +1,10 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "release": true, + "status": "OK", + "untrusted": false, + "version": 196613 + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_hard_fork_info.json b/tests/data/test_jsonrpcdaemon/test_hard_fork_info.json new file mode 100644 index 0000000..e96e674 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_hard_fork_info.json @@ -0,0 +1,18 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "earliest_height": 2210720, + "enabled": true, + "state": 2, + "status": "OK", + "threshold": 0, + "top_hash": "", + "untrusted": false, + "version": 14, + "votes": 10080, + "voting": 14, + "window": 10080 + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_method_not_found.json b/tests/data/test_jsonrpcdaemon/test_method_not_found.json new file mode 100644 index 0000000..147f19a --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_method_not_found.json @@ -0,0 +1,8 @@ +{ + "error": { + "code": -32601, + "message": "Method not found" + }, + "id": "", + "jsonrpc": "2.0" +} diff --git a/tests/data/test_jsonrpcdaemon/test_on_get_block_hash_2000000.json b/tests/data/test_jsonrpcdaemon/test_on_get_block_hash_2000000.json new file mode 100644 index 0000000..0b71dcc --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_on_get_block_hash_2000000.json @@ -0,0 +1,5 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": "dc2ef85b049311814742f543469e3ec1b8d589e68434d9f220ce41072c69c39e" +} diff --git a/tests/data/test_jsonrpcdaemon/test_relay_tx.json b/tests/data/test_jsonrpcdaemon/test_relay_tx.json new file mode 100644 index 0000000..032d8b8 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_relay_tx.json @@ -0,0 +1,7 @@ +{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK" + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_set_bans.json b/tests/data/test_jsonrpcdaemon/test_set_bans.json new file mode 100644 index 0000000..d857320 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_bans.json @@ -0,0 +1,8 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "status": "OK", + "untrusted": false + } +} diff --git a/tests/data/test_jsonrpcdaemon/test_submit_block_failure.json b/tests/data/test_jsonrpcdaemon/test_submit_block_failure.json new file mode 100644 index 0000000..4daa2b6 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_submit_block_failure.json @@ -0,0 +1,8 @@ +{ + "id": "0", + "jsonrpc": "2.0", + "error": { + "code": -7, + "message": "Block not accepted" + } +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_sync_info.json b/tests/data/test_jsonrpcdaemon/test_sync_info.json new file mode 100644 index 0000000..0c05e6f --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_sync_info.json @@ -0,0 +1,288 @@ +{ + "id": 0, + "jsonrpc": "2.0", + "result": { + "credits": 0, + "height": 2292442, + "next_needed_pruning_seed": 0, + "overview": "[m]", + "peers": [ + { + "info": { + "address": "54.39.75.54:59545", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "9bded655ad3d44eaa8b51917bdb8edbb", + "current_download": 0, + "current_upload": 0, + "height": 1, + "host": "54.39.75.54", + "incoming": true, + "ip": "54.39.75.54", + "live_time": 1, + "local_ip": false, + "localhost": false, + "peer_id": "0000000000000000", + "port": "59545", + "pruning_seed": 0, + "recv_count": 277, + "recv_idle_time": 1, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 0, + "send_idle_time": 1, + "state": "before_handshake", + "support_flags": 0 + } + }, + { + "info": { + "address": "71.127.156.63:18080", + "address_type": 1, + "avg_download": 2, + "avg_upload": 2, + "connection_id": "7cdec5cac0aa407d8e056060f0dce6b4", + "current_download": 2, + "current_upload": 1, + "height": 2292455, + "host": "71.127.156.63", + "incoming": false, + "ip": "71.127.156.63", + "live_time": 8, + "local_ip": false, + "localhost": false, + "peer_id": "b57c1d628236d6fb", + "port": "18080", + "pruning_seed": 0, + "recv_count": 22374, + "recv_idle_time": 0, + "rpc_credits_per_hash": 0, + "rpc_port": 18089, + "send_count": 17416, + "send_idle_time": 0, + "state": "synchronizing", + "support_flags": 1 + } + }, + { + "info": { + "address": "178.63.100.197:18080", + "address_type": 1, + "avg_download": 110, + "avg_upload": 1, + "connection_id": "e8076d15669c431d90b290a712760359", + "current_download": 110, + "current_upload": 1, + "height": 2292455, + "host": "178.63.100.197", + "incoming": false, + "ip": "178.63.100.197", + "live_time": 9, + "local_ip": false, + "localhost": false, + "peer_id": "449271bcfcef7f09", + "port": "18080", + "pruning_seed": 0, + "recv_count": 1021331, + "recv_idle_time": 1, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 16867, + "send_idle_time": 8, + "state": "normal", + "support_flags": 1 + } + }, + { + "info": { + "address": "165.22.236.24:18080", + "address_type": 1, + "avg_download": 110, + "avg_upload": 0, + "connection_id": "915185f624eb4608947634fde6b9c1fe", + "current_download": 110, + "current_upload": 0, + "height": 2292455, + "host": "165.22.236.24", + "incoming": false, + "ip": "165.22.236.24", + "live_time": 9, + "local_ip": false, + "localhost": false, + "peer_id": "7c7aa2074c6a751b", + "port": "18080", + "pruning_seed": 0, + "recv_count": 1018291, + "recv_idle_time": 8, + "rpc_credits_per_hash": 0, + "rpc_port": 18089, + "send_count": 1930, + "send_idle_time": 9, + "state": "synchronizing", + "support_flags": 1 + } + }, + { + "info": { + "address": "91.134.195.240:6841", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "ae10ae80001644cbaa5d11c89b438ef1", + "current_download": 0, + "current_upload": 0, + "height": 0, + "host": "91.134.195.240", + "incoming": false, + "ip": "91.134.195.240", + "live_time": 8, + "local_ip": false, + "localhost": false, + "peer_id": "0000000000000000", + "port": "6841", + "pruning_seed": 0, + "recv_count": 0, + "recv_idle_time": 8, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 276, + "send_idle_time": 0, + "state": "before_handshake", + "support_flags": 0 + } + }, + { + "info": { + "address": "54.37.179.243:9614", + "address_type": 1, + "avg_download": 1, + "avg_upload": 0, + "connection_id": "d3fded162175437da399925605ca3518", + "current_download": 1, + "current_upload": 0, + "height": 2292442, + "host": "54.37.179.243", + "incoming": false, + "ip": "54.37.179.243", + "live_time": 10, + "local_ip": false, + "localhost": false, + "peer_id": "722e7a576324d872", + "port": "9614", + "pruning_seed": 0, + "recv_count": 15409, + "recv_idle_time": 8, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 390, + "send_idle_time": 8, + "state": "normal", + "support_flags": 1 + } + }, + { + "info": { + "address": "51.79.58.93:37237", + "address_type": 1, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "34a5137c68974507b765e86ef6adf101", + "current_download": 0, + "current_upload": 0, + "height": 1, + "host": "51.79.58.93", + "incoming": true, + "ip": "51.79.58.93", + "live_time": 3, + "local_ip": false, + "localhost": false, + "peer_id": "f872089bd28ee6d8", + "port": "37237", + "pruning_seed": 0, + "recv_count": 277, + "recv_idle_time": 3, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 0, + "send_idle_time": 3, + "state": "normal", + "support_flags": 0 + } + }, + { + "info": { + "address": "51.255.233.156:12189", + "address_type": 1, + "avg_download": 1, + "avg_upload": 0, + "connection_id": "c4b780395a10482dbfbb72e4da1943fc", + "current_download": 1, + "current_upload": 0, + "height": 2292442, + "host": "51.255.233.156", + "incoming": false, + "ip": "51.255.233.156", + "live_time": 10, + "local_ip": false, + "localhost": false, + "peer_id": "47da23ee4994e50e", + "port": "12189", + "pruning_seed": 0, + "recv_count": 15305, + "recv_idle_time": 9, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 1275, + "send_idle_time": 9, + "state": "normal", + "support_flags": 1 + } + }, + { + "info": { + "address": "51.91.33.156:60567", + "address_type": 1, + "avg_download": 1, + "avg_upload": 1, + "connection_id": "0f6283f1d61b4095a95c4dccff7f150f", + "current_download": 0, + "current_upload": 1, + "height": 2292442, + "host": "51.91.33.156", + "incoming": true, + "ip": "51.91.33.156", + "live_time": 11, + "local_ip": false, + "localhost": false, + "peer_id": "9ef7bdcee2a6fa22", + "port": "60567", + "pruning_seed": 0, + "recv_count": 15513, + "recv_idle_time": 0, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 15218, + "send_idle_time": 10, + "state": "normal", + "support_flags": 1 + } + } + ], + "spans": [ + { + "connection_id": "e8076d15669c431d90b290a712760359", + "nblocks": 13, + "rate": 982529, + "remote_address": "178.63.100.197:18080", + "size": 998309, + "speed": 100, + "start_block_height": 2292442 + } + ], + "status": "OK", + "target_height": 2292455, + "top_hash": "", + "untrusted": false + } +} diff --git a/tests/test_jsonrpcdaemon.py b/tests/test_jsonrpcdaemon.py index 15dc749..5ad2ee3 100644 --- a/tests/test_jsonrpcdaemon.py +++ b/tests/test_jsonrpcdaemon.py @@ -1,4 +1,5 @@ import decimal +import json import logging import os import responses @@ -6,7 +7,7 @@ import responses from monero.const import NET_STAGE from monero.daemon import Daemon from monero.backends.jsonrpc import JSONRPCDaemon, RPCError -from monero.exceptions import TransactionWithoutBlob +from monero.exceptions import TransactionWithoutBlob, DaemonIsBusy from monero.transaction import Transaction from .base import JSONTestCase @@ -20,6 +21,7 @@ class JSONRPCDaemonTestCase(JSONTestCase): def setUp(self): self.daemon = Daemon(JSONRPCDaemon()) + self.backend = self.daemon._backend # this is disabled b/c raw_request logs errors logging.getLogger('monero.backends.jsonrpc.daemon').disabled = True @@ -212,3 +214,578 @@ class JSONRPCDaemonTestCase(JSONTestCase): with self.assertRaises(ValueError): daemon3 = Daemon(backend=JSONRPCDaemon(), port=18089) + + @responses.activate + def test_busy_daemon(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_last_block_header_BUSY.json'), + status=200) + + with self.assertRaises(DaemonIsBusy): + self.backend.get_last_block_header() + + # Start testing all JSONRPC commands + @responses.activate + def test_get_block_count(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_count_2287024.json'), + status=200) + + resp = self.backend.get_block_count() + + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['count'], 2287024) + + @responses.activate + def test_on_get_block_hash(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_on_get_block_hash_2000000.json'), + status=200) + + self.assertEqual( + self.backend.on_get_block_hash(2000000), + 'dc2ef85b049311814742f543469e3ec1b8d589e68434d9f220ce41072c69c39e') + + with self.assertRaises(ValueError): + self.backend.on_get_block_hash(-2023) + + @responses.activate + def test_get_block_template(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_template_481SgRxo_64.json'), + status=200) + + resp = self.backend.get_block_template( + '481SgRxo8hwBCY4z6r88JrN5X8JFCJYuJUDuJXGybTwaVKyoJPKoGj3hQRAEGgQTdmV1xH1URdnHkJv6He5WkEbq6iKhr94', + reserve_size=64) + + self.assertTrue(resp['blocktemplate_blob'].startswith( + '0e0ec890de8006fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd27')) + self.assertTrue(resp['blockhashing_blob'].startswith( + '0e0ec890de8006fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd27')) + self.assertEqual(resp['difficulty'], 232871166515) + self.assertEqual(resp['difficulty_top64'], 0) + self.assertEqual(resp['expected_reward'], 1180703555413) + self.assertEqual(resp['height'], 2287042) + self.assertEqual(resp['prev_hash'], 'fbe94dbaf09e5fc4431460ede46c0e7c3db4adf1f0a6f34c5a0f5144e6d9dd27') + self.assertEqual(resp['reserved_offset'], 130) + self.assertEqual(resp['seed_hash'], 'd432f499205150873b2572b5f033c9c6e4b7c6f3394bd2dd93822cd7085e7307') + self.assertEqual(resp['seed_height'], 2285568) + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['untrusted'], False) + self.assertEqual(resp['wide_difficulty'], '0x3638340233') + + with self.assertRaises(ValueError): + self.backend.get_block_template( + '481SgRxo8hwBCY4z6r88JrN5X8JFCJYuJUDuJXGybTwaVKyoJPKoGj3hQRAEGgQTdmV1xH1URdnHkJv6He5WkEbq6iKhr94', + -49) + + with self.assertRaises(ValueError): + self.backend.get_block_template( + 'ThisIsAnInvalidWalletAddressSoThisShouldThrowAnError', + 30) + + @responses.activate + def test_submit_block(self): + # @TODO I need a more thorough test for this routine, but I do have have an example of a response for a successfully + # mined block, sadly. Maybe we can use the project donations to purchase an AMD EPYC 7742 for "research" ;) + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_submit_block_failure.json'), + status=200) + + with self.assertRaises(RPCError): + self.backend.submit_block(b'this is not a block and should not work') + + @responses.activate + def test_get_last_block_header(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_last_block_header_success.json'), + status=200) + + resp = self.backend.get_last_block_header() + + self.assertEqual(resp['status'], 'OK') + + block_header = resp['block_header'] + + self.assertEqual(block_header['block_size'], 65605) + self.assertEqual(block_header['block_weight'], 65605) + self.assertEqual(block_header['cumulative_difficulty'], 86426998743673801) + self.assertEqual(block_header['cumulative_difficulty_top64'], 0) + self.assertEqual(block_header['wide_cumulative_difficulty'], "0x1330ce5bf1eabc9") + self.assertEqual(block_header['depth'], 0) + self.assertEqual(block_header['difficulty'], 253652891944) + self.assertEqual(block_header['difficulty_top64'], 0) + self.assertEqual(block_header['wide_difficulty'], "0x3b0ee3f928") + self.assertEqual(block_header['hash'], "a55ec867052340715c4b8b4dcd2de53bc2a195e666058d10a224037932ccdc40") + self.assertEqual(block_header['height'], 2287573) + self.assertEqual(block_header['long_term_weight'], 65605) + self.assertEqual(block_header['major_version'], 14) + self.assertEqual(block_header['minor_version'], 14) + self.assertEqual(block_header['miner_tx_hash'], "42219818a7f30910a89e0d0d9fc479950137b93820e5955fc071fa8f4e3c2400") + self.assertEqual(block_header['nonce'], 37920) + self.assertEqual(block_header['num_txes'], 34) + self.assertEqual(block_header['orphan_status'], False) + self.assertEqual(block_header['pow_hash'], "") + self.assertEqual(block_header['prev_hash'], "7ca630666d7040f0cadbaaf9da92db4797ef67b60ca8f15324b94236ffe0b3a8") + self.assertEqual(block_header['reward'], 1181081601887) + self.assertEqual(block_header['timestamp'], 1612215053) + + @responses.activate + def test_get_block_header_by_hash(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_header_by_hash_90f6fd3f.json'), + status=200) + + resp = self.backend.get_block_header_by_hash('90f6fd3fe29c7518f15afd2da31734e890cc24247b5da10dc9ac2ea215ae844b') + + self.assertIn('block_header', resp) + self.assertIn('status', resp) + self.assertIn('untrusted', resp) + + block_header = resp['block_header'] + + self.assertEqual(block_header['block_size'], 17130) + self.assertEqual(block_header['block_weight'], 17130) + self.assertEqual(block_header['cumulative_difficulty'], 86641187797059581) + self.assertEqual(block_header['cumulative_difficulty_top64'], 0) + self.assertEqual(block_header['wide_cumulative_difficulty'], "0x133cfb3858fc7fd") + self.assertEqual(block_header['depth'], 4) + self.assertEqual(block_header['difficulty'], 239025076303) + self.assertEqual(block_header['difficulty_top64'], 0) + self.assertEqual(block_header['wide_difficulty'], "0x37a701384f") + self.assertEqual(block_header['hash'], "90f6fd3fe29c7518f15afd2da31734e890cc24247b5da10dc9ac2ea215ae844b") + self.assertEqual(block_header['height'], 2288453) + self.assertEqual(block_header['long_term_weight'], 17130) + self.assertEqual(block_header['major_version'], 14) + self.assertEqual(block_header['minor_version'], 14) + self.assertEqual(block_header['miner_tx_hash'], "5e8d9531ae078ef5630e3c9950eb768b87b31481652c2b8dafca25d57e9c0c3f") + self.assertEqual(block_header['nonce'], 1040830456) + self.assertEqual(block_header['num_txes'], 11) + self.assertEqual(block_header['orphan_status'], False) + self.assertEqual(block_header['pow_hash'], "") + self.assertEqual(block_header['prev_hash'], "a78d9e631f743806b0b8d3a70bb85758db466633eb3b4620737dd29b0548eb21") + self.assertEqual(block_header['reward'], 1176972120146) + self.assertEqual(block_header['timestamp'], 1612323209) + + with self.assertRaises(ValueError): + self.backend.get_block_header_by_hash('HeyWaitAMinuteThisIsntAHashYouLiedToMeHowCouldYouDoThisToMeITrustedYou') + + @responses.activate + def test_get_block_header_by_height(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_header_by_height_2288495.json'), + status=200) + + resp = self.backend.get_block_header_by_height(2288495) + + self.assertIn('block_header', resp) + self.assertIn('status', resp) + self.assertIn('untrusted', resp) + + block_header = resp['block_header'] + + self.assertEqual(block_header['block_size'], 8415) + self.assertEqual(block_header['block_weight'], 8415) + self.assertEqual(block_header['cumulative_difficulty'], 86651164421641270) + self.assertEqual(block_header['cumulative_difficulty_top64'], 0) + self.assertEqual(block_header['wide_cumulative_difficulty'], "0x133d8c662b9d436") + self.assertEqual(block_header['depth'], 3) + self.assertEqual(block_header['difficulty'], 238154836806) + self.assertEqual(block_header['difficulty_top64'], 0) + self.assertEqual(block_header['wide_difficulty'], "0x3773226b46") + self.assertEqual(block_header['hash'], "966c1a70358ce998e7d5fb243b155971f9bffe06030c92dbd70486d398c40c05") + self.assertEqual(block_header['height'], 2288495) + self.assertEqual(block_header['long_term_weight'], 8415) + self.assertEqual(block_header['major_version'], 14) + self.assertEqual(block_header['minor_version'], 14) + self.assertEqual(block_header['miner_tx_hash'], "408dd52531cab37e51db5a9a581bf25691b5534d8d0037b38e68061691b976e1") + self.assertEqual(block_header['nonce'], 1275098057) + self.assertEqual(block_header['num_txes'], 5) + self.assertEqual(block_header['orphan_status'], False) + self.assertEqual(block_header['pow_hash'], "") + self.assertEqual(block_header['prev_hash'], "47751e6eb31230e92a5ee98242aa34d79bfd48657f2727c9a9b3cbad6aee88bb") + self.assertEqual(block_header['reward'], 1176760892780) + self.assertEqual(block_header['timestamp'], 1612328193) + + with self.assertRaises(ValueError): + self.backend.get_block_header_by_height(-69420) + + @responses.activate + def test_get_block_headers_range(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_headers_range_2288491_2288500.json'), + status=200) + + resp = self.backend.get_block_header_by_height(2288495) + + self.assertIn('headers', resp) + self.assertIn('status', resp) + self.assertIn('untrusted', resp) + + headers = resp['headers'] + + self.assertEqual(len(headers), 10) + + block_header_0 = headers[0] + + self.assertEqual(block_header_0['block_size'], 49559) + self.assertEqual(block_header_0['block_weight'], 49559) + self.assertEqual(block_header_0['cumulative_difficulty'], 86650214633914049) + self.assertEqual(block_header_0['cumulative_difficulty_top64'], 0) + self.assertEqual(block_header_0['wide_cumulative_difficulty'], "0x133d7e93ef73ec1") + self.assertEqual(block_header_0['depth'], 19) + self.assertEqual(block_header_0['difficulty'], 236253710852) + self.assertEqual(block_header_0['difficulty_top64'], 0) + self.assertEqual(block_header_0['wide_difficulty'], "0x3701d18a04") + self.assertEqual(block_header_0['hash'], "01a5a129515e752055af9883ac98cdbd9eb90db16ab69ea187a1eb24eb7d0c66") + self.assertEqual(block_header_0['height'], 2288491) + self.assertEqual(block_header_0['long_term_weight'], 49559) + self.assertEqual(block_header_0['major_version'], 14) + self.assertEqual(block_header_0['minor_version'], 14) + self.assertEqual(block_header_0['miner_tx_hash'], "22c3dd706931fe0606e086147dcb8a984b504a5bd0eabd1cf7dabb9456154cd4") + self.assertEqual(block_header_0['nonce'], 922780730) + self.assertEqual(block_header_0['num_txes'], 26) + self.assertEqual(block_header_0['orphan_status'], False) + self.assertEqual(block_header_0['pow_hash'], "") + self.assertEqual(block_header_0['prev_hash'], "6bd071b487be697128142b9b132be8d2c3e4ee9660f73d811c3d23e4526e56ac") + self.assertEqual(block_header_0['reward'], 1178084560299) + self.assertEqual(block_header_0['timestamp'], 1612327847) + + with self.assertRaises(ValueError): + self.backend.get_block_headers_range(-1, 10) + + with self.assertRaises(ValueError): + self.backend.get_block_headers_range(70, 25) + + @responses.activate + def test_get_block_with_height(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_2288515.json'), + status=200) + + resp = self.backend.get_block(height=2288515) + + resp_fields = ['blob', 'block_header', 'credits', 'json', 'miner_tx_hash', 'status', 'tx_hashes', 'untrusted'] + for field in resp_fields: + self.assertIn(field, resp) + + self.assertTrue(resp['blob'].startswith('0e0efef0e880066d78ace422007a2cefb423553b3')) + self.assertEqual(len(resp['tx_hashes']), 17) + self.assertEqual(resp['status'], 'OK') + self.assertTrue(type(resp['block_header']), dict) + + json.loads(resp['json']) + + with self.assertRaises(ValueError): + self.backend.get_block() + + with self.assertRaises(ValueError): + self.backend.get_block(height=2288515, hash='1c68300646dda11a89cc9ca4001100745fcbd192e0e6efb6b06bd4d25851662b') + + with self.assertRaises(ValueError): + self.backend.get_block(height=-5) + + @responses.activate + def test_get_block_with_hash(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_block_2288515.json'), + status=200) + + resp = self.backend.get_block(hash='1c68300646dda11a89cc9ca4001100745fcbd192e0e6efb6b06bd4d25851662b') + + resp_fields = ['blob', 'block_header', 'credits', 'json', 'miner_tx_hash', 'status', 'tx_hashes', 'untrusted'] + + for field in resp_fields: + self.assertIn(field, resp) + + self.assertTrue(resp['blob'].startswith('0e0efef0e880066d78ace422007a2cefb423553b3')) + self.assertEqual(len(resp['tx_hashes']), 17) + self.assertEqual(resp['status'], 'OK') + self.assertTrue(type(resp['block_header']), dict) + + json.loads(resp['json']) + + with self.assertRaises(ValueError): + self.backend.get_block(hash='STUPIDHECKINGBADHASH') + + @responses.activate + def test_get_connections(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_connections.json'), + status=200) + + resp = self.backend.get_connections() + + self.assertIn('connections', resp) + + connections = resp['connections'] + + self.assertNotEqual(len(connections), 0) + + connection0 = connections[0] + + for conn_field in ['address', 'address_type', 'avg_download', 'avg_upload', 'connection_id', 'current_download', 'current_upload', + 'height', 'host', 'incoming', 'ip', 'live_time', 'local_ip', 'localhost', 'peer_id', 'port', 'pruning_seed', 'recv_count', 'recv_idle_time', + 'rpc_credits_per_hash', 'rpc_port', 'send_count', 'send_idle_time', 'state', 'support_flags']: + self.assertIn(conn_field, connection0) + + @responses.activate + def test_get_info(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_info.json'), + status=200) + + resp = self.backend.get_info() + + for info_field in ['adjusted_time', 'alt_blocks_count', 'block_size_limit', 'block_size_median', 'block_weight_limit', 'block_weight_median', + 'bootstrap_daemon_address', 'busy_syncing', 'credits', 'cumulative_difficulty', 'cumulative_difficulty_top64', 'database_size', 'difficulty', + 'difficulty_top64', 'free_space', 'grey_peerlist_size', 'height', 'height_without_bootstrap', 'incoming_connections_count', 'mainnet', 'nettype', + 'offline', 'outgoing_connections_count', 'rpc_connections_count', 'stagenet', 'start_time', 'status', 'synchronized', 'target', 'target_height', + 'testnet', 'top_block_hash', 'top_hash', 'tx_count', 'tx_pool_size', 'untrusted', 'update_available', 'version', 'was_bootstrap_ever_used', + 'white_peerlist_size', 'wide_cumulative_difficulty', 'wide_difficulty']: + self.assertIn(info_field, resp) + + @responses.activate + def test_hard_fork_info(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_hard_fork_info.json'), + status=200) + + resp = self.backend.hard_fork_info() + + for fork_field in ["earliest_height", "enabled", "state", "status", "threshold", "version", "votes", "voting", "window"]: + self.assertIn(fork_field, resp) + + @responses.activate + def test_set_bans_single(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_set_bans.json'), + status=200) + + resp = self.backend.set_bans('188.165.17.204', True, 3600) + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_set_bans_multiple(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_set_bans.json'), + status=200) + + + ips = ['188.165.17.204', 1466097787, '87.98.224.124'] + bans = [True, True, False] + seconds = [3600, 500, 7200] + + self.backend.set_bans(ips, bans, seconds) + + def test_set_bans_errors(self): + bad_ips = [-1, 99999999999, 69420, '300.1.1.1', '125.124.123', '8.8.8.8'] + bad_bans = [False, False, True, False, True, True] + bad_seconds = [0, None, None, 60, 4000, None] + + for i in range(len(bad_ips)): + with self.assertRaises(ValueError): + self.backend.set_bans(bad_ips[i], bad_bans[i], bad_seconds[i]) + + @responses.activate + def test_get_bans(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_bans.json'), + status=200) + + resp = self.backend.get_bans() + + self.assertIn('bans', resp) # Should always be true bc I insert bans field when not given + bans = resp['bans'] + ban0 = bans[0] + + self.assertEqual(ban0['host'], '145.239.118.5') + self.assertEqual(ban0['ip'], 91680657) + self.assertEqual(ban0['seconds'], 72260) + + @responses.activate + def test_flush_txpool_all(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_flush_txpool.json'), + status=200) + + + self.backend.flush_txpool() + + @responses.activate + def test_flush_txpool_single(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_flush_txpool.json'), + status=200) + + + self.backend.flush_txpool('65971f85ee13782f1f664cc8034a10b361b8b71ef821b323405ee0f698adb702') + + @responses.activate + def test_flush_txpool_multiple(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_flush_txpool.json'), + status=200) + + txs_to_flush = ['51bd0eebbb32392d4b4646e8b398432b9f42dee0e41f4939305e13e9f9a28e08', + 'ae9f8cbfdbae825e61c2745dc77c533fb9811e42ab9b3810d9529794c5bc9404'] + + self.backend.flush_txpool(txs_to_flush) + + @responses.activate + def test_get_output_histogram(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_output_histogram_1and5.json'), + status=200) + + resp = self.backend.get_output_histogram([1e12, 5e12], 10, 100000000, True, 10) + + histogram = resp['histogram'] + + self.assertEqual(histogram[0]['amount'], 1e12) + self.assertEqual(histogram[0]['recent_instances'], 874619) + self.assertEqual(histogram[0]['total_instances'], 874619) + self.assertEqual(histogram[0]['unlocked_instances'], 874619) + + @responses.activate + def test_get_coinbase_tx_sum(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_coinbase_tx_sum_2200000.json'), + status=200) + + resp = self.backend.get_coinbase_tx_sum(2200000, 100) + + self.assertEqual(resp['emission_amount'], 139291580971286) + self.assertEqual(resp['emission_amount_top64'], 0) + self.assertEqual(resp['wide_emission_amount'], '0x7eaf59343916') + self.assertEqual(resp['fee_amount'], 505668215000) + self.assertEqual(resp['fee_amount_top64'], 0) + self.assertEqual(resp['wide_fee_amount'], '0x75bc2ca0d8') + + @responses.activate + def test_get_version(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_version.json'), + status=200) + + resp = self.backend.get_version() + + self.assertEqual(resp['release'], True) + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['untrusted'], False) + self.assertEqual(resp['version'], 196613) + + @responses.activate + def test_get_fee_estimate(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_fee_estimate.json'), + status=200) + + resp = self.backend.get_fee_estimate() + + self.assertEqual(resp['fee'], 7790) + self.assertEqual(resp['quantization_mask'], 10000) + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['untrusted'], False) + + @responses.activate + def test_get_fee_estimate_with_grace(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_fee_estimate.json'), + status=200) + + resp = self.backend.get_fee_estimate(grace_blocks=10) + + self.assertEqual(resp['fee'], 7790) + self.assertEqual(resp['quantization_mask'], 10000) + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['untrusted'], False) + + def test_get_fee_estimate_errors(self): + with self.assertRaises(TypeError): + self.backend.get_fee_estimate(5.5) + + with self.assertRaises(ValueError): + self.backend.get_fee_estimate(-100) + + @responses.activate + def test_get_alternate_chains(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_get_alternate_chains.json'), + status=200) + + resp = self.backend.get_alternate_chains() + + chains = resp['chains'] + chain0 = chains[0] + + self.assertEqual(chain0['block_hash'], '697cf03c89a9b118f7bdf11b1b3a6a028d7b3617d2d0ed91322c5709acf75625') + self.assertEqual(chain0['difficulty'], 14114729638300280) + self.assertEqual(chain0['height'], 1562062) + self.assertEqual(chain0['length'], 2) + + @responses.activate + def test_relay_tx_single(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_relay_tx.json'), + status=200) + + resp = self.backend.relay_tx('9fd75c429cbe52da9a52f2ffc5fbd107fe7fd2099c0d8de274dc8a67e0c98613') + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_relay_tx_multiple(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_relay_tx.json'), + status=200) + + txs = ['70ee3df366870d8ca2099b273c1ae1c909a964b053077ead5c186c8b160c9d00', + '018476f726efb2d2b5a4a3ba6c29fb4f00549b0dcef6183b2bfa38a7acb1a804'] + resp = self.backend.relay_tx(txs) + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_sync_info(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_sync_info.json'), + status=200) + + resp = self.backend.sync_info() + + height = resp['height'] + peers = resp['peers'] + spans = resp['spans'] + + pinfo0 = peers[0]['info'] + + self.assertEqual(height, 2292442) + self.assertEqual(pinfo0['address'], '54.39.75.54:59545') + self.assertEqual(pinfo0['connection_id'], '9bded655ad3d44eaa8b51917bdb8edbb') + self.assertEqual(pinfo0['host'], '54.39.75.54') + self.assertEqual(pinfo0['port'], '59545') + self.assertEqual(pinfo0['recv_count'], 277) + self.assertEqual(pinfo0['incoming'], True) + + span0 = spans[0] + + self.assertEqual(span0, { + "connection_id": "e8076d15669c431d90b290a712760359", + "nblocks": 13, + "rate": 982529, + "remote_address": "178.63.100.197:18080", + "size": 998309, + "speed": 100, + "start_block_height": 2292442 + }) + + @responses.activate + def test_get_txpool_backlog(self): + pass + + @responses.activate + def test_get_output_distribution(self): + pass \ No newline at end of file From c7e5e966c77906cb0f0bacbccaaccb589f326fc9 Mon Sep 17 00:00:00 2001 From: Jeffrey Ryan Date: Sun, 21 Feb 2021 02:17:55 -0600 Subject: [PATCH 4/5] Added More Test Cases and Command Improvements Tweaks to Commands: 1. Now catches and raises a more descriptive error when the node returns malformed JSON or JSON with non-unicode characters in it. 2. Removed get_txpool_backlog and get_output_distribution because they are actually binary RPC commands in disguise, maybe they can be added later. 3. Improved input validation for start_mining. 4. Catches NOT MINING status in set_log_hash_rate and raises descriptive error. 5. Adds abaility in out_peers and in_peers to set unlimited peers by passing -1 as arg. 6. Make input more intuitive in get_outs. 7. Shortened names of get_all_known_log_levels and get_all_known_log_categories. 8. Other very minor tweaks. --- monero/backends/jsonrpc/daemon.py | 173 +- ...est_get_alt_blocks_hashes_doc_example.json | 6 + .../test_get_height_2294632.json | 6 + .../test_jsonrpcdaemon/test_get_limit.json | 6 + .../test_get_outs_multiple.json | 36 + .../test_get_outs_single.json | 15 + .../test_get_peer_list.json | 1986 +++++++++++++++++ .../test_get_transaction_pool.json | 376 ++++ .../test_get_transaction_pool_stats.json | 62 + .../test_get_transactions.json | 44 + .../test_jsonrpcdaemon/test_in_peers.json | 5 + .../test_in_peers_unlimited.json | 5 + .../test_is_key_image_spent.json | 12 + .../data/test_jsonrpcdaemon/test_mining.json | 1 + .../test_mining_status_off.json | 19 + .../test_mining_status_on.json | 19 + .../test_jsonrpcdaemon/test_out_peers.json | 5 + .../test_out_peers_unlimited.json | 5 + .../data/test_jsonrpcdaemon/test_save_bc.json | 4 + .../test_set_log_categories_default.json | 5 + .../test_set_log_categories_empty.json | 5 + .../test_set_log_categories_multiple.json | 5 + .../test_set_log_hash_rate_mining.json | 4 + .../test_set_log_hash_rate_notmining.json | 4 + .../test_set_log_level.json | 4 + .../test_jsonrpcdaemon/test_stop_daemon.json | 4 + .../test_update_check_none.json | 10 + tests/test_jsonrpcdaemon.py | 418 +++- 28 files changed, 3142 insertions(+), 102 deletions(-) create mode 100644 tests/data/test_jsonrpcdaemon/test_get_alt_blocks_hashes_doc_example.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_height_2294632.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_limit.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_outs_multiple.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_outs_single.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_peer_list.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_transaction_pool.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_transaction_pool_stats.json create mode 100644 tests/data/test_jsonrpcdaemon/test_get_transactions.json create mode 100644 tests/data/test_jsonrpcdaemon/test_in_peers.json create mode 100644 tests/data/test_jsonrpcdaemon/test_in_peers_unlimited.json create mode 100644 tests/data/test_jsonrpcdaemon/test_is_key_image_spent.json create mode 100644 tests/data/test_jsonrpcdaemon/test_mining.json create mode 100644 tests/data/test_jsonrpcdaemon/test_mining_status_off.json create mode 100644 tests/data/test_jsonrpcdaemon/test_mining_status_on.json create mode 100644 tests/data/test_jsonrpcdaemon/test_out_peers.json create mode 100644 tests/data/test_jsonrpcdaemon/test_out_peers_unlimited.json create mode 100644 tests/data/test_jsonrpcdaemon/test_save_bc.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_categories_default.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_categories_empty.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_categories_multiple.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_mining.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_notmining.json create mode 100644 tests/data/test_jsonrpcdaemon/test_set_log_level.json create mode 100644 tests/data/test_jsonrpcdaemon/test_stop_daemon.json create mode 100644 tests/data/test_jsonrpcdaemon/test_update_check_none.json diff --git a/monero/backends/jsonrpc/daemon.py b/monero/backends/jsonrpc/daemon.py index 7d31cd4..5b73300 100755 --- a/monero/backends/jsonrpc/daemon.py +++ b/monero/backends/jsonrpc/daemon.py @@ -200,7 +200,13 @@ class JSONRPCDaemon(object): code=rsp.status_code, method=method)) - result = rsp.json() + try: + result = rsp.json() + except ValueError as e: + _log.error(u"Could not parse JSON response from '{url}' during method '{method}'. Response:\n{resp}".format( + url=self.url, method=method, resp=rsp.text)) + raise RPCError("Daemon returned an unreadable JSON response. It may contain unparseable binary characters.") + _ppresult = json.dumps(result, indent=2, sort_keys=True) _log.debug(u"Result:\n{result}".format(result=_ppresult)) @@ -870,60 +876,6 @@ class JSONRPCDaemon(object): return self.raw_jsonrpc_request('sync_info') - def get_txpool_backlog(self): - """ - Get all transaction pool backlog. - - Output: - { - "backlog": list; list of tx_backlog_entry with the following structure (in binary form) - { - "blob_size": unsigned int (in binary form). - "fee": unsigned int (in binary form). - "time_in_pool": unsigned int (in binary form). - } - "status": str; General RPC error code. "OK" means everything looks good. - "untrusted": bool; True for bootstrap mode, False for full sync mode. - } - """ - - return self.raw_jsonrpc_request('get_txpool_backlog') - - def get_output_distribution(self, amounts, cumulative=False, from_height=0, to_height=0): - """ - Get distribution of outputs for givens amount on the blockchain in a certain range of heights. - RingCT outputs are found with amount 0. - - :param list amounts: amounts to look for of type int for atomic units, or Decimal for full Monero amounts - :param bool cumulative: true if the result should be cumulative - :param int from_height: starting height to check from - :param int to_height: ending height to check up to - - Output: - { - "distributions": list; distribution informations with the following structure - { - "amount": unsigned int - "base": unsigned int - "distribution": array of unsigned int - "start_height": unsigned int - } - "status": str; General RPC error code. "OK" means everything looks good. - } - """ - - # Coerce amounts paramter - if isinstance(amounts, (int, Decimal)): - amounts = [to_atomic(amounts) if isinstance(amounts, Decimal) else amounts] - elif not amounts: - raise ValueError('amounts must have at least one element') - - return self.raw_jsonrpc_request('get_output_distribution', params={ - 'amounts': amounts, - 'cumulative': cumulative, - 'from_height': from_height, - 'to_height': to_height}) - # Other RPC Methods (https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#other-daemon-rpc-calls) def get_height(self): @@ -997,10 +949,10 @@ class JSONRPCDaemon(object): return self.raw_request('/get_transactions', data={ 'txs_hashes': tx_hashes, - 'decode_as_json': decode_as_json, - 'prune': prune}) + 'decode_as_json': bool(decode_as_json), + 'prune': bool(prune)}) - def get_alt_block_hashes(self): + def get_alt_blocks_hashes(self): """ Get the known blocks hashes which are not on the main chain. @@ -1012,7 +964,7 @@ class JSONRPCDaemon(object): } """ - return self.raw_request('/get_alt_block_hashes') + return self.raw_request('/get_alt_blocks_hashes') def is_key_image_spent(self, key_images): """ @@ -1035,7 +987,7 @@ class JSONRPCDaemon(object): key_images = self._validate_hashlist(key_images) - return self.raw_request('/is_key_image_spent', data={'key images': key_images}) + return self.raw_request('/is_key_image_spent', data={'key_images': key_images}) def send_raw_transaction(self, tx_as_hex, do_not_relay=False): """ @@ -1082,17 +1034,26 @@ class JSONRPCDaemon(object): } """ - try: - address.address(miner_address) - except ValueError: - raise ValueError('miner_address "{}" does not match any recognized wallet format'.format(miner_address)) + if isinstance(miner_address, address.Address): + miner_address = repr(miner_address) + else: + try: + converted_addr = address.address(miner_address) + except ValueError: + raise ValueError('miner_address "{}" does not match any recognized address format'.format(miner_address)) + + if not isinstance(converted_addr, address.Address): + raise ValueError('miner_address must be a "standard" monero address (i.e. it must start with a "4")') + + if not isinstance(threads_count, int): + raise TypeError("threads_count must be an int") if threads_count < 0: raise ValueError('threads_count < 0') return self.raw_request('/start_mining', data={ - 'do_background_mining': do_background_mining, - 'ignore_battery': ignore_battery, + 'do_background_mining': bool(do_background_mining), + 'ignore_battery': bool(ignore_battery), 'miner_address': miner_address, 'threads_count': threads_count}) @@ -1159,7 +1120,7 @@ class JSONRPCDaemon(object): return self.raw_request('/get_peer_list') - def set_log_hashrate(self, visible): + def set_log_hash_rate(self, visible): """ Set the log hash rate display mode. @@ -1171,7 +1132,13 @@ class JSONRPCDaemon(object): } """ - return self.set_log_hashrate('/set_log_hashrate', data={'visible': visible}) + resp = self.raw_request('/set_log_hash_rate', data={'visible': bool(visible)}) + + if resp['status'] == 'NOT MINING': + raise RPCError('The node at "{url}" is not currently mining and therefore cannot set its hash rate log visibility.' + .format(url=self.url)) + + return resp def set_log_level(self, level): """ @@ -1217,7 +1184,7 @@ class JSONRPCDaemon(object): category, level = cat_str.split(':') if category not in self._KNOWN_LOG_CATEGORIES: - _log.warn(u"Unrecognized log category: \"{}\"",format(category)) + _log.warn(u"Unrecognized log category: \"{}\"".format(category)) if level not in self._KNOWN_LOG_LEVELS: _log.warn(u"Unrecognized log level: \"{}\"".format(level)) @@ -1257,6 +1224,7 @@ class JSONRPCDaemon(object): "relayed": bool; States if this transaction has been relayed "tx_blob": unsigned int; Hexadecimal blob represnting the transaction. "tx_json": json string; JSON structure of all information in the transaction (see get_transactions() for structure information) + } "status": str; General RPC error code. "OK" means everything looks good. } """ @@ -1274,10 +1242,11 @@ class JSONRPCDaemon(object): "bytes_med" unsigned int; Median transaction size in pool. "bytes_min" unsigned int; Min transaction size in pool. "bytes_total": unsigned int; total size of all transactions in pool. - "histo": { - "txs": unsigned int; number of transactions. - "bytes": unsigned int; size in bytes. - } + "histo": list; histogram of transaction sizes with the following structure + { + "txs": unsigned int; number of transactions. + "bytes": unsigned int; size in bytes. + } "histo_98pc": unsigned int; the time 98% of txes are "younger" than. "num_10m": unsigned int; number of transactions in pool for more than 10 minutes. "num_double_spends": unsigned int; number of double spend transactions. @@ -1346,7 +1315,7 @@ class JSONRPCDaemon(object): """ Limit number of outgoing peers. - :param int out_peers_arg: Max number of outgoing peers + :param int out_peers_arg: Max number of outgoing peers. If less than zero, allow unlimited outgoing peers Output: { @@ -1354,15 +1323,18 @@ class JSONRPCDaemon(object): } """ - out_peers_arg = int(out_peers_arg) + if out_peers_arg < 0: + out_peers_arg = 2**32 - 1 + elif out_peers_arg > 2**32 - 1: + raise ValueError('out_peers_arg "{}" is too large'.format(out_peers_arg)) - return self.raw_request('/out_peers', data={'out_peers': out_peers_arg}) + return self.raw_request('/out_peers', data={'out_peers': int(out_peers_arg)}) def in_peers(self, in_peers_arg): """ - Limit number of Incoming peers. + Limit number of incoming peers. - :param int in_peers_arg: Max number of incoming peers + :param int in_peers_arg: Max number of incoming peers. If less than zero, allow unlimited incoming peers Output: { @@ -1370,23 +1342,21 @@ class JSONRPCDaemon(object): } """ - in_peers_arg = int(in_peers_arg) + if in_peers_arg < 0: + in_peers_arg = 2**32 - 1 + elif in_peers_arg > 2**32 - 1: + raise ValueError('in_peers_arg "{}" is too large'.format(in_peers_arg)) - return self.raw_request('/in_peers', data={'in_peers': in_peers_arg}) + return self.raw_request('/in_peers', data={'in_peers': int(in_peers_arg)}) - def get_outs(self, outputs, get_txid=True): + def get_outs(self, amount, index, get_txid=True): """ Get information about one-time outputs (stealth addresses). - :param list outputs: array of output structures, as defined below - :param bool get_txid: If true, a txid will included for each output in the response. - - Structure for outputs parameter: - { - "amount": unsigned int in atomic units or Decimal in full monero units (1e12 atmomic units) - "index": unsigned int; output's global index - } + :param amount: list or single element of output amount. Decimal for full monero amounts or int for atmoic units + :param index: list of single element of output index. int + :param bool get_txid: Optional. If true, a txid will included for each output in the response. Output: { @@ -1403,16 +1373,17 @@ class JSONRPCDaemon(object): } """ - # Validate outputs paramter - if isinstance(outputs, dict): - outputs = [outputs] - for i, out in enumerate(outputs): - if 'amount' not in out or 'index' not in out: - raise ValueError('structure of outputs is malformed') - amount, index = out['amount'], out['index'] - if isinstance(amount, Decimal): - amount = to_atomic(amount) - outputs[i] = {'amount': amount, 'index': index} + if isinstance(index, int): # single element + outputs = [{'amount': amount if isinstance(amount, int) else to_atomic(amount), 'index': index}] + else: # multiple elements + if len(amount) != len(index): + raise ValueError('length of amount and index do not match') + + outputs = [] + for a, i in zip(amount, index): + outputs.append({ + 'amount': a if isinstance(a, int) else to_atomic(a), + 'index': i}) return self.raw_request('/get_outs', data={ 'outputs': outputs, @@ -1455,11 +1426,11 @@ class JSONRPCDaemon(object): # Supporting class methods @classmethod - def get_all_known_log_categories(cls): + def known_log_categories(cls): return cls._KNOWN_LOG_CATEGORIES @classmethod - def get_all_known_log_levels(cls): + def known_log_levels(cls): return cls._KNOWN_LOG_LEVELS # private methods diff --git a/tests/data/test_jsonrpcdaemon/test_get_alt_blocks_hashes_doc_example.json b/tests/data/test_jsonrpcdaemon/test_get_alt_blocks_hashes_doc_example.json new file mode 100644 index 0000000..abefcc3 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_alt_blocks_hashes_doc_example.json @@ -0,0 +1,6 @@ + +{ + "blks_hashes": ["9c2277c5470234be8b32382cdf8094a103aba4fcd5e875a6fc159dc2ec00e011","637c0e0f0558e284493f38a5fcca3615db59458d90d3a5eff0a18ff59b83f46f","6f3adc174a2e8082819ebb965c96a095e3e8b63929ad9be2d705ad9c086a6b1c","697cf03c89a9b118f7bdf11b1b3a6a028d7b3617d2d0ed91322c5709acf75625","d99b3cf3ac6f17157ac7526782a3c3b9537f89d07e069f9ce7821d74bd9cad0e","e97b62109a6303233dcd697fa8545c9fcbc0bf8ed2268fede57ddfc36d8c939c","70ff822066a53ad64b04885c89bbe5ce3e537cdc1f7fa0dc55317986f01d1788","b0d36b209bd0d4442b55ea2f66b5c633f522401f921f5a85ea6f113fd2988866"], + "status": "OK", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_height_2294632.json b/tests/data/test_jsonrpcdaemon/test_get_height_2294632.json new file mode 100644 index 0000000..346c03f --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_height_2294632.json @@ -0,0 +1,6 @@ +{ + "hash": "228c0538b7ba7d28fdd58ed310326db61ea052038bdb42652f6e1852cf666325", + "height": 2294632, + "status": "OK", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_limit.json b/tests/data/test_jsonrpcdaemon/test_get_limit.json new file mode 100644 index 0000000..11df714 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_limit.json @@ -0,0 +1,6 @@ +{ + "limit_down": 8192, + "limit_up": 2048, + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_outs_multiple.json b/tests/data/test_jsonrpcdaemon/test_get_outs_multiple.json new file mode 100644 index 0000000..297748c --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_outs_multiple.json @@ -0,0 +1,36 @@ +{ + "credits": 0, + "outs": [ + { + "height": 1224094, + "key": "fc13952b8b9c193d4c875e750e88a0da8a7d348f95c019cfde93762d68298dd7", + "mask": "bf99dc047048605f6e0aeebc937477ae6e9e3143e1be1b48af225b41f809e44e", + "txid": "687f9b1d6fa409a13e84c682e90127b1953e10efe679c114a01d7db77f474d50", + "unlocked": true + }, + { + "height": 1224094, + "key": "23212433aec99219a823f107bcd27cb45a292d5c831b096d8e655e77e133b27e", + "mask": "3ad2a785a992b1491713efc809996e7007c9fabaf962edf10961d60aaa0dace7", + "txid": "687f9b1d6fa409a13e84c682e90127b1953e10efe679c114a01d7db77f474d50", + "unlocked": true + }, + { + "height": 999999, + "key": "fc22266e72afb339559e8938c99ee86157bfea20cd6115c477c40a53bc173378", + "mask": "02fa353aa84ea8c44c8023065d7941606b1fa5c264dccf46dc6494ebe9606f20", + "txid": "2a5d456439f7ae27b5d26e493651c0e24e1d7e02b6d9d019c89d562ce0658472", + "unlocked": true + }, + { + "height": 999999, + "key": "e20315663e3d278421797c4098c828cad5220849d08c3d26fee72003d4cda698", + "mask": "100c6f1342b71b73edddc5492be923182f00a683488ec3a2a1c7a949cbe57768", + "txid": "2a5d456439f7ae27b5d26e493651c0e24e1d7e02b6d9d019c89d562ce0658472", + "unlocked": true + } + ], + "status": "OK", + "top_hash": "", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_outs_single.json b/tests/data/test_jsonrpcdaemon/test_get_outs_single.json new file mode 100644 index 0000000..da27923 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_outs_single.json @@ -0,0 +1,15 @@ +{ + "credits": 0, + "outs": [ + { + "height": 1222460, + "key": "9c7055cb5b790f1eebf10b7b8fbe01241eb736b5766d15554da7099bbcdc4b44", + "mask": "42e37af85cddaeccbea6fe597037c9377045a682e66661260868877b9440af70", + "txid": "b357374ad4636f17520b6c2fdcf0fb5e6a1185fed2aef509b19b5100d04ae552", + "unlocked": true + } + ], + "status": "OK", + "top_hash": "", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_get_peer_list.json b/tests/data/test_jsonrpcdaemon/test_get_peer_list.json new file mode 100644 index 0000000..3f70457 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_peer_list.json @@ -0,0 +1,1986 @@ +{ + "gray_list": [ + { + "host": "92.233.45.0", + "id": 779474923786790553, + "ip": 3008860, + "last_seen": 0, + "port": 5156 + }, + { + "host": "92.233.45.0", + "id": 15987077781949512906, + "ip": 3008860, + "last_seen": 0, + "port": 6261 + }, + { + "host": "92.233.45.0", + "id": 5764671393012584235, + "ip": 3008860, + "last_seen": 0, + "port": 8581 + }, + { + "host": "92.233.45.0", + "id": 12902451817603222248, + "ip": 3008860, + "last_seen": 0, + "port": 10069 + }, + { + "host": "92.233.45.0", + "id": 7080165431715177761, + "ip": 3008860, + "last_seen": 0, + "port": 11189 + }, + { + "host": "92.233.45.0", + "id": 8435070856224735576, + "ip": 3008860, + "last_seen": 0, + "port": 14588 + }, + { + "host": "92.233.45.0", + "id": 4062424040325456143, + "ip": 3008860, + "last_seen": 0, + "port": 18080 + }, + { + "host": "97.107.205.0", + "id": 13126395034891249360, + "ip": 13462369, + "last_seen": 0, + "port": 8602 + }, + { + "host": "97.107.205.0", + "id": 6711839234508587175, + "ip": 13462369, + "last_seen": 0, + "port": 9420 + }, + { + "host": "97.107.205.0", + "id": 3078221558566017070, + "ip": 13462369, + "last_seen": 0, + "port": 12166 + }, + { + "host": "97.107.205.0", + "id": 4622360873820307608, + "ip": 13462369, + "last_seen": 0, + "port": 15596 + }, + { + "host": "97.107.205.0", + "id": 11650334017484549862, + "ip": 13462369, + "last_seen": 0, + "port": 18080 + }, + { + "host": "90.251.249.0", + "id": 2324961713670397476, + "ip": 16382810, + "last_seen": 0, + "port": 18080 + }, + { + "host": "24.38.253.0", + "id": 14217849125675872810, + "ip": 16590360, + "last_seen": 0, + "port": 18080 + }, + { + "host": "50.123.10.1", + "id": 3654198555105963589, + "ip": 17464114, + "last_seen": 0, + "port": 7372 + }, + { + "host": "50.123.10.1", + "id": 11871723637330058954, + "ip": 17464114, + "last_seen": 0, + "port": 11664 + }, + { + "host": "50.123.10.1", + "id": 17695168341920681727, + "ip": 17464114, + "last_seen": 0, + "port": 12047 + }, + { + "host": "116.203.42.1", + "id": 10105152526202709756, + "ip": 19581812, + "last_seen": 0, + "port": 18080, + "pruning_seed": 391, + "rpc_port": 18089 + }, + { + "host": "135.181.96.1", + "id": 1288736522654363159, + "ip": 23115143, + "last_seen": 0, + "port": 18080, + "pruning_seed": 389, + "rpc_port": 18089 + }, + { + "host": "45.66.110.1", + "id": 7677058678646617528, + "ip": 24003117, + "last_seen": 0, + "port": 18080 + }, + { + "host": "90.214.115.1", + "id": 15643640120403601865, + "ip": 24368730, + "last_seen": 0, + "port": 18080 + }, + { + "host": "83.78.203.1", + "id": 8764506475656833293, + "ip": 30101075, + "last_seen": 0, + "port": 18080 + }, + { + "host": "95.31.11.2", + "id": 7973662894853132712, + "ip": 34283359, + "last_seen": 0, + "port": 2924 + }, + { + "host": "95.31.11.2", + "id": 10372872189317723540, + "ip": 34283359, + "last_seen": 0, + "port": 4320 + }, + { + "host": "95.31.11.2", + "id": 17571050156906726415, + "ip": 34283359, + "last_seen": 0, + "port": 9463 + }, + { + "host": "95.31.11.2", + "id": 11716344520679473655, + "ip": 34283359, + "last_seen": 0, + "port": 9901 + }, + { + "host": "95.31.11.2", + "id": 11581932738466608144, + "ip": 34283359, + "last_seen": 0, + "port": 9973 + }, + { + "host": "95.31.11.2", + "id": 10654032656552018403, + "ip": 34283359, + "last_seen": 0, + "port": 10773 + }, + { + "host": "95.31.11.2", + "id": 15979201645195148943, + "ip": 34283359, + "last_seen": 0, + "port": 11960 + }, + { + "host": "85.163.64.2", + "id": 10564808662010939534, + "ip": 37790549, + "last_seen": 0, + "port": 18080 + }, + { + "host": "135.181.96.2", + "id": 5104233230066737178, + "ip": 39892359, + "last_seen": 0, + "port": 18080, + "pruning_seed": 386, + "rpc_port": 18089 + }, + { + "host": "70.35.142.2", + "id": 2736871122569659727, + "ip": 42869574, + "last_seen": 0, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "167.172.153.2", + "id": 10304250494922453473, + "ip": 43625639, + "last_seen": 0, + "port": 18080, + "pruning_seed": 391, + "rpc_port": 18089 + }, + { + "host": "138.197.156.2", + "id": 17698589515404280428, + "ip": 43828618, + "last_seen": 0, + "port": 18080, + "pruning_seed": 389, + "rpc_port": 18089 + }, + { + "host": "86.26.157.2", + "id": 11350341089863557181, + "ip": 43850326, + "last_seen": 0, + "port": 18080 + }, + { + "host": "85.236.163.2", + "id": 14688336842225122273, + "ip": 44297301, + "last_seen": 0, + "port": 18080 + }, + { + "host": "2.86.208.2", + "id": 10904657779924885142, + "ip": 47207938, + "last_seen": 0, + "port": 18080 + }, + { + "host": "184.167.211.2", + "id": 2759225003207673348, + "ip": 47425464, + "last_seen": 0, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "190.120.229.2", + "id": 9932539413136577433, + "ip": 48593086, + "last_seen": 0, + "port": 18080 + }, + { + "host": "192.99.232.2", + "id": 17483949079279998064, + "ip": 48784320, + "last_seen": 0, + "port": 18080 + }, + { + "host": "209.222.252.2", + "id": 13436473500902722579, + "ip": 50126545, + "last_seen": 0, + "port": 18080 + }, + { + "host": "83.223.21.3", + "id": 5525509980472020948, + "ip": 51765075, + "last_seen": 0, + "port": 18080 + }, + { + "host": "50.89.70.3", + "id": 6489648206388624499, + "ip": 54942002, + "last_seen": 0, + "port": 18080 + }, + { + "host": "148.251.85.3", + "id": 5712127357362720604, + "ip": 55966612, + "last_seen": 0, + "port": 18080, + "rpc_port": 18088 + }, + { + "host": "185.100.87.3", + "id": 5092634023628006602, + "ip": 56059065, + "last_seen": 0, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "135.181.96.3", + "id": 3399922587291439717, + "ip": 56669575, + "last_seen": 0, + "port": 18080, + "pruning_seed": 385, + "rpc_port": 18089 + }, + { + "host": "78.108.102.3", + "id": 1690266458204906159, + "ip": 57044046, + "last_seen": 0, + "port": 18080 + }, + { + "host": "45.137.216.3", + "id": 12481409206697508185, + "ip": 64522541, + "last_seen": 0, + "port": 18080 + }, + { + "host": "193.32.222.3", + "id": 6947972491846436663, + "ip": 64889025, + "last_seen": 0, + "port": 18080, + "pruning_seed": 389 + }, + { + "host": "184.23.22.4", + "id": 3890426483120330967, + "ip": 68556728, + "last_seen": 0, + "port": 18080, + "pruning_seed": 386 + }, + { + "host": "87.78.48.4", + "id": 14062915939536215495, + "ip": 70274647, + "last_seen": 0, + "port": 18080 + }, + { + "host": "51.89.73.4", + "id": 10356676212929067750, + "ip": 71915827, + "last_seen": 0, + "port": 5570 + }, + { + "host": "51.89.73.4", + "id": 16749370979449186143, + "ip": 71915827, + "last_seen": 0, + "port": 5919 + }, + { + "host": "51.89.73.4", + "id": 17365232549054309219, + "ip": 71915827, + "last_seen": 0, + "port": 6933 + }, + { + "host": "51.89.73.4", + "id": 3921565833700626030, + "ip": 71915827, + "last_seen": 0, + "port": 8660 + }, + { + "host": "51.89.73.4", + "id": 8255539757747097868, + "ip": 71915827, + "last_seen": 0, + "port": 10507 + }, + { + "host": "51.89.73.4", + "id": 10737319983332373391, + "ip": 71915827, + "last_seen": 0, + "port": 11991 + }, + { + "host": "51.89.73.4", + "id": 4385904119107221913, + "ip": 71915827, + "last_seen": 0, + "port": 17530 + }, + { + "host": "51.89.73.4", + "id": 18040899815758783201, + "ip": 71915827, + "last_seen": 0, + "port": 18080 + }, + { + "host": "71.232.84.4", + "id": 6424371053648629406, + "ip": 72673351, + "last_seen": 0, + "port": 18080 + }, + { + "host": "188.93.90.4", + "id": 8435484731493571203, + "ip": 73031100, + "last_seen": 0, + "port": 18080 + }, + { + "host": "96.19.95.4", + "id": 7017675385417923412, + "ip": 73339744, + "last_seen": 0, + "port": 18080 + }, + { + "host": "72.10.155.4", + "id": 17952274650692888281, + "ip": 77269576, + "last_seen": 0, + "port": 18080 + }, + { + "host": "176.9.158.4", + "id": 8420417412697512859, + "ip": 77466032, + "last_seen": 0, + "port": 18080 + }, + { + "host": "168.119.165.4", + "id": 14712302931325676671, + "ip": 77952936, + "last_seen": 0, + "port": 18080, + "pruning_seed": 384, + "rpc_port": 18089 + }, + { + "host": "198.84.175.4", + "id": 13962339296799685662, + "ip": 78599366, + "last_seen": 0, + "port": 18080 + }, + { + "host": "98.156.175.4", + "id": 7707051208013191511, + "ip": 78617698, + "last_seen": 0, + "port": 18080 + }, + { + "host": "72.83.32.5", + "id": 2604036300392747688, + "ip": 86004552, + "last_seen": 0, + "port": 18080 + }, + { + "host": "95.90.56.5", + "id": 16273144514850555096, + "ip": 87579231, + "last_seen": 0, + "port": 18080 + }, + { + "host": "162.218.65.5", + "id": 3691553544300674870, + "ip": 88201890, + "last_seen": 0, + "port": 18480 + }, + { + "host": "91.237.77.5", + "id": 1294026249158639560, + "ip": 88993115, + "last_seen": 0, + "port": 18080 + }, + { + "host": "54.185.86.5", + "id": 15772633170305928027, + "ip": 89569590, + "last_seen": 0, + "port": 18080 + }, + { + "host": "91.233.112.5", + "id": 10969291772500250456, + "ip": 91285851, + "last_seen": 0, + "port": 18080, + "pruning_seed": 391 + }, + { + "host": "82.169.114.5", + "id": 10223489318822779929, + "ip": 91400530, + "last_seen": 0, + "port": 18080 + }, + { + "host": "145.239.118.5", + "id": 17619644515764671408, + "ip": 91680657, + "last_seen": 0, + "port": 3568 + }, + { + "host": "145.239.118.5", + "id": 8035975124447268830, + "ip": 91680657, + "last_seen": 0, + "port": 7741 + }, + { + "host": "145.239.118.5", + "id": 14068269987284124762, + "ip": 91680657, + "last_seen": 0, + "port": 7947 + }, + { + "host": "145.239.118.5", + "id": 15998830447435921789, + "ip": 91680657, + "last_seen": 0, + "port": 8965 + }, + { + "host": "145.239.118.5", + "id": 3209376435980573034, + "ip": 91680657, + "last_seen": 0, + "port": 13725 + }, + { + "host": "145.239.118.5", + "id": 9484230294731029488, + "ip": 91680657, + "last_seen": 0, + "port": 16979 + }, + { + "host": "145.239.118.5", + "id": 1929156493128163303, + "ip": 91680657, + "last_seen": 0, + "port": 17553 + }, + { + "host": "145.239.118.5", + "id": 10525797359361319780, + "ip": 91680657, + "last_seen": 0, + "port": 18080 + }, + { + "host": "104.246.122.5", + "id": 4580042963265457993, + "ip": 91944552, + "last_seen": 0, + "port": 18080 + }, + { + "host": "45.37.132.5", + "id": 17799927848353298631, + "ip": 92546349, + "last_seen": 0, + "port": 18080 + }, + { + "host": "82.64.152.5", + "id": 2758239322907149572, + "ip": 93864018, + "last_seen": 0, + "port": 18080 + }, + { + "host": "1.121.185.5", + "id": 6251389959682595545, + "ip": 96041217, + "last_seen": 0, + "port": 18080 + }, + { + "host": "109.190.247.5", + "id": 17424324455467389594, + "ip": 100122221, + "last_seen": 0, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "159.65.47.6", + "id": 9865192999378690616, + "ip": 103760287, + "last_seen": 0, + "port": 18080, + "pruning_seed": 384, + "rpc_credits_per_hash": 4194304, + "rpc_port": 18081 + }, + { + "host": "189.147.107.6", + "id": 11637249794512542791, + "ip": 107713469, + "last_seen": 0, + "port": 18080 + }, + { + "host": "69.245.184.6", + "id": 2285560786709704553, + "ip": 112784709, + "last_seen": 0, + "port": 18080 + }, + { + "host": "138.201.188.6", + "id": 3649563622049395290, + "ip": 113035658, + "last_seen": 0, + "port": 18080, + "pruning_seed": 389, + "rpc_port": 18089 + }, + { + "host": "198.1.231.6", + "id": 9963056597686882271, + "ip": 115802566, + "last_seen": 0, + "port": 18080 + }, + { + "host": "98.180.234.6", + "id": 8237996517034602690, + "ip": 116044898, + "last_seen": 0, + "port": 18080 + }, + { + "host": "209.222.252.6", + "id": 1956573385574214682, + "ip": 117235409, + "last_seen": 0, + "port": 18080 + }, + { + "host": "66.30.39.7", + "id": 15442028373168763995, + "ip": 120004162, + "last_seen": 0, + "port": 18080 + }, + { + "host": "37.59.49.7", + "id": 2181810494632329287, + "ip": 120666917, + "last_seen": 0, + "port": 18080 + }, + { + "host": "185.141.60.7", + "id": 5684052159513722181, + "ip": 121408953, + "last_seen": 0, + "port": 18080 + }, + { + "host": "80.210.68.7", + "id": 14924413865894980921, + "ip": 121950800, + "last_seen": 0, + "port": 18080 + }, + { + "host": "144.64.98.7", + "id": 6997848277159153590, + "ip": 123879568, + "last_seen": 0, + "port": 18080 + }, + { + "host": "85.71.100.7", + "id": 15426634277696846096, + "ip": 124012373, + "last_seen": 0, + "port": 18080, + "pruning_seed": 387 + } + ], + "status": "OK", + "untrusted": false, + "white_list": [ + { + "host": "204.8.15.5", + "id": 702714784157243868, + "ip": 84871372, + "last_seen": 1613242702, + "port": 18080, + "rpc_credits_per_hash": 4194304, + "rpc_port": 18089 + }, + { + "host": "34.207.231.7", + "id": 17576610543790767531, + "ip": 132632354, + "last_seen": 1613447476, + "port": 18080 + }, + { + "host": "69.254.146.8", + "id": 11786439466745185298, + "ip": 143851077, + "last_seen": 1613241583, + "port": 18080 + }, + { + "host": "99.228.131.10", + "id": 4874421636464239699, + "ip": 176415843, + "last_seen": 1613430148, + "port": 18080 + }, + { + "host": "95.112.189.10", + "id": 3856373419824690374, + "ip": 180187231, + "last_seen": 1613240627, + "port": 18080, + "rpc_credits_per_hash": 4194304, + "rpc_port": 18089 + }, + { + "host": "185.99.254.10", + "id": 6033565310000331122, + "ip": 184443833, + "last_seen": 1613240834, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "138.201.50.11", + "id": 674352636005397733, + "ip": 187877770, + "last_seen": 1613450243, + "port": 18080 + }, + { + "host": "190.57.145.13", + "id": 10073896471956312528, + "ip": 227621310, + "last_seen": 1613447549, + "port": 18080 + }, + { + "host": "73.21.51.14", + "id": 10682243103192931629, + "ip": 238228809, + "last_seen": 1613240622, + "port": 18080 + }, + { + "host": "192.119.163.14", + "id": 16783167488733867571, + "ip": 245594048, + "last_seen": 1613448027, + "port": 18080 + }, + { + "host": "188.60.229.14", + "id": 15742421406596871833, + "ip": 249904316, + "last_seen": 1613448342, + "port": 18080 + }, + { + "host": "31.42.176.17", + "id": 8373547741929614693, + "ip": 296757791, + "last_seen": 1613448907, + "port": 18080 + }, + { + "host": "104.174.159.19", + "id": 16150538636897281169, + "ip": 329231976, + "last_seen": 1613240985, + "port": 18080 + }, + { + "host": "64.98.18.21", + "id": 9882668160519737158, + "ip": 353526336, + "last_seen": 1613448281, + "port": 18090, + "rpc_port": 18091 + }, + { + "host": "82.2.12.23", + "id": 6776743557946045026, + "ip": 386662994, + "last_seen": 1613447492, + "port": 18080 + }, + { + "host": "81.242.91.23", + "id": 6328443453119976296, + "ip": 391901777, + "last_seen": 1613450060, + "port": 18080 + }, + { + "host": "168.119.153.23", + "id": 13196138463765120232, + "ip": 395933608, + "last_seen": 1613450433, + "port": 18080, + "pruning_seed": 387, + "rpc_port": 18089 + }, + { + "host": "71.8.152.24", + "id": 1529608223087065821, + "ip": 412616775, + "last_seen": 1613450983, + "port": 18080 + }, + { + "host": "84.75.176.24", + "id": 8491798925682308581, + "ip": 414206804, + "last_seen": 1613240772, + "port": 18080 + }, + { + "host": "68.38.108.26", + "id": 15038541210303188794, + "ip": 443295300, + "last_seen": 1613447470, + "port": 18080 + }, + { + "host": "71.12.162.26", + "id": 4131752412041479517, + "ip": 446827591, + "last_seen": 1613449640, + "port": 18080 + }, + { + "host": "168.119.137.28", + "id": 7571083266747846762, + "ip": 478771112, + "last_seen": 1613240630, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "152.89.239.29", + "id": 3461503941350972449, + "ip": 502225304, + "last_seen": 1613451289, + "port": 18080, + "pruning_seed": 385 + }, + { + "host": "162.218.65.30", + "id": 13528617371488149457, + "ip": 507632290, + "last_seen": 1613447887, + "port": 18180 + }, + { + "host": "65.30.222.30", + "id": 8941149785562913838, + "ip": 517873217, + "last_seen": 1613451502, + "port": 18080 + }, + { + "host": "1.156.206.31", + "id": 12355497241594030955, + "ip": 533634049, + "last_seen": 1613447504, + "port": 18080 + }, + { + "host": "213.167.240.31", + "id": 11428370191932413440, + "ip": 535865301, + "last_seen": 1613452191, + "port": 18080 + }, + { + "host": "24.95.42.32", + "id": 13789249608496772004, + "ip": 539647768, + "last_seen": 1613449470, + "port": 18080 + }, + { + "host": "168.119.153.32", + "id": 1240195660138316816, + "ip": 546928552, + "last_seen": 1613450575, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "91.122.191.37", + "id": 8293919607955141661, + "ip": 633305691, + "last_seen": 1613242799, + "port": 18080 + }, + { + "host": "24.50.80.38", + "id": 10330305891451644237, + "ip": 642789912, + "last_seen": 1613240630, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "188.65.144.40", + "id": 984603033848759982, + "ip": 680542652, + "last_seen": 1613449667, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "46.30.189.41", + "id": 6437516748989073333, + "ip": 700259886, + "last_seen": 1613447597, + "port": 18080 + }, + { + "host": "144.217.45.44", + "id": 18111436965186519500, + "ip": 741202320, + "last_seen": 1613242793, + "port": 18080 + }, + { + "host": "185.201.47.44", + "id": 14655666381345912175, + "ip": 741329337, + "last_seen": 1613447927, + "port": 18080 + }, + { + "host": "5.189.128.45", + "id": 14850693714528903253, + "ip": 763411717, + "last_seen": 1613452120, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "84.10.166.45", + "id": 2098887166509265575, + "ip": 765856340, + "last_seen": 1613241684, + "port": 18080 + }, + { + "host": "137.74.139.48", + "id": 12964728675020685356, + "ip": 814434953, + "last_seen": 1613242360, + "port": 15071 + }, + { + "host": "13.232.158.49", + "id": 6343978973309379452, + "ip": 832497677, + "last_seen": 1613241727, + "port": 18080 + }, + { + "host": "111.90.146.54", + "id": 16365129653177783722, + "ip": 915561071, + "last_seen": 1613240833, + "port": 18080, + "pruning_seed": 388 + }, + { + "host": "95.67.38.55", + "id": 14346976816874290475, + "ip": 925254495, + "last_seen": 1613451627, + "port": 18080 + }, + { + "host": "162.218.65.57", + "id": 11154383013760642572, + "ip": 960617122, + "last_seen": 1613449094, + "port": 18080 + }, + { + "host": "138.197.166.57", + "id": 969317507401276190, + "ip": 967230858, + "last_seen": 1613449562, + "port": 18080, + "rpc_credits_per_hash": 4194304 + }, + { + "host": "78.46.68.58", + "id": 7092019670486531349, + "ip": 977546830, + "last_seen": 1613449158, + "port": 18080 + }, + { + "host": "95.216.226.62", + "id": 17485488355602682667, + "ip": 1055053919, + "last_seen": 1613450883, + "port": 18080 + }, + { + "host": "71.127.156.63", + "id": 13077359726905710331, + "ip": 1067220807, + "last_seen": 1613242610, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "159.89.152.64", + "id": 10291145910620262416, + "ip": 1083726239, + "last_seen": 1613430220, + "port": 18080, + "pruning_seed": 387 + }, + { + "host": "99.253.64.66", + "id": 6769709363817370577, + "ip": 1111555427, + "last_seen": 1613241787, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "95.85.162.67", + "id": 16962819222156201983, + "ip": 1134712159, + "last_seen": 1613240984, + "port": 18080, + "pruning_seed": 390 + }, + { + "host": "71.112.172.67", + "id": 14850180451207590376, + "ip": 1135374407, + "last_seen": 1613451382, + "port": 18080 + }, + { + "host": "54.39.75.68", + "id": 11247361776454690909, + "ip": 1145775926, + "last_seen": 1613447345, + "port": 10087 + }, + { + "host": "61.163.99.68", + "id": 924560308851824241, + "ip": 1147380541, + "last_seen": 1613240623, + "port": 18080 + }, + { + "host": "85.25.137.68", + "id": 6095536848075231153, + "ip": 1149835605, + "last_seen": 1613240631, + "port": 18080 + }, + { + "host": "116.202.23.69", + "id": 9270414103369259671, + "ip": 1159187060, + "last_seen": 1613242496, + "port": 18080, + "pruning_seed": 384, + "rpc_port": 18089 + }, + { + "host": "51.38.73.70", + "id": 2859662491960564153, + "ip": 1179199027, + "last_seen": 1613430147, + "port": 18080, + "pruning_seed": 390, + "rpc_credits_per_hash": 1677721, + "rpc_port": 18081 + }, + { + "host": "217.182.9.71", + "id": 13311748284279299118, + "ip": 1191818969, + "last_seen": 1613447596, + "port": 3486 + }, + { + "host": "2.223.13.71", + "id": 7385357264965734494, + "ip": 1192091394, + "last_seen": 1613241987, + "port": 18080 + }, + { + "host": "54.39.75.71", + "id": 17741870341485029397, + "ip": 1196107574, + "last_seen": 1613451810, + "port": 2917 + }, + { + "host": "165.227.16.73", + "id": 1102403625267302959, + "ip": 1225843621, + "last_seen": 1613242422, + "port": 18080, + "pruning_seed": 391 + }, + { + "host": "46.188.42.77", + "id": 6446709855309617591, + "ip": 1294646318, + "last_seen": 1613447821, + "port": 18080 + }, + { + "host": "138.68.41.79", + "id": 6207900743235198445, + "ip": 1328104586, + "last_seen": 1613241887, + "port": 18080, + "pruning_seed": 384, + "rpc_port": 18089 + }, + { + "host": "31.220.41.79", + "id": 13409420690672321286, + "ip": 1328143391, + "last_seen": 1613447555, + "port": 18080, + "pruning_seed": 385 + }, + { + "host": "24.194.226.81", + "id": 2454042385056560755, + "ip": 1373815320, + "last_seen": 1613451596, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "141.41.2.82", + "id": 12492384517623608219, + "ip": 1375873421, + "last_seen": 1613451078, + "port": 18080 + }, + { + "host": "135.181.96.84", + "id": 13076796128763940731, + "ip": 1415624071, + "last_seen": 1613450372, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "207.161.128.84", + "id": 9115517680526755431, + "ip": 1417716175, + "last_seen": 1613240629, + "port": 18080 + }, + { + "host": "172.105.190.84", + "id": 3528665117244823058, + "ip": 1421765036, + "last_seen": 1613240628, + "port": 18080 + }, + { + "host": "178.41.241.84", + "id": 14788856420145383023, + "ip": 1425090994, + "last_seen": 1613243009, + "port": 18080 + }, + { + "host": "97.67.245.85", + "id": 14872488311255429665, + "ip": 1442136929, + "last_seen": 1613452096, + "port": 18080 + }, + { + "host": "5.55.56.87", + "id": 2731564659794522082, + "ip": 1463301893, + "last_seen": 1613241910, + "port": 18080 + }, + { + "host": "45.83.91.90", + "id": 656461484336296590, + "ip": 1515934509, + "last_seen": 1613451791, + "port": 18080 + }, + { + "host": "51.79.117.94", + "id": 13450169868520063693, + "ip": 1584746291, + "last_seen": 1613449622, + "port": 3035 + }, + { + "host": "51.89.181.96", + "id": 2071579311351148635, + "ip": 1622497587, + "last_seen": 1613449869, + "port": 5200 + }, + { + "host": "51.79.117.99", + "id": 10793318369577534021, + "ip": 1668632371, + "last_seen": 1613448403, + "port": 7778 + }, + { + "host": "5.135.245.101", + "id": 6098780872480982845, + "ip": 1710589701, + "last_seen": 1613447342, + "port": 4923 + }, + { + "host": "51.83.124.103", + "id": 14499553305347269493, + "ip": 1736201011, + "last_seen": 1613242207, + "port": 8358 + }, + { + "host": "100.1.202.106", + "id": 11258041955256709498, + "ip": 1791623524, + "last_seen": 1613430154, + "port": 18080 + }, + { + "host": "162.218.65.107", + "id": 1415501532984455022, + "ip": 1799477922, + "last_seen": 1613448216, + "port": 18080 + }, + { + "host": "147.175.187.111", + "id": 14982231565617578436, + "ip": 1874571155, + "last_seen": 1613447548, + "port": 18080 + }, + { + "host": "128.204.192.111", + "id": 13020455015080487060, + "ip": 1874906240, + "last_seen": 1613450472, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "94.155.25.117", + "id": 12160961025814705088, + "ip": 1964612446, + "last_seen": 1613242732, + "port": 18080 + }, + { + "host": "146.59.156.117", + "id": 1337478681562147935, + "ip": 1973173138, + "last_seen": 1613452180, + "port": 9899 + }, + { + "host": "168.119.64.118", + "id": 8240841038371178451, + "ip": 1983936424, + "last_seen": 1613430124, + "port": 18080 + }, + { + "host": "69.166.233.118", + "id": 10336758610260013358, + "ip": 1995023941, + "last_seen": 1613241404, + "port": 18080, + "pruning_seed": 391 + }, + { + "host": "54.38.217.119", + "id": 5751274044419257437, + "ip": 2010719798, + "last_seen": 1613450494, + "port": 17858 + }, + { + "host": "51.195.4.120", + "id": 6735168648570032090, + "ip": 2013578035, + "last_seen": 1613240898, + "port": 18080 + }, + { + "host": "13.57.26.120", + "id": 13332028673050504134, + "ip": 2014984461, + "last_seen": 1613449975, + "port": 18080 + }, + { + "host": "73.25.51.124", + "id": 4539668698720068656, + "ip": 2083723593, + "last_seen": 1613447490, + "port": 18080 + }, + { + "host": "99.242.226.125", + "id": 10069789350141613683, + "ip": 2112025187, + "last_seen": 1613242301, + "port": 18080 + }, + { + "host": "95.216.13.126", + "id": 10189340314122712836, + "ip": 2114836575, + "last_seen": 1613448435, + "port": 18080 + }, + { + "host": "24.246.203.126", + "id": 10237152803735815762, + "ip": 2127296024, + "last_seen": 1613450781, + "port": 18080 + }, + { + "host": "163.172.160.127", + "id": 10255256945094888580, + "ip": 2141236387, + "last_seen": 1613449466, + "port": 18080 + }, + { + "host": "107.13.140.129", + "id": 7253915447346753192, + "ip": 2173439339, + "last_seen": 1613450678, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "178.191.251.132", + "id": 2693330727735381003, + "ip": 2231091122, + "last_seen": 1613447600, + "port": 18080 + }, + { + "host": "81.227.102.133", + "id": 15432851871566410604, + "ip": 2238112593, + "last_seen": 1613240959, + "port": 18080 + }, + { + "host": "185.152.65.135", + "id": 16207503225671027711, + "ip": 2269223097, + "last_seen": 1613451685, + "port": 18080 + }, + { + "host": "37.110.152.135", + "id": 12383433287277217854, + "ip": 2274913829, + "last_seen": 1613241352, + "port": 18080 + }, + { + "host": "68.200.255.139", + "id": 10967523544254491977, + "ip": 2348795972, + "last_seen": 1613451993, + "port": 18080 + }, + { + "host": "151.80.17.140", + "id": 1635000610204590138, + "ip": 2349944983, + "last_seen": 1613430154, + "port": 16942 + }, + { + "host": "147.229.188.143", + "id": 2347181902913052789, + "ip": 2411521427, + "last_seen": 1613451198, + "port": 18080 + }, + { + "host": "80.241.217.144", + "id": 1947944318474853435, + "ip": 2430202192, + "last_seen": 1613241413, + "port": 18080, + "rpc_credits_per_hash": 1677721, + "rpc_port": 18081 + }, + { + "host": "8.48.74.146", + "id": 14610893634104705921, + "ip": 2454335496, + "last_seen": 1613242597, + "port": 18080 + }, + { + "host": "72.143.34.150", + "id": 10525613679623743377, + "ip": 2518847304, + "last_seen": 1613242854, + "port": 18080 + }, + { + "host": "51.91.33.151", + "id": 14776230520218615686, + "ip": 2535545651, + "last_seen": 1613447344, + "port": 13496 + }, + { + "host": "135.181.96.159", + "id": 1351656325623764810, + "ip": 2673915271, + "last_seen": 1613240622, + "port": 18080, + "pruning_seed": 391, + "rpc_port": 18089 + }, + { + "host": "51.68.222.162", + "id": 5102159030145116943, + "ip": 2732475443, + "last_seen": 1613451749, + "port": 16399 + }, + { + "host": "91.121.140.167", + "id": 7889626864724427973, + "ip": 2811001179, + "last_seen": 1613242915, + "port": 18080 + }, + { + "host": "24.51.193.168", + "id": 8320931696855770973, + "ip": 2831233816, + "last_seen": 1613447546, + "port": 18080 + }, + { + "host": "51.89.208.175", + "id": 3025072809131482940, + "ip": 2949667123, + "last_seen": 1613451374, + "port": 4996 + }, + { + "host": "51.89.134.178", + "id": 13523084732664001765, + "ip": 2995149107, + "last_seen": 1613451931, + "port": 16210 + }, + { + "host": "88.99.83.181", + "id": 3857727057417267756, + "ip": 3042141016, + "last_seen": 1613430124, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "190.80.96.183", + "id": 16999522279283098933, + "ip": 3076542654, + "last_seen": 1613241484, + "port": 18080 + }, + { + "host": "94.23.163.184", + "id": 14094180366712930468, + "ip": 3097696094, + "last_seen": 1613450681, + "port": 10508 + }, + { + "host": "187.188.125.185", + "id": 16541005504686530857, + "ip": 3112025275, + "last_seen": 1613451122, + "port": 18080 + }, + { + "host": "46.30.188.187", + "id": 15391900406271002022, + "ip": 3149667886, + "last_seen": 1613241152, + "port": 18080, + "pruning_seed": 384, + "rpc_port": 18081 + }, + { + "host": "37.115.136.189", + "id": 7765454290699096668, + "ip": 3179836197, + "last_seen": 1613447413, + "port": 18080 + }, + { + "host": "195.201.41.190", + "id": 8688817813316422541, + "ip": 3190409667, + "last_seen": 1613242088, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "73.68.46.192", + "id": 940249697764363690, + "ip": 3224257609, + "last_seen": 1613449346, + "port": 18080 + }, + { + "host": "193.116.227.195", + "id": 9171235046477127861, + "ip": 3286463681, + "last_seen": 1613449640, + "port": 18080 + }, + { + "host": "72.218.79.199", + "id": 8263602118277666501, + "ip": 3343899208, + "last_seen": 1613430131, + "port": 18080, + "rpc_port": 18081 + }, + { + "host": "85.241.106.203", + "id": 1749624933425199888, + "ip": 3412783445, + "last_seen": 1613430184, + "port": 18080 + }, + { + "host": "188.165.17.204", + "id": 1052817436779540307, + "ip": 3423708604, + "last_seen": 1613447356, + "port": 7883 + }, + { + "host": "78.45.128.205", + "id": 1606962014925804835, + "ip": 3447729486, + "last_seen": 1613241474, + "port": 18080, + "pruning_seed": 390 + }, + { + "host": "24.196.233.205", + "id": 15232609442832440729, + "ip": 3454649368, + "last_seen": 1613452073, + "port": 18080 + }, + { + "host": "83.135.207.207", + "id": 4129625647251703830, + "ip": 3486484307, + "last_seen": 1613242671, + "port": 18080, + "pruning_seed": 389, + "rpc_port": 18089 + }, + { + "host": "3.133.160.212", + "id": 15692192473268519652, + "ip": 3567289603, + "last_seen": 1613240984, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "163.172.220.214", + "id": 9649039092980725871, + "ip": 3604786339, + "last_seen": 1613448845, + "port": 18080 + }, + { + "host": "73.187.218.215", + "id": 17372153602940124719, + "ip": 3621436233, + "last_seen": 1613241848, + "port": 18080 + }, + { + "host": "90.3.96.217", + "id": 12422910629634237057, + "ip": 3646948186, + "last_seen": 1613451192, + "port": 18080 + }, + { + "host": "164.52.207.218", + "id": 3970442795202540206, + "ip": 3671012516, + "last_seen": 1613449461, + "port": 18080, + "pruning_seed": 389 + }, + { + "host": "69.113.13.219", + "id": 10926180788604103588, + "ip": 3675091269, + "last_seen": 1613242373, + "port": 18080 + }, + { + "host": "71.238.62.219", + "id": 12209213013746919968, + "ip": 3678334535, + "last_seen": 1613240622, + "port": 18080 + }, + { + "host": "51.77.202.219", + "id": 11460577518864080949, + "ip": 3687468339, + "last_seen": 1613449765, + "port": 11965 + }, + { + "host": "104.131.1.221", + "id": 12300411971572237799, + "ip": 3707863912, + "last_seen": 1613241091, + "port": 18080 + }, + { + "host": "82.113.14.222", + "id": 11764943469208849424, + "ip": 3725488466, + "last_seen": 1613447541, + "port": 18080 + }, + { + "host": "82.65.73.222", + "id": 17774799257053602057, + "ip": 3729342802, + "last_seen": 1613447809, + "port": 18080 + }, + { + "host": "142.47.98.223", + "id": 4054033254884999828, + "ip": 3747753870, + "last_seen": 1613449869, + "port": 18080 + }, + { + "host": "95.105.236.223", + "id": 11578329787273911876, + "ip": 3756812639, + "last_seen": 1613242914, + "port": 18080 + }, + { + "host": "198.13.87.226", + "id": 943624800109587430, + "ip": 3797355974, + "last_seen": 1613241787, + "port": 18080 + }, + { + "host": "51.79.52.228", + "id": 1111178157158752856, + "ip": 3828633395, + "last_seen": 1613451435, + "port": 9822 + }, + { + "host": "112.215.205.229", + "id": 3089055665329959664, + "ip": 3855472496, + "last_seen": 1613242511, + "port": 18080 + }, + { + "host": "24.132.75.232", + "id": 3354881656070564433, + "ip": 3897263128, + "last_seen": 1613447867, + "port": 18080, + "pruning_seed": 391 + }, + { + "host": "71.206.53.233", + "id": 10191502320879193454, + "ip": 3912617543, + "last_seen": 1613447909, + "port": 18080 + }, + { + "host": "37.59.165.233", + "id": 7739866342510712302, + "ip": 3919919909, + "last_seen": 1613451688, + "port": 15887 + }, + { + "host": "24.203.215.233", + "id": 1721075545767143435, + "ip": 3923233560, + "last_seen": 1613451887, + "port": 18080 + }, + { + "host": "149.22.29.236", + "id": 14651851102263075285, + "ip": 3961329301, + "last_seen": 1613240631, + "port": 18080 + }, + { + "host": "24.203.81.236", + "id": 12276071933928645108, + "ip": 3964783384, + "last_seen": 1613448120, + "port": 18080, + "pruning_seed": 386 + }, + { + "host": "70.27.234.236", + "id": 9975573268986649338, + "ip": 3974765382, + "last_seen": 1613447596, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "185.193.91.238", + "id": 13851066677650089627, + "ip": 3998990777, + "last_seen": 1613450172, + "port": 18080 + }, + { + "host": "159.65.105.238", + "id": 1986139233631008308, + "ip": 3999875487, + "last_seen": 1613447477, + "port": 18080 + }, + { + "host": "5.206.224.239", + "id": 7375245031235838836, + "ip": 4024487429, + "last_seen": 1613450068, + "port": 18080 + }, + { + "host": "46.138.243.239", + "id": 17564524474675002001, + "ip": 4025715246, + "last_seen": 1613447555, + "port": 18080 + }, + { + "host": "173.49.254.239", + "id": 14658257397614101091, + "ip": 4026413485, + "last_seen": 1613430131, + "port": 18080 + }, + { + "host": "91.134.195.240", + "id": 3163530904392766873, + "ip": 4039345755, + "last_seen": 1613451995, + "port": 2337 + }, + { + "host": "136.144.207.246", + "id": 17925065275846910101, + "ip": 4140798088, + "last_seen": 1613240631, + "port": 18080 + }, + { + "host": "23.114.121.249", + "id": 13060187931869259976, + "ip": 4185485847, + "last_seen": 1613448849, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "83.4.67.250", + "id": 2507603966234399791, + "ip": 4198696019, + "last_seen": 1613241694, + "port": 18080 + }, + { + "host": "88.117.26.253", + "id": 2368851820030451111, + "ip": 4246369624, + "last_seen": 1613450273, + "port": 18080 + }, + { + "host": "::ffff:51.75.70.225", + "id": 5163614178872270770, + "ip": 0, + "last_seen": 1613449930, + "port": 18080 + }, + { + "host": "::ffff:51.75.162.171", + "id": 3838435608909703312, + "ip": 0, + "last_seen": 1613448590, + "port": 9647 + }, + { + "host": "::ffff:51.79.58.89", + "id": 16329099156091928758, + "ip": 0, + "last_seen": 1613449031, + "port": 8698 + }, + { + "host": "::ffff:51.79.58.90", + "id": 15087651663481200576, + "ip": 0, + "last_seen": 1613449808, + "port": 13309 + }, + { + "host": "::ffff:51.79.58.93", + "id": 1090659574787086581, + "ip": 0, + "last_seen": 1613448087, + "port": 16670 + }, + { + "host": "::ffff:51.83.81.237", + "id": 14613540196062283566, + "ip": 0, + "last_seen": 1613451253, + "port": 4668 + }, + { + "host": "::ffff:51.91.108.121", + "id": 9332318050864883297, + "ip": 0, + "last_seen": 1613450369, + "port": 8462 + }, + { + "host": "::ffff:54.39.75.66", + "id": 9318336026330522689, + "ip": 0, + "last_seen": 1613450554, + "port": 7154 + }, + { + "host": "::ffff:87.98.224.123", + "id": 14414546963382727355, + "ip": 0, + "last_seen": 1613449284, + "port": 9560 + }, + { + "host": "::ffff:91.138.184.109", + "id": 7457032633205804157, + "ip": 0, + "last_seen": 1613242421, + "port": 18080, + "rpc_port": 18089 + }, + { + "host": "::ffff:110.235.245.163", + "id": 15557939585881092538, + "ip": 0, + "last_seen": 1613447401, + "port": 18080 + }, + { + "host": "::ffff:144.217.248.48", + "id": 16235213177951332528, + "ip": 0, + "last_seen": 1613450742, + "port": 4683 + }, + { + "host": "::ffff:192.99.154.164", + "id": 18071351769521377372, + "ip": 0, + "last_seen": 1613448151, + "port": 12249 + } + ] +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_transaction_pool.json b/tests/data/test_jsonrpcdaemon/test_get_transaction_pool.json new file mode 100644 index 0000000..cc81e4b --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_transaction_pool.json @@ -0,0 +1,376 @@ +{ + "credits": 0, + "spent_key_images": [ + { + "id_hash": "1ccff101d8ee93903bde0a8ef99ebc99ccd5150f7157b93b758cd456458d4166", + "txs_hashes": [ + "73fe0207e25d59dce5cd6f7369edf33a04ac56409eca3b28ad837c43640ef83f" + ] + }, + { + "id_hash": "eeece7af45927e3d1303df44d2b107b266edecdb2df8ed76feb670f6f1898d7d", + "txs_hashes": [ + "69bd9be7a43b0bb909ab92182d7a90b970a95656c08cedb05273a8ece0e58d2f" + ] + }, + { + "id_hash": "4bca762c4760962c6c1216cf3d8c21ee980dd999a91cf2c93486fc51fb8687aa", + "txs_hashes": [ + "6085c265496d3fdacff0fa173328c8b0ff97cae60b95033c74388f0ee59e79ab" + ] + }, + { + "id_hash": "fb2d1f9398de6b12c462d48fa559cf9cccb5e21f7c1fc55cc38b6ccf4bad5fd5", + "txs_hashes": [ + "6085c265496d3fdacff0fa173328c8b0ff97cae60b95033c74388f0ee59e79ab" + ] + }, + { + "id_hash": "4dd37bf9590afe0e7086f8824c734738d0dd6a0267ddda25a1c68e6d0c37f245", + "txs_hashes": [ + "630f47da19e94398a983d07e31d46bc90467c53ae0755132807c44c29e765a82" + ] + }, + { + "id_hash": "b8f2e25d853d4d157be9cdaa9140cc44e6e7764daae1e0986935f303eb3b08e0", + "txs_hashes": [ + "502972204a8a5d3f3e593aee64a0baa8c9dc6b64876a6ed0de6db6da040870e9" + ] + }, + { + "id_hash": "fa571d3ef591465305fbe868c0a4a367b0d071fd593e7bd333a38a0b3902c3a8", + "txs_hashes": [ + "7908c526b90fc3608603d6987b96f149cc9189f3fe482348ebbbbf1c8efc47d0" + ] + }, + { + "id_hash": "7a1cad147be3baa06c785162d0fdbf1ddb540728de0ba6ba218e90c0ee756e99", + "txs_hashes": [ + "23ba4986b2a7207d326793ecfbc63eece447c104d395c08867cc850254b055f1" + ] + }, + { + "id_hash": "7d2c7eb8ca44eab409582cc15a23fab28441b89177cde8344dca79ae5f28e8f4", + "txs_hashes": [ + "23ba4986b2a7207d326793ecfbc63eece447c104d395c08867cc850254b055f1" + ] + }, + { + "id_hash": "d038844f889e8f8898ae47c6854859b0ff39a00f2fb5f31cd17d481d4cfce7be", + "txs_hashes": [ + "ea020cf2595c017d5fd4d0d427b8ff02b1857e996136b041c0f7fd6dffc4c72c" + ] + }, + { + "id_hash": "6083c22b7fc33acfa366f546f9ff7474bffaa874901c7344cc6440a06815e2ed", + "txs_hashes": [ + "5cdb533084065846b9a13fccf5fc20aa3e2bf1f71b6f0f1bd2be4570fdd38de4" + ] + }, + { + "id_hash": "bc531bb15f56d4c69d23d654f2cf9fec92bc87c418d35750b562c27c24629715", + "txs_hashes": [ + "0f041badd781cdee7ad17e158f0c435e507050c2df7a5468a3788c683a4ae783" + ] + }, + { + "id_hash": "ce07c7f3d2da0543d1404a16f3d176fba9c52024c899f1be26da9f87690d3798", + "txs_hashes": [ + "e5c1d055d3722665e6d447cee5886614189d7b584808b9f18b78722ad6be5134" + ] + }, + { + "id_hash": "e2b05e1154345e9b743287ee00287083aba5e05af38ffdaa3d568f78bbfee3f9", + "txs_hashes": [ + "e5c1d055d3722665e6d447cee5886614189d7b584808b9f18b78722ad6be5134" + ] + }, + { + "id_hash": "61526ea9cf2f016bb789735cae0aff12c98c8837e05f61da17b00f8f2ceffb57", + "txs_hashes": [ + "42b2e64110cb45bf8bb15c6c20f0b99477461596682e9248ce34649f92bfef6d" + ] + }, + { + "id_hash": "f34aeb91f15a8ad1245f708c40d9430ca3181a2bc4da74bc9229a0a7a6dde14f", + "txs_hashes": [ + "42b2e64110cb45bf8bb15c6c20f0b99477461596682e9248ce34649f92bfef6d" + ] + }, + { + "id_hash": "4910ad8f11fa55ab7dc9a9052c21449910eee1a3c7a6fce3a73368b3bde12f31", + "txs_hashes": [ + "2fd471d9650de3678f0c1e84c322d842297ec68c42295cf8f8df60704a162cbe" + ] + }, + { + "id_hash": "84f997eb51076c34eb0ce0e9c8f83940089cebf3480b24a82afd2d91566936f1", + "txs_hashes": [ + "2fd471d9650de3678f0c1e84c322d842297ec68c42295cf8f8df60704a162cbe" + ] + }, + { + "id_hash": "42484d6705b08d511b22671312cfea561d18f9e0ed541cd75b6cdb70e3ab0264", + "txs_hashes": [ + "50e131ed02633f4eddffafe51e10fdec3f759d6e01f7163b76afa3bce5096260" + ] + } + ], + "status": "OK", + "top_hash": "", + "transactions": [ + { + "blob_size": 1455, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 20500000, + "id_hash": "ea020cf2595c017d5fd4d0d427b8ff02b1857e996136b041c0f7fd6dffc4c72c", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865211, + "max_used_block_height": 2301289, + "max_used_block_id_hash": "2b4b00522904bfbf65b8e141650a981d7e599995c02922bcdc25f72c9c97517a", + "receive_time": 1613865211, + "relayed": true, + "tx_blob": "02000102000b81e6e80cc09c02eda5138ccf08d0ff03b5bf02b0f501a79901a30f8351ac18d038844f889e8f8898ae47c6854859b0ff39a00f2fb5f31cd17d481d4cfce7be020002d82c9ba32172e84f3dcbd334246eef99d15ee9693cad9cf5e98349c587b659200002803921e2d4be0df9625cb30bd678a71712ee0daa4181a2f41747a1edfff573e52c0113b4890974f3e4a3896f901c049c99e199dc7a6847a54649fc66540f85576cf502090121cd9cff2a9fbe4405a09ce309181b351c7ab6f724e4822c3b6f548af1ef37527efdb3a976d0230b2232d57a1dde187b200af50db983aae6143e1e34e93429da57b376bd25c2c3ebabf08f9395ab78d02cad4c2e6aa4f8920fcd2e3efd013514a44d7307ae3d0d2d0170557d83e71e6d392f9441d3930396380f6f696d5cb11b4b64e7a379ca8fce7c3c78d01864fe10e2788dc33842469187a6848c61b53842549eb64a1c85237b0514151fe9dc0ddad28b89fafdf06a9cb8f4b0011d023e31bd00b9862a784e23ad4dd5ac49b09e583629b72ba0c3d3cf2b4ca15e15f8b4f6fb56adecf74c5569fa0a4741dcaad3d8d6660de69e25a0894a4ee602130b22a165221a3925ff41258c83665a3ebb74fdeb6bb130a6007745987853245c0007ea3f27a904f5e63fcb4c6cbc26d97d5d6caf52f1f6fa68010c40050fa7d940fa7e6c17d02b7a4763720597f46eece6ce7962698c1ff843cf6b48bd9ffbe916e4967d931da85986a940f15acc46969ab8a2969adcf00a0dfb08fd5f377f2720e93859c1b9018d5bd6d3f3e1b07e6c581e67a24d5a46ec901ae65d46ea069bb3c97e1a699005056c47845df5a1eaa32bba9e7cd528ada61e27c2bd3179ce3cfba41ef4da51ba1452342488c8e5f76eca5cf5ac5bf75f2cb9c4a8542bb02329c5a1a61d20fe8a67505807de48bfac48611b5861229880a758c96a1c22062a2c6cee07320b1aa58b0fce5e0b20341b545d26b01ec3598da9eac512dcf4c55be1c0e79f20cc904656fc1431db3e150f61d30f4306a38735be79155e1e9f7d31da7e23edb93580c215fbe5d86e34f763c646110e72a4ab35d8456026c2472d50affdeecac732873f3b58d4f0a1e807867c010d87acfd5f0940ed47b76f1eac7f1cfbe5ebd81282464d223ca057364cc48c950f3bd08fb2220ab2ccf395273d687efe480ee7243cc5be9176466db47baff92972b54ad954413e1119dd5db783deb724e3f9995e3ced26a904cbb23dadf77da2af7f51b60c9dc4dc0ca4456e93dc7ed302d55e3b51d2d75871130fdc31f311adcc75ee1a9d0bc22df61714cc21d1ad47b402dff0715d26efe6d1ff7315c84442c3aa4c314b6d4f4d8274033f1b0af4da810ad46207aa8a1ac81f1035a710a30445998a0b5c2346d90c30d08f0d4965bf9f089273c8baabdf7d730df9b0097afdb4128f5e48856342f7c2009cdf3d43650b0a339feac9b64858ee7a244e6d599e118de01f6cb1e1d629dc34ebbaf42af7cd060cd856ec617cb338f1034eae699e6bb0aa0a9c95191dcd63526ce73fbf29a50c774bed0fd5c4afc107f71dcf7746ed0976cd00d936ebf8cd30c457e1802c300f7c5a3e0bc8ee83df501def8682db4bf865c3559e9d131a3b87e26c09437c8b0503fc7f64291ce7103261976b9ab9d398911e3de7c6fa3f57c722381968f8d40a4876719950ab578b58bd929de736b90790da27ade1a0fea7c7cc264933b5d609638a6f40694bf7d5eeb3d33c8cd848f2a4e0c3757ee4da090b1f4187c275c2021f7a5f5da418569ea81c6c9e202c58824444873b779ed6a5c0991e3eb09676000bf7628428a6273ebac88d78803a3ba7baede70c73efcf7ff9627e78cc79a40d27440ed2ce32ed39f72ed38922ba573450d74f61422b75cd2c67963a3c0d4006cbe1be4daf04139b4a1ecfd2c23946a82f6fd85c6c95c7158ea79114cb656f09fb63497034da0fc4ed7863471405740cd508701b4a5a135a106480af1f7130e81b3934eef132428051af62e7ad49783aff23cd0cac7c25dcdd0ae1b5f2651614", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26882817, 36416, 316141, 141196, 65488, 40885, 31408, 19623, 1955, 10371, 3116\n ], \n \"k_image\": \"d038844f889e8f8898ae47c6854859b0ff39a00f2fb5f31cd17d481d4cfce7be\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"d82c9ba32172e84f3dcbd334246eef99d15ee9693cad9cf5e98349c587b65920\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"803921e2d4be0df9625cb30bd678a71712ee0daa4181a2f41747a1edfff573e5\"\n }\n }\n ], \n \"extra\": [ 1, 19, 180, 137, 9, 116, 243, 228, 163, 137, 111, 144, 28, 4, 156, 153, 225, 153, 220, 122, 104, 71, 165, 70, 73, 252, 102, 84, 15, 133, 87, 108, 245, 2, 9, 1, 33, 205, 156, 255, 42, 159, 190, 68\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 20500000, \n \"ecdhInfo\": [ {\n \"amount\": \"181b351c7ab6f724\"\n }, {\n \"amount\": \"e4822c3b6f548af1\"\n }], \n \"outPk\": [ \"ef37527efdb3a976d0230b2232d57a1dde187b200af50db983aae6143e1e34e9\", \"3429da57b376bd25c2c3ebabf08f9395ab78d02cad4c2e6aa4f8920fcd2e3efd\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"3514a44d7307ae3d0d2d0170557d83e71e6d392f9441d3930396380f6f696d5c\", \n \"S\": \"b11b4b64e7a379ca8fce7c3c78d01864fe10e2788dc33842469187a6848c61b5\", \n \"T1\": \"3842549eb64a1c85237b0514151fe9dc0ddad28b89fafdf06a9cb8f4b0011d02\", \n \"T2\": \"3e31bd00b9862a784e23ad4dd5ac49b09e583629b72ba0c3d3cf2b4ca15e15f8\", \n \"taux\": \"b4f6fb56adecf74c5569fa0a4741dcaad3d8d6660de69e25a0894a4ee602130b\", \n \"mu\": \"22a165221a3925ff41258c83665a3ebb74fdeb6bb130a6007745987853245c00\", \n \"L\": [ \"ea3f27a904f5e63fcb4c6cbc26d97d5d6caf52f1f6fa68010c40050fa7d940fa\", \"7e6c17d02b7a4763720597f46eece6ce7962698c1ff843cf6b48bd9ffbe916e4\", \"967d931da85986a940f15acc46969ab8a2969adcf00a0dfb08fd5f377f2720e9\", \"3859c1b9018d5bd6d3f3e1b07e6c581e67a24d5a46ec901ae65d46ea069bb3c9\", \"7e1a699005056c47845df5a1eaa32bba9e7cd528ada61e27c2bd3179ce3cfba4\", \"1ef4da51ba1452342488c8e5f76eca5cf5ac5bf75f2cb9c4a8542bb02329c5a1\", \"a61d20fe8a67505807de48bfac48611b5861229880a758c96a1c22062a2c6cee\"\n ], \n \"R\": [ \"320b1aa58b0fce5e0b20341b545d26b01ec3598da9eac512dcf4c55be1c0e79f\", \"20cc904656fc1431db3e150f61d30f4306a38735be79155e1e9f7d31da7e23ed\", \"b93580c215fbe5d86e34f763c646110e72a4ab35d8456026c2472d50affdeeca\", \"c732873f3b58d4f0a1e807867c010d87acfd5f0940ed47b76f1eac7f1cfbe5eb\", \"d81282464d223ca057364cc48c950f3bd08fb2220ab2ccf395273d687efe480e\", \"e7243cc5be9176466db47baff92972b54ad954413e1119dd5db783deb724e3f9\", \"995e3ced26a904cbb23dadf77da2af7f51b60c9dc4dc0ca4456e93dc7ed302d5\"\n ], \n \"a\": \"5e3b51d2d75871130fdc31f311adcc75ee1a9d0bc22df61714cc21d1ad47b402\", \n \"b\": \"dff0715d26efe6d1ff7315c84442c3aa4c314b6d4f4d8274033f1b0af4da810a\", \n \"t\": \"d46207aa8a1ac81f1035a710a30445998a0b5c2346d90c30d08f0d4965bf9f08\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"9273c8baabdf7d730df9b0097afdb4128f5e48856342f7c2009cdf3d43650b0a\", \"339feac9b64858ee7a244e6d599e118de01f6cb1e1d629dc34ebbaf42af7cd06\", \"0cd856ec617cb338f1034eae699e6bb0aa0a9c95191dcd63526ce73fbf29a50c\", \"774bed0fd5c4afc107f71dcf7746ed0976cd00d936ebf8cd30c457e1802c300f\", \"7c5a3e0bc8ee83df501def8682db4bf865c3559e9d131a3b87e26c09437c8b05\", \"03fc7f64291ce7103261976b9ab9d398911e3de7c6fa3f57c722381968f8d40a\", \"4876719950ab578b58bd929de736b90790da27ade1a0fea7c7cc264933b5d609\", \"638a6f40694bf7d5eeb3d33c8cd848f2a4e0c3757ee4da090b1f4187c275c202\", \"1f7a5f5da418569ea81c6c9e202c58824444873b779ed6a5c0991e3eb0967600\", \"0bf7628428a6273ebac88d78803a3ba7baede70c73efcf7ff9627e78cc79a40d\", \"27440ed2ce32ed39f72ed38922ba573450d74f61422b75cd2c67963a3c0d4006\"], \n \"c1\": \"cbe1be4daf04139b4a1ecfd2c23946a82f6fd85c6c95c7158ea79114cb656f09\", \n \"D\": \"fb63497034da0fc4ed7863471405740cd508701b4a5a135a106480af1f7130e8\"\n }], \n \"pseudoOuts\": [ \"1b3934eef132428051af62e7ad49783aff23cd0cac7c25dcdd0ae1b5f2651614\"]\n }\n}", + "weight": 1455 + }, + { + "blob_size": 1459, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 11170000, + "id_hash": "69bd9be7a43b0bb909ab92182d7a90b970a95656c08cedb05273a8ece0e58d2f", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865233, + "max_used_block_height": 2301243, + "max_used_block_id_hash": "b80460ad487ce37778148582d20b3b5f550167cd1790a37d1188912601cca886", + "receive_time": 1613865233, + "relayed": true, + "tx_blob": "02000102000bcd96a509fdf4a101f48c7390dd53a1ed6cd9df08e3b706eaa501f3ac03a08b01b1cf01eeece7af45927e3d1303df44d2b107b266edecdb2df8ed76feb670f6f1898d7d0200026d6183467ca7e81a0501465e1104d2f1597d73681d3c1535b73e6a5ff0ec187e0002fd11017503040c0899c1b1a216a7e1d7027635bb490a41b157aed67b2bd957522c01b62cd745e3ca31d3e1af1a15eda297ae1bc4cd55339b10b5fb0f59b1c74000d70209015c1594787fdad3f405d0e1a9053e5c63da5a0e1279a8b60af5cd03c11f204f1e2290333e4d3eb480c0014cb7c2026e79505ff89d9e943436af0bef3ff3a554ef96defe64484a6e1b997332814df750068858165c2b63c424ae3b4128d601950b60f83b80ad3a578a24f4bf83ff737d826ef7f0a9a27e66af95fa6cbc48b8a184b88cab2f452ec64b8694f56ec469baada11acec00e50b28b6a9d02ca86298db1537d1572ce531ef68dd75cdd99265747f160e75086482f07bd93e9be00c36a7324057d6b611b82fdd8d0604e3921429d476f88e8522a0628bd2e85f3c6667bdcc803ec64b1349213492ea49bddc8d34b1e8cb2405adcd867ceeb27adee0dd66843fa9b5c79352f66f1e74e4b5d326481d377b3239682aedcc0a4756e400c07c047a24d18032fbc498ad67996c256e20196b262ce94f622d7f7cb3d6a884ea0ba43bfca088ca432c98b568da84d56838ac5f5279c6ae1672f53d7c9a0b8d660738886117bb85deb5e7200c13c48ce72885561113db68f90ea8dda89be3beb6aeae92ecccb4e23847d012f2235eb5a10c2322586628191c0e41fadb036421b797993a21f8b3291826b7b38194258f815a8b1432abb10b1c61d6e14169169ae84e926e7b53a8651cb069a30a767471c850f92ac6cb6eaaf807bc681c7e314d7f3f92d6877a23858d7e1bde198f840e2f859036d3c802137d3a26c05d74dcd5c4c0744679e793b11c1cff8bf7e7233a6d599030936719f132b458ed5d35b4fd2ce722ebcb32ecc386ca82464d6466ffec32a046496ea705671fc5ad53c1e2c29eb773bbd44427630ac3933ed5e74cdd2c9df65eced33a03ee3efcb559f77c64a4c0de4eda124c2d4330a893a33f8cb2a1aaa4c649b5130754242c5c6166227ef06079efaf00552d4b03b4137cf49aa706802fc359012d30d777e05d5b5050fc068af75c118b23b6a0bea0fba4d53982ce6cace5cfb462afc22516fb410d7237ce24c84bd0a31f78c4fc74f8a7bf87cda1d81bae9f9c92de7bcc06f5026aeecca32f63f2cd3238a365041a175e8687730904bacaa74078efdb1f3cb4c37778b3e5b03678fd3a2ed7b197f44528b9dda357a11d8b88cedfe402852959e0299470cdd01f735046db1bf03bf614def122878c0ad7e76208d95fbda736c5bb78f09aab4024fe4c8b5a51edbf7a5ea1deb721522790e44d6ca956a8dfd0a24c7ba28118f0def1bb4c2ef9a30054e760c702c44fd85dbb978de3e8942a708c14c83feb771015728cf5e23a39a0f8369ddb5084358f5b549451227211dd7836ff848f4fc34060c537da1c580312054b76dac9fc6d7c198f67fac0707ce8354e94437b20efa07be5503fd56c4cbb0efb794823dfc36223f0a374019fedd7df1936f40f577940b7e574c97e2128a2c9558b37c412cbdd358c008ce6df09f2800f10657e5e62e076b126dc6bb6a53b67ac1a2242b046099f64f3bef64010d9ae2036e47e8b12c0d9c072b006acab71d796a2cee2c069334022cbbbef2aa7d6cae90113be44ae40c1479e443ebe23ba3aed8a37379cd788474098f01e42bcb583c4c768b09cd310af884f52ea546834baf368357cec39710bbe0f605e21f79a5301609bb1ac16009686eb7f97870fbea687a65976355ac80f30ab2341fabd1822fa96cd1734ef9028969e000c70f157343e2478e0828dcf85cffee7c057061110f51bc57fcd53f0a4acf7926663c7abaaa0073d00093083cb20656223d168646104c293c72de87c69328d08b7fc3ed2720dbe1d71939f6d941cb14d22e35df602653aafd97c94850", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 19483469, 2652797, 1885812, 1371792, 1783457, 143321, 105443, 21226, 54899, 17824, 26545\n ], \n \"k_image\": \"eeece7af45927e3d1303df44d2b107b266edecdb2df8ed76feb670f6f1898d7d\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"6d6183467ca7e81a0501465e1104d2f1597d73681d3c1535b73e6a5ff0ec187e\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"fd11017503040c0899c1b1a216a7e1d7027635bb490a41b157aed67b2bd95752\"\n }\n }\n ], \n \"extra\": [ 1, 182, 44, 215, 69, 227, 202, 49, 211, 225, 175, 26, 21, 237, 162, 151, 174, 27, 196, 205, 85, 51, 155, 16, 181, 251, 15, 89, 177, 199, 64, 0, 215, 2, 9, 1, 92, 21, 148, 120, 127, 218, 211, 244\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 11170000, \n \"ecdhInfo\": [ {\n \"amount\": \"3e5c63da5a0e1279\"\n }, {\n \"amount\": \"a8b60af5cd03c11f\"\n }], \n \"outPk\": [ \"204f1e2290333e4d3eb480c0014cb7c2026e79505ff89d9e943436af0bef3ff3\", \"a554ef96defe64484a6e1b997332814df750068858165c2b63c424ae3b4128d6\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"950b60f83b80ad3a578a24f4bf83ff737d826ef7f0a9a27e66af95fa6cbc48b8\", \n \"S\": \"a184b88cab2f452ec64b8694f56ec469baada11acec00e50b28b6a9d02ca8629\", \n \"T1\": \"8db1537d1572ce531ef68dd75cdd99265747f160e75086482f07bd93e9be00c3\", \n \"T2\": \"6a7324057d6b611b82fdd8d0604e3921429d476f88e8522a0628bd2e85f3c666\", \n \"taux\": \"7bdcc803ec64b1349213492ea49bddc8d34b1e8cb2405adcd867ceeb27adee0d\", \n \"mu\": \"d66843fa9b5c79352f66f1e74e4b5d326481d377b3239682aedcc0a4756e400c\", \n \"L\": [ \"c047a24d18032fbc498ad67996c256e20196b262ce94f622d7f7cb3d6a884ea0\", \"ba43bfca088ca432c98b568da84d56838ac5f5279c6ae1672f53d7c9a0b8d660\", \"738886117bb85deb5e7200c13c48ce72885561113db68f90ea8dda89be3beb6a\", \"eae92ecccb4e23847d012f2235eb5a10c2322586628191c0e41fadb036421b79\", \"7993a21f8b3291826b7b38194258f815a8b1432abb10b1c61d6e14169169ae84\", \"e926e7b53a8651cb069a30a767471c850f92ac6cb6eaaf807bc681c7e314d7f3\", \"f92d6877a23858d7e1bde198f840e2f859036d3c802137d3a26c05d74dcd5c4c\"\n ], \n \"R\": [ \"44679e793b11c1cff8bf7e7233a6d599030936719f132b458ed5d35b4fd2ce72\", \"2ebcb32ecc386ca82464d6466ffec32a046496ea705671fc5ad53c1e2c29eb77\", \"3bbd44427630ac3933ed5e74cdd2c9df65eced33a03ee3efcb559f77c64a4c0d\", \"e4eda124c2d4330a893a33f8cb2a1aaa4c649b5130754242c5c6166227ef0607\", \"9efaf00552d4b03b4137cf49aa706802fc359012d30d777e05d5b5050fc068af\", \"75c118b23b6a0bea0fba4d53982ce6cace5cfb462afc22516fb410d7237ce24c\", \"84bd0a31f78c4fc74f8a7bf87cda1d81bae9f9c92de7bcc06f5026aeecca32f6\"\n ], \n \"a\": \"3f2cd3238a365041a175e8687730904bacaa74078efdb1f3cb4c37778b3e5b03\", \n \"b\": \"678fd3a2ed7b197f44528b9dda357a11d8b88cedfe402852959e0299470cdd01\", \n \"t\": \"f735046db1bf03bf614def122878c0ad7e76208d95fbda736c5bb78f09aab402\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"4fe4c8b5a51edbf7a5ea1deb721522790e44d6ca956a8dfd0a24c7ba28118f0d\", \"ef1bb4c2ef9a30054e760c702c44fd85dbb978de3e8942a708c14c83feb77101\", \"5728cf5e23a39a0f8369ddb5084358f5b549451227211dd7836ff848f4fc3406\", \"0c537da1c580312054b76dac9fc6d7c198f67fac0707ce8354e94437b20efa07\", \"be5503fd56c4cbb0efb794823dfc36223f0a374019fedd7df1936f40f577940b\", \"7e574c97e2128a2c9558b37c412cbdd358c008ce6df09f2800f10657e5e62e07\", \"6b126dc6bb6a53b67ac1a2242b046099f64f3bef64010d9ae2036e47e8b12c0d\", \"9c072b006acab71d796a2cee2c069334022cbbbef2aa7d6cae90113be44ae40c\", \"1479e443ebe23ba3aed8a37379cd788474098f01e42bcb583c4c768b09cd310a\", \"f884f52ea546834baf368357cec39710bbe0f605e21f79a5301609bb1ac16009\", \"686eb7f97870fbea687a65976355ac80f30ab2341fabd1822fa96cd1734ef902\"], \n \"c1\": \"8969e000c70f157343e2478e0828dcf85cffee7c057061110f51bc57fcd53f0a\", \n \"D\": \"4acf7926663c7abaaa0073d00093083cb20656223d168646104c293c72de87c6\"\n }], \n \"pseudoOuts\": [ \"9328d08b7fc3ed2720dbe1d71939f6d941cb14d22e35df602653aafd97c94850\"]\n }\n}", + "weight": 1459 + }, + { + "blob_size": 1968, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 15070000, + "id_hash": "e5c1d055d3722665e6d447cee5886614189d7b584808b9f18b78722ad6be5134", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865204, + "max_used_block_height": 2301284, + "max_used_block_id_hash": "2fa1a3dfe39c6b9e15b1c76292f62d050ee3773650c6af763c4a27af2393fc84", + "receive_time": 1613865204, + "relayed": true, + "tx_blob": "02000202000bddf5d60c84a910e0c6108ad40fc9da01a2a301a5b705b379ee3bd611fd06e2b05e1154345e9b743287ee00287083aba5e05af38ffdaa3d568f78bbfee3f902000bbc9ea30cd6a72e93e8309ebc08f8bd02ad8501d98801dc4bb616a8048d9801ce07c7f3d2da0543d1404a16f3d176fba9c52024c899f1be26da9f87690d37980200025d7d4d74c7b92b2f3a8aa4050166e273dbf9a9c2216e9f216b0f91c16ebcf12f000222deadf09bd80a7cd02ac761272392b404ec4bb3a2b483e3522b57849fd13cff2c01d4debb1e5086faa81bf4ee623498ae0940870b45edc190660c8bb7cd239737ef0209010b2c75872632c17305b0e6970702b324bb605a1717423023ea3091d99ecebad405fdcebfbbd981a77ea32d024c3a663aec41428a36fc89c86b9df74876704a5025fb8057888c9249f0d4d328596648209a66c3bc4686f9fd78d4db229f01cebb8d0ec7c1cd8f8806203caa0fef94b9ba8c54229e234caf2cf3edb50109f633f01ac0b1882cbe391ebcc779885d4cf8278b2785a03a46d4072fadd81f1bc2a73e426265d0c1cd7acdf1b6d17b9a1b37fe3954e50b20a4ab155432b318a1815638adaa9da28c14408cd14636aa2653e4b2fc088eff94cede7c267c43843ed25919ade00726e0500fb1f6db3e44eb215648ea8cfd13e7c5700dba9b9161fb0f66dee9e4e67a317852a610eb3df5e1745fe3609858005f27b6b69f4875b7c0050791fc9e4cd38f59eb11eb3fae15a2f66a557c8173079384e98d6921033d62fc0782cf412e4456e8c21d2c8fd0f2ee1acd5ee21306251a8afc07a1b3d0f30a1c8c58d52ebcc28da59d41fb1dd1675ccfa290fb95588670143ab3a09b03e66083c3abd31ebb6808de08b4edf99986235a6e2dfb5a2667fd9303334052f1a8e14fb190c996d789c3c8803be065f3bbb4def3d26ee7671bfa7cca023b44cf1a02ab5a4dbd3c7a986e1dab2613ef759e171f7b12225bedac05bd530f858754712c46bb39fe8a7ba0fb402d3713d3afe649ee4a52ba71a6c24ab7626f3172ddb05d4bb507fd34dedb3d3afdb9d209b286afa14e07b61c00fabefcc1f6d943d96bc4db3f77a81a05153b94660fc9b9ee906833ffc21fefd063ef6ffd93cc74e6b253330565730972a2bf43f13f6046f7b71df6e0d02691ab28091ae1efac86055c9eafef3833e178cd81614eff0c4800e176fd76e48a028d69c2be13c8b75974ff7fde7e8c554c95075e1e84477842f905f55697e72ceeecbeb7980708fd29c2c1e5a6c25095bcaf54c0aceee3253f85511bed12de0f92229489c5cfa93c57fbefc96f4a91d2b3625ca0c7231f516056ebd88ce962d88974fa5c6e7760e83826b4b89907c262e953b99e695e7a03a490c87f07f4dd272dc4f179a438d341efae9f31e0fb0e4e162ed4259b4864f4f31b732f0c6646b2376d2b069327fddd7cd2c66e224301d9beffe54c3fed49bfc4daa6071376a21b003b2245fa04a26b3ea4887787c60e8ec0389646cf45a1e9188d827d904bfedbec5a488b40b616d9f4a101d501750a9a2537945e2aba439960c3537905d4d7f6ed6c47375a93c58adf4e6c8fd6540fd8fa3bf459087d68b70f45faed3c119490970998ff896a8231bc632a81f9890e3e0cb91616aacf899ca4959529c31120f401e7cc432a06da6a8cdcbab7017807d7826377768d2db3d9065895dbe01d04245bb15cf07410b5d5d7743cbfccb604c81096d8f546ba42052e32f7a9cf5c76f9617a1d337e9a4270a0e6c2928abd0f3dca73858599cc27775dfc4c06649ff7acbc056114076e037f932f160e73bc0946a41d0f2c2082ce06881bdc25ee0c2163fca0491322732bbdabd2567880170388eaee40b46616992d967b3de84341938ca95017eb22a802740c5a0c5c5e3602c885bd0f0794a24245f24056d23bf6754a4154c4c88c364669e4b9f8e650bc00df3a44d24a5aa403cda59865712490ac0f61259fb777e13edebf8cc20647420b1e0fddc272af8f394209c0a7648659774bac79d77e0eedaeb212563ce8ce2e034cb823f50df964621f4ce91d8bd70fe3247fa6c01e6e63dd6c609c81c81d926e276ee3957d186efcfd11c45c630f977abc4f4f91def4b0a2ea1c910220f55e0399b9dee21187e037e990ef8c8a7b9b9e5c4c75e96a6b6bf9b38928fab28fd50b54fcaf5600284577fc22934d5f1957b441afed15f34a882b0f68f0eecc129306bba877f93cd2c9b2c8726b6ac15d84333d02bc08f68a666495c800a545f7530c0df7839b6505d3ab26516212dde70932c988d0bb5f757192513c9b0e825bc30660489457bc15a37955601ef5a3ed23d437242911ae6184a3451cc08c3e19af00e7599f9ff855a8c91ca688c20f9cc2b95ce83a27165c8daa7d8c25a283c0d70e064e781e404f921204e5b71afec0fe5253bdd712c822994ea90f711c75d74808a937d69dc04b2329f3ac5f0db853a86f8390f8f97e66072dce59adf8fa2eae06fbfdde18a097ecdc07108b9214f4ab3aee2b634a87de5ecb56884666cbe3c401b8a2e879e9489b77830cfd8d6b9891f3f49ce24d1eafe3bf3bb6749669156c00ef24034b518a3052cac22c16f789fd4506ac8d17350d1ee8d127d7985de89a08a6d2b603e3e88c8744b1b7d1c2da0928b3e6e3c78f501028d268f9415afef95faac8c3221bb920200226e2388c97ceaff6671dd4dfc93683b04ab02fb2b59a81673dc62dd46ed2cb5fbc4c9288a7c16bdbd5611e2c60bcebbba7e3f8a5ca84e1", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26589917, 267396, 271200, 256522, 27977, 20898, 88997, 15539, 7662, 2262, 893\n ], \n \"k_image\": \"e2b05e1154345e9b743287ee00287083aba5e05af38ffdaa3d568f78bbfee3f9\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25743164, 758742, 799763, 138782, 40696, 17069, 17497, 9692, 2870, 552, 19469\n ], \n \"k_image\": \"ce07c7f3d2da0543d1404a16f3d176fba9c52024c899f1be26da9f87690d3798\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"5d7d4d74c7b92b2f3a8aa4050166e273dbf9a9c2216e9f216b0f91c16ebcf12f\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"22deadf09bd80a7cd02ac761272392b404ec4bb3a2b483e3522b57849fd13cff\"\n }\n }\n ], \n \"extra\": [ 1, 212, 222, 187, 30, 80, 134, 250, 168, 27, 244, 238, 98, 52, 152, 174, 9, 64, 135, 11, 69, 237, 193, 144, 102, 12, 139, 183, 205, 35, 151, 55, 239, 2, 9, 1, 11, 44, 117, 135, 38, 50, 193, 115\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 15070000, \n \"ecdhInfo\": [ {\n \"amount\": \"02b324bb605a1717\"\n }, {\n \"amount\": \"423023ea3091d99e\"\n }], \n \"outPk\": [ \"cebad405fdcebfbbd981a77ea32d024c3a663aec41428a36fc89c86b9df74876\", \"704a5025fb8057888c9249f0d4d328596648209a66c3bc4686f9fd78d4db229f\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"cebb8d0ec7c1cd8f8806203caa0fef94b9ba8c54229e234caf2cf3edb50109f6\", \n \"S\": \"33f01ac0b1882cbe391ebcc779885d4cf8278b2785a03a46d4072fadd81f1bc2\", \n \"T1\": \"a73e426265d0c1cd7acdf1b6d17b9a1b37fe3954e50b20a4ab155432b318a181\", \n \"T2\": \"5638adaa9da28c14408cd14636aa2653e4b2fc088eff94cede7c267c43843ed2\", \n \"taux\": \"5919ade00726e0500fb1f6db3e44eb215648ea8cfd13e7c5700dba9b9161fb0f\", \n \"mu\": \"66dee9e4e67a317852a610eb3df5e1745fe3609858005f27b6b69f4875b7c005\", \n \"L\": [ \"91fc9e4cd38f59eb11eb3fae15a2f66a557c8173079384e98d6921033d62fc07\", \"82cf412e4456e8c21d2c8fd0f2ee1acd5ee21306251a8afc07a1b3d0f30a1c8c\", \"58d52ebcc28da59d41fb1dd1675ccfa290fb95588670143ab3a09b03e66083c3\", \"abd31ebb6808de08b4edf99986235a6e2dfb5a2667fd9303334052f1a8e14fb1\", \"90c996d789c3c8803be065f3bbb4def3d26ee7671bfa7cca023b44cf1a02ab5a\", \"4dbd3c7a986e1dab2613ef759e171f7b12225bedac05bd530f858754712c46bb\", \"39fe8a7ba0fb402d3713d3afe649ee4a52ba71a6c24ab7626f3172ddb05d4bb5\"\n ], \n \"R\": [ \"fd34dedb3d3afdb9d209b286afa14e07b61c00fabefcc1f6d943d96bc4db3f77\", \"a81a05153b94660fc9b9ee906833ffc21fefd063ef6ffd93cc74e6b253330565\", \"730972a2bf43f13f6046f7b71df6e0d02691ab28091ae1efac86055c9eafef38\", \"33e178cd81614eff0c4800e176fd76e48a028d69c2be13c8b75974ff7fde7e8c\", \"554c95075e1e84477842f905f55697e72ceeecbeb7980708fd29c2c1e5a6c250\", \"95bcaf54c0aceee3253f85511bed12de0f92229489c5cfa93c57fbefc96f4a91\", \"d2b3625ca0c7231f516056ebd88ce962d88974fa5c6e7760e83826b4b89907c2\"\n ], \n \"a\": \"62e953b99e695e7a03a490c87f07f4dd272dc4f179a438d341efae9f31e0fb0e\", \n \"b\": \"4e162ed4259b4864f4f31b732f0c6646b2376d2b069327fddd7cd2c66e224301\", \n \"t\": \"d9beffe54c3fed49bfc4daa6071376a21b003b2245fa04a26b3ea4887787c60e\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"8ec0389646cf45a1e9188d827d904bfedbec5a488b40b616d9f4a101d501750a\", \"9a2537945e2aba439960c3537905d4d7f6ed6c47375a93c58adf4e6c8fd6540f\", \"d8fa3bf459087d68b70f45faed3c119490970998ff896a8231bc632a81f9890e\", \"3e0cb91616aacf899ca4959529c31120f401e7cc432a06da6a8cdcbab7017807\", \"d7826377768d2db3d9065895dbe01d04245bb15cf07410b5d5d7743cbfccb604\", \"c81096d8f546ba42052e32f7a9cf5c76f9617a1d337e9a4270a0e6c2928abd0f\", \"3dca73858599cc27775dfc4c06649ff7acbc056114076e037f932f160e73bc09\", \"46a41d0f2c2082ce06881bdc25ee0c2163fca0491322732bbdabd25678801703\", \"88eaee40b46616992d967b3de84341938ca95017eb22a802740c5a0c5c5e3602\", \"c885bd0f0794a24245f24056d23bf6754a4154c4c88c364669e4b9f8e650bc00\", \"df3a44d24a5aa403cda59865712490ac0f61259fb777e13edebf8cc20647420b\"], \n \"c1\": \"1e0fddc272af8f394209c0a7648659774bac79d77e0eedaeb212563ce8ce2e03\", \n \"D\": \"4cb823f50df964621f4ce91d8bd70fe3247fa6c01e6e63dd6c609c81c81d926e\"\n }, {\n \"s\": [ \"276ee3957d186efcfd11c45c630f977abc4f4f91def4b0a2ea1c910220f55e03\", \"99b9dee21187e037e990ef8c8a7b9b9e5c4c75e96a6b6bf9b38928fab28fd50b\", \"54fcaf5600284577fc22934d5f1957b441afed15f34a882b0f68f0eecc129306\", \"bba877f93cd2c9b2c8726b6ac15d84333d02bc08f68a666495c800a545f7530c\", \"0df7839b6505d3ab26516212dde70932c988d0bb5f757192513c9b0e825bc306\", \"60489457bc15a37955601ef5a3ed23d437242911ae6184a3451cc08c3e19af00\", \"e7599f9ff855a8c91ca688c20f9cc2b95ce83a27165c8daa7d8c25a283c0d70e\", \"064e781e404f921204e5b71afec0fe5253bdd712c822994ea90f711c75d74808\", \"a937d69dc04b2329f3ac5f0db853a86f8390f8f97e66072dce59adf8fa2eae06\", \"fbfdde18a097ecdc07108b9214f4ab3aee2b634a87de5ecb56884666cbe3c401\", \"b8a2e879e9489b77830cfd8d6b9891f3f49ce24d1eafe3bf3bb6749669156c00\"], \n \"c1\": \"ef24034b518a3052cac22c16f789fd4506ac8d17350d1ee8d127d7985de89a08\", \n \"D\": \"a6d2b603e3e88c8744b1b7d1c2da0928b3e6e3c78f501028d268f9415afef95f\"\n }], \n \"pseudoOuts\": [ \"aac8c3221bb920200226e2388c97ceaff6671dd4dfc93683b04ab02fb2b59a81\", \"673dc62dd46ed2cb5fbc4c9288a7c16bdbd5611e2c60bcebbba7e3f8a5ca84e1\"]\n }\n}", + "weight": 1968 + }, + { + "blob_size": 1453, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 11130000, + "id_hash": "73fe0207e25d59dce5cd6f7369edf33a04ac56409eca3b28ad837c43640ef83f", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865234, + "max_used_block_height": 2301292, + "max_used_block_id_hash": "60eab95dcac94d7e72d997d41d7a424cf1941baa4a5dfc198c71e983fc97a4db", + "receive_time": 1613865234, + "relayed": true, + "tx_blob": "02000102000be0c5940bdbbd8a01ae852addcb45c20980a6018644be32dc07d834a1091ccff101d8ee93903bde0a8ef99ebc99ccd5150f7157b93b758cd456458d416602000218ee38d28e17b0535d232ea154e557eb36904b6e406a2cf9393305140c0f1f790002c0e6f95eaef5c3dedf13be5cfa2fcc5262da6143ed751f435e209ab121a07bd82c018f54253750f6a6185c687003a9333e7cb6bcb37de84b84f59adb00997b92d4e602090115c7ad250cea5cf50590a9a7054dc188d5781e0e066093498bd565ffb5abe9989f9582247aeb1cca456fad238618cbacc93bad0ee56a238c5028522807f5e9c4daf61187a4ec93f3595857b6a4b2bfd6c963d713dc73f5e1cc3764d15001f674d2dfba532deff46e800673a994ef22d2c0828fa4ec4c53ad1d30b4fbf0c03ef3f86a015d9c86023ea017328e01f59cac0434912657650fe5e3d348a777be9c2cf702744b9e9d48b141d29f70bc94da2c4da9c6fbbae5d352b30f828a695521824be345981d1a109c54ae4d8952c400dfec0c1f33b24bc7124e58b5dd6776bf0e485a9d3634f3dc25768b95c38538bd13f3299a0d15fe37b50f28f7af5d08bb9c2c94685b70e971833ee169cbfa30db97c6f8a7f5a15b81efe336d5f852090745b882bc48dbb1f6200617f9658cf7d5f33dd6c5e546df98031b8eaf39ce90d86e3195f662ca3625e4e77bfb3101f9d46a9e7c843b99fb4fd959c220df72a53da16f80b520f6e3d2d3127b23e14e07f73b9cb2a591e88ee46239f840a7d24687378124f6f8c1ea86bb716c2fb0edfac3099ccfed4b2db77141102e7cc457f3da063fa0e93aac26285fbf0c1f5326f69099d48aa00101530d276f903947b648b248a5e0a13f63704102e989cae942865abe2cfad3beb07f05fa869d8f92fa716c7b1a941b59a37ef3f20917c22307c7b7f09bf78efc457704b0ed074b2eb5b1cc07c95d5eb86bed3a1afb1eee93f8781620147ea45edf8f1c7723efe6fda2db819ec2e862418e7df59c29deeecfbdb94e0abc0f7e7312b82eb91be5951b269f0b5419acbf64cf59b44406da0500c9cd75121b1abeb11ec2ccfe099e2bc1400b5da807cab524a1bf15208be9f67f92a8de4e335870597037b1abb37b81d438ebdd6d3726f91e735d729055dd48c047943fc4f8ebd47e1162ad95f6079a587bcd5d2a445fbae5dca39055e14f7d7a800ddaa41e5cde52cfb233720eb2fa6ec1615e12476c8733b84fd4ebcba23f02a2a8f7fe5ab0d96bbaf41e3941b25a8bc98680b2ec02afa785e4cac3585444b826516c0116aa4512d5173fe7aa3e0f726fdeaf01a7d908b0f5a3a953cdb1dab76ec4246c94fc3556b095be529fabd05412f42008892fdb68df0a8415789db65ef2ecf9c31e38bb17d6ec3152693d6954ab3386020909b199d4cc28ee28273d7a45f6d344000ca081f4798266e35dde28a1248d026be058322f8464e975464c3aaa2ebc366e659c8f07371706ffa052dd6b87370aa42c29981dd87055b78bd83315a6cfb33326257f61f414ac503f65c05973c404c0adee9625865d0de24704ef50f2b5c2ba338253dee278b6c61143f24ee1ab0665c36bd19ba6826f36934bd4226e0b5a7b73b3c3179a9284d80fc777cb81070545028563d84cd8b1be1125984782fe32d1b06b2df4df15e371e07d41c51c020f12f718a6b239a6e3b62f18550f5570ae657ce8103ab65da0bdc9f3167c31a7059f797ceffdfead463359e87e9d501d7c04eca3b582c77166705c532556c3a5095dac9e151ead51076f3c05eb7fc594ac5532bdb4a272e9b1532fda10ed6c9b0382d59150c5c737fbbdde1c17ea88e86d82173d1ca4219ef3516b15e0124b14007cfd8718191d291ff32ad1a03b404122ec77ccdb01b771efd8ae8f3c888efd098ca58c91b82a7aa24977f53d0c785917c5bafb309e83b850c77dde25427bf7009d87755efbb070b3a39604d458e0703eda3bd36e8b5a4b82d248e415979f9870a8d15780d3312da05e15dcf0bea4c48b196a96fb8be0fac00927ba65a2f4e1ca", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 23405280, 2268891, 688814, 1140189, 1218, 21248, 8710, 6462, 988, 6744, 1185\n ], \n \"k_image\": \"1ccff101d8ee93903bde0a8ef99ebc99ccd5150f7157b93b758cd456458d4166\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"18ee38d28e17b0535d232ea154e557eb36904b6e406a2cf9393305140c0f1f79\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"c0e6f95eaef5c3dedf13be5cfa2fcc5262da6143ed751f435e209ab121a07bd8\"\n }\n }\n ], \n \"extra\": [ 1, 143, 84, 37, 55, 80, 246, 166, 24, 92, 104, 112, 3, 169, 51, 62, 124, 182, 188, 179, 125, 232, 75, 132, 245, 154, 219, 0, 153, 123, 146, 212, 230, 2, 9, 1, 21, 199, 173, 37, 12, 234, 92, 245\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 11130000, \n \"ecdhInfo\": [ {\n \"amount\": \"4dc188d5781e0e06\"\n }, {\n \"amount\": \"6093498bd565ffb5\"\n }], \n \"outPk\": [ \"abe9989f9582247aeb1cca456fad238618cbacc93bad0ee56a238c5028522807\", \"f5e9c4daf61187a4ec93f3595857b6a4b2bfd6c963d713dc73f5e1cc3764d150\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"f674d2dfba532deff46e800673a994ef22d2c0828fa4ec4c53ad1d30b4fbf0c0\", \n \"S\": \"3ef3f86a015d9c86023ea017328e01f59cac0434912657650fe5e3d348a777be\", \n \"T1\": \"9c2cf702744b9e9d48b141d29f70bc94da2c4da9c6fbbae5d352b30f828a6955\", \n \"T2\": \"21824be345981d1a109c54ae4d8952c400dfec0c1f33b24bc7124e58b5dd6776\", \n \"taux\": \"bf0e485a9d3634f3dc25768b95c38538bd13f3299a0d15fe37b50f28f7af5d08\", \n \"mu\": \"bb9c2c94685b70e971833ee169cbfa30db97c6f8a7f5a15b81efe336d5f85209\", \n \"L\": [ \"45b882bc48dbb1f6200617f9658cf7d5f33dd6c5e546df98031b8eaf39ce90d8\", \"6e3195f662ca3625e4e77bfb3101f9d46a9e7c843b99fb4fd959c220df72a53d\", \"a16f80b520f6e3d2d3127b23e14e07f73b9cb2a591e88ee46239f840a7d24687\", \"378124f6f8c1ea86bb716c2fb0edfac3099ccfed4b2db77141102e7cc457f3da\", \"063fa0e93aac26285fbf0c1f5326f69099d48aa00101530d276f903947b648b2\", \"48a5e0a13f63704102e989cae942865abe2cfad3beb07f05fa869d8f92fa716c\", \"7b1a941b59a37ef3f20917c22307c7b7f09bf78efc457704b0ed074b2eb5b1cc\"\n ], \n \"R\": [ \"c95d5eb86bed3a1afb1eee93f8781620147ea45edf8f1c7723efe6fda2db819e\", \"c2e862418e7df59c29deeecfbdb94e0abc0f7e7312b82eb91be5951b269f0b54\", \"19acbf64cf59b44406da0500c9cd75121b1abeb11ec2ccfe099e2bc1400b5da8\", \"07cab524a1bf15208be9f67f92a8de4e335870597037b1abb37b81d438ebdd6d\", \"3726f91e735d729055dd48c047943fc4f8ebd47e1162ad95f6079a587bcd5d2a\", \"445fbae5dca39055e14f7d7a800ddaa41e5cde52cfb233720eb2fa6ec1615e12\", \"476c8733b84fd4ebcba23f02a2a8f7fe5ab0d96bbaf41e3941b25a8bc98680b2\"\n ], \n \"a\": \"ec02afa785e4cac3585444b826516c0116aa4512d5173fe7aa3e0f726fdeaf01\", \n \"b\": \"a7d908b0f5a3a953cdb1dab76ec4246c94fc3556b095be529fabd05412f42008\", \n \"t\": \"892fdb68df0a8415789db65ef2ecf9c31e38bb17d6ec3152693d6954ab338602\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"0909b199d4cc28ee28273d7a45f6d344000ca081f4798266e35dde28a1248d02\", \"6be058322f8464e975464c3aaa2ebc366e659c8f07371706ffa052dd6b87370a\", \"a42c29981dd87055b78bd83315a6cfb33326257f61f414ac503f65c05973c404\", \"c0adee9625865d0de24704ef50f2b5c2ba338253dee278b6c61143f24ee1ab06\", \"65c36bd19ba6826f36934bd4226e0b5a7b73b3c3179a9284d80fc777cb810705\", \"45028563d84cd8b1be1125984782fe32d1b06b2df4df15e371e07d41c51c020f\", \"12f718a6b239a6e3b62f18550f5570ae657ce8103ab65da0bdc9f3167c31a705\", \"9f797ceffdfead463359e87e9d501d7c04eca3b582c77166705c532556c3a509\", \"5dac9e151ead51076f3c05eb7fc594ac5532bdb4a272e9b1532fda10ed6c9b03\", \"82d59150c5c737fbbdde1c17ea88e86d82173d1ca4219ef3516b15e0124b1400\", \"7cfd8718191d291ff32ad1a03b404122ec77ccdb01b771efd8ae8f3c888efd09\"], \n \"c1\": \"8ca58c91b82a7aa24977f53d0c785917c5bafb309e83b850c77dde25427bf700\", \n \"D\": \"9d87755efbb070b3a39604d458e0703eda3bd36e8b5a4b82d248e415979f9870\"\n }], \n \"pseudoOuts\": [ \"a8d15780d3312da05e15dcf0bea4c48b196a96fb8be0fac00927ba65a2f4e1ca\"]\n }\n}", + "weight": 1453 + }, + { + "blob_size": 1455, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 11140000, + "id_hash": "50e131ed02633f4eddffafe51e10fdec3f759d6e01f7163b76afa3bce5096260", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865178, + "max_used_block_height": 2301216, + "max_used_block_id_hash": "c9f121a14946160a96bffd1c9ab3ce0142b3173570c46f56ad69fa00c0cf9764", + "receive_time": 1613865178, + "relayed": true, + "tx_blob": "02000102000bcea9f20cbbbe12d4ca02b1cb02949901a5d101fb19e2fc018ee601e91db01742484d6705b08d511b22671312cfea561d18f9e0ed541cd75b6cdb70e3ab0264020002b90b1c8210fab9d9aeb9a0116e28ced429fbb2c59d5cd935bf3c30f56618819800026bf573ac829e90ae2344fcd983c8fbbc18c8c2a580766282099117ee107042052c01f747e3fa033f55b1355f5915dfaad7d176b9719238a94f2d82408539f6f212000209010982d362f60580c305a0f7a70561d29ac080359a8932c0cd6d4128b1755409c32746eb589bb4bda40fa8a4c387d5d193b2c7ee2533fcbbdaba0132594f4e8372aa9bb67ce59ed9a3554e2572e26aab30723e7a19cb75079c2d75089006016394565bd741ba637e8d6f4b16e21b08693f6e3afc48db6cac845d9156eb7ca0e68ff5e1b06812d1f3e7e1a027ec8545819b7081fbf43fbdc4a2aa077e97597a64e1576f70ff1d6dcf0489facc7148eccfe2fd76a600343bd7b4f8e8be8baf2a255ff145bf34c07830b18f4b033defece8dfcd2c406deabd56f1dc619aafcb3ead1ed6e8cc41e2a05a098002f6c6d28a14a4cead1e145d06280badeec397dd0f028f2d1e22842128040e37a908de1b2f723d3a9ec40a654c295aee9f32b68d0707460bed0c3bb11f91a0f576dc651b3f78e5efbabd00f2538293d2cc751fcdc5783b52318a9afdde509ee7249e91a252a31fde1646a04ac887198d1002a62f1759d7893d53e078498aa6ce0ddca007d05d8945beff01c6d514b0a245917d764aba377a3de2a48de13f7ba14683a89d99150c975709c6efb50c53bfcc4ab0e1e78163dc2f4a4404fee0dbd5c8c5914cdaaf7b79f61c40fc2b292d2929a753b2649d068a6ee30eb1a0619860760f667c413740f1a1c72af8158565268c5acc6870388edcaa6def31ab89206db6c65acbbf4b6430908687d843737462e14c11312f7b07390551112ff0db34ab44e1d609a4db88c4a7687ca6bc9b9fb48df1806608728261cdbb4ce55f7d605267c48f504f42abe8559865704776c9fb6ca90280ac6745b5059c70f9c1a7649d36344d0052445210d316c4946b92dfb05413cac1f95e65cee125ffd4c56b52d6fd40135c581f2693857a736bc17c1dc9f1aee1a26de40b51c52e8a8f8f13fa8e463bac618e8ae83b25f8763ef735e79b281469934b488e135cf4c1aabb848b796233c84662c606a980d448199e5960f19c6e60d29bdf1f2c55da062a22530de56232e4216a3a385edbd798d8ca07947645595e17ba3f0f44691b04b3711f99f8ec835d66dfabed73c158e7246d4290310b095833000a08fec202c7c8e0e3c911b98aff9c9e3cb32fdc4f5d01b5d3e44b825c34e638290e463f031127945827f01899b41503ede5d050f37434fe996fd64186a3f3b6ba0106b927d7c99504bcf2e66127805b40c6e99d39a33212f24345192daaeb6099053ebaac3a59734203d6f1b6144dbe14c6ec4f6be4c9d5ca197518111c8632430db451b597769c041a9fd55bd7604d06a0479cc435f8b1bb2b94c2977a290053077ca3441614a9c87a1fd9ce061a78eb36ae7ed3faee940a843f874d8a097a1b0c2ef1b6e962aff9d6b4af1d615ba1ce49db08fa71d8656700dbe6881c08f5a5054b71002f30db115af33974325d12bc03c0e6a5a766fec51c888fa4dd514ffd0f00994722397d3b3094608e0bf6ecc3c8965dbeb74ee3d5e47e1fc9d7e34f4300500435d153323d49e9fa7b8ad359761f4aab53ac25c4778d243df3922baf210fb5f56f717d1b54ec48efb1800a1a8e5f3bc9789ef0212c9371d51c8a02fa0c0559ea8301529b9f5e9e3e67cd3cacab803707fba8c6fa377f8ecaa940c2129002c2d29075abdb7068e68ff4e9f13df4e6e84fb1f562c2506a4dff3b35ab069109cb5cf4f8c970baa518b29a355ab4d43d4fd91f0fcef18354d40ac5a868a57d084dfbc1cf8d96b948fc28a3e1160980c3f9caaf793dd3efa404685f9d0e3ddb9e619082180a3da5de5ee257643bc40c2627381bf345355b06bf9d783793fc1512", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 27038926, 302907, 42324, 42417, 19604, 26789, 3323, 32354, 29454, 3817, 2992\n ], \n \"k_image\": \"42484d6705b08d511b22671312cfea561d18f9e0ed541cd75b6cdb70e3ab0264\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"b90b1c8210fab9d9aeb9a0116e28ced429fbb2c59d5cd935bf3c30f566188198\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"6bf573ac829e90ae2344fcd983c8fbbc18c8c2a580766282099117ee10704205\"\n }\n }\n ], \n \"extra\": [ 1, 247, 71, 227, 250, 3, 63, 85, 177, 53, 95, 89, 21, 223, 170, 215, 209, 118, 185, 113, 146, 56, 169, 79, 45, 130, 64, 133, 57, 246, 242, 18, 0, 2, 9, 1, 9, 130, 211, 98, 246, 5, 128, 195\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 11140000, \n \"ecdhInfo\": [ {\n \"amount\": \"61d29ac080359a89\"\n }, {\n \"amount\": \"32c0cd6d4128b175\"\n }], \n \"outPk\": [ \"5409c32746eb589bb4bda40fa8a4c387d5d193b2c7ee2533fcbbdaba0132594f\", \"4e8372aa9bb67ce59ed9a3554e2572e26aab30723e7a19cb75079c2d75089006\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"6394565bd741ba637e8d6f4b16e21b08693f6e3afc48db6cac845d9156eb7ca0\", \n \"S\": \"e68ff5e1b06812d1f3e7e1a027ec8545819b7081fbf43fbdc4a2aa077e97597a\", \n \"T1\": \"64e1576f70ff1d6dcf0489facc7148eccfe2fd76a600343bd7b4f8e8be8baf2a\", \n \"T2\": \"255ff145bf34c07830b18f4b033defece8dfcd2c406deabd56f1dc619aafcb3e\", \n \"taux\": \"ad1ed6e8cc41e2a05a098002f6c6d28a14a4cead1e145d06280badeec397dd0f\", \n \"mu\": \"028f2d1e22842128040e37a908de1b2f723d3a9ec40a654c295aee9f32b68d07\", \n \"L\": [ \"460bed0c3bb11f91a0f576dc651b3f78e5efbabd00f2538293d2cc751fcdc578\", \"3b52318a9afdde509ee7249e91a252a31fde1646a04ac887198d1002a62f1759\", \"d7893d53e078498aa6ce0ddca007d05d8945beff01c6d514b0a245917d764aba\", \"377a3de2a48de13f7ba14683a89d99150c975709c6efb50c53bfcc4ab0e1e781\", \"63dc2f4a4404fee0dbd5c8c5914cdaaf7b79f61c40fc2b292d2929a753b2649d\", \"068a6ee30eb1a0619860760f667c413740f1a1c72af8158565268c5acc687038\", \"8edcaa6def31ab89206db6c65acbbf4b6430908687d843737462e14c11312f7b\"\n ], \n \"R\": [ \"390551112ff0db34ab44e1d609a4db88c4a7687ca6bc9b9fb48df18066087282\", \"61cdbb4ce55f7d605267c48f504f42abe8559865704776c9fb6ca90280ac6745\", \"b5059c70f9c1a7649d36344d0052445210d316c4946b92dfb05413cac1f95e65\", \"cee125ffd4c56b52d6fd40135c581f2693857a736bc17c1dc9f1aee1a26de40b\", \"51c52e8a8f8f13fa8e463bac618e8ae83b25f8763ef735e79b281469934b488e\", \"135cf4c1aabb848b796233c84662c606a980d448199e5960f19c6e60d29bdf1f\", \"2c55da062a22530de56232e4216a3a385edbd798d8ca07947645595e17ba3f0f\"\n ], \n \"a\": \"44691b04b3711f99f8ec835d66dfabed73c158e7246d4290310b095833000a08\", \n \"b\": \"fec202c7c8e0e3c911b98aff9c9e3cb32fdc4f5d01b5d3e44b825c34e638290e\", \n \"t\": \"463f031127945827f01899b41503ede5d050f37434fe996fd64186a3f3b6ba01\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"06b927d7c99504bcf2e66127805b40c6e99d39a33212f24345192daaeb609905\", \"3ebaac3a59734203d6f1b6144dbe14c6ec4f6be4c9d5ca197518111c8632430d\", \"b451b597769c041a9fd55bd7604d06a0479cc435f8b1bb2b94c2977a29005307\", \"7ca3441614a9c87a1fd9ce061a78eb36ae7ed3faee940a843f874d8a097a1b0c\", \"2ef1b6e962aff9d6b4af1d615ba1ce49db08fa71d8656700dbe6881c08f5a505\", \"4b71002f30db115af33974325d12bc03c0e6a5a766fec51c888fa4dd514ffd0f\", \"00994722397d3b3094608e0bf6ecc3c8965dbeb74ee3d5e47e1fc9d7e34f4300\", \"500435d153323d49e9fa7b8ad359761f4aab53ac25c4778d243df3922baf210f\", \"b5f56f717d1b54ec48efb1800a1a8e5f3bc9789ef0212c9371d51c8a02fa0c05\", \"59ea8301529b9f5e9e3e67cd3cacab803707fba8c6fa377f8ecaa940c2129002\", \"c2d29075abdb7068e68ff4e9f13df4e6e84fb1f562c2506a4dff3b35ab069109\"], \n \"c1\": \"cb5cf4f8c970baa518b29a355ab4d43d4fd91f0fcef18354d40ac5a868a57d08\", \n \"D\": \"4dfbc1cf8d96b948fc28a3e1160980c3f9caaf793dd3efa404685f9d0e3ddb9e\"\n }], \n \"pseudoOuts\": [ \"619082180a3da5de5ee257643bc40c2627381bf345355b06bf9d783793fc1512\"]\n }\n}", + "weight": 1455 + }, + { + "blob_size": 3276, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 55460000, + "id_hash": "42b2e64110cb45bf8bb15c6c20f0b99477461596682e9248ce34649f92bfef6d", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865197, + "max_used_block_height": 2301269, + "max_used_block_id_hash": "ca791257ffa938e205bead356431b2e22131ed1f28ba3e01dda1ad4878f75314", + "receive_time": 1613865197, + "relayed": true, + "tx_blob": "02000202000b95e86980888e0cdfb803b28e0faedd0589119017a712ad48b815b908f34aeb91f15a8ad1245f708c40d9430ca3181a2bc4da74bc9229a0a7a6dde14f02000bba97b70c8c9929bad30a92c910cf9e0299c50489ca039eb60382d204fee902a03a61526ea9cf2f016bb789735cae0aff12c98c8837e05f61da17b00f8f2ceffb570c000243a584fd8d406b7c49fbd740d03bc9c17ff9e74b38cdc445d32c45035aa6c60c00024afc1007b47f038d60bfc878a5bb22fc09b2aff12339540a056e2da13d5f88880002f382f73b1662b4bac820408c1f3388e6cc80bb2852fbd72f99d05172ac001d030002f9388507aea6e8565bb7819f040e26571223737e078d2b1418604938f3705f900002b466091aeff052cdaaeb9959f6b0975edec8142c18dd3694eac95f4ef7d2811f00020ca1c32d747b80469224e87cf19f0ed58a0da2b0c7d56739da50fd853334312600027b9ae9f49363bae62554f5d093ea5b7fdc29082a5ccf955d5a790570a02788b700027800638db5b858a32d37abe5d0aa7eff885cbe002e5e7c3a384a5e68c99483af0002decd9944fb2e7e82b051ed7596a0365aa2b0e972c663c5db7d685feb07e1b60c0002a93816a8297fd30052802bd7934d688a6876f8113ac3c800dd08312f939904f300025d99e6ba3943ad596688c1beb98e39bd3ef41b60b0944b752217b3a8015d091e00021e70aacede651d8384bbf10c05e810b61224c032746897ba720b4758e2450d06a30301305d9eb487169baf4efcee11ac056c7bad6b259fa9bc9ecd5e62afe549f53a72040ca6018666fcba17b25066309a99d7b2c43e1859814394f8cefdcf8c47ef855d9d66afc82297327976b24b9bd67abb75aeb2db681ea4387e285d26981a795f66c254de46f59d6697da1308576f65e118415ee019a3095f2b28d4ae3634739b7852692a307757ae531baaaa4d8dd56243e6121dd76a7f205a4cde441738fffd25c23dc224e0b3d4ad93844dc89a429255905d3fabb2ea1743c355cdbf687aed1a45c0fea498d4fd14a43dc3ff27cfa05dd367059ec4647276351c837f7a0fcd3c3b13412dfb6ec10893d3e77ba8b122f6cd0fd27538cfd46363723808bb63b4c31e8ce4d61062cf2913bb5800ee29ec14d111c9db305ed9e1619ee2719b77c246e5a3caa08208c33e991636710ddace30da56d75110f34d80dafc898d30bf6cef56a785419501257952514d316142bd10ad4315d922699a506677dac54b92bd8745c6d8a929d2541c483b966282255285dda3d454911d9ff3e18b954e87b94812471ba8c238d9f222a1526afba1302a495792e8421b375ab2890d53d32dc7e7597e05a081b91a914849dbb97f435fb2d4c89b9d76d6375305a3da8e499028230b7463a24b0e7b0c371fe38a576251ee3f2d12ab136bd80a6c4980d655cdf0b9b1593924b562d558fd2d986dbed9fc744e6530870672b89f2af9e4b921479012e8f4026ad78cda28787c65ce04ef420711e0708f58c015dce6d6c41d9340a5fce868d52c859f7ede9546cc744c774790c0d12ba0253098e2d9dc72d37773862e40173745fb9edc1ae7a0bc2de75004550506e6d9ae4347b60d794999b67fcc333b8b82901042d92bb30b1f9ed3c7794025a614da25edc85122131cd4b44cb84447c301ab7f989c21a46754a9835848d2a7ea7d81bb035b2d8579b3f819099f83e3087d941bee3738a27ce61498531ed9e25a61ddeda961ff9f955271b135d669c3ec78fe917c988e89f867ac4edbcd78aebfd0b519a26cb1ffe99b14ef21609e2b5c88aa8ae113cb1d67e2dac993d100e664fb8ce39e661a44170ca7aa35f5d48e87695e9daaa4cd1d76244b79ccba08c1ed9806607b3de088ecac9dda9c82a4ffc9b2d85c861fbbceb7ec4b52e77e7499a30e15ea4bbf7301831481e0362d38017c2b6008899c34af3b785a291afd41b52bd7466aafcb73de2d39c4a5152c14a8e12a7d6512e80b2c6fc37ed559bde98f3182ca80cc69ac80b164072bbc430b6682c461c26ff7019f08015c50d3ca73da629b5c9f7e737e7dc538fd64fa1d7dae9bbff2ea73a712ce3a4aea6a777e2f7e01f60dfd1e1191ee2c67f3874f3c4b4b7f434a94ac2de0e45f2828bd168fadbe49861f5573ca373c9c2594b961ad1284225ad74917b923fe300de235d39d299fa795ce9a225d1a31c1c9aa8acac1a164225a3315b649f962a9231144f0d8364d90733cbc9709a2d4c343b3baf1909ff6e9a67882f11205a881a3c1042f99d8a3d708b14befecd2ceb66003f4305e335c4be8209998330c0a55c4d93c599e9c7dbf1ebe67a639108829e58bca4de3f53d7eb7ddd4f9a3910f5c34ab1388faf43f9ee7a7b0b24963fe9b3c9ff7c3445c3c6cf9bfd5b3c1170a4607eea1cda8d3cff918144dd2b6153f87bd7762cadecd3ad5f567b7dc2ce29f1eb15b182797704cb8114d876f3cdcd909b0bfeeb398f959475551edc22d27506a8378acb6c08736da3a935cab3857895d87a26499029a1bea373ae1b2718170fb730ec49cf8634dfaf0da4aa10d9e9abefd4d573873b004e307c38c43f37fd3829ce57c23e7b76d0d5612e4f7193dfd814253859bf6ae9e46dbf6dedfaa19b903dc508fc6d4ae35950f391e3a300461460b7f70f64e2cb7fb6962451ced36cc2db75008dcab89274d73879106eb2bfbcc62f7835fa339c5fa9620f7443f302b662be3705f5f2ba8c2ea6e32eecc8165ea43cfd415ff202be62b31f10e9d1cd90ac1efc36139f9ddf6471b3894ef7982547f6222f26c433fd8c83193d4e9d3e556dcc18976545357b404b7aad84e39e99137560ad90606d44773c36e18b4372c257cba74c5899803164e79042175e74f18228b937309ca3d05ac29f6ed0e82700317a3b6863b52a3186554796be24ec83b2ebbf2a16f78ab1fe3f3e3b651253fbbab16a269e23442eeabaf1ca736ba966a923cde127f634e30454639388d6f0eb7cd6b430dd01dac5855fda8446b03999ee2876505585ffa242b64cdd5a5467e40ae4a6b2fe108257d44b90120ab142588b1fcb418f24842f3790ea255ef8c75d87840f8354fa345a60ca7370b34865364448be0104178bdeaa72b3c632e1abf74f24b88b21bc2cb1d9ea013f7b69d5098189cb62f9abef754aa6533ed5ba1a9fef37878ba43e31daa9fab353d076d6db12e2a7a5703f78ce7baec23f0b1a3b7b6903bec374cb084d9c9d0d029aaf0b6ed89741932e96b4b3333d7e017fbe7190c13de08f3fea111910025132766115a98e8f47cfdb68376ad5a25dd87fdc0c30e423f4a13d8f3dffa5a1ebecaa35939f2ad3c3680d5f4909390acef01ad0ab102f5d5d647045df4d234b4bbe7045b207c4539c12a44c5b62ad1100a1f77129c00fd4a9bbf5003b6ed1d61933513b5fd037cdb712700de2d68a10c6ef4d63b0109e26b62c854d1a90480e1f0ab7b77a6dd0d2e8845df44f55e2fa8052069b8120eafa23d4efa29331176ac2656e22b071fb807ba0d62b53ada053b74ad0a6c7404114e9615e721b70c1ee90c62e3a8ac6b8b694e9bf619cda19f7b936b06ba3d0147b10f8801f6272bf748fe45fa95be0dcaca74b3f3936459e0e64762df989104b92419f4bf69522ad1ff53b0a55953d8a32d848596e3e3d798577c02f0385b0e5594a42dbc0869e7246078a66e7f0402a8411aa061d58a36302a9006ed2fe503b75d96ae5a7c440a82d3aedca59527584829cbc0da52cf6e096db90b80323f020a0c2756297b77a1b917b31e9a7d3ba5e9e6d197732368886da7a2114ad18a0e79307f91c01bcd12cfbc9f54c2159afa417a57948dc55be616be424fe9d30d0e4cbf6f399c919a5573cbbf84d206bf3c664fa1c6847165d6f4608996a4a20c0db98cb9042b11b98dbe647e3dac937d752b42a87f02a3ce820a24cad52125ebac93d2afed6071200affb8506fd390dbcd9f956414cc20bd4b9c1003d50ec2c40c05f84afd6defeae6db461edacde4a7a1731442ab7cd53ff7029e00de490cd00a7f510f0e70b1ebdc8986bfaf7975a90cf50d65994bf04eef40e71c56f426c204bc7a595cb36019e3e7d7ba7ad245aac85198c4a50e9197b5cd4fb371341c6406c6df4c2042c5e7169e873261b9ac3e02dde855f36e0aab3201b09ea9b6c3f704a7d381076e642a587bf4757b39ac5ad7c5ffba40188cff1ff364764cb300ba011000f9066d6f53a0dd434ba754ebb5d7f2d94c88aefa9feb27bd1669a76beb032ec69d4cb869c44816024dc77418c6aa076860ee9032679273c88f275b71b9010c226e561779a891bf119a222ba01f1b63f0ebcff28139db53911c710e2fc906292332e6595f51bb3b753c9fdd995a0a700d5529620b43ddefc47e9119bbd20f2bfad045e4c482bb52acb28d08c27b6423ed190d9db627039973b6df15ffb309bac7720ed9e722c36619c59234b54e31fd50a224de9b011efbcc83431e9deb016b088c08c9ae67f111bd1122751f4117c8daec9fda7418d2c79a0d0d3dddd07af0e7178786729ccf9a5ea75e82037c7a39120d5c6f8d8a694016cca7d47343b5e00ab74e22d7aea62103662a640c231066fbc1e16c0d7e0dbf498f80c1a9bcba", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 1733653, 25396224, 56415, 247602, 93870, 2185, 2960, 2343, 9261, 2744, 1081\n ], \n \"k_image\": \"f34aeb91f15a8ad1245f708c40d9430ca3181a2bc4da74bc9229a0a7a6dde14f\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26069946, 674956, 174522, 271506, 36687, 74393, 58633, 56094, 76034, 46334, 7456\n ], \n \"k_image\": \"61526ea9cf2f016bb789735cae0aff12c98c8837e05f61da17b00f8f2ceffb57\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"43a584fd8d406b7c49fbd740d03bc9c17ff9e74b38cdc445d32c45035aa6c60c\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"4afc1007b47f038d60bfc878a5bb22fc09b2aff12339540a056e2da13d5f8888\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"f382f73b1662b4bac820408c1f3388e6cc80bb2852fbd72f99d05172ac001d03\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"f9388507aea6e8565bb7819f040e26571223737e078d2b1418604938f3705f90\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"b466091aeff052cdaaeb9959f6b0975edec8142c18dd3694eac95f4ef7d2811f\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"0ca1c32d747b80469224e87cf19f0ed58a0da2b0c7d56739da50fd8533343126\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"7b9ae9f49363bae62554f5d093ea5b7fdc29082a5ccf955d5a790570a02788b7\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"7800638db5b858a32d37abe5d0aa7eff885cbe002e5e7c3a384a5e68c99483af\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"decd9944fb2e7e82b051ed7596a0365aa2b0e972c663c5db7d685feb07e1b60c\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"a93816a8297fd30052802bd7934d688a6876f8113ac3c800dd08312f939904f3\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"5d99e6ba3943ad596688c1beb98e39bd3ef41b60b0944b752217b3a8015d091e\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"1e70aacede651d8384bbf10c05e810b61224c032746897ba720b4758e2450d06\"\n }\n }\n ], \n \"extra\": [ 1, 48, 93, 158, 180, 135, 22, 155, 175, 78, 252, 238, 17, 172, 5, 108, 123, 173, 107, 37, 159, 169, 188, 158, 205, 94, 98, 175, 229, 73, 245, 58, 114, 4, 12, 166, 1, 134, 102, 252, 186, 23, 178, 80, 102, 48, 154, 153, 215, 178, 196, 62, 24, 89, 129, 67, 148, 248, 206, 253, 207, 140, 71, 239, 133, 93, 157, 102, 175, 200, 34, 151, 50, 121, 118, 178, 75, 155, 214, 122, 187, 117, 174, 178, 219, 104, 30, 164, 56, 126, 40, 93, 38, 152, 26, 121, 95, 102, 194, 84, 222, 70, 245, 157, 102, 151, 218, 19, 8, 87, 111, 101, 225, 24, 65, 94, 224, 25, 163, 9, 95, 43, 40, 212, 174, 54, 52, 115, 155, 120, 82, 105, 42, 48, 119, 87, 174, 83, 27, 170, 170, 77, 141, 213, 98, 67, 230, 18, 29, 215, 106, 127, 32, 90, 76, 222, 68, 23, 56, 255, 253, 37, 194, 61, 194, 36, 224, 179, 212, 173, 147, 132, 77, 200, 154, 66, 146, 85, 144, 93, 63, 171, 178, 234, 23, 67, 195, 85, 205, 191, 104, 122, 237, 26, 69, 192, 254, 164, 152, 212, 253, 20, 164, 61, 195, 255, 39, 207, 160, 93, 211, 103, 5, 158, 196, 100, 114, 118, 53, 28, 131, 127, 122, 15, 205, 60, 59, 19, 65, 45, 251, 110, 193, 8, 147, 211, 231, 123, 168, 177, 34, 246, 205, 15, 210, 117, 56, 207, 212, 99, 99, 114, 56, 8, 187, 99, 180, 195, 30, 140, 228, 214, 16, 98, 207, 41, 19, 187, 88, 0, 238, 41, 236, 20, 209, 17, 201, 219, 48, 94, 217, 225, 97, 158, 226, 113, 155, 119, 194, 70, 229, 163, 202, 160, 130, 8, 195, 62, 153, 22, 54, 113, 13, 218, 206, 48, 218, 86, 215, 81, 16, 243, 77, 128, 218, 252, 137, 141, 48, 191, 108, 239, 86, 167, 133, 65, 149, 1, 37, 121, 82, 81, 77, 49, 97, 66, 189, 16, 173, 67, 21, 217, 34, 105, 154, 80, 102, 119, 218, 197, 75, 146, 189, 135, 69, 198, 216, 169, 41, 210, 84, 28, 72, 59, 150, 98, 130, 37, 82, 133, 221, 163, 212, 84, 145, 29, 159, 243, 225, 139, 149, 78, 135, 185, 72, 18, 71, 27, 168, 194, 56, 217, 242, 34, 161, 82, 106, 251, 161, 48, 42, 73, 87, 146, 232, 66, 27, 55, 90, 178, 137, 13, 83, 211, 45, 199, 231, 89, 126\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 55460000, \n \"ecdhInfo\": [ {\n \"amount\": \"914849dbb97f435f\"\n }, {\n \"amount\": \"b2d4c89b9d76d637\"\n }, {\n \"amount\": \"5305a3da8e499028\"\n }, {\n \"amount\": \"230b7463a24b0e7b\"\n }, {\n \"amount\": \"0c371fe38a576251\"\n }, {\n \"amount\": \"ee3f2d12ab136bd8\"\n }, {\n \"amount\": \"0a6c4980d655cdf0\"\n }, {\n \"amount\": \"b9b1593924b562d5\"\n }, {\n \"amount\": \"58fd2d986dbed9fc\"\n }, {\n \"amount\": \"744e6530870672b8\"\n }, {\n \"amount\": \"9f2af9e4b9214790\"\n }, {\n \"amount\": \"12e8f4026ad78cda\"\n }], \n \"outPk\": [ \"28787c65ce04ef420711e0708f58c015dce6d6c41d9340a5fce868d52c859f7e\", \"de9546cc744c774790c0d12ba0253098e2d9dc72d37773862e40173745fb9edc\", \"1ae7a0bc2de75004550506e6d9ae4347b60d794999b67fcc333b8b82901042d9\", \"2bb30b1f9ed3c7794025a614da25edc85122131cd4b44cb84447c301ab7f989c\", \"21a46754a9835848d2a7ea7d81bb035b2d8579b3f819099f83e3087d941bee37\", \"38a27ce61498531ed9e25a61ddeda961ff9f955271b135d669c3ec78fe917c98\", \"8e89f867ac4edbcd78aebfd0b519a26cb1ffe99b14ef21609e2b5c88aa8ae113\", \"cb1d67e2dac993d100e664fb8ce39e661a44170ca7aa35f5d48e87695e9daaa4\", \"cd1d76244b79ccba08c1ed9806607b3de088ecac9dda9c82a4ffc9b2d85c861f\", \"bbceb7ec4b52e77e7499a30e15ea4bbf7301831481e0362d38017c2b6008899c\", \"34af3b785a291afd41b52bd7466aafcb73de2d39c4a5152c14a8e12a7d6512e8\", \"0b2c6fc37ed559bde98f3182ca80cc69ac80b164072bbc430b6682c461c26ff7\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"9f08015c50d3ca73da629b5c9f7e737e7dc538fd64fa1d7dae9bbff2ea73a712\", \n \"S\": \"ce3a4aea6a777e2f7e01f60dfd1e1191ee2c67f3874f3c4b4b7f434a94ac2de0\", \n \"T1\": \"e45f2828bd168fadbe49861f5573ca373c9c2594b961ad1284225ad74917b923\", \n \"T2\": \"fe300de235d39d299fa795ce9a225d1a31c1c9aa8acac1a164225a3315b649f9\", \n \"taux\": \"62a9231144f0d8364d90733cbc9709a2d4c343b3baf1909ff6e9a67882f11205\", \n \"mu\": \"a881a3c1042f99d8a3d708b14befecd2ceb66003f4305e335c4be8209998330c\", \n \"L\": [ \"55c4d93c599e9c7dbf1ebe67a639108829e58bca4de3f53d7eb7ddd4f9a3910f\", \"5c34ab1388faf43f9ee7a7b0b24963fe9b3c9ff7c3445c3c6cf9bfd5b3c1170a\", \"4607eea1cda8d3cff918144dd2b6153f87bd7762cadecd3ad5f567b7dc2ce29f\", \"1eb15b182797704cb8114d876f3cdcd909b0bfeeb398f959475551edc22d2750\", \"6a8378acb6c08736da3a935cab3857895d87a26499029a1bea373ae1b2718170\", \"fb730ec49cf8634dfaf0da4aa10d9e9abefd4d573873b004e307c38c43f37fd3\", \"829ce57c23e7b76d0d5612e4f7193dfd814253859bf6ae9e46dbf6dedfaa19b9\", \"03dc508fc6d4ae35950f391e3a300461460b7f70f64e2cb7fb6962451ced36cc\", \"2db75008dcab89274d73879106eb2bfbcc62f7835fa339c5fa9620f7443f302b\", \"662be3705f5f2ba8c2ea6e32eecc8165ea43cfd415ff202be62b31f10e9d1cd9\"\n ], \n \"R\": [ \"c1efc36139f9ddf6471b3894ef7982547f6222f26c433fd8c83193d4e9d3e556\", \"dcc18976545357b404b7aad84e39e99137560ad90606d44773c36e18b4372c25\", \"7cba74c5899803164e79042175e74f18228b937309ca3d05ac29f6ed0e827003\", \"17a3b6863b52a3186554796be24ec83b2ebbf2a16f78ab1fe3f3e3b651253fbb\", \"ab16a269e23442eeabaf1ca736ba966a923cde127f634e30454639388d6f0eb7\", \"cd6b430dd01dac5855fda8446b03999ee2876505585ffa242b64cdd5a5467e40\", \"ae4a6b2fe108257d44b90120ab142588b1fcb418f24842f3790ea255ef8c75d8\", \"7840f8354fa345a60ca7370b34865364448be0104178bdeaa72b3c632e1abf74\", \"f24b88b21bc2cb1d9ea013f7b69d5098189cb62f9abef754aa6533ed5ba1a9fe\", \"f37878ba43e31daa9fab353d076d6db12e2a7a5703f78ce7baec23f0b1a3b7b6\"\n ], \n \"a\": \"903bec374cb084d9c9d0d029aaf0b6ed89741932e96b4b3333d7e017fbe7190c\", \n \"b\": \"13de08f3fea111910025132766115a98e8f47cfdb68376ad5a25dd87fdc0c30e\", \n \"t\": \"423f4a13d8f3dffa5a1ebecaa35939f2ad3c3680d5f4909390acef01ad0ab102\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"f5d5d647045df4d234b4bbe7045b207c4539c12a44c5b62ad1100a1f77129c00\", \"fd4a9bbf5003b6ed1d61933513b5fd037cdb712700de2d68a10c6ef4d63b0109\", \"e26b62c854d1a90480e1f0ab7b77a6dd0d2e8845df44f55e2fa8052069b8120e\", \"afa23d4efa29331176ac2656e22b071fb807ba0d62b53ada053b74ad0a6c7404\", \"114e9615e721b70c1ee90c62e3a8ac6b8b694e9bf619cda19f7b936b06ba3d01\", \"47b10f8801f6272bf748fe45fa95be0dcaca74b3f3936459e0e64762df989104\", \"b92419f4bf69522ad1ff53b0a55953d8a32d848596e3e3d798577c02f0385b0e\", \"5594a42dbc0869e7246078a66e7f0402a8411aa061d58a36302a9006ed2fe503\", \"b75d96ae5a7c440a82d3aedca59527584829cbc0da52cf6e096db90b80323f02\", \"0a0c2756297b77a1b917b31e9a7d3ba5e9e6d197732368886da7a2114ad18a0e\", \"79307f91c01bcd12cfbc9f54c2159afa417a57948dc55be616be424fe9d30d0e\"], \n \"c1\": \"4cbf6f399c919a5573cbbf84d206bf3c664fa1c6847165d6f4608996a4a20c0d\", \n \"D\": \"b98cb9042b11b98dbe647e3dac937d752b42a87f02a3ce820a24cad52125ebac\"\n }, {\n \"s\": [ \"93d2afed6071200affb8506fd390dbcd9f956414cc20bd4b9c1003d50ec2c40c\", \"05f84afd6defeae6db461edacde4a7a1731442ab7cd53ff7029e00de490cd00a\", \"7f510f0e70b1ebdc8986bfaf7975a90cf50d65994bf04eef40e71c56f426c204\", \"bc7a595cb36019e3e7d7ba7ad245aac85198c4a50e9197b5cd4fb371341c6406\", \"c6df4c2042c5e7169e873261b9ac3e02dde855f36e0aab3201b09ea9b6c3f704\", \"a7d381076e642a587bf4757b39ac5ad7c5ffba40188cff1ff364764cb300ba01\", \"1000f9066d6f53a0dd434ba754ebb5d7f2d94c88aefa9feb27bd1669a76beb03\", \"2ec69d4cb869c44816024dc77418c6aa076860ee9032679273c88f275b71b901\", \"0c226e561779a891bf119a222ba01f1b63f0ebcff28139db53911c710e2fc906\", \"292332e6595f51bb3b753c9fdd995a0a700d5529620b43ddefc47e9119bbd20f\", \"2bfad045e4c482bb52acb28d08c27b6423ed190d9db627039973b6df15ffb309\"], \n \"c1\": \"bac7720ed9e722c36619c59234b54e31fd50a224de9b011efbcc83431e9deb01\", \n \"D\": \"6b088c08c9ae67f111bd1122751f4117c8daec9fda7418d2c79a0d0d3dddd07a\"\n }], \n \"pseudoOuts\": [ \"f0e7178786729ccf9a5ea75e82037c7a39120d5c6f8d8a694016cca7d47343b5\", \"e00ab74e22d7aea62103662a640c231066fbc1e16c0d7e0dbf498f80c1a9bcba\"]\n }\n}", + "weight": 7244 + }, + { + "blob_size": 1452, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 87735000, + "id_hash": "630f47da19e94398a983d07e31d46bc90467c53ae0755132807c44c29e765a82", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865231, + "max_used_block_height": 2301285, + "max_used_block_id_hash": "1baeffdbb821bbc658f3f5348dc28f15e170ea7764425b6184c7fcd3fadca9b9", + "receive_time": 1613865231, + "relayed": true, + "tx_blob": "02000102000bc0ced40cbfa40cf8ec0de6d50e8ab311854eac518b1a816cb019c4154dd37bf9590afe0e7086f8824c734738d0dd6a0267ddda25a1c68e6d0c37f24502000226736ea68529bd892017a1c70ef0025eca077ed4f63b2c46f8ddcfb3d73a897e000259340fb1cde57c0767c133c7884ad7273fe1f853bf1b9e8096851ab907c09f782c01c09b566cd83625b4afda55acb089882eccba9ac0224e8722cd7a1b545a97d4a00209014dcf4a1674c9c90b05d8f5ea29fd1ae166cd3e94d3bf62e3fc0981c263e3207d3cc7c74a3078ffc8b1c25c6617bba68e9961f15893d901358ec746b6ba08baa0b6922d8c14d2391bdd0aa7e76e544e0b92f69d79859a8c2f7f89fdd82501c860072489988633dda82760660986ce44fedc1f2caac0519ae9aeb502924b235f31c1046b069d89895ca45c826a424a720cee6c735307b0ab19e7a942167d0ec40016c408aea31576ae820df42fd331d995bf2bf9021434274ea59ca14ca0a9004f183a149663562443c41cd79625349769ac3909430e6e7e2e785397953abdb649dc0d7bad3567d75f6e5a296d5bd0bb7e9c2e43625cbe8472f39c6710900dd3a7803025e7f13835d0eb62b4c58325467f0694905f5d84777f227428a3f10f0771286cbd62c0f883d723bd51e2cea9f655d3535ea0c4935d67d36ba326ba44e018f8bfa733524d237111765e2c133ae30c4b177497a2dab51b5b67803c1546ad5e6ed02311dc2a3790bbf507a3ca3c2be04e13c129bf6a7f1caf93a52616f56cf81e7e9129e801fb7adfd0835f57d2585cdaf345f4ff6a1e8a7a095694a1146f332fb2178595574b632f2032079e223e4b01f526af3fbb1ae9a42db117cf9e6f1eac5492f1f0ae442ee6509075c4beccfab023a3ed1dc3f05d5ee32ab29ebb3ab24f3dd4210c0ff210cd43d2035f2d6bbef4af7e2f2aece94ee51e497d2e55940736248e9a1e056147cdbb44a38ff9830d1fe7e11201e3ec079312592dca30e1099e2cb7a027f7181d64f63e054eb176af126b97ce88e452b00da1b5828d4788195d1ec8bf6cb5ec02a402a0124f1486413e64d71f93044e18b0f062c10c3b6c482c3810645048b4fe3e42293d857377a6f92983f434cabcc8f2392d085874c6e4e033846bcd664d0779f19afa431df6a41e7bcbf9ba44b16edf6851cd9f9de4afa47cf64b84cda1e64a46b3377423622a47e5d94ee01dbca9517e93c5f2a3ff3eef0d54cd9c3540eddfe71eb276671dfc1bb0bb43102f93d0ed174968984dbc6b2dff769c39a61559946bbe3d68b545ad00ca8f3d194c95836c087fb2c212de06e310b949bf19676a8ef00c00db8c16ab96579b5fe2584d5f5c965feaca66ef02fc34270d8effaa0b018d269f61e023b1901380b641ef10387b712be89243e10e17f07c3b9515f5dff7bc45663ed742d1a6ea299aab88803d772c31b9b0a1c10b3f936d9fac6d91883dfb676e438feee8ab70a5aa8c8c4463b1e4d1164ce107077a6c501a188432290ce791c79d4a9a109f244b4b5e22caadec95f9c9d6d049056a96b8a9d949631997432c23097c4026019fcde40d816c5e45d2a80dc47c600891cc6212ed66fd166b8a52502d158570a84a8e70d00d393a75d613455c6a6206b50ceb61b48d1efd9525a1ab12c5aafd5d7dcfaa5b3b98d5cd9a1f66080d1201f6b198eb16f3d927a95ff047df771f2409c66c6ffe39d2a43225348d52c07d0fa09831608111ad72412b75c8c8d32de13ea42f6527619b0cca3463c77226db01d553ba518fa98a56663e92ed45547881c035c572358dd7aaa57250dd99d80301a5e3b6cd954168577ff7dca4470e32adea822a83a82cddfa51d5dc9502835c0e5d6f52d3c0fb392bf86e4b37140a9bc2e866cf94ee8bd69ba19717f28188f206620f49eb9e964502ce663b69c2cd1f4487ab6c308d6493b1921abf0b677df20e2763859a59de3469d56ca2779efc29ad11d5980ec146c54696836019cdcfcaac8f250c25b192e91518dd3107bf8331a0d86baa5bf74939ee16328f6cfb8020a8", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26552128, 201279, 226936, 240358, 285066, 9989, 10412, 3339, 13825, 3248, 2756\n ], \n \"k_image\": \"4dd37bf9590afe0e7086f8824c734738d0dd6a0267ddda25a1c68e6d0c37f245\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"26736ea68529bd892017a1c70ef0025eca077ed4f63b2c46f8ddcfb3d73a897e\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"59340fb1cde57c0767c133c7884ad7273fe1f853bf1b9e8096851ab907c09f78\"\n }\n }\n ], \n \"extra\": [ 1, 192, 155, 86, 108, 216, 54, 37, 180, 175, 218, 85, 172, 176, 137, 136, 46, 204, 186, 154, 192, 34, 78, 135, 34, 205, 122, 27, 84, 90, 151, 212, 160, 2, 9, 1, 77, 207, 74, 22, 116, 201, 201, 11\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 87735000, \n \"ecdhInfo\": [ {\n \"amount\": \"fd1ae166cd3e94d3\"\n }, {\n \"amount\": \"bf62e3fc0981c263\"\n }], \n \"outPk\": [ \"e3207d3cc7c74a3078ffc8b1c25c6617bba68e9961f15893d901358ec746b6ba\", \"08baa0b6922d8c14d2391bdd0aa7e76e544e0b92f69d79859a8c2f7f89fdd825\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"c860072489988633dda82760660986ce44fedc1f2caac0519ae9aeb502924b23\", \n \"S\": \"5f31c1046b069d89895ca45c826a424a720cee6c735307b0ab19e7a942167d0e\", \n \"T1\": \"c40016c408aea31576ae820df42fd331d995bf2bf9021434274ea59ca14ca0a9\", \n \"T2\": \"004f183a149663562443c41cd79625349769ac3909430e6e7e2e785397953abd\", \n \"taux\": \"b649dc0d7bad3567d75f6e5a296d5bd0bb7e9c2e43625cbe8472f39c6710900d\", \n \"mu\": \"d3a7803025e7f13835d0eb62b4c58325467f0694905f5d84777f227428a3f10f\", \n \"L\": [ \"71286cbd62c0f883d723bd51e2cea9f655d3535ea0c4935d67d36ba326ba44e0\", \"18f8bfa733524d237111765e2c133ae30c4b177497a2dab51b5b67803c1546ad\", \"5e6ed02311dc2a3790bbf507a3ca3c2be04e13c129bf6a7f1caf93a52616f56c\", \"f81e7e9129e801fb7adfd0835f57d2585cdaf345f4ff6a1e8a7a095694a1146f\", \"332fb2178595574b632f2032079e223e4b01f526af3fbb1ae9a42db117cf9e6f\", \"1eac5492f1f0ae442ee6509075c4beccfab023a3ed1dc3f05d5ee32ab29ebb3a\", \"b24f3dd4210c0ff210cd43d2035f2d6bbef4af7e2f2aece94ee51e497d2e5594\"\n ], \n \"R\": [ \"36248e9a1e056147cdbb44a38ff9830d1fe7e11201e3ec079312592dca30e109\", \"9e2cb7a027f7181d64f63e054eb176af126b97ce88e452b00da1b5828d478819\", \"5d1ec8bf6cb5ec02a402a0124f1486413e64d71f93044e18b0f062c10c3b6c48\", \"2c3810645048b4fe3e42293d857377a6f92983f434cabcc8f2392d085874c6e4\", \"e033846bcd664d0779f19afa431df6a41e7bcbf9ba44b16edf6851cd9f9de4af\", \"a47cf64b84cda1e64a46b3377423622a47e5d94ee01dbca9517e93c5f2a3ff3e\", \"ef0d54cd9c3540eddfe71eb276671dfc1bb0bb43102f93d0ed174968984dbc6b\"\n ], \n \"a\": \"2dff769c39a61559946bbe3d68b545ad00ca8f3d194c95836c087fb2c212de06\", \n \"b\": \"e310b949bf19676a8ef00c00db8c16ab96579b5fe2584d5f5c965feaca66ef02\", \n \"t\": \"fc34270d8effaa0b018d269f61e023b1901380b641ef10387b712be89243e10e\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"17f07c3b9515f5dff7bc45663ed742d1a6ea299aab88803d772c31b9b0a1c10b\", \"3f936d9fac6d91883dfb676e438feee8ab70a5aa8c8c4463b1e4d1164ce10707\", \"7a6c501a188432290ce791c79d4a9a109f244b4b5e22caadec95f9c9d6d04905\", \"6a96b8a9d949631997432c23097c4026019fcde40d816c5e45d2a80dc47c6008\", \"91cc6212ed66fd166b8a52502d158570a84a8e70d00d393a75d613455c6a6206\", \"b50ceb61b48d1efd9525a1ab12c5aafd5d7dcfaa5b3b98d5cd9a1f66080d1201\", \"f6b198eb16f3d927a95ff047df771f2409c66c6ffe39d2a43225348d52c07d0f\", \"a09831608111ad72412b75c8c8d32de13ea42f6527619b0cca3463c77226db01\", \"d553ba518fa98a56663e92ed45547881c035c572358dd7aaa57250dd99d80301\", \"a5e3b6cd954168577ff7dca4470e32adea822a83a82cddfa51d5dc9502835c0e\", \"5d6f52d3c0fb392bf86e4b37140a9bc2e866cf94ee8bd69ba19717f28188f206\"], \n \"c1\": \"620f49eb9e964502ce663b69c2cd1f4487ab6c308d6493b1921abf0b677df20e\", \n \"D\": \"2763859a59de3469d56ca2779efc29ad11d5980ec146c54696836019cdcfcaac\"\n }], \n \"pseudoOuts\": [ \"8f250c25b192e91518dd3107bf8331a0d86baa5bf74939ee16328f6cfb8020a8\"]\n }\n}", + "weight": 1452 + }, + { + "blob_size": 1454, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 11140000, + "id_hash": "0f041badd781cdee7ad17e158f0c435e507050c2df7a5468a3788c683a4ae783", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865205, + "max_used_block_height": 2301290, + "max_used_block_id_hash": "5c19f049f8f2485c9f71dfebe64a69ddfac35ef2ea7d3504310fb6eaf10ea85f", + "receive_time": 1613865205, + "relayed": true, + "tx_blob": "02000102000be4bb890285e3e10ac6bb0abe9011e78808c901beaf02bc02de04a103bd10bc531bb15f56d4c69d23d654f2cf9fec92bc87c418d35750b562c27c2462971502000212898a4b3e29907dcc9d0e8dc02dcda19399600ec24e1672f40c2dc22848f11100022d4d856c8776f19d3c08888e0233855a7bbb968f6e1961160b4ac7cbb9494db82c015fadc3203a7ec11734beccb1e5f6c9ddeef258b08da395a6bdd2606e2634061c020901b426c905e43472bc05a0f7a705684d64e6670b4fcc0af679f41020c379238398d0ff2b513836b61b05c51041740a14d951a93227cfcf517139350bca42a4b97f8edf07b5b805cfa10ec773a3fb10d188cac8f3fa1304a8ec2c4d68cfca019b0d0f458c041a9592c5a39aa6650c636a8f1f614eaa92fd1312fcb0feee36be87c9a49961d72b6c573aa6fcce4301173f1cadf60e8a5f7a556cd36a357202c208aa8cb7942126964bcf4fa4fe4b662cb8300c03c167a39449ffd62e3c840fab52532bba3d48c8286cf65563722c9c29f16c01c2e2719b0508f2adf8be56a537a4449829aa44ff6b0a187680d5841a4743205d5af99792dd9cbfa8fb3c8b70020484f52173cb2f2f47ea0c5f239c575292ae477b7d00c2e0b26cea122cca910907647403d8f66d48c0f29d578e054260054c6073c52d1d71e29491706ee5d62235a7d8390abee97da8ee53ed73db358da9d7b0529d38a33bafcea7b2dd090bdc4b7da74f902f7555664504fc1d2eea10c24c6247b098a255a7bbefa04c69bd1c83e68fa9671903e70ab246197d14ff64331a9630eb5b0130782767037af5f81be9f4764a66e338ab3051c8dcbc39ebaf02913662bbde4ff3f7140876ed35137eb686c37f270c40219a10e7bb711182666140c3b029de929b6a3c88c3d2b4965cde3b1b09f75ff4c778b0da2c2ddf023a174faf7f7de03e883fe377008ed4dd1f6c077fa621c4bcf35e5e7dab32abd8d3408908f38833a046afc5f1abdf1cf02996e19d19c6b948f8a66693a0436c854ac5c95fdb27fbaa28784c025360885a37fb7fe8a3cb25b69fcc879c23923aad7fd32f1f55aaa879b0fc158f85bb6a623329fa9787baa0a68eeefab4a9c35720addd9dfd3ec3adb9b05f18671a5ddca9389964c5d5e80186b368304987a28b084e4ddbd28ebdcdf6b9522226a31568031b14dad35ec60a68e7e80ee1523734095e72400c787286f42ed5ce0c0c6a15344913bbb20fcd36f4d422dbd637b5c2fe4601c677a57a3b5bff01b3ee09aaedc97cd24c4c3ad23a1aa929eb41762d961a649dc02cbb4b5c6bae2f81985a541ce3507105933c6fc15519e95fce6f7dfe34903b47202b3f6d5c971ab791812e30431f5d07fe9704b6f3670da06d7066c93fa568196072e2e0df7e8b5f11124e5e9b5fb304db3668df1ed8f721139396c9fde908aeefd91c8b59c0168f3695a360e8b37607df97245d993904a5a1c85430f168178d431747ee598267862ee3c06295eb590ede58b03fc3834488595a5936a72033280f0e766de48d9c2d440e4628b716580869a1dd7ef71d5c59b41cbb930753d868079a0509e0b1a7a86fd60d529fc1db0ebd2372a9c6dac9b745922993a3bf60c6daf88dde665a1c1eb547381da1eafd05a099d22283b2f45ac318fc82e591d42297155edbce874935d2ad97e1639deb0e485aa47d5a3b53627427a34591194fba6aefbc0c5d23c1bbb1e52edcf581d705f30ff3875f70f9476967db7bea8ae7a1c8860d300703a70af462ac0e32d44a098f2617db12b19845d784ba6f2e6582b02b360168d5ce0cfa1aa7bbb91d14100b790ee9ff99a86e7e4cdebfcb286cbfa6109d1859bde16eb5eab9de3491bf24044074ab59b42cae637b9c850c5f2837f20359a4dbc9fb85c0d541d3902b337d080bfd6413f08e24b116f0392cd85a182d73ed48feb0020e5863cb9eb95691530ddf2cac4c1e788a6da9793701928b364145fa420d3341e60606cad401107c17475c3850ac7d30922d784089ece259893c5614ffb4cc270afd0a1676f045e3a892", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 4349412, 22573445, 171462, 280638, 132199, 201, 38846, 316, 606, 417, 2109\n ], \n \"k_image\": \"bc531bb15f56d4c69d23d654f2cf9fec92bc87c418d35750b562c27c24629715\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"12898a4b3e29907dcc9d0e8dc02dcda19399600ec24e1672f40c2dc22848f111\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"2d4d856c8776f19d3c08888e0233855a7bbb968f6e1961160b4ac7cbb9494db8\"\n }\n }\n ], \n \"extra\": [ 1, 95, 173, 195, 32, 58, 126, 193, 23, 52, 190, 204, 177, 229, 246, 201, 221, 238, 242, 88, 176, 141, 163, 149, 166, 189, 210, 96, 110, 38, 52, 6, 28, 2, 9, 1, 180, 38, 201, 5, 228, 52, 114, 188\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 11140000, \n \"ecdhInfo\": [ {\n \"amount\": \"684d64e6670b4fcc\"\n }, {\n \"amount\": \"0af679f41020c379\"\n }], \n \"outPk\": [ \"238398d0ff2b513836b61b05c51041740a14d951a93227cfcf517139350bca42\", \"a4b97f8edf07b5b805cfa10ec773a3fb10d188cac8f3fa1304a8ec2c4d68cfca\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"9b0d0f458c041a9592c5a39aa6650c636a8f1f614eaa92fd1312fcb0feee36be\", \n \"S\": \"87c9a49961d72b6c573aa6fcce4301173f1cadf60e8a5f7a556cd36a357202c2\", \n \"T1\": \"08aa8cb7942126964bcf4fa4fe4b662cb8300c03c167a39449ffd62e3c840fab\", \n \"T2\": \"52532bba3d48c8286cf65563722c9c29f16c01c2e2719b0508f2adf8be56a537\", \n \"taux\": \"a4449829aa44ff6b0a187680d5841a4743205d5af99792dd9cbfa8fb3c8b7002\", \n \"mu\": \"0484f52173cb2f2f47ea0c5f239c575292ae477b7d00c2e0b26cea122cca9109\", \n \"L\": [ \"647403d8f66d48c0f29d578e054260054c6073c52d1d71e29491706ee5d62235\", \"a7d8390abee97da8ee53ed73db358da9d7b0529d38a33bafcea7b2dd090bdc4b\", \"7da74f902f7555664504fc1d2eea10c24c6247b098a255a7bbefa04c69bd1c83\", \"e68fa9671903e70ab246197d14ff64331a9630eb5b0130782767037af5f81be9\", \"f4764a66e338ab3051c8dcbc39ebaf02913662bbde4ff3f7140876ed35137eb6\", \"86c37f270c40219a10e7bb711182666140c3b029de929b6a3c88c3d2b4965cde\", \"3b1b09f75ff4c778b0da2c2ddf023a174faf7f7de03e883fe377008ed4dd1f6c\"\n ], \n \"R\": [ \"7fa621c4bcf35e5e7dab32abd8d3408908f38833a046afc5f1abdf1cf02996e1\", \"9d19c6b948f8a66693a0436c854ac5c95fdb27fbaa28784c025360885a37fb7f\", \"e8a3cb25b69fcc879c23923aad7fd32f1f55aaa879b0fc158f85bb6a623329fa\", \"9787baa0a68eeefab4a9c35720addd9dfd3ec3adb9b05f18671a5ddca9389964\", \"c5d5e80186b368304987a28b084e4ddbd28ebdcdf6b9522226a31568031b14da\", \"d35ec60a68e7e80ee1523734095e72400c787286f42ed5ce0c0c6a15344913bb\", \"b20fcd36f4d422dbd637b5c2fe4601c677a57a3b5bff01b3ee09aaedc97cd24c\"\n ], \n \"a\": \"4c3ad23a1aa929eb41762d961a649dc02cbb4b5c6bae2f81985a541ce3507105\", \n \"b\": \"933c6fc15519e95fce6f7dfe34903b47202b3f6d5c971ab791812e30431f5d07\", \n \"t\": \"fe9704b6f3670da06d7066c93fa568196072e2e0df7e8b5f11124e5e9b5fb304\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"db3668df1ed8f721139396c9fde908aeefd91c8b59c0168f3695a360e8b37607\", \"df97245d993904a5a1c85430f168178d431747ee598267862ee3c06295eb590e\", \"de58b03fc3834488595a5936a72033280f0e766de48d9c2d440e4628b7165808\", \"69a1dd7ef71d5c59b41cbb930753d868079a0509e0b1a7a86fd60d529fc1db0e\", \"bd2372a9c6dac9b745922993a3bf60c6daf88dde665a1c1eb547381da1eafd05\", \"a099d22283b2f45ac318fc82e591d42297155edbce874935d2ad97e1639deb0e\", \"485aa47d5a3b53627427a34591194fba6aefbc0c5d23c1bbb1e52edcf581d705\", \"f30ff3875f70f9476967db7bea8ae7a1c8860d300703a70af462ac0e32d44a09\", \"8f2617db12b19845d784ba6f2e6582b02b360168d5ce0cfa1aa7bbb91d14100b\", \"790ee9ff99a86e7e4cdebfcb286cbfa6109d1859bde16eb5eab9de3491bf2404\", \"4074ab59b42cae637b9c850c5f2837f20359a4dbc9fb85c0d541d3902b337d08\"], \n \"c1\": \"0bfd6413f08e24b116f0392cd85a182d73ed48feb0020e5863cb9eb95691530d\", \n \"D\": \"df2cac4c1e788a6da9793701928b364145fa420d3341e60606cad401107c1747\"\n }], \n \"pseudoOuts\": [ \"5c3850ac7d30922d784089ece259893c5614ffb4cc270afd0a1676f045e3a892\"]\n }\n}", + "weight": 1454 + }, + { + "blob_size": 1966, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 15050000, + "id_hash": "6085c265496d3fdacff0fa173328c8b0ff97cae60b95033c74388f0ee59e79ab", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865232, + "max_used_block_height": 2301281, + "max_used_block_id_hash": "2c397bdb1c933a1093610cb0462acd0744af253a10950a910b6122b126199578", + "receive_time": 1613865232, + "relayed": true, + "tx_blob": "02000202000b88acf00cafdb0acaa001d7ae0bc1ad07c6bf018914bf1ec629d20b9608fb2d1f9398de6b12c462d48fa559cf9cccb5e21f7c1fc55cc38b6ccf4bad5fd502000babf2e20bef8e3cd99a22eddc429cec059c9e03bff202fd58f038bf20a4124bca762c4760962c6c1216cf3d8c21ee980dd999a91cf2c93486fc51fb8687aa0200023ebf93f3b7100db77718633e2d5dabaf6399110425c31c3b5502747d6660cea70002ddf3d4eb2691c5e19aec101f65c07016140c28ced39989e0493869a6290db4e92c019a32d83914871d89ae5031b606ef18213fa8666be33683d4ff41122e1f8a81c9020901cc440c7ae325af720590ca9607e46457a6ea9d0e3128283cb3491bff75a8c8ec2d04b43fa347c8cbcc50f2e2f02fa0763d428714a8de9d4fac653a6a10668bc5f2a016d83a176c594282062e69836d0dc13a902d74bb751449794c76a1013817acd45b74391eb5c6b3663c4aa6843af250145e74403a627d0ceefc8ecc2fd7a3f6949742b463630afc6edf755ac8ea4e2d830d22f2c25146fabbed80fc5b7cf32f5a8ce81d56d56747246c6cdb1e01539c9fdbcf5d88aa060d3f8bee58e9f9ce6bab8d27f3a98ce248fd2139632d24c5e0f28cc44ef93db8c1ccd40f93dca646035f73f839f02736e9e26ad372a54c2699255b18b6039179bd4525b4f20b4e77081e8ad9ce82628b5531cfcceab2ed95d79f0de79b8c03b0d009a73cec03075213b268ea05e7323615f9a0825f8396b5ff5f6f4078ddde4e97da4962a8d60f6424ea0b0da08f4ae14704e3e5f672f633230b517f8e2ddb20eb463fa040d6268211afdf1b9dae3ec3929a659aaa1aab8e88cc973744272e2bbcefca1f492a7d314d0569d9e7b00d5992e5566f69b5f93cd430089d20b4d78b1b3412a384177ccc69b0082872988bb1bc85be1e4845abc1f47bcf4c11b876cba2ae0ed59c5497dab02437c4bd39ed2bdfcb7941afd84df96c8ebd6729953abcefd77bf1610974f1df30c0f5bd2c1cdc5574d9b5e565fe02c1d2caafeb9ad96bcdeb0c22303b130708d9a09f826ab326bebd2f63508eba4bbb57cce709d162eaa1bcdfdaec5a1a36f1f9e835653768cc33d5ca08cdf1e1055a76a98f90dccfb05823e4cc60a4cc96d7714b7f9e6bc511a92bb2ed6256293e79145ffd907e0f70c43c1b3f8c523dd2255a11141bc4004d5554eb8d96ac4cebbee6cf322c39fc5cfd00524d47ce7bb5fdad2505c574f96104a870a2fb4bf2d701ae7aa8e89edb5ab25e369f1181eaed7777f5c5b692fed434a66b846d29432af9dd745b496dd2dbd74f0e221f2318fa7f186ef422fe8274b5af8375be3b93ebfb9a854296b0ae5eb01cdc30ed6a3c766e9e4eb67046cace587a26ba9bfa6e8e9694a5329fdedf768227a0886268c40db5a7dba011ec60e43dd88c8ce208c29f8f23a1732a73f49ce4ec3b71223edf05fc6c0c748e18c1232e572e4b3dbc414da6301ee82eb987d1f8781e7c4b2023005952a1a670cf53e60c86a8b92d0b11e5d0b5942adf6e050deababbe44f65d40b41854993e33e418bf709d7d3b1fc6532af90a5e42a127c73cee4ce8c01c1b903a231852ee27104d0e2c57630ca4be4e6e264117af25b2522a605251d73e16d00a41e37281f687539483f538c3a64262922afac7c8cddfe80f84bcae236a9f90bf7b1ecfd1c602555e9fe7a06a9f5e2d9c08cc3a14cacec37e26277e049368f0df4e0b2c43796aa1322f1db9cb73ba004aef979b0c05772575e06438cd1e7a1041eea798a66057330b0a38462af4bc8e801b2ef6f6d13a3d113c1fbab76c7d4047fe1263c7dc3506f7abf3aa8632e77a42d70de8bdfdbebbf27c5e7f0c6998d04b09cc0ee0dc868ba150c9eb21d985423ce9a49504d51d71a1232f2bec47d3f0aa1f6775b4843ea901893656764cb8345f25baed64f89ac86a6c1de85334d660379bfdc6f74a49cb44f4cee955da98f11c44e001913e2a57c9cc05f4bf68eec0fa36fa273dd3c434fee05499c1aa9932bb6b9657bf727a7d7f69857440d2be204e071ad073df84d800c8db8a5758509a43fbb97bb6ada1feba7cb519b6afc8778e6b49845498c7d182ab6e85b7a5d0d0c1bd235138a0fa1e19d943f72ce921c0e0688ec641e038dfa7cbde05b8d3876e85f6e99b5ea196f3a907eda508ae4110f967e80c96ac61a768798e8d33f8ba1e790cc4de0b2a6da059c21c953d0b2f4007322a9c780a5d84f03e47ba67b972dff205f7c7f88d408550c467b29a9bfab00fe014bfb0936192109329a0a886746736f87c82adf04a73c048aa8826687ca0d4dc3c2e6de28e5b558ea91fc05ed9690b30783c514ba617c0eaaf18465b32401d7b8cea09bf4b393c275f61a328b6a94c9aca9fb58c8d5ebdf665d6dabcdc70d25da1b440214bb04d47dc7dcce110610fb122dc261788497dd8a363a31298902959e1a119d048238569668533411f8d5feadeb9eb019acfd05bb0a878c3b5a023cfcec8fa2b973b44962ceda53428f6d9b352090efd9b1e1b924699a906bb40c63d4a5eabd5b10630826b7ad96652d7ad94a3ca3ff728c99cfaa60c84966c104280ea6cc3d790aca4fd056e25810c3cac9b6aa5717c25c7b8d3f181983e162057e6d1fe9d0ef73984003fdb60cc3cf05cd7ac225da90174b7776aeafd9dbb406876dbc111f65110af25b6347ebe7b4bbb2d9f408da38e1ac92af809f59705effc194c3c5ddda1091cbc25e0dbffb3f723033eea194a94e5c46ac4cd5fcaf0280", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 27006472, 175535, 20554, 186199, 120513, 24518, 2569, 3903, 5318, 1490, 1046\n ], \n \"k_image\": \"fb2d1f9398de6b12c462d48fa559cf9cccb5e21f7c1fc55cc38b6ccf4bad5fd5\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 24688939, 984943, 560473, 1093229, 95772, 53020, 47423, 11389, 7280, 4159, 2340\n ], \n \"k_image\": \"4bca762c4760962c6c1216cf3d8c21ee980dd999a91cf2c93486fc51fb8687aa\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"3ebf93f3b7100db77718633e2d5dabaf6399110425c31c3b5502747d6660cea7\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"ddf3d4eb2691c5e19aec101f65c07016140c28ced39989e0493869a6290db4e9\"\n }\n }\n ], \n \"extra\": [ 1, 154, 50, 216, 57, 20, 135, 29, 137, 174, 80, 49, 182, 6, 239, 24, 33, 63, 168, 102, 107, 227, 54, 131, 212, 255, 65, 18, 46, 31, 138, 129, 201, 2, 9, 1, 204, 68, 12, 122, 227, 37, 175, 114\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 15050000, \n \"ecdhInfo\": [ {\n \"amount\": \"e46457a6ea9d0e31\"\n }, {\n \"amount\": \"28283cb3491bff75\"\n }], \n \"outPk\": [ \"a8c8ec2d04b43fa347c8cbcc50f2e2f02fa0763d428714a8de9d4fac653a6a10\", \"668bc5f2a016d83a176c594282062e69836d0dc13a902d74bb751449794c76a1\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"3817acd45b74391eb5c6b3663c4aa6843af250145e74403a627d0ceefc8ecc2f\", \n \"S\": \"d7a3f6949742b463630afc6edf755ac8ea4e2d830d22f2c25146fabbed80fc5b\", \n \"T1\": \"7cf32f5a8ce81d56d56747246c6cdb1e01539c9fdbcf5d88aa060d3f8bee58e9\", \n \"T2\": \"f9ce6bab8d27f3a98ce248fd2139632d24c5e0f28cc44ef93db8c1ccd40f93dc\", \n \"taux\": \"a646035f73f839f02736e9e26ad372a54c2699255b18b6039179bd4525b4f20b\", \n \"mu\": \"4e77081e8ad9ce82628b5531cfcceab2ed95d79f0de79b8c03b0d009a73cec03\", \n \"L\": [ \"5213b268ea05e7323615f9a0825f8396b5ff5f6f4078ddde4e97da4962a8d60f\", \"6424ea0b0da08f4ae14704e3e5f672f633230b517f8e2ddb20eb463fa040d626\", \"8211afdf1b9dae3ec3929a659aaa1aab8e88cc973744272e2bbcefca1f492a7d\", \"314d0569d9e7b00d5992e5566f69b5f93cd430089d20b4d78b1b3412a384177c\", \"cc69b0082872988bb1bc85be1e4845abc1f47bcf4c11b876cba2ae0ed59c5497\", \"dab02437c4bd39ed2bdfcb7941afd84df96c8ebd6729953abcefd77bf1610974\", \"f1df30c0f5bd2c1cdc5574d9b5e565fe02c1d2caafeb9ad96bcdeb0c22303b13\"\n ], \n \"R\": [ \"08d9a09f826ab326bebd2f63508eba4bbb57cce709d162eaa1bcdfdaec5a1a36\", \"f1f9e835653768cc33d5ca08cdf1e1055a76a98f90dccfb05823e4cc60a4cc96\", \"d7714b7f9e6bc511a92bb2ed6256293e79145ffd907e0f70c43c1b3f8c523dd2\", \"255a11141bc4004d5554eb8d96ac4cebbee6cf322c39fc5cfd00524d47ce7bb5\", \"fdad2505c574f96104a870a2fb4bf2d701ae7aa8e89edb5ab25e369f1181eaed\", \"7777f5c5b692fed434a66b846d29432af9dd745b496dd2dbd74f0e221f2318fa\", \"7f186ef422fe8274b5af8375be3b93ebfb9a854296b0ae5eb01cdc30ed6a3c76\"\n ], \n \"a\": \"6e9e4eb67046cace587a26ba9bfa6e8e9694a5329fdedf768227a0886268c40d\", \n \"b\": \"b5a7dba011ec60e43dd88c8ce208c29f8f23a1732a73f49ce4ec3b71223edf05\", \n \"t\": \"fc6c0c748e18c1232e572e4b3dbc414da6301ee82eb987d1f8781e7c4b202300\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"5952a1a670cf53e60c86a8b92d0b11e5d0b5942adf6e050deababbe44f65d40b\", \"41854993e33e418bf709d7d3b1fc6532af90a5e42a127c73cee4ce8c01c1b903\", \"a231852ee27104d0e2c57630ca4be4e6e264117af25b2522a605251d73e16d00\", \"a41e37281f687539483f538c3a64262922afac7c8cddfe80f84bcae236a9f90b\", \"f7b1ecfd1c602555e9fe7a06a9f5e2d9c08cc3a14cacec37e26277e049368f0d\", \"f4e0b2c43796aa1322f1db9cb73ba004aef979b0c05772575e06438cd1e7a104\", \"1eea798a66057330b0a38462af4bc8e801b2ef6f6d13a3d113c1fbab76c7d404\", \"7fe1263c7dc3506f7abf3aa8632e77a42d70de8bdfdbebbf27c5e7f0c6998d04\", \"b09cc0ee0dc868ba150c9eb21d985423ce9a49504d51d71a1232f2bec47d3f0a\", \"a1f6775b4843ea901893656764cb8345f25baed64f89ac86a6c1de85334d6603\", \"79bfdc6f74a49cb44f4cee955da98f11c44e001913e2a57c9cc05f4bf68eec0f\"], \n \"c1\": \"a36fa273dd3c434fee05499c1aa9932bb6b9657bf727a7d7f69857440d2be204\", \n \"D\": \"e071ad073df84d800c8db8a5758509a43fbb97bb6ada1feba7cb519b6afc8778\"\n }, {\n \"s\": [ \"e6b49845498c7d182ab6e85b7a5d0d0c1bd235138a0fa1e19d943f72ce921c0e\", \"0688ec641e038dfa7cbde05b8d3876e85f6e99b5ea196f3a907eda508ae4110f\", \"967e80c96ac61a768798e8d33f8ba1e790cc4de0b2a6da059c21c953d0b2f400\", \"7322a9c780a5d84f03e47ba67b972dff205f7c7f88d408550c467b29a9bfab00\", \"fe014bfb0936192109329a0a886746736f87c82adf04a73c048aa8826687ca0d\", \"4dc3c2e6de28e5b558ea91fc05ed9690b30783c514ba617c0eaaf18465b32401\", \"d7b8cea09bf4b393c275f61a328b6a94c9aca9fb58c8d5ebdf665d6dabcdc70d\", \"25da1b440214bb04d47dc7dcce110610fb122dc261788497dd8a363a31298902\", \"959e1a119d048238569668533411f8d5feadeb9eb019acfd05bb0a878c3b5a02\", \"3cfcec8fa2b973b44962ceda53428f6d9b352090efd9b1e1b924699a906bb40c\", \"63d4a5eabd5b10630826b7ad96652d7ad94a3ca3ff728c99cfaa60c84966c104\"], \n \"c1\": \"280ea6cc3d790aca4fd056e25810c3cac9b6aa5717c25c7b8d3f181983e16205\", \n \"D\": \"7e6d1fe9d0ef73984003fdb60cc3cf05cd7ac225da90174b7776aeafd9dbb406\"\n }], \n \"pseudoOuts\": [ \"876dbc111f65110af25b6347ebe7b4bbb2d9f408da38e1ac92af809f59705eff\", \"c194c3c5ddda1091cbc25e0dbffb3f723033eea194a94e5c46ac4cd5fcaf0280\"]\n }\n}", + "weight": 1966 + }, + { + "blob_size": 1967, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 102470000, + "id_hash": "2fd471d9650de3678f0c1e84c322d842297ec68c42295cf8f8df60704a162cbe", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865191, + "max_used_block_height": 2301289, + "max_used_block_id_hash": "2b4b00522904bfbf65b8e141650a981d7e599995c02922bcdc25f72c9c97517a", + "receive_time": 1613865191, + "relayed": true, + "tx_blob": "02000202000b81cd8a0dabe7028a05c2aa01951da47690a901e401a50ab50ced0184f997eb51076c34eb0ce0e9c8f83940089cebf3480b24a82afd2d91566936f102000bf996e70cc7ce0bbedb04c89301f4b00990a102ee9b04f5c801c7db01d557ddff044910ad8f11fa55ab7dc9a9052c21449910eee1a3c7a6fce3a73368b3bde12f3102000232984641e8edf365dba429cff1dbecdb8c173df32e67652545693f93d95927aa000291a0c9cb1a9967e57fdffdd864e2f79754f0ee5f78c5ab8405d4ba809f95476d2c01d0c6601d17bd9fc7320eaef3463d3c4da96ffa62276e5216ead73971349314910209012fe5a8184722eec405f0a2ee309abd413dfb7f42e34edf029da0541caf4a01554127ef488b45bb356a2c1bd35625043baa2bfcebd306feb625d85af311681ea18cd3ae69b07ae360b229adda972a5edaf9269d26e043d88acac07b54dc01e7b60517bd168eee90c2f8221d965f5eb9f61d464019e7b66ba65b7264fe29c48ae179eb3df1771c970dab0ce0a28ac9d78dfc26814adf9358176b892d01b933e65eba083788a9a39e58084d9ac04b80d9b98c7710b80b02216862e8e0fa163a0cecb22815fe8825992f5dcddce46eeaea9fa97c18fa00cfdd9f15f791db0458761360043a73a2da619ca256c0d2cfaa6dc54fe1abf7a66af729a2b4c846220d39dada99f45342a939f1cfa082ac9368bc141eff61e5014414986bb202886308070a1b118a7b65442151b98e01ee468080792335ba5c819a586adf965787c1eff54b75d9a6e1637394279c51118179ba5b74a02050b6df912394d5872e591ff80ea00913175ad71e2eeb00911f9eecd99de10810613eb6960fdee782aa31a65123c54554c75f56c10bc25b999ee59ff4b8ab225e6757971d3fbf2e6fe62419ff1fa274cf408d1692dfe520a59a9baa8cc09f61ddf355fff35f0022981237cf52d599e0b86701084f8ffa9d5c68bf2640bb1d0a6369e7edef2a0f05ee8287cce28e40e7981fa37e5010f8aa48fade1b5704c94daf1a334d72cf55ff9dbf11727cee078d563d25db25f096486d1f5d0f5246d5e1d74ce36568db4d2baec1a9d710534cf43221ea16f7c94022321b1495664177cd82f40befe59f6ca4ddbd4e3e77d4a49f6bde15836500c5561829a5b905fca77f43998e8bfb6ec12ac192dd9a1f390713a37b5e8b12dee74e4b66d3d49b635c699bf7525e301dba820a52650da577536cd95a1d075a450cf40bb6f0bc25a734213147a82906a728d082f480def223814acb2d2e85031f2a81e6dedc9b5d168e67063a1da6091bb376ba68975a1daefd6fb0c4b09998653ab63a1ed19013d92b51d6e1970263ffea72cfdc2a66f8338c1f8d338c0cfa69b6a544329bc699f8610891ae3becb7ed7f87d1013273adcb052064d17b3771aae46a389b3f0fdd7001632f0dbb1f0dd6b0f1112e0f4d0a4b037ef44a42eaf3db06b179cc98b83cb6b92954a67623a96aabcfbeffbf08e988049ff19dd2269e4c3c9d20213664f487ca105bc8e58fc767f54b9b47feb8cb06021e5d94e01e9e3bcbf2afa78ea97106b499be5e6dd0effeeb5010375b60ead00d99a6b4bb2d5c927cf47211ec50347a996a7750fd3ebb7d8b30451af71d82880afe07cf6b6ae515c2a92ab06e210335febf6790e4ac1201a6ee296d1f556b9a0cb33874e2303cd85625e83d76dfaea145eacc6b71eb3742f23c9d8f72356242067f1a738a0cff110705e2929e93b12905da8196c44bdf3235c096074d38a06b08affbee6dc0b268d46a420d9cd09ad2622ddc46b704db49c140ac90709cd24603876d86535871b8378c0607416fb319a6f7c571a28adba1e7ac6c63f651c0f00390515a5432e815f587460b0c65ff3c0c5736da773e58d043af0038289137da0a237febba7a227669f13882b0f977b84726fc6dc96e2762a1e01d5151b5e4850c78f5c4e8489bd57254a0ddf4644dbd106f0df55f23a56c19929c747e79856909dd1b3cd6f1f33dd866d09b222f98f81b9111545f8301cdf2cb36458ada19ea058baf12b89f6c8fc41bc760cde5d780557fd35ed4f7410294db61674d774e9853da0d08e1b19d0701ee43749d9eeda8be0202a2acb7fc5d6cf48df2619c53500817594ad237909562a570611e745f34e2cec73d2e7660124f3905aedfc274150c2da090465387cf141c945bb4c7c4d9bf8f61e4f0cbbf623d9749d36f2daf830d6a2471e5281ebfb4fa0d69b7ee3a6f3c9c856fe82fe2aea61d2ab05bb7555d0186d40fedf4e1eb4fe1f9cc7fac8da5756b908361a35186d3ed26ece7413aa506895b59810eb4047dce70fc98ddcc9594fa23cc1d1fec972ef7ea14c66c54670928a58efc58ea872da7d76cda28fee9b9d811c89d595cdbdbff71c92a5424280bb52b58f702b08655f8f8c4dcaaf268fcf69118c007738583d26e60145808160b8179c52e6aef3d16a01720022bff88a470a414baa74d4ccc1c5cc8ff36eeed0b301a01efeb79721b686ed24ea2ed65316fe4b87ea8fc96cecc153619f1176e06be6e74fbf8bcff62470de5c3325910ce33cf2937e494ffd77518860037a3f40fda3ba27f593e82a782f21e47d5d37811a5df1fbd5eef7e3bae057846288af307342412c0ea71804af08ae75fdb69922cee5de7a86f7d2e538a627d6c4b90c04d3f9186571b906970ef875be6ecf67328c48e2f189d17d0fa27a2dbf2cbeb8ee5d9fa52b2bc3adc0fdc2433ed214ffc818f54448272390698e0c9fe90e2e33b20", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 27436673, 45995, 650, 21826, 3733, 15140, 21648, 228, 1317, 1589, 237\n ], \n \"k_image\": \"84f997eb51076c34eb0ce0e9c8f83940089cebf3480b24a82afd2d91566936f1\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26856313, 190279, 77246, 18888, 153716, 37008, 69102, 25717, 28103, 11221, 81885\n ], \n \"k_image\": \"4910ad8f11fa55ab7dc9a9052c21449910eee1a3c7a6fce3a73368b3bde12f31\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"32984641e8edf365dba429cff1dbecdb8c173df32e67652545693f93d95927aa\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"91a0c9cb1a9967e57fdffdd864e2f79754f0ee5f78c5ab8405d4ba809f95476d\"\n }\n }\n ], \n \"extra\": [ 1, 208, 198, 96, 29, 23, 189, 159, 199, 50, 14, 174, 243, 70, 61, 60, 77, 169, 111, 250, 98, 39, 110, 82, 22, 234, 215, 57, 113, 52, 147, 20, 145, 2, 9, 1, 47, 229, 168, 24, 71, 34, 238, 196\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 102470000, \n \"ecdhInfo\": [ {\n \"amount\": \"9abd413dfb7f42e3\"\n }, {\n \"amount\": \"4edf029da0541caf\"\n }], \n \"outPk\": [ \"4a01554127ef488b45bb356a2c1bd35625043baa2bfcebd306feb625d85af311\", \"681ea18cd3ae69b07ae360b229adda972a5edaf9269d26e043d88acac07b54dc\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"e7b60517bd168eee90c2f8221d965f5eb9f61d464019e7b66ba65b7264fe29c4\", \n \"S\": \"8ae179eb3df1771c970dab0ce0a28ac9d78dfc26814adf9358176b892d01b933\", \n \"T1\": \"e65eba083788a9a39e58084d9ac04b80d9b98c7710b80b02216862e8e0fa163a\", \n \"T2\": \"0cecb22815fe8825992f5dcddce46eeaea9fa97c18fa00cfdd9f15f791db0458\", \n \"taux\": \"761360043a73a2da619ca256c0d2cfaa6dc54fe1abf7a66af729a2b4c846220d\", \n \"mu\": \"39dada99f45342a939f1cfa082ac9368bc141eff61e5014414986bb202886308\", \n \"L\": [ \"0a1b118a7b65442151b98e01ee468080792335ba5c819a586adf965787c1eff5\", \"4b75d9a6e1637394279c51118179ba5b74a02050b6df912394d5872e591ff80e\", \"a00913175ad71e2eeb00911f9eecd99de10810613eb6960fdee782aa31a65123\", \"c54554c75f56c10bc25b999ee59ff4b8ab225e6757971d3fbf2e6fe62419ff1f\", \"a274cf408d1692dfe520a59a9baa8cc09f61ddf355fff35f0022981237cf52d5\", \"99e0b86701084f8ffa9d5c68bf2640bb1d0a6369e7edef2a0f05ee8287cce28e\", \"40e7981fa37e5010f8aa48fade1b5704c94daf1a334d72cf55ff9dbf11727cee\"\n ], \n \"R\": [ \"8d563d25db25f096486d1f5d0f5246d5e1d74ce36568db4d2baec1a9d710534c\", \"f43221ea16f7c94022321b1495664177cd82f40befe59f6ca4ddbd4e3e77d4a4\", \"9f6bde15836500c5561829a5b905fca77f43998e8bfb6ec12ac192dd9a1f3907\", \"13a37b5e8b12dee74e4b66d3d49b635c699bf7525e301dba820a52650da57753\", \"6cd95a1d075a450cf40bb6f0bc25a734213147a82906a728d082f480def22381\", \"4acb2d2e85031f2a81e6dedc9b5d168e67063a1da6091bb376ba68975a1daefd\", \"6fb0c4b09998653ab63a1ed19013d92b51d6e1970263ffea72cfdc2a66f8338c\"\n ], \n \"a\": \"1f8d338c0cfa69b6a544329bc699f8610891ae3becb7ed7f87d1013273adcb05\", \n \"b\": \"2064d17b3771aae46a389b3f0fdd7001632f0dbb1f0dd6b0f1112e0f4d0a4b03\", \n \"t\": \"7ef44a42eaf3db06b179cc98b83cb6b92954a67623a96aabcfbeffbf08e98804\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"9ff19dd2269e4c3c9d20213664f487ca105bc8e58fc767f54b9b47feb8cb0602\", \"1e5d94e01e9e3bcbf2afa78ea97106b499be5e6dd0effeeb5010375b60ead00d\", \"99a6b4bb2d5c927cf47211ec50347a996a7750fd3ebb7d8b30451af71d82880a\", \"fe07cf6b6ae515c2a92ab06e210335febf6790e4ac1201a6ee296d1f556b9a0c\", \"b33874e2303cd85625e83d76dfaea145eacc6b71eb3742f23c9d8f7235624206\", \"7f1a738a0cff110705e2929e93b12905da8196c44bdf3235c096074d38a06b08\", \"affbee6dc0b268d46a420d9cd09ad2622ddc46b704db49c140ac90709cd24603\", \"876d86535871b8378c0607416fb319a6f7c571a28adba1e7ac6c63f651c0f003\", \"90515a5432e815f587460b0c65ff3c0c5736da773e58d043af0038289137da0a\", \"237febba7a227669f13882b0f977b84726fc6dc96e2762a1e01d5151b5e4850c\", \"78f5c4e8489bd57254a0ddf4644dbd106f0df55f23a56c19929c747e79856909\"], \n \"c1\": \"dd1b3cd6f1f33dd866d09b222f98f81b9111545f8301cdf2cb36458ada19ea05\", \n \"D\": \"8baf12b89f6c8fc41bc760cde5d780557fd35ed4f7410294db61674d774e9853\"\n }, {\n \"s\": [ \"da0d08e1b19d0701ee43749d9eeda8be0202a2acb7fc5d6cf48df2619c535008\", \"17594ad237909562a570611e745f34e2cec73d2e7660124f3905aedfc274150c\", \"2da090465387cf141c945bb4c7c4d9bf8f61e4f0cbbf623d9749d36f2daf830d\", \"6a2471e5281ebfb4fa0d69b7ee3a6f3c9c856fe82fe2aea61d2ab05bb7555d01\", \"86d40fedf4e1eb4fe1f9cc7fac8da5756b908361a35186d3ed26ece7413aa506\", \"895b59810eb4047dce70fc98ddcc9594fa23cc1d1fec972ef7ea14c66c546709\", \"28a58efc58ea872da7d76cda28fee9b9d811c89d595cdbdbff71c92a5424280b\", \"b52b58f702b08655f8f8c4dcaaf268fcf69118c007738583d26e60145808160b\", \"8179c52e6aef3d16a01720022bff88a470a414baa74d4ccc1c5cc8ff36eeed0b\", \"301a01efeb79721b686ed24ea2ed65316fe4b87ea8fc96cecc153619f1176e06\", \"be6e74fbf8bcff62470de5c3325910ce33cf2937e494ffd77518860037a3f40f\"], \n \"c1\": \"da3ba27f593e82a782f21e47d5d37811a5df1fbd5eef7e3bae057846288af307\", \n \"D\": \"342412c0ea71804af08ae75fdb69922cee5de7a86f7d2e538a627d6c4b90c04d\"\n }], \n \"pseudoOuts\": [ \"3f9186571b906970ef875be6ecf67328c48e2f189d17d0fa27a2dbf2cbeb8ee5\", \"d9fa52b2bc3adc0fdc2433ed214ffc818f54448272390698e0c9fe90e2e33b20\"]\n }\n}", + "weight": 1967 + }, + { + "blob_size": 1655, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 16780000, + "id_hash": "7908c526b90fc3608603d6987b96f149cc9189f3fe482348ebbbbf1c8efc47d0", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865231, + "max_used_block_height": 2301286, + "max_used_block_id_hash": "e268519d8c40a6bb1466233e36c7b8886ac7e12c6c86482b6e058f013a260590", + "receive_time": 1613865231, + "relayed": true, + "tx_blob": "02000102000b84f0a40c99b22c83a028fdf40cd4d605b2a3018577f5ca02ee1ee527cb03fa571d3ef591465305fbe868c0a4a367b0d071fd593e7bd333a38a0b3902c3a8040002de87e104071bc2c5d55ca9e69e3028ead624b0dc11609f763beddf8c6f1fc4d10002de757db97f2aaf27aed3415b0f49d4f23112b613a3ef0c7fd4e30dc84d3a4ef40002b091d7abd5eb248eb25f94e082b19d321832be3029ad8bc678f6b1490b2cdad20002bf739158d564827f41d48cdacb4f2204ca6c684bff8693ac6149f9ee1d70e88221012c8458559bee6d8deed1ca04f34c22b46c5af9f1f17a220b7fdfd2222979fb4a05e0958008f7512b6842e97184ab7234bfbfef9fe62f962004a57ea42d5da524567ed4e9515b0262e013845de44b68ae74d72b9ba6fb289829cf6735b1e2fc781beb5840960a1e3510c0b3c2dcea4e3b597b15ec0b8e9c2c3b7f0fe8f3c80800639dfe787d6789b32448f452ebb2aa4960cad8ab92b0d915fce00eb0b737250f5e299c20234246757ab1f4b7834283b39bd519ba89350b40d7cf2b97f54675963bf7edd0c2019b3a4a0e21f80cef9e717d301779c1ed74e8f554cc3de01a2b5810d5cc824689359f53a45e692ab6b8ba877695c6a8b5290718988b1f766330bbf9e63af639a738d810895d8be79cce488f152d873595915a528414da5e3ceb13528403f09ed40e451147479df18be1368b09e50967a457300683b84d173444120d0520a9223cd843a08ea063b176cf526164d9bcd30ebe89db86504f2c3c898e315ce8c4fe0120d4b2614cd075ede9339b8d384f11252ad07db35420632a3c5e0b7259e0560908d1846252dfbe74c0af3bee9eefcea253f798921dfdbf018f11ec2c5f28a25c867b712b04bede8167ca72cfdf1f5d3a37f5cc670637ac589504c0c5fd17d0021e59997ee595f3afd0cde6a066e1a287c35b0d0604cf88da6686ca11861d7e488b8da568df334bd59dd3886ecd49c4bdc4c7d2fd154977cd8e85910e71dd94afe4f55d4e3b0515d46fe0ad68903218eb0b2a9be887d728fd8c17e66782971d3f4af100ecf20a94a969ad7cdc0ca212bee09dabd20593888fd1bc4f48a9e39f9d939a2faa6fe63c0cf0f7860dcec30e7c2edc107da7dc321956dffa2364c4325344e71157093691a2a1f76e54d9e5a6819a0c0b6c66966196cd2d7d84ccae37a6b0088d005ee6ee779a481204d9c65c3be7db2a39d92bac5e9ffcad87c234296e184d8ea03cece3b767e792c9cb1bcb23650567477785d781c0eeb708fe8416e28e412da7c26737a61cc71462429f23d8ce13b958dfe90825276d8aa6af9e6b487ca0e9f5365bfd24aab27528dff41f5fd5659cd16f2efb4e3caeb2278d49b36d1f7894b44425c7deadd6b34a02aeb2ea2b85b59836230743c7fa596f618b220ffebdac4d3fbea7eb2f7758b0edb496b66fb2200b19dea2ab13a019085178980d0b48e6fc2815e3f379df0a9ace1fddee375f91dd16a2922f17a60337ef62f30fe4880dbc073d15ed8c9b1377ce5f9cee3917e7399e01bdb2bb0b3f8615ebd262dfe4177f74f871b47563c89c4e4a59e85cda6d75790bcb4ba556053b157c3244b10233379203a4caaf674d514699f51eca0a05a18af345e6e66b99914f257a63c40d4e09e78445c5c25eec3bdf79ee5281970c0e26d55a7b8cc434510c5a8f8b4e0df664174c14694d3cee23822d4c3b223891ea60d0244618458f8d73be4cecfa0ef9fac42038193305d758028bc9bf1159c230cce885bd6168df87b0e160bb6a013db40db53dc78d95bf79b7b3a5bea982fcb3ee7c4facbf5eade362103c46be09b22e28a69f634493728688b630afa9481439c6db8d3acf0431ea93d1a2664307dfa4bccdd60347a0dcf1f7d3dfd45bcbc43d1ce68e6342c145126a7dacf6b90138fb315bae77da391f6d6cc0ca25832f6ef9f63725e497cff923172795d32e0e737e2360e4616c4782d8bdd631e8866e638d67d9ff19e67a1caa4788cbe2210f89236da17ef6c8e9360e60a1ad5e24b44ac4c2d84dac3b1e288f1e9d931c190a3af9d81d0a6e9c3efc69a89f9e44a24780aa01e35bffdc9d86cd97eb9a1a5b04d2e24fbe4e243e1630c22ac991f52a32f64309ec496b160b6ba17ec347428102e779a7b8ff2a3bff9ae352dbc7a67615665257b5caeb46653f917235eb6e6609aedc2e72f801481d8c60c8df8b729e8e8d738c7504953705546f5ac77842bc0b4770f2d8765447802cc558ef08b08279b55d4cec203aa14042941ea90648972ca837e46991e02c4df1e78e04928597c4556d5e27bfdfa736da67ed631312ea9c", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25769988, 727321, 659459, 211581, 93012, 20914, 15237, 42357, 3950, 5093, 459\n ], \n \"k_image\": \"fa571d3ef591465305fbe868c0a4a367b0d071fd593e7bd333a38a0b3902c3a8\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"de87e104071bc2c5d55ca9e69e3028ead624b0dc11609f763beddf8c6f1fc4d1\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"de757db97f2aaf27aed3415b0f49d4f23112b613a3ef0c7fd4e30dc84d3a4ef4\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"b091d7abd5eb248eb25f94e082b19d321832be3029ad8bc678f6b1490b2cdad2\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"bf739158d564827f41d48cdacb4f2204ca6c684bff8693ac6149f9ee1d70e882\"\n }\n }\n ], \n \"extra\": [ 1, 44, 132, 88, 85, 155, 238, 109, 141, 238, 209, 202, 4, 243, 76, 34, 180, 108, 90, 249, 241, 241, 122, 34, 11, 127, 223, 210, 34, 41, 121, 251, 74\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 16780000, \n \"ecdhInfo\": [ {\n \"amount\": \"f7512b6842e97184\"\n }, {\n \"amount\": \"ab7234bfbfef9fe6\"\n }, {\n \"amount\": \"2f962004a57ea42d\"\n }, {\n \"amount\": \"5da524567ed4e951\"\n }], \n \"outPk\": [ \"5b0262e013845de44b68ae74d72b9ba6fb289829cf6735b1e2fc781beb584096\", \"0a1e3510c0b3c2dcea4e3b597b15ec0b8e9c2c3b7f0fe8f3c80800639dfe787d\", \"6789b32448f452ebb2aa4960cad8ab92b0d915fce00eb0b737250f5e299c2023\", \"4246757ab1f4b7834283b39bd519ba89350b40d7cf2b97f54675963bf7edd0c2\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"9b3a4a0e21f80cef9e717d301779c1ed74e8f554cc3de01a2b5810d5cc824689\", \n \"S\": \"359f53a45e692ab6b8ba877695c6a8b5290718988b1f766330bbf9e63af639a7\", \n \"T1\": \"38d810895d8be79cce488f152d873595915a528414da5e3ceb13528403f09ed4\", \n \"T2\": \"0e451147479df18be1368b09e50967a457300683b84d173444120d0520a9223c\", \n \"taux\": \"d843a08ea063b176cf526164d9bcd30ebe89db86504f2c3c898e315ce8c4fe01\", \n \"mu\": \"20d4b2614cd075ede9339b8d384f11252ad07db35420632a3c5e0b7259e05609\", \n \"L\": [ \"d1846252dfbe74c0af3bee9eefcea253f798921dfdbf018f11ec2c5f28a25c86\", \"7b712b04bede8167ca72cfdf1f5d3a37f5cc670637ac589504c0c5fd17d0021e\", \"59997ee595f3afd0cde6a066e1a287c35b0d0604cf88da6686ca11861d7e488b\", \"8da568df334bd59dd3886ecd49c4bdc4c7d2fd154977cd8e85910e71dd94afe4\", \"f55d4e3b0515d46fe0ad68903218eb0b2a9be887d728fd8c17e66782971d3f4a\", \"f100ecf20a94a969ad7cdc0ca212bee09dabd20593888fd1bc4f48a9e39f9d93\", \"9a2faa6fe63c0cf0f7860dcec30e7c2edc107da7dc321956dffa2364c4325344\", \"e71157093691a2a1f76e54d9e5a6819a0c0b6c66966196cd2d7d84ccae37a6b0\"\n ], \n \"R\": [ \"8d005ee6ee779a481204d9c65c3be7db2a39d92bac5e9ffcad87c234296e184d\", \"8ea03cece3b767e792c9cb1bcb23650567477785d781c0eeb708fe8416e28e41\", \"2da7c26737a61cc71462429f23d8ce13b958dfe90825276d8aa6af9e6b487ca0\", \"e9f5365bfd24aab27528dff41f5fd5659cd16f2efb4e3caeb2278d49b36d1f78\", \"94b44425c7deadd6b34a02aeb2ea2b85b59836230743c7fa596f618b220ffebd\", \"ac4d3fbea7eb2f7758b0edb496b66fb2200b19dea2ab13a019085178980d0b48\", \"e6fc2815e3f379df0a9ace1fddee375f91dd16a2922f17a60337ef62f30fe488\", \"0dbc073d15ed8c9b1377ce5f9cee3917e7399e01bdb2bb0b3f8615ebd262dfe4\"\n ], \n \"a\": \"177f74f871b47563c89c4e4a59e85cda6d75790bcb4ba556053b157c3244b102\", \n \"b\": \"33379203a4caaf674d514699f51eca0a05a18af345e6e66b99914f257a63c40d\", \n \"t\": \"4e09e78445c5c25eec3bdf79ee5281970c0e26d55a7b8cc434510c5a8f8b4e0d\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"f664174c14694d3cee23822d4c3b223891ea60d0244618458f8d73be4cecfa0e\", \"f9fac42038193305d758028bc9bf1159c230cce885bd6168df87b0e160bb6a01\", \"3db40db53dc78d95bf79b7b3a5bea982fcb3ee7c4facbf5eade362103c46be09\", \"b22e28a69f634493728688b630afa9481439c6db8d3acf0431ea93d1a2664307\", \"dfa4bccdd60347a0dcf1f7d3dfd45bcbc43d1ce68e6342c145126a7dacf6b901\", \"38fb315bae77da391f6d6cc0ca25832f6ef9f63725e497cff923172795d32e0e\", \"737e2360e4616c4782d8bdd631e8866e638d67d9ff19e67a1caa4788cbe2210f\", \"89236da17ef6c8e9360e60a1ad5e24b44ac4c2d84dac3b1e288f1e9d931c190a\", \"3af9d81d0a6e9c3efc69a89f9e44a24780aa01e35bffdc9d86cd97eb9a1a5b04\", \"d2e24fbe4e243e1630c22ac991f52a32f64309ec496b160b6ba17ec347428102\", \"e779a7b8ff2a3bff9ae352dbc7a67615665257b5caeb46653f917235eb6e6609\"], \n \"c1\": \"aedc2e72f801481d8c60c8df8b729e8e8d738c7504953705546f5ac77842bc0b\", \n \"D\": \"4770f2d8765447802cc558ef08b08279b55d4cec203aa14042941ea90648972c\"\n }], \n \"pseudoOuts\": [ \"a837e46991e02c4df1e78e04928597c4556d5e27bfdfa736da67ed631312ea9c\"]\n }\n}", + "weight": 2192 + }, + { + "blob_size": 1455, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 11140000, + "id_hash": "5cdb533084065846b9a13fccf5fc20aa3e2bf1f71b6f0f1bd2be4570fdd38de4", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865208, + "max_used_block_height": 2301192, + "max_used_block_id_hash": "d419a25bb0c0c0a1aedc88a0ee9be36588855afe35cfac842344a29fbc85ec4b", + "receive_time": 1613865208, + "relayed": true, + "tx_blob": "02000102000bf2fd820bbe89bd018afd17df92239a8310c4e302a8c101e81f8d778710ee256083c22b7fc33acfa366f546f9ff7474bffaa874901c7344cc6440a06815e2ed0200023407a66e56b4b1e6ff770414def6bd33777bbda44e9437fe6bef7436aba0fb410002a75678b3276704af7ed1cf6de79daae13373e009dbc8156b1a878eed7893d8342c01e674808dab267b7882533f92e94ad833f6d1dabd909bff418a553635a1506631020901eb12d03827f42bc205a0f7a70573f8c852dea5d03ab53c414e704b14f7eca2975164b249813f0576772c87d9750b8206de03af33894a006b605767fee1d2d8a16eb46be2c99f7d6b4df2a627ba25e6fe78ff3dcb021e7e2fc0b98c45fc018049fd92a226a37ba884ceefb354917459f5ccbc77938798502a3e6270a05b115808b89b8f6cb382999bcc29089706115cc6b65e49bc970599446d99144e60410b2f2ce28320c400188017519986357a719334038701eb80559f8653e2c133e9ca0ffc6245a1f054b9d9fab344d1d62b9111bc01ee6da487a3852a92fb5814ccd7e5e83f2e70ea9cc1ae14d8954e5875e1c7b4d0564f67864a5656c1a6fdbf057ddc9ed01b39bdffdef6f43a51c5afaae70048825f8619b125d4be933848d00a07b496f50c58ad35b531b02657a9cb629af4dc2c1cb74701751635075354aa7ef8e1310077b2ee900d8be1c3d8aef77246d579a9a45ec983c3b16fdbf510cf10a87b4feaccfa45870efc2b5df56842c57fadf04fec46a236b16accb5dd591eecd84fe09393eb560726c9f2c8abfa9f6813091fa1c77201e817855ee0bb3debce4468f3b7e680ac547cdaacecfd23bca6bf2af63353dc23d5c18d2a9330eeba6154fdd4ad51351cf374463bcf13cb617bec2e645668fe2bc0633fd7a7cdf118f67746cd5fb155585ab4ea4bbed6e732c5cf892334c6d0d21fbe4a05fc42c2608d67075a066e4e4f92c8d3a52bc7a26123ca9e4e5845648dc3d24ab2079bea2f085dee03700bf13ddaa88b0f27b0837002e866b2ac0cf534b210992c804ed4457545bfc4dbe0ec04d3653012d71a9f52b0900982d70f48b4aaebdd6871c6b8bfece1df9c6d4043681da70391b1ceb972435b059ba671975dcfdd5364aa54798106c93a3e52f3cb260e691a796db7bc69c42775133b24201b668c29290735f9d40da533c0ba61f247e4b5ebba631957527b961eb3382ff36544b3405119a02e9a25ae70061293fa35c7611abb98f167a9586994275d4e0c8e242c4a64906d4922a5668fe802d2f040522624106012018a821ac2661740de61cde13dd2d55abe3d1ee80863d8f0ccbdf54335762f6fea985449d69a7499f987d45a1ad0a2fadb01352207e8d9d59c8fdec5e890e01bef325452f79dbc3037277f4d7d0c75207be542d0085bc3bf33f5915200b950ad37d798cce7c6ae959754f68ebfd98e44d01f805107a0d0d320a95301931a752706eccc7edd6de819df7fe2bc0564772a85583ba90cf578934955d1e90e47a5b583977fd1a30ed81d9f1e04dac5286170f3b1ebcc059694cc523664601a52a4c7a2daa1d3bf32c0b96b2b7fe332e14913e1075b370a60d359bb6ffcc601d718bb2362774f15947ef1d7267fe4b8db70c7bc8133730f3b0cfcbd2aaba4be5836581eda44dd9d634bedf614e452dbb4d3ed968cbc3807570659d6654a4b417beca9ad8e821f2360a11fc6c7ba4d3630247e49a2da9f035d7a8db5d4d8aa59562f4e825b0b924c2a14402f8202cad4d103199d9a24db04636b72048d28faed4599f72c0378e67a249f65832a55306fd201cf4540a24c06a839854765b264c1fa3343180240ec3887264e3387e980efaf8e0648b98ef40ccad661b73f826d44a56b37a24193c702159ef8c4ea28e3f29c29d69103bccf0698b29c5794337feb8991374e5893016cbd88b41a4ff36c0ba9565ad7f0314f087a5abd8726a60f7c26307e64af354f34f99ffe5a8fe218e18ac9f985258e033121ddc3af1c6dc9e0087cab598c1ff1482fa9632a45ea49a7e700326d18fa786e", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 23117554, 3097790, 392842, 575839, 262554, 45508, 24744, 4072, 15245, 2055, 4846\n ], \n \"k_image\": \"6083c22b7fc33acfa366f546f9ff7474bffaa874901c7344cc6440a06815e2ed\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"3407a66e56b4b1e6ff770414def6bd33777bbda44e9437fe6bef7436aba0fb41\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"a75678b3276704af7ed1cf6de79daae13373e009dbc8156b1a878eed7893d834\"\n }\n }\n ], \n \"extra\": [ 1, 230, 116, 128, 141, 171, 38, 123, 120, 130, 83, 63, 146, 233, 74, 216, 51, 246, 209, 218, 189, 144, 155, 255, 65, 138, 85, 54, 53, 161, 80, 102, 49, 2, 9, 1, 235, 18, 208, 56, 39, 244, 43, 194\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 11140000, \n \"ecdhInfo\": [ {\n \"amount\": \"73f8c852dea5d03a\"\n }, {\n \"amount\": \"b53c414e704b14f7\"\n }], \n \"outPk\": [ \"eca2975164b249813f0576772c87d9750b8206de03af33894a006b605767fee1\", \"d2d8a16eb46be2c99f7d6b4df2a627ba25e6fe78ff3dcb021e7e2fc0b98c45fc\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"8049fd92a226a37ba884ceefb354917459f5ccbc77938798502a3e6270a05b11\", \n \"S\": \"5808b89b8f6cb382999bcc29089706115cc6b65e49bc970599446d99144e6041\", \n \"T1\": \"0b2f2ce28320c400188017519986357a719334038701eb80559f8653e2c133e9\", \n \"T2\": \"ca0ffc6245a1f054b9d9fab344d1d62b9111bc01ee6da487a3852a92fb5814cc\", \n \"taux\": \"d7e5e83f2e70ea9cc1ae14d8954e5875e1c7b4d0564f67864a5656c1a6fdbf05\", \n \"mu\": \"7ddc9ed01b39bdffdef6f43a51c5afaae70048825f8619b125d4be933848d00a\", \n \"L\": [ \"b496f50c58ad35b531b02657a9cb629af4dc2c1cb74701751635075354aa7ef8\", \"e1310077b2ee900d8be1c3d8aef77246d579a9a45ec983c3b16fdbf510cf10a8\", \"7b4feaccfa45870efc2b5df56842c57fadf04fec46a236b16accb5dd591eecd8\", \"4fe09393eb560726c9f2c8abfa9f6813091fa1c77201e817855ee0bb3debce44\", \"68f3b7e680ac547cdaacecfd23bca6bf2af63353dc23d5c18d2a9330eeba6154\", \"fdd4ad51351cf374463bcf13cb617bec2e645668fe2bc0633fd7a7cdf118f677\", \"46cd5fb155585ab4ea4bbed6e732c5cf892334c6d0d21fbe4a05fc42c2608d67\"\n ], \n \"R\": [ \"5a066e4e4f92c8d3a52bc7a26123ca9e4e5845648dc3d24ab2079bea2f085dee\", \"03700bf13ddaa88b0f27b0837002e866b2ac0cf534b210992c804ed4457545bf\", \"c4dbe0ec04d3653012d71a9f52b0900982d70f48b4aaebdd6871c6b8bfece1df\", \"9c6d4043681da70391b1ceb972435b059ba671975dcfdd5364aa54798106c93a\", \"3e52f3cb260e691a796db7bc69c42775133b24201b668c29290735f9d40da533\", \"c0ba61f247e4b5ebba631957527b961eb3382ff36544b3405119a02e9a25ae70\", \"061293fa35c7611abb98f167a9586994275d4e0c8e242c4a64906d4922a5668f\"\n ], \n \"a\": \"e802d2f040522624106012018a821ac2661740de61cde13dd2d55abe3d1ee808\", \n \"b\": \"63d8f0ccbdf54335762f6fea985449d69a7499f987d45a1ad0a2fadb01352207\", \n \"t\": \"e8d9d59c8fdec5e890e01bef325452f79dbc3037277f4d7d0c75207be542d008\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"5bc3bf33f5915200b950ad37d798cce7c6ae959754f68ebfd98e44d01f805107\", \"a0d0d320a95301931a752706eccc7edd6de819df7fe2bc0564772a85583ba90c\", \"f578934955d1e90e47a5b583977fd1a30ed81d9f1e04dac5286170f3b1ebcc05\", \"9694cc523664601a52a4c7a2daa1d3bf32c0b96b2b7fe332e14913e1075b370a\", \"60d359bb6ffcc601d718bb2362774f15947ef1d7267fe4b8db70c7bc8133730f\", \"3b0cfcbd2aaba4be5836581eda44dd9d634bedf614e452dbb4d3ed968cbc3807\", \"570659d6654a4b417beca9ad8e821f2360a11fc6c7ba4d3630247e49a2da9f03\", \"5d7a8db5d4d8aa59562f4e825b0b924c2a14402f8202cad4d103199d9a24db04\", \"636b72048d28faed4599f72c0378e67a249f65832a55306fd201cf4540a24c06\", \"a839854765b264c1fa3343180240ec3887264e3387e980efaf8e0648b98ef40c\", \"cad661b73f826d44a56b37a24193c702159ef8c4ea28e3f29c29d69103bccf06\"], \n \"c1\": \"98b29c5794337feb8991374e5893016cbd88b41a4ff36c0ba9565ad7f0314f08\", \n \"D\": \"7a5abd8726a60f7c26307e64af354f34f99ffe5a8fe218e18ac9f985258e0331\"\n }], \n \"pseudoOuts\": [ \"21ddc3af1c6dc9e0087cab598c1ff1482fa9632a45ea49a7e700326d18fa786e\"]\n }\n}", + "weight": 1455 + }, + { + "blob_size": 1581, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 16220000, + "id_hash": "502972204a8a5d3f3e593aee64a0baa8c9dc6b64876a6ed0de6db6da040870e9", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865231, + "max_used_block_height": 2301283, + "max_used_block_id_hash": "87dd1e298c20bcd156b0e4e151daaeac0bd42422cfecb1fbc5a7e38812382907", + "receive_time": 1613865231, + "relayed": true, + "tx_blob": "02000102000bb29ea409d79b8d03eaae1e80d91bfaa021cdbe03f66a870a9701c214b90fb8f2e25d853d4d157be9cdaa9140cc44e6e7764daae1e0986935f303eb3b08e0030002b715530f3cbffa4048b7a522385111e9192112c72f6cccd7d34a8afd081890c100027280d8d1a2079d5bd1b3464be974af09c4c9af84ee84f9d8211dad0bb93b45a30002875d093932da69a98513078387d8add61c6dd9b985cfcfa180cf1d09562830b12101104e3f47d473b1feb6a60806634748c8cdd8a1231c1c56a069a4eb3fd486b8ab05e0fedd0731dcb5538d1c2162da54a545db0e4c840584622e8d9a10e5abd7f6bb1f7c674f96b8d5911b815d369b3ce2f658621b17d72e55f3868a6edc583e86b47f9dc7fdebadf3d96d5e625a928d28d42880c3f2ebdf0ef402c1a2bd0e8ffad38b52ef6e2cdeec531c73740fa554d12d78772bed179bfd9c06343c7b0129d2319628f6eb0a049136f802bc659b2ec47e0a29da2b7e3e0ac39329028395556d97a03a866610eff787468b929c57e767ebb4cc3562d5d7215e4f7b1302dbbd6704d3a110f7477e4975a3136226978e5f8316379682a66ca572fabce5d6bedfb7cfc08b820a3789460f5b1da1159335126509c8e4db73606dbd4418ed6bcc822acd41ee92c1f6413da279987ac9fe5239f1066945c4da10580b497fc8d30d7c956b7acfe476b0f8a4cb7ca806f0bd324b43909e5cdafabcc4eecfcb58f70608968acd9af52353207683a2635a3a9f49ca414337f8354d955049cc54fc4458fd7bbd312ea93503d179199b5fbf14adef26286d8f3734cd1f02f7b2890c4715c5bcaa0ef62bf07a793f6420bf99fb58dd03044eb0466485aff2309c9baf8ca7451ce81bda836c9ecbdc9f07b90ac71e9bc8b63874c349796d3d12d30f77136c5ecbbfbcec7173bd9ff9964b9d69450b64b2443eadb20b533438b460e718924039e9a36bdd7eac62e66bf72f0828646713821b002d606cd943fd51edfac20182f8059319c9ada1acdff7a75915bb0d02de3e8b020d87038da89c9be400e2293f73a1c989002b0eb3736f64b4757315ae9f15af6730b4a7f2f4457034f4ee1362b108145c3f42c353c99bb3cbdd279ff521381161ef8cd345fefe52d5ecf803a16a124eed2fab76e2505108f9fca1004adffa105d053d09f0c48e291f77f8af2c7db10945954a470a99c3180f2310219b53fe6dbd20478d7a8ce5d8040706368dd880e483c8061b54f7cd46270a3963b1a910df2e07ba95247d18d8fd5e22a70b4a9047b4cc913c1e34db9617aa7ef2ef3d31c61dbe80cae0a4b8d3c809316c6aff4ee0400cd1f4458b329678ae5e422ed96d1f1af1e8e15490bab302fbc32402197306be918787e5dd20dfa63be9a7ef43ffe705c8439cfd651383ebdb3c23af89387d3312dc552fb196246a14f263a7cc1e3faafaba051b52c273fbc686c23c3520f6fffee6319200d46538aa2a8a0b19db0e970bb5774d2ae92eb5f0b245b0ea004bfb375573715fb9ec518a55b7fd20c10b5babeffd96dd8e358b298ad5ad3e0d87543c1a61dca963bb162e23d495033133277685ed65af5e3d884d5914be4407d23790f5fde3f4c84d5e51bc5656d85708686f147ad457e90076cedf22c1dd068ebaed1b81592c72f45b7008fadc69f4578628594a15209a82365563ff8c75009475a81cb1646a07f181d014dea8386adb00e10c6cb942e9193e5e3246029a083181cf0e0d802bf624b118bfc1a20abc1c41ad6d9e7460505d31d898f4411509d929b2be2f55effb84023125d7fefedda68e42b512de9462dfbecf7f8abdfd09c26f75999bdc57e6d092f3f63a557370636acddfc34e9615a5b9bd955e429a08b8469a769d250f17e2b1ac1794b50c772c9084e4c81c8d7bd6704e3a240635084bb36e8d742c7908fa4f72618aa2c934b3be8e7e6cef40470d5a467debe21e044929f65f2cd89852c5b17728b16a77f74d41470ee6c4eca35dbb03ff846d24050f13eb46524d3202992835362f7634994e1a6fbd146e856b2034a1755aa48f03867ca064004852a3fd039d74030525c4ec05f2f6abd479d9bff89509e2ad680be7f068fb56b2423342e3f005f86f8e4a356d9beb435bca1c737bf890301d4005d82d311bb062e892cdc007b01650062bb0da0a985ed38996e17ebbd61a30423f76ec53bca8ce56593194af0ae9d13bae65aa204799f8598abf93117f05e3cbca", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 19468082, 6507991, 497514, 453760, 544890, 57165, 13686, 1287, 151, 2626, 1977\n ], \n \"k_image\": \"b8f2e25d853d4d157be9cdaa9140cc44e6e7764daae1e0986935f303eb3b08e0\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"b715530f3cbffa4048b7a522385111e9192112c72f6cccd7d34a8afd081890c1\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"7280d8d1a2079d5bd1b3464be974af09c4c9af84ee84f9d8211dad0bb93b45a3\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"875d093932da69a98513078387d8add61c6dd9b985cfcfa180cf1d09562830b1\"\n }\n }\n ], \n \"extra\": [ 1, 16, 78, 63, 71, 212, 115, 177, 254, 182, 166, 8, 6, 99, 71, 72, 200, 205, 216, 161, 35, 28, 28, 86, 160, 105, 164, 235, 63, 212, 134, 184, 171\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 16220000, \n \"ecdhInfo\": [ {\n \"amount\": \"31dcb5538d1c2162\"\n }, {\n \"amount\": \"da54a545db0e4c84\"\n }, {\n \"amount\": \"0584622e8d9a10e5\"\n }], \n \"outPk\": [ \"abd7f6bb1f7c674f96b8d5911b815d369b3ce2f658621b17d72e55f3868a6edc\", \"583e86b47f9dc7fdebadf3d96d5e625a928d28d42880c3f2ebdf0ef402c1a2bd\", \"0e8ffad38b52ef6e2cdeec531c73740fa554d12d78772bed179bfd9c06343c7b\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"29d2319628f6eb0a049136f802bc659b2ec47e0a29da2b7e3e0ac39329028395\", \n \"S\": \"556d97a03a866610eff787468b929c57e767ebb4cc3562d5d7215e4f7b1302db\", \n \"T1\": \"bd6704d3a110f7477e4975a3136226978e5f8316379682a66ca572fabce5d6be\", \n \"T2\": \"dfb7cfc08b820a3789460f5b1da1159335126509c8e4db73606dbd4418ed6bcc\", \n \"taux\": \"822acd41ee92c1f6413da279987ac9fe5239f1066945c4da10580b497fc8d30d\", \n \"mu\": \"7c956b7acfe476b0f8a4cb7ca806f0bd324b43909e5cdafabcc4eecfcb58f706\", \n \"L\": [ \"968acd9af52353207683a2635a3a9f49ca414337f8354d955049cc54fc4458fd\", \"7bbd312ea93503d179199b5fbf14adef26286d8f3734cd1f02f7b2890c4715c5\", \"bcaa0ef62bf07a793f6420bf99fb58dd03044eb0466485aff2309c9baf8ca745\", \"1ce81bda836c9ecbdc9f07b90ac71e9bc8b63874c349796d3d12d30f77136c5e\", \"cbbfbcec7173bd9ff9964b9d69450b64b2443eadb20b533438b460e718924039\", \"e9a36bdd7eac62e66bf72f0828646713821b002d606cd943fd51edfac20182f8\", \"059319c9ada1acdff7a75915bb0d02de3e8b020d87038da89c9be400e2293f73\", \"a1c989002b0eb3736f64b4757315ae9f15af6730b4a7f2f4457034f4ee1362b1\"\n ], \n \"R\": [ \"145c3f42c353c99bb3cbdd279ff521381161ef8cd345fefe52d5ecf803a16a12\", \"4eed2fab76e2505108f9fca1004adffa105d053d09f0c48e291f77f8af2c7db1\", \"0945954a470a99c3180f2310219b53fe6dbd20478d7a8ce5d8040706368dd880\", \"e483c8061b54f7cd46270a3963b1a910df2e07ba95247d18d8fd5e22a70b4a90\", \"47b4cc913c1e34db9617aa7ef2ef3d31c61dbe80cae0a4b8d3c809316c6aff4e\", \"e0400cd1f4458b329678ae5e422ed96d1f1af1e8e15490bab302fbc324021973\", \"06be918787e5dd20dfa63be9a7ef43ffe705c8439cfd651383ebdb3c23af8938\", \"7d3312dc552fb196246a14f263a7cc1e3faafaba051b52c273fbc686c23c3520\"\n ], \n \"a\": \"f6fffee6319200d46538aa2a8a0b19db0e970bb5774d2ae92eb5f0b245b0ea00\", \n \"b\": \"4bfb375573715fb9ec518a55b7fd20c10b5babeffd96dd8e358b298ad5ad3e0d\", \n \"t\": \"87543c1a61dca963bb162e23d495033133277685ed65af5e3d884d5914be4407\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"d23790f5fde3f4c84d5e51bc5656d85708686f147ad457e90076cedf22c1dd06\", \"8ebaed1b81592c72f45b7008fadc69f4578628594a15209a82365563ff8c7500\", \"9475a81cb1646a07f181d014dea8386adb00e10c6cb942e9193e5e3246029a08\", \"3181cf0e0d802bf624b118bfc1a20abc1c41ad6d9e7460505d31d898f4411509\", \"d929b2be2f55effb84023125d7fefedda68e42b512de9462dfbecf7f8abdfd09\", \"c26f75999bdc57e6d092f3f63a557370636acddfc34e9615a5b9bd955e429a08\", \"b8469a769d250f17e2b1ac1794b50c772c9084e4c81c8d7bd6704e3a24063508\", \"4bb36e8d742c7908fa4f72618aa2c934b3be8e7e6cef40470d5a467debe21e04\", \"4929f65f2cd89852c5b17728b16a77f74d41470ee6c4eca35dbb03ff846d2405\", \"0f13eb46524d3202992835362f7634994e1a6fbd146e856b2034a1755aa48f03\", \"867ca064004852a3fd039d74030525c4ec05f2f6abd479d9bff89509e2ad680b\"], \n \"c1\": \"e7f068fb56b2423342e3f005f86f8e4a356d9beb435bca1c737bf890301d4005\", \n \"D\": \"d82d311bb062e892cdc007b01650062bb0da0a985ed38996e17ebbd61a30423f\"\n }], \n \"pseudoOuts\": [ \"76ec53bca8ce56593194af0ae9d13bae65aa204799f8598abf93117f05e3cbca\"]\n }\n}", + "weight": 2118 + }, + { + "blob_size": 1967, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 15060000, + "id_hash": "23ba4986b2a7207d326793ecfbc63eece447c104d395c08867cc850254b055f1", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1613865211, + "max_used_block_height": 2301286, + "max_used_block_id_hash": "e268519d8c40a6bb1466233e36c7b8886ac7e12c6c86482b6e058f013a260590", + "receive_time": 1613865211, + "relayed": true, + "tx_blob": "02000202000bc7cfbd0aad874af2f461879625cea3478cd00e909a18b6b3148d0aae0ce0037d2c7eb8ca44eab409582cc15a23fab28441b89177cde8344dca79ae5f28e8f402000bdc91d90ccaaf0ff38c1a9db708f61eb4d302a89e01f46dcc24b13ffd247a1cad147be3baa06c785162d0fdbf1ddb540728de0ba6ba218e90c0ee756e990200026c935f5811e26e0660b06bc330fe4befb38fa279df96a11881c39b61e82f10af0002a89fe7d8ba9957522329b5eb2b7a883c6c6e5f7576824272021ebe71b835d0b62c01287b6b2e1e1563c07eeff74f30d643d64b1496a0f745166bdb68b2df9d1655590209018cac1c3f1b09a4f705a0989707a284543bb7ef42f7a0bd8546f29a79ad9c3025905fa967952818704d1ab4259ed1941d099d0275f565986010e6365f84183cd330853d19a381af5433569add060f2f0c34d6a1df79bbe6d53302d7485001cfc71f71bf487962458911499ebb09001c7171a003adb99c53a095a14f952dacfd66291da7b8fdcc9bdc86a5e51050bc4a6b2a0fa3ea36c3dddceb160aea1862d8a89e1cb1f3fdfe1a3c95e4bdda05cf2f78101883d8d3375b58e685803ceec5b007d9783e73fc2ebdb6d647c047b2886dae5470d607ab00b84cd304074dea2fb4534fd999c326777c0b5dc0c533b139212ad41a97243f5c1138e34493211e075b0bc07282b16612b6f67f0ae7f3dd9f2460368307a979dcdf9fc8cf98e3260107b0d6537f125cec64234c6803dd8cfa5889109c992fa823adaf027d0643e1dc28487f4d2ffba9f882d77a1ca5c3055d8d18d290f6e0ad0dba6a226739d9b5ac0b424b81d9d38c6bed8080edccbd99dbea6f8f1fd60ff0f3b892a0ff232c08e68c99005673edd5b10f9dc979a14dec0c9831ac49d6dee03d9968b42d9a47028135fe4379cc2448d814bea38d8a3bc2180e5f008006b003b1f84c046d0b4480788b21f5e2b1661e930fe1fb33a59d80448669932cc0a12d542b23c1c36732d5202f09d7dbb8dbbc5feabc03e6a49930a4a72864b0052428da284d65684f0097090e0711b9dcc24618348eebcb0219f1eaed35492ba96523df65f760ec5603306b4a2ddccff6922761b4261ec0dd605e936091a406f6d948e3b4ef0a73524f2de5b3528b8bdb3b3f448046031ab7caec103dcef6ded62ab8a78cc9efaa79b0d8736dc90a04b564e1a2e1f8bc6bb0a3ec11e857dba743287f9901e2e1415d10d60c3f23a1aa51f714159e996758f6242b1528a0774f235d67c438182971a98748313b44c54e8df65b31683f499b4052f0bcca6e4c4f294154cf78cb1e03f544e4a28e49c92356ea75ec92311890b45f7b4f829c46ba762f021d58d46a3abfbe762431cac0ba1eda9500139208d79241b414acdf674eaaae05b796113b04e451b897190bc72ef0cee133e4017c175399fe2b758e45fa25641d6c6a5ffa3df69502e1a9085b85cfb442dcf981f1fb243d917fd5da5e3d23babe76cba63c19360ecda4e502f982fbda7c6f9640533fe05419722d6e0ff0d33ec577f7ff5b2904da5bab920be2153585b49e1032b8d6d68e557b0cdde47ef05cfef3a6333a5aa7ec6b78050d99d28e79be92f1ab09f4542ff0c37c48332310927c40f3b73b7afdf571e19e03b498141f985f5e60d0204769cba0eb098822771ff6970c81b4c26da3a02b9b0806e06c455983e813f115ca2b85b9c84fde90797898457bc4c101a56c844d2e08c794eacf79645b88e4d4798888b703ba3d2fef971a338a4e10989921e093e403220dd486347960710cbc2fd938a7e75f9a8f68f5bfcd488b3dd14fe1f467750ba7dacb9f32ab353d261b02ec0607dcdf769aba13aba4eea0f57b7eac27f355001d0aa84f60a86e342b4e192725f8d827ed53e3470ff3d19aebf2b4d927334b0b42ac60e82000cf247dd90dcc9cf3b19e62fe8ce1afeb9061705dc3a1cfd1b10a97d16b69e39c8bf691ed7784d79b3a36f22205ee47d8817e5f6808be9da2dc0a94c1462c11d4066291d49361a65a236d82c512d66b960d2356a15e008c328d0605180c4820d1355398ecd27729e3ca14a2a21aed2837c09d327b5fac9da18ca3eca68f219cdb807cd577975252c3fcfa47290f38eeaf89b61f0d59ac4f4a650ac4d237296a1dd80310c4fc72e13ae075315dd0d4c7e8fb6ce01fb67d9504990b3eb2a83c292abf97b590ec7a838e6133eb088684ab23dc79e83c7b35f3066e061f0683ae670080e47c52352fa1361415e2ad0238562a3f3bb2860e99acca320d47d21e01085ed25d74b85fe8f96418e098aa766f05cd31e10bcaaaa083a14b0d14cbb447af86aecb70ecc95fc3d9960305aa67601332ee7eea663e4e58a76b0706c7eeff46acf992618e820c2c76e1696a6fabc17686dd4e73f5b49df5cedb0b807d8c1da21b506c2895054d7c0e85ad93e02b7be9d3fa2ef0350865d23b2b07f525c7625ffa62e11a808f9b8abc20373ed739c8373d6154bb1d38ed5f046f0bf9cdea52ee2410a04822a03c130658c130f6fea02e8d066f7d07d671dd311801b9377596b828f1dc1f4f01883fa438ebf8a6ccd9d4273f5604538781ecd5c007f67c8290d1d58c344e0389a5f0fb188b2fb7ab6886447dad17bc680a2209ee0ce3daf19537871a697f1b2affebd698890598d282a9be3a017c5b55d783e16bc26df6b7dc091ec22e30c8e21fa9a3aefcfd5a1888dc7170f00563c4d4e38d6263df69b12ff2fb4f3ac148d4328fec73d96164cd217909876c6f94849166be573c", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 21981127, 1213357, 1604210, 609031, 1167822, 239628, 396560, 334262, 1293, 1582, 480\n ], \n \"k_image\": \"7d2c7eb8ca44eab409582cc15a23fab28441b89177cde8344dca79ae5f28e8f4\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26626268, 251850, 427635, 138141, 3958, 43444, 20264, 14068, 4684, 8113, 4733\n ], \n \"k_image\": \"7a1cad147be3baa06c785162d0fdbf1ddb540728de0ba6ba218e90c0ee756e99\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"6c935f5811e26e0660b06bc330fe4befb38fa279df96a11881c39b61e82f10af\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"a89fe7d8ba9957522329b5eb2b7a883c6c6e5f7576824272021ebe71b835d0b6\"\n }\n }\n ], \n \"extra\": [ 1, 40, 123, 107, 46, 30, 21, 99, 192, 126, 239, 247, 79, 48, 214, 67, 214, 75, 20, 150, 160, 247, 69, 22, 107, 219, 104, 178, 223, 157, 22, 85, 89, 2, 9, 1, 140, 172, 28, 63, 27, 9, 164, 247\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 15060000, \n \"ecdhInfo\": [ {\n \"amount\": \"a284543bb7ef42f7\"\n }, {\n \"amount\": \"a0bd8546f29a79ad\"\n }], \n \"outPk\": [ \"9c3025905fa967952818704d1ab4259ed1941d099d0275f565986010e6365f84\", \"183cd330853d19a381af5433569add060f2f0c34d6a1df79bbe6d53302d74850\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"cfc71f71bf487962458911499ebb09001c7171a003adb99c53a095a14f952dac\", \n \"S\": \"fd66291da7b8fdcc9bdc86a5e51050bc4a6b2a0fa3ea36c3dddceb160aea1862\", \n \"T1\": \"d8a89e1cb1f3fdfe1a3c95e4bdda05cf2f78101883d8d3375b58e685803ceec5\", \n \"T2\": \"b007d9783e73fc2ebdb6d647c047b2886dae5470d607ab00b84cd304074dea2f\", \n \"taux\": \"b4534fd999c326777c0b5dc0c533b139212ad41a97243f5c1138e34493211e07\", \n \"mu\": \"5b0bc07282b16612b6f67f0ae7f3dd9f2460368307a979dcdf9fc8cf98e32601\", \n \"L\": [ \"b0d6537f125cec64234c6803dd8cfa5889109c992fa823adaf027d0643e1dc28\", \"487f4d2ffba9f882d77a1ca5c3055d8d18d290f6e0ad0dba6a226739d9b5ac0b\", \"424b81d9d38c6bed8080edccbd99dbea6f8f1fd60ff0f3b892a0ff232c08e68c\", \"99005673edd5b10f9dc979a14dec0c9831ac49d6dee03d9968b42d9a47028135\", \"fe4379cc2448d814bea38d8a3bc2180e5f008006b003b1f84c046d0b4480788b\", \"21f5e2b1661e930fe1fb33a59d80448669932cc0a12d542b23c1c36732d5202f\", \"09d7dbb8dbbc5feabc03e6a49930a4a72864b0052428da284d65684f0097090e\"\n ], \n \"R\": [ \"11b9dcc24618348eebcb0219f1eaed35492ba96523df65f760ec5603306b4a2d\", \"dccff6922761b4261ec0dd605e936091a406f6d948e3b4ef0a73524f2de5b352\", \"8b8bdb3b3f448046031ab7caec103dcef6ded62ab8a78cc9efaa79b0d8736dc9\", \"0a04b564e1a2e1f8bc6bb0a3ec11e857dba743287f9901e2e1415d10d60c3f23\", \"a1aa51f714159e996758f6242b1528a0774f235d67c438182971a98748313b44\", \"c54e8df65b31683f499b4052f0bcca6e4c4f294154cf78cb1e03f544e4a28e49\", \"c92356ea75ec92311890b45f7b4f829c46ba762f021d58d46a3abfbe762431ca\"\n ], \n \"a\": \"c0ba1eda9500139208d79241b414acdf674eaaae05b796113b04e451b897190b\", \n \"b\": \"c72ef0cee133e4017c175399fe2b758e45fa25641d6c6a5ffa3df69502e1a908\", \n \"t\": \"5b85cfb442dcf981f1fb243d917fd5da5e3d23babe76cba63c19360ecda4e502\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"f982fbda7c6f9640533fe05419722d6e0ff0d33ec577f7ff5b2904da5bab920b\", \"e2153585b49e1032b8d6d68e557b0cdde47ef05cfef3a6333a5aa7ec6b78050d\", \"99d28e79be92f1ab09f4542ff0c37c48332310927c40f3b73b7afdf571e19e03\", \"b498141f985f5e60d0204769cba0eb098822771ff6970c81b4c26da3a02b9b08\", \"06e06c455983e813f115ca2b85b9c84fde90797898457bc4c101a56c844d2e08\", \"c794eacf79645b88e4d4798888b703ba3d2fef971a338a4e10989921e093e403\", \"220dd486347960710cbc2fd938a7e75f9a8f68f5bfcd488b3dd14fe1f467750b\", \"a7dacb9f32ab353d261b02ec0607dcdf769aba13aba4eea0f57b7eac27f35500\", \"1d0aa84f60a86e342b4e192725f8d827ed53e3470ff3d19aebf2b4d927334b0b\", \"42ac60e82000cf247dd90dcc9cf3b19e62fe8ce1afeb9061705dc3a1cfd1b10a\", \"97d16b69e39c8bf691ed7784d79b3a36f22205ee47d8817e5f6808be9da2dc0a\"], \n \"c1\": \"94c1462c11d4066291d49361a65a236d82c512d66b960d2356a15e008c328d06\", \n \"D\": \"05180c4820d1355398ecd27729e3ca14a2a21aed2837c09d327b5fac9da18ca3\"\n }, {\n \"s\": [ \"eca68f219cdb807cd577975252c3fcfa47290f38eeaf89b61f0d59ac4f4a650a\", \"c4d237296a1dd80310c4fc72e13ae075315dd0d4c7e8fb6ce01fb67d9504990b\", \"3eb2a83c292abf97b590ec7a838e6133eb088684ab23dc79e83c7b35f3066e06\", \"1f0683ae670080e47c52352fa1361415e2ad0238562a3f3bb2860e99acca320d\", \"47d21e01085ed25d74b85fe8f96418e098aa766f05cd31e10bcaaaa083a14b0d\", \"14cbb447af86aecb70ecc95fc3d9960305aa67601332ee7eea663e4e58a76b07\", \"06c7eeff46acf992618e820c2c76e1696a6fabc17686dd4e73f5b49df5cedb0b\", \"807d8c1da21b506c2895054d7c0e85ad93e02b7be9d3fa2ef0350865d23b2b07\", \"f525c7625ffa62e11a808f9b8abc20373ed739c8373d6154bb1d38ed5f046f0b\", \"f9cdea52ee2410a04822a03c130658c130f6fea02e8d066f7d07d671dd311801\", \"b9377596b828f1dc1f4f01883fa438ebf8a6ccd9d4273f5604538781ecd5c007\"], \n \"c1\": \"f67c8290d1d58c344e0389a5f0fb188b2fb7ab6886447dad17bc680a2209ee0c\", \n \"D\": \"e3daf19537871a697f1b2affebd698890598d282a9be3a017c5b55d783e16bc2\"\n }], \n \"pseudoOuts\": [ \"6df6b7dc091ec22e30c8e21fa9a3aefcfd5a1888dc7170f00563c4d4e38d6263\", \"df69b12ff2fb4f3ac148d4328fec73d96164cd217909876c6f94849166be573c\"]\n }\n}", + "weight": 1967 + } + ], + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_transaction_pool_stats.json b/tests/data/test_jsonrpcdaemon/test_get_transaction_pool_stats.json new file mode 100644 index 0000000..9b3e076 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_transaction_pool_stats.json @@ -0,0 +1,62 @@ +{ + "credits": 0, + "pool_stats": { + "bytes_max": 17922, + "bytes_med": 1967, + "bytes_min": 1452, + "bytes_total": 75438, + "fee_total": 586900000, + "histo": [ + { + "bytes": 3419, + "txs": 2 + }, + { + "bytes": 3423, + "txs": 2 + }, + { + "bytes": 1455, + "txs": 1 + }, + { + "bytes": 14851, + "txs": 1 + }, + { + "bytes": 0, + "txs": 0 + }, + { + "bytes": 0, + "txs": 0 + }, + { + "bytes": 22776, + "txs": 5 + }, + { + "bytes": 0, + "txs": 0 + }, + { + "bytes": 0, + "txs": 0 + }, + { + "bytes": 29514, + "txs": 6 + } + ], + "histo_98pc": 0, + "num_10m": 0, + "num_double_spends": 0, + "num_failing": 0, + "num_not_relayed": 0, + "oldest": 1613865632, + "txs_total": 17 + }, + "status": "OK", + "top_hash": "", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_get_transactions.json b/tests/data/test_jsonrpcdaemon/test_get_transactions.json new file mode 100644 index 0000000..b57a0f7 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_get_transactions.json @@ -0,0 +1,44 @@ +{ + "credits": 0, + "status": "OK", + "top_hash": "", + "txs": [ + { + "as_hex": "02000102000bbdef820aa8e5f901a3cc79a337b5d601aadb01af55fb44d90b8f0c850bda856b62f04c77bf46f46954b8caa82097b9386b0a501277262c68601ed917ac020002d4871f51832c1951212b3d87395a8df5594e927588221e665a018c098968cc8b000262d52033f1a3c921f1db56eca9b5dd50f36ecf76e22e67cc694fb7c214a609ef2c0164d167ad3d6f762414567f5812585fe7f48d3400cd51d999b020899658526567020901795c32b0b5ba9ce30580cfe81a73e3d349bd53dfa8fa66a93993f6921ff0457386671f45ef33760947513b71ec6398ff0e2ebb5edde433e452b9035112714a290806bedd15cd5293ea33be5bec57e983042840d75f66b7ca31c599f4ca0179a0ea918ad50e7e2d10784dffb56eeb39d4c92236c4904c1ecebd5b90ad6b797f9bace3566394d8a2558232b8f8262317dcc3da8038bc46119eb891371d71f940e15801c6ddf29ddf034c0e277ce87d4343cb821fece9c74b1e04ecec914c34c5b7bb518042b1ca36de80e451aca0c44d93298d4a4ec31a2a1aa8b5b437a6aab043ed66a681ba1f5f7773fa140176ddcdb2a0e7c9ae3163094671bf348d5504bc2b168891c1a599ce00acfe3a430c9c58370fe53b96a4d64155b03b5f30ee0307f95bde576a409f86100e2bcfe81d19d2407134310dce6ff953f668e810d48f12f3fd61b6c0f00819a18b75ae762b03dd97ba40ffc5a791318bf019f989e85f09385b4b9b74c8500321fb918e13f3bbd0a2fdf5749318f152e2a0f994f11b848e0157e0b3c44afab6653ef0815ad1e0d76ba1141d5abb61f8b078a57413d3374b3aa78fbea4de0604d470a12a21da6fea3c765e9ddec5d50b8f76f079f9c61c17b25822612418444181adf9e334a695aaabec779edf8842dbdbae99461c608dc0096113d8da040c3b5bd94dc796aa1daaa740839fd0f4363fa60b8c3e84fddc43075ae595d323dc7cff3db06df16d2eb08bdceca623de357e6cfd59deedcba29a203bbbbaadcc18bdd1ce03ba2d1bd16bc5e666b8006b473f339841199c5c183c5b78b420bd896cd50b2aa7b9f9fcba3615abe0f734c830320a8e9830976bbcae9a8e77676c4a3d944a3dca84fed10d242b12da93e9e37be272a933b45b23b8f4c20c8dc6bc3f0d56878639b7900f505e6060806939e9f7f417fd10965fc564c7f00893b920b6c32ff2e546dd40ec4414a110b052e97d3d74255190c0032f0826f87f155779e21e9b5b6a9300d6a2bde804ec0e107cde3f600ab5572cdda09645147cbbfcbf4c3681cb6965770ebb2b298151c354e45aab0e1ab77d414a30362a0091230d667e4ac44f5448cdf319b170c92f20d8c44b620f3b4517328bf4ece003dba9db9a71d0531ddd329adbcc4f6c408caeaebabe477bc1084f1da40cc4ca03e7ecc5f173167accf433667b9d3b61fdfd8cfe3498951e8912d6ef9a79401e0913b53dc6a14a8e117d053f82020e808b45e15b85d7102d1ccc87739c22124b058b2ab71e67f71598bf2b43813fb408df5ecafb1ca6c9761256958b017d7ab00d4a0a3fdb9ed61908d6559b853d254d86bd50fd85b349a8a9c5386850e4b9ad0984eed4614a896488fcb1b63cf795a56c12425dfbfe19ee09ac4375e6eb220e0ff2254d80d1f9fb865d5b176003779f5064ae0949aee694ac89df0fee4d1f3104d8bf76b06773b27c6ca86e69fb94146ca082a76af02d3e76c6e635fc3bb524084f89e8428a61207a4660e9c666e3e74762a62330d56753ad8fa7cf1267f5490c3ff7596b99bdda95e1bd409107ec45e09a0650f0a8c32dfddfbca2000602c705427b0fb904ef582e435fef3de34b6a3a07a67031fea098a28695cce2908f230e80cadb40036b6da75aef391ce13231674edb807af5e04f686027cae475274007b85ff58b13527f6b1125438e734ac8a1206255a332824004a1a2de925584140398089f34018fce44f334f3b283e58900ffa58f7c2a63641f7d4d946fb44e2b18f4ce36baf1b06c026e4055dadb7b06a239a003ba571528a0f16f0f1dd4cbd730", + "as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 21018557, 4092584, 1992227, 7075, 27445, 28074, 10927, 8827, 1497, 1551, 1413\n ], \n \"k_image\": \"da856b62f04c77bf46f46954b8caa82097b9386b0a501277262c68601ed917ac\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"d4871f51832c1951212b3d87395a8df5594e927588221e665a018c098968cc8b\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"62d52033f1a3c921f1db56eca9b5dd50f36ecf76e22e67cc694fb7c214a609ef\"\n }\n }\n ], \n \"extra\": [ 1, 100, 209, 103, 173, 61, 111, 118, 36, 20, 86, 127, 88, 18, 88, 95, 231, 244, 141, 52, 0, 205, 81, 217, 153, 176, 32, 137, 150, 88, 82, 101, 103, 2, 9, 1, 121, 92, 50, 176, 181, 186, 156, 227\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 56240000, \n \"ecdhInfo\": [ {\n \"amount\": \"73e3d349bd53dfa8\"\n }, {\n \"amount\": \"fa66a93993f6921f\"\n }], \n \"outPk\": [ \"f0457386671f45ef33760947513b71ec6398ff0e2ebb5edde433e452b9035112\", \"714a290806bedd15cd5293ea33be5bec57e983042840d75f66b7ca31c599f4ca\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"79a0ea918ad50e7e2d10784dffb56eeb39d4c92236c4904c1ecebd5b90ad6b79\", \n \"S\": \"7f9bace3566394d8a2558232b8f8262317dcc3da8038bc46119eb891371d71f9\", \n \"T1\": \"40e15801c6ddf29ddf034c0e277ce87d4343cb821fece9c74b1e04ecec914c34\", \n \"T2\": \"c5b7bb518042b1ca36de80e451aca0c44d93298d4a4ec31a2a1aa8b5b437a6aa\", \n \"taux\": \"b043ed66a681ba1f5f7773fa140176ddcdb2a0e7c9ae3163094671bf348d5504\", \n \"mu\": \"bc2b168891c1a599ce00acfe3a430c9c58370fe53b96a4d64155b03b5f30ee03\", \n \"L\": [ \"f95bde576a409f86100e2bcfe81d19d2407134310dce6ff953f668e810d48f12\", \"f3fd61b6c0f00819a18b75ae762b03dd97ba40ffc5a791318bf019f989e85f09\", \"385b4b9b74c8500321fb918e13f3bbd0a2fdf5749318f152e2a0f994f11b848e\", \"0157e0b3c44afab6653ef0815ad1e0d76ba1141d5abb61f8b078a57413d3374b\", \"3aa78fbea4de0604d470a12a21da6fea3c765e9ddec5d50b8f76f079f9c61c17\", \"b25822612418444181adf9e334a695aaabec779edf8842dbdbae99461c608dc0\", \"096113d8da040c3b5bd94dc796aa1daaa740839fd0f4363fa60b8c3e84fddc43\"\n ], \n \"R\": [ \"5ae595d323dc7cff3db06df16d2eb08bdceca623de357e6cfd59deedcba29a20\", \"3bbbbaadcc18bdd1ce03ba2d1bd16bc5e666b8006b473f339841199c5c183c5b\", \"78b420bd896cd50b2aa7b9f9fcba3615abe0f734c830320a8e9830976bbcae9a\", \"8e77676c4a3d944a3dca84fed10d242b12da93e9e37be272a933b45b23b8f4c2\", \"0c8dc6bc3f0d56878639b7900f505e6060806939e9f7f417fd10965fc564c7f0\", \"0893b920b6c32ff2e546dd40ec4414a110b052e97d3d74255190c0032f0826f8\", \"7f155779e21e9b5b6a9300d6a2bde804ec0e107cde3f600ab5572cdda0964514\"\n ], \n \"a\": \"7cbbfcbf4c3681cb6965770ebb2b298151c354e45aab0e1ab77d414a30362a00\", \n \"b\": \"91230d667e4ac44f5448cdf319b170c92f20d8c44b620f3b4517328bf4ece003\", \n \"t\": \"dba9db9a71d0531ddd329adbcc4f6c408caeaebabe477bc1084f1da40cc4ca03\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"e7ecc5f173167accf433667b9d3b61fdfd8cfe3498951e8912d6ef9a79401e09\", \"13b53dc6a14a8e117d053f82020e808b45e15b85d7102d1ccc87739c22124b05\", \"8b2ab71e67f71598bf2b43813fb408df5ecafb1ca6c9761256958b017d7ab00d\", \"4a0a3fdb9ed61908d6559b853d254d86bd50fd85b349a8a9c5386850e4b9ad09\", \"84eed4614a896488fcb1b63cf795a56c12425dfbfe19ee09ac4375e6eb220e0f\", \"f2254d80d1f9fb865d5b176003779f5064ae0949aee694ac89df0fee4d1f3104\", \"d8bf76b06773b27c6ca86e69fb94146ca082a76af02d3e76c6e635fc3bb52408\", \"4f89e8428a61207a4660e9c666e3e74762a62330d56753ad8fa7cf1267f5490c\", \"3ff7596b99bdda95e1bd409107ec45e09a0650f0a8c32dfddfbca2000602c705\", \"427b0fb904ef582e435fef3de34b6a3a07a67031fea098a28695cce2908f230e\", \"80cadb40036b6da75aef391ce13231674edb807af5e04f686027cae475274007\"], \n \"c1\": \"b85ff58b13527f6b1125438e734ac8a1206255a332824004a1a2de9255841403\", \n \"D\": \"98089f34018fce44f334f3b283e58900ffa58f7c2a63641f7d4d946fb44e2b18\"\n }], \n \"pseudoOuts\": [ \"f4ce36baf1b06c026e4055dadb7b06a239a003ba571528a0f16f0f1dd4cbd730\"]\n }\n}", + "block_height": 2295433, + "block_timestamp": 1613160690, + "double_spend_seen": false, + "in_pool": false, + "output_indices": [ + 27191291, + 27191292 + ], + "prunable_as_hex": "", + "prunable_hash": "b2cc0a061f56a6a0937d9ef71937a4aaa351e2196a6469f1ea8f3e25cb50201b", + "pruned_as_hex": "", + "tx_hash": "c6802ca1805784c7330e71521a318c302f88625b0eab80740cfab24af7b0cb93" + }, + { + "as_hex": "02000b02000bd2c8c50caa890d8cba0dd3c714ad8204c1ac02a002b305ff29a00eb00eea3dca7b033d26dbfa8929416a521d567a26591841e679107ce71b663e16690202000bd4a68401e2ae9f06dbc88403e1c1ff01b5f617ebf13afd22e430b411d409921adcf03a6509e651a29bebc34041caf616455cc292fa2bb643f9b08092ec59453b02000bee878f09b4e49602d8bc3d91f275fdf908a3c408d5be04c09a0addf6019c24c503ce1d3efc8a9b34487b372bb6912b4e2c59383d33e0d43189137a27f01f493e9a02000b85e0fc0bbce156c9d0149aee04e19503c6ca0198a806a53881ee01a09301e70eae51a3fbeb5e373200caa7b6cbb4e15d816c2da4d118301836f2209aaabcd4a502000badc7f90b85e02fc28014fcbe33acd50591ef039953c219af25ed127a914de852cc11000c95d5d3e65ab209b4e132f3e065e75a3704b1c7c3208df99a02000b83b6e90b80ab8601e9f502f7e80294b802bda3038809b603a205b308f21b892dac2160c42455b8fbf47e2828900e26f9b471b80c995846d520ed956410df02000bb6d4990cb3ff25d1f72492a10cf0e601aaa5028a1ac19004d501ac8802f32276b78ab2e228f862f25266e2c52e2ece1e2794010904f6dd5e988590a4fee18d02000be2ad840b8e9aa001f9b243eb8008cdd2028aee03e3ba03f42fea48e249d8176dd6075ac4b83ae6fb7b69c1887c65ea09d7cb85709d143a9e308a6221d33cbd02000b85aa4bb1ec9001cb9ce904a7e5f505fac737d5a604c3ee02efb801f4058f02f4191f81508673bacf74c6aef781066c10a465a7cfb9deb2f846492f243b8e8e967302000bf58cfd0be2d248c2e21c83bd0dba93049bd401ac2bd9ac02b7e701c27e962b13b9e44d6d26c65b26dee7fe6b2eeb00442031730f707007a64b314f05c5e06b02000bfafcba0bc0ff830184da0db6f825ddcf04feb402984cfb8201af19f904b3100c7e0535b7fd3e962d3977f595603a058ad82e92781f376c2ba198c6fc20e4910200029730581f692a0728b8efdfb3c7ae3abdfb1b0c958c4a7982df4b25fd097501aa000297f9c20373662034aab669e7578127dc4de22b4962d3f2af15c0608aa38ecf472c011d9f47f9bfaabf563f5779f24424401694587e3f29f44ed7f23d961c26700a27020901d26187582b72f26305a0baac182dced5c109c9b9b208ac9c3103fbbe9501d77aef7a011842b5b0728e4cda054ef887463f866b736bbdc8c3b3e0127515169adb51ab9ef98c2a69e5128c0de15eff9d18aff2a07975270e3c82bcbf243b01644b284605576983755f83dd835cd1ed3b814b6e97e8e086ca99514d38f78037a914bff3c42f6ea5734ebf12890c733484eae20a00c3682720dd0610a638799069384240bd07ee42bc513ba13a2acbcdffc7f8b66250b01d4700d684c9e4873ea76636030fbb232ef24d9c263db665c920746efa38c8596a05b3e018a93591d35756c5743b760df7793acaadb4e5837bbc2772a3575a6416622c87d41aca1000f9197932b1d0f7b3cc1f944d4f20c0da483caf9884101b94d84521b75356e10b072e0aacf2c40ca937115b2d74ab0525a020b96e35d4042fc2b08e13b34c945aa0ebdc39a041e0674fb4fa41b4d4e92e1516c304251d7c1ac1fca2c4c4e572b70a5e01def171237a771b3082a567bf3b3f71384b88aa20b9cd8560e712c9222b14d46c11995f5495d55101e5904536d088ae71da4092fb15432d132e1c217b40975354df569b18ef9f505c5ef1ebcc405f9ac117874be42b3378483e1c1cc53727edf17c870c06f0ae6e2e43e2a9a4b219154ac62b8d73c7ac9ef61a526ce83c355a2cc9ea831d33d2c3975ff6fda8f8fb75f3f4ff822df550a2915a139abbe257072867babc7a1c77080992dbdda8b44a0949318d787c66e3e1e8cf7ebaf86a2f534b899a6b5e38201aa3d403b3c7eb785b60190feb66573d5e33f2a278e6cbd73bc27262a377da5e5b548dbd65057070450d89c77a68941b94525f12d20eb69af428e61e2995d1e6b79056d0cf7e7320252d1aa1f6b6b80e4c441607927ecc4173232740cfff9b8c5adc75a7743efb801bdf48c73716ccde7a565318ada74138340e8760b93a0bb43c6d4cd9e3acb6c9272c13f8ca3d00fbb46074d33337c3f2db07d7e8ce6cb2a2aae7de846e6050a30492aabf161f290ded39d75cfe34496a5130b1f3c4e9b461b1fa6840ea605f9de5de69614c0020522eebf94156e6062b0c7891c9bd44f581d5e0806b6339e837c38742521068b0e2bee2b215183716e307ee4d65abde8d082b2ec34a6563906c9d6646e22786880abe357503d860bdc40a31f143583299e461b6f755bc7e306dbc1b40d28163b571cda0e6a52ee23d0f050ad05279dfb8d1a2aa068f352002f63a70b128fb7c9e37ab6d7d67d9d7d9250d90e8da0f36f8a1c1ad946afc4d3a115caba0a5d998da5f253f1274a5dd694f09c7addf0a2cda0c18af0fd4491722ae813bbabad13275358e70d840b66a8b690002dff6f7cb6a1065cd467961da306e822d42b3bc70837fbc62b7b61fa9bfa30500299331a64a62983bbce0fdf983e742a212e5a5ace13106dbba0cccfa9e950230c12c1613f4e2cb598053c920940378fa384992b502d8c12fee1340caf71d02cfe9a8ab5adb94fdf169a324d10fea117fd8256545bce8bbe9ba984a3339270d7b5d2584b1c76d8152b68a7e45081256a7d0dc2e04c55466f24c224e89294b0d22564af463256600e9bd82c3a32983feb4978826f71e996273dc8aa9d99fa200d6e54569c79a1b763b55dc32ff600cf497c3935598abf4a565c5df8b2e13cd0e13900ae7aa9a24563bdfc96b5332ea0aefda86ea53d72d2c41c58090a6f9450a32cbb432d0cffd6f7840dac7fb64a0bbe26b01f213ed5b82feb50eb777eae80989d8008cdce7285643846c8ab8501da53eefbc9de813e43283dbe32936e44c030e8ef773f0340e4f3abd4b708605d187a28840386eb35f39d20bee3fe03bc308cc93bd203534f5f2fa89499e55ab47f8940d12cb49bff092a279b3bff8bf7e0f76785ef1033066d4ca54b3436e3910d8b609aad897f86261f6a832d67362760e6613196975951a41d8ccbbb19568a52efaf233754f62d107c01e9056533fd40857c302a803aa1a02067140b5c806ffff28184d3efb0823a7ef823234e89b25084fd57eb40ecb64de3a0f305a0ead319b4397b50bc2ca8137b6e870b9e9a2f10fe3febc26aee742f3439c3e2f3194cd6ff6838079b300d62a0c3b8b5d8fce0f0c7e7917da06361491eb3aa88ea6faf5ba7e9cd510c7f5675b02b7f41fd9e4c206de741282a49e463fdc5ee95afa5855a64781066a9b1dab3f803751acc81b580a5e0137fd05f2df9f4558866629c087c9d404bb7bf8eef73d5af066b464510401fa8da5250872e29e9c5d3ce94cc35d61e6adc6c7935fcb7a56dadc37b051b608d543211a5472d11d0d3da9fa23705b39b8ecf3377713240abaa420041481fd81aa234723778272c071fb470bc6f973a8d4be4d4fc790bed52684e150e8ac56052ff287c6698590fa43dcb46d28cd687fc31de3a5564ae2b73181b9bcae75180c859ca88673e1a4000aac1088065fa98d16ff70f63b2de7c60a09feaa284d26095ac2f4ac0625076b12bd89f29c913da88dd9777e44ca2b03b1c2b5a30fedc00876b21e3f854b025b2afdb6202fdcbcf1122183ec35f26307b1c584f4f1b0540bab280fa6291c367d55cc76126ccf698b3122e3ee31d9ed3da1df4793d40abf0923343d95061e2d2b656c2291cd519c4c2fbd18e968704b44a7014c3b74e7800f505f0e803a23bd5f3a50f99027ba0469b9762bc87fb9d626692c9ec923f7b40814707877bd770f43a365707ca6c6ce8d01ea634450686aa61a7d4180f806ec0a3ad71336f21d86c322502b2f8ec85eea2187d33d8d23b64cd9748d05f10d8a0c3f419feda8c536691636e8b0f8f21231a52ada8505c4f609b6e798ebc350650b22aebda5684b1e3941ec35d4706de5c9b52fd30848bd38b39aca2d50ae287f02f2bf0825603a4793fe2e200c21cd74ffa4374cf8039eac6ffaf6da84dc744aac3a94062bbd820939ed53dc501a866bcdae62d1fa6f25c933933d97e86fc28f07281d41af4cf29dad5cb4053b9a69528daea27fdbfa3e6651c788ce248e980801e95eaefb4076b7f2467ae8bf9a6ffddd9dbcec76d338124b14b97f7e738c7506964d8cf3f84e110ee92d75f8def055ee6657266c2a27c5d7c4559bd0f6e5dc069a40f9523c154574a407d56b404fa6aa6696c5d7d33151e1575bcc5feff3c60fa63a046e58d0326b6114a8303902a0ccc5fabba8353ea252971cfa3ad8a22a0ea99203c5b3992cfd42a25bf0c49b9dad157049464912c310dd8c3c28e919de0118479cd2a60cbc635485e6b8676bd5da91c2e418603b9de7e32def748a52b60d39a228535a13b141115fa65ba1d959e4488aff80a76540237836389f61262f03109ed54940ad67ced0a45e834a2b4427c3e2622b4c5bba17c5b2137d0bfe8001000783522c6e9d43258cca7f5990c0cb2288c9b3a76a7c19eb06c57cf35a680c8fca20b1298e1f4fd6a427d5c7cbb6a58f84dbb409334f4d7a96d35f6d3db00f04d109faae134665f47b2e8b4369a189fda46088171fd4b8dea527aa7e2035d4dc067dc6eeac4ac84f0058a7e72307bdcf7f3e32671338388d553ba27c8abb0ebd8071bdd3874712c8c45eb449db51292a19d35815095e76495af4ceb71e9b058c357afc02bd42b4e38e7d4a040cd9eb78dd8b83a8c1e6e7116c6c1a8d2bd508d01f3ec72e04ace4da058140ed045b2fa1cc504aa5a5ba47795edd97481ace0242e4dc6f59b7f0bef9b9dd2b4b3a4b39d61b5e6f719bbd73889e4fb6d07d3708b7ec13af76a556e12d8dd51ab5687d8d45a28509515422ef8e9a5da5dc3b1409d775e493a3e2461e72181cd6b3d557de2a912c297c4ffc1124493815cb59d603c51481a2446b6ea12ba7ab8d0d51d534721ada976bccac4a157ee877eeea570747815398cb1cfdfe854ab8596945095027cea8a6cca0d463328adcebfae57f01cc7f5f371493ef1cc2412fb8876cc0ac0086608640f16b664a4da0023409a801ba5217d6c67a4717e1f0105ba4b0654aa820518a9d9f98cacf119d12ff651f0a43cdb914f638df52e0b12bcd4ad4457ca3f88d323f9301a06d3f3f5601ec0a0c4556502357b6a444e7508bdaa33a57d941e87b32110d421be185acfd6f4e739e716389d2c734408df7f4f46c6c48ce70b2c2f7deaa8f8d8a0df4035fd72767008ad80a9b5b00c3eb629c3aca2cd5d85624c102738e8d00642d98a83ee434d00d82ba38ab7190a7ad44d17781e788552983412d564dded006a810a18cd15a610c1ddaef5a464b5ccde5a4d1e1d78a9c875d09f04984508df99a1df0fa07526505e2cc9905145251f9598d7689bffbe90d9812e837b123e10226f33d7b2433ae0fd16d3c04260b2284ce6fb40373868d68863513d886918515d0f224011b81e60341ed52112a816c8edcc63d27a813a785905b87c17906667ac9d9178291e8a209262983b736381e03f6119bab87f1f570de35466f436e00555e03d89ca415ab09afcca572586fee9afc04844d428b900186e07f5991237df4c05501dea9c3b30916ce0eee462160bf5305fdbd8d40926bea3f9bc5bfe6bbb9ff376ccb3ead4c04caea03fda281589cbd3c1afa3349c8e9a29bbff069ebcec21cf36455a5f7c101ac0d3c819dcf90aafea5b0bba2b781bb9c4525f6167696ab92fa9a4f5a9bd20ff2852659182d588942aa00b117fe48a092cf75c3d4b0943566ea0d4c3c05f776ef72ff0879d93bc88f819d3d4cfb473339492f6c079fd6d575c6ffcd3f11860b5198c1ee11bcf806c4e4ea4cc766ae7f7de3ab8d22202465e9f791ff22ac7504d3b7c272d9c1ea6418bfcf643a33cdc6d9851c023e2d070c910797fc744a890c216d85bbdaa09f6626b0cc0dfb85ee5cd1bd52c011f489f05595282c40cb3d072efa54daec88e67f5ca80b0615fc32e0f9a35c946a764000d7f4d589395125072414fcb89f03cbef5ba274de087aa99cbbe0c29f4ba41b53f364ed55ad91b00dc9f14bce4b4201a6c081348f679267a50a885553fd9182c6db59d84281ae0a015bea38d62f63ae43a7830a85c0e5cbd85c4a9c230e58aa9fe16e7d6e5b2a100e1b0d5f3c319bc93a24165f5e7366b03589011b5244837a24e44f07da11bd3205c0bb3084012b449fb1ea4792812c8d46ecce8de53817bc9b408173681397860edf6c2075906e656780969da5630cb7ec1bf8e88cc5fc66c0e6281cb8becf760f2a54a60aa2c2d0be087a404bb6416f918bd9135d935830c04848257ed2de70096ecf597dfb2b94c0df996785e2c7e3f9ad6f609542411b82a5ec16b7ee1c9d7c53aa36886a8e9baa0744ea79a30992b2fb448798cc5549228c29380e26594a05f20b086813e981c4492214122cc3d83aaa682137b3b39b0c233d4a8e999b630f7580147fd23f35bac08cd30121f6232ec736a2b9dfabf292343b1be5725d420d66e48167c139d3ddbcd25503edd2197080aaef96118165334079d0ba86c44604bd6a8c95a040118db3ae851a4a2872f23332dea052582d2f36d820f15f422606842ed02d6ccd460a4bd11ca5fae623be42c361e7ca0d5fc1921848da1b153608344dcecef75c1c147f435cdfd00590be7ed26a6d60de075f1abc049eb06c85020595847106ff10a53e4ebdb2ac134914e10fc9e60443233b7f3e356be61e640f8bf6e363ed68e56903ff6c00f9e208c6644ee5385580a349555fca8aa9135505487ea93647be2a0a6e5bb439eb8619ee65ced7ea86add8dc733b530e8839090e3a43c4dcc439e3d083cdd5a823464583f59275e0003339bd4a6c6c05b319310c9aec6cf03d696eabd293fdb1fe3c790fd91efecd349df068a3aa06a4b7ed3e00e7074c04582d8963af509f2ca34344d13f1099650122128f7e0270fe5db0abb04511b1d99c2ed9513b25bb659733f84be4468265fea021e07627dee2f49eef023f66d45bea98fc0448eb68fcbf3bd41bd0daa0302ef64b81793dce003d2dfd079d0de97767eb4427e403d8f9d305796327e5c6cb9559de627ac55fad2c848c0013eefdab6b1ea9ae118410b381216dbba51865cd24d97967f2c76e43225216092f542fe9c096569fbe430141a135206b77f2a59392559c57f1d82d1acb4e490b6a0f4f620dfbc30c3b90bee41b21369172e90f20a024c4c45f474ad8d58ed2015bb6023bc398e476e236d0785132d63858324e0bbe541fdfdb9353546c5fe204b4ea5390de28f17a0c98840fa6fb0964ceac1b9f4a7fb5875c57909c0f11700b2baea279c5d3a6b06dbc14d52adc63ca391507cf92af5af44e3c3e54a3b29d0b299fd884f98bf512cc25436f87f76901e74b59ba31072b94d5b68ce931f5b8048ce02436ec3398d467575a71e43c31581cb6d74484f128cd164bba1a0661c004275e53f9a974ecccb3336223fdf209adbdabac661636a82887a05e9633adb60755d38983e9e0d1c60a8fdc11c3de597f9fda46777be7482c66198ae332e33ac36e232b38f92173cca99f34f7710ae775aebe4c5b6025f1809a0293238e91d7049da78ea0c96b4b011a3dd7a043a9fe213ec20578aca0ee23203d3cf7d0d7e903a7af0d4532dc8183a89385489a92caa605a620531ce41bde25e112661bcd1602266c06b69fd0cf581961b219ad1139c664ee9cb506d6d3d9cece26b78c78250f9e0f21bb030309e6000eab8be2e9dbffd4723da9ec5e67483f0e966adab5bd0358cbc06e9f2b5f5ef35ebbae16b73df007543bd63a4d0482c3542f7260e45f0990163d7899253e1af34673fb27d97b9c566482dfd6b00018933f1f387899b408b71952929c2a78e7939345f7c19a08841713a76f11a6cc1b9a261f3c77286b0dfd1e73b6ed65646045eb0b1a3b0f3150efc0ccc329ac8e5c2caf88183f542702fa2a27d0d878ef4b4677fc5c90d2e61f413337595e4ce6cfa51c11af6324080c11975749194d73ba0e04eb3fd7f577cae58c7e0b13b70c9df1b428ba82dedb0f0e1ebd92a6f123b289657bfd3962d91f97a12fdb6f94e1c43ffdd1f6864a4d083904356f0478a96e52e78db507c070241262b15430546fbd4ae5e1275dfb5d7b7ec939d5fa5df5c9ebbf813acbb4f52e2c0f109617321f1139b3d7c043fc0e0a364240e90d1c89d0519c69c06685115881b61deed25dcd7e5faf5c5961baf208b216a06f619e1ec1a49c146ded1e66b3e04c64c41108cc24d29662f8120bda0e23fc9d4ee7ce7f53a9c207681a372a48a12f4ae978e13549482ca30dc0d78f0f88a32035a539cd110c6761d8023fccd17f05c7e636616797ec6bb4371ade7f010b9f0844f20c6d5a2ebd74b13258f10e3c29eb7c7a62785407691684f4e69108c091de739e6f95bdb7b89d584e6960424efea380e65c57a75d83e869c6ffcd0be94555312e5f138ae3d9eed0f5c58d47502bea39dc7d9ade860624b8319f9a02a74676776a12414fe369acd379231ce3e042f7fc80f14a9735a0b4e9f05b9a0b5a61a3f557197aaee04e1bb67787487fd4e85141ada3de903bc75f0763a43805d57f945548075885f0cf75a92d9679ad24c02aa72d8b5768309b6054c849020928bd0f1bda2801d5a6fbb6af2ac06e53e458392276335f81858d3aeabc65ef09204bc90ffdd744a7dc53dd6d9cdd6bb1b9b3888a625134e5f4434d2b470b3237867a699747a08b1daa4cc8a73220636e3c2162393dd01d04cbb06e0dc20df9b71880b92e43a60d164e9203aa40663bcda410439713bf766813c9534785246fcda4ad2632b29bb41d965ba84d530157c5d57de6d729a6d97abc2703c742dc844994b815d1cc3e20c364d22e6a838bbfbc85273c1d72f805945faf078af6e7020a6f8a0b2bda76f35e275c973933cd2fef4e45390dc25c1aba9236860abf45521315e5631f9dd1e226195434d1e8fcc36bdb30d0caccab1155580a584308d5e4f70f1b8efd37eedfbe7e0e26133728ec3238c9208265198529b0d587d55a337e10c58028efa15f31bb0a19472e149d0b7ee984fb0b3d1adf4769e059342422fa9f44d0b98dbd1071331d5290a13d74ff182b1b04f50fea9c2c6bc7f0d4b967ed9b8205a9ae1778360103d677acb014878ac32635669af9f65e5cfe35505913976e79831c69901ad519d417a8bd6dab1d8c8c7e35739d9e72ca74c1c2493a13ff4b", + "as_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26305618, 214186, 220428, 336851, 65837, 38465, 288, 691, 5375, 1824, 1840\n ], \n \"k_image\": \"ea3dca7b033d26dbfa8929416a521d567a26591841e679107ce71b663e166902\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2167636, 13096802, 6366299, 4186337, 391989, 964843, 4477, 6244, 2228, 1236, 3346\n ], \n \"k_image\": \"dcf03a6509e651a29bebc34041caf616455cc292fa2bb643f9b08092ec59453b\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 19121134, 4567604, 1007192, 1931537, 146685, 139811, 73557, 167232, 31581, 4636, 453\n ], \n \"k_image\": \"ce1d3efc8a9b34487b372bb6912b4e2c59383d33e0d43189137a27f01f493e9a\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25112581, 1421500, 337993, 79642, 51937, 25926, 103448, 7205, 30465, 18848, 1895\n ], \n \"k_image\": \"ae51a3fbeb5e373200caa7b6cbb4e15d816c2da4d118301836f2209aaabcd4a5\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25060269, 782341, 327746, 843644, 92844, 63377, 10649, 3266, 4783, 2413, 122\n ], \n \"k_image\": \"914de852cc11000c95d5d3e65ab209b4e132f3e065e75a3704b1c7c3208df99a\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 24795907, 2200960, 47849, 46199, 39956, 53693, 1160, 438, 674, 1075, 3570\n ], \n \"k_image\": \"892dac2160c42455b8fbf47e2828900e26f9b471b80c995846d520ed956410df\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25586230, 622515, 605137, 200850, 29552, 37546, 3338, 67649, 213, 33836, 4467\n ], \n \"k_image\": \"76b78ab2e228f862f25266e2c52e2ece1e2794010904f6dd5e988590a4fee18d\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 23140066, 2624782, 1104249, 131179, 43341, 63242, 56675, 6132, 9322, 9442, 3032\n ], \n \"k_image\": \"6dd6075ac4b83ae6fb7b69c1887c65ea09d7cb85709d143a9e308a6221d33cbd\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 1234181, 2373169, 10112587, 12415655, 910330, 70485, 46915, 23663, 756, 271, 3316\n ], \n \"k_image\": \"1f81508673bacf74c6aef781066c10a465a7cfb9deb2f846492f243b8e8e9673\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25118325, 1190242, 471362, 220803, 68026, 27163, 5548, 38489, 29623, 16194, 5526\n ], \n \"k_image\": \"13b9e44d6d26c65b26dee7fe6b2eeb00442031730f707007a64b314f05c5e06b\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 24034938, 2162624, 224516, 621622, 75741, 39550, 9752, 16763, 3247, 633, 2099\n ], \n \"k_image\": \"0c7e0535b7fd3e962d3977f595603a058ad82e92781f376c2ba198c6fc20e491\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"9730581f692a0728b8efdfb3c7ae3abdfb1b0c958c4a7982df4b25fd097501aa\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"97f9c20373662034aab669e7578127dc4de22b4962d3f2af15c0608aa38ecf47\"\n }\n }\n ], \n \"extra\": [ 1, 29, 159, 71, 249, 191, 170, 191, 86, 63, 87, 121, 242, 68, 36, 64, 22, 148, 88, 126, 63, 41, 244, 78, 215, 242, 61, 150, 28, 38, 112, 10, 39, 2, 9, 1, 210, 97, 135, 88, 43, 114, 242, 99\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 51060000, \n \"ecdhInfo\": [ {\n \"amount\": \"2dced5c109c9b9b2\"\n }, {\n \"amount\": \"08ac9c3103fbbe95\"\n }], \n \"outPk\": [ \"01d77aef7a011842b5b0728e4cda054ef887463f866b736bbdc8c3b3e0127515\", \"169adb51ab9ef98c2a69e5128c0de15eff9d18aff2a07975270e3c82bcbf243b\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"644b284605576983755f83dd835cd1ed3b814b6e97e8e086ca99514d38f78037\", \n \"S\": \"a914bff3c42f6ea5734ebf12890c733484eae20a00c3682720dd0610a6387990\", \n \"T1\": \"69384240bd07ee42bc513ba13a2acbcdffc7f8b66250b01d4700d684c9e4873e\", \n \"T2\": \"a76636030fbb232ef24d9c263db665c920746efa38c8596a05b3e018a93591d3\", \n \"taux\": \"5756c5743b760df7793acaadb4e5837bbc2772a3575a6416622c87d41aca1000\", \n \"mu\": \"f9197932b1d0f7b3cc1f944d4f20c0da483caf9884101b94d84521b75356e10b\", \n \"L\": [ \"2e0aacf2c40ca937115b2d74ab0525a020b96e35d4042fc2b08e13b34c945aa0\", \"ebdc39a041e0674fb4fa41b4d4e92e1516c304251d7c1ac1fca2c4c4e572b70a\", \"5e01def171237a771b3082a567bf3b3f71384b88aa20b9cd8560e712c9222b14\", \"d46c11995f5495d55101e5904536d088ae71da4092fb15432d132e1c217b4097\", \"5354df569b18ef9f505c5ef1ebcc405f9ac117874be42b3378483e1c1cc53727\", \"edf17c870c06f0ae6e2e43e2a9a4b219154ac62b8d73c7ac9ef61a526ce83c35\", \"5a2cc9ea831d33d2c3975ff6fda8f8fb75f3f4ff822df550a2915a139abbe257\"\n ], \n \"R\": [ \"2867babc7a1c77080992dbdda8b44a0949318d787c66e3e1e8cf7ebaf86a2f53\", \"4b899a6b5e38201aa3d403b3c7eb785b60190feb66573d5e33f2a278e6cbd73b\", \"c27262a377da5e5b548dbd65057070450d89c77a68941b94525f12d20eb69af4\", \"28e61e2995d1e6b79056d0cf7e7320252d1aa1f6b6b80e4c441607927ecc4173\", \"232740cfff9b8c5adc75a7743efb801bdf48c73716ccde7a565318ada7413834\", \"0e8760b93a0bb43c6d4cd9e3acb6c9272c13f8ca3d00fbb46074d33337c3f2db\", \"07d7e8ce6cb2a2aae7de846e6050a30492aabf161f290ded39d75cfe34496a51\"\n ], \n \"a\": \"30b1f3c4e9b461b1fa6840ea605f9de5de69614c0020522eebf94156e6062b0c\", \n \"b\": \"7891c9bd44f581d5e0806b6339e837c38742521068b0e2bee2b215183716e307\", \n \"t\": \"ee4d65abde8d082b2ec34a6563906c9d6646e22786880abe357503d860bdc40a\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"31f143583299e461b6f755bc7e306dbc1b40d28163b571cda0e6a52ee23d0f05\", \"0ad05279dfb8d1a2aa068f352002f63a70b128fb7c9e37ab6d7d67d9d7d9250d\", \"90e8da0f36f8a1c1ad946afc4d3a115caba0a5d998da5f253f1274a5dd694f09\", \"c7addf0a2cda0c18af0fd4491722ae813bbabad13275358e70d840b66a8b6900\", \"02dff6f7cb6a1065cd467961da306e822d42b3bc70837fbc62b7b61fa9bfa305\", \"00299331a64a62983bbce0fdf983e742a212e5a5ace13106dbba0cccfa9e9502\", \"30c12c1613f4e2cb598053c920940378fa384992b502d8c12fee1340caf71d02\", \"cfe9a8ab5adb94fdf169a324d10fea117fd8256545bce8bbe9ba984a3339270d\", \"7b5d2584b1c76d8152b68a7e45081256a7d0dc2e04c55466f24c224e89294b0d\", \"22564af463256600e9bd82c3a32983feb4978826f71e996273dc8aa9d99fa200\", \"d6e54569c79a1b763b55dc32ff600cf497c3935598abf4a565c5df8b2e13cd0e\"], \n \"c1\": \"13900ae7aa9a24563bdfc96b5332ea0aefda86ea53d72d2c41c58090a6f9450a\", \n \"D\": \"32cbb432d0cffd6f7840dac7fb64a0bbe26b01f213ed5b82feb50eb777eae809\"\n }, {\n \"s\": [ \"89d8008cdce7285643846c8ab8501da53eefbc9de813e43283dbe32936e44c03\", \"0e8ef773f0340e4f3abd4b708605d187a28840386eb35f39d20bee3fe03bc308\", \"cc93bd203534f5f2fa89499e55ab47f8940d12cb49bff092a279b3bff8bf7e0f\", \"76785ef1033066d4ca54b3436e3910d8b609aad897f86261f6a832d67362760e\", \"6613196975951a41d8ccbbb19568a52efaf233754f62d107c01e9056533fd408\", \"57c302a803aa1a02067140b5c806ffff28184d3efb0823a7ef823234e89b2508\", \"4fd57eb40ecb64de3a0f305a0ead319b4397b50bc2ca8137b6e870b9e9a2f10f\", \"e3febc26aee742f3439c3e2f3194cd6ff6838079b300d62a0c3b8b5d8fce0f0c\", \"7e7917da06361491eb3aa88ea6faf5ba7e9cd510c7f5675b02b7f41fd9e4c206\", \"de741282a49e463fdc5ee95afa5855a64781066a9b1dab3f803751acc81b580a\", \"5e0137fd05f2df9f4558866629c087c9d404bb7bf8eef73d5af066b464510401\"], \n \"c1\": \"fa8da5250872e29e9c5d3ce94cc35d61e6adc6c7935fcb7a56dadc37b051b608\", \n \"D\": \"d543211a5472d11d0d3da9fa23705b39b8ecf3377713240abaa420041481fd81\"\n }, {\n \"s\": [ \"aa234723778272c071fb470bc6f973a8d4be4d4fc790bed52684e150e8ac5605\", \"2ff287c6698590fa43dcb46d28cd687fc31de3a5564ae2b73181b9bcae75180c\", \"859ca88673e1a4000aac1088065fa98d16ff70f63b2de7c60a09feaa284d2609\", \"5ac2f4ac0625076b12bd89f29c913da88dd9777e44ca2b03b1c2b5a30fedc008\", \"76b21e3f854b025b2afdb6202fdcbcf1122183ec35f26307b1c584f4f1b0540b\", \"ab280fa6291c367d55cc76126ccf698b3122e3ee31d9ed3da1df4793d40abf09\", \"23343d95061e2d2b656c2291cd519c4c2fbd18e968704b44a7014c3b74e7800f\", \"505f0e803a23bd5f3a50f99027ba0469b9762bc87fb9d626692c9ec923f7b408\", \"14707877bd770f43a365707ca6c6ce8d01ea634450686aa61a7d4180f806ec0a\", \"3ad71336f21d86c322502b2f8ec85eea2187d33d8d23b64cd9748d05f10d8a0c\", \"3f419feda8c536691636e8b0f8f21231a52ada8505c4f609b6e798ebc350650b\"], \n \"c1\": \"22aebda5684b1e3941ec35d4706de5c9b52fd30848bd38b39aca2d50ae287f02\", \n \"D\": \"f2bf0825603a4793fe2e200c21cd74ffa4374cf8039eac6ffaf6da84dc744aac\"\n }, {\n \"s\": [ \"3a94062bbd820939ed53dc501a866bcdae62d1fa6f25c933933d97e86fc28f07\", \"281d41af4cf29dad5cb4053b9a69528daea27fdbfa3e6651c788ce248e980801\", \"e95eaefb4076b7f2467ae8bf9a6ffddd9dbcec76d338124b14b97f7e738c7506\", \"964d8cf3f84e110ee92d75f8def055ee6657266c2a27c5d7c4559bd0f6e5dc06\", \"9a40f9523c154574a407d56b404fa6aa6696c5d7d33151e1575bcc5feff3c60f\", \"a63a046e58d0326b6114a8303902a0ccc5fabba8353ea252971cfa3ad8a22a0e\", \"a99203c5b3992cfd42a25bf0c49b9dad157049464912c310dd8c3c28e919de01\", \"18479cd2a60cbc635485e6b8676bd5da91c2e418603b9de7e32def748a52b60d\", \"39a228535a13b141115fa65ba1d959e4488aff80a76540237836389f61262f03\", \"109ed54940ad67ced0a45e834a2b4427c3e2622b4c5bba17c5b2137d0bfe8001\", \"000783522c6e9d43258cca7f5990c0cb2288c9b3a76a7c19eb06c57cf35a680c\"], \n \"c1\": \"8fca20b1298e1f4fd6a427d5c7cbb6a58f84dbb409334f4d7a96d35f6d3db00f\", \n \"D\": \"04d109faae134665f47b2e8b4369a189fda46088171fd4b8dea527aa7e2035d4\"\n }, {\n \"s\": [ \"dc067dc6eeac4ac84f0058a7e72307bdcf7f3e32671338388d553ba27c8abb0e\", \"bd8071bdd3874712c8c45eb449db51292a19d35815095e76495af4ceb71e9b05\", \"8c357afc02bd42b4e38e7d4a040cd9eb78dd8b83a8c1e6e7116c6c1a8d2bd508\", \"d01f3ec72e04ace4da058140ed045b2fa1cc504aa5a5ba47795edd97481ace02\", \"42e4dc6f59b7f0bef9b9dd2b4b3a4b39d61b5e6f719bbd73889e4fb6d07d3708\", \"b7ec13af76a556e12d8dd51ab5687d8d45a28509515422ef8e9a5da5dc3b1409\", \"d775e493a3e2461e72181cd6b3d557de2a912c297c4ffc1124493815cb59d603\", \"c51481a2446b6ea12ba7ab8d0d51d534721ada976bccac4a157ee877eeea5707\", \"47815398cb1cfdfe854ab8596945095027cea8a6cca0d463328adcebfae57f01\", \"cc7f5f371493ef1cc2412fb8876cc0ac0086608640f16b664a4da0023409a801\", \"ba5217d6c67a4717e1f0105ba4b0654aa820518a9d9f98cacf119d12ff651f0a\"], \n \"c1\": \"43cdb914f638df52e0b12bcd4ad4457ca3f88d323f9301a06d3f3f5601ec0a0c\", \n \"D\": \"4556502357b6a444e7508bdaa33a57d941e87b32110d421be185acfd6f4e739e\"\n }, {\n \"s\": [ \"716389d2c734408df7f4f46c6c48ce70b2c2f7deaa8f8d8a0df4035fd7276700\", \"8ad80a9b5b00c3eb629c3aca2cd5d85624c102738e8d00642d98a83ee434d00d\", \"82ba38ab7190a7ad44d17781e788552983412d564dded006a810a18cd15a610c\", \"1ddaef5a464b5ccde5a4d1e1d78a9c875d09f04984508df99a1df0fa07526505\", \"e2cc9905145251f9598d7689bffbe90d9812e837b123e10226f33d7b2433ae0f\", \"d16d3c04260b2284ce6fb40373868d68863513d886918515d0f224011b81e603\", \"41ed52112a816c8edcc63d27a813a785905b87c17906667ac9d9178291e8a209\", \"262983b736381e03f6119bab87f1f570de35466f436e00555e03d89ca415ab09\", \"afcca572586fee9afc04844d428b900186e07f5991237df4c05501dea9c3b309\", \"16ce0eee462160bf5305fdbd8d40926bea3f9bc5bfe6bbb9ff376ccb3ead4c04\", \"caea03fda281589cbd3c1afa3349c8e9a29bbff069ebcec21cf36455a5f7c101\"], \n \"c1\": \"ac0d3c819dcf90aafea5b0bba2b781bb9c4525f6167696ab92fa9a4f5a9bd20f\", \n \"D\": \"f2852659182d588942aa00b117fe48a092cf75c3d4b0943566ea0d4c3c05f776\"\n }, {\n \"s\": [ \"ef72ff0879d93bc88f819d3d4cfb473339492f6c079fd6d575c6ffcd3f11860b\", \"5198c1ee11bcf806c4e4ea4cc766ae7f7de3ab8d22202465e9f791ff22ac7504\", \"d3b7c272d9c1ea6418bfcf643a33cdc6d9851c023e2d070c910797fc744a890c\", \"216d85bbdaa09f6626b0cc0dfb85ee5cd1bd52c011f489f05595282c40cb3d07\", \"2efa54daec88e67f5ca80b0615fc32e0f9a35c946a764000d7f4d58939512507\", \"2414fcb89f03cbef5ba274de087aa99cbbe0c29f4ba41b53f364ed55ad91b00d\", \"c9f14bce4b4201a6c081348f679267a50a885553fd9182c6db59d84281ae0a01\", \"5bea38d62f63ae43a7830a85c0e5cbd85c4a9c230e58aa9fe16e7d6e5b2a100e\", \"1b0d5f3c319bc93a24165f5e7366b03589011b5244837a24e44f07da11bd3205\", \"c0bb3084012b449fb1ea4792812c8d46ecce8de53817bc9b408173681397860e\", \"df6c2075906e656780969da5630cb7ec1bf8e88cc5fc66c0e6281cb8becf760f\"], \n \"c1\": \"2a54a60aa2c2d0be087a404bb6416f918bd9135d935830c04848257ed2de7009\", \n \"D\": \"6ecf597dfb2b94c0df996785e2c7e3f9ad6f609542411b82a5ec16b7ee1c9d7c\"\n }, {\n \"s\": [ \"53aa36886a8e9baa0744ea79a30992b2fb448798cc5549228c29380e26594a05\", \"f20b086813e981c4492214122cc3d83aaa682137b3b39b0c233d4a8e999b630f\", \"7580147fd23f35bac08cd30121f6232ec736a2b9dfabf292343b1be5725d420d\", \"66e48167c139d3ddbcd25503edd2197080aaef96118165334079d0ba86c44604\", \"bd6a8c95a040118db3ae851a4a2872f23332dea052582d2f36d820f15f422606\", \"842ed02d6ccd460a4bd11ca5fae623be42c361e7ca0d5fc1921848da1b153608\", \"344dcecef75c1c147f435cdfd00590be7ed26a6d60de075f1abc049eb06c8502\", \"0595847106ff10a53e4ebdb2ac134914e10fc9e60443233b7f3e356be61e640f\", \"8bf6e363ed68e56903ff6c00f9e208c6644ee5385580a349555fca8aa9135505\", \"487ea93647be2a0a6e5bb439eb8619ee65ced7ea86add8dc733b530e8839090e\", \"3a43c4dcc439e3d083cdd5a823464583f59275e0003339bd4a6c6c05b319310c\"], \n \"c1\": \"9aec6cf03d696eabd293fdb1fe3c790fd91efecd349df068a3aa06a4b7ed3e00\", \n \"D\": \"e7074c04582d8963af509f2ca34344d13f1099650122128f7e0270fe5db0abb0\"\n }, {\n \"s\": [ \"4511b1d99c2ed9513b25bb659733f84be4468265fea021e07627dee2f49eef02\", \"3f66d45bea98fc0448eb68fcbf3bd41bd0daa0302ef64b81793dce003d2dfd07\", \"9d0de97767eb4427e403d8f9d305796327e5c6cb9559de627ac55fad2c848c00\", \"13eefdab6b1ea9ae118410b381216dbba51865cd24d97967f2c76e4322521609\", \"2f542fe9c096569fbe430141a135206b77f2a59392559c57f1d82d1acb4e490b\", \"6a0f4f620dfbc30c3b90bee41b21369172e90f20a024c4c45f474ad8d58ed201\", \"5bb6023bc398e476e236d0785132d63858324e0bbe541fdfdb9353546c5fe204\", \"b4ea5390de28f17a0c98840fa6fb0964ceac1b9f4a7fb5875c57909c0f11700b\", \"2baea279c5d3a6b06dbc14d52adc63ca391507cf92af5af44e3c3e54a3b29d0b\", \"299fd884f98bf512cc25436f87f76901e74b59ba31072b94d5b68ce931f5b804\", \"8ce02436ec3398d467575a71e43c31581cb6d74484f128cd164bba1a0661c004\"], \n \"c1\": \"275e53f9a974ecccb3336223fdf209adbdabac661636a82887a05e9633adb607\", \n \"D\": \"55d38983e9e0d1c60a8fdc11c3de597f9fda46777be7482c66198ae332e33ac3\"\n }, {\n \"s\": [ \"6e232b38f92173cca99f34f7710ae775aebe4c5b6025f1809a0293238e91d704\", \"9da78ea0c96b4b011a3dd7a043a9fe213ec20578aca0ee23203d3cf7d0d7e903\", \"a7af0d4532dc8183a89385489a92caa605a620531ce41bde25e112661bcd1602\", \"266c06b69fd0cf581961b219ad1139c664ee9cb506d6d3d9cece26b78c78250f\", \"9e0f21bb030309e6000eab8be2e9dbffd4723da9ec5e67483f0e966adab5bd03\", \"58cbc06e9f2b5f5ef35ebbae16b73df007543bd63a4d0482c3542f7260e45f09\", \"90163d7899253e1af34673fb27d97b9c566482dfd6b00018933f1f387899b408\", \"b71952929c2a78e7939345f7c19a08841713a76f11a6cc1b9a261f3c77286b0d\", \"fd1e73b6ed65646045eb0b1a3b0f3150efc0ccc329ac8e5c2caf88183f542702\", \"fa2a27d0d878ef4b4677fc5c90d2e61f413337595e4ce6cfa51c11af6324080c\", \"11975749194d73ba0e04eb3fd7f577cae58c7e0b13b70c9df1b428ba82dedb0f\"], \n \"c1\": \"0e1ebd92a6f123b289657bfd3962d91f97a12fdb6f94e1c43ffdd1f6864a4d08\", \n \"D\": \"3904356f0478a96e52e78db507c070241262b15430546fbd4ae5e1275dfb5d7b\"\n }, {\n \"s\": [ \"7ec939d5fa5df5c9ebbf813acbb4f52e2c0f109617321f1139b3d7c043fc0e0a\", \"364240e90d1c89d0519c69c06685115881b61deed25dcd7e5faf5c5961baf208\", \"b216a06f619e1ec1a49c146ded1e66b3e04c64c41108cc24d29662f8120bda0e\", \"23fc9d4ee7ce7f53a9c207681a372a48a12f4ae978e13549482ca30dc0d78f0f\", \"88a32035a539cd110c6761d8023fccd17f05c7e636616797ec6bb4371ade7f01\", \"0b9f0844f20c6d5a2ebd74b13258f10e3c29eb7c7a62785407691684f4e69108\", \"c091de739e6f95bdb7b89d584e6960424efea380e65c57a75d83e869c6ffcd0b\", \"e94555312e5f138ae3d9eed0f5c58d47502bea39dc7d9ade860624b8319f9a02\", \"a74676776a12414fe369acd379231ce3e042f7fc80f14a9735a0b4e9f05b9a0b\", \"5a61a3f557197aaee04e1bb67787487fd4e85141ada3de903bc75f0763a43805\", \"d57f945548075885f0cf75a92d9679ad24c02aa72d8b5768309b6054c8490209\"], \n \"c1\": \"28bd0f1bda2801d5a6fbb6af2ac06e53e458392276335f81858d3aeabc65ef09\", \n \"D\": \"204bc90ffdd744a7dc53dd6d9cdd6bb1b9b3888a625134e5f4434d2b470b3237\"\n }], \n \"pseudoOuts\": [ \"867a699747a08b1daa4cc8a73220636e3c2162393dd01d04cbb06e0dc20df9b7\", \"1880b92e43a60d164e9203aa40663bcda410439713bf766813c9534785246fcd\", \"a4ad2632b29bb41d965ba84d530157c5d57de6d729a6d97abc2703c742dc8449\", \"94b815d1cc3e20c364d22e6a838bbfbc85273c1d72f805945faf078af6e7020a\", \"6f8a0b2bda76f35e275c973933cd2fef4e45390dc25c1aba9236860abf455213\", \"15e5631f9dd1e226195434d1e8fcc36bdb30d0caccab1155580a584308d5e4f7\", \"0f1b8efd37eedfbe7e0e26133728ec3238c9208265198529b0d587d55a337e10\", \"c58028efa15f31bb0a19472e149d0b7ee984fb0b3d1adf4769e059342422fa9f\", \"44d0b98dbd1071331d5290a13d74ff182b1b04f50fea9c2c6bc7f0d4b967ed9b\", \"8205a9ae1778360103d677acb014878ac32635669af9f65e5cfe35505913976e\", \"79831c69901ad519d417a8bd6dab1d8c8c7e35739d9e72ca74c1c2493a13ff4b\"]\n }\n}", + "double_spend_seen": false, + "in_pool": true, + "prunable_as_hex": "", + "prunable_hash": "d49c433f47702bae47050995cdbd753f599b5ff357c4cdbcb7514839471b27a0", + "pruned_as_hex": "", + "received_timestamp": 1613163040, + "relayed": true, + "tx_hash": "ae476cae3ad2b44c6c2614b9435adbe304e24c59d410fe3b4dd046a9021d66b9" + } + ], + "txs_as_hex": [ + "02000102000bbdef820aa8e5f901a3cc79a337b5d601aadb01af55fb44d90b8f0c850bda856b62f04c77bf46f46954b8caa82097b9386b0a501277262c68601ed917ac020002d4871f51832c1951212b3d87395a8df5594e927588221e665a018c098968cc8b000262d52033f1a3c921f1db56eca9b5dd50f36ecf76e22e67cc694fb7c214a609ef2c0164d167ad3d6f762414567f5812585fe7f48d3400cd51d999b020899658526567020901795c32b0b5ba9ce30580cfe81a73e3d349bd53dfa8fa66a93993f6921ff0457386671f45ef33760947513b71ec6398ff0e2ebb5edde433e452b9035112714a290806bedd15cd5293ea33be5bec57e983042840d75f66b7ca31c599f4ca0179a0ea918ad50e7e2d10784dffb56eeb39d4c92236c4904c1ecebd5b90ad6b797f9bace3566394d8a2558232b8f8262317dcc3da8038bc46119eb891371d71f940e15801c6ddf29ddf034c0e277ce87d4343cb821fece9c74b1e04ecec914c34c5b7bb518042b1ca36de80e451aca0c44d93298d4a4ec31a2a1aa8b5b437a6aab043ed66a681ba1f5f7773fa140176ddcdb2a0e7c9ae3163094671bf348d5504bc2b168891c1a599ce00acfe3a430c9c58370fe53b96a4d64155b03b5f30ee0307f95bde576a409f86100e2bcfe81d19d2407134310dce6ff953f668e810d48f12f3fd61b6c0f00819a18b75ae762b03dd97ba40ffc5a791318bf019f989e85f09385b4b9b74c8500321fb918e13f3bbd0a2fdf5749318f152e2a0f994f11b848e0157e0b3c44afab6653ef0815ad1e0d76ba1141d5abb61f8b078a57413d3374b3aa78fbea4de0604d470a12a21da6fea3c765e9ddec5d50b8f76f079f9c61c17b25822612418444181adf9e334a695aaabec779edf8842dbdbae99461c608dc0096113d8da040c3b5bd94dc796aa1daaa740839fd0f4363fa60b8c3e84fddc43075ae595d323dc7cff3db06df16d2eb08bdceca623de357e6cfd59deedcba29a203bbbbaadcc18bdd1ce03ba2d1bd16bc5e666b8006b473f339841199c5c183c5b78b420bd896cd50b2aa7b9f9fcba3615abe0f734c830320a8e9830976bbcae9a8e77676c4a3d944a3dca84fed10d242b12da93e9e37be272a933b45b23b8f4c20c8dc6bc3f0d56878639b7900f505e6060806939e9f7f417fd10965fc564c7f00893b920b6c32ff2e546dd40ec4414a110b052e97d3d74255190c0032f0826f87f155779e21e9b5b6a9300d6a2bde804ec0e107cde3f600ab5572cdda09645147cbbfcbf4c3681cb6965770ebb2b298151c354e45aab0e1ab77d414a30362a0091230d667e4ac44f5448cdf319b170c92f20d8c44b620f3b4517328bf4ece003dba9db9a71d0531ddd329adbcc4f6c408caeaebabe477bc1084f1da40cc4ca03e7ecc5f173167accf433667b9d3b61fdfd8cfe3498951e8912d6ef9a79401e0913b53dc6a14a8e117d053f82020e808b45e15b85d7102d1ccc87739c22124b058b2ab71e67f71598bf2b43813fb408df5ecafb1ca6c9761256958b017d7ab00d4a0a3fdb9ed61908d6559b853d254d86bd50fd85b349a8a9c5386850e4b9ad0984eed4614a896488fcb1b63cf795a56c12425dfbfe19ee09ac4375e6eb220e0ff2254d80d1f9fb865d5b176003779f5064ae0949aee694ac89df0fee4d1f3104d8bf76b06773b27c6ca86e69fb94146ca082a76af02d3e76c6e635fc3bb524084f89e8428a61207a4660e9c666e3e74762a62330d56753ad8fa7cf1267f5490c3ff7596b99bdda95e1bd409107ec45e09a0650f0a8c32dfddfbca2000602c705427b0fb904ef582e435fef3de34b6a3a07a67031fea098a28695cce2908f230e80cadb40036b6da75aef391ce13231674edb807af5e04f686027cae475274007b85ff58b13527f6b1125438e734ac8a1206255a332824004a1a2de925584140398089f34018fce44f334f3b283e58900ffa58f7c2a63641f7d4d946fb44e2b18f4ce36baf1b06c026e4055dadb7b06a239a003ba571528a0f16f0f1dd4cbd730", + "02000b02000bd2c8c50caa890d8cba0dd3c714ad8204c1ac02a002b305ff29a00eb00eea3dca7b033d26dbfa8929416a521d567a26591841e679107ce71b663e16690202000bd4a68401e2ae9f06dbc88403e1c1ff01b5f617ebf13afd22e430b411d409921adcf03a6509e651a29bebc34041caf616455cc292fa2bb643f9b08092ec59453b02000bee878f09b4e49602d8bc3d91f275fdf908a3c408d5be04c09a0addf6019c24c503ce1d3efc8a9b34487b372bb6912b4e2c59383d33e0d43189137a27f01f493e9a02000b85e0fc0bbce156c9d0149aee04e19503c6ca0198a806a53881ee01a09301e70eae51a3fbeb5e373200caa7b6cbb4e15d816c2da4d118301836f2209aaabcd4a502000badc7f90b85e02fc28014fcbe33acd50591ef039953c219af25ed127a914de852cc11000c95d5d3e65ab209b4e132f3e065e75a3704b1c7c3208df99a02000b83b6e90b80ab8601e9f502f7e80294b802bda3038809b603a205b308f21b892dac2160c42455b8fbf47e2828900e26f9b471b80c995846d520ed956410df02000bb6d4990cb3ff25d1f72492a10cf0e601aaa5028a1ac19004d501ac8802f32276b78ab2e228f862f25266e2c52e2ece1e2794010904f6dd5e988590a4fee18d02000be2ad840b8e9aa001f9b243eb8008cdd2028aee03e3ba03f42fea48e249d8176dd6075ac4b83ae6fb7b69c1887c65ea09d7cb85709d143a9e308a6221d33cbd02000b85aa4bb1ec9001cb9ce904a7e5f505fac737d5a604c3ee02efb801f4058f02f4191f81508673bacf74c6aef781066c10a465a7cfb9deb2f846492f243b8e8e967302000bf58cfd0be2d248c2e21c83bd0dba93049bd401ac2bd9ac02b7e701c27e962b13b9e44d6d26c65b26dee7fe6b2eeb00442031730f707007a64b314f05c5e06b02000bfafcba0bc0ff830184da0db6f825ddcf04feb402984cfb8201af19f904b3100c7e0535b7fd3e962d3977f595603a058ad82e92781f376c2ba198c6fc20e4910200029730581f692a0728b8efdfb3c7ae3abdfb1b0c958c4a7982df4b25fd097501aa000297f9c20373662034aab669e7578127dc4de22b4962d3f2af15c0608aa38ecf472c011d9f47f9bfaabf563f5779f24424401694587e3f29f44ed7f23d961c26700a27020901d26187582b72f26305a0baac182dced5c109c9b9b208ac9c3103fbbe9501d77aef7a011842b5b0728e4cda054ef887463f866b736bbdc8c3b3e0127515169adb51ab9ef98c2a69e5128c0de15eff9d18aff2a07975270e3c82bcbf243b01644b284605576983755f83dd835cd1ed3b814b6e97e8e086ca99514d38f78037a914bff3c42f6ea5734ebf12890c733484eae20a00c3682720dd0610a638799069384240bd07ee42bc513ba13a2acbcdffc7f8b66250b01d4700d684c9e4873ea76636030fbb232ef24d9c263db665c920746efa38c8596a05b3e018a93591d35756c5743b760df7793acaadb4e5837bbc2772a3575a6416622c87d41aca1000f9197932b1d0f7b3cc1f944d4f20c0da483caf9884101b94d84521b75356e10b072e0aacf2c40ca937115b2d74ab0525a020b96e35d4042fc2b08e13b34c945aa0ebdc39a041e0674fb4fa41b4d4e92e1516c304251d7c1ac1fca2c4c4e572b70a5e01def171237a771b3082a567bf3b3f71384b88aa20b9cd8560e712c9222b14d46c11995f5495d55101e5904536d088ae71da4092fb15432d132e1c217b40975354df569b18ef9f505c5ef1ebcc405f9ac117874be42b3378483e1c1cc53727edf17c870c06f0ae6e2e43e2a9a4b219154ac62b8d73c7ac9ef61a526ce83c355a2cc9ea831d33d2c3975ff6fda8f8fb75f3f4ff822df550a2915a139abbe257072867babc7a1c77080992dbdda8b44a0949318d787c66e3e1e8cf7ebaf86a2f534b899a6b5e38201aa3d403b3c7eb785b60190feb66573d5e33f2a278e6cbd73bc27262a377da5e5b548dbd65057070450d89c77a68941b94525f12d20eb69af428e61e2995d1e6b79056d0cf7e7320252d1aa1f6b6b80e4c441607927ecc4173232740cfff9b8c5adc75a7743efb801bdf48c73716ccde7a565318ada74138340e8760b93a0bb43c6d4cd9e3acb6c9272c13f8ca3d00fbb46074d33337c3f2db07d7e8ce6cb2a2aae7de846e6050a30492aabf161f290ded39d75cfe34496a5130b1f3c4e9b461b1fa6840ea605f9de5de69614c0020522eebf94156e6062b0c7891c9bd44f581d5e0806b6339e837c38742521068b0e2bee2b215183716e307ee4d65abde8d082b2ec34a6563906c9d6646e22786880abe357503d860bdc40a31f143583299e461b6f755bc7e306dbc1b40d28163b571cda0e6a52ee23d0f050ad05279dfb8d1a2aa068f352002f63a70b128fb7c9e37ab6d7d67d9d7d9250d90e8da0f36f8a1c1ad946afc4d3a115caba0a5d998da5f253f1274a5dd694f09c7addf0a2cda0c18af0fd4491722ae813bbabad13275358e70d840b66a8b690002dff6f7cb6a1065cd467961da306e822d42b3bc70837fbc62b7b61fa9bfa30500299331a64a62983bbce0fdf983e742a212e5a5ace13106dbba0cccfa9e950230c12c1613f4e2cb598053c920940378fa384992b502d8c12fee1340caf71d02cfe9a8ab5adb94fdf169a324d10fea117fd8256545bce8bbe9ba984a3339270d7b5d2584b1c76d8152b68a7e45081256a7d0dc2e04c55466f24c224e89294b0d22564af463256600e9bd82c3a32983feb4978826f71e996273dc8aa9d99fa200d6e54569c79a1b763b55dc32ff600cf497c3935598abf4a565c5df8b2e13cd0e13900ae7aa9a24563bdfc96b5332ea0aefda86ea53d72d2c41c58090a6f9450a32cbb432d0cffd6f7840dac7fb64a0bbe26b01f213ed5b82feb50eb777eae80989d8008cdce7285643846c8ab8501da53eefbc9de813e43283dbe32936e44c030e8ef773f0340e4f3abd4b708605d187a28840386eb35f39d20bee3fe03bc308cc93bd203534f5f2fa89499e55ab47f8940d12cb49bff092a279b3bff8bf7e0f76785ef1033066d4ca54b3436e3910d8b609aad897f86261f6a832d67362760e6613196975951a41d8ccbbb19568a52efaf233754f62d107c01e9056533fd40857c302a803aa1a02067140b5c806ffff28184d3efb0823a7ef823234e89b25084fd57eb40ecb64de3a0f305a0ead319b4397b50bc2ca8137b6e870b9e9a2f10fe3febc26aee742f3439c3e2f3194cd6ff6838079b300d62a0c3b8b5d8fce0f0c7e7917da06361491eb3aa88ea6faf5ba7e9cd510c7f5675b02b7f41fd9e4c206de741282a49e463fdc5ee95afa5855a64781066a9b1dab3f803751acc81b580a5e0137fd05f2df9f4558866629c087c9d404bb7bf8eef73d5af066b464510401fa8da5250872e29e9c5d3ce94cc35d61e6adc6c7935fcb7a56dadc37b051b608d543211a5472d11d0d3da9fa23705b39b8ecf3377713240abaa420041481fd81aa234723778272c071fb470bc6f973a8d4be4d4fc790bed52684e150e8ac56052ff287c6698590fa43dcb46d28cd687fc31de3a5564ae2b73181b9bcae75180c859ca88673e1a4000aac1088065fa98d16ff70f63b2de7c60a09feaa284d26095ac2f4ac0625076b12bd89f29c913da88dd9777e44ca2b03b1c2b5a30fedc00876b21e3f854b025b2afdb6202fdcbcf1122183ec35f26307b1c584f4f1b0540bab280fa6291c367d55cc76126ccf698b3122e3ee31d9ed3da1df4793d40abf0923343d95061e2d2b656c2291cd519c4c2fbd18e968704b44a7014c3b74e7800f505f0e803a23bd5f3a50f99027ba0469b9762bc87fb9d626692c9ec923f7b40814707877bd770f43a365707ca6c6ce8d01ea634450686aa61a7d4180f806ec0a3ad71336f21d86c322502b2f8ec85eea2187d33d8d23b64cd9748d05f10d8a0c3f419feda8c536691636e8b0f8f21231a52ada8505c4f609b6e798ebc350650b22aebda5684b1e3941ec35d4706de5c9b52fd30848bd38b39aca2d50ae287f02f2bf0825603a4793fe2e200c21cd74ffa4374cf8039eac6ffaf6da84dc744aac3a94062bbd820939ed53dc501a866bcdae62d1fa6f25c933933d97e86fc28f07281d41af4cf29dad5cb4053b9a69528daea27fdbfa3e6651c788ce248e980801e95eaefb4076b7f2467ae8bf9a6ffddd9dbcec76d338124b14b97f7e738c7506964d8cf3f84e110ee92d75f8def055ee6657266c2a27c5d7c4559bd0f6e5dc069a40f9523c154574a407d56b404fa6aa6696c5d7d33151e1575bcc5feff3c60fa63a046e58d0326b6114a8303902a0ccc5fabba8353ea252971cfa3ad8a22a0ea99203c5b3992cfd42a25bf0c49b9dad157049464912c310dd8c3c28e919de0118479cd2a60cbc635485e6b8676bd5da91c2e418603b9de7e32def748a52b60d39a228535a13b141115fa65ba1d959e4488aff80a76540237836389f61262f03109ed54940ad67ced0a45e834a2b4427c3e2622b4c5bba17c5b2137d0bfe8001000783522c6e9d43258cca7f5990c0cb2288c9b3a76a7c19eb06c57cf35a680c8fca20b1298e1f4fd6a427d5c7cbb6a58f84dbb409334f4d7a96d35f6d3db00f04d109faae134665f47b2e8b4369a189fda46088171fd4b8dea527aa7e2035d4dc067dc6eeac4ac84f0058a7e72307bdcf7f3e32671338388d553ba27c8abb0ebd8071bdd3874712c8c45eb449db51292a19d35815095e76495af4ceb71e9b058c357afc02bd42b4e38e7d4a040cd9eb78dd8b83a8c1e6e7116c6c1a8d2bd508d01f3ec72e04ace4da058140ed045b2fa1cc504aa5a5ba47795edd97481ace0242e4dc6f59b7f0bef9b9dd2b4b3a4b39d61b5e6f719bbd73889e4fb6d07d3708b7ec13af76a556e12d8dd51ab5687d8d45a28509515422ef8e9a5da5dc3b1409d775e493a3e2461e72181cd6b3d557de2a912c297c4ffc1124493815cb59d603c51481a2446b6ea12ba7ab8d0d51d534721ada976bccac4a157ee877eeea570747815398cb1cfdfe854ab8596945095027cea8a6cca0d463328adcebfae57f01cc7f5f371493ef1cc2412fb8876cc0ac0086608640f16b664a4da0023409a801ba5217d6c67a4717e1f0105ba4b0654aa820518a9d9f98cacf119d12ff651f0a43cdb914f638df52e0b12bcd4ad4457ca3f88d323f9301a06d3f3f5601ec0a0c4556502357b6a444e7508bdaa33a57d941e87b32110d421be185acfd6f4e739e716389d2c734408df7f4f46c6c48ce70b2c2f7deaa8f8d8a0df4035fd72767008ad80a9b5b00c3eb629c3aca2cd5d85624c102738e8d00642d98a83ee434d00d82ba38ab7190a7ad44d17781e788552983412d564dded006a810a18cd15a610c1ddaef5a464b5ccde5a4d1e1d78a9c875d09f04984508df99a1df0fa07526505e2cc9905145251f9598d7689bffbe90d9812e837b123e10226f33d7b2433ae0fd16d3c04260b2284ce6fb40373868d68863513d886918515d0f224011b81e60341ed52112a816c8edcc63d27a813a785905b87c17906667ac9d9178291e8a209262983b736381e03f6119bab87f1f570de35466f436e00555e03d89ca415ab09afcca572586fee9afc04844d428b900186e07f5991237df4c05501dea9c3b30916ce0eee462160bf5305fdbd8d40926bea3f9bc5bfe6bbb9ff376ccb3ead4c04caea03fda281589cbd3c1afa3349c8e9a29bbff069ebcec21cf36455a5f7c101ac0d3c819dcf90aafea5b0bba2b781bb9c4525f6167696ab92fa9a4f5a9bd20ff2852659182d588942aa00b117fe48a092cf75c3d4b0943566ea0d4c3c05f776ef72ff0879d93bc88f819d3d4cfb473339492f6c079fd6d575c6ffcd3f11860b5198c1ee11bcf806c4e4ea4cc766ae7f7de3ab8d22202465e9f791ff22ac7504d3b7c272d9c1ea6418bfcf643a33cdc6d9851c023e2d070c910797fc744a890c216d85bbdaa09f6626b0cc0dfb85ee5cd1bd52c011f489f05595282c40cb3d072efa54daec88e67f5ca80b0615fc32e0f9a35c946a764000d7f4d589395125072414fcb89f03cbef5ba274de087aa99cbbe0c29f4ba41b53f364ed55ad91b00dc9f14bce4b4201a6c081348f679267a50a885553fd9182c6db59d84281ae0a015bea38d62f63ae43a7830a85c0e5cbd85c4a9c230e58aa9fe16e7d6e5b2a100e1b0d5f3c319bc93a24165f5e7366b03589011b5244837a24e44f07da11bd3205c0bb3084012b449fb1ea4792812c8d46ecce8de53817bc9b408173681397860edf6c2075906e656780969da5630cb7ec1bf8e88cc5fc66c0e6281cb8becf760f2a54a60aa2c2d0be087a404bb6416f918bd9135d935830c04848257ed2de70096ecf597dfb2b94c0df996785e2c7e3f9ad6f609542411b82a5ec16b7ee1c9d7c53aa36886a8e9baa0744ea79a30992b2fb448798cc5549228c29380e26594a05f20b086813e981c4492214122cc3d83aaa682137b3b39b0c233d4a8e999b630f7580147fd23f35bac08cd30121f6232ec736a2b9dfabf292343b1be5725d420d66e48167c139d3ddbcd25503edd2197080aaef96118165334079d0ba86c44604bd6a8c95a040118db3ae851a4a2872f23332dea052582d2f36d820f15f422606842ed02d6ccd460a4bd11ca5fae623be42c361e7ca0d5fc1921848da1b153608344dcecef75c1c147f435cdfd00590be7ed26a6d60de075f1abc049eb06c85020595847106ff10a53e4ebdb2ac134914e10fc9e60443233b7f3e356be61e640f8bf6e363ed68e56903ff6c00f9e208c6644ee5385580a349555fca8aa9135505487ea93647be2a0a6e5bb439eb8619ee65ced7ea86add8dc733b530e8839090e3a43c4dcc439e3d083cdd5a823464583f59275e0003339bd4a6c6c05b319310c9aec6cf03d696eabd293fdb1fe3c790fd91efecd349df068a3aa06a4b7ed3e00e7074c04582d8963af509f2ca34344d13f1099650122128f7e0270fe5db0abb04511b1d99c2ed9513b25bb659733f84be4468265fea021e07627dee2f49eef023f66d45bea98fc0448eb68fcbf3bd41bd0daa0302ef64b81793dce003d2dfd079d0de97767eb4427e403d8f9d305796327e5c6cb9559de627ac55fad2c848c0013eefdab6b1ea9ae118410b381216dbba51865cd24d97967f2c76e43225216092f542fe9c096569fbe430141a135206b77f2a59392559c57f1d82d1acb4e490b6a0f4f620dfbc30c3b90bee41b21369172e90f20a024c4c45f474ad8d58ed2015bb6023bc398e476e236d0785132d63858324e0bbe541fdfdb9353546c5fe204b4ea5390de28f17a0c98840fa6fb0964ceac1b9f4a7fb5875c57909c0f11700b2baea279c5d3a6b06dbc14d52adc63ca391507cf92af5af44e3c3e54a3b29d0b299fd884f98bf512cc25436f87f76901e74b59ba31072b94d5b68ce931f5b8048ce02436ec3398d467575a71e43c31581cb6d74484f128cd164bba1a0661c004275e53f9a974ecccb3336223fdf209adbdabac661636a82887a05e9633adb60755d38983e9e0d1c60a8fdc11c3de597f9fda46777be7482c66198ae332e33ac36e232b38f92173cca99f34f7710ae775aebe4c5b6025f1809a0293238e91d7049da78ea0c96b4b011a3dd7a043a9fe213ec20578aca0ee23203d3cf7d0d7e903a7af0d4532dc8183a89385489a92caa605a620531ce41bde25e112661bcd1602266c06b69fd0cf581961b219ad1139c664ee9cb506d6d3d9cece26b78c78250f9e0f21bb030309e6000eab8be2e9dbffd4723da9ec5e67483f0e966adab5bd0358cbc06e9f2b5f5ef35ebbae16b73df007543bd63a4d0482c3542f7260e45f0990163d7899253e1af34673fb27d97b9c566482dfd6b00018933f1f387899b408b71952929c2a78e7939345f7c19a08841713a76f11a6cc1b9a261f3c77286b0dfd1e73b6ed65646045eb0b1a3b0f3150efc0ccc329ac8e5c2caf88183f542702fa2a27d0d878ef4b4677fc5c90d2e61f413337595e4ce6cfa51c11af6324080c11975749194d73ba0e04eb3fd7f577cae58c7e0b13b70c9df1b428ba82dedb0f0e1ebd92a6f123b289657bfd3962d91f97a12fdb6f94e1c43ffdd1f6864a4d083904356f0478a96e52e78db507c070241262b15430546fbd4ae5e1275dfb5d7b7ec939d5fa5df5c9ebbf813acbb4f52e2c0f109617321f1139b3d7c043fc0e0a364240e90d1c89d0519c69c06685115881b61deed25dcd7e5faf5c5961baf208b216a06f619e1ec1a49c146ded1e66b3e04c64c41108cc24d29662f8120bda0e23fc9d4ee7ce7f53a9c207681a372a48a12f4ae978e13549482ca30dc0d78f0f88a32035a539cd110c6761d8023fccd17f05c7e636616797ec6bb4371ade7f010b9f0844f20c6d5a2ebd74b13258f10e3c29eb7c7a62785407691684f4e69108c091de739e6f95bdb7b89d584e6960424efea380e65c57a75d83e869c6ffcd0be94555312e5f138ae3d9eed0f5c58d47502bea39dc7d9ade860624b8319f9a02a74676776a12414fe369acd379231ce3e042f7fc80f14a9735a0b4e9f05b9a0b5a61a3f557197aaee04e1bb67787487fd4e85141ada3de903bc75f0763a43805d57f945548075885f0cf75a92d9679ad24c02aa72d8b5768309b6054c849020928bd0f1bda2801d5a6fbb6af2ac06e53e458392276335f81858d3aeabc65ef09204bc90ffdd744a7dc53dd6d9cdd6bb1b9b3888a625134e5f4434d2b470b3237867a699747a08b1daa4cc8a73220636e3c2162393dd01d04cbb06e0dc20df9b71880b92e43a60d164e9203aa40663bcda410439713bf766813c9534785246fcda4ad2632b29bb41d965ba84d530157c5d57de6d729a6d97abc2703c742dc844994b815d1cc3e20c364d22e6a838bbfbc85273c1d72f805945faf078af6e7020a6f8a0b2bda76f35e275c973933cd2fef4e45390dc25c1aba9236860abf45521315e5631f9dd1e226195434d1e8fcc36bdb30d0caccab1155580a584308d5e4f70f1b8efd37eedfbe7e0e26133728ec3238c9208265198529b0d587d55a337e10c58028efa15f31bb0a19472e149d0b7ee984fb0b3d1adf4769e059342422fa9f44d0b98dbd1071331d5290a13d74ff182b1b04f50fea9c2c6bc7f0d4b967ed9b8205a9ae1778360103d677acb014878ac32635669af9f65e5cfe35505913976e79831c69901ad519d417a8bd6dab1d8c8c7e35739d9e72ca74c1c2493a13ff4b" + ], + "txs_as_json": [ + "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 21018557, 4092584, 1992227, 7075, 27445, 28074, 10927, 8827, 1497, 1551, 1413\n ], \n \"k_image\": \"da856b62f04c77bf46f46954b8caa82097b9386b0a501277262c68601ed917ac\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"d4871f51832c1951212b3d87395a8df5594e927588221e665a018c098968cc8b\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"62d52033f1a3c921f1db56eca9b5dd50f36ecf76e22e67cc694fb7c214a609ef\"\n }\n }\n ], \n \"extra\": [ 1, 100, 209, 103, 173, 61, 111, 118, 36, 20, 86, 127, 88, 18, 88, 95, 231, 244, 141, 52, 0, 205, 81, 217, 153, 176, 32, 137, 150, 88, 82, 101, 103, 2, 9, 1, 121, 92, 50, 176, 181, 186, 156, 227\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 56240000, \n \"ecdhInfo\": [ {\n \"amount\": \"73e3d349bd53dfa8\"\n }, {\n \"amount\": \"fa66a93993f6921f\"\n }], \n \"outPk\": [ \"f0457386671f45ef33760947513b71ec6398ff0e2ebb5edde433e452b9035112\", \"714a290806bedd15cd5293ea33be5bec57e983042840d75f66b7ca31c599f4ca\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"79a0ea918ad50e7e2d10784dffb56eeb39d4c92236c4904c1ecebd5b90ad6b79\", \n \"S\": \"7f9bace3566394d8a2558232b8f8262317dcc3da8038bc46119eb891371d71f9\", \n \"T1\": \"40e15801c6ddf29ddf034c0e277ce87d4343cb821fece9c74b1e04ecec914c34\", \n \"T2\": \"c5b7bb518042b1ca36de80e451aca0c44d93298d4a4ec31a2a1aa8b5b437a6aa\", \n \"taux\": \"b043ed66a681ba1f5f7773fa140176ddcdb2a0e7c9ae3163094671bf348d5504\", \n \"mu\": \"bc2b168891c1a599ce00acfe3a430c9c58370fe53b96a4d64155b03b5f30ee03\", \n \"L\": [ \"f95bde576a409f86100e2bcfe81d19d2407134310dce6ff953f668e810d48f12\", \"f3fd61b6c0f00819a18b75ae762b03dd97ba40ffc5a791318bf019f989e85f09\", \"385b4b9b74c8500321fb918e13f3bbd0a2fdf5749318f152e2a0f994f11b848e\", \"0157e0b3c44afab6653ef0815ad1e0d76ba1141d5abb61f8b078a57413d3374b\", \"3aa78fbea4de0604d470a12a21da6fea3c765e9ddec5d50b8f76f079f9c61c17\", \"b25822612418444181adf9e334a695aaabec779edf8842dbdbae99461c608dc0\", \"096113d8da040c3b5bd94dc796aa1daaa740839fd0f4363fa60b8c3e84fddc43\"\n ], \n \"R\": [ \"5ae595d323dc7cff3db06df16d2eb08bdceca623de357e6cfd59deedcba29a20\", \"3bbbbaadcc18bdd1ce03ba2d1bd16bc5e666b8006b473f339841199c5c183c5b\", \"78b420bd896cd50b2aa7b9f9fcba3615abe0f734c830320a8e9830976bbcae9a\", \"8e77676c4a3d944a3dca84fed10d242b12da93e9e37be272a933b45b23b8f4c2\", \"0c8dc6bc3f0d56878639b7900f505e6060806939e9f7f417fd10965fc564c7f0\", \"0893b920b6c32ff2e546dd40ec4414a110b052e97d3d74255190c0032f0826f8\", \"7f155779e21e9b5b6a9300d6a2bde804ec0e107cde3f600ab5572cdda0964514\"\n ], \n \"a\": \"7cbbfcbf4c3681cb6965770ebb2b298151c354e45aab0e1ab77d414a30362a00\", \n \"b\": \"91230d667e4ac44f5448cdf319b170c92f20d8c44b620f3b4517328bf4ece003\", \n \"t\": \"dba9db9a71d0531ddd329adbcc4f6c408caeaebabe477bc1084f1da40cc4ca03\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"e7ecc5f173167accf433667b9d3b61fdfd8cfe3498951e8912d6ef9a79401e09\", \"13b53dc6a14a8e117d053f82020e808b45e15b85d7102d1ccc87739c22124b05\", \"8b2ab71e67f71598bf2b43813fb408df5ecafb1ca6c9761256958b017d7ab00d\", \"4a0a3fdb9ed61908d6559b853d254d86bd50fd85b349a8a9c5386850e4b9ad09\", \"84eed4614a896488fcb1b63cf795a56c12425dfbfe19ee09ac4375e6eb220e0f\", \"f2254d80d1f9fb865d5b176003779f5064ae0949aee694ac89df0fee4d1f3104\", \"d8bf76b06773b27c6ca86e69fb94146ca082a76af02d3e76c6e635fc3bb52408\", \"4f89e8428a61207a4660e9c666e3e74762a62330d56753ad8fa7cf1267f5490c\", \"3ff7596b99bdda95e1bd409107ec45e09a0650f0a8c32dfddfbca2000602c705\", \"427b0fb904ef582e435fef3de34b6a3a07a67031fea098a28695cce2908f230e\", \"80cadb40036b6da75aef391ce13231674edb807af5e04f686027cae475274007\"], \n \"c1\": \"b85ff58b13527f6b1125438e734ac8a1206255a332824004a1a2de9255841403\", \n \"D\": \"98089f34018fce44f334f3b283e58900ffa58f7c2a63641f7d4d946fb44e2b18\"\n }], \n \"pseudoOuts\": [ \"f4ce36baf1b06c026e4055dadb7b06a239a003ba571528a0f16f0f1dd4cbd730\"]\n }\n}", + "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 26305618, 214186, 220428, 336851, 65837, 38465, 288, 691, 5375, 1824, 1840\n ], \n \"k_image\": \"ea3dca7b033d26dbfa8929416a521d567a26591841e679107ce71b663e166902\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 2167636, 13096802, 6366299, 4186337, 391989, 964843, 4477, 6244, 2228, 1236, 3346\n ], \n \"k_image\": \"dcf03a6509e651a29bebc34041caf616455cc292fa2bb643f9b08092ec59453b\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 19121134, 4567604, 1007192, 1931537, 146685, 139811, 73557, 167232, 31581, 4636, 453\n ], \n \"k_image\": \"ce1d3efc8a9b34487b372bb6912b4e2c59383d33e0d43189137a27f01f493e9a\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25112581, 1421500, 337993, 79642, 51937, 25926, 103448, 7205, 30465, 18848, 1895\n ], \n \"k_image\": \"ae51a3fbeb5e373200caa7b6cbb4e15d816c2da4d118301836f2209aaabcd4a5\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25060269, 782341, 327746, 843644, 92844, 63377, 10649, 3266, 4783, 2413, 122\n ], \n \"k_image\": \"914de852cc11000c95d5d3e65ab209b4e132f3e065e75a3704b1c7c3208df99a\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 24795907, 2200960, 47849, 46199, 39956, 53693, 1160, 438, 674, 1075, 3570\n ], \n \"k_image\": \"892dac2160c42455b8fbf47e2828900e26f9b471b80c995846d520ed956410df\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25586230, 622515, 605137, 200850, 29552, 37546, 3338, 67649, 213, 33836, 4467\n ], \n \"k_image\": \"76b78ab2e228f862f25266e2c52e2ece1e2794010904f6dd5e988590a4fee18d\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 23140066, 2624782, 1104249, 131179, 43341, 63242, 56675, 6132, 9322, 9442, 3032\n ], \n \"k_image\": \"6dd6075ac4b83ae6fb7b69c1887c65ea09d7cb85709d143a9e308a6221d33cbd\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 1234181, 2373169, 10112587, 12415655, 910330, 70485, 46915, 23663, 756, 271, 3316\n ], \n \"k_image\": \"1f81508673bacf74c6aef781066c10a465a7cfb9deb2f846492f243b8e8e9673\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 25118325, 1190242, 471362, 220803, 68026, 27163, 5548, 38489, 29623, 16194, 5526\n ], \n \"k_image\": \"13b9e44d6d26c65b26dee7fe6b2eeb00442031730f707007a64b314f05c5e06b\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 24034938, 2162624, 224516, 621622, 75741, 39550, 9752, 16763, 3247, 633, 2099\n ], \n \"k_image\": \"0c7e0535b7fd3e962d3977f595603a058ad82e92781f376c2ba198c6fc20e491\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"key\": \"9730581f692a0728b8efdfb3c7ae3abdfb1b0c958c4a7982df4b25fd097501aa\"\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"key\": \"97f9c20373662034aab669e7578127dc4de22b4962d3f2af15c0608aa38ecf47\"\n }\n }\n ], \n \"extra\": [ 1, 29, 159, 71, 249, 191, 170, 191, 86, 63, 87, 121, 242, 68, 36, 64, 22, 148, 88, 126, 63, 41, 244, 78, 215, 242, 61, 150, 28, 38, 112, 10, 39, 2, 9, 1, 210, 97, 135, 88, 43, 114, 242, 99\n ], \n \"rct_signatures\": {\n \"type\": 5, \n \"txnFee\": 51060000, \n \"ecdhInfo\": [ {\n \"amount\": \"2dced5c109c9b9b2\"\n }, {\n \"amount\": \"08ac9c3103fbbe95\"\n }], \n \"outPk\": [ \"01d77aef7a011842b5b0728e4cda054ef887463f866b736bbdc8c3b3e0127515\", \"169adb51ab9ef98c2a69e5128c0de15eff9d18aff2a07975270e3c82bcbf243b\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bp\": [ {\n \"A\": \"644b284605576983755f83dd835cd1ed3b814b6e97e8e086ca99514d38f78037\", \n \"S\": \"a914bff3c42f6ea5734ebf12890c733484eae20a00c3682720dd0610a6387990\", \n \"T1\": \"69384240bd07ee42bc513ba13a2acbcdffc7f8b66250b01d4700d684c9e4873e\", \n \"T2\": \"a76636030fbb232ef24d9c263db665c920746efa38c8596a05b3e018a93591d3\", \n \"taux\": \"5756c5743b760df7793acaadb4e5837bbc2772a3575a6416622c87d41aca1000\", \n \"mu\": \"f9197932b1d0f7b3cc1f944d4f20c0da483caf9884101b94d84521b75356e10b\", \n \"L\": [ \"2e0aacf2c40ca937115b2d74ab0525a020b96e35d4042fc2b08e13b34c945aa0\", \"ebdc39a041e0674fb4fa41b4d4e92e1516c304251d7c1ac1fca2c4c4e572b70a\", \"5e01def171237a771b3082a567bf3b3f71384b88aa20b9cd8560e712c9222b14\", \"d46c11995f5495d55101e5904536d088ae71da4092fb15432d132e1c217b4097\", \"5354df569b18ef9f505c5ef1ebcc405f9ac117874be42b3378483e1c1cc53727\", \"edf17c870c06f0ae6e2e43e2a9a4b219154ac62b8d73c7ac9ef61a526ce83c35\", \"5a2cc9ea831d33d2c3975ff6fda8f8fb75f3f4ff822df550a2915a139abbe257\"\n ], \n \"R\": [ \"2867babc7a1c77080992dbdda8b44a0949318d787c66e3e1e8cf7ebaf86a2f53\", \"4b899a6b5e38201aa3d403b3c7eb785b60190feb66573d5e33f2a278e6cbd73b\", \"c27262a377da5e5b548dbd65057070450d89c77a68941b94525f12d20eb69af4\", \"28e61e2995d1e6b79056d0cf7e7320252d1aa1f6b6b80e4c441607927ecc4173\", \"232740cfff9b8c5adc75a7743efb801bdf48c73716ccde7a565318ada7413834\", \"0e8760b93a0bb43c6d4cd9e3acb6c9272c13f8ca3d00fbb46074d33337c3f2db\", \"07d7e8ce6cb2a2aae7de846e6050a30492aabf161f290ded39d75cfe34496a51\"\n ], \n \"a\": \"30b1f3c4e9b461b1fa6840ea605f9de5de69614c0020522eebf94156e6062b0c\", \n \"b\": \"7891c9bd44f581d5e0806b6339e837c38742521068b0e2bee2b215183716e307\", \n \"t\": \"ee4d65abde8d082b2ec34a6563906c9d6646e22786880abe357503d860bdc40a\"\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"31f143583299e461b6f755bc7e306dbc1b40d28163b571cda0e6a52ee23d0f05\", \"0ad05279dfb8d1a2aa068f352002f63a70b128fb7c9e37ab6d7d67d9d7d9250d\", \"90e8da0f36f8a1c1ad946afc4d3a115caba0a5d998da5f253f1274a5dd694f09\", \"c7addf0a2cda0c18af0fd4491722ae813bbabad13275358e70d840b66a8b6900\", \"02dff6f7cb6a1065cd467961da306e822d42b3bc70837fbc62b7b61fa9bfa305\", \"00299331a64a62983bbce0fdf983e742a212e5a5ace13106dbba0cccfa9e9502\", \"30c12c1613f4e2cb598053c920940378fa384992b502d8c12fee1340caf71d02\", \"cfe9a8ab5adb94fdf169a324d10fea117fd8256545bce8bbe9ba984a3339270d\", \"7b5d2584b1c76d8152b68a7e45081256a7d0dc2e04c55466f24c224e89294b0d\", \"22564af463256600e9bd82c3a32983feb4978826f71e996273dc8aa9d99fa200\", \"d6e54569c79a1b763b55dc32ff600cf497c3935598abf4a565c5df8b2e13cd0e\"], \n \"c1\": \"13900ae7aa9a24563bdfc96b5332ea0aefda86ea53d72d2c41c58090a6f9450a\", \n \"D\": \"32cbb432d0cffd6f7840dac7fb64a0bbe26b01f213ed5b82feb50eb777eae809\"\n }, {\n \"s\": [ \"89d8008cdce7285643846c8ab8501da53eefbc9de813e43283dbe32936e44c03\", \"0e8ef773f0340e4f3abd4b708605d187a28840386eb35f39d20bee3fe03bc308\", \"cc93bd203534f5f2fa89499e55ab47f8940d12cb49bff092a279b3bff8bf7e0f\", \"76785ef1033066d4ca54b3436e3910d8b609aad897f86261f6a832d67362760e\", \"6613196975951a41d8ccbbb19568a52efaf233754f62d107c01e9056533fd408\", \"57c302a803aa1a02067140b5c806ffff28184d3efb0823a7ef823234e89b2508\", \"4fd57eb40ecb64de3a0f305a0ead319b4397b50bc2ca8137b6e870b9e9a2f10f\", \"e3febc26aee742f3439c3e2f3194cd6ff6838079b300d62a0c3b8b5d8fce0f0c\", \"7e7917da06361491eb3aa88ea6faf5ba7e9cd510c7f5675b02b7f41fd9e4c206\", \"de741282a49e463fdc5ee95afa5855a64781066a9b1dab3f803751acc81b580a\", \"5e0137fd05f2df9f4558866629c087c9d404bb7bf8eef73d5af066b464510401\"], \n \"c1\": \"fa8da5250872e29e9c5d3ce94cc35d61e6adc6c7935fcb7a56dadc37b051b608\", \n \"D\": \"d543211a5472d11d0d3da9fa23705b39b8ecf3377713240abaa420041481fd81\"\n }, {\n \"s\": [ \"aa234723778272c071fb470bc6f973a8d4be4d4fc790bed52684e150e8ac5605\", \"2ff287c6698590fa43dcb46d28cd687fc31de3a5564ae2b73181b9bcae75180c\", \"859ca88673e1a4000aac1088065fa98d16ff70f63b2de7c60a09feaa284d2609\", \"5ac2f4ac0625076b12bd89f29c913da88dd9777e44ca2b03b1c2b5a30fedc008\", \"76b21e3f854b025b2afdb6202fdcbcf1122183ec35f26307b1c584f4f1b0540b\", \"ab280fa6291c367d55cc76126ccf698b3122e3ee31d9ed3da1df4793d40abf09\", \"23343d95061e2d2b656c2291cd519c4c2fbd18e968704b44a7014c3b74e7800f\", \"505f0e803a23bd5f3a50f99027ba0469b9762bc87fb9d626692c9ec923f7b408\", \"14707877bd770f43a365707ca6c6ce8d01ea634450686aa61a7d4180f806ec0a\", \"3ad71336f21d86c322502b2f8ec85eea2187d33d8d23b64cd9748d05f10d8a0c\", \"3f419feda8c536691636e8b0f8f21231a52ada8505c4f609b6e798ebc350650b\"], \n \"c1\": \"22aebda5684b1e3941ec35d4706de5c9b52fd30848bd38b39aca2d50ae287f02\", \n \"D\": \"f2bf0825603a4793fe2e200c21cd74ffa4374cf8039eac6ffaf6da84dc744aac\"\n }, {\n \"s\": [ \"3a94062bbd820939ed53dc501a866bcdae62d1fa6f25c933933d97e86fc28f07\", \"281d41af4cf29dad5cb4053b9a69528daea27fdbfa3e6651c788ce248e980801\", \"e95eaefb4076b7f2467ae8bf9a6ffddd9dbcec76d338124b14b97f7e738c7506\", \"964d8cf3f84e110ee92d75f8def055ee6657266c2a27c5d7c4559bd0f6e5dc06\", \"9a40f9523c154574a407d56b404fa6aa6696c5d7d33151e1575bcc5feff3c60f\", \"a63a046e58d0326b6114a8303902a0ccc5fabba8353ea252971cfa3ad8a22a0e\", \"a99203c5b3992cfd42a25bf0c49b9dad157049464912c310dd8c3c28e919de01\", \"18479cd2a60cbc635485e6b8676bd5da91c2e418603b9de7e32def748a52b60d\", \"39a228535a13b141115fa65ba1d959e4488aff80a76540237836389f61262f03\", \"109ed54940ad67ced0a45e834a2b4427c3e2622b4c5bba17c5b2137d0bfe8001\", \"000783522c6e9d43258cca7f5990c0cb2288c9b3a76a7c19eb06c57cf35a680c\"], \n \"c1\": \"8fca20b1298e1f4fd6a427d5c7cbb6a58f84dbb409334f4d7a96d35f6d3db00f\", \n \"D\": \"04d109faae134665f47b2e8b4369a189fda46088171fd4b8dea527aa7e2035d4\"\n }, {\n \"s\": [ \"dc067dc6eeac4ac84f0058a7e72307bdcf7f3e32671338388d553ba27c8abb0e\", \"bd8071bdd3874712c8c45eb449db51292a19d35815095e76495af4ceb71e9b05\", \"8c357afc02bd42b4e38e7d4a040cd9eb78dd8b83a8c1e6e7116c6c1a8d2bd508\", \"d01f3ec72e04ace4da058140ed045b2fa1cc504aa5a5ba47795edd97481ace02\", \"42e4dc6f59b7f0bef9b9dd2b4b3a4b39d61b5e6f719bbd73889e4fb6d07d3708\", \"b7ec13af76a556e12d8dd51ab5687d8d45a28509515422ef8e9a5da5dc3b1409\", \"d775e493a3e2461e72181cd6b3d557de2a912c297c4ffc1124493815cb59d603\", \"c51481a2446b6ea12ba7ab8d0d51d534721ada976bccac4a157ee877eeea5707\", \"47815398cb1cfdfe854ab8596945095027cea8a6cca0d463328adcebfae57f01\", \"cc7f5f371493ef1cc2412fb8876cc0ac0086608640f16b664a4da0023409a801\", \"ba5217d6c67a4717e1f0105ba4b0654aa820518a9d9f98cacf119d12ff651f0a\"], \n \"c1\": \"43cdb914f638df52e0b12bcd4ad4457ca3f88d323f9301a06d3f3f5601ec0a0c\", \n \"D\": \"4556502357b6a444e7508bdaa33a57d941e87b32110d421be185acfd6f4e739e\"\n }, {\n \"s\": [ \"716389d2c734408df7f4f46c6c48ce70b2c2f7deaa8f8d8a0df4035fd7276700\", \"8ad80a9b5b00c3eb629c3aca2cd5d85624c102738e8d00642d98a83ee434d00d\", \"82ba38ab7190a7ad44d17781e788552983412d564dded006a810a18cd15a610c\", \"1ddaef5a464b5ccde5a4d1e1d78a9c875d09f04984508df99a1df0fa07526505\", \"e2cc9905145251f9598d7689bffbe90d9812e837b123e10226f33d7b2433ae0f\", \"d16d3c04260b2284ce6fb40373868d68863513d886918515d0f224011b81e603\", \"41ed52112a816c8edcc63d27a813a785905b87c17906667ac9d9178291e8a209\", \"262983b736381e03f6119bab87f1f570de35466f436e00555e03d89ca415ab09\", \"afcca572586fee9afc04844d428b900186e07f5991237df4c05501dea9c3b309\", \"16ce0eee462160bf5305fdbd8d40926bea3f9bc5bfe6bbb9ff376ccb3ead4c04\", \"caea03fda281589cbd3c1afa3349c8e9a29bbff069ebcec21cf36455a5f7c101\"], \n \"c1\": \"ac0d3c819dcf90aafea5b0bba2b781bb9c4525f6167696ab92fa9a4f5a9bd20f\", \n \"D\": \"f2852659182d588942aa00b117fe48a092cf75c3d4b0943566ea0d4c3c05f776\"\n }, {\n \"s\": [ \"ef72ff0879d93bc88f819d3d4cfb473339492f6c079fd6d575c6ffcd3f11860b\", \"5198c1ee11bcf806c4e4ea4cc766ae7f7de3ab8d22202465e9f791ff22ac7504\", \"d3b7c272d9c1ea6418bfcf643a33cdc6d9851c023e2d070c910797fc744a890c\", \"216d85bbdaa09f6626b0cc0dfb85ee5cd1bd52c011f489f05595282c40cb3d07\", \"2efa54daec88e67f5ca80b0615fc32e0f9a35c946a764000d7f4d58939512507\", \"2414fcb89f03cbef5ba274de087aa99cbbe0c29f4ba41b53f364ed55ad91b00d\", \"c9f14bce4b4201a6c081348f679267a50a885553fd9182c6db59d84281ae0a01\", \"5bea38d62f63ae43a7830a85c0e5cbd85c4a9c230e58aa9fe16e7d6e5b2a100e\", \"1b0d5f3c319bc93a24165f5e7366b03589011b5244837a24e44f07da11bd3205\", \"c0bb3084012b449fb1ea4792812c8d46ecce8de53817bc9b408173681397860e\", \"df6c2075906e656780969da5630cb7ec1bf8e88cc5fc66c0e6281cb8becf760f\"], \n \"c1\": \"2a54a60aa2c2d0be087a404bb6416f918bd9135d935830c04848257ed2de7009\", \n \"D\": \"6ecf597dfb2b94c0df996785e2c7e3f9ad6f609542411b82a5ec16b7ee1c9d7c\"\n }, {\n \"s\": [ \"53aa36886a8e9baa0744ea79a30992b2fb448798cc5549228c29380e26594a05\", \"f20b086813e981c4492214122cc3d83aaa682137b3b39b0c233d4a8e999b630f\", \"7580147fd23f35bac08cd30121f6232ec736a2b9dfabf292343b1be5725d420d\", \"66e48167c139d3ddbcd25503edd2197080aaef96118165334079d0ba86c44604\", \"bd6a8c95a040118db3ae851a4a2872f23332dea052582d2f36d820f15f422606\", \"842ed02d6ccd460a4bd11ca5fae623be42c361e7ca0d5fc1921848da1b153608\", \"344dcecef75c1c147f435cdfd00590be7ed26a6d60de075f1abc049eb06c8502\", \"0595847106ff10a53e4ebdb2ac134914e10fc9e60443233b7f3e356be61e640f\", \"8bf6e363ed68e56903ff6c00f9e208c6644ee5385580a349555fca8aa9135505\", \"487ea93647be2a0a6e5bb439eb8619ee65ced7ea86add8dc733b530e8839090e\", \"3a43c4dcc439e3d083cdd5a823464583f59275e0003339bd4a6c6c05b319310c\"], \n \"c1\": \"9aec6cf03d696eabd293fdb1fe3c790fd91efecd349df068a3aa06a4b7ed3e00\", \n \"D\": \"e7074c04582d8963af509f2ca34344d13f1099650122128f7e0270fe5db0abb0\"\n }, {\n \"s\": [ \"4511b1d99c2ed9513b25bb659733f84be4468265fea021e07627dee2f49eef02\", \"3f66d45bea98fc0448eb68fcbf3bd41bd0daa0302ef64b81793dce003d2dfd07\", \"9d0de97767eb4427e403d8f9d305796327e5c6cb9559de627ac55fad2c848c00\", \"13eefdab6b1ea9ae118410b381216dbba51865cd24d97967f2c76e4322521609\", \"2f542fe9c096569fbe430141a135206b77f2a59392559c57f1d82d1acb4e490b\", \"6a0f4f620dfbc30c3b90bee41b21369172e90f20a024c4c45f474ad8d58ed201\", \"5bb6023bc398e476e236d0785132d63858324e0bbe541fdfdb9353546c5fe204\", \"b4ea5390de28f17a0c98840fa6fb0964ceac1b9f4a7fb5875c57909c0f11700b\", \"2baea279c5d3a6b06dbc14d52adc63ca391507cf92af5af44e3c3e54a3b29d0b\", \"299fd884f98bf512cc25436f87f76901e74b59ba31072b94d5b68ce931f5b804\", \"8ce02436ec3398d467575a71e43c31581cb6d74484f128cd164bba1a0661c004\"], \n \"c1\": \"275e53f9a974ecccb3336223fdf209adbdabac661636a82887a05e9633adb607\", \n \"D\": \"55d38983e9e0d1c60a8fdc11c3de597f9fda46777be7482c66198ae332e33ac3\"\n }, {\n \"s\": [ \"6e232b38f92173cca99f34f7710ae775aebe4c5b6025f1809a0293238e91d704\", \"9da78ea0c96b4b011a3dd7a043a9fe213ec20578aca0ee23203d3cf7d0d7e903\", \"a7af0d4532dc8183a89385489a92caa605a620531ce41bde25e112661bcd1602\", \"266c06b69fd0cf581961b219ad1139c664ee9cb506d6d3d9cece26b78c78250f\", \"9e0f21bb030309e6000eab8be2e9dbffd4723da9ec5e67483f0e966adab5bd03\", \"58cbc06e9f2b5f5ef35ebbae16b73df007543bd63a4d0482c3542f7260e45f09\", \"90163d7899253e1af34673fb27d97b9c566482dfd6b00018933f1f387899b408\", \"b71952929c2a78e7939345f7c19a08841713a76f11a6cc1b9a261f3c77286b0d\", \"fd1e73b6ed65646045eb0b1a3b0f3150efc0ccc329ac8e5c2caf88183f542702\", \"fa2a27d0d878ef4b4677fc5c90d2e61f413337595e4ce6cfa51c11af6324080c\", \"11975749194d73ba0e04eb3fd7f577cae58c7e0b13b70c9df1b428ba82dedb0f\"], \n \"c1\": \"0e1ebd92a6f123b289657bfd3962d91f97a12fdb6f94e1c43ffdd1f6864a4d08\", \n \"D\": \"3904356f0478a96e52e78db507c070241262b15430546fbd4ae5e1275dfb5d7b\"\n }, {\n \"s\": [ \"7ec939d5fa5df5c9ebbf813acbb4f52e2c0f109617321f1139b3d7c043fc0e0a\", \"364240e90d1c89d0519c69c06685115881b61deed25dcd7e5faf5c5961baf208\", \"b216a06f619e1ec1a49c146ded1e66b3e04c64c41108cc24d29662f8120bda0e\", \"23fc9d4ee7ce7f53a9c207681a372a48a12f4ae978e13549482ca30dc0d78f0f\", \"88a32035a539cd110c6761d8023fccd17f05c7e636616797ec6bb4371ade7f01\", \"0b9f0844f20c6d5a2ebd74b13258f10e3c29eb7c7a62785407691684f4e69108\", \"c091de739e6f95bdb7b89d584e6960424efea380e65c57a75d83e869c6ffcd0b\", \"e94555312e5f138ae3d9eed0f5c58d47502bea39dc7d9ade860624b8319f9a02\", \"a74676776a12414fe369acd379231ce3e042f7fc80f14a9735a0b4e9f05b9a0b\", \"5a61a3f557197aaee04e1bb67787487fd4e85141ada3de903bc75f0763a43805\", \"d57f945548075885f0cf75a92d9679ad24c02aa72d8b5768309b6054c8490209\"], \n \"c1\": \"28bd0f1bda2801d5a6fbb6af2ac06e53e458392276335f81858d3aeabc65ef09\", \n \"D\": \"204bc90ffdd744a7dc53dd6d9cdd6bb1b9b3888a625134e5f4434d2b470b3237\"\n }], \n \"pseudoOuts\": [ \"867a699747a08b1daa4cc8a73220636e3c2162393dd01d04cbb06e0dc20df9b7\", \"1880b92e43a60d164e9203aa40663bcda410439713bf766813c9534785246fcd\", \"a4ad2632b29bb41d965ba84d530157c5d57de6d729a6d97abc2703c742dc8449\", \"94b815d1cc3e20c364d22e6a838bbfbc85273c1d72f805945faf078af6e7020a\", \"6f8a0b2bda76f35e275c973933cd2fef4e45390dc25c1aba9236860abf455213\", \"15e5631f9dd1e226195434d1e8fcc36bdb30d0caccab1155580a584308d5e4f7\", \"0f1b8efd37eedfbe7e0e26133728ec3238c9208265198529b0d587d55a337e10\", \"c58028efa15f31bb0a19472e149d0b7ee984fb0b3d1adf4769e059342422fa9f\", \"44d0b98dbd1071331d5290a13d74ff182b1b04f50fea9c2c6bc7f0d4b967ed9b\", \"8205a9ae1778360103d677acb014878ac32635669af9f65e5cfe35505913976e\", \"79831c69901ad519d417a8bd6dab1d8c8c7e35739d9e72ca74c1c2493a13ff4b\"]\n }\n}" + ], + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_in_peers.json b/tests/data/test_jsonrpcdaemon/test_in_peers.json new file mode 100644 index 0000000..8a0b318 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_in_peers.json @@ -0,0 +1,5 @@ +{ + "in_peers": 128, + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_in_peers_unlimited.json b/tests/data/test_jsonrpcdaemon/test_in_peers_unlimited.json new file mode 100644 index 0000000..717ee96 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_in_peers_unlimited.json @@ -0,0 +1,5 @@ +{ + "in_peers": 4294967295, + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_is_key_image_spent.json b/tests/data/test_jsonrpcdaemon/test_is_key_image_spent.json new file mode 100644 index 0000000..7967ceb --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_is_key_image_spent.json @@ -0,0 +1,12 @@ +{ + "credits": 0, + "spent_status": [ + 1, + 1, + 0, + 2 + ], + "status": "OK", + "top_hash": "", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_mining.json b/tests/data/test_jsonrpcdaemon/test_mining.json new file mode 100644 index 0000000..8a26fe0 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_mining.json @@ -0,0 +1 @@ +{"status": "OK", "untrusted": false} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_mining_status_off.json b/tests/data/test_jsonrpcdaemon/test_mining_status_off.json new file mode 100644 index 0000000..b0ab24d --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_mining_status_off.json @@ -0,0 +1,19 @@ +{ + "active": false, + "address": "", + "bg_idle_threshold": 0, + "bg_ignore_battery": false, + "bg_min_idle_seconds": 0, + "bg_target": 0, + "block_reward": 0, + "block_target": 120, + "difficulty": 250236969769, + "difficulty_top64": 0, + "is_background_mining_enabled": false, + "pow_algorithm": "RandomX", + "speed": 0, + "status": "OK", + "threads_count": 0, + "untrusted": false, + "wide_difficulty": "0x3a43492329" +} diff --git a/tests/data/test_jsonrpcdaemon/test_mining_status_on.json b/tests/data/test_jsonrpcdaemon/test_mining_status_on.json new file mode 100644 index 0000000..3d1c4c3 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_mining_status_on.json @@ -0,0 +1,19 @@ +{ + "active": true, + "address": "497e4umLC7pfJ5TSSuU1QY8E1Nh5h5cWfYnvvpTrYFKiQriWfVYeVn2KH8Hpp3AeDRbCSxTvZuUZ1WYd8PGLqM4r5P5hjNQ", + "bg_idle_threshold": 0, + "bg_ignore_battery": false, + "bg_min_idle_seconds": 0, + "bg_target": 0, + "block_reward": 1162352277907, + "block_target": 120, + "difficulty": 252551179535, + "difficulty_top64": 0, + "is_background_mining_enabled": false, + "pow_algorithm": "RandomX", + "speed": 6, + "status": "OK", + "threads_count": 4, + "untrusted": false, + "wide_difficulty": "0x3acd392d0f" +} diff --git a/tests/data/test_jsonrpcdaemon/test_out_peers.json b/tests/data/test_jsonrpcdaemon/test_out_peers.json new file mode 100644 index 0000000..eb0650d --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_out_peers.json @@ -0,0 +1,5 @@ +{ + "out_peers": 16, + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_out_peers_unlimited.json b/tests/data/test_jsonrpcdaemon/test_out_peers_unlimited.json new file mode 100644 index 0000000..0b3d184 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_out_peers_unlimited.json @@ -0,0 +1,5 @@ +{ + "out_peers": 4294967295, + "status": "OK", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_save_bc.json b/tests/data/test_jsonrpcdaemon/test_save_bc.json new file mode 100644 index 0000000..8e99c18 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_save_bc.json @@ -0,0 +1,4 @@ +{ + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_categories_default.json b/tests/data/test_jsonrpcdaemon/test_set_log_categories_default.json new file mode 100644 index 0000000..0dd285f --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_categories_default.json @@ -0,0 +1,5 @@ +{ + "categories": "default:INFO", + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_categories_empty.json b/tests/data/test_jsonrpcdaemon/test_set_log_categories_empty.json new file mode 100644 index 0000000..a8f8196 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_categories_empty.json @@ -0,0 +1,5 @@ +{ + "categories": "", + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_categories_multiple.json b/tests/data/test_jsonrpcdaemon/test_set_log_categories_multiple.json new file mode 100644 index 0000000..871ec92 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_categories_multiple.json @@ -0,0 +1,5 @@ +{ + "categories": "logging:INFO,net:FATAL", + "status": "OK", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_mining.json b/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_mining.json new file mode 100644 index 0000000..8e99c18 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_mining.json @@ -0,0 +1,4 @@ +{ + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_notmining.json b/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_notmining.json new file mode 100644 index 0000000..d08abe9 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_hash_rate_notmining.json @@ -0,0 +1,4 @@ +{ + "status": "NOT MINING", + "untrusted": false +} \ No newline at end of file diff --git a/tests/data/test_jsonrpcdaemon/test_set_log_level.json b/tests/data/test_jsonrpcdaemon/test_set_log_level.json new file mode 100644 index 0000000..8e99c18 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_set_log_level.json @@ -0,0 +1,4 @@ +{ + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_stop_daemon.json b/tests/data/test_jsonrpcdaemon/test_stop_daemon.json new file mode 100644 index 0000000..8e99c18 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_stop_daemon.json @@ -0,0 +1,4 @@ +{ + "status": "OK", + "untrusted": false +} diff --git a/tests/data/test_jsonrpcdaemon/test_update_check_none.json b/tests/data/test_jsonrpcdaemon/test_update_check_none.json new file mode 100644 index 0000000..1385cb8 --- /dev/null +++ b/tests/data/test_jsonrpcdaemon/test_update_check_none.json @@ -0,0 +1,10 @@ +{ + "auto_uri": "", + "hash": "", + "path": "", + "status": "OK", + "untrusted": false, + "update": false, + "user_uri": "", + "version": "" +} diff --git a/tests/test_jsonrpcdaemon.py b/tests/test_jsonrpcdaemon.py index 5ad2ee3..44d9a30 100644 --- a/tests/test_jsonrpcdaemon.py +++ b/tests/test_jsonrpcdaemon.py @@ -17,6 +17,25 @@ class JSONRPCDaemonTestCase(JSONTestCase): mempool_url = 'http://127.0.0.1:18081/get_transaction_pool' transactions_url = 'http://127.0.0.1:18081/get_transactions' sendrawtransaction_url = 'http://127.0.0.1:18081/sendrawtransaction' + getheight_url = 'http://127.0.0.1:18081/get_height' + getaltblockshashes_url = 'http://127.0.0.1:18081/get_alt_blocks_hashes' + iskeyimagespent_url = 'http://127.0.0.1:18081/is_key_image_spent' + startmining_url = 'http://127.0.0.1:18081/start_mining' + stopmining_url = 'http://127.0.0.1:18081/stop_mining' + miningstatus_url = 'http://127.0.0.1:18081/mining_status' + savebc_url = 'http://127.0.0.1:18081/save_bc' + getpeerlist_url = 'http://127.0.0.1:18081/get_peer_list' + setloghashrate_url = 'http://127.0.0.1:18081/set_log_hash_rate' + setloglevel_url = 'http://127.0.0.1:18081/set_log_level' + setlogcategories_url = 'http://127.0.0.1:18081/set_log_categories' + gettransactionpoolstats_url = 'http://127.0.0.1:18081/get_transaction_pool_stats' + stopdaemon_url = 'http://127.0.0.1:18081/stop_daemon' + getlimit_url = 'http://127.0.0.1:18081/get_limit' + setlimit_url = 'http://127.0.0.1:18081/set_limit' + outpeers_url = 'http://127.0.0.1:18081/out_peers' + inpeers_url = 'http://127.0.0.1:18081/in_peers' + getouts_url = 'http://127.0.0.1:18081/get_outs' + update_url = 'http://127.0.0.1:18081/update' data_subdir = 'test_jsonrpcdaemon' def setUp(self): @@ -788,4 +807,401 @@ class JSONRPCDaemonTestCase(JSONTestCase): @responses.activate def test_get_output_distribution(self): - pass \ No newline at end of file + pass + + @responses.activate + def test_get_height(self): + responses.add(responses.POST, self.getheight_url, + json=self._read('test_get_height_2294632.json'), + status=200) + + resp = self.backend.get_height() + + self.assertEqual(resp['height'], 2294632) + self.assertEqual(resp['hash'], '228c0538b7ba7d28fdd58ed310326db61ea052038bdb42652f6e1852cf666325') + + @responses.activate + def test_get_transactions(self): + responses.add(responses.POST, self.transactions_url, + json=self._read('test_get_transactions.json'), + status=200) + + resp = self.backend.get_transactions(['c6802ca1805784c7330e71521a318c302f88625b0eab80740cfab24af7b0cb93', + 'ae476cae3ad2b44c6c2614b9435adbe304e24c59d410fe3b4dd046a9021d66b9'], decode_as_json=True, prune=False) + + self.assertEqual(resp['txs_as_hex'][0], + '02000102000bbdef820aa8e5f901a3cc79a337b5d601aadb01af55fb44d90b8f0c850bda856b62f04c77bf46f46954b8caa82097b9386b0a501277262' + 'c68601ed917ac020002d4871f51832c1951212b3d87395a8df5594e927588221e665a018c098968cc8b000262d52033f1a3c921f1db56eca9b5dd50f3' + '6ecf76e22e67cc694fb7c214a609ef2c0164d167ad3d6f762414567f5812585fe7f48d3400cd51d999b020899658526567020901795c32b0b5ba9ce30' + '580cfe81a73e3d349bd53dfa8fa66a93993f6921ff0457386671f45ef33760947513b71ec6398ff0e2ebb5edde433e452b9035112714a290806bedd15' + 'cd5293ea33be5bec57e983042840d75f66b7ca31c599f4ca0179a0ea918ad50e7e2d10784dffb56eeb39d4c92236c4904c1ecebd5b90ad6b797f9bace' + '3566394d8a2558232b8f8262317dcc3da8038bc46119eb891371d71f940e15801c6ddf29ddf034c0e277ce87d4343cb821fece9c74b1e04ecec914c34' + 'c5b7bb518042b1ca36de80e451aca0c44d93298d4a4ec31a2a1aa8b5b437a6aab043ed66a681ba1f5f7773fa140176ddcdb2a0e7c9ae3163094671bf3' + '48d5504bc2b168891c1a599ce00acfe3a430c9c58370fe53b96a4d64155b03b5f30ee0307f95bde576a409f86100e2bcfe81d19d2407134310dce6ff9' + '53f668e810d48f12f3fd61b6c0f00819a18b75ae762b03dd97ba40ffc5a791318bf019f989e85f09385b4b9b74c8500321fb918e13f3bbd0a2fdf5749' + '318f152e2a0f994f11b848e0157e0b3c44afab6653ef0815ad1e0d76ba1141d5abb61f8b078a57413d3374b3aa78fbea4de0604d470a12a21da6fea3c' + '765e9ddec5d50b8f76f079f9c61c17b25822612418444181adf9e334a695aaabec779edf8842dbdbae99461c608dc0096113d8da040c3b5bd94dc796a' + 'a1daaa740839fd0f4363fa60b8c3e84fddc43075ae595d323dc7cff3db06df16d2eb08bdceca623de357e6cfd59deedcba29a203bbbbaadcc18bdd1ce' + '03ba2d1bd16bc5e666b8006b473f339841199c5c183c5b78b420bd896cd50b2aa7b9f9fcba3615abe0f734c830320a8e9830976bbcae9a8e77676c4a3' + 'd944a3dca84fed10d242b12da93e9e37be272a933b45b23b8f4c20c8dc6bc3f0d56878639b7900f505e6060806939e9f7f417fd10965fc564c7f00893' + 'b920b6c32ff2e546dd40ec4414a110b052e97d3d74255190c0032f0826f87f155779e21e9b5b6a9300d6a2bde804ec0e107cde3f600ab5572cdda0964' + '5147cbbfcbf4c3681cb6965770ebb2b298151c354e45aab0e1ab77d414a30362a0091230d667e4ac44f5448cdf319b170c92f20d8c44b620f3b451732' + '8bf4ece003dba9db9a71d0531ddd329adbcc4f6c408caeaebabe477bc1084f1da40cc4ca03e7ecc5f173167accf433667b9d3b61fdfd8cfe3498951e8' + '912d6ef9a79401e0913b53dc6a14a8e117d053f82020e808b45e15b85d7102d1ccc87739c22124b058b2ab71e67f71598bf2b43813fb408df5ecafb1c' + 'a6c9761256958b017d7ab00d4a0a3fdb9ed61908d6559b853d254d86bd50fd85b349a8a9c5386850e4b9ad0984eed4614a896488fcb1b63cf795a56c1' + '2425dfbfe19ee09ac4375e6eb220e0ff2254d80d1f9fb865d5b176003779f5064ae0949aee694ac89df0fee4d1f3104d8bf76b06773b27c6ca86e69fb' + '94146ca082a76af02d3e76c6e635fc3bb524084f89e8428a61207a4660e9c666e3e74762a62330d56753ad8fa7cf1267f5490c3ff7596b99bdda95e1b' + 'd409107ec45e09a0650f0a8c32dfddfbca2000602c705427b0fb904ef582e435fef3de34b6a3a07a67031fea098a28695cce2908f230e80cadb40036b' + '6da75aef391ce13231674edb807af5e04f686027cae475274007b85ff58b13527f6b1125438e734ac8a1206255a332824004a1a2de925584140398089' + 'f34018fce44f334f3b283e58900ffa58f7c2a63641f7d4d946fb44e2b18f4ce36baf1b06c026e4055dadb7b06a239a003ba571528a0f16f0f1dd4cbd730') + + self.assertEqual(resp['txs'][0]['block_height'], 2295433) + self.assertEqual(resp['txs'][0]['block_timestamp'], 1613160690) + self.assertEqual(resp['txs'][1]['in_pool'], True) + + json.loads(resp['txs'][0]['as_json']) + + @responses.activate + def test_get_alt_blocks_hashes(self): + responses.add(responses.POST, self.getaltblockshashes_url, + json=self._read('test_get_alt_blocks_hashes_doc_example.json'), + status=200) + + resp = self.backend.get_alt_blocks_hashes() + + hashes = ["9c2277c5470234be8b32382cdf8094a103aba4fcd5e875a6fc159dc2ec00e011","637c0e0f0558e284493f38a5fcca3615db59458d90d3a5eff0a18ff59b83f46f", + "6f3adc174a2e8082819ebb965c96a095e3e8b63929ad9be2d705ad9c086a6b1c","697cf03c89a9b118f7bdf11b1b3a6a028d7b3617d2d0ed91322c5709acf75625", + "d99b3cf3ac6f17157ac7526782a3c3b9537f89d07e069f9ce7821d74bd9cad0e","e97b62109a6303233dcd697fa8545c9fcbc0bf8ed2268fede57ddfc36d8c939c", + "70ff822066a53ad64b04885c89bbe5ce3e537cdc1f7fa0dc55317986f01d1788","b0d36b209bd0d4442b55ea2f66b5c633f522401f921f5a85ea6f113fd2988866"] + + self.assertEqual(resp['blks_hashes'], hashes) + + @responses.activate + def test_is_key_image_spent(self): + responses.add(responses.POST, self.iskeyimagespent_url, + json=self._read('test_is_key_image_spent.json'), + status=200) + + key_imgs = ['8d1bd8181bf7d857bdb281e0153d84cd55a3fcaa57c3e570f4a49f935850b5e3', '7319134bfc50668251f5b899c66b005805ee255c136f0e1cecbb0f3a912e09d4', + '8d1bd8181bf7d857bdb281e0153d84cd55a3fcaa57c3e570f4a49f935850b5e2', 'fbbd6ac46dc4905c455f3b51595da6b135a5e9a64c6c181875558649be0ab183'] + resp = self.backend.is_key_image_spent(key_imgs) + + self.assertEqual(resp['spent_status'], [1, 1, 0, 2]) + + @responses.activate + def test_send_raw_transaction(self): + pass + + @responses.activate + def test_start_mining(self): + responses.add(responses.POST, self.startmining_url, + json=self._read('test_mining.json'), + status=200) + + mining_addr = '497e4umLC7pfJ5TSSuU1QY8E1Nh5h5cWfYnvvpTrYFKiQriWfVYeVn2KH8Hpp3AeDRbCSxTvZuUZ1WYd8PGLqM4r5P5hjNQ' + resp = self.backend.start_mining(False, True, mining_addr, 4) + + self.assertEqual(resp['status'], 'OK') + + with self.assertRaises(ValueError): + self.backend.start_mining(False, True, mining_addr, -1) + + with self.assertRaises(ValueError): + self.backend.start_mining(False, True, "meepmoopthisisntarealminingaddress", 2) + + @responses.activate + def test_stop_mining(self): + responses.add(responses.POST, self.stopmining_url, + json=self._read('test_mining.json'), + status=200) + + resp = self.backend.stop_mining() + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_mining_status_off(self): + responses.add(responses.POST, self.miningstatus_url, + json=self._read('test_mining_status_off.json'), + status=200) + + resp = self.backend.mining_status() + + self.assertEqual(resp['active'], False) + self.assertEqual(resp['difficulty'], 250236969769) + self.assertEqual(resp['pow_algorithm'], 'RandomX') + + @responses.activate + def test_mining_status_on(self): + responses.add(responses.POST, self.miningstatus_url, + json=self._read('test_mining_status_on.json'), + status=200) + + resp = self.backend.mining_status() + + self.assertEqual(resp['active'], True) + self.assertEqual(resp['difficulty'], 252551179535) + self.assertEqual(resp['pow_algorithm'], 'RandomX') + self.assertEqual(resp['address'], "497e4umLC7pfJ5TSSuU1QY8E1Nh5h5cWfYnvvpTrYFKiQriWfVYeVn2KH8Hpp3AeDRbCSxTvZuUZ1WYd8PGLqM4r5P5hjNQ") + + @responses.activate + def test_save_bc(self): + responses.add(responses.POST, self.savebc_url, + json=self._read('test_save_bc.json'), + status=200) + + resp = self.backend.save_bc() + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_get_peer_list(self): + responses.add(responses.POST, self.getpeerlist_url, + json=self._read('test_get_peer_list.json'), + status=200) + + resp = self.backend.get_peer_list() + + white0 = resp['white_list'][0] + gray0 = resp['gray_list'][0] + + self.assertEqual(white0['host'], '204.8.15.5') + self.assertEqual(white0['ip'], 84871372) + self.assertEqual(white0['port'], 18080) + self.assertEqual(white0['id'], 702714784157243868) + + self.assertEqual(gray0['host'], '92.233.45.0') + self.assertEqual(gray0['ip'], 3008860) + self.assertEqual(gray0['port'], 5156) + self.assertEqual(gray0['id'], 779474923786790553) + + @responses.activate + def test_set_log_hashrate_mining(self): + responses.add(responses.POST, self.setloghashrate_url, + json=self._read('test_set_log_hash_rate_mining.json'), + status=200) + + resp = self.backend.set_log_hash_rate(True) + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_set_log_hashrate_notmining(self): + responses.add(responses.POST, self.setloghashrate_url, + json=self._read('test_set_log_hash_rate_notmining.json'), + status=200) + + with self.assertRaises(RPCError): + resp = self.backend.set_log_hash_rate(False) + + @responses.activate + def test_set_log_level(self): + responses.add(responses.POST, self.setloglevel_url, + json=self._read('test_set_log_level.json'), + status=200) + + resp = self.backend.set_log_level(1) + + with self.assertRaises(ValueError): + resp = self.backend.set_log_level(5) + + self.assertEqual(JSONRPCDaemon.known_log_levels(), JSONRPCDaemon._KNOWN_LOG_LEVELS) + + @responses.activate + def test_set_log_categories_default(self): + responses.add(responses.POST, self.setlogcategories_url, + json=self._read('test_set_log_categories_default.json'), + status=200) + + resp = self.backend.set_log_categories('default:INFO') + + self.assertEqual(resp['status'], 'OK') + self.assertEqual(resp['categories'], 'default:INFO') + + self.assertEqual(JSONRPCDaemon.known_log_categories(), JSONRPCDaemon._KNOWN_LOG_CATEGORIES) + + @responses.activate + def test_set_log_categories_multiple(self): + responses.add(responses.POST, self.setlogcategories_url, + json=self._read('test_set_log_categories_multiple.json'), + status=200) + + resp = self.backend.set_log_categories(['logging:INFO', 'net:FATAL']) + + self.assertEqual(resp['categories'], 'logging:INFO,net:FATAL') + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_set_log_categories_empty(self): + responses.add(responses.POST, self.setlogcategories_url, + json=self._read('test_set_log_categories_empty.json'), + status=200) + + resp = self.backend.set_log_categories() + + self.assertEqual(resp['categories'], '') + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_get_transaction_pool(self): + responses.add(responses.POST, self.mempool_url, + json=self._read('test_get_transaction_pool.json'), + status=200) + + resp = self.backend.get_transaction_pool() + + self.assertEqual(resp['spent_key_images'][0]['id_hash'], '1ccff101d8ee93903bde0a8ef99ebc99ccd5150f7157b93b758cd456458d4166') + self.assertEqual(resp['spent_key_images'][0]['txs_hashes'][0], '73fe0207e25d59dce5cd6f7369edf33a04ac56409eca3b28ad837c43640ef83f') + self.assertEqual(resp['transactions'][0]['id_hash'], 'ea020cf2595c017d5fd4d0d427b8ff02b1857e996136b041c0f7fd6dffc4c72c') + + @responses.activate + def test_get_transaction_pool_stats(self): + responses.add(responses.POST, self.gettransactionpoolstats_url, + json=self._read('test_get_transaction_pool_stats.json'), + status=200) + + resp = self.backend.get_transaction_pool_stats() + + self.assertEqual(resp['pool_stats']['bytes_total'], 75438) + self.assertEqual(resp['pool_stats']['txs_total'], 17) + self.assertEqual(resp['pool_stats']['histo'][0]['bytes'], 3419) + self.assertEqual(resp['pool_stats']['histo'][0]['txs'], 2) + + @responses.activate + def test_stop_daemon(self): + responses.add(responses.POST, self.stopdaemon_url, + json=self._read('test_stop_daemon.json'), + status=200) + + resp = self.backend.stop_daemon() + + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_get_limit(self): + responses.add(responses.POST, self.getlimit_url, + json=self._read('test_get_limit.json'), + status=200) + + resp = self.backend.get_limit() + + self.assertEqual(resp['limit_down'], 8192) + self.assertEqual(resp['limit_up'], 2048) + self.assertEqual(resp['status'], 'OK') + + @responses.activate + def test_out_peers(self): + responses.add(responses.POST, self.outpeers_url, + json=self._read('test_out_peers.json'), + status=200) + + resp = self.backend.out_peers(16) + + self.assertEqual(resp['out_peers'], 16) + + with self.assertRaises(ValueError): + resp = self.backend.out_peers(2**32) + + @responses.activate + def test_out_peers_unlimited(self): + responses.add(responses.POST, self.outpeers_url, + json=self._read('test_out_peers_unlimited.json'), + status=200) + + resp = self.backend.out_peers(-1) + + self.assertEqual(resp['out_peers'], 2**32 - 1) + + @responses.activate + def test_in_peers(self): + responses.add(responses.POST, self.inpeers_url, + json=self._read('test_in_peers.json'), + status=200) + + resp = self.backend.in_peers(128) + + self.assertEqual(resp['in_peers'], 128) + + with self.assertRaises(ValueError): + resp = self.backend.in_peers(2**32) + + @responses.activate + def test_in_peers_unlimited(self): + responses.add(responses.POST, self.inpeers_url, + json=self._read('test_in_peers_unlimited.json'), + status=200) + + resp = self.backend.in_peers(-1) + + self.assertEqual(resp['in_peers'], 2**32 - 1) + + @responses.activate + def test_get_outs(self): + responses.add(responses.POST, self.getouts_url, + json=self._read('test_get_outs_multiple.json'), + status=200) + + a = [0, decimal.Decimal('0'), decimal.Decimal('20'), int(3e12)] + i = [20000, 20001, 50630, 232237] + resp = self.backend.get_outs(a, i) + + self.assertEqual(resp['outs'][0]['height'], 1224094) + self.assertEqual(resp['outs'][0]['key'], 'fc13952b8b9c193d4c875e750e88a0da8a7d348f95c019cfde93762d68298dd7') + self.assertEqual(resp['outs'][0]['mask'], 'bf99dc047048605f6e0aeebc937477ae6e9e3143e1be1b48af225b41f809e44e') + self.assertEqual(resp['outs'][0]['txid'], '687f9b1d6fa409a13e84c682e90127b1953e10efe679c114a01d7db77f474d50') + self.assertEqual(resp['outs'][0]['unlocked'], True) + + self.assertEqual(resp['outs'][3]['height'], 999999) + self.assertEqual(resp['outs'][3]['key'], 'e20315663e3d278421797c4098c828cad5220849d08c3d26fee72003d4cda698') + self.assertEqual(resp['outs'][3]['mask'], '100c6f1342b71b73edddc5492be923182f00a683488ec3a2a1c7a949cbe57768') + self.assertEqual(resp['outs'][3]['txid'], '2a5d456439f7ae27b5d26e493651c0e24e1d7e02b6d9d019c89d562ce0658472') + self.assertEqual(resp['outs'][3]['unlocked'], True) + + @responses.activate + def test_get_outs_single(self): + responses.add(responses.POST, self.getouts_url, + json=self._read('test_get_outs_single.json'), + status=200) + + resp = self.backend.get_outs(0, 10000) + + self.assertEqual(resp['outs'][0]['height'], 1222460) + self.assertEqual(resp['outs'][0]['key'], '9c7055cb5b790f1eebf10b7b8fbe01241eb736b5766d15554da7099bbcdc4b44') + self.assertEqual(resp['outs'][0]['mask'], '42e37af85cddaeccbea6fe597037c9377045a682e66661260868877b9440af70') + self.assertEqual(resp['outs'][0]['txid'], 'b357374ad4636f17520b6c2fdcf0fb5e6a1185fed2aef509b19b5100d04ae552') + self.assertEqual(resp['outs'][0]['unlocked'], True) + + @responses.activate + def test_update_check_none(self): + responses.add(responses.POST, self.update_url, + json=self._read('test_update_check_none.json'), + status=200) + + resp = self.backend.update('check') + + self.assertEqual(resp['update'], False) + self.assertEqual(resp['auto_uri'], '') + self.assertEqual(resp['hash'], '') + self.assertEqual(resp['path'], '') + self.assertEqual(resp['user_uri'], '') + self.assertEqual(resp['version'], '') + self.assertEqual(resp['status'], 'OK') + + with self.assertRaises(ValueError): + self.backend.update('badcommandrightherebuddyolpal') + + @responses.activate + def test_restricted_false(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_sync_info.json'), + status=200) + + self.assertFalse(self.backend.restricted()) + + @responses.activate + def test_restricted_true(self): + responses.add(responses.POST, self.jsonrpc_url, + json=self._read('test_method_not_found.json'), + status=200) + + self.assertTrue(self.backend.restricted()) \ No newline at end of file From e77e9e6a1ce506a888c05a83690edb10eafc04c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Ryan Date: Fri, 26 Feb 2021 01:22:29 -0600 Subject: [PATCH 5/5] Updated docs for new JSONRPCDaemon methods --- docs/source/daemon.rst | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/docs/source/daemon.rst b/docs/source/daemon.rst index 65eeffa..acabdd7 100644 --- a/docs/source/daemon.rst +++ b/docs/source/daemon.rst @@ -151,6 +151,47 @@ The second transaction failed because it used the same inputs as the previous on checks all incoming transactions for possible double-spends and rejects them if such conflict is discovered. +Other RPC Commands +------------------ + +Any RPC commands not available in the Daemon class, are likely available in the JSONRPCDaemon +class. The official Monero Daemon RPC Documentation can be found +`here `. At the time of +writing, all the RPC commands from the documentation have been implemented in JSONRPCDaemon, with +the exception of any .bin commands, `/get_txpool_backlog`, and `/get_output_distribution`. These +methods share the same name as their corresponding RPC names, and unlike the Daemon methods, the +methods in JSONRPCDaemon are designed to be lower-level. As such, the return values of these +methods reflect the raw JSON objects returned by the daemon. An example: + +.. code-block:: python + [In 20]: from monero.backends.jsonrpc import JSONRPCDaemon + + [In 21]: daemon = JSONRPCDaemon(host='192.168.0.50') + + [In 22]: sync_info = daemon.sync_info() + + [In 23]: sync_info['height'] + [Out 23]: 2304844 + + [In 24]: daemon.get_bans() + [Out 24]: + { + "bans": [ + { + "host": "145.239.118.5", + "ip": 91680657, + "seconds": 72260 + }, + { + "host": "146.59.156.116", + "ip": 1956395922, + "seconds": 69397 + } + ], + "status": "OK", + "untrusted": False + } + API reference -------------