From 88551c800cc9ad335b27b4eb4946cc1bb2cde4a3 Mon Sep 17 00:00:00 2001 From: Boog900 Date: Thu, 18 Jul 2024 20:34:56 +0000 Subject: [PATCH 1/3] Books: document p2p protocol (#216) * add admin message definitions * add block complete entry * add protocol messages * add most flows * add final flows * fix typos * move link to epee * review fixes --- books/protocol/src/SUMMARY.md | 11 +- books/protocol/src/p2p_network.md | 2 +- .../protocol/src/p2p_network/common_types.md | 116 +++++++++++++++++ books/protocol/src/p2p_network/epee.md | 3 - books/protocol/src/p2p_network/levin.md | 24 +++- books/protocol/src/p2p_network/levin/admin.md | 102 +++++++++++++++ .../src/p2p_network/levin/protocol.md | 121 ++++++++++++++++++ .../protocol/src/p2p_network/message_flows.md | 19 +++ .../p2p_network/message_flows/chain_sync.md | 28 ++++ .../p2p_network/message_flows/get_blocks.md | 19 +++ .../p2p_network/message_flows/handshake.md | 51 ++++++++ .../p2p_network/message_flows/new_block.md | 29 +++++ .../message_flows/new_transactions.md | 16 +++ .../p2p_network/message_flows/timed_sync.md | 28 ++++ books/protocol/src/p2p_network/messages.md | 37 ------ 15 files changed, 559 insertions(+), 47 deletions(-) create mode 100644 books/protocol/src/p2p_network/common_types.md delete mode 100644 books/protocol/src/p2p_network/epee.md create mode 100644 books/protocol/src/p2p_network/levin/admin.md create mode 100644 books/protocol/src/p2p_network/levin/protocol.md create mode 100644 books/protocol/src/p2p_network/message_flows.md create mode 100644 books/protocol/src/p2p_network/message_flows/chain_sync.md create mode 100644 books/protocol/src/p2p_network/message_flows/get_blocks.md create mode 100644 books/protocol/src/p2p_network/message_flows/handshake.md create mode 100644 books/protocol/src/p2p_network/message_flows/new_block.md create mode 100644 books/protocol/src/p2p_network/message_flows/new_transactions.md create mode 100644 books/protocol/src/p2p_network/message_flows/timed_sync.md delete mode 100644 books/protocol/src/p2p_network/messages.md diff --git a/books/protocol/src/SUMMARY.md b/books/protocol/src/SUMMARY.md index 1a4b1f0..682e0e7 100644 --- a/books/protocol/src/SUMMARY.md +++ b/books/protocol/src/SUMMARY.md @@ -23,5 +23,14 @@ - [Bulletproofs+](./consensus_rules/transactions/ring_ct/bulletproofs+.md) - [P2P Network](./p2p_network.md) - [Levin Protocol](./p2p_network/levin.md) - - [P2P Messages](./p2p_network/messages.md) + - [Admin Messages](./p2p_network/levin/admin.md) + - [Protocol Messages](./p2p_network/levin/protocol.md) + - [Common Types](./p2p_network/common_types.md) + - [Message Flows](./p2p_network/message_flows.md) + - [Handshake](./p2p_network/message_flows/handshake.md) + - [Timed Sync](./p2p_network/message_flows/timed_sync.md) + - [New Block](./p2p_network/message_flows/new_block.md) + - [New Transactions](./p2p_network/message_flows/new_transactions.md) + - [Chain Sync](./p2p_network/message_flows/chain_sync.md) + - [Get Blocks](./p2p_network/message_flows/get_blocks.md) - [Pruning](./pruning.md) diff --git a/books/protocol/src/p2p_network.md b/books/protocol/src/p2p_network.md index e0d9a79..89bd1be 100644 --- a/books/protocol/src/p2p_network.md +++ b/books/protocol/src/p2p_network.md @@ -1,3 +1,3 @@ # P2P Network -This chapter contains descriptions of Monero's peer to peer network, including messages, flows, expected responses, etc. +This chapter contains descriptions of Monero's peer to peer network, including messages, flows, etc. diff --git a/books/protocol/src/p2p_network/common_types.md b/books/protocol/src/p2p_network/common_types.md new file mode 100644 index 0000000..0bf29cb --- /dev/null +++ b/books/protocol/src/p2p_network/common_types.md @@ -0,0 +1,116 @@ +# Common P2P Types + +This chapter contains definitions of types used in multiple P2P messages. + +### Support Flags + +Support flags specify any protocol extensions the peer supports, currently only the first bit is used: + +`FLUFFY_BLOCKS = 1` - for if the peer supports receiving fluffy blocks. + +### Basic Node Data [^b-n-d] { #basic-node-data } + +| Fields | Type | Description | +|------------------------|---------------------------------------|-------------------------------------------------------------------------------------------| +| `network_id` | A UUID (epee string) | A fixed constant value for a specific network (mainnet,testnet,stagenet) | +| `my_port` | u32 | The peer's inbound port, if the peer does not want inbound connections this should be `0` | +| `rpc_port` | u16 | The peer's RPC port, if the peer does not want inbound connections this should be `0` | +| `rpc_credits_per_hash` | u32 | States how much it costs to use this node in credits per hashes, `0` being free | +| `peer_id` | u64 | A fixed ID for the node, set to 1 for anonymity networks | +| `support_flags` | [support flags](#support-flags) (u32) | Specifies any protocol extensions the peer supports | + +### Core Sync Data [^c-s-d] { #core-sync-data } + +| Fields | Type | Description | +|-------------------------------|------------------------|---------------------------------------------------------------| +| `current_height` | u64 | The current chain height | +| `cumulative_difficulty` | u64 | The low 64 bits of the cumulative difficulty | +| `cumulative_difficulty_top64` | u64 | The high 64 bits of the cumulative difficulty | +| `top_id` | [u8; 32] (epee string) | The hash of the top block | +| `top_version` | u8 | The hardfork version of the top block | +| `pruning_seed` | u32 | THe pruning seed of the node, `0` if the node does no pruning | + +### Network Address [^network-addr] { #network-address } + +Network addresses are serialized differently than other types, the fields needed depend on the `type` field: + +| Fields | Type | Description | +| ------ | --------------------------------------- | ---------------- | +| `type` | u8 | The address type | +| `addr` | An object whose fields depend on `type` | The address | + +#### IPv4 + +`type = 1` + +| Fields | Type | Description | +| -------- | ---- | ---------------- | +| `m_ip` | u32 | The IPv4 address | +| `m_port` | u16 | The port | + + +#### IPv6 + +`type = 2` + +| Fields | Type | Description | +| -------- | ---------------------- | ---------------- | +| `addr` | [u8; 16] (epee string) | The IPv6 address | +| `m_port` | u16 | The port | + +#### Tor + +TODO: + +#### I2p + +TODO: + +### Peer List Entry Base [^pl-entry-base] { #peer-list-entry-base } + +| Fields | Type | Description | +|------------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------| +| `adr` | [Network Address](#network-address) | The address of the peer | +| `id` | u64 | The random, self assigned, ID of this node | +| `last_seen` | i64 | A field marking when this peer was last seen, although this is zeroed before sending over the network | +| `pruning_seed` | u32 | This peer's pruning seed, `0` if the peer does no pruning | +| `rpc_port` | u16 | This node's RPC port, `0` if this peer has no public RPC port. | +| `rpc_credits_per_hash` | u32 | States how much it costs to use this node in credits per hashes, `0` being free | + +### Tx Blob Entry [^tb-entry] { #tx-blob-entry } + +| Fields | Type | Description | +| --------------- | ---------------------- | --------------------------------------- | +| `blob` | bytes (epee string) | The pruned tx blob | +| `prunable_hash` | [u8; 32] (epee string) | The hash of the prunable part of the tx | + +### Block Complete Entry [^bc-entry] { #block-complete-entry } + +| Fields | Type | Description | +|----------------|---------------------|-----------------------------------------------------------| +| `pruned` | bool | True if the block is pruned, false otherwise | +| `block` | bytes (epee string) | The block blob | +| `block_weight` | u64 | The block's weight | +| `txs` | depends on `pruned` | The transaction blobs, the exact type depends on `pruned` | + +If `pruned` is true: + +`txs` is a vector of [Tx Blob Entry](#tx-blob-entry) + +If `pruned` is false: + +`txs` is a vector of bytes. + +--- + +[^b-n-d]: + +[^c-s-d]: + +[^network-addr]: + +[^pl-entry-base]: + +[^tb-entry]: + +[^bc-entry]: diff --git a/books/protocol/src/p2p_network/epee.md b/books/protocol/src/p2p_network/epee.md deleted file mode 100644 index 2f8161d..0000000 --- a/books/protocol/src/p2p_network/epee.md +++ /dev/null @@ -1,3 +0,0 @@ -# Epee Binary Format - -The epee binary format is described here: TODO diff --git a/books/protocol/src/p2p_network/levin.md b/books/protocol/src/p2p_network/levin.md index de74660..ec92f7d 100644 --- a/books/protocol/src/p2p_network/levin.md +++ b/books/protocol/src/p2p_network/levin.md @@ -10,16 +10,16 @@ of buckets that will be combined into a single message. ### Bucket Format | Field | Type | Size (bytes) | -| ------ | ----------------------------- | ------------ | +|--------|-------------------------------|--------------| | Header | [BucketHeader](#bucketheader) | 33 | | Body | bytes | dynamic | ### BucketHeader -Format: +Format[^header-format]: | Field | Type | Size (bytes) | -| ---------------- | ------ | ------------ | +|------------------|--------|--------------| | Signature | LE u64 | 8 | | Size | LE u64 | 8 | | Expect Response | bool | 1 | @@ -32,7 +32,7 @@ Format: The signature field is fixed for every bucket and is used to tell apart peers running different protocols. -Its value should be `0x0101010101012101` +Its value should be `0x0101010101012101` [^signature] #### Size @@ -53,7 +53,7 @@ responses should be `1`. #### Flags -This is a bit-flag field that determines what type of bucket this is: +This is a bit-flag field that determines what type of bucket this is[^flags]: | Type | Bits set | | -------------- | ----------- | @@ -66,3 +66,17 @@ This is a bit-flag field that determines what type of bucket this is: #### Protocol Version This is a fixed value of 1. + +## Bucket Body + +All bucket bodies are serialized in the epee binary format which is described here: https://github.com/monero-project/monero/blob/cc73fe71162d564ffda8e549b79a350bca53c454/docs/PORTABLE_STORAGE.md + +Exact message types are described in the next chapters. + +--- + +[^header-format]: + +[^signature]: + +[^flags]: diff --git a/books/protocol/src/p2p_network/levin/admin.md b/books/protocol/src/p2p_network/levin/admin.md new file mode 100644 index 0000000..6f2b716 --- /dev/null +++ b/books/protocol/src/p2p_network/levin/admin.md @@ -0,0 +1,102 @@ +# Admin Messages + +This chapter describes admin messages, and documents the current admin messages. Admin messages are a subset of messages that handle connection +creation, making sure connections are still alive, and sharing peer lists. + +## Levin + +All admin messages are in the request/response levin format. This means requests will set the [expect response bit](./levin.md#expect-response) and +responses will set the return code to [`1`](./levin.md#return-code). + +## Messages + +### Handshake + +ID: `1001`[^handshake-id] + +#### Request [^handshake-req] { #handshake-request } + +| Fields | Type | Description | +|----------------|-------------------------------------------------------|--------------------------------------| +| `node_data` | [basic node data](../common_types.md#basic-node-data) | Static information about our node | +| `payload_data` | [core sync data](../common_types.md#core-sync-data) | Information on the node's sync state | + +#### Response [^handshake-res] { #handshake-response } + +| Fields | Type | Description | +|----------------------|--------------------------------------------------------------------------|-----------------------------------------| +| `node_data` | [basic node data](../common_types.md#basic-node-data) | Static information about our node | +| `payload_data` | [core sync data](../common_types.md#core-sync-data) | Information on the node's sync state | +| `local_peerlist_new` | A Vec of [peer list entry base](../common_types.md#peer-list-entry-base) | A list of peers in the node's peer list | + +### Timed Sync + +ID: `1002`[^timed-sync-id] + +#### Request [^timed-sync-req] { #timed-sync-request } + +| Fields | Type | Description | +| -------------- | --------------------------------------------------- | ------------------------------------ | +| `payload_data` | [core sync data](../common_types.md#core-sync-data) | Information on the node's sync state | + +#### Response [^timed-sync-res] { #timed-sync-response } + +| Fields | Type | Description | +|----------------------|--------------------------------------------------------------------------|-----------------------------------------| +| `payload_data` | [core sync data](../common_types.md#core-sync-data) | Information on the node's sync state | +| `local_peerlist_new` | A Vec of [peer list entry base](../common_types.md#peer-list-entry-base) | A list of peers in the node's peer list | + +### Ping + +ID: `1003`[^ping-id] + +#### Request [^ping-req] { #ping-request } + +No data is serialized for a ping request. + +#### Response [^ping-res] { #ping-response } + +| Fields | Type | Description | +| --------- | ------ | --------------------------------- | +| `status` | string | Will be `OK` for successful pings | +| `peer_id` | u64 | The self assigned id of the peer | + +### Request Support Flags + +ID: `1007`[^support-flags] + +#### Request [^sf-req] { #support-flags-request } + +No data is serialized for a ping request. + +#### Response [^sf-res] { #support-flags-response } + +| Fields | Type | Description | +| --------------- | ---- | ------------------------------------------------------------ | +| `support_flags` | u32 | The peer's [support flags](../common_types.md#support-flags) | + +--- + +[^handshake-id]: + +[^handshake-req]: + +[^handshake-res]: + +[^timed-sync-id]: + +[^timed-sync-req]: + +[^timed-sync-res]: + +[^ping-id]: + +[^ping-req]: + +[^ping-res]: + +[^support-flags]: + +[^sf-req]: + +[^sf-res]: diff --git a/books/protocol/src/p2p_network/levin/protocol.md b/books/protocol/src/p2p_network/levin/protocol.md new file mode 100644 index 0000000..a52ca1d --- /dev/null +++ b/books/protocol/src/p2p_network/levin/protocol.md @@ -0,0 +1,121 @@ +# Protocol Messages + +This chapter describes protocol messages, and documents the current protocol messages. Protocol messages are used to share protocol data +like blocks and transactions. + +## Levin + +All protocol messages are in the notification levin format. Although there are some messages that fall under requests/responses, levin will treat them as notifications. + +All admin messages are in the request/response levin format. This means requests will set the [expect response bit](../levin.md#expect-response) and +responses will set the return code to [`1`](../levin.md#return-code). + +## Messages + +### Notify New Block + +ID: `2001`[^notify-new-block-id] + +| Fields | Type | Description | +| --------------------------- | --------------------------------------------------------------- | ------------------------ | +| `b` | [Block Complete Entry](../common_types.md#block-complete-entry) | The full block | +| `current_blockchain_height` | u64 | The current chain height | + +### Notify New Transactions + +ID: `2002`[^notify-new-transactions-id] + +| Fields | Type | Description | +| ------------------- | ----------------- | ------------------------------------------------------ | +| `txs` | A vector of bytes | The txs | +| `_` | Bytes | Padding to prevent traffic volume analysis | +| `dandelionpp_fluff` | bool | True if this message contains fluff txs, false if stem | + +### Notify Request Get Objects + +ID: `2003`[^notify-request-get-objects-id] + +| Fields | Type | Description | +|----------|----------------------------------------------------|------------------------------------------------------------| +| `blocks` | A vector of [u8; 32] serialized as a single string | The block IDs requested | +| `prune` | bool | True if we want the blocks in pruned form, false otherwise | + +### Notify Response Get Objects + +ID: `2004`[^notify-response-get-objects-id] + +| Fields | Type | Description | +| --------------------------- | --------------------------------------------------------------------------- | ------------------------------ | +| `blocks` | A vector of [Block Complete Entry](../common_types.md#block-complete-entry) | The blocks that were requested | +| `missed_ids` | A vector of [u8; 32] serialized as a single string | IDs of any missed blocks | +| `current_blockchain_height` | u64 | The current blockchain height | + +### Notify Request Chain + +ID: `2006`[^notify-request-chain-id] + +| Fields | Type | Description | +|-------------|----------------------------------------------------|-------------------------------------------------------------------------------------------------------| +| `block_ids` | A vector of [u8; 32] serialized as a single string | A list of block IDs in reverse chronological order, the top and genesis block will always be included | +| `prune` | bool | True if we want the response to contain pruned blocks, false otherwise | + +### Notify Response Chain Entry + +ID: `2007`[^notify-response-chain-entry-id] + +| Fields | Type | Description | +|-------------------------------|----------------------------------------------------|------------------------------------------------| +| `start_height` | u64 | The start height of the entry | +| `total_height` | u64 | The height of the peer's blockchain | +| `cumulative_difficulty` | u64 | The low 64 bits of the cumulative difficulty | +| `cumulative_difficulty_top64` | u64 | The high 64 bits of the cumulative difficulty | +| `m_block_ids` | A vector of [u8; 32] serialized as a single string | The block IDs in this entry | +| `m_block_weights` | A vector of u64 serialized as a single string | The block weights | +| `first_block` | bytes (epee string) | The header of the first block in `m_block_ids` | + +### Notify New Fluffy Block + +ID: `2008`[^notify-new-fluffy-block-id] + +| Fields | Type | Description | +| --------------------------- | --------------------------------------------------------------- | ------------------------------------- | +| `b` | [Block Complete Entry](../common_types.md#block-complete-entry) | The block, may or may not contain txs | +| `current_blockchain_height` | u64 | The current chain height | + +### Notify Request Fluffy Missing Tx + +ID: `2009`[^notify-request-fluffy-missing-tx-id] + +| Fields | Type | Description | +|-----------------------------|-----------------------------------------------|--------------------------------------------| +| `block_hash` | [u8; 32] serialized as a string | The block hash txs are needed from | +| `current_blockchain_height` | u64 | The current chain height | +| `missing_tx_indices` | A vector of u64 serialized as a single string | The indices of the needed txs in the block | + +### Notify Get Txpool Compliment + +ID: `2010`[^notify-get-txpool-compliment-id] + +| Fields | Type | Description | +| -------- | ------------------------------------------- | ---------------------- | +| `hashes` | A vector of [u8; 32] serialized as a string | The current txpool txs | + +--- + +[^notify-new-block-id]: + +[^notify-new-transactions-id]: + +[^notify-request-get-objects-id]: + +[^notify-response-get-objects-id]: + +[^notify-request-chain-id]: + +[^notify-response-chain-entry-id]: + +[^notify-new-fluffy-block-id]: + +[^notify-request-fluffy-missing-tx-id]: + +[^notify-get-txpool-compliment-id]: diff --git a/books/protocol/src/p2p_network/message_flows.md b/books/protocol/src/p2p_network/message_flows.md new file mode 100644 index 0000000..8f1004c --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows.md @@ -0,0 +1,19 @@ +# Message Flows + +Message flows are sets of messages sent between peers, that achieve an identifiable goal, like a handshake. +Some message flows are complex, involving many message types, whereas others are simple, requiring only 1. + +The message flows here are not every possible request/response. + +When documenting checks on the messages, not all checks are documented, only the ones notable. This should help +to reduce the maintenance burden. + +## Different Flows + +- [Handshakes](./message_flows/handshake.md) +- [Timed Sync](./message_flows/timed_sync.md) +- [New Block](./message_flows/new_block.md) +- [New Transactions](./message_flows/new_transactions.md) +- [Chain Sync](./message_flows/chain_sync.md) +- [Get Blocks](./message_flows/get_blocks.md) + diff --git a/books/protocol/src/p2p_network/message_flows/chain_sync.md b/books/protocol/src/p2p_network/message_flows/chain_sync.md new file mode 100644 index 0000000..1b66132 --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/chain_sync.md @@ -0,0 +1,28 @@ +# Chain Sync + +Chain sync is the first step in syncing a peer's blockchain, it allows a peers to find the split point in their chains and for the peer +to learn about the missing block IDs. + +## Flow + +The first step is for the initiating peer is to get its compact chain history. The compact chain history must be in reverse chronological +order, with the first block being the top block and the last the genesis, if the only block is the genesis then that only needs to be included +once. The blocks in the middle are not enforced to be at certain locations, however `monerod` will use the top 11 blocks and will then go power +of 2 offsets from then on, i.e. `{13, 17, 25, ...}` + +Then, with the compact history, the initiating peer will send a [request chain](../levin/protocol.md#notify-request-chain) message, the receiving +peer will then find the split point and return a [response chain entry](../levin/protocol.md#notify-response-chain-entry) message. + +The `response chain entry` will contain a list of block IDs with the first being a common ancestor and the rest being the next blocks that come after +that block in the peer's chain. + +### Response Checks + +- There must be an overlapping block.[^res-overlapping-block] +- The amount of returned block IDs must be less than `25,000`.[^res-max-blocks] + +--- + +[^res-overlapping-block]: + +[^res-max-blocks]: \ No newline at end of file diff --git a/books/protocol/src/p2p_network/message_flows/get_blocks.md b/books/protocol/src/p2p_network/message_flows/get_blocks.md new file mode 100644 index 0000000..eacca7f --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/get_blocks.md @@ -0,0 +1,19 @@ +# Get Blocks + +The get block flow is used to download batches of blocks from a peer. + +## Flow + +The initiating peer needs a list of block IDs that the receiving peer has, this can be done with +the [chain sync flow](./chain_sync.md). + +With a list a block IDs the initiating peer will send a [get objects request](../levin/protocol.md#notify-request-get-objects) message, the receiving +peer will then respond with [get objects response](../levin/protocol.md#notify-response-get-objects). + +### Request Checks + +- The amount of blocks must be less than `100`.[^max-block-requests] + +--- + +[^max-block-requests]: diff --git a/books/protocol/src/p2p_network/message_flows/handshake.md b/books/protocol/src/p2p_network/message_flows/handshake.md new file mode 100644 index 0000000..2a4abe1 --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/handshake.md @@ -0,0 +1,51 @@ +# Handshakes + +Handshakes are used to establish connections to peers. + +## Flow + +The default handshake flow is made up of the connecting peer sending a [handshake request](../levin/admin.md#handshake-request) and the +receiving peer responding with a [handshake response](../levin/admin.md#handshake-response). + +It should be noted that not all other messages are banned during handshakes, for example, support flag requests and even some protocol +requests can be sent. + +### Handshake Request Checks + +The receiving peer will check: + +- The `network_id` is network ID expected.[^network-id] +- The connection is an incoming connection.[^req-incoming-only] +- The peer hasn't already completed a handshake.[^double-handshake] +- If the network zone is public, then the `peer_id` must not be the same as ours.[^same-peer-id] +- The core sync data is not malformed.[^core-sync-data-checks] + +### Handshake Response Checks + +The initiating peer will check: + +- The `network_id` is network ID expected.[^res-network-id] +- The number of peers in the peer list is less than `250`.[^max-peer-list-res] +- All peers in the peer list are in the same zone.[^peers-all-in-same-zone] +- The core sync data is not malformed.[^core-sync-data-checks] +- If the network zone is public, then the `peer_id` must not be the same as ours.[^same-peer-id-res] + +--- + +[^network-id]: + +[^req-incoming-only]: + +[^double-handshake]: + +[^same-peer-id]: + +[^core-sync-data-checks]: + +[^res-network-id]: + +[^max-peer-list-res]: + +[^peers-all-in-same-zone]: + +[^same-peer-id-res]: diff --git a/books/protocol/src/p2p_network/message_flows/new_block.md b/books/protocol/src/p2p_network/message_flows/new_block.md new file mode 100644 index 0000000..452aa44 --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/new_block.md @@ -0,0 +1,29 @@ +# New Block + +This is used whenever a new block is to be sent to peers. Only the fluffy block flow is described here, as the other method is deprecated. + +## Flow + +First the peer with the new block will send a [new fluffy block](../levin/protocol.md#notify-new-fluffy-block) notification, if the receiving +peer has all the txs in the block then the flow is complete. Otherwise the peer sends a [fluffy missing transactions request](../levin/protocol.md#notify-request-fluffy-missing-tx) +to the first peer, the first peer will then respond with again a [new fluffy block](../levin/protocol.md#notify-new-fluffy-block) notification but +with the transactions requested. + +```bob + + ,-----------. ,----------. + | Initiator | | Receiver | + `-----+-----' `-----+----' + | New Fluffy Block | + |-------------------->| + | | + | Missing Txs Request | + |<- - - - - - - - - - | + | | + | New Fluffy Block | + | - - - - - - - - - ->| + | | + | | + V v +``` + diff --git a/books/protocol/src/p2p_network/message_flows/new_transactions.md b/books/protocol/src/p2p_network/message_flows/new_transactions.md new file mode 100644 index 0000000..2a90a3f --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/new_transactions.md @@ -0,0 +1,16 @@ +# New Transactions + +Monero uses the dandelion++ protocol to pass transactions around the network, this flow just describes the actual tx passing between nodes part. + +## Flow + +This flow is pretty simple, the txs are put into a [new transactions](../levin/protocol.md#notify-new-transactions) notification and sent to +peers. + +Hopefully in the future [this is changed](https://github.com/monero-project/monero/issues/9334). + +There must be no duplicate txs in the notification.[^duplicate-txs] + +--- + +[^duplicate-txs]: \ No newline at end of file diff --git a/books/protocol/src/p2p_network/message_flows/timed_sync.md b/books/protocol/src/p2p_network/message_flows/timed_sync.md new file mode 100644 index 0000000..4d258d7 --- /dev/null +++ b/books/protocol/src/p2p_network/message_flows/timed_sync.md @@ -0,0 +1,28 @@ +# Timed Syncs + +A timed sync request is sent every 60 seconds to make sure the connection is still live. + +## Flow + +First the timed sync initiator will send a [timed sync request](../levin/admin.md#timed-sync-request), the receiver will then +respond with a [timed sync response](../levin/admin.md#timed-sync-response) + +### Timed Sync Request Checks + +- The core sync data is not malformed.[^core-sync-data-checks] + + +### Timed Sync Response Checks + +- The core sync data is not malformed.[^core-sync-data-checks] +- The number of peers in the peer list is less than `250`.[^max-peer-list-res] +- All peers in the peer list are in the same zone.[^peers-all-in-same-zone] + +--- + +[^core-sync-data-checks]: + +[^max-peer-list-res]: + +[^peers-all-in-same-zone]: + diff --git a/books/protocol/src/p2p_network/messages.md b/books/protocol/src/p2p_network/messages.md deleted file mode 100644 index c3f1828..0000000 --- a/books/protocol/src/p2p_network/messages.md +++ /dev/null @@ -1,37 +0,0 @@ -# P2P Messages - -This chapter contains every P2P message. - -## Index - -## Types - -Types used in multiple P2P messages. - -### Support Flags - -Support flags specify any protocol extensions the peer supports, currently only the first bit is used: - -`FLUFFY_BLOCKS = 1` - for if the peer supports receiving fluffy blocks. - -### Basic Node Data - -| Fields | Type (Epee Type) | Description | -| ---------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------- | -| `network_id` | A UUID (String) | A fixed constant value for a specific network (mainnet,testnet,stagenet) | -| `my_port` | u32 (u32) | The peer's inbound port, if the peer does not want inbound connections this should be `0` | -| `rpc_port` | u16 (u16) | The peer's RPC port, if the peer does not want inbound connections this should be `0` | -| `rpc_credits_per_hash` | u32 (u32) | TODO | -| `peer_id` | u64 (u64) | A fixed ID for the node, set to 1 for anonymity networks | -| `support_flags` | [support flags](#support-flags) (u32) | Specifies any protocol extensions the peer supports | - -## Messages - -### Handshake Requests - -levin command: 1001 - -| Fields | Type (Epee Type) | Description | -| ----------- | -------------------------------------------- | ----------- | -| `node_data` | [basic node data](#basic-node-data) (Object) | | -| | | | From 0a88ea13fc853088ec6ba59c6c30eb1442993d99 Mon Sep 17 00:00:00 2001 From: hinto-janai Date: Thu, 18 Jul 2024 16:35:52 -0400 Subject: [PATCH 2/3] books: architecture skeleton (#224) * upstream https://github.com/hinto-janai/cuprate-architecture * tab -> 4 spaces --- books/architecture/README.md | 2 +- books/architecture/book.toml | 22 ++-- books/architecture/last-changed.css | 7 + books/architecture/src/SUMMARY.md | 123 +++++++++++++++++- .../src/appendix/build-targets.md | 7 + .../architecture/src/appendix/contributing.md | 2 + .../src/appendix/crate-documentation.md | 4 + books/architecture/src/appendix/intro.md | 1 + .../src/appendix/protocol-book.md | 2 + books/architecture/src/appendix/user-book.md | 1 + .../src/benchmarking/criterion.md | 1 + .../architecture/src/benchmarking/harness.md | 1 + books/architecture/src/benchmarking/intro.md | 1 + books/architecture/src/binary/cli.md | 1 + books/architecture/src/binary/config.md | 1 + books/architecture/src/binary/intro.md | 1 + books/architecture/src/binary/logging.md | 1 + .../src/birds-eye-view/components.md | 1 + .../architecture/src/birds-eye-view/intro.md | 1 + books/architecture/src/birds-eye-view/map.md | 1 + books/architecture/src/consensus/intro.md | 1 + books/architecture/src/consensus/todo.md | 1 + books/architecture/src/consensus/verifier.md | 1 + .../architecture/src/cuprate-architecture.md | 22 ++++ .../external-monero-libraries/cryptonight.md | 1 + .../src/external-monero-libraries/intro.md | 1 + .../external-monero-libraries/monero_serai.md | 2 + .../src/external-monero-libraries/randomx.md | 2 + books/architecture/src/foreword.md | 36 +++++ .../formats-protocols-types/cuprate-helper.md | 1 + .../formats-protocols-types/cuprate-types.md | 1 + .../src/formats-protocols-types/epee.md | 1 + .../src/formats-protocols-types/intro.md | 1 + .../src/formats-protocols-types/levin.md | 1 + .../formats-protocols-types/monero-serai.md | 1 + .../src/instrumentation/data-collection.md | 1 + .../architecture/src/instrumentation/intro.md | 2 + .../src/instrumentation/logging.md | 1 + books/architecture/src/intro.md | 4 + .../src/intro/how-to-use-this-book.md | 5 + books/architecture/src/intro/intro.md | 15 +++ .../src/intro/required-knowledge.md | 28 ++++ .../src/intro/who-this-book-is-for.md | 31 +++++ .../src/known-issues-and-tradeoffs/intro.md | 1 + .../known-issues-and-tradeoffs/networking.md | 1 + .../src/known-issues-and-tradeoffs/rpc.md | 1 + .../src/known-issues-and-tradeoffs/storage.md | 1 + .../architecture/src/networking/dandelion.md | 1 + books/architecture/src/networking/i2p.md | 1 + books/architecture/src/networking/intro.md | 1 + .../architecture/src/networking/ipv4-ipv6.md | 1 + books/architecture/src/networking/p2p.md | 1 + books/architecture/src/networking/proxy.md | 1 + books/architecture/src/networking/tor.md | 1 + .../concurrency-and-parallelism/intro.md | 32 +++++ .../concurrency-and-parallelism/map.md | 1 + .../the-block-downloader.md | 1 + .../the-database.md | 1 + .../the-rpc-server.md | 1 + .../the-verifier.md | 1 + .../thread-exit.md | 1 + .../src/resource-model/file-system.md | 1 + .../architecture/src/resource-model/intro.md | 1 + .../architecture/src/resource-model/memory.md | 1 + .../src/resource-model/sockets.md | 1 + books/architecture/src/rpc/handler.md | 1 + books/architecture/src/rpc/interface.md | 1 + books/architecture/src/rpc/intro.md | 3 + books/architecture/src/rpc/methods/intro.md | 1 + books/architecture/src/rpc/router.md | 1 + books/architecture/src/rpc/types/binary.md | 1 + books/architecture/src/rpc/types/intro.md | 1 + books/architecture/src/rpc/types/json.md | 1 + books/architecture/src/rpc/types/other.md | 1 + books/architecture/src/storage/blockchain.md | 1 + .../src/storage/database-abstraction.md | 1 + books/architecture/src/storage/intro.md | 1 + books/architecture/src/storage/pruning.md | 1 + .../src/storage/transaction-pool.md | 1 + books/architecture/src/testing/intro.md | 1 + books/architecture/src/testing/monero-data.md | 1 + books/architecture/src/testing/rpc-client.md | 1 + .../src/testing/spawning-monerod.md | 1 + books/architecture/src/zmq/intro.md | 1 + books/architecture/src/{ => zmq}/todo.md | 0 85 files changed, 401 insertions(+), 14 deletions(-) create mode 100644 books/architecture/last-changed.css create mode 100644 books/architecture/src/appendix/build-targets.md create mode 100644 books/architecture/src/appendix/contributing.md create mode 100644 books/architecture/src/appendix/crate-documentation.md create mode 100644 books/architecture/src/appendix/intro.md create mode 100644 books/architecture/src/appendix/protocol-book.md create mode 100644 books/architecture/src/appendix/user-book.md create mode 100644 books/architecture/src/benchmarking/criterion.md create mode 100644 books/architecture/src/benchmarking/harness.md create mode 100644 books/architecture/src/benchmarking/intro.md create mode 100644 books/architecture/src/binary/cli.md create mode 100644 books/architecture/src/binary/config.md create mode 100644 books/architecture/src/binary/intro.md create mode 100644 books/architecture/src/binary/logging.md create mode 100644 books/architecture/src/birds-eye-view/components.md create mode 100644 books/architecture/src/birds-eye-view/intro.md create mode 100644 books/architecture/src/birds-eye-view/map.md create mode 100644 books/architecture/src/consensus/intro.md create mode 100644 books/architecture/src/consensus/todo.md create mode 100644 books/architecture/src/consensus/verifier.md create mode 100644 books/architecture/src/cuprate-architecture.md create mode 100644 books/architecture/src/external-monero-libraries/cryptonight.md create mode 100644 books/architecture/src/external-monero-libraries/intro.md create mode 100644 books/architecture/src/external-monero-libraries/monero_serai.md create mode 100644 books/architecture/src/external-monero-libraries/randomx.md create mode 100644 books/architecture/src/foreword.md create mode 100644 books/architecture/src/formats-protocols-types/cuprate-helper.md create mode 100644 books/architecture/src/formats-protocols-types/cuprate-types.md create mode 100644 books/architecture/src/formats-protocols-types/epee.md create mode 100644 books/architecture/src/formats-protocols-types/intro.md create mode 100644 books/architecture/src/formats-protocols-types/levin.md create mode 100644 books/architecture/src/formats-protocols-types/monero-serai.md create mode 100644 books/architecture/src/instrumentation/data-collection.md create mode 100644 books/architecture/src/instrumentation/intro.md create mode 100644 books/architecture/src/instrumentation/logging.md create mode 100644 books/architecture/src/intro.md create mode 100644 books/architecture/src/intro/how-to-use-this-book.md create mode 100644 books/architecture/src/intro/intro.md create mode 100644 books/architecture/src/intro/required-knowledge.md create mode 100644 books/architecture/src/intro/who-this-book-is-for.md create mode 100644 books/architecture/src/known-issues-and-tradeoffs/intro.md create mode 100644 books/architecture/src/known-issues-and-tradeoffs/networking.md create mode 100644 books/architecture/src/known-issues-and-tradeoffs/rpc.md create mode 100644 books/architecture/src/known-issues-and-tradeoffs/storage.md create mode 100644 books/architecture/src/networking/dandelion.md create mode 100644 books/architecture/src/networking/i2p.md create mode 100644 books/architecture/src/networking/intro.md create mode 100644 books/architecture/src/networking/ipv4-ipv6.md create mode 100644 books/architecture/src/networking/p2p.md create mode 100644 books/architecture/src/networking/proxy.md create mode 100644 books/architecture/src/networking/tor.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/intro.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/map.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/the-block-downloader.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/the-database.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/the-rpc-server.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/the-verifier.md create mode 100644 books/architecture/src/resource-model/concurrency-and-parallelism/thread-exit.md create mode 100644 books/architecture/src/resource-model/file-system.md create mode 100644 books/architecture/src/resource-model/intro.md create mode 100644 books/architecture/src/resource-model/memory.md create mode 100644 books/architecture/src/resource-model/sockets.md create mode 100644 books/architecture/src/rpc/handler.md create mode 100644 books/architecture/src/rpc/interface.md create mode 100644 books/architecture/src/rpc/intro.md create mode 100644 books/architecture/src/rpc/methods/intro.md create mode 100644 books/architecture/src/rpc/router.md create mode 100644 books/architecture/src/rpc/types/binary.md create mode 100644 books/architecture/src/rpc/types/intro.md create mode 100644 books/architecture/src/rpc/types/json.md create mode 100644 books/architecture/src/rpc/types/other.md create mode 100644 books/architecture/src/storage/blockchain.md create mode 100644 books/architecture/src/storage/database-abstraction.md create mode 100644 books/architecture/src/storage/intro.md create mode 100644 books/architecture/src/storage/pruning.md create mode 100644 books/architecture/src/storage/transaction-pool.md create mode 100644 books/architecture/src/testing/intro.md create mode 100644 books/architecture/src/testing/monero-data.md create mode 100644 books/architecture/src/testing/rpc-client.md create mode 100644 books/architecture/src/testing/spawning-monerod.md create mode 100644 books/architecture/src/zmq/intro.md rename books/architecture/src/{ => zmq}/todo.md (100%) diff --git a/books/architecture/README.md b/books/architecture/README.md index e487843..88e86eb 100644 --- a/books/architecture/README.md +++ b/books/architecture/README.md @@ -1,4 +1,4 @@ -## Cuprate's architecture (implementation) book +## Cuprate's architecture book This book documents Cuprate's architecture and implementation. See: diff --git a/books/architecture/book.toml b/books/architecture/book.toml index 76724aa..996f7fe 100644 --- a/books/architecture/book.toml +++ b/books/architecture/book.toml @@ -1,19 +1,17 @@ [book] -authors = ["hinto-janai"] +authors = ["Cuprate Contributors"] language = "en" multilingual = false src = "src" title = "Cuprate Architecture" git-repository-url = "https://github.com/Cuprate/architecture-book" -# TODO: fix after importing real files. -# -# [preprocessor.last-changed] -# command = "mdbook-last-changed" -# renderer = ["html"] -# -# [output.html] -# default-theme = "ayu" -# preferred-dark-theme = "ayu" -# git-repository-url = "https://github.com/hinto-janai/cuprate-architecture" -# additional-css = ["last-changed.css"] +[preprocessor.last-changed] +command = "mdbook-last-changed" +renderer = ["html"] + +[output.html] +default-theme = "ayu" +preferred-dark-theme = "ayu" +git-repository-url = "https://github.com/Cuprate/architecture-book" +additional-css = ["last-changed.css"] diff --git a/books/architecture/last-changed.css b/books/architecture/last-changed.css new file mode 100644 index 0000000..a9abae5 --- /dev/null +++ b/books/architecture/last-changed.css @@ -0,0 +1,7 @@ +footer { + font-size: 0.8em; + text-align: center; + border-top: 1px solid; + margin-top: 4%; + padding: 5px 0; +} \ No newline at end of file diff --git a/books/architecture/src/SUMMARY.md b/books/architecture/src/SUMMARY.md index 2b8615c..74ecda6 100644 --- a/books/architecture/src/SUMMARY.md +++ b/books/architecture/src/SUMMARY.md @@ -1,3 +1,124 @@ # Summary -- [TODO](todo.md) +[Cuprate Architecture](cuprate-architecture.md) +[🟡 Foreword](foreword.md) + +--- + +- [🟠 Intro](intro/intro.md) + - [🟡 Who this book is for](intro/who-this-book-is-for.md) + - [🔴 Required knowledge](intro/required-knowledge.md) + - [🔴 How to use this book](intro/how-to-use-this-book.md) + +--- + +- [⚪️ Bird's eye view](birds-eye-view/intro.md) + - [⚪️ Map](birds-eye-view/map.md) + - [⚪️ Components](birds-eye-view/components.md) + +--- + +- [⚪️ Formats, protocols, types](formats-protocols-types/intro.md) + - [⚪️ monero_serai](formats-protocols-types/monero-serai.md) + - [⚪️ cuprate_types](formats-protocols-types/cuprate-types.md) + - [⚪️ cuprate_helper](formats-protocols-types/cuprate-helper.md) + - [⚪️ Epee](formats-protocols-types/epee.md) + - [⚪️ Levin](formats-protocols-types/levin.md) + +--- + +- [⚪️ Storage](storage/intro.md) + - [⚪️ Database abstraction](storage/database-abstraction.md) + - [⚪️ Blockchain](storage/blockchain.md) + - [⚪️ Transaction pool](storage/transaction-pool.md) + - [⚪️ Pruning](storage/pruning.md) + +--- + +- [🔴 RPC](rpc/intro.md) + - [⚪️ Types](rpc/types/intro.md) + - [⚪️ JSON](rpc/types/json.md) + - [⚪️ Binary](rpc/types/binary.md) + - [⚪️ Other](rpc/types/other.md) + - [⚪️ Interface](rpc/interface.md) + - [⚪️ Router](rpc/router.md) + - [⚪️ Handler](rpc/handler.md) + - [⚪️ Methods](rpc/methods/intro.md) + +--- + +- [⚪️ ZMQ](zmq/intro.md) + - [⚪️ TODO](zmq/todo.md) + +--- + +- [⚪️ Consensus](consensus/intro.md) + - [⚪️ Verifier](consensus/verifier.md) + - [⚪️ TODO](consensus/todo.md) + +--- + +- [⚪️ Networking](networking/intro.md) + - [⚪️ P2P](networking/p2p.md) + - [⚪️ Dandelion++](networking/dandelion.md) + - [⚪️ Proxy](networking/proxy.md) + - [⚪️ Tor](networking/tor.md) + - [⚪️ i2p](networking/i2p.md) + - [⚪️ IPv4/IPv6](networking/ipv4-ipv6.md) + +--- + +- [🔴 Instrumentation](instrumentation/intro.md) + - [⚪️ Logging](instrumentation/logging.md) + - [⚪️ Data collection](instrumentation/data-collection.md) + +--- + +- [⚪️ Binary](binary/intro.md) + - [⚪️ CLI](binary/cli.md) + - [⚪️ Config](binary/config.md) + - [⚪️ Logging](binary/logging.md) + +--- + +- [⚪️ Resource model](resource-model/intro.md) + - [⚪️ File system](resource-model/file-system.md) + - [⚪️ Sockets](resource-model/sockets.md) + - [⚪️ Memory](resource-model/memory.md) + - [🟡 Concurrency and parallelism](resource-model/concurrency-and-parallelism/intro.md) + - [⚪️ Map](resource-model/concurrency-and-parallelism/map.md) + - [⚪️ The RPC server](resource-model/concurrency-and-parallelism/the-rpc-server.md) + - [⚪️ The database](resource-model/concurrency-and-parallelism/the-database.md) + - [⚪️ The block downloader](resource-model/concurrency-and-parallelism/the-block-downloader.md) + - [⚪️ The verifier](resource-model/concurrency-and-parallelism/the-verifier.md) + - [⚪️ Thread exit](resource-model/concurrency-and-parallelism/thread-exit.md) + +--- + +- [⚪️ External Monero libraries](external-monero-libraries/intro.md) + - [⚪️ Cryptonight](external-monero-libraries/cryptonight.md) + - [🔴 RandomX](external-monero-libraries/randomx.md) + - [🔴 monero_serai](external-monero-libraries/monero_serai.md) + +--- + +- [⚪️ Benchmarking](benchmarking/intro.md) + - [⚪️ Criterion](benchmarking/criterion.md) + - [⚪️ Harness](benchmarking/harness.md) +- [⚪️ Testing](testing/intro.md) + - [⚪️ Monero data](testing/monero-data.md) + - [⚪️ RPC client](testing/rpc-client.md) + - [⚪️ Spawning `monerod`](testing/spawning-monerod.md) +- [⚪️ Known issues and tradeoffs](known-issues-and-tradeoffs/intro.md) + - [⚪️ Networking](known-issues-and-tradeoffs/networking.md) + - [⚪️ RPC](known-issues-and-tradeoffs/rpc.md) + - [⚪️ Storage](known-issues-and-tradeoffs/storage.md) + +--- + +- [⚪️ Appendix](appendix/intro.md) + - [🔴 Contributing](appendix/contributing.md) + - [🔴 Crate documentation](appendix/crate-documentation.md) + - [🔴 Build targets](appendix/build-targets.md) + - [🔴 Protocol book](appendix/protocol-book.md) + - [⚪️ User book](appendix/user-book.md) \ No newline at end of file diff --git a/books/architecture/src/appendix/build-targets.md b/books/architecture/src/appendix/build-targets.md new file mode 100644 index 0000000..495a3d6 --- /dev/null +++ b/books/architecture/src/appendix/build-targets.md @@ -0,0 +1,7 @@ +# Build targets +- x86 +- ARM64 +- Windows +- Linux +- macOS +- FreeBSD(?) diff --git a/books/architecture/src/appendix/contributing.md b/books/architecture/src/appendix/contributing.md new file mode 100644 index 0000000..675937a --- /dev/null +++ b/books/architecture/src/appendix/contributing.md @@ -0,0 +1,2 @@ +# Contributing + \ No newline at end of file diff --git a/books/architecture/src/appendix/crate-documentation.md b/books/architecture/src/appendix/crate-documentation.md new file mode 100644 index 0000000..0f4d96d --- /dev/null +++ b/books/architecture/src/appendix/crate-documentation.md @@ -0,0 +1,4 @@ +# Crate documentation +```bash +cargo doc --package $CUPRATE_CRATE +``` \ No newline at end of file diff --git a/books/architecture/src/appendix/intro.md b/books/architecture/src/appendix/intro.md new file mode 100644 index 0000000..fad5ae4 --- /dev/null +++ b/books/architecture/src/appendix/intro.md @@ -0,0 +1 @@ +# Appendix diff --git a/books/architecture/src/appendix/protocol-book.md b/books/architecture/src/appendix/protocol-book.md new file mode 100644 index 0000000..a855b73 --- /dev/null +++ b/books/architecture/src/appendix/protocol-book.md @@ -0,0 +1,2 @@ +# Protocol book + \ No newline at end of file diff --git a/books/architecture/src/appendix/user-book.md b/books/architecture/src/appendix/user-book.md new file mode 100644 index 0000000..0f12476 --- /dev/null +++ b/books/architecture/src/appendix/user-book.md @@ -0,0 +1 @@ +# ⚪️ User book diff --git a/books/architecture/src/benchmarking/criterion.md b/books/architecture/src/benchmarking/criterion.md new file mode 100644 index 0000000..e9d61e6 --- /dev/null +++ b/books/architecture/src/benchmarking/criterion.md @@ -0,0 +1 @@ +# ⚪️ Criterion diff --git a/books/architecture/src/benchmarking/harness.md b/books/architecture/src/benchmarking/harness.md new file mode 100644 index 0000000..6f82b52 --- /dev/null +++ b/books/architecture/src/benchmarking/harness.md @@ -0,0 +1 @@ +# ⚪️ Harness diff --git a/books/architecture/src/benchmarking/intro.md b/books/architecture/src/benchmarking/intro.md new file mode 100644 index 0000000..f043a0b --- /dev/null +++ b/books/architecture/src/benchmarking/intro.md @@ -0,0 +1 @@ +# ⚪️ Benchmarking diff --git a/books/architecture/src/binary/cli.md b/books/architecture/src/binary/cli.md new file mode 100644 index 0000000..1c515f4 --- /dev/null +++ b/books/architecture/src/binary/cli.md @@ -0,0 +1 @@ +# ⚪️ CLI diff --git a/books/architecture/src/binary/config.md b/books/architecture/src/binary/config.md new file mode 100644 index 0000000..c9582d0 --- /dev/null +++ b/books/architecture/src/binary/config.md @@ -0,0 +1 @@ +# ⚪️ Config diff --git a/books/architecture/src/binary/intro.md b/books/architecture/src/binary/intro.md new file mode 100644 index 0000000..dea12fa --- /dev/null +++ b/books/architecture/src/binary/intro.md @@ -0,0 +1 @@ +# ⚪️ Binary diff --git a/books/architecture/src/binary/logging.md b/books/architecture/src/binary/logging.md new file mode 100644 index 0000000..c7c88a3 --- /dev/null +++ b/books/architecture/src/binary/logging.md @@ -0,0 +1 @@ +# ⚪️ Logging diff --git a/books/architecture/src/birds-eye-view/components.md b/books/architecture/src/birds-eye-view/components.md new file mode 100644 index 0000000..19a17e2 --- /dev/null +++ b/books/architecture/src/birds-eye-view/components.md @@ -0,0 +1 @@ +# ⚪️ Components diff --git a/books/architecture/src/birds-eye-view/intro.md b/books/architecture/src/birds-eye-view/intro.md new file mode 100644 index 0000000..5ee2eb3 --- /dev/null +++ b/books/architecture/src/birds-eye-view/intro.md @@ -0,0 +1 @@ +# ⚪️ Bird's eye view diff --git a/books/architecture/src/birds-eye-view/map.md b/books/architecture/src/birds-eye-view/map.md new file mode 100644 index 0000000..1bde994 --- /dev/null +++ b/books/architecture/src/birds-eye-view/map.md @@ -0,0 +1 @@ +# ⚪️ Map diff --git a/books/architecture/src/consensus/intro.md b/books/architecture/src/consensus/intro.md new file mode 100644 index 0000000..32013b6 --- /dev/null +++ b/books/architecture/src/consensus/intro.md @@ -0,0 +1 @@ +# ⚪️ Consensus diff --git a/books/architecture/src/consensus/todo.md b/books/architecture/src/consensus/todo.md new file mode 100644 index 0000000..460d445 --- /dev/null +++ b/books/architecture/src/consensus/todo.md @@ -0,0 +1 @@ +# ⚪️ TODO diff --git a/books/architecture/src/consensus/verifier.md b/books/architecture/src/consensus/verifier.md new file mode 100644 index 0000000..128a3b0 --- /dev/null +++ b/books/architecture/src/consensus/verifier.md @@ -0,0 +1 @@ +# ⚪️ Verifier diff --git a/books/architecture/src/cuprate-architecture.md b/books/architecture/src/cuprate-architecture.md new file mode 100644 index 0000000..3c6c073 --- /dev/null +++ b/books/architecture/src/cuprate-architecture.md @@ -0,0 +1,22 @@ +# Cuprate Architecture +WIP + +[Cuprate](https://github.com/Cuprate/cuprate)'s architecture book. + +Sections are notated with colors indicating how complete they are: + +| Color | Meaning | +|-------|---------| +| ⚪️ | Empty +| 🔴 | Severely lacking information +| 🟠 | Lacking some information +| 🟡 | Almost ready +| 🟢 | OK + +--- + +Continue to the next chapter by clicking the right `>` button, or by selecting it on the left side. + +All chapters are viewable by clicking the top-left `☰` button. + +The entire book can searched by clicking the top-left 🔍 button. \ No newline at end of file diff --git a/books/architecture/src/external-monero-libraries/cryptonight.md b/books/architecture/src/external-monero-libraries/cryptonight.md new file mode 100644 index 0000000..80647b0 --- /dev/null +++ b/books/architecture/src/external-monero-libraries/cryptonight.md @@ -0,0 +1 @@ +# ⚪️ Cryptonight diff --git a/books/architecture/src/external-monero-libraries/intro.md b/books/architecture/src/external-monero-libraries/intro.md new file mode 100644 index 0000000..440a344 --- /dev/null +++ b/books/architecture/src/external-monero-libraries/intro.md @@ -0,0 +1 @@ +# ⚪️ External Monero libraries diff --git a/books/architecture/src/external-monero-libraries/monero_serai.md b/books/architecture/src/external-monero-libraries/monero_serai.md new file mode 100644 index 0000000..f1567b1 --- /dev/null +++ b/books/architecture/src/external-monero-libraries/monero_serai.md @@ -0,0 +1,2 @@ +# monero_serai + diff --git a/books/architecture/src/external-monero-libraries/randomx.md b/books/architecture/src/external-monero-libraries/randomx.md new file mode 100644 index 0000000..7705151 --- /dev/null +++ b/books/architecture/src/external-monero-libraries/randomx.md @@ -0,0 +1,2 @@ +# RandomX + \ No newline at end of file diff --git a/books/architecture/src/foreword.md b/books/architecture/src/foreword.md new file mode 100644 index 0000000..c85f18b --- /dev/null +++ b/books/architecture/src/foreword.md @@ -0,0 +1,36 @@ +# Foreword +Monero[^1] is a large software project, coming in at 329k lines of C++, C, headers, and make files.[^2] It is directly responsible for 2.6 billion dollars worth of value.[^3] It has had over 400 contributors, more if counting unnamed contributions.[^4] It has over 10,000 node operators and a large active userbase.[^5] + +The project wasn't always this big, but somewhere in the midst of contributors coming and going, various features being added, bugs being fixed, and celebrated cryptography being implemented - there was an aspect that was lost by the project that it could not easily gain again: **maintainability**. + +Within large and complicated software projects, there is an important transfer of knowledge that must occur for long-term survival. Much like an organism that must eventually pass the torch onto the next generation, projects must do the same for future contributors. + +However, newcomers often lack experience, past contributors might not be around, and current maintainers may be too busy. For whatever reason, this transfer of knowledge is not always smooth. + +There is a solution to this problem: **documentation**. + +The activity of writing the what, where, why, and how of the solutions to technical problems can be done in an author's lonesome. + +The activity of reading these ideas can be done by future readers at any time without permission. + +These readers may be new prospective contributors, it may be the current maintainers, it may be researchers, it may be users of various scale. Whoever it may be, documentation acts as the link between the past and present; a bottle of wisdom thrown into the river of time for future participants to open. + +This book is the manifestation of this will, for Cuprate[^6], an alternative Monero node. It documents Cuprate's implementation from head-to-toe such that in the case of a contributor's untimely disappearance, the project can continue. + +People come and go, documentation is forever. + +— hinto-janai + +--- + +[^1]: [`monero-project/monero`](https://github.com/monero-project/monero) + +[^2]: `git ls-files | grep "\.cpp$\|\.h$\|\.c$\|CMake" | xargs cat | wc -l` on [`cc73fe7`](https://github.com/monero-project/monero/tree/cc73fe71162d564ffda8e549b79a350bca53c454) + +[^3]: 2024-05-24: $143.55 USD * 18,151,608 XMR = $2,605,663,258 + +[^4]: `git log --all --pretty="%an" | sort -u | wc -l` on [`cc73fe7`](https://github.com/monero-project/monero/tree/cc73fe71162d564ffda8e549b79a350bca53c454) + +[^5]: + +[^6]: \ No newline at end of file diff --git a/books/architecture/src/formats-protocols-types/cuprate-helper.md b/books/architecture/src/formats-protocols-types/cuprate-helper.md new file mode 100644 index 0000000..6227829 --- /dev/null +++ b/books/architecture/src/formats-protocols-types/cuprate-helper.md @@ -0,0 +1 @@ +# ⚪️ cuprate_helper diff --git a/books/architecture/src/formats-protocols-types/cuprate-types.md b/books/architecture/src/formats-protocols-types/cuprate-types.md new file mode 100644 index 0000000..1069ce5 --- /dev/null +++ b/books/architecture/src/formats-protocols-types/cuprate-types.md @@ -0,0 +1 @@ +# ⚪️ cuprate_types diff --git a/books/architecture/src/formats-protocols-types/epee.md b/books/architecture/src/formats-protocols-types/epee.md new file mode 100644 index 0000000..4c0b17e --- /dev/null +++ b/books/architecture/src/formats-protocols-types/epee.md @@ -0,0 +1 @@ +# ⚪️ Epee diff --git a/books/architecture/src/formats-protocols-types/intro.md b/books/architecture/src/formats-protocols-types/intro.md new file mode 100644 index 0000000..77052fd --- /dev/null +++ b/books/architecture/src/formats-protocols-types/intro.md @@ -0,0 +1 @@ +# ⚪️ Formats, protocols, types diff --git a/books/architecture/src/formats-protocols-types/levin.md b/books/architecture/src/formats-protocols-types/levin.md new file mode 100644 index 0000000..72a88cc --- /dev/null +++ b/books/architecture/src/formats-protocols-types/levin.md @@ -0,0 +1 @@ +# ⚪️ Levin diff --git a/books/architecture/src/formats-protocols-types/monero-serai.md b/books/architecture/src/formats-protocols-types/monero-serai.md new file mode 100644 index 0000000..139af8e --- /dev/null +++ b/books/architecture/src/formats-protocols-types/monero-serai.md @@ -0,0 +1 @@ +# ⚪️ monero_serai diff --git a/books/architecture/src/instrumentation/data-collection.md b/books/architecture/src/instrumentation/data-collection.md new file mode 100644 index 0000000..7ea3d9f --- /dev/null +++ b/books/architecture/src/instrumentation/data-collection.md @@ -0,0 +1 @@ +# ⚪️ Data collection diff --git a/books/architecture/src/instrumentation/intro.md b/books/architecture/src/instrumentation/intro.md new file mode 100644 index 0000000..33640dd --- /dev/null +++ b/books/architecture/src/instrumentation/intro.md @@ -0,0 +1,2 @@ +# Instrumentation +Cuprate is built with [instrumentation](https://en.wikipedia.org/wiki/Instrumentation) in mind. \ No newline at end of file diff --git a/books/architecture/src/instrumentation/logging.md b/books/architecture/src/instrumentation/logging.md new file mode 100644 index 0000000..c7c88a3 --- /dev/null +++ b/books/architecture/src/instrumentation/logging.md @@ -0,0 +1 @@ +# ⚪️ Logging diff --git a/books/architecture/src/intro.md b/books/architecture/src/intro.md new file mode 100644 index 0000000..c708d61 --- /dev/null +++ b/books/architecture/src/intro.md @@ -0,0 +1,4 @@ +# Systems +Cuprate is made up of multiple distinct internal systems that work together. + +This section provides informal specifications and implementation details about each. \ No newline at end of file diff --git a/books/architecture/src/intro/how-to-use-this-book.md b/books/architecture/src/intro/how-to-use-this-book.md new file mode 100644 index 0000000..7664e04 --- /dev/null +++ b/books/architecture/src/intro/how-to-use-this-book.md @@ -0,0 +1,5 @@ +# How to use this book + +## Maintainers +## Contributors +## Researchers \ No newline at end of file diff --git a/books/architecture/src/intro/intro.md b/books/architecture/src/intro/intro.md new file mode 100644 index 0000000..db2603c --- /dev/null +++ b/books/architecture/src/intro/intro.md @@ -0,0 +1,15 @@ +# Intro +[Cuprate](https://github.com/Cuprate/cuprate) is an alternative [Monero](https://getmonero.org) node implementation. + +This book describes Cuprate's architecture, ranging from small things like database pruning to larger meta-components like the networking stack. + +A brief overview of some aspects covered within this book: +- Component designs +- Implementation details +- File location and purpose +- Design decisions and tradeoffs +- Things in relation to `monerod` +- Dependency usage + +## Source code +The source files for this book can be found on at: . \ No newline at end of file diff --git a/books/architecture/src/intro/required-knowledge.md b/books/architecture/src/intro/required-knowledge.md new file mode 100644 index 0000000..3262f05 --- /dev/null +++ b/books/architecture/src/intro/required-knowledge.md @@ -0,0 +1,28 @@ +# Required knowledge + +## General +- Rust +- Monero +- System design + +## Components +### Storage +- Embedded databases +- LMDB +- redb + +### RPC +- `axum` +- `tower` +- `async` +- JSON-RPC 2.0 +- Epee + +### Networking +- `tower` +- `tokio` +- `async` +- Levin + +### Instrumentation +- `tracing` diff --git a/books/architecture/src/intro/who-this-book-is-for.md b/books/architecture/src/intro/who-this-book-is-for.md new file mode 100644 index 0000000..4b5be2b --- /dev/null +++ b/books/architecture/src/intro/who-this-book-is-for.md @@ -0,0 +1,31 @@ +# Who this book is for + +## Maintainers +As mentioned in [`Foreword`](../foreword.md), the group of people that benefit from this book's value the most by far are the current and future Cuprate maintainers. + +Cuprate's system design is documented in this book such that if you were ever to build it again from scratch, you would have an excellent guide on how to do such, and also where improvements could be made. + +Practically, what that means for maintainers is that it acts as _the_ reference. During maintenance, it is quite valuable to have a book that contains condensed knowledge on the behavior of components, or how certain code works, or why it was built a certain way. + +## Contributors +Contributors also have access to the inner-workings of Cuprate via this book, which helps when making larger contributions. + +Design decisions and implementation details notated in this book helps answer questions such as: +- Why is it done this way? +- Why can it _not_ be done this way? +- Were other methods attempted? + +Cuprate's testing and benchmarking suites, unknown to new contributors, are also documented within this book. + +## Researchers +This book contains the why, where, and how of the _implementation_ of formal research. + +Although it is an informal specification, this book still acts as a more accessible overview of Cuprate compared to examining the codebase itself. + +## Operators & users +This book is not a practical guide for using Cuprate itself. + +For configuration, data collection (also important for researchers), and other practical usage, see [Cuprate's user book](https://user.cuprate.org). + +## Observers +Anyone curious enough is free to learn the inner-workings of Cuprate via this book, and maybe even contribute someday. \ No newline at end of file diff --git a/books/architecture/src/known-issues-and-tradeoffs/intro.md b/books/architecture/src/known-issues-and-tradeoffs/intro.md new file mode 100644 index 0000000..20ab7b5 --- /dev/null +++ b/books/architecture/src/known-issues-and-tradeoffs/intro.md @@ -0,0 +1 @@ +# ⚪️ Known issues and tradeoffs diff --git a/books/architecture/src/known-issues-and-tradeoffs/networking.md b/books/architecture/src/known-issues-and-tradeoffs/networking.md new file mode 100644 index 0000000..20487cb --- /dev/null +++ b/books/architecture/src/known-issues-and-tradeoffs/networking.md @@ -0,0 +1 @@ +# ⚪️ Networking diff --git a/books/architecture/src/known-issues-and-tradeoffs/rpc.md b/books/architecture/src/known-issues-and-tradeoffs/rpc.md new file mode 100644 index 0000000..3337f37 --- /dev/null +++ b/books/architecture/src/known-issues-and-tradeoffs/rpc.md @@ -0,0 +1 @@ +# ⚪️ RPC diff --git a/books/architecture/src/known-issues-and-tradeoffs/storage.md b/books/architecture/src/known-issues-and-tradeoffs/storage.md new file mode 100644 index 0000000..214cf15 --- /dev/null +++ b/books/architecture/src/known-issues-and-tradeoffs/storage.md @@ -0,0 +1 @@ +# ⚪️ Storage diff --git a/books/architecture/src/networking/dandelion.md b/books/architecture/src/networking/dandelion.md new file mode 100644 index 0000000..30916b7 --- /dev/null +++ b/books/architecture/src/networking/dandelion.md @@ -0,0 +1 @@ +# ⚪️ Dandelion++ diff --git a/books/architecture/src/networking/i2p.md b/books/architecture/src/networking/i2p.md new file mode 100644 index 0000000..986ab2a --- /dev/null +++ b/books/architecture/src/networking/i2p.md @@ -0,0 +1 @@ +# ⚪️ i2p diff --git a/books/architecture/src/networking/intro.md b/books/architecture/src/networking/intro.md new file mode 100644 index 0000000..20487cb --- /dev/null +++ b/books/architecture/src/networking/intro.md @@ -0,0 +1 @@ +# ⚪️ Networking diff --git a/books/architecture/src/networking/ipv4-ipv6.md b/books/architecture/src/networking/ipv4-ipv6.md new file mode 100644 index 0000000..07339b4 --- /dev/null +++ b/books/architecture/src/networking/ipv4-ipv6.md @@ -0,0 +1 @@ +# ⚪️ IPv4/IPv6 diff --git a/books/architecture/src/networking/p2p.md b/books/architecture/src/networking/p2p.md new file mode 100644 index 0000000..11b2015 --- /dev/null +++ b/books/architecture/src/networking/p2p.md @@ -0,0 +1 @@ +# ⚪️ P2P diff --git a/books/architecture/src/networking/proxy.md b/books/architecture/src/networking/proxy.md new file mode 100644 index 0000000..bd9e5f7 --- /dev/null +++ b/books/architecture/src/networking/proxy.md @@ -0,0 +1 @@ +# ⚪️ Proxy diff --git a/books/architecture/src/networking/tor.md b/books/architecture/src/networking/tor.md new file mode 100644 index 0000000..cc0a809 --- /dev/null +++ b/books/architecture/src/networking/tor.md @@ -0,0 +1 @@ +# ⚪️ Tor diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/intro.md b/books/architecture/src/resource-model/concurrency-and-parallelism/intro.md new file mode 100644 index 0000000..2cca180 --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/intro.md @@ -0,0 +1,32 @@ +# Concurrency and parallelism +It is incumbent upon software like Cuprate to take advantage of today's highly parallel hardware as much as practically possible. + +With that said, programs must setup guardrails when operating in a concurrent and parallel manner, [for correctness and safety](https://en.wikipedia.org/wiki/Concurrency_(computer_science)). + +There are "synchronization primitives" that help with this, common ones being: +- [Locks](https://en.wikipedia.org/wiki/Lock_(computer_science)) +- [Channels](https://en.wikipedia.org/wiki/Channel_(programming)) +- [Atomics](https://en.wikipedia.org/wiki/Linearizability#Primitive_atomic_instructions) + +These tools are relatively easy to use in isolation, but trickier to do so when considering the entire system. It is not uncommon for _the_ bottleneck to be the [poor orchastration](https://en.wikipedia.org/wiki/Starvation_(computer_science)) of these primitives. + +## Analogy +A common analogy for a parallel system is an intersection. + +Like a parallel computer system, an intersection contains: +1. **Parallelism:** multiple individual units that want to move around (cars, pedestrians, etc) +1. **Synchronization primitives:** traffic lights, car lights, walk signals + +In theory, the amount of "work" the units can do is only limited by the speed of the units themselves, but in practice, the slow cascading reaction speeds between all units, the frequent hiccups that can occur, and the synchronization primitives themselves become bottlenecks far before the maximum speed of any unit is reached. + +A car that hogs the middle of the intersection on the wrong light is akin to a system thread holding onto a lock longer than it should be - it degrades total system output. + +Unlike humans however, computer systems at least have the potential to move at lightning speeds, but only if the above synchronization primitives are used correctly. + +## Goal +To aid the long-term maintenance of highly concurrent and parallel code, this section documents: +1. All system threads spawned and maintained +1. All major sections where synchronization primitives are used +1. The asynchronous behavior of some components + +and how these compose together efficiently in Cuprate. \ No newline at end of file diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/map.md b/books/architecture/src/resource-model/concurrency-and-parallelism/map.md new file mode 100644 index 0000000..1bde994 --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/map.md @@ -0,0 +1 @@ +# ⚪️ Map diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/the-block-downloader.md b/books/architecture/src/resource-model/concurrency-and-parallelism/the-block-downloader.md new file mode 100644 index 0000000..c0dccba --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/the-block-downloader.md @@ -0,0 +1 @@ +# ⚪️ The block downloader diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/the-database.md b/books/architecture/src/resource-model/concurrency-and-parallelism/the-database.md new file mode 100644 index 0000000..32e4b62 --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/the-database.md @@ -0,0 +1 @@ +# ⚪️ The database diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/the-rpc-server.md b/books/architecture/src/resource-model/concurrency-and-parallelism/the-rpc-server.md new file mode 100644 index 0000000..cd654cf --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/the-rpc-server.md @@ -0,0 +1 @@ +# ⚪️ The RPC server diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/the-verifier.md b/books/architecture/src/resource-model/concurrency-and-parallelism/the-verifier.md new file mode 100644 index 0000000..eeaedc6 --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/the-verifier.md @@ -0,0 +1 @@ +# ⚪️ The verifier diff --git a/books/architecture/src/resource-model/concurrency-and-parallelism/thread-exit.md b/books/architecture/src/resource-model/concurrency-and-parallelism/thread-exit.md new file mode 100644 index 0000000..3925975 --- /dev/null +++ b/books/architecture/src/resource-model/concurrency-and-parallelism/thread-exit.md @@ -0,0 +1 @@ +# ⚪️ Thread exit diff --git a/books/architecture/src/resource-model/file-system.md b/books/architecture/src/resource-model/file-system.md new file mode 100644 index 0000000..b67ca07 --- /dev/null +++ b/books/architecture/src/resource-model/file-system.md @@ -0,0 +1 @@ +# ⚪️ File system diff --git a/books/architecture/src/resource-model/intro.md b/books/architecture/src/resource-model/intro.md new file mode 100644 index 0000000..28d1dd6 --- /dev/null +++ b/books/architecture/src/resource-model/intro.md @@ -0,0 +1 @@ +# ⚪️ Resource model diff --git a/books/architecture/src/resource-model/memory.md b/books/architecture/src/resource-model/memory.md new file mode 100644 index 0000000..e3624b5 --- /dev/null +++ b/books/architecture/src/resource-model/memory.md @@ -0,0 +1 @@ +# ⚪️ Memory diff --git a/books/architecture/src/resource-model/sockets.md b/books/architecture/src/resource-model/sockets.md new file mode 100644 index 0000000..0d590ca --- /dev/null +++ b/books/architecture/src/resource-model/sockets.md @@ -0,0 +1 @@ +# ⚪️ Sockets diff --git a/books/architecture/src/rpc/handler.md b/books/architecture/src/rpc/handler.md new file mode 100644 index 0000000..fffa45f --- /dev/null +++ b/books/architecture/src/rpc/handler.md @@ -0,0 +1 @@ +# ⚪️ Handler diff --git a/books/architecture/src/rpc/interface.md b/books/architecture/src/rpc/interface.md new file mode 100644 index 0000000..541b744 --- /dev/null +++ b/books/architecture/src/rpc/interface.md @@ -0,0 +1 @@ +# ⚪️ Interface diff --git a/books/architecture/src/rpc/intro.md b/books/architecture/src/rpc/intro.md new file mode 100644 index 0000000..dcfc82b --- /dev/null +++ b/books/architecture/src/rpc/intro.md @@ -0,0 +1,3 @@ +# RPC +- +- \ No newline at end of file diff --git a/books/architecture/src/rpc/methods/intro.md b/books/architecture/src/rpc/methods/intro.md new file mode 100644 index 0000000..d4a3a15 --- /dev/null +++ b/books/architecture/src/rpc/methods/intro.md @@ -0,0 +1 @@ +# ⚪️ Methods diff --git a/books/architecture/src/rpc/router.md b/books/architecture/src/rpc/router.md new file mode 100644 index 0000000..1827dd3 --- /dev/null +++ b/books/architecture/src/rpc/router.md @@ -0,0 +1 @@ +# ⚪️ Router diff --git a/books/architecture/src/rpc/types/binary.md b/books/architecture/src/rpc/types/binary.md new file mode 100644 index 0000000..dea12fa --- /dev/null +++ b/books/architecture/src/rpc/types/binary.md @@ -0,0 +1 @@ +# ⚪️ Binary diff --git a/books/architecture/src/rpc/types/intro.md b/books/architecture/src/rpc/types/intro.md new file mode 100644 index 0000000..22e430c --- /dev/null +++ b/books/architecture/src/rpc/types/intro.md @@ -0,0 +1 @@ +# ⚪️ Types diff --git a/books/architecture/src/rpc/types/json.md b/books/architecture/src/rpc/types/json.md new file mode 100644 index 0000000..0bf9351 --- /dev/null +++ b/books/architecture/src/rpc/types/json.md @@ -0,0 +1 @@ +# ⚪️ JSON diff --git a/books/architecture/src/rpc/types/other.md b/books/architecture/src/rpc/types/other.md new file mode 100644 index 0000000..49a36cc --- /dev/null +++ b/books/architecture/src/rpc/types/other.md @@ -0,0 +1 @@ +# ⚪️ Other diff --git a/books/architecture/src/storage/blockchain.md b/books/architecture/src/storage/blockchain.md new file mode 100644 index 0000000..6046687 --- /dev/null +++ b/books/architecture/src/storage/blockchain.md @@ -0,0 +1 @@ +# ⚪️ Blockchain diff --git a/books/architecture/src/storage/database-abstraction.md b/books/architecture/src/storage/database-abstraction.md new file mode 100644 index 0000000..b21a192 --- /dev/null +++ b/books/architecture/src/storage/database-abstraction.md @@ -0,0 +1 @@ +# ⚪️ Database abstraction diff --git a/books/architecture/src/storage/intro.md b/books/architecture/src/storage/intro.md new file mode 100644 index 0000000..214cf15 --- /dev/null +++ b/books/architecture/src/storage/intro.md @@ -0,0 +1 @@ +# ⚪️ Storage diff --git a/books/architecture/src/storage/pruning.md b/books/architecture/src/storage/pruning.md new file mode 100644 index 0000000..cfeee69 --- /dev/null +++ b/books/architecture/src/storage/pruning.md @@ -0,0 +1 @@ +# ⚪️ Pruning diff --git a/books/architecture/src/storage/transaction-pool.md b/books/architecture/src/storage/transaction-pool.md new file mode 100644 index 0000000..4eb139b --- /dev/null +++ b/books/architecture/src/storage/transaction-pool.md @@ -0,0 +1 @@ +# ⚪️ Transaction pool diff --git a/books/architecture/src/testing/intro.md b/books/architecture/src/testing/intro.md new file mode 100644 index 0000000..397ae90 --- /dev/null +++ b/books/architecture/src/testing/intro.md @@ -0,0 +1 @@ +# ⚪️ Testing diff --git a/books/architecture/src/testing/monero-data.md b/books/architecture/src/testing/monero-data.md new file mode 100644 index 0000000..915af28 --- /dev/null +++ b/books/architecture/src/testing/monero-data.md @@ -0,0 +1 @@ +# ⚪️ Monero data diff --git a/books/architecture/src/testing/rpc-client.md b/books/architecture/src/testing/rpc-client.md new file mode 100644 index 0000000..5a373c2 --- /dev/null +++ b/books/architecture/src/testing/rpc-client.md @@ -0,0 +1 @@ +# ⚪️ RPC client diff --git a/books/architecture/src/testing/spawning-monerod.md b/books/architecture/src/testing/spawning-monerod.md new file mode 100644 index 0000000..1552266 --- /dev/null +++ b/books/architecture/src/testing/spawning-monerod.md @@ -0,0 +1 @@ +# ⚪️ Spawning monerod diff --git a/books/architecture/src/zmq/intro.md b/books/architecture/src/zmq/intro.md new file mode 100644 index 0000000..0b668b3 --- /dev/null +++ b/books/architecture/src/zmq/intro.md @@ -0,0 +1 @@ +# ⚪️ ZMQ diff --git a/books/architecture/src/todo.md b/books/architecture/src/zmq/todo.md similarity index 100% rename from books/architecture/src/todo.md rename to books/architecture/src/zmq/todo.md From aa718e224f480849d2ed665cabe0794875231abf Mon Sep 17 00:00:00 2001 From: hinto-janai Date: Thu, 18 Jul 2024 19:50:27 -0400 Subject: [PATCH 3/3] test-utils: add `crate::rpc::data` module (#231) * test-utils: add `crate::rpc::types` module * test-utils: conditional json doc-tests * json: add test data, fix macro doc tests * json: add all data * other: add all data * bin: add skeleton * docs * move type to correct file * rpc: `client/{client,constants}.rs` -> `client.rs` * lib.rs: remove `clippy::module_inception` --- Cargo.lock | 1 + test-utils/Cargo.toml | 34 +- test-utils/README.md | 1 + test-utils/src/data/free.rs | 2 +- test-utils/src/rpc/client.rs | 4 +- test-utils/src/rpc/constants.rs | 7 - test-utils/src/rpc/data/bin.rs | 55 ++ test-utils/src/rpc/data/json.rs | 1292 +++++++++++++++++++++++++++++ test-utils/src/rpc/data/macros.rs | 168 ++++ test-utils/src/rpc/data/mod.rs | 18 + test-utils/src/rpc/data/other.rs | 839 +++++++++++++++++++ test-utils/src/rpc/mod.rs | 27 +- typos.toml | 1 + 13 files changed, 2400 insertions(+), 49 deletions(-) delete mode 100644 test-utils/src/rpc/constants.rs create mode 100644 test-utils/src/rpc/data/bin.rs create mode 100644 test-utils/src/rpc/data/json.rs create mode 100644 test-utils/src/rpc/data/macros.rs create mode 100644 test-utils/src/rpc/data/mod.rs create mode 100644 test-utils/src/rpc/data/other.rs diff --git a/Cargo.lock b/Cargo.lock index 965e2c6..426ccc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -785,6 +785,7 @@ dependencies = [ "hex", "hex-literal", "monero-serai", + "paste", "pretty_assertions", "serde", "serde_json", diff --git a/test-utils/Cargo.toml b/test-utils/Cargo.toml index f9a5c6d..dd24fd5 100644 --- a/test-utils/Cargo.toml +++ b/test-utils/Cargo.toml @@ -1,30 +1,30 @@ [package] -name = "cuprate-test-utils" +name = "cuprate-test-utils" version = "0.1.0" edition = "2021" license = "MIT" authors = ["Boog900", "hinto-janai"] [dependencies] -cuprate-types = { path = "../types" } -cuprate-helper = { path = "../helper", features = ["map"] } -cuprate-wire = { path = "../net/wire" } +cuprate-types = { path = "../types" } +cuprate-helper = { path = "../helper", features = ["map"] } +cuprate-wire = { path = "../net/wire" } cuprate-p2p-core = { path = "../p2p/p2p-core", features = ["borsh"] } -hex = { workspace = true } -hex-literal = { workspace = true } +hex = { workspace = true } +hex-literal = { workspace = true } monero-serai = { workspace = true, features = ["std", "http-rpc"] } -futures = { workspace = true, features = ["std"] } -async-trait = { workspace = true } -tokio = { workspace = true, features = ["full"] } -tokio-util = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -bytes = { workspace = true, features = ["std"] } -tempfile = { workspace = true } - -borsh = { workspace = true, features = ["derive"]} +futures = { workspace = true, features = ["std"] } +async-trait = { workspace = true } +tokio = { workspace = true, features = ["full"] } +tokio-util = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +bytes = { workspace = true, features = ["std"] } +tempfile = { workspace = true } +paste = { workspace = true } +borsh = { workspace = true, features = ["derive"]} [dev-dependencies] -hex = { workspace = true } +hex = { workspace = true } pretty_assertions = { workspace = true } \ No newline at end of file diff --git a/test-utils/README.md b/test-utils/README.md index c210686..3c71c0a 100644 --- a/test-utils/README.md +++ b/test-utils/README.md @@ -7,3 +7,4 @@ It currently contains: - Code to spawn monerod instances and a testing network zone - Real raw and typed Monero data, e.g. `Block, Transaction` - An RPC client to generate types from `cuprate_types` +- Raw RPC request/response strings and binary data \ No newline at end of file diff --git a/test-utils/src/data/free.rs b/test-utils/src/data/free.rs index e80bdda..ee6f49a 100644 --- a/test-utils/src/data/free.rs +++ b/test-utils/src/data/free.rs @@ -292,7 +292,7 @@ mod tests { use pretty_assertions::assert_eq; - use crate::rpc::HttpRpcClient; + use crate::rpc::client::HttpRpcClient; /// Assert the defined blocks are the same compared to ones received from a local RPC call. #[ignore] // FIXME: doesn't work in CI, we need a real unrestricted node diff --git a/test-utils/src/rpc/client.rs b/test-utils/src/rpc/client.rs index 22ae11f..28c49d8 100644 --- a/test-utils/src/rpc/client.rs +++ b/test-utils/src/rpc/client.rs @@ -12,7 +12,9 @@ use monero_serai::{ use cuprate_types::{VerifiedBlockInformation, VerifiedTransactionInformation}; -use crate::rpc::constants::LOCALHOST_RPC_URL; +//---------------------------------------------------------------------------------------------------- Constants +/// The default URL used for Monero RPC connections. +pub const LOCALHOST_RPC_URL: &str = "http://127.0.0.1:18081"; //---------------------------------------------------------------------------------------------------- HttpRpcClient /// An HTTP RPC client for Monero. diff --git a/test-utils/src/rpc/constants.rs b/test-utils/src/rpc/constants.rs deleted file mode 100644 index ce44a88..0000000 --- a/test-utils/src/rpc/constants.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! RPC-related Constants. - -//---------------------------------------------------------------------------------------------------- Use - -//---------------------------------------------------------------------------------------------------- Constants -/// The default URL used for Monero RPC connections. -pub const LOCALHOST_RPC_URL: &str = "http://127.0.0.1:18081"; diff --git a/test-utils/src/rpc/data/bin.rs b/test-utils/src/rpc/data/bin.rs new file mode 100644 index 0000000..cf98a4a --- /dev/null +++ b/test-utils/src/rpc/data/bin.rs @@ -0,0 +1,55 @@ +//! Binary data from [`.bin` endpoints](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_blocksbin). +//! +//! TODO: Not implemented yet. + +//---------------------------------------------------------------------------------------------------- Import +use crate::rpc::data::macros::define_request_and_response; + +//---------------------------------------------------------------------------------------------------- TODO +define_request_and_response! { + get_blocksbin, + GET_BLOCKS: &[u8], + Request = &[]; + Response = &[]; +} + +define_request_and_response! { + get_blocks_by_heightbin, + GET_BLOCKS_BY_HEIGHT: &[u8], + Request = &[]; + Response = &[]; +} + +define_request_and_response! { + get_hashesbin, + GET_HASHES: &[u8], + Request = &[]; + Response = &[]; +} + +define_request_and_response! { + get_o_indexesbin, + GET_O_INDEXES: &[u8], + Request = &[]; + Response = &[]; +} + +define_request_and_response! { + get_outsbin, + GET_OUTS: &[u8], + Request = &[]; + Response = &[]; +} + +define_request_and_response! { + get_transaction_pool_hashesbin, + GET_TRANSACTION_POOL_HASHES: &[u8], + Request = &[]; + Response = &[]; +} + +//---------------------------------------------------------------------------------------------------- Tests +#[cfg(test)] +mod test { + // use super::*; +} diff --git a/test-utils/src/rpc/data/json.rs b/test-utils/src/rpc/data/json.rs new file mode 100644 index 0000000..2463e45 --- /dev/null +++ b/test-utils/src/rpc/data/json.rs @@ -0,0 +1,1292 @@ +//! JSON data from the [`/json_rpc`](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#json-rpc-methods) endpoint. + +//---------------------------------------------------------------------------------------------------- Import +use crate::rpc::data::macros::define_request_and_response; + +//---------------------------------------------------------------------------------------------------- Struct definitions +// This generates 2 const strings: +// +// - `const GET_BLOCK_TEMPLATE_REQUEST: &str = "..."` +// - `const GET_BLOCK_TEMPLATE_RESPONSE: &str = "..."` +// +// with some interconnected documentation. +define_request_and_response! { + // The markdown tag for Monero RPC documentation. Not necessarily the endpoint (json). + // + // Adding `(json_rpc)` after this will trigger the macro to automatically + // add a `serde_json` test for the request/response data. + get_block_template (json_rpc), + + // The base const name: the type of the request/response. + GET_BLOCK_TEMPLATE: &str, + + // The request data. + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block_template", + "params": { + "wallet_address": "44GBHzv6ZyQdJkjqZje6KLZ3xSyN1hBSFAnLP6EAqJtCRVzMzZmeXTC2AHKDS9aEDTRKmo6a6o9r9j86pYfhCWDkKjbtcns", + "reserve_size": 60 + } +}"#; + + // The response data. + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "blockhashing_blob": "1010f4bae0b4069d648e741d85ca0e7acb4501f051b27e9b107d3cd7a3f03aa7f776089117c81a00000000e0c20372be23d356347091025c5b5e8f2abf83ab618378565cce2b703491523401", + "blocktemplate_blob": "1010f4bae0b4069d648e741d85ca0e7acb4501f051b27e9b107d3cd7a3f03aa7f776089117c81a0000000002c681c30101ff8a81c3010180e0a596bb11033b7eedf47baf878f3490cb20b696079c34bd017fe59b0d070e74d73ffabc4bb0e05f011decb630f3148d0163b3bd39690dde4078e4cfb69fecf020d6278a27bad10c58023c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": 283305047039, + "difficulty_top64": 0, + "expected_reward": 600000000000, + "height": 3195018, + "next_seed_hash": "", + "prev_hash": "9d648e741d85ca0e7acb4501f051b27e9b107d3cd7a3f03aa7f776089117c81a", + "reserved_offset": 131, + "seed_hash": "e2aa0b7b55042cd48b02e395d78fa66a29815ccc1584e38db2d1f0e8485cd44f", + "seed_height": 3194880, + "status": "OK", + "untrusted": false, + "wide_difficulty": "0x41f64bf3ff" + } +}"#; +} + +define_request_and_response! { + get_block_count (json_rpc), + GET_BLOCK_COUNT: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block_count" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "count": 3195019, + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + on_get_block_hash (json_rpc), + ON_GET_BLOCK_HASH: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "on_get_block_hash", + "params": [912345] +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": "e22cf75f39ae720e8b71b3d120a5ac03f0db50bba6379e2850975b4859190bc6" +}"#; +} + +define_request_and_response! { + submit_block (json_rpc), + SUBMIT_BLOCK: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "submit_block", + "params": ["0707e6bdfedc053771512f1bc27c62731ae9e8f2443db64ce742f4e57f5cf8d393de28551e441a0000000002fb830a01ffbf830a018cfe88bee283060274c0aae2ef5730e680308d9c00b6da59187ad0352efe3c71d36eeeb28782f29f2501bd56b952c3ddc3e350c2631d3a5086cac172c56893831228b17de296ff4669de020200000000"] +}"#; + Response = +r#"{ + "error": { + "code": -7, + "message": "Block not accepted" + }, + "id": "0", + "jsonrpc": "2.0" +}"#; +} + +define_request_and_response! { + generateblocks (json_rpc), + GENERATE_BLOCKS: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "generateblocks", + "params": { + "amount_of_blocks": 1, + "wallet_address": "44AFFq5kSiGBoZ4NMDwYtN18obc8AemS33DBLWs3H7otXft3XjrpDtQGv7SqSsaBYBb98uNbr2VBBEt7f2wfn3RVGQBEP3A", + "starting_nonce": 0 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "blocks": ["49b712db7760e3728586f8434ee8bc8d7b3d410dac6bb6e98bf5845c83b917e4"], + "height": 9783, + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_last_block_header (json_rpc), + GET_LAST_BLOCK_HEADER: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_last_block_header" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 200419, + "block_weight": 200419, + "cumulative_difficulty": 366125734645190820, + "cumulative_difficulty_top64": 0, + "depth": 0, + "difficulty": 282052561854, + "difficulty_top64": 0, + "hash": "57238217820195ac4c08637a144a885491da167899cf1d20e8e7ce0ae0a3434e", + "height": 3195020, + "long_term_weight": 200419, + "major_version": 16, + "miner_tx_hash": "7a42667237d4f79891bb407c49c712a9299fb87fce799833a7b633a3a9377dbd", + "minor_version": 16, + "nonce": 1885649739, + "num_txes": 37, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "22c72248ae9c5a2863c94735d710a3525c499f70707d1c2f395169bc5c8a0da3", + "reward": 615702960000, + "timestamp": 1721245548, + "wide_cumulative_difficulty": "0x514bd6a74a7d0a4", + "wide_difficulty": "0x41aba48bbe" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_block_header_by_hash (json_rpc), + GET_BLOCK_HEADER_BY_HASH: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block_header_by_hash", + "params": { + "hash": "e22cf75f39ae720e8b71b3d120a5ac03f0db50bba6379e2850975b4859190bc6" + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 210, + "block_weight": 210, + "cumulative_difficulty": 754734824984346, + "cumulative_difficulty_top64": 0, + "depth": 2282676, + "difficulty": 815625611, + "difficulty_top64": 0, + "hash": "e22cf75f39ae720e8b71b3d120a5ac03f0db50bba6379e2850975b4859190bc6", + "height": 912345, + "long_term_weight": 210, + "major_version": 1, + "miner_tx_hash": "c7da3965f25c19b8eb7dd8db48dcd4e7c885e2491db77e289f0609bf8e08ec30", + "minor_version": 2, + "nonce": 1646, + "num_txes": 0, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "b61c58b2e0be53fad5ef9d9731a55e8a81d972b8d90ed07c04fd37ca6403ff78", + "reward": 7388968946286, + "timestamp": 1452793716, + "wide_cumulative_difficulty": "0x2ae6d65248f1a", + "wide_difficulty": "0x309d758b" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_block_header_by_height (json_rpc), + GET_BLOCK_HEADER_BY_HEIGHT: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block_header_by_height", + "params": { + "height": 912345 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "block_header": { + "block_size": 210, + "block_weight": 210, + "cumulative_difficulty": 754734824984346, + "cumulative_difficulty_top64": 0, + "depth": 2282677, + "difficulty": 815625611, + "difficulty_top64": 0, + "hash": "e22cf75f39ae720e8b71b3d120a5ac03f0db50bba6379e2850975b4859190bc6", + "height": 912345, + "long_term_weight": 210, + "major_version": 1, + "miner_tx_hash": "c7da3965f25c19b8eb7dd8db48dcd4e7c885e2491db77e289f0609bf8e08ec30", + "minor_version": 2, + "nonce": 1646, + "num_txes": 0, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "b61c58b2e0be53fad5ef9d9731a55e8a81d972b8d90ed07c04fd37ca6403ff78", + "reward": 7388968946286, + "timestamp": 1452793716, + "wide_cumulative_difficulty": "0x2ae6d65248f1a", + "wide_difficulty": "0x309d758b" + }, + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_block_headers_range (json_rpc), + GET_BLOCK_HEADERS_RANGE: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block_headers_range", + "params": { + "start_height": 1545999, + "end_height": 1546000 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "headers": [{ + "block_size": 301413, + "block_weight": 301413, + "cumulative_difficulty": 13185267971483472, + "cumulative_difficulty_top64": 0, + "depth": 1649024, + "difficulty": 134636057921, + "difficulty_top64": 0, + "hash": "86d1d20a40cefcf3dd410ff6967e0491613b77bf73ea8f1bf2e335cf9cf7d57a", + "height": 1545999, + "long_term_weight": 301413, + "major_version": 6, + "miner_tx_hash": "9909c6f8a5267f043c3b2b079fb4eacc49ef9c1dee1c028eeb1a259b95e6e1d9", + "minor_version": 6, + "nonce": 3246403956, + "num_txes": 20, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "0ef6e948f77b8f8806621003f5de24b1bcbea150bc0e376835aea099674a5db5", + "reward": 5025593029981, + "timestamp": 1523002893, + "wide_cumulative_difficulty": "0x2ed7ee6db56750", + "wide_difficulty": "0x1f58ef3541" + },{ + "block_size": 13322, + "block_weight": 13322, + "cumulative_difficulty": 13185402687569710, + "cumulative_difficulty_top64": 0, + "depth": 1649023, + "difficulty": 134716086238, + "difficulty_top64": 0, + "hash": "b408bf4cfcd7de13e7e370c84b8314c85b24f0ba4093ca1d6eeb30b35e34e91a", + "height": 1546000, + "long_term_weight": 13322, + "major_version": 7, + "miner_tx_hash": "7f749c7c64acb35ef427c7454c45e6688781fbead9bbf222cb12ad1a96a4e8f6", + "minor_version": 7, + "nonce": 3737164176, + "num_txes": 1, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "86d1d20a40cefcf3dd410ff6967e0491613b77bf73ea8f1bf2e335cf9cf7d57a", + "reward": 4851952181070, + "timestamp": 1523002931, + "wide_cumulative_difficulty": "0x2ed80dcb69bf2e", + "wide_difficulty": "0x1f5db457de" + }], + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_block (json_rpc), + GET_BLOCK: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block", + "params": { + "height": 2751506 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "blob": "1010c58bab9b06b27bdecfc6cd0a46172d136c08831cf67660377ba992332363228b1b722781e7807e07f502cef8a70101ff92f8a7010180e0a596bb1103d7cbf826b665d7a532c316982dc8dbc24f285cbc18bbcc27c7164cd9b3277a85d034019f629d8b36bd16a2bfce3ea80c31dc4d8762c67165aec21845494e32b7582fe00211000000297a787a000000000000000000000000", + "block_header": { + "block_size": 106, + "block_weight": 106, + "cumulative_difficulty": 236046001376524168, + "cumulative_difficulty_top64": 0, + "depth": 443517, + "difficulty": 313732272488, + "difficulty_top64": 0, + "hash": "43bd1f2b6556dcafa413d8372974af59e4e8f37dbf74dc6b2a9b7212d0577428", + "height": 2751506, + "long_term_weight": 176470, + "major_version": 16, + "miner_tx_hash": "e49b854c5f339d7410a77f2a137281d8042a0ffc7ef9ab24cd670b67139b24cd", + "minor_version": 16, + "nonce": 4110909056, + "num_txes": 0, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "b27bdecfc6cd0a46172d136c08831cf67660377ba992332363228b1b722781e7", + "reward": 600000000000, + "timestamp": 1667941829, + "wide_cumulative_difficulty": "0x3469a966eb2f788", + "wide_difficulty": "0x490be69168" + }, + "credits": 0, + "json": "{\n \"major_version\": 16, \n \"minor_version\": 16, \n \"timestamp\": 1667941829, \n \"prev_id\": \"b27bdecfc6cd0a46172d136c08831cf67660377ba992332363228b1b722781e7\", \n \"nonce\": 4110909056, \n \"miner_tx\": {\n \"version\": 2, \n \"unlock_time\": 2751566, \n \"vin\": [ {\n \"gen\": {\n \"height\": 2751506\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 600000000000, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d7cbf826b665d7a532c316982dc8dbc24f285cbc18bbcc27c7164cd9b3277a85\", \n \"view_tag\": \"d0\"\n }\n }\n }\n ], \n \"extra\": [ 1, 159, 98, 157, 139, 54, 189, 22, 162, 191, 206, 62, 168, 12, 49, 220, 77, 135, 98, 198, 113, 101, 174, 194, 24, 69, 73, 78, 50, 183, 88, 47, 224, 2, 17, 0, 0, 0, 41, 122, 120, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n ], \n \"rct_signatures\": {\n \"type\": 0\n }\n }, \n \"tx_hashes\": [ ]\n}", + "miner_tx_hash": "e49b854c5f339d7410a77f2a137281d8042a0ffc7ef9ab24cd670b67139b24cd", + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_block (json_rpc), + /// This is the same as [`GET_BLOCK_REQUEST`] and + /// [`GET_BLOCK_RESPONSE`] but it uses the `hash` parameter. + GET_BLOCK_HASH: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_block", + "params": { + "hash": "86d421322b700166dde2d7eba1cc8600925ef640abf6c0a2cc8ce0d6dd90abfd" + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "blob": "1010d8faa89b06f8a36d0dbe4d27d2f52160000563896048d71067c31e99a3869bf9b7142227bb5328010b02a6f6a70101ffeaf5a70101a08bc8b3bb11036d6713f5aa552a1aaf33baed7591f795b86daf339e51029a9062dfe09f0f909b312b0124d6023d591c4d434000e5e31c6db718a1e96e865939930e90a7042a1cd4cbd202083786a78452fdfc000002a89e380a44d8dfc64b551baa171447a0f9c9262255be6e8f8ef10896e36e2bf90c4d343e416e394ad9cc10b7d2df7b2f39370a554730f75dfcb04944bd62c299", + "block_header": { + "block_size": 3166, + "block_weight": 3166, + "cumulative_difficulty": 235954020187853162, + "cumulative_difficulty_top64": 0, + "depth": 443814, + "difficulty": 312527777859, + "difficulty_top64": 0, + "hash": "86d421322b700166dde2d7eba1cc8600925ef640abf6c0a2cc8ce0d6dd90abfd", + "height": 2751210, + "long_term_weight": 176470, + "major_version": 16, + "miner_tx_hash": "dabe07900d3123ed895612f4a151adb3e39681b145f0f85bfee23ea1fe47acf2", + "minor_version": 16, + "nonce": 184625235, + "num_txes": 2, + "orphan_status": false, + "pow_hash": "", + "prev_hash": "f8a36d0dbe4d27d2f52160000563896048d71067c31e99a3869bf9b7142227bb", + "reward": 600061380000, + "timestamp": 1667906904, + "wide_cumulative_difficulty": "0x34646ee649f516a", + "wide_difficulty": "0x48c41b7043" + }, + "credits": 0, + "json": "{\n \"major_version\": 16, \n \"minor_version\": 16, \n \"timestamp\": 1667906904, \n \"prev_id\": \"f8a36d0dbe4d27d2f52160000563896048d71067c31e99a3869bf9b7142227bb\", \n \"nonce\": 184625235, \n \"miner_tx\": {\n \"version\": 2, \n \"unlock_time\": 2751270, \n \"vin\": [ {\n \"gen\": {\n \"height\": 2751210\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 600061380000, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"6d6713f5aa552a1aaf33baed7591f795b86daf339e51029a9062dfe09f0f909b\", \n \"view_tag\": \"31\"\n }\n }\n }\n ], \n \"extra\": [ 1, 36, 214, 2, 61, 89, 28, 77, 67, 64, 0, 229, 227, 28, 109, 183, 24, 161, 233, 110, 134, 89, 57, 147, 14, 144, 167, 4, 42, 28, 212, 203, 210, 2, 8, 55, 134, 167, 132, 82, 253, 252, 0\n ], \n \"rct_signatures\": {\n \"type\": 0\n }\n }, \n \"tx_hashes\": [ \"a89e380a44d8dfc64b551baa171447a0f9c9262255be6e8f8ef10896e36e2bf9\", \"0c4d343e416e394ad9cc10b7d2df7b2f39370a554730f75dfcb04944bd62c299\"\n ]\n}", + "miner_tx_hash": "dabe07900d3123ed895612f4a151adb3e39681b145f0f85bfee23ea1fe47acf2", + "status": "OK", + "top_hash": "", + "tx_hashes": ["a89e380a44d8dfc64b551baa171447a0f9c9262255be6e8f8ef10896e36e2bf9","0c4d343e416e394ad9cc10b7d2df7b2f39370a554730f75dfcb04944bd62c299"], + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_connections (json_rpc), + GET_CONNECTIONS: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_connections" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "connections": [{ + "address": "3evk3kezfjg44ma6tvesy7rbxwwpgpympj45xar5fo4qajrsmkoaqdqd.onion:18083", + "address_type": 4, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "22ef856d0f1d44cc95e84fecfd065fe2", + "current_download": 0, + "current_upload": 0, + "height": 3195026, + "host": "3evk3kezfjg44ma6tvesy7rbxwwpgpympj45xar5fo4qajrsmkoaqdqd.onion", + "incoming": false, + "ip": "", + "live_time": 76651, + "local_ip": false, + "localhost": false, + "peer_id": "0000000000000001", + "port": "", + "pruning_seed": 0, + "recv_count": 240328, + "recv_idle_time": 34, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 3406572, + "send_idle_time": 30, + "state": "normal", + "support_flags": 0 + },{ + "address": "4iykytmumafy5kjahdqc7uzgcs34s2vwsadfjpk4znvsa5vmcxeup2qd.onion:18083", + "address_type": 4, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "c7734e15936f485a86d2b0534f87e499", + "current_download": 0, + "current_upload": 0, + "height": 3195024, + "host": "4iykytmumafy5kjahdqc7uzgcs34s2vwsadfjpk4znvsa5vmcxeup2qd.onion", + "incoming": false, + "ip": "", + "live_time": 76755, + "local_ip": false, + "localhost": false, + "peer_id": "0000000000000001", + "port": "", + "pruning_seed": 389, + "recv_count": 237657, + "recv_idle_time": 120, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 3370566, + "send_idle_time": 120, + "state": "normal", + "support_flags": 0 + }], + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_info (json_rpc), + GET_INFO: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_info" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "adjusted_time": 1721245289, + "alt_blocks_count": 16, + "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": 366127702242611947, + "cumulative_difficulty_top64": 0, + "database_size": 235169075200, + "difficulty": 280716748706, + "difficulty_top64": 0, + "free_space": 30521749504, + "grey_peerlist_size": 4996, + "height": 3195028, + "height_without_bootstrap": 3195028, + "incoming_connections_count": 62, + "mainnet": true, + "nettype": "mainnet", + "offline": false, + "outgoing_connections_count": 1143, + "restricted": false, + "rpc_connections_count": 1, + "stagenet": false, + "start_time": 1720462427, + "status": "OK", + "synchronized": true, + "target": 120, + "target_height": 0, + "testnet": false, + "top_block_hash": "bdf06d18ed1931a8ee62654e9b6478cc459bc7072628b8e36f4524d339552946", + "top_hash": "", + "tx_count": 43205750, + "tx_pool_size": 12, + "untrusted": false, + "update_available": false, + "version": "0.18.3.3-release", + "was_bootstrap_ever_used": false, + "white_peerlist_size": 1000, + "wide_cumulative_difficulty": "0x514bf349299d2eb", + "wide_difficulty": "0x415c05a7a2" + } +}"#; +} + +define_request_and_response! { + hard_fork_info (json_rpc), + HARD_FORK_INFO: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "hard_fork_info" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "earliest_height": 2689608, + "enabled": true, + "state": 0, + "status": "OK", + "threshold": 0, + "top_hash": "", + "untrusted": false, + "version": 16, + "votes": 10080, + "voting": 16, + "window": 10080 + } +}"#; +} + +define_request_and_response! { + set_bans (json_rpc), + SET_BANS: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "set_bans", + "params": { + "bans": [{ + "host": "192.168.1.51", + "ban": true, + "seconds": 30 + }] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + set_bans (json_rpc), + /// This is the same as [`SET_BANS_REQUEST`] and + /// [`SET_BANS_RESPONSE`] but it uses the `ip` parameter. + SET_BANS_IP: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "set_bans", + "params": { + "bans": [{ + "ip": 838969536, + "ban": true, + "seconds": 30 + }] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_bans (json_rpc), + GET_BANS: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_bans" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "bans": [{ + "host": "104.248.206.131", + "ip": 2211379304, + "seconds": 689754 + },{ + "host": "209.222.252.0\/24", + "ip": 0, + "seconds": 689754 + }], + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + banned (json_rpc), + BANNED: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "banned", + "params": { + "address": "95.216.203.255" + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "banned": true, + "seconds": 689655, + "status": "OK" + } +}"#; +} + +define_request_and_response! { + flush_txpool (json_rpc), + FLUSH_TRANSACTION_POOL: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "flush_txpool", + "params": { + "txids": ["dc16fa8eaffe1484ca9014ea050e13131d3acf23b419f33bb4cc0b32b6c49308"] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK" + } +}"#; +} + +define_request_and_response! { + get_output_histogram (json_rpc), + GET_OUTPUT_HISTOGRAM: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_output_histogram", + "params": { + "amounts": ["20000000000"] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "histogram": [{ + "amount": 20000000000, + "recent_instances": 0, + "total_instances": 381490, + "unlocked_instances": 0 + }], + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_coinbase_tx_sum (json_rpc), + GET_COINBASE_TX_SUM: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_coinbase_tx_sum", + "params": { + "height": 1563078, + "count": 2 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "emission_amount": 9387854817320, + "emission_amount_top64": 0, + "fee_amount": 83981380000, + "fee_amount_top64": 0, + "status": "OK", + "top_hash": "", + "untrusted": false, + "wide_emission_amount": "0x889c7c06828", + "wide_fee_amount": "0x138dae29a0" + } +}"#; +} + +define_request_and_response! { + get_version (json_rpc), + GET_VERSION: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_version" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "current_height": 3195051, + "hard_forks": [{ + "height": 1, + "hf_version": 1 + },{ + "height": 1009827, + "hf_version": 2 + },{ + "height": 1141317, + "hf_version": 3 + },{ + "height": 1220516, + "hf_version": 4 + },{ + "height": 1288616, + "hf_version": 5 + },{ + "height": 1400000, + "hf_version": 6 + },{ + "height": 1546000, + "hf_version": 7 + },{ + "height": 1685555, + "hf_version": 8 + },{ + "height": 1686275, + "hf_version": 9 + },{ + "height": 1788000, + "hf_version": 10 + },{ + "height": 1788720, + "hf_version": 11 + },{ + "height": 1978433, + "hf_version": 12 + },{ + "height": 2210000, + "hf_version": 13 + },{ + "height": 2210720, + "hf_version": 14 + },{ + "height": 2688888, + "hf_version": 15 + },{ + "height": 2689608, + "hf_version": 16 + }], + "release": true, + "status": "OK", + "untrusted": false, + "version": 196621 + } +}"#; +} + +define_request_and_response! { + get_fee_estimate (json_rpc), + GET_FEE_ESTIMATE: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_fee_estimate" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "fee": 20000, + "fees": [20000,80000,320000,4000000], + "quantization_mask": 10000, + "status": "OK", + "top_hash": "", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + get_alternate_chains (json_rpc), + GET_ALTERNATE_CHAINS: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_alternate_chains" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "chains": [{ + "block_hash": "4826c7d45d7cf4f02985b5c405b0e5d7f92c8d25e015492ce19aa3b209295dce", + "block_hashes": ["4826c7d45d7cf4f02985b5c405b0e5d7f92c8d25e015492ce19aa3b209295dce"], + "difficulty": 357404825113208373, + "difficulty_top64": 0, + "height": 3167471, + "length": 1, + "main_chain_parent_block": "69b5075ea627d6ba06b1c30b7e023884eeaef5282cf58ec847dab838ddbcdd86", + "wide_difficulty": "0x4f5c1cb79e22635" + },{ + "block_hash": "33ee476f5a1c5b9d889274cbbe171f5e0112df7ed69021918042525485deb401", + "block_hashes": ["33ee476f5a1c5b9d889274cbbe171f5e0112df7ed69021918042525485deb401"], + "difficulty": 354736121711617293, + "difficulty_top64": 0, + "height": 3157465, + "length": 1, + "main_chain_parent_block": "fd522fcc4cefe5c8c0e5c5600981b3151772c285df3a4e38e5c4011cf466d2cb", + "wide_difficulty": "0x4ec469f8b9ee50d" + }], + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + relay_tx (json_rpc), + RELAY_TX: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "relay_tx", + "params": { + "txids": ["9fd75c429cbe52da9a52f2ffc5fbd107fe7fd2099c0d8de274dc8a67e0c98613"] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK" + } +}"#; +} + +define_request_and_response! { + sync_info (json_rpc), + SYNC_INFO: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "sync_info" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "credits": 0, + "height": 3195157, + "next_needed_pruning_seed": 0, + "overview": "[]", + "peers": [{ + "info": { + "address": "142.93.128.65:44986", + "address_type": 1, + "avg_download": 1, + "avg_upload": 1, + "connection_id": "a5803c4c2dac49e7b201dccdef54c862", + "current_download": 2, + "current_upload": 1, + "height": 3195157, + "host": "142.93.128.65", + "incoming": true, + "ip": "142.93.128.65", + "live_time": 18, + "local_ip": false, + "localhost": false, + "peer_id": "6830e9764d3e5687", + "port": "44986", + "pruning_seed": 0, + "recv_count": 20340, + "recv_idle_time": 0, + "rpc_credits_per_hash": 0, + "rpc_port": 18089, + "send_count": 32235, + "send_idle_time": 6, + "state": "normal", + "support_flags": 1 + } + },{ + "info": { + "address": "4iykytmumafy5kjahdqc7uzgcs34s2vwsadfjpk4znvsa5vmcxeup2qd.onion:18083", + "address_type": 4, + "avg_download": 0, + "avg_upload": 0, + "connection_id": "277f7c821bc546878c8bd29977e780f5", + "current_download": 0, + "current_upload": 0, + "height": 3195157, + "host": "4iykytmumafy5kjahdqc7uzgcs34s2vwsadfjpk4znvsa5vmcxeup2qd.onion", + "incoming": false, + "ip": "", + "live_time": 2246, + "local_ip": false, + "localhost": false, + "peer_id": "0000000000000001", + "port": "", + "pruning_seed": 389, + "recv_count": 65164, + "recv_idle_time": 15, + "rpc_credits_per_hash": 0, + "rpc_port": 0, + "send_count": 99120, + "send_idle_time": 15, + "state": "normal", + "support_flags": 0 + } + }], + "status": "OK", + "target_height": 0, + "top_hash": "", + "untrusted": false + } +}"#; +} + +// TODO: binary string. +// define_request_and_response! { +// get_txpool_backlog (json_rpc), +// GET_TRANSACTION_POOL_BACKLOG: &str, +// Request = +// r#"{ +// "jsonrpc": "2.0", +// "id": "0", +// "method": "get_txpool_backlog" +// }"#; +// Response = +// r#"{ +// "id": "0", +// "jsonrpc": "2.0", +// "result": { +// "backlog": "...Binary...", +// "status": "OK", +// "untrusted": false +// } +// }"#; +// } + +define_request_and_response! { + get_output_distribution (json_rpc), + GET_OUTPUT_DISTRIBUTION: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_output_distribution", + "params": { + "amounts": [628780000], + "from_height": 1462078 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "distributions": [{ + "amount": 2628780000, + "base": 0, + "distribution": "", + "start_height": 1462078 + }], + "status": "OK" + } +}"#; +} + +define_request_and_response! { + get_miner_data (json_rpc), + GET_MINER_DATA: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_miner_data" +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "already_generated_coins": 18186022843595960691, + "difficulty": "0x48afae42de", + "height": 2731375, + "major_version": 16, + "median_weight": 300000, + "prev_id": "78d50c5894d187c4946d54410990ca59a75017628174a9e8c7055fa4ca5c7c6d", + "seed_hash": "a6b869d50eca3a43ec26fe4c369859cf36ae37ce6ecb76457d31ffeb8a6ca8a6", + "status": "OK", + "tx_backlog": [{ + "fee": 30700000, + "id": "9868490d6bb9207fdd9cf17ca1f6c791b92ca97de0365855ea5c089f67c22208", + "weight": 1535 + },{ + "fee": 44280000, + "id": "b6000b02bbec71e18ad704bcae09fb6e5ae86d897ced14a718753e76e86c0a0a", + "weight": 2214 + }], + "untrusted": false + } +}"#; +} + +define_request_and_response! { + prune_blockchain (json_rpc), + PRUNE_BLOCKCHAIN: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "prune_blockchain", + "params": { + "check": true + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "pruned": true, + "pruning_seed": 387, + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + calc_pow (json_rpc), + CALC_POW: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "calc_pow", + "params": { + "major_version": 14, + "height": 2286447, + "block_blob": "0e0ed286da8006ecdc1aab3033cf1716c52f13f9d8ae0051615a2453643de94643b550d543becd0000000002abc78b0101ffefc68b0101fcfcf0d4b422025014bb4a1eade6622fd781cb1063381cad396efa69719b41aa28b4fce8c7ad4b5f019ce1dc670456b24a5e03c2d9058a2df10fec779e2579753b1847b74ee644f16b023c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000051399a1bc46a846474f5b33db24eae173a26393b976054ee14f9feefe99925233802867097564c9db7a36af5bb5ed33ab46e63092bd8d32cef121608c3258edd55562812e21cc7e3ac73045745a72f7d74581d9a0849d6f30e8b2923171253e864f4e9ddea3acb5bc755f1c4a878130a70c26297540bc0b7a57affb6b35c1f03d8dbd54ece8457531f8cba15bb74516779c01193e212050423020e45aa2c15dcb", + "seed_hash": "d432f499205150873b2572b5f033c9c6e4b7c6f3394bd2dd93822cd7085e7307" + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": "d0402d6834e26fb94a9ce38c6424d27d2069896a9b8b1ce685d79936bca6e0a8" +}"#; +} + +define_request_and_response! { + flush_cache (json_rpc), + FLUSH_CACHE: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "flush_cache", + "params": { + "bad_txs": true, + "bad_blocks": true + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + add_aux_pow (json_rpc), + ADD_AUX_POW: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "add_aux_pow", + "params": { + "blocktemplate_blob": "1010f4bae0b4069d648e741d85ca0e7acb4501f051b27e9b107d3cd7a3f03aa7f776089117c81a0000000002c681c30101ff8a81c3010180e0a596bb11033b7eedf47baf878f3490cb20b696079c34bd017fe59b0d070e74d73ffabc4bb0e05f011decb630f3148d0163b3bd39690dde4078e4cfb69fecf020d6278a27bad10c58023c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "aux_pow": [{ + "id": "3200b4ea97c3b2081cd4190b58e49572b2319fed00d030ad51809dff06b5d8c8", + "hash": "7b35762de164b20885e15dbe656b1138db06bb402fa1796f5765a23933d8859a" + }] + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "aux_pow": [{ + "hash": "7b35762de164b20885e15dbe656b1138db06bb402fa1796f5765a23933d8859a", + "id": "3200b4ea97c3b2081cd4190b58e49572b2319fed00d030ad51809dff06b5d8c8" + }], + "blockhashing_blob": "1010ee97e2a106e9f8ebe8887e5b609949ac8ea6143e560ed13552b110cb009b21f0cfca1eaccf00000000b2685c1283a646bc9020c758daa443be145b7370ce5a6efacb3e614117032e2c22", + "blocktemplate_blob": "1010f4bae0b4069d648e741d85ca0e7acb4501f051b27e9b107d3cd7a3f03aa7f776089117c81a0000000002c681c30101ff8a81c3010180e0a596bb11033b7eedf47baf878f3490cb20b696079c34bd017fe59b0d070e74d73ffabc4bb0e05f011decb630f3148d0163b3bd39690dde4078e4cfb69fecf020d6278a27bad10c58023c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "merkle_root": "7b35762de164b20885e15dbe656b1138db06bb402fa1796f5765a23933d8859a", + "merkle_tree_depth": 0, + "status": "OK", + "untrusted": false + } +}"#; +} + +define_request_and_response! { + UNDOCUMENTED_METHOD (json_rpc), + GET_TX_IDS_LOOSE: &str, + Request = +r#"{ + "jsonrpc": "2.0", + "id": "0", + "method": "get_txids_loose", + "params": { + "txid_template": "0000000000000000aea473c43708aa50b2c9eaf0e441aa209afc9b43458fb09e", + "num_matching_bits": 192 + } +}"#; + Response = +r#"{ + "id": "0", + "jsonrpc": "2.0", + "result": { + "txids": "", + "status": "OK", + "untrusted": false + } +}"#; +} + +//---------------------------------------------------------------------------------------------------- Tests +#[cfg(test)] +mod test { + // use super::*; +} diff --git a/test-utils/src/rpc/data/macros.rs b/test-utils/src/rpc/data/macros.rs new file mode 100644 index 0000000..632917a --- /dev/null +++ b/test-utils/src/rpc/data/macros.rs @@ -0,0 +1,168 @@ +//! Macros. + +//---------------------------------------------------------------------------------------------------- define_request_and_response +/// A template for generating the RPC request and response `const` data. +/// +/// See the [`crate::json`] module for example usage. +/// +/// # Macro internals +/// This macro uses: +/// - [`define_request_and_response_doc`] +/// - [`define_request_and_response_test`] +macro_rules! define_request_and_response { + ( + // The markdown tag for Monero daemon RPC documentation. Not necessarily the endpoint. + // + // Adding `(json)` after this will trigger the macro to automatically + // add a `serde_json` test for the request/response data. + $monero_daemon_rpc_doc_link:ident $(($test:ident))?, + + // The base name. + // Attributes added here will apply to _both_ + // request and response types. + $( #[$attr:meta] )* + $name:ident: $type:ty, + + // The request type (and any doc comments, derives, etc). + $( #[$request_attr:meta] )* + Request = $request:expr; + + // The response type (and any doc comments, derives, etc). + $( #[$response_attr:meta] )* + Response = $response:expr; + ) => { paste::paste! { + #[doc = $crate::rpc::data::macros::define_request_and_response_doc!( + "response" => [<$name:upper _RESPONSE>], + $monero_daemon_rpc_doc_link, + )] + /// + $( #[$attr] )* + /// + $( #[$request_attr] )* + /// + $( + #[doc = $crate::rpc::data::macros::define_request_and_response_doc_test!([<$name:upper _REQUEST>], $test)] + )? + pub const [<$name:upper _REQUEST>]: $type = $request; + + #[doc = $crate::rpc::data::macros::define_request_and_response_doc!( + "request" => [<$name:upper _REQUEST>], + $monero_daemon_rpc_doc_link, + )] + /// + $( #[$attr] )* + /// + $( #[$response_attr] )* + /// + $( + #[doc = $crate::rpc::data::macros::define_request_and_response_doc_test!([<$name:upper _RESPONSE>], $test)] + )? + pub const [<$name:upper _RESPONSE>]: $type = $response; + }}; +} +pub(super) use define_request_and_response; + +//---------------------------------------------------------------------------------------------------- define_request_and_response_doc +/// Generate documentation for the types generated +/// by the [`define_request_and_response`] macro. +/// +/// See it for more info on inputs. +macro_rules! define_request_and_response_doc { + ( + // This labels the last `[request]` or `[response]` + // hyperlink in documentation. Input is either: + // - "request" + // - "response" + // + // Remember this is linking to the _other_ type, + // so if defining a `Request` type, input should + // be "response". + $request_or_response:literal => $request_or_response_type:ident, + $monero_daemon_rpc_doc_link:ident, + ) => { + concat!( + "", + "[Documentation](", + "https://www.getmonero.org/resources/developer-guides/daemon-rpc.html", + "#", + stringify!($monero_daemon_rpc_doc_link), + "), [", + $request_or_response, + "](", + stringify!($request_or_response_type), + ")." + ) + }; +} +pub(super) use define_request_and_response_doc; + +//---------------------------------------------------------------------------------------------------- define_request_and_response_test +/// Generate documentation for the types generated +/// by the [`define_request_and_response`] macro. +/// +/// See it for more info on inputs. +macro_rules! define_request_and_response_doc_test { + // `/json_rpc` doc test. + ( + // The ident of the `const` request/response. + $name:ident, + json_rpc + ) => { + concat!( + "```rust\n", + "use cuprate_test_utils::rpc::data::json::*;\n", + "use serde_json::{to_value, Value};\n", + "\n", + "let value = serde_json::from_str::(&", + stringify!($name), + ").unwrap();\n", + "let Value::Object(map) = value else {\n", + " panic!();\n", + "};\n", + "\n", + r#"assert_eq!(map.get("jsonrpc").unwrap(), "2.0");"#, + "\n", + r#"map.get("id").unwrap();"#, + "\n\n", + r#"if map.get("method").is_some() {"#, + "\n", + r#" return;"#, + "\n", + "}\n", + "\n", + r#"if map.get("result").is_none() {"#, + "\n", + r#" map.get("error").unwrap();"#, + "\n", + "}\n", + "\n", + "```\n", + ) + }; + + // Other JSON endpoint doc test. + ( + $name:ident, + other + ) => { + concat!( + "```rust\n", + "use cuprate_test_utils::rpc::data::other::*;\n", + "use serde_json::{to_value, Value};\n", + "\n", + "let value = serde_json::from_str::(&", + stringify!($name), + ");\n", + "```\n", + ) + }; + + // No doc test. + ( + $name:ident, + $test:ident, + ) => { + "" + }; +} +pub(super) use define_request_and_response_doc_test; diff --git a/test-utils/src/rpc/data/mod.rs b/test-utils/src/rpc/data/mod.rs new file mode 100644 index 0000000..09f0d60 --- /dev/null +++ b/test-utils/src/rpc/data/mod.rs @@ -0,0 +1,18 @@ +//! Monero RPC data. +//! +//! This module contains real `monerod` RPC requests/responses +//! as `const` [`str`]s and byte arrays (binary). +//! +//! The strings include the JSON-RPC 2.0 portions of the JSON. +//! - Tests exist within this crate that ensure the JSON is valid +//! - Tests exist within Cuprate's `rpc/` crates that ensure these strings (de)serialize as valid types +//! +//! # Determinism +//! Note that although both request/response data is defined, +//! they aren't necessarily tied to each other, i.e. the request +//! will not deterministically lead to the response. + +pub mod bin; +pub mod json; +mod macros; +pub mod other; diff --git a/test-utils/src/rpc/data/other.rs b/test-utils/src/rpc/data/other.rs new file mode 100644 index 0000000..2559bbe --- /dev/null +++ b/test-utils/src/rpc/data/other.rs @@ -0,0 +1,839 @@ +//! JSON data from the [`other`](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#other-daemon-rpc-calls) endpoints. + +//---------------------------------------------------------------------------------------------------- Import +use crate::rpc::data::macros::define_request_and_response; + +//---------------------------------------------------------------------------------------------------- TODO +define_request_and_response! { + // `(other)` adds a JSON sanity-check test. + get_height (other), + GET_HEIGHT: &str, + Request = +r#"{}"#; + Response = +r#"{ + "hash": "68bb1a1cff8e2a44c3221e8e1aff80bc6ca45d06fa8eff4d2a3a7ac31d4efe3f", + "height": 3195160, + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + get_transactions (other), + GET_TRANSACTIONS: &str, + Request = +r#"{ + "txs_hashes": ["d6e48158472848e6687173a91ae6eebfa3e1d778e65252ee99d7515d63090408"] +}"#; + Response = +r#"{ + "credits": 0, + "status": "OK", + "top_hash": "", + "txs": [{ + "as_hex": "0100940102ffc7afa02501b3056ebee1b651a8da723462b4891d471b990ddc226049a0866d3029b8e2f75b70120280a0b6cef785020190dd0a200bd02b70ee707441a8863c5279b4e4d9f376dc97a140b1e5bc7d72bc5080690280c0caf384a30201d0b12b751e8f6e2e31316110fa6631bf2eb02e88ac8d778ec70d42b24ef54843fd75d90280d0dbc3f40201c498358287895f16b62a000a3f2fd8fb2e70d8e376858fb9ba7d9937d3a076e36311bb0280f092cbdd0801e5a230c6250d5835877b735c71d41587082309bf593d06a78def1b4ec57355a37838b5028080bfb59dd20d01c36c6dd3a9826658642ba4d1d586366f2782c0768c7e9fb93f32e8fdfab18c0228ed0280d0b8e1981a01bfb0158a530682f78754ab5b1b81b15891b2c7a22d4d7a929a5b51c066ffd73ac360230280f092cbdd0801f9a330a1217984cc5d31bf0e76ed4f8e3d4115f470824bc214fa84929fcede137173a60280e0bcefa75701f3910e3a8b3c031e15573f7a69db9f8dda3b3f960253099d8f844169212f2de772f6ff0280d0b8e1981a01adc1157920f2c72d6140afd4b858da3f41d07fc1655f2ebe593d32f96d5335d11711ee0280d0dbc3f40201ca8635a1373fa829f58e8f46d72c8e52aa1ce53fa1d798284ed08b44849e2e9ad79b620280a094a58d1d01faf729e5ab208fa809dd2efc6f0b74d3e7eff2a66c689a3b5c31c33c8a14e2359ac484028080e983b1de1601eced0182c8d37d77ce439824ddb3c8ff7bd60642181e183c409545c9d6f9c36683908f028080d194b57401ead50b3eefebb5303e14a5087de37ad1799a4592cf0e897eafb46d9b57257b5732949e0280a094a58d1d01d3882a1e949b2d1b6fc1fd5e44df95bae9068b090677d76b6c307188da44dd4e343cef028090cad2c60e0196c73a74a60fc4ce3a7b14d1abdf7a0c70a9efb490a9de6ec6208a846f8282d878132b028080bb8b939b4401c03dbcbfd9fb02e181d99c0093e53aceecf42bf6ccc0ec611a5093fe6f2b2738a07f0280f092cbdd0801b98d30c27f297ae4cb89fb7bb29ed11adff17db9b71d39edf736172892784897488c5d0280d0dbc3f40201da9a353d39555c27a2d620bf69136e4c665aaa19557d6fc0255cbb67ec69bf2403b63e0280b09dc2df0101f8820caab7a5e736f5445b5624837de46e9ef906cb538f7c860f688a7f7d155e19e0ac0280808d93f5d77101b544e62708eb27ff140b58c521e4a90acab5eca36f1ce9516a6318306f7d48beddbc0280a0b6cef7850201abdd0a5453712326722427f66b865e67f8cdb7188001aaacb70f1a018403d3289fcb130280c0caf384a30201a2b32b2cfb06b7022668b2cd5b8263a162511c03154b259ce91c6c97270e4c19efe4710280c0caf384a302018db32bda81bfbe5f9cdf94b20047d12a7fb5f097a83099fafdfedc03397826fb4d18d50280c0fc82aa0201b2e60b825e8c0360b4b44f4fe0a30f4d2f18c80d5bbb7bfc5ddf671f27b6867461c51d028080e983b1de1601b2eb0156dd7ab6dcb0970d4a5dbcb4e04281c1db350198e31893cec9b9d77863fedaf60280e08d84ddcb0101e0960fe3cafedb154111449c5112fc1d9e065222ed0243de3207c3e6f974941a66f177028080df9ad7949f01019815c8c5032f2c28e7e6c9f9c70f6fccdece659d8df53e54ad99a0f7fa5d831cf762028090dfc04a01b4fb123d97504b9d832f7041c4d1db1cda3b7a6d307194aff104ec6b711cced2b005e2028080dd9da41701bef1179c9a459e75a0c4cf4aff1a81f31f477bd682e28a155231da1a1aa7a25ef219910280d88ee16f01facd0f043485225a1e708aa89d71f951bc092724b53942a67a35b2315bfeac4e8af0eb0280d0dbc3f40201c4e634d6e1f3a1b232ef130d4a5417379c4fcc9d078f71899f0617cec8b1e72a1844b60280f092cbdd0801f6b9300c8c94a337fefc1c19f12dee0f2551a09ee0aaa954d1762c93fec8dadae2146c0280c0f9decfae0101ce8d09f26c90144257b5462791487fd1b017eb283268b1c86c859c4194bf1a987c62bf0280c0caf384a30201cead2bbb01653d0d7ff8a42958040814c3cbf228ebb772e03956b367bace3b684b9b7f0280a0e5b9c2910101c1b40c1796904ac003f7a6dd72b4845625e99ba12bdd003e65b2dd2760a4e460821178028080e983b1de160186e9013f55160cd9166756ea8e2c9af065dcdfb16a684e9376c909d18b65fd5306f9690280a0e5b9c2910101aeb70c4433f95ff4cdc4aa54a1ede9ae725cec06350db5d3056815486e761e381ae4d00280c0a8ca9a3a01ebe2139bd558b63ebb9f4d12aca270159ccf565e9cffaadd717ce200db779f202b106f0280d0dbc3f40201b9963568acf599958be4e72f71c3446332a39c815876c185198fa2dcf13877eba3627b0280c0f4c198af0b01bccc01408cbb5a210ad152bd6138639673a6161efd2f85be310b477ae14891870985f90280a0b6cef7850201cadd0a82e7950f5d9e62d14d0f7c6af84002ea9822cdeefabbb866b7a5776c6436636b028080d287e2bc2d01d888013a7146b96a7abc5ce5249b7981fb54250eef751964ff00530915084479b5d6ba028080d287e2bc2d018c8901d8cc1933366dceb49416b2f48fd2ce297cfd8da8baadc7f63856c46130368fca0280a0b787e90501b6d242f93a6570ad920332a354b14ad93b37c0f3815bb5fa2dcc7ca5e334256bd165320280a0e5b9c2910101a3ac0c4ed5ebf0c11285c351ddfd0bb52bd225ee0f8a319025dc416a5e2ba8e84186680280c0f9decfae0101f18709daddc52dccb6e1527ac83da15e19c2272206ee0b2ac37ac478b4dd3e6bcac5dc0280f8cce2840201b7c80bc872a1e1323d61342a2a7ac480b4b061163811497e08698057a8774493a1abe50280e0bcefa75701f38b0e532d34791916b1f56c3f008b2231de5cc62bd1ec898c62d19fb1ec716d467ae20280c0fc82aa0201d6da0b7de4dc001430473852620e13e5931960c55ab6ebeff574fbddea995cbc9d7c010280c0f4c198af0b01edca017ec6af4ece2622edaf9914cfb1cc6663639285256912d7d9d70e905120a6961c028090cad2c60e01cad43abcc63a192d53fe8269ecaf2d9ca3171c2172d85956fe44fcc1ac01efe4c610dd0280809aa6eaafe30101a92fccd2bcadfa42dcbd28d483d32abde14b377b72c4e6ef31a1f1e0ff6c2c9f452f0280a0b787e9050197d9420ce413f5321a785cd5bea4952e6c32acd0b733240a2ea2835747bb916a032da7028080d287e2bc2d01c48a01a3c4afcbbdac70524b27585c68ed1f8ea3858c1c392aeb7ada3432f3eed7cab10280f092cbdd0801abb130d362484a00ea63b2a250a8ae7cf8b904522638838a460653a3c37db1b76ff3de0280e08d84ddcb0101cc980fce5c2d8b34b3039e612adeb707f9ab397c75f76c1f0da8af92c64cd021976ff3028080dd9da4170198c217e4a7b63fd645bd27aa5afc6fae7db1e66896cece0d4b84ac76428268b5c213c30280a0b6cef7850201e3e20acab086a758c56372cf461e5339c09745ee510a785b540d68c7f62c35b8b6c5c10280a094a58d1d01ab842ac0ba57e87a3f204a56cbecca405419e4c896c817c5ced715d903a104a09735660280e0a596bb1101ade921f1ef2fe56c74320ceb1f6c52506d0b835808474b928ad6309398b42434d27f3d0280d0b8e1981a01dab515d684a324cff4b00753a9ef0868f308b8121cbc79077ede84d70cf6015ec989be0280c0ee8ed20b01f99c227da8d616ce3669517282902cdf1ef75e75a427385270d1a94197b93cf6620c15028080dd9da41701d2d0175c8494f151e585f01e80c303c84eea460b69874b773ba01d20f28a05916111a0028090dfc04a01a4f312c12a9f52a99f69e43979354446fd4e2ba5e2d5fb8aaa17cd25cdf591543149da0280d0dbc3f40201969c3510fbca0efa6d5b0c45dca32a5a91b10608594a58e5154d6a453493d4a0f10cf70280f8cce2840201ddcb0b76ca6a2df4544ea2d9634223becf72b6d6a176eae609d8a496ee7c0a45bec8240280e0bcefa7570180920e95d8d04f9f7a4b678497ded16da4caca0934fc019f582d8e1db1239920914d35028090cad2c60e01c2d43a30bbb2dcbb2b6c361dc49649a6cf733b29df5f6e7504b03a55ee707ed3db2c4e028080d287e2bc2d01c38801941b46cb00712de68cebc99945dc7b472b352c9a2e582a9217ea6d0b8c3f07590280e0a596bb1101b6eb219463e6e8aa6395eefc4e7d2d7d6484b5f684e7018fe56d3d6ddca82f4b89c5840280d0dbc3f40201db9535db1fb02f4a45c21eae26f5c40c01ab1bca304deac2fb08d2b3d9ac4f65fd10c60280a094a58d1d01948c2a413da2503eb92880f02f764c2133ed6f2951ae86e8c8c17d1e9e024ca4dc72320280c0ee8ed20b01869f22d3e106082527d6f0b052106a4850801fcd59d0b6ce61b237c2321111ed8bdf47028080d194b57401acd20b9c0e61b23698c4b4d47965a597284d409f71d7f16f4997bc04ba042d3cbe044d028090cad2c60e0194b83ac3b448f0bd45f069df6a80e49778c289edeb93b9f213039e53a828e685c270f90280a094a58d1d01bdfb2984b37167dce720d3972eaa50ba42ae1c73ce8e8bc15b5b420e55c9ae96e5ca8c028090dfc04a01abf3120595fbef2082079af5448c6d0d6491aa758576881c1839f4934fa5f6276b33810280e0a596bb1101f9ea2170a571f721540ec01ae22501138fa808045bb8d86b22b1be686b258b2cc999c5028088aca3cf02019cb60d1ffda55346c6612364a9f426a8b9942d9269bef1360f20b8f3ccf57e9996b5f70280e8eda1ba0101aff90c87588ff1bb510a30907357afbf6c3292892c2d9ff41e363889af32e70891cb9b028080d49ca7981201d65ee875df2a98544318a5f4e9aa70a799374b40cff820c132a388736b86ff6c7b7d0280c0caf384a30201dab52bbf532aa44298858b0a313d0f29953ea90efd3ac3421c674dbda79530e4a6b0060280f092cbdd0801c3ab30b0fc9f93dddc6c3e4d976e9c5e4cfee5bfd58415c96a3e7ec05a3172c29f223f0280a094a58d1d01a2812a3e0ec75af0330302c35c582d9a14c8e5f00a0bf84da22eec672c4926ca6fccb10280a094a58d1d01ca842a2b03a22e56f164bae94e43d1c353217c1a1048375731c0c47bb63216e1ef6c480280e08d84ddcb0101d68b0fb2d29505b3f25a8e36f17a2fde13bce41752ecec8c2042a7e1a7d65a0fd35cdf028090cad2c60e0199ce3afa0b62692f1b87324fd4904bf9ffd45ed169d1f5096634a3ba8602919681e5660280c0f9decfae010193ed081977c266b88f1c3cb7027c0216adb506f0e929ce650cd178b81645458c3af4c6028090cad2c60e01eec13a9cce0e6750904e5649907b0bdc6c6963f62fef41ef3932765418d933fc1cd97a0280c0ee8ed20b019ea8228d467474d1073d5c906acdec6ee799b71e16141930c9d66b7f181dbd7a6e924a028080bb8b939b4401c23d3cb4e840ad6766bb0fd6d2b81462f1e4828d2eae341ce3bd8d7ce38b036ac6fb028080e983b1de1601b9e601e3cf485fa441836d83d1f1be6d8611599eccc29f3af832b922e45ab1cd7f31d00280f092cbdd0801fc9e30fff408d7b0c5d88f662dddb5d06ff382baa06191102278e54a0030f7e3246e7c0280d88ee16f01bfcd0f96a24f27ac225278701c6b54df41c6aa511dd86ce682516fb1824ff104c572fb0280f092cbdd0801cbb430bd5f343e45c62efcd6e0f62e77ceb3c95ef945b0cff7002872ea350b5dfffef10280c0caf384a30201bfb22b14dccbba4582da488aef91b530395979f73fa83511e3b3bcb311221c6832b18d0280a0b6cef7850201c4dc0a31fb268316ab21229072833191b7a77b9832afea700a1b93f2e86fb31be9480f028090cad2c60e01cab63a313af96a15c06fcf1f1cf10b69eae50e2c1d005357df457768d384b7a35fa0bb0280d0dbc3f40201fe9835fffd89020879ec3ca02db3eadbb81b0c34a6d77f9d1031438d55fd9c33827db00280d0dbc3f40201d19b354a25ddf2641fc7e000f9306df1c6bf731bddfe9ab148713781bbfab4814ed87e0280e08d84ddcb0101ba960fec80e1dcda9fae2d63e14500354f191f287811f5503e269c9ec1ae56cef4cd110280a0b787e90501acde42b0bdfd00ab0518c8bd6938f0a6efab1b1762704e86c71a154f6d6378dd63ce840280e0bcefa75701b5900eedc2ce12618978351788e46fefe8b9b776510ec32add7423f649c613b9db853a028080e983b1de1601edeb01d68b226cd6b71903a812aa6a6f0799381cf6f70870810df560042cd732b26526028080f696a6b6880101ca18a91fd53d6370a95ca2e0700aabc3784e355afcafb25656c70d780de90e30be31028090cad2c60e0184c03adc307ee3753a20f8f687344aae487639ab12276b604b1f74789d47f1371cac6b0280c0fc82aa0201a2dc0b000aa40a7e3e44d0181aaa5cc64df6307cf119798797fbf82421e3b78a0aa2760280e8eda1ba0101daf20caa8a7c80b400f4dd189e4a00ef1074e26fcc186fed46f0d97814c464aa7561e20280c0f9decfae0101a18b092ee7d48a9fb88cefb22874e5a1ed7a1bf99cc06e93e55c7f75ca4bf38ad185a60280a094a58d1d01dff92904ef53b1415cdb435a1589c072a7e6bd8e69a31bf31153c3beb07ebf585aa838028080bfb59dd20d01916c9d21b580aed847f256b4f507f562858396a9d392adc92b7ed3585d78acf9b38b028080a2a9eae80101fab80b153098181e5fabf1056b4e88db7ce5ed875132e3b7d78ed3b6fc528edda921050280d88ee16f019fcf0fd5f4d68c9afe2e543c125963043024fe557e817c279dbd0602b158fe96ec4b6f0280e0bcefa75701d1910e44b59722c588c30a65b920fc72e0e58c5acc1535b4cad4fc889a89fccfa271510280d0dbc3f40201b78b358b066d485145ada1c39153caacf843fcd9c2f4681d226d210a9a9942109314d90280e0bcefa75701a88b0e5f100858379f9edbbfe92d8f3de825990af354e38edc3b0d246d8a62f01ab3220280d0dbc3f40201959135c6a904269f0bf29fbf8cef1f705dde8c7364ba4618ad9ee378b69a3d590af5680280e0a596bb1101edeb2140e07858aa36619a74b0944c52663b7d3818ab6bf9e66ee792cda1b6dd39842e0280c0a8ca9a3a01aae213a90a6708e741f688a32fb5f1b800800e64cfd341c0f82f8e1ca822336d70c78e0280c0fc82aa02018ddf0b5e03adc078c32952c9077fee655a65a933558c610f23245cd7416669da12611e0280f092cbdd0801aca0305b7157269b35d5068d64f8d43386e8463f2893695bc94f07b4a14f9f5c85e8c50280e0bcefa75701b18f0efd26a0ad840829429252c7e6db2ff0eb7980a8f4c4e400b3a68475f6831cc5f50280b09dc2df0101a6830c2b7555fd29e82d1f0cf6a00f2c671c94c3c683254853c045519d1c5d5dc314fb028080bb8b939b4401be3d76fcfea2c6216513382a75aedaba8932f339ed56f4aad33fb04565429c7f7fa50280c0ee8ed20b01b4a322218a5fd3a13ed0847e8165a28861fb3edc0e2c1603e95e042e2cbb0040e49ab50280c0caf384a30201ecb42b7c10020495d95b3c1ea45ce8709ff4a181771fc053911e5ec51d237d585f19610280f092cbdd0801eba3309533ea103add0540f9624cb24c5cecadf4b93ceb39aa2e541668a0dd23bf3f2f028090dfc04a01a6f3121520ad99387cf4dd779410542b3f5ed9991f0fadbb40f292be0057f4a1dfbf10028090cad2c60e019ac83a125492706ba043a4e3b927ab451c8dccb4b798f83312320dcf4d306bc45c3016028080a2a9eae80101b4ba0bd413da8f7f0aad9cd41d728b4fef20e31fbc61fc397a585c6755134406680b14028080d49ca798120192600ef342c8cf4c0e9ebf52986429add3de7f7757c3d5f7c951810b2fb5352aec620280a0b787e90501afe442797256544eb3515e6fa45b1785d65816dd179bd7f0372a561709f87fae7f95f10280a094a58d1d01dc882aacbd3e13a0b97c2a08b6b6deec5e9685b94409d30c774c85a373b252169d588f028090dfc04a0184f81225e7ded2e83d4f9f0ee64f60c9c8bce2dcb110fd2f3d66c17aafdff53fbf6bbe028080d287e2bc2d01d18901e2fd0eeb4fe9223b4610e05022fcc194240e8afe5472fceda8346cb5b66a0a5902808095e789c60401cf88036cf7317af6dc47cd0ce319a51aaaf936854287c07a24afad791a1431cbd2df5c0280c0f9decfae0101999909d038b9c30a2de009813e56ba2ba17964a24d5f195aaa5f7f2f5fefacd69893e80280a0e5b9c291010199b10cf336c49e2864d07ad3c7a0b9a19e0c17aaf0e72f9fcc980180272000fe5ba1260280a0b6cef7850201a2e20a7a870af412e8fff7eba50b2f8f3be318736996a347fa1222019be9971b6f9b81028090dfc04a01bae5127889a54246328815e9819a05eea4c93bdfffaa2a2cc9747c5d8e74a9a4a8bfe10280f8cce284020191da0b24ee29cd3f554bb618f336dd2841ba23168bf123ee88ebdb48bcbb033a67a02f0280f8cce2840201e6c30b2756e87b0b6ff35103c20c1ddb3b0502f712977fd7909a0b552f1c7dfc3e0c3c028080e983b1de16018fed01a3c245ee280ff115f7e92b16dc2c25831a2da6af5321ad76a1fbbcdd6afc780c0280e0bcefa7570183920ef957193122bb2624d28c0a3cbd4370a1cfff4e1c2e0c8bb22d4c4b47e7f0a5a60280f092cbdd0801ccab30f5440aceabe0c8c408dddf755f789fae2afbf21a64bc183f2d4218a8a792f2870280e08d84ddcb0101f8870f8e26eacca06623c8291d2b29d26ca7f476f09e89c21302d0b85e144267b2712a028080aace938c0901b0b1014c9b9fab49660c2067f4b60151427cf415aa0887447da450652f83a8027524170580b09dc2df01028c792dea94dab48160e067fb681edd6247ba375281fbcfedc03cb970f3b98e2d80b081daaf14021ab33e69737e157d23e33274c42793be06a8711670e73fa10ecebc604f87cc7180a0b6cef78502020752a6308df9466f0838c978216926cb69e113761e84446d5c8453863f06a05c808095e789c60402edc8db59ee3f13d361537cb65c6c89b218e5580a8fbaf9734e9dc71c26a996d780809ce5fd9ed40a024d3ae5019faae01f3e7ae5e978ae0f6a4344976c414b617146f7e76d9c6020c52101038c6d9ccd2f949909115d5321a26e98018b4679138a0a2c06378cf27c8fdbacfd82214a59c99d9251fa00126d353f9cf502a80d8993a6c223e3c802a40ab405555637f495903d3ba558312881e586d452e6e95826d8e128345f6c0a8f9f350e8c04ef50cf34afa3a9ec19c457143496f8cf7045ed869b581f9efa2f1d65e30f1cec5272b00e9c61a34bdd3c78cf82ae8ef4df3132f70861391069b9c255cd0875496ee376e033ee44f8a2d5605a19c88c07f354483a4144f1116143bb212f02fafb5ef7190ce928d2ab32601de56eb944b76935138ca496a345b89b54526a0265614d7932ac0b99289b75b2e18eb4f2918de8cb419bf19d916569b8f90e450bb5bc0da806b7081ecf36da21737ec52379a143632ef483633059741002ee520807713c344b38f710b904c806cf93d3f604111e6565de5f4a64e9d7ea5c24140965684e03cefcb9064ecefb46b82bb5589a6b9baac1800bed502bbc6636ad92026f57fdf2839f36726b0d69615a03b35bb182ec1ef1dcd790a259127a65208e08ea0dd55c8f8cd993c32458562638cf1fb09f77aa7f40e3fecc432f16b2396d0cb7239f7e9f5600bdface5d5f5c0285a9dca1096bd033c4ccf9ceebe063c01e0ec6e2d551189a3d70ae6214a22cd79322de7710ac834c98955d93a5aeed21f900792a98210a1a4a44a17901de0d93e20863a04903e2e77eb119b31c9971653f070ddec02bd08a577bf132323ccf763d6bfc615f1a35802877c6703b70ab7216089a3d5f9b9eacb55ba430484155cb195f736d6c094528b29d3e01032fe61c2c07da6618cf5edad594056db4f6db44adb47721616c4c70e770661634d436e6e90cbcdfdb44603948338401a6ba60c64ca6b51bbf493ecd99ccddd92e6cad20160b0b983744f90cdc4260f60b0776af7c9e664eeb5394ee1182fb6881026271db0a9aad0764782ba106074a0576239681ecae941a9ef56b7b6dda7dbf08ecafac08ab8302d52ee495e4403f2c8b9b18d53ac3863e22d4181688f2bda37943afbf04a436302498f2298b50761eb6e1f43f6354bdc79671b9e97fa239f77924683904e0cf6b1351d4535393a9352d27b007dfda7a8ae8b767e2b5241313d7b5daf20523a80dd6cc9c049da66a5d23f76c132a85d772c45b4c10f2032f58b90c862f09f625cbd18c91a37bb3fc3a413a2e081618da845910cf5b2e6bffea555e883b0bb9c5f9063380a1c33ebdb764d9ffefe9e3169de40b18eeb9bfca48296457bb0b4e29d7b2b5bc4e0021ba0a1d389f77a8e253d6db149d400f675a9330f3bcfd09c7169224a947b6b4e0745ae08cd7adea4151277a94f51f85292ba082cf28300cca233ff4966b093c9cb6abcef476026040fec2b435021aff717b8bb90a40950e010f70bb416a618dc3c5c03f590c5b7ec8e0c05b85ba94078de4817918f783022364b8aa228b5df43b38fba3060c30616f265022584ab6034ddbc832450f90047d0cf41a4af8a20fb1aa66406133a17c2e905ee28d8acd186c872859c196db0474dfaaaded2d63768143cf6b5e2e34662f7bae573a08cb15069ef881892e5a0c08b5c6c7b2e6376cd2080fb29e8d3d5aa5b853662b4f1784ba7f072130e4dc00cba3cc9278fc4213f2ce2fc82bd1ea9fa91bb17b4f7c36962c78d864eab9f30ef327039da6607962a156a05c384a4a58ddd8f51a0d4fe91f64ae7b0a5199110a66f1e676392ec8d31b20a65f7a7fcff90b37a8a3962bff0c83ee6033a70c5b0af663ca48a8f22ced255839444fc51f5b6a6c1237eda5804289aa25fc93f14d0d4a63cecfa30d213eb3b2497af4a22396cc8c0e7c8b8bb57be8878bfc7fb29c038d39cf9fe0c964ebac13354a580527b1dbaced58500a292eb5f7cdafc772860f8d5c324a7079de9e0c1382228effaf2ac0278ebedad1117c5edacf08105a3f0905bca6e59cdf9fd074e1fbb53628a3d9bf3b7be28b33747438a12ae4fed62d035aa49965912839e41d35206a87fff7f79c686584cc23f38277db146dc4bebd0e612edf8b031021e88d1134188cde11bb6ea30883e6a0b0cc38ababe1eb55bf06f26955f25c25c93f40c77f27423131a7769719b09225723dd5283192f74c8a050829fc6fdec46e708111c2bcb1f562a00e831c804fad7a1f74a9be75a7e1720a552f8bd135b6d2b8e8e2a7712b562c33ec9e1030224c0cfc7a6f3b5dc2e6bd02a98d25c73b3a168daa768b70b8aef5bd12f362a89725571c4a82a06d55b22e071a30e15b006a8ea03012d2bb9a7c6a90b7fbd012efbb1c4fa4f35b2a2a2e4f0d54c4e125084208e096cdee54b2763c0f6fbd1f4f341d8829a2d551bfb889e30ca3af81b2fbecc10d0f106845b73475ec5033baab1bad777c23fa55704ba14e01d228597339f3ba6b6caaaa53a8c701b513c4272ff617494277baf9cdea37870ce0d3c03203f93a4ce87b63c577a9d41a7ccbf1c9d0bcdecd8b72a71e9b911b014e172ff24bc63ba064f6fde212df25c40e88257c92f8bc35c4139f058748b00fa511755d9ae5a7b2b2bdf7cdca13b3171ca85a0a1f75c3cae1983c7da7c748076a1c0d2669e7b2e6b71913677af2bc1a21f1c7c436509514320e248015798a050b2cbb1b076cd5eb72cc336d2aad290f959dc6636a050b0811933b01ea25ec006688da1b7e8b4bb963fbe8bc06b5f716a96b15e22be7f8b99b8feba54ac74f080b799ea3a7599daa723067bf837ca32d8921b7584b17d708971fb21cbb8a2808c7da811cff4967363fe7748f0f8378b7c14dd7a5bd10055c78ccb8b8e8b88206317f35dcad0cb2951e5eb7697d484c63764483f7bbc0ad3ca41630fc76a44006e310249d8a73d7f9ca7ce648b5602b331afb584a3e1db1ec9f2a1fc1d030650557c7dbc62008235911677709dea7b60c8d400c9da16b4b0a988b25e5cf26c00c3ef02812def049bb149ea635280e5b339db1035b7275e154b587cc50464a4c0bfd15c79f54faa10fbe571b73cf1aa4a20746b11c80c8c95899521fe5f0bb3104b0a050c55a79511e202fee30c005339694b18f4e18ab5e36ea21952a01864a0e067d9f19362e009a21c6c1a798f7c1325edd95e98fd1f9cb544909fdf9d076070d1233e183fb6d46a46fbc6e10452ef4c45fa0b88a84962ad6e91cbcc52bc000b12a82e93ae5998b20ee9000a8ef68ec8a44862cc108869fd388142692be6b0657e3fe79eff0e8b72f63aeec5874acf5fb0bfc9fa22645ed6ecaaf186eca690ecdf8a71b8f4789ac41b1f4f7539e04c53dd05e67488ea5849bf069d4eefc040273f6018819fdcbaa170c2ce078062b7bbe951d2214b077c4c836db85e1b138059c382ab408a65a3b94132136945cc4a3974c0f96d88eaa1b07cce02dce04ea0126e6210a9543129bb8296839949f6c3867243d4b0e1ff32be58c188ba905d40e32c53f7871920967210de94f71709f73e826036b4e3fa3e42c23f2912f4ea50557dff78aeb34cb35444965614812cbe14068a62be075fce6bf3310b9e8b12e0dd8379104360f728d47a327c172257134e2c0e7c32e01321f4d636f9047bd750e7993eeda7d39fc16f29696b1becee4d8026e967f8149935b947fce8517b2ce02b7831a232f3a29010129c49494ed2b84c7f881b7e4b02a00ebabf5a36023c404002d6cb88cee76c8ce97b03143ca867359d7e118d54e053b02c94998e6fd8409f8d46fc1741a2e56aebb1e7dab7ca3296a2566263d9be2f4bbef4872a49ee1082cbaf86e21b0c232c4182fc660f0c0b6aaeb0393750e553bc406e2a27842bd033da45a562ed1998ef9bd83e35ed813bef00a3e6147cb363bee63c543ba5e770b043dbacc155214a2496f91879bbc9170a2a513d7b48fad40c8c2d96f951e3a0932f6d12956789198430b352803852aa9726163fbe839979b33f8dbf7f76cd50755c1ce0c40a072aeec35057d06abaf59e878000b1d796e51908bfbf23b13900dcb30f9bd52b52994e7245a7017653a404a70d1c444b8c613ff10a2b057c02d062c5faf13cdc4445809fb6e096923cdbbdca18f59318ff86c7e449f596050b404d3cde0338dfdf9b1389178b1d4c70eefa2bbd76fefc1ee1f1688ef507821e40ae31d8d8e673d183b54563e2cbd27e0e042f61b046877d37a68c1b5784830690f2dd4ebbbd2dbdb35800b9e0ba8ea985fa106dd2ce8493e845586716c538ee9008b88a7c482f3c00c14c08468230d40cdc040e145282c4d61985cb5800306e305146204f63e96ad194bcdf1338ab8480341b6fbccf18fc32145f84bece4069c09e41096e94c24fa4f0db988e860a3bff3604143f2b17e8c219f28189e4cd49a0e506fe62dc419299bcd78c6ccb107f63eb31b4bd8ea1e2fed10e3ac17341d3505019e2376b01f7a7fcea3db110fb090c681c866ac86f13e6f8d44a32861e0580def063736b5c771b2b3b9067045867b4393f3eb2a4610bd0216e29906aaac370986451c6bf78264dda7e7a5fcbcf7bd6e024ff6003c6db780d89b97765cee8d0ff3ff25d94d4b4b919f722b26a6903a017daa62af387843087680c57952de06064de05b662af87be49b6e34cf0991cec7be3396e2eec9678ba259bd8de1c192014d02928f9113488215658df4078ed661fa4e79e58decaeb0ee5a00488b094b0b77f083b2b7844f481e7788ffe8004b96ccdf853532bfd9632a8a652c2d97d10173c90864fbb6facf47fae415df4acc0b099140a657b35d083d74dbdfbf107303e74c64471bed4b2199f2babcb4e1fc593d6f309e21f85e68ffd9904731559d0f2b673b36d3984e5d66d897dfa17d601edef3ed78cb70dc5115d4ae240c203e031263f0cf1e98075bac0361fde24cbcb852b8055d53ae01d61a0a1e1ba423d00833747e7364df7ebfd1f84598d801c249e1805279dc37d39fc7f7e27b067e4e0287aec432ed49e4d701a0ff377e88179968430d110cb20476ed4c6bf1624d1907ef24406d3295fcacde2a102cc85f4f3d0cb87a8fae7535a06e442833e58cfc04242ff85fb654d05f9874c0a6756f542db4e9d8b0366191fbb8b09a1bbcb6af04c069978417ca80d92f442b7dbd092f74e1268aa73b54e4b64e84543449ecd30b5ea392a1669a5f441d7208925e91c75df611cd26042630c6b98f160b8c0156048108d5465b71bbc54d31a9f90e34428d97590a427e1ae618d4a35fc1022d4e007c6108dcb1672b88d43ae4d886a5adcc26faf56bc5e5a0b08342fb88263fd80940d1edf794c6ad6d339b974e164b38439e11b4fa87cc793b080b4f8bf0eb56043f79ed3911da21092475fcf8320b55b9f558f194c6c8121b2e696039340d97057be2583726d762b5ae4327e5286a2d8c14ddbe0027c75aacbf7e9de13037390df7d72e13b46bc06bad0363b070e0174d034120d7fa7b4550e7dc28f7f0241f059ae266fc13dccd1d07f744208a7d6a2e565b6613d46e4550f79ef3209c46a805b97284df558719e131f44e419e690f4fc28ee4862b9d1f8f7e1a164ac18141076087693e70ac76a10f7851530d4cbc65def90d5544671ad64249569c3abf0200d09be3c63efaa7cb723b39ccffc9b3a3ba0c8426847123d2a881efbd4937a40cb3e8011c70ba427f80b3dc91a608086f8b61f8bd86fcb482ea388299a7cfbd00a3ddfadb4b6d0e51c1369276c25889a9f3592900b6502d9af1c732e1fb7db307d71e45deb1553ba1568d0480ea9e132b52564da6ac5c56eff823e7f37976cd075ce8f7a78aaef1b87f7437a0b84035677f266f7d0596e493101fec3e14fcf80b22322454587b51fda0636231c07d4e63e007f1b89137d8a37b03bf00f3a7c10169f757d9a74b7bffba797c746e3845decc3d0559d7cf6f08f3bd67dac5f33109b212582dc7df5d561ad63dddc794f2aea4e493db1a73c702d258c9b922c35d04c47f88f87c54c821a29f04abd91a079ce8cef252a21dc72d409fd1618c9be709af029ba98b0140e74666fcb01bced4f88ab68e6b63b8ed6febc0905d22cb2200493c071ce136833697406f8a04e77b21747dda997046cf3c7080096fe481790d77cf5904e7f7128ed95a6e576d109fdf10eb0c888db35a4a685b62253987b70fb1538e6c0932889460fa31c60d123266b7bcb828f846a35b2851127679b05f05a75266529c343a6075e54c455e02b2c83e6f7bf1ae23326506a5f532472d780815c5af425f7d8b543a8f014966e0538f48ca84d181695381a09701eb65c9ae084bf2a4dc84f1b2071be32be25d5f4fcdc59668fd800496ef7eb6dddf867ab908e543cb51f0451706cce4be6b9f68a537a79ea88e17fcd78965b3da68c0d9d30623a2a9e275e1c320f59e118e09c02eee527167bc06f7693e7b584e3b25ecc1093d46b80a1cacced87c2b32e2f90c5bbb9cd1b701aae69a04b16d535fac6eab0d091790fc5fdfa8a8842bfcb62dbf963cbf62c4afb4c468be98c770e6078b8c0a8cfcbae43dcfff17d3c6d587c3e4309fd39c66acd14781fea66fc57278b02302c0fa386280e67acff19955b6a428b0e22ceb1e54e913a37cd19eb6e9d2268a039f2b5fdda7d5804db79385f0e50082b128c952f8dfdedc4411d0675d95127f0bfc01710a869b10d7a8b9e632dad944062567439e6d192fb09329d058e87ecd0aa8981328f541e87ed02cfe4031f2d3a046ff517a2a80486b04ade31a647aec0884fb96ed753ffc47892431c6e6f08fd1c633a1a44e882d3d8b92c567e0fb8305327a354851464ca0f18d89c6ee2a91a4afef0c55883acf8fcb68c2c3b7402e005d8affc19c13f1f26fee0698dff181ab22cb84a2b31e0a6a81dc5d02e60a3c07090397ae58a985526b2ad6ee5725e82328062b68566b4871705ce3b9856e550d068c20fd9aaeb27740c07aad53d79fc20e46e40e7103e2d69626ee64b6aa600f6f1a86f37948ff4990d88f43c34994e2fe586cb779997be323da53329c10480aeb08fe440e9e4b979171371c73b94da9f928a3f6c8f6792f782f3d6432b86d06f54557327fef31fd6ae0a3f6d2f16c9ad947d132e14def33fa24cb4565370e0832fa50f5f5f93c9f3d65776cc22608b68a4f3719e9be47a19432991e4a2c49089c0ea20e7f7c73feaa47970da424d8543d80d622e2f2be9f4c65cc39dc369009a9d41a52bdea7cc0e8e04da87a633fd4f814fda1b646121a469ba0b5b8006d0e9118761d97b5d1856e2d690f27a81c42b176df853d07cf4a66ee83c9eb24ac0a382f5143a10a33ec3ddf17dcd8a8303fac8f279d31b4d04d74bd8804cefbb400c86174ad444e43ed33ee1e1e73f660b9814d5ca3cb1d650f1978a825a617bb05f84eab3b9b8359b991e1084cf4e8179ecb67f92398638e31227ff63427b67f0f232b454a341d85d4b56e31135c9035e231f7d9318ca12b5ab524f87bb0ca9b04b80effed202897ab016d5acc054c4fe62a5f0192f136cf2cd714998a4b164b0c2cdbace52243fdc9ea879b0d247d4fe8bd80481fad6b325cb5f2cfa2534dec0e47d41b6b99352e6e5faccb5ee28ca2fe96e04f9c83a0461ba34cfb499d864f05dc734b6c8f51cc0c994290b2a868cb8312df39fb6d457a81e62d872c65d4f3007094be42663bca3d64ebbcc8401158fce4f5a38a49c20f029c338f126451820459866e77c6984a467aad571cc7452392a9cb9f8e65099fff2f2acd170a833e01ed3d22a683356ee42dcbe6bab6d05d3edda2d40e9ba53884d430c2e0cd87c0067dc8cb68c868bd9f29db1dd73703c139ffc15e4f7264e727c70560ae02da100871f30e8a7c1275805f621752d73aafecddc2a7808b6c2ecbb8d0134a644bb603f30f8d18b3fc5efaa7f206ce180bfb14f5dbd3b0115145a227113eeaf1c1ec04244227b931388e72960833a40baa4319c5cf74aa94f7e3233e1d09f0a4f74409999684ad1cc836ac74563c85b164664dfab08ea084b25e2cbd7e7b94a781a10fcd455ee38b65126dcc52016127fd195c80b05660ed931e128b0cb92868955c0d032ada9fb951210a5442d21c1718ebc4702ad4a57967e15a63ffb05e1e072a0c41ebdf1e7205373eeaf4587f695de887fa3a8c96b8deb99e040fa1fc4dc2a402a017891943d734ae2f3798b22b1269d3d9f6d65581b9c637a6896a4fb554810bbd3db5c5737391a74150b43413b2e3824490b7911cbeb845147f1a8521620b0dd31306f13a9754a01bcdbd18bfdeade06b0ec97f48df56c45d3670a1fe18d00ef13e613c8a77aeb40401a814b377137cf44f29cb2cb94186ad1161ecb05a7c07837a5ab3474e57990cff2ab16b4d99f62e646da28e8bb712a5b561cf0e25be039c3e08583c8ebc3dd2fdb8fdc6e135ecc7851c73218a70b75e697cc84ea50504b9c34a33ed52f87230b9d192a940f3b7bb6d45b58dbf52f0afeb8dac85c77b06bdf9b70a10cb81c50055c9d8cf7e3a5c4b7dfae55beabcb3e8a8a1cb822d8d0bf6c01e32056929f853021eae6c97fdb0c5031df6b2e7c57f1318866769a9cc09c38ed62d8bf4663334c0df67c47236ed73f6ce7f54e0ada9270398c1aa558d0f993b0d25d97aea77b1635ee4832362cd590bae5fc1549402ddcd42b15efc930111a01535c0242116078d6d2d53b8612d378c4370e90d0d01b01bd7da591bec07981652a98485d8ed5c8f3def2bdac7d992ee5fc6a1ec7bd36940e1bc58c7050451248fc3ee6069e6b1b0d3ef122c6ef2a9b99aa0f145fb43341c58dbb472130b51730c956273a3ef6df9e000f6a87c2bacdefcdb5daef28b6170f61bc3a9c101f439755c86e6b85ee06a7a60688b3843eb359cd4acd9221a2ee131e2fd2e190652e5c47c0b98c41010eb99a991ec48a5de99cc8f403d6d76f8307d6657c1e007ebd64eec7bbd0d4f1ba2db7bb0efe27c7828f053e00def775943ab01a7e33d0fffcfe6f9a7285237f2c381b638758e373f8ceac672190664bb25fb5d355c240bd1773d61bda7f7ef1f4261b80ff5058ec6f7e024ab9459b1103815624b81f80c39db2f6fecb72de452b11636b0f71b16cb55f883d93bebb94328f13ef1ab6d0df449e32d27884f5139af584035547dace65ee25ba05cc461e74760d4468af90dcaa982e52cb902e2b84b3324019da575601ca54e91655913892e703257deaa01d14fd8459ff780c724161ba4d4280b70a5039dcfb5d775560714009724cb0d0b7e178c71e777b896bcfcde7d4c9c3dc6ab819d74a1a1fda8486448b1ad79be02fb134ea93a8600f1bc2a42e68d0213ab461a07cef3ad3965bc130beb76bab409102f82bf6c4cd626f6df3388e17b87584310c50832cde3191f6557f0014bdc0a68d924119e43111043bc6f26d16a5f2612dae6ab24984e2d87a71d93d5f4670dba2176d4f16633407bf7c10b51b6842dfdbc6fe3eaa4b6a12f0550700ece070ca382dec3b587e0e1fc317a48a83754d15aaf9a6971b8cb641fd8b32846d89002e6301700a0e7056e8002d8f269d29ebaf64f4493b1f1e676fc78e673067fb00625df15dc0490235b386ee14e55b335f3bc6dcedd7d3a80fd3a6e9bc2ccf3af0d89be71b5ca92bd7a9b97b9ff8976f75702419aa5bf9be34600496ca1bfa8ad0400602a23579365574252434f2bcd7efb360b0e8a495e8f7e78923b6fbf2207049e9179f0d4d7d6b4a4a10ca10f0ef4dd6cb5a74f7574e832044d6120fbc1580a68eddfbc65ab300bed960a6f24a102dc36b72937a8be4385daf5946e81ccde0619251babbff17e5685217a134d22f6130d0322483b3475227ffd27adc73ca202a6debfa37e5731747f4449ac70a33684f460eede65918c6d89acf4b50fd28d040ffbd436a944d3be0210606bfc2301e7ac66d462dba29a0489eb55af714a760e5302592cccc726e535b945ceb6126eb84e31f0f140ff54df8be0fa3a22f418036ad996787a5616a97a42049ebce351dc11857cab3dc914ef26833b0e75653004a8cafea099fb0750135255c41ef43e2f29c75714e2f0be2545e7c109b70c43004a471daa85b47befc65907d033f133b2f3ac2ad568df630ee80506610b8dc9052d442668dc06b13ea76ab1ab7b34870341d660af5d3007c21bb72512e4f8a60d8916a037b93f9e15ac9e4a6a1246d73ebb40e5fdd5a0d6dc0cf175023b891301f69fe5a3ca6f12cb8312d16333de1cd3ebb99339ab18c0715bfcd35b8365b407ad759e2c591d8270ad335381573e27ec18af7ca157b4a2bbca921db083d9b0009dc332a79dde14354a8c18bce76a1bfc1a25a1e702ccaa0feb521ee9279b8a01ceab6e237bbe4128b23cb53b1e5185f3266e20670a307ea0cfb5377025e0bb0790d48f1636c8b836c1a1f69ad61265f19057197e86cd526da6ddb94fd1ece80b60852f27ef2ce56ccb5a32d8cab6d16be06f380dfde3602ea4c1ae927173b2001ff0d9e29bc66b2b2a20c3e3ac174fcba187aacab0876c1356d30d4021e6dd0048c3bdfbf254108bb09d3ca9f2be423a92408bca52fbcd68f972c46fc8d20e0350d12c2f2d6c7da85e96bcec3ce61119793d44a210f81ece859fef6360ae3b0e1af0634fc141a8b50b3b383fb264e8a4fb84ea06db6becbf5e140edf66ee190da8968da579eb349fedea45e4c252a79570501278bab5fa984d7b1179d7c2460faa7beafee153bbae0a591701632aa94839528d3ef50cf809c1f7209b9e5c99010eaff7f921c45b6546358ee7a90948e3c710cd3e1796860839a345516fdf4f07c415029627abe1273a1f510c36a662562d18169b23305b4efadfefbfbb41a400ab533e61c14cafa49bc5d2818058ee4f3e1aeb329e150820d1de1f1eaaad31051a6dfdd3a1d5cec7b16bc0ea2c649d409917faa42138b1f824b4d534a050be0a99ea6772daf0b2e58623cc7a250ef37599bd556508f08886e663ef0917ecd3077072c3268ea5b9b89cbb6b761ee9f9c4765d8b267d9eb19728a28ce67a42ed0cad142b5dc0fc5313853860ec3f0ee2bc3d47cbe12dbe9633db809967d5b8bf0e45574eac657059530c30aeeade1e4f858a4a6e79d6e441b4af0127a13340d908d48cfec849ee93d53b1564231f048d34885e791a9d40c61a7b00f12f6f72a5050bcaabcc98480170ea6e20bef6b5c6f504c808108454fe2f3c275bf8f89a5e0a3304a7c4787e6d4fbe569930f7cfd38ab7d1d2ebd599bbb411950cec3e53b90cefb82234990d353c71ce4c21ef674a1c4070f71c90e1ea7edf35f5a421118f01b49a92ea97720e2d4df6b5885c181002656629a90eaa1904fe1c379b8291480ca15d0dc2b65a20c22f1e01d612d21ecb5738e5ebfc578a4a65066ee6e913e3030d3fdfb0168fd75022492728ee82869deb9ff2827f4e10759ecddb20f67e9808e707257a74d3dc0a6068f264066f95c9f772a3dcec0b4f0a327e3745517ad60ccbc5392890d2479b724d068fcdb83607e02291c06e1a5a1dac7604889cce2500f418da2f7080a7e9a1bdf28b87028a2bbb0c14f059f10f46d46716eac2cdfc06676cbec91b8c2c0f7c9bea7e27fa5048662398b23a9b488a49e1d3330c04e60179a4492c8b836780899899d2af17e6119a94d54a890ce8c0b550e87fd54cba0821fa7c48f6e09a60dcbddf853f82b47195aa44a5ceae14a9257296acd711c8073ff3345befca5d3ebf64901b283df96395fe9785d7090176bfe5a9f13ceae701c6c93af0e13d949bc3c7e9b06674a73e7affc508302258a27fb34569c3742201c0721aef282a31c69a5d98a67ac5c3d920d50c089896f7f8c8c237a81f803f0444f417246d695e89a3a523b62a3cd2203d42607cac7c7782dec1f9edbb806c0a7a37d1a969082a126bc726151a50233456a07d374399e74aaa8cc66821511d092615950d302e815cfcc021e1250cdea20fd9e1e4b5e88280d6e4283b918e780d12cbba59ef2ed2ce86135a48fba6c0dc2bf2efee190d9a3f9aa22a622b1953058f2bb3a371637d13e045d54e7eb54c0d25851f49283d7d34e9785d2d5c3f70086c48a8325a2083bdf5b3531fcc697cc0c9f63892a866c84585d673a2a63fd60e77995bfb0c0a44a4b63c0ff67e813027d3e84cddd393a0f4e6bc95525c5ae20eed9d0cea4a12aa748eb5209cfd75990b055f1ad0472f9f7599f569a8743a720755aa11555df4bb2e725fa93bc5dea603a964e8dc9fb1742e81825022866fc50a6b2a19b6a234a38ee27a74f2f5832b294143ca7ff8d07fd7d4e01f479e9792058871d90ee3aaa3329e82cebe41dff5e6d00a36268a7965466b80c6510ac1350cee797e1d6737f6aaff155266d2a2d611b2124affed1ac73a6a06515627b2230ce0d7fed33ecbde511f4d472cbc556cc8d9c5640e67657035112976b626847a0a4ea5fdd14d4a3eed57f0dfbe153393d8bd28c8b4f9e62940e8379790393fa20c617050c780a7d870193b4611bd7a12d26947a3cf4605e225da8b1646a76984015a5e317016a4d8301eaeec0db3ae0daa719182e2f4479154dbcccfcce1f365099de6c91934c395ce82abba8062a51d7773b418330921766cd3d275c689098e06039698db6f09accb292e7eb79e7a022d4257bb2f9ed993c519860919bc229a06ad88954c9ebf7f5b9fe95cf56e8181cb9175dac06be0be70fd28df20cdb4600ef0869668c645c9ea01360fdae7c922cb3d2b3583ae1de5ae7d899a83ff2bb00d7365c782a0fccfcba7f87bb29416469bb051f9b0755123e0f2fa76dc7644b70e452f49a84bc372b384c843b8161b7f9b63699adcadd5cb2b33b36c7eb3e1b00f25218bc16447968b939016242fceaebd796c17a24d1b9870991a9c3ae90e380302b7bb320adacc08cfb9249d29cd9275c52476dac6a7e9870ee3776cbc3352036f9c8f681d44856c6c5f90b7cde0877472ddd48719c449f59dca1f49442f7505e4809c6d323b37530ecccf3e41e19822f53d64dc90efb113405ee88799c37f0a342293b5bfc019a9057138326de6107b5613554dffc737aed7237fb16cd77e09f581d12220ac930c6ca279efd1d07a92125fb2606ec3ec35351987a15fc72806cfb3cb66fce8dcfabee5c1e586bf0f802fa12ae5ad5a708e3a5d54e1926dbd0202bf1150f1bb612b9a4590b5b520b86a90860ec3d9c2184f9975ced15ae1300882d9918021b43a1184ba88ddd7091539fe5a7017b8708d0f5c916f9c42de5103f8116863864b508f5880ca60b7492385c16a02b6ceb64d257a4838873b85d2041517c5c7c4508e4d5a5faa72729d73af0361e11828eeca992b8f20d903a5ef065976a9f322e34bd4b3984bb09e18be40e77e833c8c1a2e80093227d3f40d4a067f5e3aee9fce9bd234bb6ff4d0c34fc060d23e86b1f5a6d8d052e53e913182052a2d9c5e97bb0e0a51bb2fafbe7346bacfcbadb00ce2ba129f29d41a11f7d105cf19bb60b5f5b0dfd6a894698ef7f56a02d69cc03eb62a56563d3a77e3ac2302", + "as_json": "", + "block_height": 993442, + "block_timestamp": 1457749396, + "confirmations": 2201720, + "double_spend_seen": false, + "in_pool": false, + "output_indices": [198769,418598,176616,50345,509], + "prunable_as_hex": "", + "prunable_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "pruned_as_hex": "", + "tx_hash": "d6e48158472848e6687173a91ae6eebfa3e1d778e65252ee99d7515d63090408" + }], + "txs_as_hex": ["0100940102ffc7afa02501b3056ebee1b651a8da723462b4891d471b990ddc226049a0866d3029b8e2f75b70120280a0b6cef785020190dd0a200bd02b70ee707441a8863c5279b4e4d9f376dc97a140b1e5bc7d72bc5080690280c0caf384a30201d0b12b751e8f6e2e31316110fa6631bf2eb02e88ac8d778ec70d42b24ef54843fd75d90280d0dbc3f40201c498358287895f16b62a000a3f2fd8fb2e70d8e376858fb9ba7d9937d3a076e36311bb0280f092cbdd0801e5a230c6250d5835877b735c71d41587082309bf593d06a78def1b4ec57355a37838b5028080bfb59dd20d01c36c6dd3a9826658642ba4d1d586366f2782c0768c7e9fb93f32e8fdfab18c0228ed0280d0b8e1981a01bfb0158a530682f78754ab5b1b81b15891b2c7a22d4d7a929a5b51c066ffd73ac360230280f092cbdd0801f9a330a1217984cc5d31bf0e76ed4f8e3d4115f470824bc214fa84929fcede137173a60280e0bcefa75701f3910e3a8b3c031e15573f7a69db9f8dda3b3f960253099d8f844169212f2de772f6ff0280d0b8e1981a01adc1157920f2c72d6140afd4b858da3f41d07fc1655f2ebe593d32f96d5335d11711ee0280d0dbc3f40201ca8635a1373fa829f58e8f46d72c8e52aa1ce53fa1d798284ed08b44849e2e9ad79b620280a094a58d1d01faf729e5ab208fa809dd2efc6f0b74d3e7eff2a66c689a3b5c31c33c8a14e2359ac484028080e983b1de1601eced0182c8d37d77ce439824ddb3c8ff7bd60642181e183c409545c9d6f9c36683908f028080d194b57401ead50b3eefebb5303e14a5087de37ad1799a4592cf0e897eafb46d9b57257b5732949e0280a094a58d1d01d3882a1e949b2d1b6fc1fd5e44df95bae9068b090677d76b6c307188da44dd4e343cef028090cad2c60e0196c73a74a60fc4ce3a7b14d1abdf7a0c70a9efb490a9de6ec6208a846f8282d878132b028080bb8b939b4401c03dbcbfd9fb02e181d99c0093e53aceecf42bf6ccc0ec611a5093fe6f2b2738a07f0280f092cbdd0801b98d30c27f297ae4cb89fb7bb29ed11adff17db9b71d39edf736172892784897488c5d0280d0dbc3f40201da9a353d39555c27a2d620bf69136e4c665aaa19557d6fc0255cbb67ec69bf2403b63e0280b09dc2df0101f8820caab7a5e736f5445b5624837de46e9ef906cb538f7c860f688a7f7d155e19e0ac0280808d93f5d77101b544e62708eb27ff140b58c521e4a90acab5eca36f1ce9516a6318306f7d48beddbc0280a0b6cef7850201abdd0a5453712326722427f66b865e67f8cdb7188001aaacb70f1a018403d3289fcb130280c0caf384a30201a2b32b2cfb06b7022668b2cd5b8263a162511c03154b259ce91c6c97270e4c19efe4710280c0caf384a302018db32bda81bfbe5f9cdf94b20047d12a7fb5f097a83099fafdfedc03397826fb4d18d50280c0fc82aa0201b2e60b825e8c0360b4b44f4fe0a30f4d2f18c80d5bbb7bfc5ddf671f27b6867461c51d028080e983b1de1601b2eb0156dd7ab6dcb0970d4a5dbcb4e04281c1db350198e31893cec9b9d77863fedaf60280e08d84ddcb0101e0960fe3cafedb154111449c5112fc1d9e065222ed0243de3207c3e6f974941a66f177028080df9ad7949f01019815c8c5032f2c28e7e6c9f9c70f6fccdece659d8df53e54ad99a0f7fa5d831cf762028090dfc04a01b4fb123d97504b9d832f7041c4d1db1cda3b7a6d307194aff104ec6b711cced2b005e2028080dd9da41701bef1179c9a459e75a0c4cf4aff1a81f31f477bd682e28a155231da1a1aa7a25ef219910280d88ee16f01facd0f043485225a1e708aa89d71f951bc092724b53942a67a35b2315bfeac4e8af0eb0280d0dbc3f40201c4e634d6e1f3a1b232ef130d4a5417379c4fcc9d078f71899f0617cec8b1e72a1844b60280f092cbdd0801f6b9300c8c94a337fefc1c19f12dee0f2551a09ee0aaa954d1762c93fec8dadae2146c0280c0f9decfae0101ce8d09f26c90144257b5462791487fd1b017eb283268b1c86c859c4194bf1a987c62bf0280c0caf384a30201cead2bbb01653d0d7ff8a42958040814c3cbf228ebb772e03956b367bace3b684b9b7f0280a0e5b9c2910101c1b40c1796904ac003f7a6dd72b4845625e99ba12bdd003e65b2dd2760a4e460821178028080e983b1de160186e9013f55160cd9166756ea8e2c9af065dcdfb16a684e9376c909d18b65fd5306f9690280a0e5b9c2910101aeb70c4433f95ff4cdc4aa54a1ede9ae725cec06350db5d3056815486e761e381ae4d00280c0a8ca9a3a01ebe2139bd558b63ebb9f4d12aca270159ccf565e9cffaadd717ce200db779f202b106f0280d0dbc3f40201b9963568acf599958be4e72f71c3446332a39c815876c185198fa2dcf13877eba3627b0280c0f4c198af0b01bccc01408cbb5a210ad152bd6138639673a6161efd2f85be310b477ae14891870985f90280a0b6cef7850201cadd0a82e7950f5d9e62d14d0f7c6af84002ea9822cdeefabbb866b7a5776c6436636b028080d287e2bc2d01d888013a7146b96a7abc5ce5249b7981fb54250eef751964ff00530915084479b5d6ba028080d287e2bc2d018c8901d8cc1933366dceb49416b2f48fd2ce297cfd8da8baadc7f63856c46130368fca0280a0b787e90501b6d242f93a6570ad920332a354b14ad93b37c0f3815bb5fa2dcc7ca5e334256bd165320280a0e5b9c2910101a3ac0c4ed5ebf0c11285c351ddfd0bb52bd225ee0f8a319025dc416a5e2ba8e84186680280c0f9decfae0101f18709daddc52dccb6e1527ac83da15e19c2272206ee0b2ac37ac478b4dd3e6bcac5dc0280f8cce2840201b7c80bc872a1e1323d61342a2a7ac480b4b061163811497e08698057a8774493a1abe50280e0bcefa75701f38b0e532d34791916b1f56c3f008b2231de5cc62bd1ec898c62d19fb1ec716d467ae20280c0fc82aa0201d6da0b7de4dc001430473852620e13e5931960c55ab6ebeff574fbddea995cbc9d7c010280c0f4c198af0b01edca017ec6af4ece2622edaf9914cfb1cc6663639285256912d7d9d70e905120a6961c028090cad2c60e01cad43abcc63a192d53fe8269ecaf2d9ca3171c2172d85956fe44fcc1ac01efe4c610dd0280809aa6eaafe30101a92fccd2bcadfa42dcbd28d483d32abde14b377b72c4e6ef31a1f1e0ff6c2c9f452f0280a0b787e9050197d9420ce413f5321a785cd5bea4952e6c32acd0b733240a2ea2835747bb916a032da7028080d287e2bc2d01c48a01a3c4afcbbdac70524b27585c68ed1f8ea3858c1c392aeb7ada3432f3eed7cab10280f092cbdd0801abb130d362484a00ea63b2a250a8ae7cf8b904522638838a460653a3c37db1b76ff3de0280e08d84ddcb0101cc980fce5c2d8b34b3039e612adeb707f9ab397c75f76c1f0da8af92c64cd021976ff3028080dd9da4170198c217e4a7b63fd645bd27aa5afc6fae7db1e66896cece0d4b84ac76428268b5c213c30280a0b6cef7850201e3e20acab086a758c56372cf461e5339c09745ee510a785b540d68c7f62c35b8b6c5c10280a094a58d1d01ab842ac0ba57e87a3f204a56cbecca405419e4c896c817c5ced715d903a104a09735660280e0a596bb1101ade921f1ef2fe56c74320ceb1f6c52506d0b835808474b928ad6309398b42434d27f3d0280d0b8e1981a01dab515d684a324cff4b00753a9ef0868f308b8121cbc79077ede84d70cf6015ec989be0280c0ee8ed20b01f99c227da8d616ce3669517282902cdf1ef75e75a427385270d1a94197b93cf6620c15028080dd9da41701d2d0175c8494f151e585f01e80c303c84eea460b69874b773ba01d20f28a05916111a0028090dfc04a01a4f312c12a9f52a99f69e43979354446fd4e2ba5e2d5fb8aaa17cd25cdf591543149da0280d0dbc3f40201969c3510fbca0efa6d5b0c45dca32a5a91b10608594a58e5154d6a453493d4a0f10cf70280f8cce2840201ddcb0b76ca6a2df4544ea2d9634223becf72b6d6a176eae609d8a496ee7c0a45bec8240280e0bcefa7570180920e95d8d04f9f7a4b678497ded16da4caca0934fc019f582d8e1db1239920914d35028090cad2c60e01c2d43a30bbb2dcbb2b6c361dc49649a6cf733b29df5f6e7504b03a55ee707ed3db2c4e028080d287e2bc2d01c38801941b46cb00712de68cebc99945dc7b472b352c9a2e582a9217ea6d0b8c3f07590280e0a596bb1101b6eb219463e6e8aa6395eefc4e7d2d7d6484b5f684e7018fe56d3d6ddca82f4b89c5840280d0dbc3f40201db9535db1fb02f4a45c21eae26f5c40c01ab1bca304deac2fb08d2b3d9ac4f65fd10c60280a094a58d1d01948c2a413da2503eb92880f02f764c2133ed6f2951ae86e8c8c17d1e9e024ca4dc72320280c0ee8ed20b01869f22d3e106082527d6f0b052106a4850801fcd59d0b6ce61b237c2321111ed8bdf47028080d194b57401acd20b9c0e61b23698c4b4d47965a597284d409f71d7f16f4997bc04ba042d3cbe044d028090cad2c60e0194b83ac3b448f0bd45f069df6a80e49778c289edeb93b9f213039e53a828e685c270f90280a094a58d1d01bdfb2984b37167dce720d3972eaa50ba42ae1c73ce8e8bc15b5b420e55c9ae96e5ca8c028090dfc04a01abf3120595fbef2082079af5448c6d0d6491aa758576881c1839f4934fa5f6276b33810280e0a596bb1101f9ea2170a571f721540ec01ae22501138fa808045bb8d86b22b1be686b258b2cc999c5028088aca3cf02019cb60d1ffda55346c6612364a9f426a8b9942d9269bef1360f20b8f3ccf57e9996b5f70280e8eda1ba0101aff90c87588ff1bb510a30907357afbf6c3292892c2d9ff41e363889af32e70891cb9b028080d49ca7981201d65ee875df2a98544318a5f4e9aa70a799374b40cff820c132a388736b86ff6c7b7d0280c0caf384a30201dab52bbf532aa44298858b0a313d0f29953ea90efd3ac3421c674dbda79530e4a6b0060280f092cbdd0801c3ab30b0fc9f93dddc6c3e4d976e9c5e4cfee5bfd58415c96a3e7ec05a3172c29f223f0280a094a58d1d01a2812a3e0ec75af0330302c35c582d9a14c8e5f00a0bf84da22eec672c4926ca6fccb10280a094a58d1d01ca842a2b03a22e56f164bae94e43d1c353217c1a1048375731c0c47bb63216e1ef6c480280e08d84ddcb0101d68b0fb2d29505b3f25a8e36f17a2fde13bce41752ecec8c2042a7e1a7d65a0fd35cdf028090cad2c60e0199ce3afa0b62692f1b87324fd4904bf9ffd45ed169d1f5096634a3ba8602919681e5660280c0f9decfae010193ed081977c266b88f1c3cb7027c0216adb506f0e929ce650cd178b81645458c3af4c6028090cad2c60e01eec13a9cce0e6750904e5649907b0bdc6c6963f62fef41ef3932765418d933fc1cd97a0280c0ee8ed20b019ea8228d467474d1073d5c906acdec6ee799b71e16141930c9d66b7f181dbd7a6e924a028080bb8b939b4401c23d3cb4e840ad6766bb0fd6d2b81462f1e4828d2eae341ce3bd8d7ce38b036ac6fb028080e983b1de1601b9e601e3cf485fa441836d83d1f1be6d8611599eccc29f3af832b922e45ab1cd7f31d00280f092cbdd0801fc9e30fff408d7b0c5d88f662dddb5d06ff382baa06191102278e54a0030f7e3246e7c0280d88ee16f01bfcd0f96a24f27ac225278701c6b54df41c6aa511dd86ce682516fb1824ff104c572fb0280f092cbdd0801cbb430bd5f343e45c62efcd6e0f62e77ceb3c95ef945b0cff7002872ea350b5dfffef10280c0caf384a30201bfb22b14dccbba4582da488aef91b530395979f73fa83511e3b3bcb311221c6832b18d0280a0b6cef7850201c4dc0a31fb268316ab21229072833191b7a77b9832afea700a1b93f2e86fb31be9480f028090cad2c60e01cab63a313af96a15c06fcf1f1cf10b69eae50e2c1d005357df457768d384b7a35fa0bb0280d0dbc3f40201fe9835fffd89020879ec3ca02db3eadbb81b0c34a6d77f9d1031438d55fd9c33827db00280d0dbc3f40201d19b354a25ddf2641fc7e000f9306df1c6bf731bddfe9ab148713781bbfab4814ed87e0280e08d84ddcb0101ba960fec80e1dcda9fae2d63e14500354f191f287811f5503e269c9ec1ae56cef4cd110280a0b787e90501acde42b0bdfd00ab0518c8bd6938f0a6efab1b1762704e86c71a154f6d6378dd63ce840280e0bcefa75701b5900eedc2ce12618978351788e46fefe8b9b776510ec32add7423f649c613b9db853a028080e983b1de1601edeb01d68b226cd6b71903a812aa6a6f0799381cf6f70870810df560042cd732b26526028080f696a6b6880101ca18a91fd53d6370a95ca2e0700aabc3784e355afcafb25656c70d780de90e30be31028090cad2c60e0184c03adc307ee3753a20f8f687344aae487639ab12276b604b1f74789d47f1371cac6b0280c0fc82aa0201a2dc0b000aa40a7e3e44d0181aaa5cc64df6307cf119798797fbf82421e3b78a0aa2760280e8eda1ba0101daf20caa8a7c80b400f4dd189e4a00ef1074e26fcc186fed46f0d97814c464aa7561e20280c0f9decfae0101a18b092ee7d48a9fb88cefb22874e5a1ed7a1bf99cc06e93e55c7f75ca4bf38ad185a60280a094a58d1d01dff92904ef53b1415cdb435a1589c072a7e6bd8e69a31bf31153c3beb07ebf585aa838028080bfb59dd20d01916c9d21b580aed847f256b4f507f562858396a9d392adc92b7ed3585d78acf9b38b028080a2a9eae80101fab80b153098181e5fabf1056b4e88db7ce5ed875132e3b7d78ed3b6fc528edda921050280d88ee16f019fcf0fd5f4d68c9afe2e543c125963043024fe557e817c279dbd0602b158fe96ec4b6f0280e0bcefa75701d1910e44b59722c588c30a65b920fc72e0e58c5acc1535b4cad4fc889a89fccfa271510280d0dbc3f40201b78b358b066d485145ada1c39153caacf843fcd9c2f4681d226d210a9a9942109314d90280e0bcefa75701a88b0e5f100858379f9edbbfe92d8f3de825990af354e38edc3b0d246d8a62f01ab3220280d0dbc3f40201959135c6a904269f0bf29fbf8cef1f705dde8c7364ba4618ad9ee378b69a3d590af5680280e0a596bb1101edeb2140e07858aa36619a74b0944c52663b7d3818ab6bf9e66ee792cda1b6dd39842e0280c0a8ca9a3a01aae213a90a6708e741f688a32fb5f1b800800e64cfd341c0f82f8e1ca822336d70c78e0280c0fc82aa02018ddf0b5e03adc078c32952c9077fee655a65a933558c610f23245cd7416669da12611e0280f092cbdd0801aca0305b7157269b35d5068d64f8d43386e8463f2893695bc94f07b4a14f9f5c85e8c50280e0bcefa75701b18f0efd26a0ad840829429252c7e6db2ff0eb7980a8f4c4e400b3a68475f6831cc5f50280b09dc2df0101a6830c2b7555fd29e82d1f0cf6a00f2c671c94c3c683254853c045519d1c5d5dc314fb028080bb8b939b4401be3d76fcfea2c6216513382a75aedaba8932f339ed56f4aad33fb04565429c7f7fa50280c0ee8ed20b01b4a322218a5fd3a13ed0847e8165a28861fb3edc0e2c1603e95e042e2cbb0040e49ab50280c0caf384a30201ecb42b7c10020495d95b3c1ea45ce8709ff4a181771fc053911e5ec51d237d585f19610280f092cbdd0801eba3309533ea103add0540f9624cb24c5cecadf4b93ceb39aa2e541668a0dd23bf3f2f028090dfc04a01a6f3121520ad99387cf4dd779410542b3f5ed9991f0fadbb40f292be0057f4a1dfbf10028090cad2c60e019ac83a125492706ba043a4e3b927ab451c8dccb4b798f83312320dcf4d306bc45c3016028080a2a9eae80101b4ba0bd413da8f7f0aad9cd41d728b4fef20e31fbc61fc397a585c6755134406680b14028080d49ca798120192600ef342c8cf4c0e9ebf52986429add3de7f7757c3d5f7c951810b2fb5352aec620280a0b787e90501afe442797256544eb3515e6fa45b1785d65816dd179bd7f0372a561709f87fae7f95f10280a094a58d1d01dc882aacbd3e13a0b97c2a08b6b6deec5e9685b94409d30c774c85a373b252169d588f028090dfc04a0184f81225e7ded2e83d4f9f0ee64f60c9c8bce2dcb110fd2f3d66c17aafdff53fbf6bbe028080d287e2bc2d01d18901e2fd0eeb4fe9223b4610e05022fcc194240e8afe5472fceda8346cb5b66a0a5902808095e789c60401cf88036cf7317af6dc47cd0ce319a51aaaf936854287c07a24afad791a1431cbd2df5c0280c0f9decfae0101999909d038b9c30a2de009813e56ba2ba17964a24d5f195aaa5f7f2f5fefacd69893e80280a0e5b9c291010199b10cf336c49e2864d07ad3c7a0b9a19e0c17aaf0e72f9fcc980180272000fe5ba1260280a0b6cef7850201a2e20a7a870af412e8fff7eba50b2f8f3be318736996a347fa1222019be9971b6f9b81028090dfc04a01bae5127889a54246328815e9819a05eea4c93bdfffaa2a2cc9747c5d8e74a9a4a8bfe10280f8cce284020191da0b24ee29cd3f554bb618f336dd2841ba23168bf123ee88ebdb48bcbb033a67a02f0280f8cce2840201e6c30b2756e87b0b6ff35103c20c1ddb3b0502f712977fd7909a0b552f1c7dfc3e0c3c028080e983b1de16018fed01a3c245ee280ff115f7e92b16dc2c25831a2da6af5321ad76a1fbbcdd6afc780c0280e0bcefa7570183920ef957193122bb2624d28c0a3cbd4370a1cfff4e1c2e0c8bb22d4c4b47e7f0a5a60280f092cbdd0801ccab30f5440aceabe0c8c408dddf755f789fae2afbf21a64bc183f2d4218a8a792f2870280e08d84ddcb0101f8870f8e26eacca06623c8291d2b29d26ca7f476f09e89c21302d0b85e144267b2712a028080aace938c0901b0b1014c9b9fab49660c2067f4b60151427cf415aa0887447da450652f83a8027524170580b09dc2df01028c792dea94dab48160e067fb681edd6247ba375281fbcfedc03cb970f3b98e2d80b081daaf14021ab33e69737e157d23e33274c42793be06a8711670e73fa10ecebc604f87cc7180a0b6cef78502020752a6308df9466f0838c978216926cb69e113761e84446d5c8453863f06a05c808095e789c60402edc8db59ee3f13d361537cb65c6c89b218e5580a8fbaf9734e9dc71c26a996d780809ce5fd9ed40a024d3ae5019faae01f3e7ae5e978ae0f6a4344976c414b617146f7e76d9c6020c52101038c6d9ccd2f949909115d5321a26e98018b4679138a0a2c06378cf27c8fdbacfd82214a59c99d9251fa00126d353f9cf502a80d8993a6c223e3c802a40ab405555637f495903d3ba558312881e586d452e6e95826d8e128345f6c0a8f9f350e8c04ef50cf34afa3a9ec19c457143496f8cf7045ed869b581f9efa2f1d65e30f1cec5272b00e9c61a34bdd3c78cf82ae8ef4df3132f70861391069b9c255cd0875496ee376e033ee44f8a2d5605a19c88c07f354483a4144f1116143bb212f02fafb5ef7190ce928d2ab32601de56eb944b76935138ca496a345b89b54526a0265614d7932ac0b99289b75b2e18eb4f2918de8cb419bf19d916569b8f90e450bb5bc0da806b7081ecf36da21737ec52379a143632ef483633059741002ee520807713c344b38f710b904c806cf93d3f604111e6565de5f4a64e9d7ea5c24140965684e03cefcb9064ecefb46b82bb5589a6b9baac1800bed502bbc6636ad92026f57fdf2839f36726b0d69615a03b35bb182ec1ef1dcd790a259127a65208e08ea0dd55c8f8cd993c32458562638cf1fb09f77aa7f40e3fecc432f16b2396d0cb7239f7e9f5600bdface5d5f5c0285a9dca1096bd033c4ccf9ceebe063c01e0ec6e2d551189a3d70ae6214a22cd79322de7710ac834c98955d93a5aeed21f900792a98210a1a4a44a17901de0d93e20863a04903e2e77eb119b31c9971653f070ddec02bd08a577bf132323ccf763d6bfc615f1a35802877c6703b70ab7216089a3d5f9b9eacb55ba430484155cb195f736d6c094528b29d3e01032fe61c2c07da6618cf5edad594056db4f6db44adb47721616c4c70e770661634d436e6e90cbcdfdb44603948338401a6ba60c64ca6b51bbf493ecd99ccddd92e6cad20160b0b983744f90cdc4260f60b0776af7c9e664eeb5394ee1182fb6881026271db0a9aad0764782ba106074a0576239681ecae941a9ef56b7b6dda7dbf08ecafac08ab8302d52ee495e4403f2c8b9b18d53ac3863e22d4181688f2bda37943afbf04a436302498f2298b50761eb6e1f43f6354bdc79671b9e97fa239f77924683904e0cf6b1351d4535393a9352d27b007dfda7a8ae8b767e2b5241313d7b5daf20523a80dd6cc9c049da66a5d23f76c132a85d772c45b4c10f2032f58b90c862f09f625cbd18c91a37bb3fc3a413a2e081618da845910cf5b2e6bffea555e883b0bb9c5f9063380a1c33ebdb764d9ffefe9e3169de40b18eeb9bfca48296457bb0b4e29d7b2b5bc4e0021ba0a1d389f77a8e253d6db149d400f675a9330f3bcfd09c7169224a947b6b4e0745ae08cd7adea4151277a94f51f85292ba082cf28300cca233ff4966b093c9cb6abcef476026040fec2b435021aff717b8bb90a40950e010f70bb416a618dc3c5c03f590c5b7ec8e0c05b85ba94078de4817918f783022364b8aa228b5df43b38fba3060c30616f265022584ab6034ddbc832450f90047d0cf41a4af8a20fb1aa66406133a17c2e905ee28d8acd186c872859c196db0474dfaaaded2d63768143cf6b5e2e34662f7bae573a08cb15069ef881892e5a0c08b5c6c7b2e6376cd2080fb29e8d3d5aa5b853662b4f1784ba7f072130e4dc00cba3cc9278fc4213f2ce2fc82bd1ea9fa91bb17b4f7c36962c78d864eab9f30ef327039da6607962a156a05c384a4a58ddd8f51a0d4fe91f64ae7b0a5199110a66f1e676392ec8d31b20a65f7a7fcff90b37a8a3962bff0c83ee6033a70c5b0af663ca48a8f22ced255839444fc51f5b6a6c1237eda5804289aa25fc93f14d0d4a63cecfa30d213eb3b2497af4a22396cc8c0e7c8b8bb57be8878bfc7fb29c038d39cf9fe0c964ebac13354a580527b1dbaced58500a292eb5f7cdafc772860f8d5c324a7079de9e0c1382228effaf2ac0278ebedad1117c5edacf08105a3f0905bca6e59cdf9fd074e1fbb53628a3d9bf3b7be28b33747438a12ae4fed62d035aa49965912839e41d35206a87fff7f79c686584cc23f38277db146dc4bebd0e612edf8b031021e88d1134188cde11bb6ea30883e6a0b0cc38ababe1eb55bf06f26955f25c25c93f40c77f27423131a7769719b09225723dd5283192f74c8a050829fc6fdec46e708111c2bcb1f562a00e831c804fad7a1f74a9be75a7e1720a552f8bd135b6d2b8e8e2a7712b562c33ec9e1030224c0cfc7a6f3b5dc2e6bd02a98d25c73b3a168daa768b70b8aef5bd12f362a89725571c4a82a06d55b22e071a30e15b006a8ea03012d2bb9a7c6a90b7fbd012efbb1c4fa4f35b2a2a2e4f0d54c4e125084208e096cdee54b2763c0f6fbd1f4f341d8829a2d551bfb889e30ca3af81b2fbecc10d0f106845b73475ec5033baab1bad777c23fa55704ba14e01d228597339f3ba6b6caaaa53a8c701b513c4272ff617494277baf9cdea37870ce0d3c03203f93a4ce87b63c577a9d41a7ccbf1c9d0bcdecd8b72a71e9b911b014e172ff24bc63ba064f6fde212df25c40e88257c92f8bc35c4139f058748b00fa511755d9ae5a7b2b2bdf7cdca13b3171ca85a0a1f75c3cae1983c7da7c748076a1c0d2669e7b2e6b71913677af2bc1a21f1c7c436509514320e248015798a050b2cbb1b076cd5eb72cc336d2aad290f959dc6636a050b0811933b01ea25ec006688da1b7e8b4bb963fbe8bc06b5f716a96b15e22be7f8b99b8feba54ac74f080b799ea3a7599daa723067bf837ca32d8921b7584b17d708971fb21cbb8a2808c7da811cff4967363fe7748f0f8378b7c14dd7a5bd10055c78ccb8b8e8b88206317f35dcad0cb2951e5eb7697d484c63764483f7bbc0ad3ca41630fc76a44006e310249d8a73d7f9ca7ce648b5602b331afb584a3e1db1ec9f2a1fc1d030650557c7dbc62008235911677709dea7b60c8d400c9da16b4b0a988b25e5cf26c00c3ef02812def049bb149ea635280e5b339db1035b7275e154b587cc50464a4c0bfd15c79f54faa10fbe571b73cf1aa4a20746b11c80c8c95899521fe5f0bb3104b0a050c55a79511e202fee30c005339694b18f4e18ab5e36ea21952a01864a0e067d9f19362e009a21c6c1a798f7c1325edd95e98fd1f9cb544909fdf9d076070d1233e183fb6d46a46fbc6e10452ef4c45fa0b88a84962ad6e91cbcc52bc000b12a82e93ae5998b20ee9000a8ef68ec8a44862cc108869fd388142692be6b0657e3fe79eff0e8b72f63aeec5874acf5fb0bfc9fa22645ed6ecaaf186eca690ecdf8a71b8f4789ac41b1f4f7539e04c53dd05e67488ea5849bf069d4eefc040273f6018819fdcbaa170c2ce078062b7bbe951d2214b077c4c836db85e1b138059c382ab408a65a3b94132136945cc4a3974c0f96d88eaa1b07cce02dce04ea0126e6210a9543129bb8296839949f6c3867243d4b0e1ff32be58c188ba905d40e32c53f7871920967210de94f71709f73e826036b4e3fa3e42c23f2912f4ea50557dff78aeb34cb35444965614812cbe14068a62be075fce6bf3310b9e8b12e0dd8379104360f728d47a327c172257134e2c0e7c32e01321f4d636f9047bd750e7993eeda7d39fc16f29696b1becee4d8026e967f8149935b947fce8517b2ce02b7831a232f3a29010129c49494ed2b84c7f881b7e4b02a00ebabf5a36023c404002d6cb88cee76c8ce97b03143ca867359d7e118d54e053b02c94998e6fd8409f8d46fc1741a2e56aebb1e7dab7ca3296a2566263d9be2f4bbef4872a49ee1082cbaf86e21b0c232c4182fc660f0c0b6aaeb0393750e553bc406e2a27842bd033da45a562ed1998ef9bd83e35ed813bef00a3e6147cb363bee63c543ba5e770b043dbacc155214a2496f91879bbc9170a2a513d7b48fad40c8c2d96f951e3a0932f6d12956789198430b352803852aa9726163fbe839979b33f8dbf7f76cd50755c1ce0c40a072aeec35057d06abaf59e878000b1d796e51908bfbf23b13900dcb30f9bd52b52994e7245a7017653a404a70d1c444b8c613ff10a2b057c02d062c5faf13cdc4445809fb6e096923cdbbdca18f59318ff86c7e449f596050b404d3cde0338dfdf9b1389178b1d4c70eefa2bbd76fefc1ee1f1688ef507821e40ae31d8d8e673d183b54563e2cbd27e0e042f61b046877d37a68c1b5784830690f2dd4ebbbd2dbdb35800b9e0ba8ea985fa106dd2ce8493e845586716c538ee9008b88a7c482f3c00c14c08468230d40cdc040e145282c4d61985cb5800306e305146204f63e96ad194bcdf1338ab8480341b6fbccf18fc32145f84bece4069c09e41096e94c24fa4f0db988e860a3bff3604143f2b17e8c219f28189e4cd49a0e506fe62dc419299bcd78c6ccb107f63eb31b4bd8ea1e2fed10e3ac17341d3505019e2376b01f7a7fcea3db110fb090c681c866ac86f13e6f8d44a32861e0580def063736b5c771b2b3b9067045867b4393f3eb2a4610bd0216e29906aaac370986451c6bf78264dda7e7a5fcbcf7bd6e024ff6003c6db780d89b97765cee8d0ff3ff25d94d4b4b919f722b26a6903a017daa62af387843087680c57952de06064de05b662af87be49b6e34cf0991cec7be3396e2eec9678ba259bd8de1c192014d02928f9113488215658df4078ed661fa4e79e58decaeb0ee5a00488b094b0b77f083b2b7844f481e7788ffe8004b96ccdf853532bfd9632a8a652c2d97d10173c90864fbb6facf47fae415df4acc0b099140a657b35d083d74dbdfbf107303e74c64471bed4b2199f2babcb4e1fc593d6f309e21f85e68ffd9904731559d0f2b673b36d3984e5d66d897dfa17d601edef3ed78cb70dc5115d4ae240c203e031263f0cf1e98075bac0361fde24cbcb852b8055d53ae01d61a0a1e1ba423d00833747e7364df7ebfd1f84598d801c249e1805279dc37d39fc7f7e27b067e4e0287aec432ed49e4d701a0ff377e88179968430d110cb20476ed4c6bf1624d1907ef24406d3295fcacde2a102cc85f4f3d0cb87a8fae7535a06e442833e58cfc04242ff85fb654d05f9874c0a6756f542db4e9d8b0366191fbb8b09a1bbcb6af04c069978417ca80d92f442b7dbd092f74e1268aa73b54e4b64e84543449ecd30b5ea392a1669a5f441d7208925e91c75df611cd26042630c6b98f160b8c0156048108d5465b71bbc54d31a9f90e34428d97590a427e1ae618d4a35fc1022d4e007c6108dcb1672b88d43ae4d886a5adcc26faf56bc5e5a0b08342fb88263fd80940d1edf794c6ad6d339b974e164b38439e11b4fa87cc793b080b4f8bf0eb56043f79ed3911da21092475fcf8320b55b9f558f194c6c8121b2e696039340d97057be2583726d762b5ae4327e5286a2d8c14ddbe0027c75aacbf7e9de13037390df7d72e13b46bc06bad0363b070e0174d034120d7fa7b4550e7dc28f7f0241f059ae266fc13dccd1d07f744208a7d6a2e565b6613d46e4550f79ef3209c46a805b97284df558719e131f44e419e690f4fc28ee4862b9d1f8f7e1a164ac18141076087693e70ac76a10f7851530d4cbc65def90d5544671ad64249569c3abf0200d09be3c63efaa7cb723b39ccffc9b3a3ba0c8426847123d2a881efbd4937a40cb3e8011c70ba427f80b3dc91a608086f8b61f8bd86fcb482ea388299a7cfbd00a3ddfadb4b6d0e51c1369276c25889a9f3592900b6502d9af1c732e1fb7db307d71e45deb1553ba1568d0480ea9e132b52564da6ac5c56eff823e7f37976cd075ce8f7a78aaef1b87f7437a0b84035677f266f7d0596e493101fec3e14fcf80b22322454587b51fda0636231c07d4e63e007f1b89137d8a37b03bf00f3a7c10169f757d9a74b7bffba797c746e3845decc3d0559d7cf6f08f3bd67dac5f33109b212582dc7df5d561ad63dddc794f2aea4e493db1a73c702d258c9b922c35d04c47f88f87c54c821a29f04abd91a079ce8cef252a21dc72d409fd1618c9be709af029ba98b0140e74666fcb01bced4f88ab68e6b63b8ed6febc0905d22cb2200493c071ce136833697406f8a04e77b21747dda997046cf3c7080096fe481790d77cf5904e7f7128ed95a6e576d109fdf10eb0c888db35a4a685b62253987b70fb1538e6c0932889460fa31c60d123266b7bcb828f846a35b2851127679b05f05a75266529c343a6075e54c455e02b2c83e6f7bf1ae23326506a5f532472d780815c5af425f7d8b543a8f014966e0538f48ca84d181695381a09701eb65c9ae084bf2a4dc84f1b2071be32be25d5f4fcdc59668fd800496ef7eb6dddf867ab908e543cb51f0451706cce4be6b9f68a537a79ea88e17fcd78965b3da68c0d9d30623a2a9e275e1c320f59e118e09c02eee527167bc06f7693e7b584e3b25ecc1093d46b80a1cacced87c2b32e2f90c5bbb9cd1b701aae69a04b16d535fac6eab0d091790fc5fdfa8a8842bfcb62dbf963cbf62c4afb4c468be98c770e6078b8c0a8cfcbae43dcfff17d3c6d587c3e4309fd39c66acd14781fea66fc57278b02302c0fa386280e67acff19955b6a428b0e22ceb1e54e913a37cd19eb6e9d2268a039f2b5fdda7d5804db79385f0e50082b128c952f8dfdedc4411d0675d95127f0bfc01710a869b10d7a8b9e632dad944062567439e6d192fb09329d058e87ecd0aa8981328f541e87ed02cfe4031f2d3a046ff517a2a80486b04ade31a647aec0884fb96ed753ffc47892431c6e6f08fd1c633a1a44e882d3d8b92c567e0fb8305327a354851464ca0f18d89c6ee2a91a4afef0c55883acf8fcb68c2c3b7402e005d8affc19c13f1f26fee0698dff181ab22cb84a2b31e0a6a81dc5d02e60a3c07090397ae58a985526b2ad6ee5725e82328062b68566b4871705ce3b9856e550d068c20fd9aaeb27740c07aad53d79fc20e46e40e7103e2d69626ee64b6aa600f6f1a86f37948ff4990d88f43c34994e2fe586cb779997be323da53329c10480aeb08fe440e9e4b979171371c73b94da9f928a3f6c8f6792f782f3d6432b86d06f54557327fef31fd6ae0a3f6d2f16c9ad947d132e14def33fa24cb4565370e0832fa50f5f5f93c9f3d65776cc22608b68a4f3719e9be47a19432991e4a2c49089c0ea20e7f7c73feaa47970da424d8543d80d622e2f2be9f4c65cc39dc369009a9d41a52bdea7cc0e8e04da87a633fd4f814fda1b646121a469ba0b5b8006d0e9118761d97b5d1856e2d690f27a81c42b176df853d07cf4a66ee83c9eb24ac0a382f5143a10a33ec3ddf17dcd8a8303fac8f279d31b4d04d74bd8804cefbb400c86174ad444e43ed33ee1e1e73f660b9814d5ca3cb1d650f1978a825a617bb05f84eab3b9b8359b991e1084cf4e8179ecb67f92398638e31227ff63427b67f0f232b454a341d85d4b56e31135c9035e231f7d9318ca12b5ab524f87bb0ca9b04b80effed202897ab016d5acc054c4fe62a5f0192f136cf2cd714998a4b164b0c2cdbace52243fdc9ea879b0d247d4fe8bd80481fad6b325cb5f2cfa2534dec0e47d41b6b99352e6e5faccb5ee28ca2fe96e04f9c83a0461ba34cfb499d864f05dc734b6c8f51cc0c994290b2a868cb8312df39fb6d457a81e62d872c65d4f3007094be42663bca3d64ebbcc8401158fce4f5a38a49c20f029c338f126451820459866e77c6984a467aad571cc7452392a9cb9f8e65099fff2f2acd170a833e01ed3d22a683356ee42dcbe6bab6d05d3edda2d40e9ba53884d430c2e0cd87c0067dc8cb68c868bd9f29db1dd73703c139ffc15e4f7264e727c70560ae02da100871f30e8a7c1275805f621752d73aafecddc2a7808b6c2ecbb8d0134a644bb603f30f8d18b3fc5efaa7f206ce180bfb14f5dbd3b0115145a227113eeaf1c1ec04244227b931388e72960833a40baa4319c5cf74aa94f7e3233e1d09f0a4f74409999684ad1cc836ac74563c85b164664dfab08ea084b25e2cbd7e7b94a781a10fcd455ee38b65126dcc52016127fd195c80b05660ed931e128b0cb92868955c0d032ada9fb951210a5442d21c1718ebc4702ad4a57967e15a63ffb05e1e072a0c41ebdf1e7205373eeaf4587f695de887fa3a8c96b8deb99e040fa1fc4dc2a402a017891943d734ae2f3798b22b1269d3d9f6d65581b9c637a6896a4fb554810bbd3db5c5737391a74150b43413b2e3824490b7911cbeb845147f1a8521620b0dd31306f13a9754a01bcdbd18bfdeade06b0ec97f48df56c45d3670a1fe18d00ef13e613c8a77aeb40401a814b377137cf44f29cb2cb94186ad1161ecb05a7c07837a5ab3474e57990cff2ab16b4d99f62e646da28e8bb712a5b561cf0e25be039c3e08583c8ebc3dd2fdb8fdc6e135ecc7851c73218a70b75e697cc84ea50504b9c34a33ed52f87230b9d192a940f3b7bb6d45b58dbf52f0afeb8dac85c77b06bdf9b70a10cb81c50055c9d8cf7e3a5c4b7dfae55beabcb3e8a8a1cb822d8d0bf6c01e32056929f853021eae6c97fdb0c5031df6b2e7c57f1318866769a9cc09c38ed62d8bf4663334c0df67c47236ed73f6ce7f54e0ada9270398c1aa558d0f993b0d25d97aea77b1635ee4832362cd590bae5fc1549402ddcd42b15efc930111a01535c0242116078d6d2d53b8612d378c4370e90d0d01b01bd7da591bec07981652a98485d8ed5c8f3def2bdac7d992ee5fc6a1ec7bd36940e1bc58c7050451248fc3ee6069e6b1b0d3ef122c6ef2a9b99aa0f145fb43341c58dbb472130b51730c956273a3ef6df9e000f6a87c2bacdefcdb5daef28b6170f61bc3a9c101f439755c86e6b85ee06a7a60688b3843eb359cd4acd9221a2ee131e2fd2e190652e5c47c0b98c41010eb99a991ec48a5de99cc8f403d6d76f8307d6657c1e007ebd64eec7bbd0d4f1ba2db7bb0efe27c7828f053e00def775943ab01a7e33d0fffcfe6f9a7285237f2c381b638758e373f8ceac672190664bb25fb5d355c240bd1773d61bda7f7ef1f4261b80ff5058ec6f7e024ab9459b1103815624b81f80c39db2f6fecb72de452b11636b0f71b16cb55f883d93bebb94328f13ef1ab6d0df449e32d27884f5139af584035547dace65ee25ba05cc461e74760d4468af90dcaa982e52cb902e2b84b3324019da575601ca54e91655913892e703257deaa01d14fd8459ff780c724161ba4d4280b70a5039dcfb5d775560714009724cb0d0b7e178c71e777b896bcfcde7d4c9c3dc6ab819d74a1a1fda8486448b1ad79be02fb134ea93a8600f1bc2a42e68d0213ab461a07cef3ad3965bc130beb76bab409102f82bf6c4cd626f6df3388e17b87584310c50832cde3191f6557f0014bdc0a68d924119e43111043bc6f26d16a5f2612dae6ab24984e2d87a71d93d5f4670dba2176d4f16633407bf7c10b51b6842dfdbc6fe3eaa4b6a12f0550700ece070ca382dec3b587e0e1fc317a48a83754d15aaf9a6971b8cb641fd8b32846d89002e6301700a0e7056e8002d8f269d29ebaf64f4493b1f1e676fc78e673067fb00625df15dc0490235b386ee14e55b335f3bc6dcedd7d3a80fd3a6e9bc2ccf3af0d89be71b5ca92bd7a9b97b9ff8976f75702419aa5bf9be34600496ca1bfa8ad0400602a23579365574252434f2bcd7efb360b0e8a495e8f7e78923b6fbf2207049e9179f0d4d7d6b4a4a10ca10f0ef4dd6cb5a74f7574e832044d6120fbc1580a68eddfbc65ab300bed960a6f24a102dc36b72937a8be4385daf5946e81ccde0619251babbff17e5685217a134d22f6130d0322483b3475227ffd27adc73ca202a6debfa37e5731747f4449ac70a33684f460eede65918c6d89acf4b50fd28d040ffbd436a944d3be0210606bfc2301e7ac66d462dba29a0489eb55af714a760e5302592cccc726e535b945ceb6126eb84e31f0f140ff54df8be0fa3a22f418036ad996787a5616a97a42049ebce351dc11857cab3dc914ef26833b0e75653004a8cafea099fb0750135255c41ef43e2f29c75714e2f0be2545e7c109b70c43004a471daa85b47befc65907d033f133b2f3ac2ad568df630ee80506610b8dc9052d442668dc06b13ea76ab1ab7b34870341d660af5d3007c21bb72512e4f8a60d8916a037b93f9e15ac9e4a6a1246d73ebb40e5fdd5a0d6dc0cf175023b891301f69fe5a3ca6f12cb8312d16333de1cd3ebb99339ab18c0715bfcd35b8365b407ad759e2c591d8270ad335381573e27ec18af7ca157b4a2bbca921db083d9b0009dc332a79dde14354a8c18bce76a1bfc1a25a1e702ccaa0feb521ee9279b8a01ceab6e237bbe4128b23cb53b1e5185f3266e20670a307ea0cfb5377025e0bb0790d48f1636c8b836c1a1f69ad61265f19057197e86cd526da6ddb94fd1ece80b60852f27ef2ce56ccb5a32d8cab6d16be06f380dfde3602ea4c1ae927173b2001ff0d9e29bc66b2b2a20c3e3ac174fcba187aacab0876c1356d30d4021e6dd0048c3bdfbf254108bb09d3ca9f2be423a92408bca52fbcd68f972c46fc8d20e0350d12c2f2d6c7da85e96bcec3ce61119793d44a210f81ece859fef6360ae3b0e1af0634fc141a8b50b3b383fb264e8a4fb84ea06db6becbf5e140edf66ee190da8968da579eb349fedea45e4c252a79570501278bab5fa984d7b1179d7c2460faa7beafee153bbae0a591701632aa94839528d3ef50cf809c1f7209b9e5c99010eaff7f921c45b6546358ee7a90948e3c710cd3e1796860839a345516fdf4f07c415029627abe1273a1f510c36a662562d18169b23305b4efadfefbfbb41a400ab533e61c14cafa49bc5d2818058ee4f3e1aeb329e150820d1de1f1eaaad31051a6dfdd3a1d5cec7b16bc0ea2c649d409917faa42138b1f824b4d534a050be0a99ea6772daf0b2e58623cc7a250ef37599bd556508f08886e663ef0917ecd3077072c3268ea5b9b89cbb6b761ee9f9c4765d8b267d9eb19728a28ce67a42ed0cad142b5dc0fc5313853860ec3f0ee2bc3d47cbe12dbe9633db809967d5b8bf0e45574eac657059530c30aeeade1e4f858a4a6e79d6e441b4af0127a13340d908d48cfec849ee93d53b1564231f048d34885e791a9d40c61a7b00f12f6f72a5050bcaabcc98480170ea6e20bef6b5c6f504c808108454fe2f3c275bf8f89a5e0a3304a7c4787e6d4fbe569930f7cfd38ab7d1d2ebd599bbb411950cec3e53b90cefb82234990d353c71ce4c21ef674a1c4070f71c90e1ea7edf35f5a421118f01b49a92ea97720e2d4df6b5885c181002656629a90eaa1904fe1c379b8291480ca15d0dc2b65a20c22f1e01d612d21ecb5738e5ebfc578a4a65066ee6e913e3030d3fdfb0168fd75022492728ee82869deb9ff2827f4e10759ecddb20f67e9808e707257a74d3dc0a6068f264066f95c9f772a3dcec0b4f0a327e3745517ad60ccbc5392890d2479b724d068fcdb83607e02291c06e1a5a1dac7604889cce2500f418da2f7080a7e9a1bdf28b87028a2bbb0c14f059f10f46d46716eac2cdfc06676cbec91b8c2c0f7c9bea7e27fa5048662398b23a9b488a49e1d3330c04e60179a4492c8b836780899899d2af17e6119a94d54a890ce8c0b550e87fd54cba0821fa7c48f6e09a60dcbddf853f82b47195aa44a5ceae14a9257296acd711c8073ff3345befca5d3ebf64901b283df96395fe9785d7090176bfe5a9f13ceae701c6c93af0e13d949bc3c7e9b06674a73e7affc508302258a27fb34569c3742201c0721aef282a31c69a5d98a67ac5c3d920d50c089896f7f8c8c237a81f803f0444f417246d695e89a3a523b62a3cd2203d42607cac7c7782dec1f9edbb806c0a7a37d1a969082a126bc726151a50233456a07d374399e74aaa8cc66821511d092615950d302e815cfcc021e1250cdea20fd9e1e4b5e88280d6e4283b918e780d12cbba59ef2ed2ce86135a48fba6c0dc2bf2efee190d9a3f9aa22a622b1953058f2bb3a371637d13e045d54e7eb54c0d25851f49283d7d34e9785d2d5c3f70086c48a8325a2083bdf5b3531fcc697cc0c9f63892a866c84585d673a2a63fd60e77995bfb0c0a44a4b63c0ff67e813027d3e84cddd393a0f4e6bc95525c5ae20eed9d0cea4a12aa748eb5209cfd75990b055f1ad0472f9f7599f569a8743a720755aa11555df4bb2e725fa93bc5dea603a964e8dc9fb1742e81825022866fc50a6b2a19b6a234a38ee27a74f2f5832b294143ca7ff8d07fd7d4e01f479e9792058871d90ee3aaa3329e82cebe41dff5e6d00a36268a7965466b80c6510ac1350cee797e1d6737f6aaff155266d2a2d611b2124affed1ac73a6a06515627b2230ce0d7fed33ecbde511f4d472cbc556cc8d9c5640e67657035112976b626847a0a4ea5fdd14d4a3eed57f0dfbe153393d8bd28c8b4f9e62940e8379790393fa20c617050c780a7d870193b4611bd7a12d26947a3cf4605e225da8b1646a76984015a5e317016a4d8301eaeec0db3ae0daa719182e2f4479154dbcccfcce1f365099de6c91934c395ce82abba8062a51d7773b418330921766cd3d275c689098e06039698db6f09accb292e7eb79e7a022d4257bb2f9ed993c519860919bc229a06ad88954c9ebf7f5b9fe95cf56e8181cb9175dac06be0be70fd28df20cdb4600ef0869668c645c9ea01360fdae7c922cb3d2b3583ae1de5ae7d899a83ff2bb00d7365c782a0fccfcba7f87bb29416469bb051f9b0755123e0f2fa76dc7644b70e452f49a84bc372b384c843b8161b7f9b63699adcadd5cb2b33b36c7eb3e1b00f25218bc16447968b939016242fceaebd796c17a24d1b9870991a9c3ae90e380302b7bb320adacc08cfb9249d29cd9275c52476dac6a7e9870ee3776cbc3352036f9c8f681d44856c6c5f90b7cde0877472ddd48719c449f59dca1f49442f7505e4809c6d323b37530ecccf3e41e19822f53d64dc90efb113405ee88799c37f0a342293b5bfc019a9057138326de6107b5613554dffc737aed7237fb16cd77e09f581d12220ac930c6ca279efd1d07a92125fb2606ec3ec35351987a15fc72806cfb3cb66fce8dcfabee5c1e586bf0f802fa12ae5ad5a708e3a5d54e1926dbd0202bf1150f1bb612b9a4590b5b520b86a90860ec3d9c2184f9975ced15ae1300882d9918021b43a1184ba88ddd7091539fe5a7017b8708d0f5c916f9c42de5103f8116863864b508f5880ca60b7492385c16a02b6ceb64d257a4838873b85d2041517c5c7c4508e4d5a5faa72729d73af0361e11828eeca992b8f20d903a5ef065976a9f322e34bd4b3984bb09e18be40e77e833c8c1a2e80093227d3f40d4a067f5e3aee9fce9bd234bb6ff4d0c34fc060d23e86b1f5a6d8d052e53e913182052a2d9c5e97bb0e0a51bb2fafbe7346bacfcbadb00ce2ba129f29d41a11f7d105cf19bb60b5f5b0dfd6a894698ef7f56a02d69cc03eb62a56563d3a77e3ac2302"], + "untrusted": false +}"#; +} + +define_request_and_response! { + get_alt_blocks_hashes (other), + GET_ALT_BLOCKS_HASHES: &str, + Request = +r#"{}"#; + Response = +r#"{ + "blks_hashes": ["8ee10db35b1baf943f201b303890a29e7d45437bd76c2bd4df0d2f2ee34be109"], + "credits": 0, + "status": "OK", + "top_hash": "", + "untrusted": false +}"#; +} + +define_request_and_response! { + is_key_image_spent (other), + IS_KEY_IMAGE_SPENT: &str, + Request = +r#"{ + "key_images": [ + "8d1bd8181bf7d857bdb281e0153d84cd55a3fcaa57c3e570f4a49f935850b5e3", + "7319134bfc50668251f5b899c66b005805ee255c136f0e1cecbb0f3a912e09d4" + ] +}"#; + Response = +r#"{ + "credits": 0, + "spent_status": [1,1], + "status": "OK", + "top_hash": "", + "untrusted": false +}"#; +} + +define_request_and_response! { + send_raw_transaction (other), + SEND_RAW_TRANSACTION: &str, + Request = +r#"{ + "tx_as_hex": "dc16fa8eaffe1484ca9014ea050e13131d3acf23b419f33bb4cc0b32b6c49308", + "do_not_relay": false +}"#; + Response = +r#"{ + "credits": 0, + "double_spend": false, + "fee_too_low": false, + "invalid_input": false, + "invalid_output": false, + "low_mixin": false, + "not_relayed": false, + "overspend": false, + "reason": "", + "sanity_check_failed": false, + "status": "Failed", + "too_big": false, + "too_few_outputs": false, + "top_hash": "", + "tx_extra_too_big": false, + "untrusted": false +}"#; +} + +define_request_and_response! { + start_mining (other), + START_MINING: &str, + Request = +r#"{ + "do_background_mining": false, + "ignore_battery": true, + "miner_address": "47xu3gQpF569au9C2ajo5SSMrWji6xnoE5vhr94EzFRaKAGw6hEGFXYAwVADKuRpzsjiU1PtmaVgcjUJF89ghGPhUXkndHc", + "threads_count": 1 +}"#; + Response = +r#"{ + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + stop_mining (other), + STOP_MINING: &str, + Request = +r#"{}"#; + Response = +r#"{ + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + mining_status (other), + MINING_STATUS: &str, + Request = +r#"{}"#; + Response = +r#"{ + "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": 292022797663, + "difficulty_top64": 0, + "is_background_mining_enabled": false, + "pow_algorithm": "RandomX", + "speed": 0, + "status": "OK", + "threads_count": 0, + "untrusted": false, + "wide_difficulty": "0x43fdea455f" +}"#; +} + +define_request_and_response! { + save_bc (other), + SAVE_BC: &str, + Request = +r#"{}"#; + Response = +r#"{ + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + get_peer_list (other), + GET_PEER_LIST: &str, + Request = +r#"{}"#; + Response = +r#"{ + "gray_list": [{ + "host": "161.97.193.0", + "id": 18269586253849566614, + "ip": 12673441, + "last_seen": 0, + "port": 18080 + },{ + "host": "193.142.4.2", + "id": 10865563782170056467, + "ip": 33853121, + "last_seen": 0, + "port": 18085, + "pruning_seed": 387, + "rpc_port": 19085 + }], + "status": "OK", + "untrusted": false, + "white_list": [{ + "host": "78.27.98.0", + "id": 11368279936682035606, + "ip": 6429518, + "last_seen": 1721246387, + "port": 18080, + "pruning_seed": 384 + },{ + "host": "67.4.163.2", + "id": 16545113262826842499, + "ip": 44237891, + "last_seen": 1721246387, + "port": 18080 + },{ + "host": "70.52.75.3", + "id": 3863337548778177169, + "ip": 55260230, + "last_seen": 1721246387, + "port": 18080, + "rpc_port": 18081 + }] +}"#; +} + +define_request_and_response! { + set_log_hash_rate (other), + SET_LOG_HASH_RATE: &str, + Request = +r#"{}"#; + Response = +r#" +{ + "status": "OK" + "untrusted": false +}"#; +} + +define_request_and_response! { + set_log_level (other), + SET_LOG_LEVEL: &str, + Request = +r#"{ + "level": 1 +}"#; + Response = +r#"{ + "status": "OK" + "untrusted": false +}"#; +} + +define_request_and_response! { + set_log_categories (other), + SET_LOG_CATEGORIES: &str, + Request = +r#"{ + "categories": "*:INFO" +}"#; + Response = +r#" +{ + "categories": "*:INFO", + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + set_bootstrap_daemon (other), + SET_BOOTSTRAP_DAEMON: &str, + Request = +r#"{ + "address": "http://getmonero.org:18081" +}"#; + Response = +r#"{ + "status": "OK" +}"#; +} + +define_request_and_response! { + get_transaction_pool (other), + GET_TRANSACTION_POOL: &str, + Request = +r#"{}"#; + Response = +r#"{ + "credits": 0, + "spent_key_images": [{ + "id_hash": "563cd0f22a17177353e494beb070af0f53ed6d003ada32123c7ec3c23f681393", + "txs_hashes": ["63b7d903d41ab2605043be9df08eb45b752727bf7a02d0d686c823d5863d7d83"] + },{ + "id_hash": "913f889441c829e62c741c27614cdbb6278555b768fbd583424e1bb45c65e43b", + "txs_hashes": ["3fd963b931b1ac20e3709ba0249143fe8cff4856200055336ba9330970e6306a"] + },{ + "id_hash": "0007a41ed49aa2f094518d30db5442accaa7d3632381474d649644678b6d23c0", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "05138378dedfae3adbd844cf76c060226aaeddcd4450c67178e41085d0ae9e53", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "1cccfcece29fbd7a28052821fdd7aac6548212cab0d679dd779a37799111f9ec", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "1eda8e08b1024028064450019b924eca2e3b3e3446d1ac58d0b8e89dc4ba980d", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "38d739cfb68aba73f0f451c7d8d8e51ae8821e17b275d03214054cc1fe4f72d6", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "40e57cb9a9f313f864eef7bf70dea07c2636952f3cbff30385ac26ee244a4349", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "52418ac25be58fbfcc8bd35c9833532d0fa911c875fa34b53118df5be0b3ba48", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "65bb760c9a31da39911fa6d0e918e884538f0a218d479f84a1c9cca2f9a5f500", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "7d805459f05d89c92443f43863fa5a4d17241d936fc042cc9847a33a461090c5", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "88f7594b26dcbaff22f7e7569473462c49d8fb845aa916d7a7663be8b85b8553", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "a2b08a090f611ea1097622cc63a49256a2d94a90b8dbaaa5e53a85001c86d55a", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "a5ebf4914f887ecdfde8e7ef303a7f2cc20521a2a305ba9a618e63d95debfb22", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "c5b7d94e661c5eb09714b243f3854cc06531b1085442834c9e870501031b73da", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "987605d678e8bfb17e8d2651e8dd5c69c73c705d003c82e4e35d2b5b89c9ebe3", + "txs_hashes": ["7c32ac906393a55797b17efef623ca9577ba5e3d26c1cf54231dcf06459eff81"] + },{ + "id_hash": "ca559feaf79de4445ca4d2bcc05883b25ecff2f6dd8fd02a9a14adea4849f06f", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "d656ac13a64576e7af5ca416d99b899b0bafef5e71d50e349e467fa463b13600", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "dc006e92fc1e623298b3415ddccfc96a8cae64cb7c9199505a767a16ddd39bb9", + "txs_hashes": ["b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986"] + },{ + "id_hash": "fb3e7cc08761a6037ca29965f27d2a145f045da5a1018ca7e6a5a5a93dbbd33d", + "txs_hashes": ["c072513a1e96497ad7a99c2cc39182bcb4f820e42cce0f04718048424713d9b1"] + },{ + "id_hash": "4ffd1487bf46e5a1929ca0dd48077cb8ddbff923e74517f1aeb7c54317c0fd68", + "txs_hashes": ["88504bd6a72b26bccbc7563efe365baeedb295011a4022089bdc735f508a9412"] + },{ + "id_hash": "f64056280ede74b3b1fe275cf9b9aa1feda77b3b5fd5218d6a765384e3d180ff", + "txs_hashes": ["88504bd6a72b26bccbc7563efe365baeedb295011a4022089bdc735f508a9412"] + },{ + "id_hash": "d2ed8513f48724933df6229a9fb6ededdcf5d0963280ee44fa9216ceebe7941f", + "txs_hashes": ["a60834967cc6d22e61acbc298d5d2c725cbf5c8c492b999f3420da126f41b6c7"] + },{ + "id_hash": "428be79097b510e49fe5b25804029ac8bfa5e2a640a8b0e3e0a8199b1d26f22f", + "txs_hashes": ["d696e0a07d4a5315239fda1d2fec3fa94c7f87148e254a2e6ce8a648bed86bb3"] + },{ + "id_hash": "368fbc77179fb30bf07073783f6ef08bfb1a8c096e9bd60bb57aead3b0f3663d", + "txs_hashes": ["9d1bcbdb17d24a4e615a9af7100da671ab34bffc808da978004dcef86ddf831e"] + },{ + "id_hash": "45a88adb7fcac982f5f4d8367f84e0f205235f58ad997f5dfa4707192fd3d9e0", + "txs_hashes": ["9d1bcbdb17d24a4e615a9af7100da671ab34bffc808da978004dcef86ddf831e"] + },{ + "id_hash": "6d80d9c12f1439b0a994f767d71d98d2d2cde1a54c6a6134a00c2f07135d98cf", + "txs_hashes": ["dbabb82a5f97d9da58d587c179b5861576144ea0cd14b96bef62b83d8838f363"] + },{ + "id_hash": "2c479dbff819502441604a914af485db2f795b7f5bc0eab877d60a1419ee5498", + "txs_hashes": ["aef60754dc1b2cd788faf23dd3c62afd3a0ac14e088cd6c8d22f1597860e47cd"] + },{ + "id_hash": "a7f204f932169b1b056fc63be06db8ec91a436f7188a30545bcd6a8bae817ca4", + "txs_hashes": ["8a6ebea82ede84b743c256c050a40ae7999e67b443c06ccb2322db626d62d970"] + }], + "status": "OK", + "top_hash": "", + "transactions": [{ + "blob_size": 2221, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 44420000, + "id_hash": "88504bd6a72b26bccbc7563efe365baeedb295011a4022089bdc735f508a9412", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261656, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261656, + "relayed": true, + "tx_blob": "020002020010f0bcd533b7d71bdb8915caa004b3a214f99f0993a303fd9804d1f101aa6c870de32a932ab774f80fc92cf64056280ede74b3b1fe275cf9b9aa1feda77b3b5fd5218d6a765384e3d180ff020010bc85cd27e4bfb407c598a104bc5e8e8c2d9bfc40add114c0e501b09e04edb204d1a901d2f4019603d50d9f07c4354ffd1487bf46e5a1929ca0dd48077cb8ddbff923e74517f1aeb7c54317c0fd68020003bbb37ea2c935e3c7245150d154748b59bdf280d557779b6cf8063165a7d9b5b9210003ffc23770cf9e4536c0db95978dbc937d1de339cb8dedf909f5adf7ce6fb8c4ea5b2c01d3b65a92cbd04597cc4f3da6a003ca5309af343f2d0f190102fdd7ed13e5b9ee020901d979920cfa70c6ef06a0979715e6d4eb51a032a1511050389f0d8eafbe5f91af7e37907d37de11bae31af65af35e1fabe13cece1d503a9987d7f4813c8ad2b6ef2b5e77281113637ace74d9ac41f16f431a1a49e6d8de1b73fe877c5c301fcaac875ca31629041923a1bb014f86a232227c41e1611f5961a0e095c6201ea34a7b7367b0045c3a841d57ebac2a9b323ab21f6d954f4441fc79fd98414e5c4acdbff571108da31d0face012eb149b24bc16de858b4cb8d96fdc0bb614cc2895a6859cdeb086e647983308714da41be9ada21abfbec1ed4d224315017dacf01c5b2a59d18ac5c3b81c9bfd5c031b9929c1dc802a22593bdea39612039601c0e09f64702dde1507e3daef5655b0f1f32e19fcbcbaeea6b495fed05543cbb65010730de65cd66a314cfdbe7474a387045b3000dd43eedc021ed492075d314da6d8c6a3905275d41cdc8758e258c4a71a64d2ba1aec68b7ad68018aa8fdcf97538898c61392ded8e0715ddd471638be54eda62622f5787cafc577da4ff7dda01578982328c51f59ad3d9218eb0d3201d1136d54e7567e15c3f8bc956772bee20f5976b0f343096ab4a0c2b68099bca4d61eff7a078c91875483213f4cd226b587b5c12bf7a41abc9079e274e6229187f4c3cc1a8579f60f2a8112aafa78eaefa765ed7588be97d471720979fa5b907c5b83be30d62d5a2b0b9a59f1330dface4cddd07f591829caac227efef5fe5076e3fa93dc9a787be8f57c3d2ec216342784321c80b956f44dec2d484500371f9a4fdad1de571f16d2cccca13f2f3bb65718dc4a861276d08d11bc72536b787537aa0b26d68462500baa1b5b47a1ff669346481ac5c0d2199d6197dfc9c74cdd6adf13e06223af430e48bcafce9cd8765ae6411d5a3ff2c8827ca2fb9ec63cfd0c84c2e1cc76d2fb0a3f9619034adc3d0fa60b729fa3352433a1f4f2c7bbb51fc61673b61833f70d8700446442d57e0a6fde600fc1cd0d659f8b6b6ca8e320395b831d2b79b95d006c2fc5afb72635535ce1e953d9e70a0022ac9091cb5810450d72edf9bff63c2b64933e0d69881b6ae9c9bc402b11bcd2ca24cea5171ce4040398ba42f87dec9791ac7376adce1cb47be22bc0ba083395b214bf88c5e81357eb95b461c1ea4c814357b5fa7dda0b7083a3360089af604f25927d738dfb3806a559285f04435a9245356051d27cbb0f5c020f40612a4ed7e2d124a8d6dc7d2e39127f5d66bbcad0bd8af4cf173b89283d09c610ec53ffb5b2e0aaedad8700de5555decda90d9b1f022ec0f1cabe3627ea89bb80420d73a60f7f33886541626e5aa0cb758bc9775a80c2427bd9fd373ce1492f90e93d0cd063f1233975d5ae4d732970c686b21850cd4146e5775af2a3b48f6920f021bc91e59b79200bacd2ebef0e2045ae01d7287f14a3ef08de813492f92c6034a7ef9b7a74660125a9761379d3495eb8cbd5e0461a0ae90ac7bb4dd6ee57902158dab0fbe495663b5536ac17e444ea5d6a5ec67f2145d5ac6eb033fe3ed88023133d514073957b3ab9506b375b52ab4e25df97c81f210d2a5d0ac2fd625c00522ee9cecb7dc0c84a47eef9338472bfa766f0bf5919be6a5b56bf5b84f1be1058d570d7ea8f372c5c253c189f006b314d377610bbc9a41fc162b3df3d860d904c74d0451fccecdcb8c0fdb66f55f10a955f49406f16c6ce397b78af25dcbfa001a1cc63df1dfcd2918dba5e64532af7a24f3a95c722815ad2192f488fe8da9080f8c295fdf955dbfe98666d411605e11598745385d7b639d8aed5b5499ffd007143ff548f1f2956da85253ed716d16f7ed1ba3ed100426e2a81dfa2bdd952f06997389359aef4673cff1fcf634c4261c3f8a028c25712896381ef8e88b53ce0996cd93d9bfc6fa1a578554d1b0767962bbfb88f553d5bb129cf18ed93685b50d60d8e13ef8c06f14e7f4fb212ac28be059f83bd3c375220c4368d405ecc9f601a31d48f081ab49014d562c39b464f850af6679daffddb75935f4bdf2d8735a013df11848f92dca8088339595f99024bb766c19e863175c0234157738925e4c0f4b5a83686667e9711547b3a2a96946fc126a026cdfc477de41e6c85835dad80a1a370f59950b9c9759595425609d6371d41801098202cb87ff96fcfb0247730bb2178497eeb94f794d151fd5393082ec7a0359b409b7508303493f749723780159badacf201cb6bf41691ba3ed894dc4a3b22a3a829ff13a349256379e65b108b53c62247b27176ae5d22295393e1856372f1a89fa7d364173647ba296b76c04950e768eec5f38634e8cf3beff55bd7ce266b5bebe5b854a02cad0307b0b670433bdbf8bc2631430773465cb091c7a666709285816e6d503acd5e649045d3c07baad6c71df6b89a0481a1fe7f45f6aa8837625ccb43ed5f9e8e9f7daf2cdee0e7f1baa61b625d9f5d0c9ee49605d403afa625927e9bf41d7e5d48b454dc1520b19e1c35dd25fc5dff641ea05bc2b6b5697485f96bd3664f90077c567923d4f0404107251310935d78e2d06471962f23277b5207500917d528aeef43e2b670c03e614bd3ee3fd58b486a3d0a2494916785325e6546dec8fb880cc401319a7f90b4d3832853ea6e0ae698543e20975eaa9c6606068f2465bade18d110a6937e199229fc569e4dbb09f253fdc89279b76b70f3bf61d6808d7fa8ff438c795464101a97d68d18f240c9d7137f2db1d38013ba94cf478338fa0353b2a5cbf937f00bb", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 108355184, 453559, 345307, 69706, 332083, 151545, 53651, 68733, 30929, 13866, 1671, 5475, 5395, 14903, 2040, 5705\n ], \n \"k_image\": \"f64056280ede74b3b1fe275cf9b9aa1feda77b3b5fd5218d6a765384e3d180ff\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 83051196, 15540196, 8932421, 12092, 738830, 1064475, 338093, 29376, 69424, 72045, 21713, 31314, 406, 1749, 927, 6852\n ], \n \"k_image\": \"4ffd1487bf46e5a1929ca0dd48077cb8ddbff923e74517f1aeb7c54317c0fd68\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"bbb37ea2c935e3c7245150d154748b59bdf280d557779b6cf8063165a7d9b5b9\", \n \"view_tag\": \"21\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"ffc23770cf9e4536c0db95978dbc937d1de339cb8dedf909f5adf7ce6fb8c4ea\", \n \"view_tag\": \"5b\"\n }\n }\n }\n ], \n \"extra\": [ 1, 211, 182, 90, 146, 203, 208, 69, 151, 204, 79, 61, 166, 160, 3, 202, 83, 9, 175, 52, 63, 45, 15, 25, 1, 2, 253, 215, 237, 19, 229, 185, 238, 2, 9, 1, 217, 121, 146, 12, 250, 112, 198, 239\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 44420000, \n \"ecdhInfo\": [ {\n \"amount\": \"e6d4eb51a032a151\"\n }, {\n \"amount\": \"1050389f0d8eafbe\"\n }], \n \"outPk\": [ \"5f91af7e37907d37de11bae31af65af35e1fabe13cece1d503a9987d7f4813c8\", \"ad2b6ef2b5e77281113637ace74d9ac41f16f431a1a49e6d8de1b73fe877c5c3\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"fcaac875ca31629041923a1bb014f86a232227c41e1611f5961a0e095c6201ea\", \n \"A1\": \"34a7b7367b0045c3a841d57ebac2a9b323ab21f6d954f4441fc79fd98414e5c4\", \n \"B\": \"acdbff571108da31d0face012eb149b24bc16de858b4cb8d96fdc0bb614cc289\", \n \"r1\": \"5a6859cdeb086e647983308714da41be9ada21abfbec1ed4d224315017dacf01\", \n \"s1\": \"c5b2a59d18ac5c3b81c9bfd5c031b9929c1dc802a22593bdea39612039601c0e\", \n \"d1\": \"09f64702dde1507e3daef5655b0f1f32e19fcbcbaeea6b495fed05543cbb6501\", \n \"L\": [ \"30de65cd66a314cfdbe7474a387045b3000dd43eedc021ed492075d314da6d8c\", \"6a3905275d41cdc8758e258c4a71a64d2ba1aec68b7ad68018aa8fdcf9753889\", \"8c61392ded8e0715ddd471638be54eda62622f5787cafc577da4ff7dda015789\", \"82328c51f59ad3d9218eb0d3201d1136d54e7567e15c3f8bc956772bee20f597\", \"6b0f343096ab4a0c2b68099bca4d61eff7a078c91875483213f4cd226b587b5c\", \"12bf7a41abc9079e274e6229187f4c3cc1a8579f60f2a8112aafa78eaefa765e\", \"d7588be97d471720979fa5b907c5b83be30d62d5a2b0b9a59f1330dface4cddd\"\n ], \n \"R\": [ \"f591829caac227efef5fe5076e3fa93dc9a787be8f57c3d2ec216342784321c8\", \"0b956f44dec2d484500371f9a4fdad1de571f16d2cccca13f2f3bb65718dc4a8\", \"61276d08d11bc72536b787537aa0b26d68462500baa1b5b47a1ff669346481ac\", \"5c0d2199d6197dfc9c74cdd6adf13e06223af430e48bcafce9cd8765ae6411d5\", \"a3ff2c8827ca2fb9ec63cfd0c84c2e1cc76d2fb0a3f9619034adc3d0fa60b729\", \"fa3352433a1f4f2c7bbb51fc61673b61833f70d8700446442d57e0a6fde600fc\", \"1cd0d659f8b6b6ca8e320395b831d2b79b95d006c2fc5afb72635535ce1e953d\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"9e70a0022ac9091cb5810450d72edf9bff63c2b64933e0d69881b6ae9c9bc402\", \"b11bcd2ca24cea5171ce4040398ba42f87dec9791ac7376adce1cb47be22bc0b\", \"a083395b214bf88c5e81357eb95b461c1ea4c814357b5fa7dda0b7083a336008\", \"9af604f25927d738dfb3806a559285f04435a9245356051d27cbb0f5c020f406\", \"12a4ed7e2d124a8d6dc7d2e39127f5d66bbcad0bd8af4cf173b89283d09c610e\", \"c53ffb5b2e0aaedad8700de5555decda90d9b1f022ec0f1cabe3627ea89bb804\", \"20d73a60f7f33886541626e5aa0cb758bc9775a80c2427bd9fd373ce1492f90e\", \"93d0cd063f1233975d5ae4d732970c686b21850cd4146e5775af2a3b48f6920f\", \"021bc91e59b79200bacd2ebef0e2045ae01d7287f14a3ef08de813492f92c603\", \"4a7ef9b7a74660125a9761379d3495eb8cbd5e0461a0ae90ac7bb4dd6ee57902\", \"158dab0fbe495663b5536ac17e444ea5d6a5ec67f2145d5ac6eb033fe3ed8802\", \"3133d514073957b3ab9506b375b52ab4e25df97c81f210d2a5d0ac2fd625c005\", \"22ee9cecb7dc0c84a47eef9338472bfa766f0bf5919be6a5b56bf5b84f1be105\", \"8d570d7ea8f372c5c253c189f006b314d377610bbc9a41fc162b3df3d860d904\", \"c74d0451fccecdcb8c0fdb66f55f10a955f49406f16c6ce397b78af25dcbfa00\", \"1a1cc63df1dfcd2918dba5e64532af7a24f3a95c722815ad2192f488fe8da908\"], \n \"c1\": \"0f8c295fdf955dbfe98666d411605e11598745385d7b639d8aed5b5499ffd007\", \n \"D\": \"143ff548f1f2956da85253ed716d16f7ed1ba3ed100426e2a81dfa2bdd952f06\"\n }, {\n \"s\": [ \"997389359aef4673cff1fcf634c4261c3f8a028c25712896381ef8e88b53ce09\", \"96cd93d9bfc6fa1a578554d1b0767962bbfb88f553d5bb129cf18ed93685b50d\", \"60d8e13ef8c06f14e7f4fb212ac28be059f83bd3c375220c4368d405ecc9f601\", \"a31d48f081ab49014d562c39b464f850af6679daffddb75935f4bdf2d8735a01\", \"3df11848f92dca8088339595f99024bb766c19e863175c0234157738925e4c0f\", \"4b5a83686667e9711547b3a2a96946fc126a026cdfc477de41e6c85835dad80a\", \"1a370f59950b9c9759595425609d6371d41801098202cb87ff96fcfb0247730b\", \"b2178497eeb94f794d151fd5393082ec7a0359b409b7508303493f7497237801\", \"59badacf201cb6bf41691ba3ed894dc4a3b22a3a829ff13a349256379e65b108\", \"b53c62247b27176ae5d22295393e1856372f1a89fa7d364173647ba296b76c04\", \"950e768eec5f38634e8cf3beff55bd7ce266b5bebe5b854a02cad0307b0b6704\", \"33bdbf8bc2631430773465cb091c7a666709285816e6d503acd5e649045d3c07\", \"baad6c71df6b89a0481a1fe7f45f6aa8837625ccb43ed5f9e8e9f7daf2cdee0e\", \"7f1baa61b625d9f5d0c9ee49605d403afa625927e9bf41d7e5d48b454dc1520b\", \"19e1c35dd25fc5dff641ea05bc2b6b5697485f96bd3664f90077c567923d4f04\", \"04107251310935d78e2d06471962f23277b5207500917d528aeef43e2b670c03\"], \n \"c1\": \"e614bd3ee3fd58b486a3d0a2494916785325e6546dec8fb880cc401319a7f90b\", \n \"D\": \"4d3832853ea6e0ae698543e20975eaa9c6606068f2465bade18d110a6937e199\"\n }], \n \"pseudoOuts\": [ \"229fc569e4dbb09f253fdc89279b76b70f3bf61d6808d7fa8ff438c795464101\", \"a97d68d18f240c9d7137f2db1d38013ba94cf478338fa0353b2a5cbf937f00bb\"]\n }\n}", + "weight": 2221 + },{ + "blob_size": 2348, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 56160000, + "id_hash": "9d1bcbdb17d24a4e615a9af7100da671ab34bffc808da978004dcef86ddf831e", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261653, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261653, + "relayed": true, + "tx_blob": "0200020200108df79b209386c61387df3decb508a9bb05acc3028d9902deaf01bf208d05ac06ac09b014fd05b501de0d45a88adb7fcac982f5f4d8367f84e0f205235f58ad997f5dfa4707192fd3d9e0020010ace4d528efdb8009c5f8ca01a6f859b4a204c6bc24e3c306d68a01b1e203d401cbc6038103cb61840ad204a40f368fbc77179fb30bf07073783f6ef08bfb1a8c096e9bd60bb57aead3b0f3663d03000300b4750401a83c37a01ad5e0a9404faacc1356e0b553d17f31e16e8b8570e86cea0003befd3d4f80d897085c68417d4af03a4c2520b5ff75c400d1d018ec0d4617e6770a00037b2e69e0187086e600aa2ee921c61ff6847ebf80512e5f86c0500a889da2e8205c210147aa7f30ddab6c818f008f074a4a20528d522fbed0be3f581a8f574e697876a00680dee31a0a24de88aa0fcb7e567bad3c08c3a7247b06d68e46efce9940d6036d4b2b7e03c383c26989ac5176cef29aa6592d688747a7bc1989d88311aaad63d60db25d64d04ed7d40ebbbd4b6adeff521ddc60c9b00594381c89b9d9e4afabcff8a906fe5120b70bd38328753d4cee997f92552087ba220aa427758f010c8c7c9eb2e43443be439372d50e3cad3141de924fa118bad635f8105a086eb741d4b609c9a7fca073984dd6b9561b8a5dd0bc1fefd32a839ba25fa34b2c3d5021cd4b2157a936ecd28cbd4ad243876c84a0c09447b0ecfcf216c7c9f7ae6ec8c58d694f185dc9c4d4115e5d8d58dbffec407c39cd455c5842410c92ff9c0107359836b8b462f81e20852f2b14ad81c2931a6bc41097d824d175310f15d7890a99ac8ab0cf3e9cf0048da193a3a7706c824dbc98d3be3c7aee69d296c519380d085c64adc25186867f568afbd0ab351aeaebda94ff0832ea71771c255ff165669495211b42b692e6f6f745365f45baa6af535b6bf4868eb9699d7fd7b5d8a00a4c35bb4a24827cfc8d6f77f56a907a20dc80437a3f9cd3a4a889ad30eae65bfe3481af3a7f398933896be7bb06bce96c64113c3da8732c4f28f0a83b12ebc7ec329627128e8f6332b0c89fc1f18850786f594a7ef566a2970a4c308d5a0a7649dd81890916da41de7d8f74349fdea603f529d6aa77747ef2bda70d02688b4f121399f25ddbed7f3d2fe2cb136daa069b3548c9f0736057b68e249165662f8782f6cdbfe3e6a9eee2623dcb25eb492ad6ad825ae9917453c2772643e8bcb44b8122085661c1ea7185fdabc273bd62dffd938e1bee1b95c6a5940900331254bdb7f0361d66af8aa68615444bc98631b9cbee7ad6fb2c64fa92e42b472b7098acf2564206e152560f919105aee65e4116fd730f6201e639b585a0886262aef0e65db50b3413e399527b6a031081a272c0bdc89516b55107d186038fd8b2641690dbed6148e3084de6599e25bda1c719290dc31742b6863d3fcc57980ccb808215dd17a4b949f725231f2c29eabf7487e7c93bdf92cc5786c5614e77b2d2d10d9b9ccd475a2bf8992c52219480706e5676b40c203ee6799bca4636aeb7011875eb13dc2da7e6a777c7ccf246a19195e7aa4d7a617f0e5b7797a13228abfa6d288799b17702e263aa90ab2883591877afd734279ccf3442e40437401e4a6875b6603bb10db2503ff62c27a6ee89ba54efff4a15c149aae234cbdd165b6acd87f8f68d0408c3357e22b6ac83ea40186091d41ee82a467e6eedfb81065e1a6261493572820bb3a02732c48afe03a04344e108a16c6ed9b57f8bc70c0373c14e02aa58c39d081b9d63df16411a24065419e149dd5cf0d16c361d52077e372668658217ae0008052f944bf07460dc2650b271abbd3470f9d9f1151915b47f4e843c2cb66e8104b954b9b11711f668d700a7e8e73bba0e1f3325c7ee168c2e52fbbc42a9a37c0a5acfbd247117d89d3dec678cd2f1e5a358adba45cd96eb83bdefa574fe7ee70462e723e878f558b4ff133353015d12039d88ff4e4a42542274a29eec9d48f606f819b255f796a383db4db031d966f0512c0be65bcb570be40c5afeb301ced60bbd96cb11101317b582c5a4938f4b42aa4e4764923917fe03a849783821052701b601b95768bf304145239a0dcad54850a49431706b58139f92ab1aff4083ce021da8fbb5e19ef43bdcb40a61b67d615fdcc7d1ef9937efe0f64c65a6fc7d3a0f656bc19201f87d279c7dec96160b8cd0001f5064609b3561259728e19b5da20e57181f2d5e36ab9edc5fe93b71fde30f262d4e60525df697dcd66d45f079da0e5d95974c8bff7e89d06a64c25714eaa1b65522218c996c7ddb6cf902519f340524e084e6b195f994bc9be4cbfd8e6e9c5a1e00551148e1f8b6c154b2115b1f088c5ab9747f5d6f49a819f0eb06a4277090292c3b14f219196d91a3d8333b11278b5ca04440eb42f46cca567d8a2c3e9fd2880078544e47a6e932a828b494a7056038560559de1bdefeda1e9da672b6e931f22d530a7dd7ff8586184b5d593d0ebed9c5263818225fb9db1e64cbfc0174f872a3ea5e92f314c87b96daa8e7a400742ea90a1c357194d610b998a0c07dbad2bd2541158439be096b8f59ad7dcc073345072ecdb181af27eecaa21642d23abca25c1cd6a45daec5d423c8c002f60a99e4218d23ae7bd8055f9d473a8de7a36d5c00c64eea4be99c751655ab904604992a602c49416d56179835e3c6c5d0e89aca53a372dc61cfd9d105c7c0bdeb02765e41608cec6275ba3b7c19f2dcecd8cf7c02eed764b953066535c9395ba50ea8e8223b185992e646d89d4ab71009b3244dd2c2949d98557b21ad8cd2f03d0f140613a8e1366fe9d73e2282e471274b7304b94dc5a99a84411c5504b86176042351e695642aa3608fb3c413e7221b153d2ba3c0f8adca0d9636b3f95922ed040c19b92c35505041a39b8c9492c08577c9689bebbf1955827ab7298779d9d50b861f800ae0baa6761569a92e7b74d2d9dde4d8c98ffb37737edba691f4c94a0c78ef2c281ffe9c1d7f290cc7c60efd992f2b436c73b04f920984a1e8b8256a053d938f9f385b823aeee4f760e7c4346a3be6921700c433664d6806deaa3a6c039a1dc227d0fb1d07b26156b4b998053b2d07e037c024eb305212852edea364010936723eed3db539fd792c5acfe56bf2444998a107cff83eb7e37504b05c990f78111416918e784305b77030f0e2a14124afce9bf4d285c09a77264b2cf85e7fe99253575d3a7dbca07223afc25c085bc2e45aea9b399d58339b4ac1edfcd5e9ef14d6f64ab94d4f94eca4765dfabac9c91a423283387f51301a31d35de5b61d", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 67566477, 40993555, 1011591, 137964, 89513, 41388, 35981, 22494, 4159, 653, 812, 1196, 2608, 765, 181, 1758\n ], \n \"k_image\": \"45a88adb7fcac982f5f4d8367f84e0f205235f58ad997f5dfa4707192fd3d9e0\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 85291564, 18886127, 3324997, 1473574, 69940, 597574, 106979, 17750, 61745, 212, 58187, 385, 12491, 1284, 594, 1956\n ], \n \"k_image\": \"368fbc77179fb30bf07073783f6ef08bfb1a8c096e9bd60bb57aead3b0f3663d\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"00b4750401a83c37a01ad5e0a9404faacc1356e0b553d17f31e16e8b8570e86c\", \n \"view_tag\": \"ea\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"befd3d4f80d897085c68417d4af03a4c2520b5ff75c400d1d018ec0d4617e677\", \n \"view_tag\": \"0a\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"7b2e69e0187086e600aa2ee921c61ff6847ebf80512e5f86c0500a889da2e820\", \n \"view_tag\": \"5c\"\n }\n }\n }\n ], \n \"extra\": [ 1, 71, 170, 127, 48, 221, 171, 108, 129, 143, 0, 143, 7, 74, 74, 32, 82, 141, 82, 47, 190, 208, 190, 63, 88, 26, 143, 87, 78, 105, 120, 118, 160\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 56160000, \n \"ecdhInfo\": [ {\n \"amount\": \"0a24de88aa0fcb7e\"\n }, {\n \"amount\": \"567bad3c08c3a724\"\n }, {\n \"amount\": \"7b06d68e46efce99\"\n }], \n \"outPk\": [ \"40d6036d4b2b7e03c383c26989ac5176cef29aa6592d688747a7bc1989d88311\", \"aaad63d60db25d64d04ed7d40ebbbd4b6adeff521ddc60c9b00594381c89b9d9\", \"e4afabcff8a906fe5120b70bd38328753d4cee997f92552087ba220aa427758f\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"0c8c7c9eb2e43443be439372d50e3cad3141de924fa118bad635f8105a086eb7\", \n \"A1\": \"41d4b609c9a7fca073984dd6b9561b8a5dd0bc1fefd32a839ba25fa34b2c3d50\", \n \"B\": \"21cd4b2157a936ecd28cbd4ad243876c84a0c09447b0ecfcf216c7c9f7ae6ec8\", \n \"r1\": \"c58d694f185dc9c4d4115e5d8d58dbffec407c39cd455c5842410c92ff9c0107\", \n \"s1\": \"359836b8b462f81e20852f2b14ad81c2931a6bc41097d824d175310f15d7890a\", \n \"d1\": \"99ac8ab0cf3e9cf0048da193a3a7706c824dbc98d3be3c7aee69d296c519380d\", \n \"L\": [ \"5c64adc25186867f568afbd0ab351aeaebda94ff0832ea71771c255ff1656694\", \"95211b42b692e6f6f745365f45baa6af535b6bf4868eb9699d7fd7b5d8a00a4c\", \"35bb4a24827cfc8d6f77f56a907a20dc80437a3f9cd3a4a889ad30eae65bfe34\", \"81af3a7f398933896be7bb06bce96c64113c3da8732c4f28f0a83b12ebc7ec32\", \"9627128e8f6332b0c89fc1f18850786f594a7ef566a2970a4c308d5a0a7649dd\", \"81890916da41de7d8f74349fdea603f529d6aa77747ef2bda70d02688b4f1213\", \"99f25ddbed7f3d2fe2cb136daa069b3548c9f0736057b68e249165662f8782f6\", \"cdbfe3e6a9eee2623dcb25eb492ad6ad825ae9917453c2772643e8bcb44b8122\"\n ], \n \"R\": [ \"5661c1ea7185fdabc273bd62dffd938e1bee1b95c6a5940900331254bdb7f036\", \"1d66af8aa68615444bc98631b9cbee7ad6fb2c64fa92e42b472b7098acf25642\", \"06e152560f919105aee65e4116fd730f6201e639b585a0886262aef0e65db50b\", \"3413e399527b6a031081a272c0bdc89516b55107d186038fd8b2641690dbed61\", \"48e3084de6599e25bda1c719290dc31742b6863d3fcc57980ccb808215dd17a4\", \"b949f725231f2c29eabf7487e7c93bdf92cc5786c5614e77b2d2d10d9b9ccd47\", \"5a2bf8992c52219480706e5676b40c203ee6799bca4636aeb7011875eb13dc2d\", \"a7e6a777c7ccf246a19195e7aa4d7a617f0e5b7797a13228abfa6d288799b177\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"02e263aa90ab2883591877afd734279ccf3442e40437401e4a6875b6603bb10d\", \"b2503ff62c27a6ee89ba54efff4a15c149aae234cbdd165b6acd87f8f68d0408\", \"c3357e22b6ac83ea40186091d41ee82a467e6eedfb81065e1a6261493572820b\", \"b3a02732c48afe03a04344e108a16c6ed9b57f8bc70c0373c14e02aa58c39d08\", \"1b9d63df16411a24065419e149dd5cf0d16c361d52077e372668658217ae0008\", \"052f944bf07460dc2650b271abbd3470f9d9f1151915b47f4e843c2cb66e8104\", \"b954b9b11711f668d700a7e8e73bba0e1f3325c7ee168c2e52fbbc42a9a37c0a\", \"5acfbd247117d89d3dec678cd2f1e5a358adba45cd96eb83bdefa574fe7ee704\", \"62e723e878f558b4ff133353015d12039d88ff4e4a42542274a29eec9d48f606\", \"f819b255f796a383db4db031d966f0512c0be65bcb570be40c5afeb301ced60b\", \"bd96cb11101317b582c5a4938f4b42aa4e4764923917fe03a849783821052701\", \"b601b95768bf304145239a0dcad54850a49431706b58139f92ab1aff4083ce02\", \"1da8fbb5e19ef43bdcb40a61b67d615fdcc7d1ef9937efe0f64c65a6fc7d3a0f\", \"656bc19201f87d279c7dec96160b8cd0001f5064609b3561259728e19b5da20e\", \"57181f2d5e36ab9edc5fe93b71fde30f262d4e60525df697dcd66d45f079da0e\", \"5d95974c8bff7e89d06a64c25714eaa1b65522218c996c7ddb6cf902519f3405\"], \n \"c1\": \"24e084e6b195f994bc9be4cbfd8e6e9c5a1e00551148e1f8b6c154b2115b1f08\", \n \"D\": \"8c5ab9747f5d6f49a819f0eb06a4277090292c3b14f219196d91a3d8333b1127\"\n }, {\n \"s\": [ \"8b5ca04440eb42f46cca567d8a2c3e9fd2880078544e47a6e932a828b494a705\", \"6038560559de1bdefeda1e9da672b6e931f22d530a7dd7ff8586184b5d593d0e\", \"bed9c5263818225fb9db1e64cbfc0174f872a3ea5e92f314c87b96daa8e7a400\", \"742ea90a1c357194d610b998a0c07dbad2bd2541158439be096b8f59ad7dcc07\", \"3345072ecdb181af27eecaa21642d23abca25c1cd6a45daec5d423c8c002f60a\", \"99e4218d23ae7bd8055f9d473a8de7a36d5c00c64eea4be99c751655ab904604\", \"992a602c49416d56179835e3c6c5d0e89aca53a372dc61cfd9d105c7c0bdeb02\", \"765e41608cec6275ba3b7c19f2dcecd8cf7c02eed764b953066535c9395ba50e\", \"a8e8223b185992e646d89d4ab71009b3244dd2c2949d98557b21ad8cd2f03d0f\", \"140613a8e1366fe9d73e2282e471274b7304b94dc5a99a84411c5504b8617604\", \"2351e695642aa3608fb3c413e7221b153d2ba3c0f8adca0d9636b3f95922ed04\", \"0c19b92c35505041a39b8c9492c08577c9689bebbf1955827ab7298779d9d50b\", \"861f800ae0baa6761569a92e7b74d2d9dde4d8c98ffb37737edba691f4c94a0c\", \"78ef2c281ffe9c1d7f290cc7c60efd992f2b436c73b04f920984a1e8b8256a05\", \"3d938f9f385b823aeee4f760e7c4346a3be6921700c433664d6806deaa3a6c03\", \"9a1dc227d0fb1d07b26156b4b998053b2d07e037c024eb305212852edea36401\"], \n \"c1\": \"0936723eed3db539fd792c5acfe56bf2444998a107cff83eb7e37504b05c990f\", \n \"D\": \"78111416918e784305b77030f0e2a14124afce9bf4d285c09a77264b2cf85e7f\"\n }], \n \"pseudoOuts\": [ \"e99253575d3a7dbca07223afc25c085bc2e45aea9b399d58339b4ac1edfcd5e9\", \"ef14d6f64ab94d4f94eca4765dfabac9c91a423283387f51301a31d35de5b61d\"]\n }\n}", + "weight": 2808 + },{ + "blob_size": 2387, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 116500000, + "id_hash": "dbabb82a5f97d9da58d587c179b5861576144ea0cd14b96bef62b83d8838f363", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261653, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261653, + "relayed": true, + "tx_blob": "020001020010df97d533d1c51185e031f69e08adce05b0aa06fb8a03b137895afb14c08e02b0549c1af60da305cb1f6d80d9c12f1439b0a994f767d71d98d2d2cde1a54c6a6134a00c2f07135d98cf0b0003e205de62fdbf4ff1b6554e3180bfd09051e368d70a5739bc039d864eea9d355da60003dacd0606c42ee249c304393e3169de7baacc28a9ff94240b603c54b0238d542d11000324dffd0f9dfb98b459a463f1c62df0d5ec76ad3781c41d5a65bdce94dc43aa5e5b0003631aff9f6291c9890f02a667c976b7e13bce27d443d00bda47d72d32ca2eacff40000360ba12b274ebbfe8f74abfe132a02a4a91e96f2f5db3b5772e5bab2e1066015959000348e42fd446643b5ab32024d193050ad976173b0ce43cc33add718167b0d99b33ac000356a51fe30876666e834c9741ee4e4fcbd08372005319f58cdc1a46bd98db5dec4b0003421637f078091694b19f1d2d3691a2ba8fe38198a808d0bd38f4202270d5b47dbb0003b42ff611a9b780b8e4afc2958d059013c55512102b3f6d7b6f30f4da75c5bbbb340003c3253ebf1a9125a52b9a7d4fca7d29cc41c701aefd7b8d5caa6ca02a128a0433cf00030fbe7d06b657e84ffa29bcb937a649a647cc1e967fdeb3a1c7a00f2e72faddbbaf21016b391fa654bc1e4141eec1d8a55bfbe363d9632b56dd4c7393b7b1f8934932e506a0ccc6376dad44ee6f7e9686a70f600a18341bd60dcbe99a71bc8a05eb8f5ad01274c1590bb0e0848ccd0872e311b24115067be37fa3244c7785ce295d3eaff88e7bd50450bcfe9aebd902dbf3fd4d3d5f5deaa8f5517e89834007556c99f923978cb868d155d761085d03d11684d6d75b79e461da935fe8b8ccff02aaba98f24626e21abd6b7cee23ff35c800e99b7b8719b7adcf2987f61a51c7e81728cfab8ac5ec5fa22a10dbd58ae64976b188860a88ea9a7ea3ce49cc5460168c355de58788139c74011a95e49b0d91e6e033be4f212573cae4ae8b77c7f59e727f4ff9ef5045de7a733c53eb98c57bf4c643a1183da886f66d7984e4559192c1de69533b7777e5da4290431063f42b9f900f82564deffb967e214eb22c6835fda6a27569c7211b2ccf9602046049c5b72ed13a70193cec07dc1336b609c575b4dd58693376a102246f13508d44c88dec158b3a9b263bf8557818979f7a833f758602ffc62037d78994082ea998cd1b4944ebed5a3cba2f3e19dcc7f9bfc96901a60c2293b2949b0e9d3b84260d2f6085c628ba1a0fbfaab1611bdad0ec39ba599342f1de56d2beb0930aea3ef3f446ebf52bf5c0cc89566a68ca68ad05f9cb012acf619b5da2f005a99b98d6ab1244a4458435fdd4ba5aabab8884eede69ee25d063c5e054a0763bd8e6cad5859a1f54d5d280af664cd2b3ab6a8ba944e2858bc9979f63b12e75b3a647fcb31e8796502947ada7d65526c74f70e2ff4820e599a03200a8bc6475cde069c7e90a9fda27d204a8c01c10706f1fec6c791d6e6d05707f92d85119d8b54b5818e894ddc4e5ce45612e601094aca90fac825b8f13060b9cf42dc96310520835ddff845dd782508fd8b73d99613d425323b206d3ae060a6ae9c2bf3c383f11392df4b0cdb537c62e618cd97de259135abc4de9fc3fa1e9d64eaa642cdd7d6a6e3f2208ed76771b2be4a2416e53c15f1e3bd7eee3ec3e92f6ceb61873e03d5ac5f2bf583fb5f86453310e232a2620a6bfa4cfb4981b533b8625b08e0938291ba52a9850629e3097bfef1b3764c73643ade61a8d425d3f2da30df56d9fd7c736efe223b158ed49114e1eb8e616a2ef47d673c8ed52b2d94c5c25ebab35e7e0512aa8d9a48c01ece39a0dd29125cafa904e1a33cca56d64ea06551895fa1f1691674216e56eca2ac8ba84da58eac436746fe39e028815dd812f19d8236dadccbc23378bece2a78a8cf6ce42a40d7e97ac095f2fbe3c769eb5674359a42c69eba31b8952c54fcc90ef3f141acb32d9f4f7d88c0d416d541aa2300560059f8f8ed209d935b3e26185f387ebc5f0ac4a279b661a97f13da023010afcc6f7d3542ee9511acf4ff6782d5f516ebcb08f76ef089cfbca6012001893bb8ef584c963ec50d1249f063d3a138a836e98fd3c845b15d97e819e60fc8b7298bb52ac2e31690570e777e3a18b0d2d30e9219d4c53ad018c05f9150963045dfacd472e1d89929f4df50429794c4214bd02cf7ef7a1dbac9bd7d882748c36ade1c99a664e1ebf3b88c9f2af6b0facadce56c11ee6e7f9bb642d612952642a2e584bc487bae947cac5301fb28e8635b282d5aeb999ac21fe3060a351649c00ed98646e663edab73c1d545771f1e85919b2d89ba44149a086e188ecaec21f5ecebe04198c506cae6da01a2413e414d2aaa0309f16c8afb17b146577f41fc383957d8ab02506d67795f41c6709c5cba79a14fa32842c4e38e9d97b0c69500f9dffcf78e6aa8232f46e7f6b2e402d0a5ee548a0e503be9b789a08803e0970f2d745249fbc34dc464b3ae4d5ba8b98946e3201fb1d9185507aae2a77e129394c8b64071d658e5eff25510bd2becae400f2db0a865a4a6fd55fbe6ea016f1370eab2d0090eddd7545194e0b3fce7cab06c968a6bd17cc848f5d3d20a26f5dccd004e803839d366680832ed1290ed6469f0a75a5ef9a35c426381a9372d4f0cddd77370d506ec1d7573950192844f4f3fe1089077dc6faa84d6513eb75621f5ade8eff0bceba99fa0b988daa13fe0c7fd15d85f050a339d447581c8459db9833952e710ae6c97b50495765c8d034d821da26bb950c6d379b923ba2482ae700098579400f3337c5898f002ab7832e258e3ead08da9c71bcde6449a5cacd506b6977549b08ffcdd6d90ce4f0b06e36f0b1c61055211284292df52d88532ade8962e3679f0e313298b6a931e790e641d5176247e5dcfa715134624e4bca5dfd92259cacd907014bf9138373942890180ea291a80e2594d0c062d1826dce12d4167bb10cd30a90cd211a857b80f7c1887c1ce14aa8124ede4b989f3520cce7011978b955cf030c76902a5b22867f9c3d47e8523c9cfd8a4d97ad2592f1debea8c30a7856bf04a435b617fd6b6a78ee5bd65e354f1b6ca5a21fc66d399e4debb8c2a97acc07048967d4c0fa15746f102312f0fd1f8ea851ee133282cba0f1f439408f2742df0af040c7e3ec8e5a0deeb6e952316fa300d986c29986cfb6293b90f5dac8a9760e2c8178c818aa7a44292f3129578d6bead21638d57b020709f39379f3b579cc0ae6aa3044eb12eb2487b34119b5f3ed92fc020406eaa991cf0a51c60cb1b7789afa8610e6d02955b7063068ebc5b481d70f39e570e880cd8551eaa333670fb213", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 108350431, 287441, 815109, 135030, 91949, 103728, 50555, 7089, 11529, 2683, 34624, 10800, 3356, 1782, 675, 4043\n ], \n \"k_image\": \"6d80d9c12f1439b0a994f767d71d98d2d2cde1a54c6a6134a00c2f07135d98cf\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"e205de62fdbf4ff1b6554e3180bfd09051e368d70a5739bc039d864eea9d355d\", \n \"view_tag\": \"a6\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"dacd0606c42ee249c304393e3169de7baacc28a9ff94240b603c54b0238d542d\", \n \"view_tag\": \"11\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"24dffd0f9dfb98b459a463f1c62df0d5ec76ad3781c41d5a65bdce94dc43aa5e\", \n \"view_tag\": \"5b\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"631aff9f6291c9890f02a667c976b7e13bce27d443d00bda47d72d32ca2eacff\", \n \"view_tag\": \"40\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"60ba12b274ebbfe8f74abfe132a02a4a91e96f2f5db3b5772e5bab2e10660159\", \n \"view_tag\": \"59\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"48e42fd446643b5ab32024d193050ad976173b0ce43cc33add718167b0d99b33\", \n \"view_tag\": \"ac\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"56a51fe30876666e834c9741ee4e4fcbd08372005319f58cdc1a46bd98db5dec\", \n \"view_tag\": \"4b\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"421637f078091694b19f1d2d3691a2ba8fe38198a808d0bd38f4202270d5b47d\", \n \"view_tag\": \"bb\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"b42ff611a9b780b8e4afc2958d059013c55512102b3f6d7b6f30f4da75c5bbbb\", \n \"view_tag\": \"34\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"c3253ebf1a9125a52b9a7d4fca7d29cc41c701aefd7b8d5caa6ca02a128a0433\", \n \"view_tag\": \"cf\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"0fbe7d06b657e84ffa29bcb937a649a647cc1e967fdeb3a1c7a00f2e72faddbb\", \n \"view_tag\": \"af\"\n }\n }\n }\n ], \n \"extra\": [ 1, 107, 57, 31, 166, 84, 188, 30, 65, 65, 238, 193, 216, 165, 91, 251, 227, 99, 217, 99, 43, 86, 221, 76, 115, 147, 183, 177, 248, 147, 73, 50, 229\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 116500000, \n \"ecdhInfo\": [ {\n \"amount\": \"6dad44ee6f7e9686\"\n }, {\n \"amount\": \"a70f600a18341bd6\"\n }, {\n \"amount\": \"0dcbe99a71bc8a05\"\n }, {\n \"amount\": \"eb8f5ad01274c159\"\n }, {\n \"amount\": \"0bb0e0848ccd0872\"\n }, {\n \"amount\": \"e311b24115067be3\"\n }, {\n \"amount\": \"7fa3244c7785ce29\"\n }, {\n \"amount\": \"5d3eaff88e7bd504\"\n }, {\n \"amount\": \"50bcfe9aebd902db\"\n }, {\n \"amount\": \"f3fd4d3d5f5deaa8\"\n }, {\n \"amount\": \"f5517e8983400755\"\n }], \n \"outPk\": [ \"6c99f923978cb868d155d761085d03d11684d6d75b79e461da935fe8b8ccff02\", \"aaba98f24626e21abd6b7cee23ff35c800e99b7b8719b7adcf2987f61a51c7e8\", \"1728cfab8ac5ec5fa22a10dbd58ae64976b188860a88ea9a7ea3ce49cc546016\", \"8c355de58788139c74011a95e49b0d91e6e033be4f212573cae4ae8b77c7f59e\", \"727f4ff9ef5045de7a733c53eb98c57bf4c643a1183da886f66d7984e4559192\", \"c1de69533b7777e5da4290431063f42b9f900f82564deffb967e214eb22c6835\", \"fda6a27569c7211b2ccf9602046049c5b72ed13a70193cec07dc1336b609c575\", \"b4dd58693376a102246f13508d44c88dec158b3a9b263bf8557818979f7a833f\", \"758602ffc62037d78994082ea998cd1b4944ebed5a3cba2f3e19dcc7f9bfc969\", \"01a60c2293b2949b0e9d3b84260d2f6085c628ba1a0fbfaab1611bdad0ec39ba\", \"599342f1de56d2beb0930aea3ef3f446ebf52bf5c0cc89566a68ca68ad05f9cb\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"2acf619b5da2f005a99b98d6ab1244a4458435fdd4ba5aabab8884eede69ee25\", \n \"A1\": \"d063c5e054a0763bd8e6cad5859a1f54d5d280af664cd2b3ab6a8ba944e2858b\", \n \"B\": \"c9979f63b12e75b3a647fcb31e8796502947ada7d65526c74f70e2ff4820e599\", \n \"r1\": \"a03200a8bc6475cde069c7e90a9fda27d204a8c01c10706f1fec6c791d6e6d05\", \n \"s1\": \"707f92d85119d8b54b5818e894ddc4e5ce45612e601094aca90fac825b8f1306\", \n \"d1\": \"0b9cf42dc96310520835ddff845dd782508fd8b73d99613d425323b206d3ae06\", \n \"L\": [ \"6ae9c2bf3c383f11392df4b0cdb537c62e618cd97de259135abc4de9fc3fa1e9\", \"d64eaa642cdd7d6a6e3f2208ed76771b2be4a2416e53c15f1e3bd7eee3ec3e92\", \"f6ceb61873e03d5ac5f2bf583fb5f86453310e232a2620a6bfa4cfb4981b533b\", \"8625b08e0938291ba52a9850629e3097bfef1b3764c73643ade61a8d425d3f2d\", \"a30df56d9fd7c736efe223b158ed49114e1eb8e616a2ef47d673c8ed52b2d94c\", \"5c25ebab35e7e0512aa8d9a48c01ece39a0dd29125cafa904e1a33cca56d64ea\", \"06551895fa1f1691674216e56eca2ac8ba84da58eac436746fe39e028815dd81\", \"2f19d8236dadccbc23378bece2a78a8cf6ce42a40d7e97ac095f2fbe3c769eb5\", \"674359a42c69eba31b8952c54fcc90ef3f141acb32d9f4f7d88c0d416d541aa2\", \"300560059f8f8ed209d935b3e26185f387ebc5f0ac4a279b661a97f13da02301\"\n ], \n \"R\": [ \"fcc6f7d3542ee9511acf4ff6782d5f516ebcb08f76ef089cfbca6012001893bb\", \"8ef584c963ec50d1249f063d3a138a836e98fd3c845b15d97e819e60fc8b7298\", \"bb52ac2e31690570e777e3a18b0d2d30e9219d4c53ad018c05f9150963045dfa\", \"cd472e1d89929f4df50429794c4214bd02cf7ef7a1dbac9bd7d882748c36ade1\", \"c99a664e1ebf3b88c9f2af6b0facadce56c11ee6e7f9bb642d612952642a2e58\", \"4bc487bae947cac5301fb28e8635b282d5aeb999ac21fe3060a351649c00ed98\", \"646e663edab73c1d545771f1e85919b2d89ba44149a086e188ecaec21f5ecebe\", \"04198c506cae6da01a2413e414d2aaa0309f16c8afb17b146577f41fc383957d\", \"8ab02506d67795f41c6709c5cba79a14fa32842c4e38e9d97b0c69500f9dffcf\", \"78e6aa8232f46e7f6b2e402d0a5ee548a0e503be9b789a08803e0970f2d74524\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"9fbc34dc464b3ae4d5ba8b98946e3201fb1d9185507aae2a77e129394c8b6407\", \"1d658e5eff25510bd2becae400f2db0a865a4a6fd55fbe6ea016f1370eab2d00\", \"90eddd7545194e0b3fce7cab06c968a6bd17cc848f5d3d20a26f5dccd004e803\", \"839d366680832ed1290ed6469f0a75a5ef9a35c426381a9372d4f0cddd77370d\", \"506ec1d7573950192844f4f3fe1089077dc6faa84d6513eb75621f5ade8eff0b\", \"ceba99fa0b988daa13fe0c7fd15d85f050a339d447581c8459db9833952e710a\", \"e6c97b50495765c8d034d821da26bb950c6d379b923ba2482ae700098579400f\", \"3337c5898f002ab7832e258e3ead08da9c71bcde6449a5cacd506b6977549b08\", \"ffcdd6d90ce4f0b06e36f0b1c61055211284292df52d88532ade8962e3679f0e\", \"313298b6a931e790e641d5176247e5dcfa715134624e4bca5dfd92259cacd907\", \"014bf9138373942890180ea291a80e2594d0c062d1826dce12d4167bb10cd30a\", \"90cd211a857b80f7c1887c1ce14aa8124ede4b989f3520cce7011978b955cf03\", \"0c76902a5b22867f9c3d47e8523c9cfd8a4d97ad2592f1debea8c30a7856bf04\", \"a435b617fd6b6a78ee5bd65e354f1b6ca5a21fc66d399e4debb8c2a97acc0704\", \"8967d4c0fa15746f102312f0fd1f8ea851ee133282cba0f1f439408f2742df0a\", \"f040c7e3ec8e5a0deeb6e952316fa300d986c29986cfb6293b90f5dac8a9760e\"], \n \"c1\": \"2c8178c818aa7a44292f3129578d6bead21638d57b020709f39379f3b579cc0a\", \n \"D\": \"e6aa3044eb12eb2487b34119b5f3ed92fc020406eaa991cf0a51c60cb1b7789a\"\n }], \n \"pseudoOuts\": [ \"fa8610e6d02955b7063068ebc5b481d70f39e570e880cd8551eaa333670fb213\"]\n }\n}", + "weight": 5817 + },{ + "blob_size": 1664, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 42480000, + "id_hash": "3fd963b931b1ac20e3709ba0249143fe8cff4856200055336ba9330970e6306a", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261660, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261660, + "relayed": true, + "tx_blob": "020001020010cfc19c31d9c65acfdb1bcfb91dd6e00aa7c2b601e2b51489e01ab3cd038e99039aa705c0f806ba2ffc1da40ba002913f889441c829e62c741c27614cdbb6278555b768fbd583424e1bb45c65e43b030003ad696cce55ac392f061b7e0f1acccbd17cbdfc11d20805df2ee8efb087476ed59c000357483f9fa7379f9b72e6149fd2b319c4e60653a627d0107d73f5604159d597ebf000034360e4f9cfb1109148e0b8428c36fa62270e4aa68e6aabd768270363b53a195acc210173c64bf5cd3e9f401a3800c9624c45f8e9408163348c4e2c473b88f610874eff0680e3a01479bce24f3573dbafaae47cc85d8723551119c984e226cab7daa8193188e5b32952ea0a464812c5f1189db475fe78ad4a6351e7d335a79163d9bd1c7b680e62a0ef36e83b122965bf6042bef9cf535da9286ea586681c4bef225c49f8f54b6b1a92a4a2d53c699fd021e1d2cf9ae75729ba7cf244a0264cf901fd2a5b8b2a2016880735d531b55fa6e206cc0c0d5177c93d10e2f60fadde3bebebf7ff3558e9949869a8401f4174a6e2e6092074d44b2665008391bcef3be3b38dcbb6f45f57379ba40acdffb81ffc8a3d312c6b728eff17a8c8f15d49f1517aca615e2f8bc5257f7b7a27cd455c633a400b6ff63f58d7c66c1172e1e56ef30e4edf1f17a43bd06754bcc657391acef09cbc15d6b827e61cfa8f6e33a4f7ce0837c0edf5a192c739ca6c8da976af9a1fa2ca1649024639f6c26e09dd01489b0a08e64e75e0dd89bd999cdaf72f1334263b2daa2b27b593951c8ea7781d7f4479fa8b24c4e3e7d02de85eb0144aa0e26be30c4a283db27c5b488ee4895345f81a51b54741caf457eef595c9753aa58d82d45182325aea6d77198090e8e14fd413620fcb3a7750dcb87178431ed8b4b23f39fd893c1e500dce31de0bf1861540e212e1263d567951d7c73e3f082a9fd7086aba9b58fbbbf61783fda9d037afa96250fe234734c186422495f5d5db92690958e43e5fd5ec5e302537d3353950f5a8e2a65a13ea58137481ebc02768f12ba06d4c3a58cc3f2725567a544434acc7934c87eff281268d9495670dc73032cab96056aeeda57fb16e153074dbe5b490ee2608d4ee6684886fec29e4f03741b6cfeb7bf468eca760fdf20085df50309f6942585ded84a963d18448029d3990a43ad3ba730b70193b7195961375390863ef0e721f26495ea684c129a7bfe0b58837269c2f3b9ed5697b4e5f50205e1699086db0d89e441c287e7aff567135d73a6724f206a15909cf4505c99a1ece8d2d44197ec9c2d28ca55008ba1819f7092e694e0048502dd937674b825e8325ccf06d2257e50dccf6d450f07a040def2b0af67d7a9ca8d54179bf474b11f3e0342b92e6f0d5c2c5b01dd7769f3651c5a5b7e4af34428cfd9429ecf373cc409db223a3f81075b8d10b0e409336f9922b0acc60780ed8c7e6916eafa813e486f678133c7c287040847e31fae2ed636fc2830394ecfef0c93ae4a380394907018dfdcf9814083efcaee92919e11f36ec098917436902e5752d62d43e054178b9cb6a66e7d4087b234f9f3fff46cdec0fd531ab50b82ffbbcf22171250fd8ce8015e6ccb940022ee8c5d7a0d10186b416c51c3370b0300f54651accfbebd3ac3e4a22ebbf2409b5e7ebc40dae1be188c5208668d6216d1cdb0552541c27fc6b9f770aa6fa2e0f50eedef2110162cd67b027348beb3865d40b71dfcd4bb02caa5d85454868f8071d6fda35f3729b3fdf7041ae02302733ed00dafdbb91e81d304daa7a99e0350ed8967cea2637fddda63bb273ed406be7ee694bff1fb5a0cdbf792fe25da78d0be68bff0add3f8868ece66332a446415da39994ed247606a7951ccbe639006008a2796c33bb8d53f64de030b7618deac7e15fc6b53bea8f04b30d244007e6b805a5c6a79cfa5e75c89eb96b298fe5f3722c9ab5219b839a6a88999d288913d9025d07125c47cc210f19bf42dc7edd84d62fd4d6ebfba9d865c8909477d5aa98047b12e6430d55c9f19d9ee5fe6020cb0fd4604ff5999ef3e8904d6016f99334035c1a93efd452b75925209e0eabbefade7d92f8ed581135d87f791170b3dd7b024eb818dba8ccfb23e897c6edc986ac47cd95292156e50c06797f9d9e552e3e01ac75a709909f7650bb41125bda22a768d3673bb7a28cf418514fbde82c3cc7035c483ea223a5c017b42873aca5381b7d4926c47d6ac62e8289a4bfe1f72751049b04cbacc98c9796300170897711eab28348eb4c73fc31ba3fc82d0043a67d628e9f3dc440a410d0dbe2c8c3c46caf95165cc82f3716f56fd0a6c3b187e1f892", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 103227599, 1483609, 454095, 482511, 176214, 2990375, 334562, 438281, 59059, 52366, 86938, 113728, 6074, 3836, 1444, 288\n ], \n \"k_image\": \"913f889441c829e62c741c27614cdbb6278555b768fbd583424e1bb45c65e43b\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"ad696cce55ac392f061b7e0f1acccbd17cbdfc11d20805df2ee8efb087476ed5\", \n \"view_tag\": \"9c\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"57483f9fa7379f9b72e6149fd2b319c4e60653a627d0107d73f5604159d597eb\", \n \"view_tag\": \"f0\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"4360e4f9cfb1109148e0b8428c36fa62270e4aa68e6aabd768270363b53a195a\", \n \"view_tag\": \"cc\"\n }\n }\n }\n ], \n \"extra\": [ 1, 115, 198, 75, 245, 205, 62, 159, 64, 26, 56, 0, 201, 98, 76, 69, 248, 233, 64, 129, 99, 52, 140, 78, 44, 71, 59, 136, 246, 16, 135, 78, 255\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 42480000, \n \"ecdhInfo\": [ {\n \"amount\": \"79bce24f3573dbaf\"\n }, {\n \"amount\": \"aae47cc85d872355\"\n }, {\n \"amount\": \"1119c984e226cab7\"\n }], \n \"outPk\": [ \"daa8193188e5b32952ea0a464812c5f1189db475fe78ad4a6351e7d335a79163\", \"d9bd1c7b680e62a0ef36e83b122965bf6042bef9cf535da9286ea586681c4bef\", \"225c49f8f54b6b1a92a4a2d53c699fd021e1d2cf9ae75729ba7cf244a0264cf9\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"fd2a5b8b2a2016880735d531b55fa6e206cc0c0d5177c93d10e2f60fadde3beb\", \n \"A1\": \"ebf7ff3558e9949869a8401f4174a6e2e6092074d44b2665008391bcef3be3b3\", \n \"B\": \"8dcbb6f45f57379ba40acdffb81ffc8a3d312c6b728eff17a8c8f15d49f1517a\", \n \"r1\": \"ca615e2f8bc5257f7b7a27cd455c633a400b6ff63f58d7c66c1172e1e56ef30e\", \n \"s1\": \"4edf1f17a43bd06754bcc657391acef09cbc15d6b827e61cfa8f6e33a4f7ce08\", \n \"d1\": \"37c0edf5a192c739ca6c8da976af9a1fa2ca1649024639f6c26e09dd01489b0a\", \n \"L\": [ \"e64e75e0dd89bd999cdaf72f1334263b2daa2b27b593951c8ea7781d7f4479fa\", \"8b24c4e3e7d02de85eb0144aa0e26be30c4a283db27c5b488ee4895345f81a51\", \"b54741caf457eef595c9753aa58d82d45182325aea6d77198090e8e14fd41362\", \"0fcb3a7750dcb87178431ed8b4b23f39fd893c1e500dce31de0bf1861540e212\", \"e1263d567951d7c73e3f082a9fd7086aba9b58fbbbf61783fda9d037afa96250\", \"fe234734c186422495f5d5db92690958e43e5fd5ec5e302537d3353950f5a8e2\", \"a65a13ea58137481ebc02768f12ba06d4c3a58cc3f2725567a544434acc7934c\", \"87eff281268d9495670dc73032cab96056aeeda57fb16e153074dbe5b490ee26\"\n ], \n \"R\": [ \"d4ee6684886fec29e4f03741b6cfeb7bf468eca760fdf20085df50309f694258\", \"5ded84a963d18448029d3990a43ad3ba730b70193b7195961375390863ef0e72\", \"1f26495ea684c129a7bfe0b58837269c2f3b9ed5697b4e5f50205e1699086db0\", \"d89e441c287e7aff567135d73a6724f206a15909cf4505c99a1ece8d2d44197e\", \"c9c2d28ca55008ba1819f7092e694e0048502dd937674b825e8325ccf06d2257\", \"e50dccf6d450f07a040def2b0af67d7a9ca8d54179bf474b11f3e0342b92e6f0\", \"d5c2c5b01dd7769f3651c5a5b7e4af34428cfd9429ecf373cc409db223a3f810\", \"75b8d10b0e409336f9922b0acc60780ed8c7e6916eafa813e486f678133c7c28\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"7040847e31fae2ed636fc2830394ecfef0c93ae4a380394907018dfdcf981408\", \"3efcaee92919e11f36ec098917436902e5752d62d43e054178b9cb6a66e7d408\", \"7b234f9f3fff46cdec0fd531ab50b82ffbbcf22171250fd8ce8015e6ccb94002\", \"2ee8c5d7a0d10186b416c51c3370b0300f54651accfbebd3ac3e4a22ebbf2409\", \"b5e7ebc40dae1be188c5208668d6216d1cdb0552541c27fc6b9f770aa6fa2e0f\", \"50eedef2110162cd67b027348beb3865d40b71dfcd4bb02caa5d85454868f807\", \"1d6fda35f3729b3fdf7041ae02302733ed00dafdbb91e81d304daa7a99e0350e\", \"d8967cea2637fddda63bb273ed406be7ee694bff1fb5a0cdbf792fe25da78d0b\", \"e68bff0add3f8868ece66332a446415da39994ed247606a7951ccbe639006008\", \"a2796c33bb8d53f64de030b7618deac7e15fc6b53bea8f04b30d244007e6b805\", \"a5c6a79cfa5e75c89eb96b298fe5f3722c9ab5219b839a6a88999d288913d902\", \"5d07125c47cc210f19bf42dc7edd84d62fd4d6ebfba9d865c8909477d5aa9804\", \"7b12e6430d55c9f19d9ee5fe6020cb0fd4604ff5999ef3e8904d6016f9933403\", \"5c1a93efd452b75925209e0eabbefade7d92f8ed581135d87f791170b3dd7b02\", \"4eb818dba8ccfb23e897c6edc986ac47cd95292156e50c06797f9d9e552e3e01\", \"ac75a709909f7650bb41125bda22a768d3673bb7a28cf418514fbde82c3cc703\"], \n \"c1\": \"5c483ea223a5c017b42873aca5381b7d4926c47d6ac62e8289a4bfe1f7275104\", \n \"D\": \"9b04cbacc98c9796300170897711eab28348eb4c73fc31ba3fc82d0043a67d62\"\n }], \n \"pseudoOuts\": [ \"8e9f3dc440a410d0dbe2c8c3c46caf95165cc82f3716f56fd0a6c3b187e1f892\"]\n }\n}", + "weight": 2124 + },{ + "blob_size": 1537, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 491840000, + "id_hash": "8a6ebea82ede84b743c256c050a40ae7999e67b443c06ccb2322db626d62d970", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261651, + "max_used_block_height": 3195153, + "max_used_block_id_hash": "8d15c2bf99e9a1c5a0513dca2106c5bcd81d94aa07c1c2d17d7ea96883cd1158", + "receive_time": 1721261651, + "relayed": true, + "tx_blob": "020001020010f783dd2ee9ec9804c7ca2ed7dd3aea990fd3fa0ae8c00edcfe1bee950493de03ba8302b494048114ab6ac7b70110a7f204f932169b1b056fc63be06db8ec91a436f7188a30545bcd6a8bae817ca4020003aa62b55146dd60777113d2c62c8bc41c9339b63e758513d57d5ada453786995ab00003b71531f0476ff381570af6bff1ca3bc8bf8286a098a939e32eaee36450895bef412c019ee82c35546584a78c1713407439e107e98c4da5e6735d77f5d61a369bbf4e2b020901c8c9a284894d6ce90680c4c3ea011d42ea4108a9eb4c47d3233193a71c74ed6c841d99c6eaad2a605daac8f0cdcb6b75c30f2a4aec0e955b2fd93b2cf65bb62d9b9ae29de54a88a5157484d03bd04b300ad7516fb0dc7c647b3ce7f2b2c301e106566731515046dbcf50b5e8f6edeea6bbd2e945b4eb49bc121da137e276481e0265fb162e11730623ead0848e5abfb5007e24282d4a5dc95ad1332e383bfd3d403de9cc283ef16eac799ea9ecfffd24b0a0faed955a5ce82f2a717f5b30bba3cc22335eb0edcfc3b2af623db3309981e8f39722accfc7fd215bd3f1f6a60f476ca5eb56798e464d5791a1cd5d57fbe2d2fbf1c6824a3e80e48d3fa807240fa78029fdf2795b8bc4f0b5d5336ebaa65c179534ec8038dec26c8b5cc103230607d277a8b482900c60791c03c6a072eb576cdf8532b2da3bb493872c264559a7832f46f076e6b541c665df3baaf4486d9466655a26e3aea8f9d6e4d3f5613f4dbcb5c1cc78c9698551ed28ebaccebba9ffe10b38c4791afa73c620cf433342e45733b26f192642f6498a0d482df12e605b91957614d4a6707d0c103883104210508812038852ef55bf0ceed35382c508d19b82bacb5891bf9070c4634bbdb229c22c4e1296d55ccad33aac94342e8f75acee853fa05e69fe1f545c3b4ef839b401f7dd53846c9a9d8b1b0b04282f802fa451475b86d39edc01368a86cf9382a037075bba459244e0dc6488730bc628330b776bf8c6ababb3046ee3b103fcc2d9d544cd92ea335770c68c0e6f385105299bffd1ae17a12fe4b40e6880a9c6f5038daed1464b0fee68ecdfcdc712405936422918197dfec8f4351b82e7da04f6bcb9c765924afbd077c168ee0306cf456e1f4606086e2155260b3f5e9d8443533de0bb2fa410fc5465603b16c0137a236f761fb254e7b53c8667d8ba931e41bf6ed5cd131a4171a265158843415ca2f5c1690c9ec431091f3312b7b308420878e7e9118bed3c3f7df4e5acc3bd7d209d3539ce182e551af5f5e6369d29367dfa97c8951cfa0ba11a23b5c5e1bf6cd59db4b658b1437652f6e3f25717c9f4f522b37a0767c193fdbbdb9dada9d5d46e38a7d8a42460c0bf37c7adc0a317fd3e4a29390de895b526f0368b4737af0746647e2025a10cae52d452400710c9709e2b375c09c73b2529c97d87b8e62f15d0c776dbb0f5564cde6fb5872c124193d47d92ac007bfab088ebd9a44f194597802213475438f21112a50cb4f02c7f650ecfd3290f1c9bffdd70877dbc77cd5485cfbec143687cf605938787c1426ed42646a1f0080757ba370ba2b36b492a71708e36736db7857405cae3b128879d8e9c7dff030b3fb734e6faf49c85ed5d7940b400375b12674b3858d31b7ab56222e82ab03e00ce265d7d694571d3db08a7f23baf68007c4aa67f31185aeaba276eb3688b26018d8c904b9deea0fd68ceeebdf1aac9d967aec1ebaa4d3c6df2c3ce7c874ace05a3cb5af380be76fd67a7fc64d7da5a3ad94350b295a86cf7943c05c12f8267017e2beada8abf3e0fbb104492c222bbd8a6058dbdb05042213ed077c0d36cbf0cc6f1333a49e977ef452cfba812ba428b19cca4ea461681abce4f707e8f691b06fa6c56667fae356bcfa47f8f74f1db6bb470ce8fb96815e3fa2aaf2d22d1b00f4487e8e83e98b7d879c1699fd6f1092b1a9b5827effc22f14e3c7bf59ef2fc0b9eaf15677934da8c39016b3f771dd9227e76f541818cd4ca03d3bc78bd18cc0ee9dea19ceb194f06dc893c192932468ef107461f70a03b4d9137b72958ef68031ae7ae8bfa3fcc4d0f335959b7ac162dd86aae3da1580817d5fa6f932fe3c5511d1585d0f1383e6c1035c5ace104f8b03f27958c9160375a80498f8b73f861c4", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 97993207, 8795753, 763207, 962263, 249066, 179539, 237672, 458588, 68334, 61203, 33210, 68148, 2561, 13611, 23495, 16\n ], \n \"k_image\": \"a7f204f932169b1b056fc63be06db8ec91a436f7188a30545bcd6a8bae817ca4\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"aa62b55146dd60777113d2c62c8bc41c9339b63e758513d57d5ada453786995a\", \n \"view_tag\": \"b0\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"b71531f0476ff381570af6bff1ca3bc8bf8286a098a939e32eaee36450895bef\", \n \"view_tag\": \"41\"\n }\n }\n }\n ], \n \"extra\": [ 1, 158, 232, 44, 53, 84, 101, 132, 167, 140, 23, 19, 64, 116, 57, 225, 7, 233, 140, 77, 165, 230, 115, 93, 119, 245, 214, 26, 54, 155, 191, 78, 43, 2, 9, 1, 200, 201, 162, 132, 137, 77, 108, 233\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 491840000, \n \"ecdhInfo\": [ {\n \"amount\": \"1d42ea4108a9eb4c\"\n }, {\n \"amount\": \"47d3233193a71c74\"\n }], \n \"outPk\": [ \"ed6c841d99c6eaad2a605daac8f0cdcb6b75c30f2a4aec0e955b2fd93b2cf65b\", \"b62d9b9ae29de54a88a5157484d03bd04b300ad7516fb0dc7c647b3ce7f2b2c3\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"e106566731515046dbcf50b5e8f6edeea6bbd2e945b4eb49bc121da137e27648\", \n \"A1\": \"1e0265fb162e11730623ead0848e5abfb5007e24282d4a5dc95ad1332e383bfd\", \n \"B\": \"3d403de9cc283ef16eac799ea9ecfffd24b0a0faed955a5ce82f2a717f5b30bb\", \n \"r1\": \"a3cc22335eb0edcfc3b2af623db3309981e8f39722accfc7fd215bd3f1f6a60f\", \n \"s1\": \"476ca5eb56798e464d5791a1cd5d57fbe2d2fbf1c6824a3e80e48d3fa807240f\", \n \"d1\": \"a78029fdf2795b8bc4f0b5d5336ebaa65c179534ec8038dec26c8b5cc1032306\", \n \"L\": [ \"d277a8b482900c60791c03c6a072eb576cdf8532b2da3bb493872c264559a783\", \"2f46f076e6b541c665df3baaf4486d9466655a26e3aea8f9d6e4d3f5613f4dbc\", \"b5c1cc78c9698551ed28ebaccebba9ffe10b38c4791afa73c620cf433342e457\", \"33b26f192642f6498a0d482df12e605b91957614d4a6707d0c10388310421050\", \"8812038852ef55bf0ceed35382c508d19b82bacb5891bf9070c4634bbdb229c2\", \"2c4e1296d55ccad33aac94342e8f75acee853fa05e69fe1f545c3b4ef839b401\", \"f7dd53846c9a9d8b1b0b04282f802fa451475b86d39edc01368a86cf9382a037\"\n ], \n \"R\": [ \"5bba459244e0dc6488730bc628330b776bf8c6ababb3046ee3b103fcc2d9d544\", \"cd92ea335770c68c0e6f385105299bffd1ae17a12fe4b40e6880a9c6f5038dae\", \"d1464b0fee68ecdfcdc712405936422918197dfec8f4351b82e7da04f6bcb9c7\", \"65924afbd077c168ee0306cf456e1f4606086e2155260b3f5e9d8443533de0bb\", \"2fa410fc5465603b16c0137a236f761fb254e7b53c8667d8ba931e41bf6ed5cd\", \"131a4171a265158843415ca2f5c1690c9ec431091f3312b7b308420878e7e911\", \"8bed3c3f7df4e5acc3bd7d209d3539ce182e551af5f5e6369d29367dfa97c895\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"1cfa0ba11a23b5c5e1bf6cd59db4b658b1437652f6e3f25717c9f4f522b37a07\", \"67c193fdbbdb9dada9d5d46e38a7d8a42460c0bf37c7adc0a317fd3e4a29390d\", \"e895b526f0368b4737af0746647e2025a10cae52d452400710c9709e2b375c09\", \"c73b2529c97d87b8e62f15d0c776dbb0f5564cde6fb5872c124193d47d92ac00\", \"7bfab088ebd9a44f194597802213475438f21112a50cb4f02c7f650ecfd3290f\", \"1c9bffdd70877dbc77cd5485cfbec143687cf605938787c1426ed42646a1f008\", \"0757ba370ba2b36b492a71708e36736db7857405cae3b128879d8e9c7dff030b\", \"3fb734e6faf49c85ed5d7940b400375b12674b3858d31b7ab56222e82ab03e00\", \"ce265d7d694571d3db08a7f23baf68007c4aa67f31185aeaba276eb3688b2601\", \"8d8c904b9deea0fd68ceeebdf1aac9d967aec1ebaa4d3c6df2c3ce7c874ace05\", \"a3cb5af380be76fd67a7fc64d7da5a3ad94350b295a86cf7943c05c12f826701\", \"7e2beada8abf3e0fbb104492c222bbd8a6058dbdb05042213ed077c0d36cbf0c\", \"c6f1333a49e977ef452cfba812ba428b19cca4ea461681abce4f707e8f691b06\", \"fa6c56667fae356bcfa47f8f74f1db6bb470ce8fb96815e3fa2aaf2d22d1b00f\", \"4487e8e83e98b7d879c1699fd6f1092b1a9b5827effc22f14e3c7bf59ef2fc0b\", \"9eaf15677934da8c39016b3f771dd9227e76f541818cd4ca03d3bc78bd18cc0e\"], \n \"c1\": \"e9dea19ceb194f06dc893c192932468ef107461f70a03b4d9137b72958ef6803\", \n \"D\": \"1ae7ae8bfa3fcc4d0f335959b7ac162dd86aae3da1580817d5fa6f932fe3c551\"\n }], \n \"pseudoOuts\": [ \"1d1585d0f1383e6c1035c5ace104f8b03f27958c9160375a80498f8b73f861c4\"]\n }\n}", + "weight": 1537 + },{ + "blob_size": 1534, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 122720000, + "id_hash": "7c32ac906393a55797b17efef623ca9577ba5e3d26c1cf54231dcf06459eff81", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261673, + "max_used_block_height": 3195144, + "max_used_block_id_hash": "464cb0e47663a64ee8eaf483c46d6584e9a7945a0c792b19cdbde426ec3a5034", + "receive_time": 1721261673, + "relayed": true, + "tx_blob": "0200010200108088a024a3deeb0ef5939001e7eb0fc19401cab201aeaf01e08001cd16f4a601f52a8c8d01a106d811c83e5e987605d678e8bfb17e8d2651e8dd5c69c73c705d003c82e4e35d2b5b89c9ebe3020003507533a540f57548b44e011305bd39d6a6a64e5ccc82bac1833b6ededb9121f3690003b32a2175124a8e0a0fd95a37d51a290a397dc74637a8cdd73ba4dfdec91b2c0ec42c0159ef5288bf4ea3ba0f6780416feedec329416b7fd78af51f494f3eb89db900a7020901810cdc8e9ce7315906809ec23ab7e164d1d01bfc65b2f30e77c390a5fd68d73b4565628faee8a1f9bd7cffe31a3bdb37ef7fc670e18f6190cc20459a32ac6e15f56e257ed3471f4bbf5394501db831fa2d05b784f3e5091f322c1df20601326379bcc24fdcb0e68dbca4cbfac5fc5238e31b4ea8619c5eff8776a42e9c9a88287c0c5fc24c5a1872237e971762f9ec12853ca27eb3b1e611d3713bdd4778bc8585ef0adb3e8f144518a22d2eb4e77c526335c5ad9f5c4754740eaba4623f59cce4ea9eab890ec0976f3e03bc08f3218192c56d82c36ddc4692f5a96f8b056f11c7f15635ba12a22274a0a171999444f21079496b016867b7dac9f05f5f0141b181816c004f0f3033d7e0a9819f5a8623a637dc7d949b34c0da6eba6a7d07073c7219d079608c6ff8d04b0d4bb425b73142e84750e7e5548ef86cc02ac0b91132c3e4df24b11a32f8c30a483bcd5b903b2cd87197d8172bd4bd190c4034322dabd82600f852c346716518c93c439a799a2763ff9d2457c47f96e22371440cc1db354184fddabde2d51512556b7d05ad6be9f44fbf1671834f6fd45a6f8f1f09edf96551160fe83c207fb8eabab30ed294aca1287ea196f1640af3a183cc7891a680264c41b34d56ab4219e8175b1d847de3174d4c298cb5ac40e1c84169b0a5fbee401b237ad92093cb34b6752229e03cc7ceb2546102360ca5fe823192024b0775b50b22fe9e7cfb29fec3400ea8a03b047ca1c92af76d14da40589415116b922b080f61446f1e5a11aaaa84acd4bee2e67f25c8a0c77db1e3cf8d9a2f57a1f6a622a4c76475ecb20fb1b6221caa4be32876414e6d6b0375582fbf9c1d50403981d303b53d877af580443431499ed7a030d01a618c37139ac4fec11b3a2afa1aee51a3605abd36c3cc05c02348430bdec52a481e04249a7adde0a4b718d459ee1aa67e4ce05980a451753b0e9b7dd543b373a137cd900f81929699bfa4fd5bd51d096c93673bc035031bf18d1e153a5b62e5965f4865827d7c871403fcda46a7e38ec6b2c7c7de6f6e88e7e32514fdbcf04bfdc851a1a052ad32052ca4a74f039ca030a488b3f3160043add8d6b6f7f5275c49ca6c5f3e6556641b5d08c80f053adcb2928105c91712723592a72f37c0da5ec12f62325cf8ce9a9d98244c830715d805c79b3e0d09ff094563869a28864beaf3d2e4a257f2ac7e05b253f84801fa53fc02c27fb618a582eeb68261458ff5a24f19db62368984e35c13a9b3b10de92a20b1f757574390e8a9e6cf58a33e6f2d7425dd5cff36f15b5992cca1690cedb97159b128e4e509bb7735bbfab47d0e925103bd69585fd60a772b9fbf300bde8d80256510c267a7fba688969b4e89e06d8faaa7b1369cdbba78b19520fd0a8e3e0858e4ca6457e9444053ef08c62efdf1eb2176e81261c5f2b1febf72f4047ef2981ea380eea8a4429fc107fa6f96bb9a60feb70db7cda063be92d3f650098f85e14b1a45dab1687f1e2d4e3b11099286945c997c1cc2f9f908367ce5af0d7fc4f2f770cce3184f98be164dfcd15b896c5290e46dbc2e1458683022d9980d87afe5ff98453b33f1ce50617b33ebe0565bfe0166c1af28cee2ff788e623c0614b3db3ca8b04ae0ca9fc6a036ba40269a3da9cbfd2cd1ce2c8690a6df13ed00cc5527e60edd183603ffc5fb3fec14ee3e6c24bd708192756a2f10d6c3d54102ba4b38a06f9ca37fe3e10c68a4a6bd3858015f2b18f82e7e446a347c488890046b48a02d406ce2f4ae39ab70fa019f4c5086aa861f73f8b343eb433873c52e0901d1794138c64ea8943d6763d334920c5d57014a4ff9b2e163abcd9af5da269cb8dd672e123f737a896c99551b4c610bc68bb68b30ba5206881e18fd2288a42f", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 76022784, 31125283, 2361845, 259559, 19009, 22858, 22446, 16480, 2893, 21364, 5493, 18060, 801, 2264, 8008, 94\n ], \n \"k_image\": \"987605d678e8bfb17e8d2651e8dd5c69c73c705d003c82e4e35d2b5b89c9ebe3\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"507533a540f57548b44e011305bd39d6a6a64e5ccc82bac1833b6ededb9121f3\", \n \"view_tag\": \"69\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"b32a2175124a8e0a0fd95a37d51a290a397dc74637a8cdd73ba4dfdec91b2c0e\", \n \"view_tag\": \"c4\"\n }\n }\n }\n ], \n \"extra\": [ 1, 89, 239, 82, 136, 191, 78, 163, 186, 15, 103, 128, 65, 111, 238, 222, 195, 41, 65, 107, 127, 215, 138, 245, 31, 73, 79, 62, 184, 157, 185, 0, 167, 2, 9, 1, 129, 12, 220, 142, 156, 231, 49, 89\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 122720000, \n \"ecdhInfo\": [ {\n \"amount\": \"b7e164d1d01bfc65\"\n }, {\n \"amount\": \"b2f30e77c390a5fd\"\n }], \n \"outPk\": [ \"68d73b4565628faee8a1f9bd7cffe31a3bdb37ef7fc670e18f6190cc20459a32\", \"ac6e15f56e257ed3471f4bbf5394501db831fa2d05b784f3e5091f322c1df206\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"326379bcc24fdcb0e68dbca4cbfac5fc5238e31b4ea8619c5eff8776a42e9c9a\", \n \"A1\": \"88287c0c5fc24c5a1872237e971762f9ec12853ca27eb3b1e611d3713bdd4778\", \n \"B\": \"bc8585ef0adb3e8f144518a22d2eb4e77c526335c5ad9f5c4754740eaba4623f\", \n \"r1\": \"59cce4ea9eab890ec0976f3e03bc08f3218192c56d82c36ddc4692f5a96f8b05\", \n \"s1\": \"6f11c7f15635ba12a22274a0a171999444f21079496b016867b7dac9f05f5f01\", \n \"d1\": \"41b181816c004f0f3033d7e0a9819f5a8623a637dc7d949b34c0da6eba6a7d07\", \n \"L\": [ \"3c7219d079608c6ff8d04b0d4bb425b73142e84750e7e5548ef86cc02ac0b911\", \"32c3e4df24b11a32f8c30a483bcd5b903b2cd87197d8172bd4bd190c4034322d\", \"abd82600f852c346716518c93c439a799a2763ff9d2457c47f96e22371440cc1\", \"db354184fddabde2d51512556b7d05ad6be9f44fbf1671834f6fd45a6f8f1f09\", \"edf96551160fe83c207fb8eabab30ed294aca1287ea196f1640af3a183cc7891\", \"a680264c41b34d56ab4219e8175b1d847de3174d4c298cb5ac40e1c84169b0a5\", \"fbee401b237ad92093cb34b6752229e03cc7ceb2546102360ca5fe823192024b\"\n ], \n \"R\": [ \"75b50b22fe9e7cfb29fec3400ea8a03b047ca1c92af76d14da40589415116b92\", \"2b080f61446f1e5a11aaaa84acd4bee2e67f25c8a0c77db1e3cf8d9a2f57a1f6\", \"a622a4c76475ecb20fb1b6221caa4be32876414e6d6b0375582fbf9c1d504039\", \"81d303b53d877af580443431499ed7a030d01a618c37139ac4fec11b3a2afa1a\", \"ee51a3605abd36c3cc05c02348430bdec52a481e04249a7adde0a4b718d459ee\", \"1aa67e4ce05980a451753b0e9b7dd543b373a137cd900f81929699bfa4fd5bd5\", \"1d096c93673bc035031bf18d1e153a5b62e5965f4865827d7c871403fcda46a7\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"e38ec6b2c7c7de6f6e88e7e32514fdbcf04bfdc851a1a052ad32052ca4a74f03\", \"9ca030a488b3f3160043add8d6b6f7f5275c49ca6c5f3e6556641b5d08c80f05\", \"3adcb2928105c91712723592a72f37c0da5ec12f62325cf8ce9a9d98244c8307\", \"15d805c79b3e0d09ff094563869a28864beaf3d2e4a257f2ac7e05b253f84801\", \"fa53fc02c27fb618a582eeb68261458ff5a24f19db62368984e35c13a9b3b10d\", \"e92a20b1f757574390e8a9e6cf58a33e6f2d7425dd5cff36f15b5992cca1690c\", \"edb97159b128e4e509bb7735bbfab47d0e925103bd69585fd60a772b9fbf300b\", \"de8d80256510c267a7fba688969b4e89e06d8faaa7b1369cdbba78b19520fd0a\", \"8e3e0858e4ca6457e9444053ef08c62efdf1eb2176e81261c5f2b1febf72f404\", \"7ef2981ea380eea8a4429fc107fa6f96bb9a60feb70db7cda063be92d3f65009\", \"8f85e14b1a45dab1687f1e2d4e3b11099286945c997c1cc2f9f908367ce5af0d\", \"7fc4f2f770cce3184f98be164dfcd15b896c5290e46dbc2e1458683022d9980d\", \"87afe5ff98453b33f1ce50617b33ebe0565bfe0166c1af28cee2ff788e623c06\", \"14b3db3ca8b04ae0ca9fc6a036ba40269a3da9cbfd2cd1ce2c8690a6df13ed00\", \"cc5527e60edd183603ffc5fb3fec14ee3e6c24bd708192756a2f10d6c3d54102\", \"ba4b38a06f9ca37fe3e10c68a4a6bd3858015f2b18f82e7e446a347c48889004\"], \n \"c1\": \"6b48a02d406ce2f4ae39ab70fa019f4c5086aa861f73f8b343eb433873c52e09\", \n \"D\": \"01d1794138c64ea8943d6763d334920c5d57014a4ff9b2e163abcd9af5da269c\"\n }], \n \"pseudoOuts\": [ \"b8dd672e123f737a896c99551b4c610bc68bb68b30ba5206881e18fd2288a42f\"]\n }\n}", + "weight": 1534 + },{ + "blob_size": 1535, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 491200000, + "id_hash": "63b7d903d41ab2605043be9df08eb45b752727bf7a02d0d686c823d5863d7d83", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261665, + "max_used_block_height": 3195155, + "max_used_block_id_hash": "c8ad671ebe68cc5244ea7aed3a70f13682c3e93fc21321abcb20609d42a5b6e7", + "receive_time": 1721261665, + "relayed": true, + "tx_blob": "020001020010d6e18c2ffcc1e40483f90be9b30b9af70af8ac0dc3bc099313ccbb01c79f04aa25946bc7a102ac37c30a8d1d563cd0f22a17177353e494beb070af0f53ed6d003ada32123c7ec3c23f681393020003416ee9d85c13be6a1ad2a0b9a5c3fad790bc3c266cd0eb55f1d38959a2eef8a49b0003d6292302f486945eb9bab6beaa2564a4dbe09cf8e92a107eb8734f0f8a09a1c9052c017ce27d3675d2db5af9968b93733350b10749e9fa4a0c1bfcfdc86c550088fdd1020901c6821af937903f5f0680bc9cea01e240eebed50fd3fd162b7b3b54185d5ecb8253de6123d50449a2746c6a82023347509df7efd5f8106b4e3d60dd0d7f86958d05ee5bc8a6963af900849d2a4118e031bcaeb2788aa2a1e56b036ebadab201d92af1585cb9cb3db78d3da41c66221180e1c8128a35b304ae96de328ce538d160dd66e00a9b57988589eb48c4e131b24bb266de41540a164b34008c591871cd93fe7c3fa4aacd67f35315c0927e7b4add9c63e94a95732b7f12cf1346b7b26e1d1d893d582b2b0787f00f331e787749b14a3e0cb5363537cb4654d90a4c90001e08066b76e5b7cb3d4a9a58b88c613f5b4ca2fb0a875becee6a26f287d14906f3be11a310ff9a3bdcb579818bb958229c1b0ab3d4ce9b935723bdf8c888190d071089e5724f75ce14fe58360ba419f7e7bda58a0175b9ce9b12627b599ae896d060e7a21f3b9d65cf4d386aa6ac044e2283c64b92f4b3f4234ad7e1036fa96f53f187ed53d0c753805df8de748339f72e901ca157aeabff55f14c451f0084e725a55ffc85d7ba5d26a7f678bbbcd1e40e8a3a5400620ea4eee86796b7ec2266b20f8fd361a94759654d7d39ba8cdd6b3a002f140dcefe0f498a6b33655bfb2981ac38db4dd0cc6b7c25d408bbe69fb7cb86114fd7aea4136aacfe15475f20f3d4f7cd51eedec4e4a1890fcc0d29f18d6270a84d9c4aa6ba6bf9ec3900016057240713ad161ed5d9dd3a852ad64f7183a57b83015ab461f36e5ac1ed0bb0d2f7e1ff6c37cb4ef43c6e65f11858490d29b6fff50e91acfb2799fa5b8c0c9e9f913f2941ffa2414ca459db6de293f9e8a231152f6fbdb1dcb2a79bebb5687870f69ec96254f56d963bc8e283a7fdf1fbdf4f60d5d97d4224d9f1a9d4c52c14ba4ffabf5dd9955c0e075da49a8f8d84686d4213331b64a5f770fa35260ff1e1e13ec9da2b7aa35b728810febb734410cb117e37040d2a3c3198b816272e8e76fca9199064b01511b86f7578718590b6ffedb78a5ae175e4efeb3ed71028913deb2e52e5f17d3792990cec53ff4b834616d77cd50e32c84b95422b8436645c304b22c2018c6308ab20f4f7e06c5f67bd59c6f106fabe2b14dc1713a4b13f6522aa74f40410fd14ef905febb4e95ccd80265803c37e285ed3939d43e368b20b9e49b955041dd3d895f4885e8264d99f574d4da3e94b785e5679e300b817e15f1c60228f0745d6faf106d0d36d000be6d5779d6d83165dec7ae167ed7fe6ef7a688f391b0e93c15448214aa121b110d4573e9f386b432451f5689b29a81cec1497ba9c17022f3c310407533b549210dc47186bf117beb821a3ac0d255a31bc57c795b4bd02982a42b4ce5d5a86dade14e37ef9a9a4870687800d2d8ae637cad458e3c7a80ed3e47cc7f6af7523f1ed6bdbbd3f4eaeb6fb9cc9ae13a905618821ca41f13902430b77134bc29f5319b96b17c9fda24cc72af61a890b422bbcd10fd323001605dd25ae17c9c1492fb180e3ac206e780db485c3f8940e1d80301e962fb3384d05d187fdf65cf5b1e2ad3e379f5a765773a3f196bc0b835ad305946328ace26502dc43c5790a5ca6c3076206b56bb1c4bc53bfb4b0fba11dfa24809087e6a6760d7475a3c2465b02f2068d356289d4f17ee35fc0956deb061a737fb4bde998320cfd3e85d3e5113062b0b49f860318d909c9cb714758e6203a2af2ee69e5bf58032014aafdf920276f5a50ca4c3a1b4b7c7f7099ea414e0982bc806beeb68bd303b51723220ce63175d0ba8577400c59109d97357692b9ace8ec0a57992585ed07bea256456a8600ec85716f9bf7dae9cd0cf88ccc2c542600e12c41c7403cf4056db57e4fe2422adcc28c3ec0a02dbb6b1b5926d4012ec3f27ad757faeae60cad", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 98775254, 10035452, 195715, 186857, 179098, 218744, 155203, 2451, 24012, 69575, 4778, 13716, 37063, 7084, 1347, 3725\n ], \n \"k_image\": \"563cd0f22a17177353e494beb070af0f53ed6d003ada32123c7ec3c23f681393\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"416ee9d85c13be6a1ad2a0b9a5c3fad790bc3c266cd0eb55f1d38959a2eef8a4\", \n \"view_tag\": \"9b\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d6292302f486945eb9bab6beaa2564a4dbe09cf8e92a107eb8734f0f8a09a1c9\", \n \"view_tag\": \"05\"\n }\n }\n }\n ], \n \"extra\": [ 1, 124, 226, 125, 54, 117, 210, 219, 90, 249, 150, 139, 147, 115, 51, 80, 177, 7, 73, 233, 250, 74, 12, 27, 252, 253, 200, 108, 85, 0, 136, 253, 209, 2, 9, 1, 198, 130, 26, 249, 55, 144, 63, 95\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 491200000, \n \"ecdhInfo\": [ {\n \"amount\": \"e240eebed50fd3fd\"\n }, {\n \"amount\": \"162b7b3b54185d5e\"\n }], \n \"outPk\": [ \"cb8253de6123d50449a2746c6a82023347509df7efd5f8106b4e3d60dd0d7f86\", \"958d05ee5bc8a6963af900849d2a4118e031bcaeb2788aa2a1e56b036ebadab2\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"d92af1585cb9cb3db78d3da41c66221180e1c8128a35b304ae96de328ce538d1\", \n \"A1\": \"60dd66e00a9b57988589eb48c4e131b24bb266de41540a164b34008c591871cd\", \n \"B\": \"93fe7c3fa4aacd67f35315c0927e7b4add9c63e94a95732b7f12cf1346b7b26e\", \n \"r1\": \"1d1d893d582b2b0787f00f331e787749b14a3e0cb5363537cb4654d90a4c9000\", \n \"s1\": \"1e08066b76e5b7cb3d4a9a58b88c613f5b4ca2fb0a875becee6a26f287d14906\", \n \"d1\": \"f3be11a310ff9a3bdcb579818bb958229c1b0ab3d4ce9b935723bdf8c888190d\", \n \"L\": [ \"1089e5724f75ce14fe58360ba419f7e7bda58a0175b9ce9b12627b599ae896d0\", \"60e7a21f3b9d65cf4d386aa6ac044e2283c64b92f4b3f4234ad7e1036fa96f53\", \"f187ed53d0c753805df8de748339f72e901ca157aeabff55f14c451f0084e725\", \"a55ffc85d7ba5d26a7f678bbbcd1e40e8a3a5400620ea4eee86796b7ec2266b2\", \"0f8fd361a94759654d7d39ba8cdd6b3a002f140dcefe0f498a6b33655bfb2981\", \"ac38db4dd0cc6b7c25d408bbe69fb7cb86114fd7aea4136aacfe15475f20f3d4\", \"f7cd51eedec4e4a1890fcc0d29f18d6270a84d9c4aa6ba6bf9ec390001605724\"\n ], \n \"R\": [ \"13ad161ed5d9dd3a852ad64f7183a57b83015ab461f36e5ac1ed0bb0d2f7e1ff\", \"6c37cb4ef43c6e65f11858490d29b6fff50e91acfb2799fa5b8c0c9e9f913f29\", \"41ffa2414ca459db6de293f9e8a231152f6fbdb1dcb2a79bebb5687870f69ec9\", \"6254f56d963bc8e283a7fdf1fbdf4f60d5d97d4224d9f1a9d4c52c14ba4ffabf\", \"5dd9955c0e075da49a8f8d84686d4213331b64a5f770fa35260ff1e1e13ec9da\", \"2b7aa35b728810febb734410cb117e37040d2a3c3198b816272e8e76fca91990\", \"64b01511b86f7578718590b6ffedb78a5ae175e4efeb3ed71028913deb2e52e5\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"f17d3792990cec53ff4b834616d77cd50e32c84b95422b8436645c304b22c201\", \"8c6308ab20f4f7e06c5f67bd59c6f106fabe2b14dc1713a4b13f6522aa74f404\", \"10fd14ef905febb4e95ccd80265803c37e285ed3939d43e368b20b9e49b95504\", \"1dd3d895f4885e8264d99f574d4da3e94b785e5679e300b817e15f1c60228f07\", \"45d6faf106d0d36d000be6d5779d6d83165dec7ae167ed7fe6ef7a688f391b0e\", \"93c15448214aa121b110d4573e9f386b432451f5689b29a81cec1497ba9c1702\", \"2f3c310407533b549210dc47186bf117beb821a3ac0d255a31bc57c795b4bd02\", \"982a42b4ce5d5a86dade14e37ef9a9a4870687800d2d8ae637cad458e3c7a80e\", \"d3e47cc7f6af7523f1ed6bdbbd3f4eaeb6fb9cc9ae13a905618821ca41f13902\", \"430b77134bc29f5319b96b17c9fda24cc72af61a890b422bbcd10fd323001605\", \"dd25ae17c9c1492fb180e3ac206e780db485c3f8940e1d80301e962fb3384d05\", \"d187fdf65cf5b1e2ad3e379f5a765773a3f196bc0b835ad305946328ace26502\", \"dc43c5790a5ca6c3076206b56bb1c4bc53bfb4b0fba11dfa24809087e6a6760d\", \"7475a3c2465b02f2068d356289d4f17ee35fc0956deb061a737fb4bde998320c\", \"fd3e85d3e5113062b0b49f860318d909c9cb714758e6203a2af2ee69e5bf5803\", \"2014aafdf920276f5a50ca4c3a1b4b7c7f7099ea414e0982bc806beeb68bd303\"], \n \"c1\": \"b51723220ce63175d0ba8577400c59109d97357692b9ace8ec0a57992585ed07\", \n \"D\": \"bea256456a8600ec85716f9bf7dae9cd0cf88ccc2c542600e12c41c7403cf405\"\n }], \n \"pseudoOuts\": [ \"6db57e4fe2422adcc28c3ec0a02dbb6b1b5926d4012ec3f27ad757faeae60cad\"]\n }\n}", + "weight": 1535 + },{ + "blob_size": 11843, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 236860000, + "id_hash": "b8a15acb832330b5070c7615fa1bb5142e8a45ecca022c4136f61dcbcc493986", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261659, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261659, + "relayed": true, + "tx_blob": "020010020010f081a521c5a1d41186eb5698f516b5e818bbba1bedb705a5d00df89f039357c73b890bf54f9217b344cb19dc006e92fc1e623298b3415ddccfc96a8cae64cb7c9199505a767a16ddd39bb9020010f3eab531b38b98029ff116d1ec1faad00187d521d51bc7e80487c304913cbaac01629510e861df07da0fd656ac13a64576e7af5ca416d99b899b0bafef5e71d50e349e467fa463b13600020010e6cf81308cc3e702cbd661ecd64b8650a7bd029cdb05b7e5019ae20cd8f801e87ca479ba3c8a24d08c01b667ca559feaf79de4445ca4d2bcc05883b25ecff2f6dd8fd02a9a14adea4849f06f020010d5989d32d582698beb2499c931dcb2379ae705fcad02ac9e0e85a902f2f30193ed019c0796d302a85ec50e872bc5b7d94e661c5eb09714b243f3854cc06531b1085442834c9e870501031b73da02001084f7ef27b2c2e20acbd767c49a16a092298fe60a8a880286d903aa8d02b2bb1ecb8d02d4d306a814d612f25ba605a5ebf4914f887ecdfde8e7ef303a7f2cc20521a2a305ba9a618e63d95debfb22020010ea98ad1ad2e88618ddf413bbbc9b01feba1d908508938e15eca804fbd803f4f50bc154c661fd60a706be1dae03a2b08a090f611ea1097622cc63a49256a2d94a90b8dbaaa5e53a85001c86d55a0200108acfff31e1c28e02bfd8139bd603e09604e26387af0586f501c79401a059800a9e24e10d9629fb010288f7594b26dcbaff22f7e7569473462c49d8fb845aa916d7a7663be8b85b85530200109c83ed30a19a25d3a9bf01a08c1cbccd14fbc90cccb59701b953c0e403df41e69608bc1dae33c40edc2482037d805459f05d89c92443f43863fa5a4d17241d936fc042cc9847a33a461090c5020010d4a2f828fda6f308b19f8101eacab90199cc02ffae01eff701a4c005d320b32cc10bca9001b101ff59a906cd0365bb760c9a31da39911fa6d0e918e884538f0a218d479f84a1c9cca2f9a5f500020010b8b18c2f80a3c704dfa34e808b02d0a704daa501ecb2039a29eef503a19102ef07669343c20ed525a10452418ac25be58fbfcc8bd35c9833532d0fa911c875fa34b53118df5be0b3ba480200108cf3cc3296f472e2e75184ee0aa3cf0483bb01fec70a96c602c562cb59f6cf01da07d861c14ac411ea0c40e57cb9a9f313f864eef7bf70dea07c2636952f3cbff30385ac26ee244a4349020010b9a4e12cfa958d02b4e18705e6831da49807c8a007b7c202d3ba04b40ba7ca02edb402b4b803d38c01b431ecdb01e50438d739cfb68aba73f0f451c7d8d8e51ae8821e17b275d03214054cc1fe4f72d60200109ccba132acadc401c98731a0ef0ce461b9ad0895f702a24ec955c68401f975da32f616bf07e530c81c1eda8e08b1024028064450019b924eca2e3b3e3446d1ac58d0b8e89dc4ba980d020010cf888128c1f8fb0ac0f221efe24fd7bb14e3a40fddca0bfdcc0fb78f02d7ed02b5a0018e09be10cd1eb10d89051cccfcece29fbd7a28052821fdd7aac6548212cab0d679dd779a37799111f9ec020010db90af22e0eaf40bcbd19b04b6d0b401aec905f48402e5bc0f94cb08bf9808b9db13809701b817d49902fe629903db1b05138378dedfae3adbd844cf76c060226aaeddcd4450c67178e41085d0ae9e53020010a7bbf4299ff7fa05ff9bd201b1fee801e1d529b38341e8900f81a908c78b03b0e101b89201fe6faa5aa701d501ce050007a41ed49aa2f094518d30db5442accaa7d3632381474d649644678b6d23c00200038c2ba531d06e4ac990213d765751e89981303d4714d81229ac09e385c8ac1cd3c900030c9d3c41171e04e42f6ed61a932c2ecdb5c0103d7cdd909fa0ab15881469c66af52c01b848c2cbf8e0ee4a984bf645c0e6118450971072a18d23b6cf716f0bf681fd40020901d0fecbabcf50dc5706e0e4f870dc9c59cdde692b10e76b3405d76aec5c479df6fa3357cbddcb22e20d2b458011dd31dfc1c78316bad7ed9ffd39ba12b86a8ad571f7f5aa9668806d10d2b03c2c84c90690e4ddeb3dc6f870fbd5df5b0901c55abb99bdda211773d14dcf7cd68ca2c2e1df64896976c36da0b72b9b0b5abbf68499752558d3b7b342a554f91ea3171cba93075d35968565e37020bd60f6bf0086548c6fd600cc04f704607fd008bdd1ef83ed341109114d9301c30a86d3d87b9a9a3a6cf62d4aedea2cbe4f48af3a830c33486b3e3c7942ad7b4dfbc322076cbaf3b5e0afffc36549482dc4e5220ad7be9284470405e2a889dc4b0eda950b9eacce92f4b6fe9bbb9f853cd5a68b1ea882a66fc1f86df6b7f21ed49e21fb07070c2330673beaf7961285d721e00c55e6d97b77efb12cfcdac429cbe92fe7ed641ae9878d713edc784573be96c47e80dec59c487590f721dda777066a66a388a8cbd007967d90e323d91cae997f9449518ca71dd5e0473cd88d52a1b63f4994cb355fc68976cdff244295ea25e9d579eeee92211f52ed942307827480bf639e9b945e1f12d5a0369f990945dc143dcbb3e7bb7eada7b4e10ccf65128ab3a203d27441035465a96cac073e12db24bb696f38587021576582596bd0351ea8dcd30123af3e518560a843188e19aa666d9b70d7c55b2072c3813f05084de714988a9a07e21b543d2d50a2b7949e9c6ee3638731aa1f19909ac0978ef10ebe83e52558f6e96814d9b64fb0344d8a37e43e9933a9bcb087173ad895400a680f3f7919a585572b4c0639855b4a146492b00c82eb9d7bd9566aa94387e79f80561676a045e4be44d3a42061a710a8c5be6ac2af7531504911a4e17d27249f7395c40ca90ac64e8a0eaee615e0a23be18c2a2b74e5afea867b60acf8ddf7301055d2e9b6556e2b8750caaddea43764d08b5dbe1497cc7db2be2ccee30629fb313078fdb9fc4f9f01b9d7e2e9cb90fdf2654411be9914ac32fe797c427f2a3f5e0ab974226f243363e401c6214a87d6d33bd5d66a6f74f273c9eaeba1210b64089c7ca7418d0ae9ea96a6e3608b004341be48b3fb658836e80e9c3c2786764db9e239d115c206e2c5d846b20c33614aa533f068a9363f9e78b728faedd5fd5ac6c2b427dd0b00278d9000c2872ff0d2506b842847a65eaf93d1f5ed3267d63cf9128158e1d307aa6a0c69a73c3a1b9914c285981e40de53329e666a98e065354dae1c92765d0af2a1b19b7a3f102fe8a7ba53487879d77c8df704ee4785bd27a6083ab60ec00681a849c4a7064e6265c60e06924fe32cec542a40b1c89d81356cdb200e8429033f75ee3e3749acce3d130cca4e7892f68cd7cdfa8e122bc78530b2e8d0176d07ebae1b0281338c2b2ec14d71d211f1e5500ea3bf298e88b2bb39edc1a4614d0d5048bbe60650d351ec2ff4cafb7f29ed646885572bab7ca50503bd7cb1a6e40775276f4e3914a473acc0a6520ea22947173052c525ff7f69b4161bab3f4e55097adc053156eda0d8d255298da99b7612756be610b5d4c2d4c5622c2e3d45a00a2847e2e122a38f797072440f3b2860dc4a184d42f64b1a3db4c26d43cc3c6a040a1df4fe0cb81346469ee48b4c64ca3a163a234dd107cfa155d610e859d04405d90e1d6a6c4f5b5cd93fa65fc80abff6607d8dc1dd932abb1a760e5a05b8d90003f7429d83df3df24cad2012bd01134cf6ac445145c54434b6e12aea99ed030e66902fd5bbbefe4ec9d59d9e38da2e3e182da804b9cd69fc6516e5c42d12e409807e7e4661a8300cc35c9a5aaf05c74f315d301d3b58af8423e8b3a9dab2a5f47cb7bac961689da9c8480fdcd7699abfc7b1846b5406095930e305225408a80fff283d2ff7b05766873ea25e37a51af6e80fe42c040c09e1254fec0c561d7005078faf699880bad1bff0adcaf0fbbed6a6b708e993738fcf3f51307f49427b0dca0a31c36ab9453b909cc184d4c63908b94427deeaac5521a838ce0e7c6547082dac768455bb669ab5297535a143999b247d8999b9c8d041a2eb3bc3d152c50ae586639c731aa945cc0ee851bcef18a27d942354cb8d66ea356d8c2c04eb490e54f4fd74727b0237fee689ea8802a8d8c885884c216702e32c8e8769430e8709954ea828466f98d09e756e5ed6c12ef5eff3a4ee36c990542f935a460da469037bb52fb8e07f50801ab6a9b81b8eab75b73a7fe93b9d65b75679b3103d5e880aa1d7c47088f50c690def8612384bfd2f01dc17e184a9d0529735d34bba8e0704c1d20036078d9394a593de43e28afeed8e9f9e37a283de8bfa383f333281b502baab61d08ee55dc83a7a7bf7b9be015aa90cfaa3cf2c7976eb1616b6a53277079c48c0cd37af84fd9804839055052758c47dcbf861d6f481edd26426abec9b0f23396a7e14bd9f6ce9168c88eb5cc00c16e92c7133ef6cf66c16ab51d6209401f49e4a023ecaac0ec7ffac5f168d4e7d4ccf098bf7c59a769430b9131bad6500fe9c562cafea11ce248b40a51faf4a9a380b9abf6407f1184c05ab6f1c2caf0d83d399b9afb3f50c7d1b305bb321c14df0787e226ecd2def7bfc6b7c312dca0b255e606d60022c07faf74422223d45772072dc8a7452802ec6e0a208deee8d7da374add905f27f162b82bd779d88d0f533b9cb550de4b7a51679ba3469bf5b0d003038393e91408af3ab39972995190a27c377fd568695b06cf0a2c0f374680c7e6b2a71d81eb28f336edf96840978b03a9c42bc72c9004dea1ed37d1208670da75ed7d6209b278e9362c880ad85e32253589c0ba3fb6a613df14128040e4d0b37dcdb26edc3ed3d88b1c2608439d2b930cfff4eea3c5386d27928ad0f8af70b6e81677aa7c2ceb9280628cd810e5b7e175393342d5cd560ca14ead9574bc20cbf0d7268a249e56526af3029493eb31fd3d20160aa32d30a0f53c44f9d82970105a30031d96eb6efa0bca4d61a6739c37cde501a33ed7de3b8f1fc3ea696830c52fa1350698901ad198fa276f73406da4a2d4cac670860fd0da77c42d9c67305e4044076d2fb8bf2765ecb825e468e698130674102dc58f3c7fcb8194a6ad60546555d48c63f1354f34db8b6c6a381a4052cf4fd6a30ee2274af2da5684e3d0d32f2ad376e21aed1ffd8b3c0e48032a16283c3ce6f12ac2cc90b389e81f59c053fc9310d8c947f78ea37f66d2df64ec8c4e04b8bc58801a6a362802ad8c26106743aa699d067999feb437d92b438ca45bf1a8d1ca5106f6c8609f277a360f70b9237b6b9a393af4c7af6da7647c4bcb7b50da483f82478af3d99bcdbe4ef5e00464e5e541e187854dc98a69aa48fc444019a803cb71719f44b175e968330850f4cc9c96f6c2c24075edcb03b79a8d82d83b49db4a33b7eb993d48e4ece3d2a0f524c847d7f15c03e03708b96b6ea8eaca6a4657c3af0244e6401779a0ee21221fa92f13efd7721c5cc4500e7cdb8254997d8b73a7b2243f580a5e91cc246910e7fa7d13567b4164e6911f6722ed13aadd2a76f127a3435a4bd919836c363cb09ebf110b68ed56b28b4e8bd5d3e4568adfa509e914d98eb21aeaafb6734e42f0710aaa746fe4ea17c423f38ac951dd1007dc17486d2b823ecebf9fb9dcb62dd0de523f315c266de82c74f0378fcbfd2b030c0e1e30b034ec8f7d27946b8c86403863350520c89e34975e27b05df44cbcb017e0abbb6a756faf0b34f43f27529079fa6b98c8b7a26493a215c954448e1958f6f1aa558cee11352fceac48273440c199f152d34e7d3c805b35e61a2ce914b5e03dc5d7858ec15c44413e5b2569c00f31567df8324d01565d4e4e9e04d86f75f24dea9d9d24568cc0ff02740c50c06e0c1712ec5b711aa78a21e7433da47430ed76a9e5a20748ff5df632a9cfdce0d1e54ab98f2bf59db008b5c6a03c2d47fa12540d1c927fde4da851325e28afc0efc1fdd8a0cb2544e57306a0b5f486299a713a8cd4aad16b38f3c1b789937690b35287cdb337f33ce203d6303892c64e8be17016436717ff0c5c1af6ad7082e0b0bb3ca7bdf4a6369598e25d28c42189fc879daef22144424854ba28fef20680b5d32e9ae7872d9c134d6d9fe5b0ffe9352ceabd3805a6af5ac2b7b6234af960a77523d6e80b27849bd7f784a98d2422ff79c902f9dcbe4609c429e5b4a9fc90b15bac05d97ba07fe3734d3f7491c6a962ae942f382a7d28ea1fa5302c51bb40ccfdbd190f3286cf798bb345b51723f6e8ea8515534773a340613d8612db8f9adfff3278d190f7894a6ae534e2ef7a0a8b7b2fae577aaf438b62ff0e4d79b8a0856a76827f3e29042f3cb444e67dc16633c30d8db17c541ab4db7d81fc5a32f00b3609aa0b8d2544843206117a826e456a41aa87d80d320c09f1ac0f93ed8e30a22b70ab8b6be5dd1288e09f9c20906d6bca5f0eff1e2ed57da9465ce60ecc00faeebd450c3c3ad2453b75c18bdb725cca06d8cee657c77564ef03cda16d06f0d8e5ac1cce961abddbb5879738d04997263622263d9f27ee8d5868814afc7a2024e8807bfbf6943fd0792d13b9bef4ff83ed82f0c34df5f9c42aa472cc2c1ac023e152321855eb77e8f762d5b6937d9e7cb3a9f3c2419b806203aa2deb57ae90680a3c83cdcee63d0bf296027ef22cfac0938f9b115359e6c6d91306dadb2fb0441107ab8a88b18f0bde29fd68432767c7ef193cb6815c4456eb0d917b9a9e80f4cf02dee189d4b8accb839002f8b6eba365c9f3f693e156932c09941bfc64600fa9a1ed117e99068c3220c9f0e94b9d7c122c6c391e8f6dc0ddd0ec8097f4d0da7e3987fc86c5523fc788c68b25f86ff5e347849e71171ff0f5c6b15a0b501076b1dcd3e4ba22639beba069d6c813548c99db963077c1f2bcdd173f38e79bb05b450a4748c5959889f22d53f62476626e22587a023dfc4517d49396b0c2efc05817d8187aee15d20ef0f623615bf4da108d2429e596dce7d8e9fe6e8596c06009824b7bc0d7dc58a097658babc3701f19a7210f2c197eea886c5d00dfc50c108570002d437713df562fa1e3d67f70450db016570e1119532ed0e3e1bdcfd3155792e33a1110e87d24c8eedbd1b5d731c4fdea67a7d31168432e7d7cfd6564706d6a5c45ffc307daa0cbc600a5e6e3c9c82d493388ada75deffd3c83906dba60d6de0af97e952ddad74e59b92013a6e55d63a0289e09feb33641ae2bc1b2fd60e33ebb741b522f6c0d47a331846edd4f4d82223d193e0e5aae4b88750280b5702afb63b883a67e6a442ebaf9c7c60be8037a040c0a6e1814696ca2238717ecc0ef670db23a3063db45d74557d715d643255f5cc2b02ce024a42a2c4f48d0a020c4fe82d187b3b6edb7e2e9444cb2cb3b8862523febcd7bd5e7549b5031eb8c90c27907eadeef4328d325dfa862735dc9ba8ae26df2fbf9712ac4fc813122ea10c0ffd43cf70c217fbfed3edd012d66d959d03aba43873f87634a3ec91efdc920986321b3ae6152c4e1688b81775c069fd5a41e71e2dae304bd5c479e3247ee20a94266393a0761debae592b659f32e71c39343636ac1ab2d3732af1fa9778d701fceb0b71bad10c860e51e637430e6520d5639c6a1c430aaad3802c30a92b500fe55616cfb92ae1ce65f3eba6285da428c7849d24918f6d3bf5bcd8b37db6a403a3220064e82e94bc8a3df93e39332b133bda28c866f30e45c824039e448ef70459086810004d7613201583e9497b5c17e878238bc1280c87ed2381b8fd30860656df5be83e02f18e2308f2546a553299ca285b53c7f66ad0297c907e01dccb021d0e21631768d826068eeb457b877f4009977de0fda3d981dc3887515060c50b6cbeb0704498abea125f623107f97b33daf3ba02d619b6edb8223167fcc1df4c1909cb506805d1f464b1ebeaa69a1b1a0cf02387504296c7ce63c61e0385f00036dde496366c9988b48d904c4111379548fa829d55787ed9c629ca873862a40648f6f8e24387826471f8e6047baf0babff8f21cdfb81d4930749638856f2340d306f636d277ae1792f84a293e4f66350c75023a1b5967eb40a43c440a246c60342d8e7ebaa4ee68b8551b9807d7b308574a90a7c54134112d6fdb3151af2c90a2463bad24e336dd34bffcb34713b6802e711a168e4afd30bfc3dba82550fba036a8d9f5070875b622865ce43fa773e77ebcca52dd7fb846aca9c133eb93bfd08030bf7d2f95f541cee1f8ede2d0099177bc447d8c67a6d3b05ee3183498b1b0a9e8c271f40e36941df4924502e31d8122d28fef01063e9692152371ffbd44d0d54b527ba4a550b6191a40192e1735f9e9634df5647c3580179ed7f11d893890e968845f97aa642bccfb6b9e84a4d68189d59fc729f23059dead12b5bce438403aa7a1ef89da4ac0e4617a978acd99ce57213509702e31941dcab7530c902690a7da1e1c0ae121c31fa19cf8889ecd8b61cf086be7cfe695b172a36cdc326d504e55918e88a21efc120a54ffb6f852d5b97ccd7cba3ed1e44b6fda91be7b5de0589ee42794cc797c25249a9a6d40f873e52b491389065a950c8aed5b6675f5c066d1dce8ae2cee39a8f7b1c4adf5fba44fbb41a81b06a5ca9b597ff6081d89a0edf9d832bc866de4095119e7fb0eaeb8930b705d0712aa17e11754ee27da80105befbd6dfc2d3e6e8a040c080a7d4508621474e11a3ba7fee3a2d6ed428324c22d723f61c46b0dedf57ed8a1f5b4588f9922fa5bcbfe9cb9d97d558a4030e7809c1057838edc60be81f357bf466bc5b9fe05d58ce8009fa509db7d24e0404f609b7ade4df5611ef00761069d18aec275e33941db96feb81abcf87171b7d54f0013d88f8d39dbcb57df1b0a3a3463bc75995e8193afb08815de576c1de957b700aba945788360754f9575a3d9c3909e56b171e193da4dec2789cc41ce933c82904e5c4c01c218680c44c46ff1d501ffef20d6a5b067c523ea161e115e7b0179007835c82d226c6d3f7615d13ee729f7c926d429a33302cc61febb9ec53d24dcc00322740613d4714cdf380dec0673929b91f0c173455c1d5f605b3c2a2998e970309c59130a49a6dfe6b9f56d4ae04e21e9b14034e54e0b8745ba2c918f39d2f0f95e48323f664da395a8e2d6e294c202a51e5cb513a664f947deb2ce6c270000632cf0c9decc4857d801b939cb2e97498832d469e9487978a447e40b25904f80ce5d6e7d6a32ea5fdbaa470d134b318b41c8ab7e8cdffec513ad4cc2abe280406081827c389a2c247d0ee40235dd62f1ffecbf6aa3389abda43298ab752f9480f898f59005b4d8a2fdc4631bf7f2cb10a6cb789dd028e5ce71f0cb3512b3ed30a497bedd241b6bbef8bc099340e859f20d47d928fd1bd804eed2b41e266dcb00e3ba7ab8b1d442ef9200458654d613fa08ced2b8d86cbc27260e099bea23e4904e5ce096899cee734b4a524e714c1b98e9acf571563328ef71d45e3bf6fca2d0bafe7b32ad8919db80210eaef8c2c89bcbbafabcd6d5292cdfe439c1a9f1fae66090411640c6ccf905547102b49f7a025a3c7e095e9f7eadd457c147d96210208962f737018ec057b427e2d31ca7eb58b25e9fc4cf7cd9550129035d6b98da60ba7919d4fe9b99e4da7598fe85015c43be4eca45d1913458e9db9bb8a155c1a0eb64774939673b8914c6bfe98348182ec3a222da702175ebd2b8c970bb878d807858ebb7d35f6675bd2f4ab35af156defc38ca3fe0ec5b305f2d13481bdfaf40b09d0076aa6d6e2de0a284fc8027f7ef58df0eba11a524764b4e939371566a50a2f1c2171207626099ea70cbb62112001ce82353e7640b91370b2a277047b9903e6aac7bdc67db5d1e316b7ecd9d26d9efa52a1427aef62ffe91d19e5549f9106059a55d8085e937920beceb69b6233a950913aedb6c9913853257d80a7f2df09240a0b0e2265f861f25f3b3f020295e4c3a557d8f210a19713fbea955e2fbc00aee13bb44e9d935d547cf7b071b05d94292a4d753018e4b2058fe919e98fca0209f9e3815440b6b34990f49af2210cb6074f74dc7bbf5804a6a2986c2a1fe60c70493fb69d8a0a256d3ad34313bb2d88cd9e3dbee169bd656369c2ad0b598e03e2d43843317dcd53af92eaf7de73f89d0aae108da35e9639a951cc4e6bb6bc08478d9108aa862add6731184656515718c3bbe4c666bd3730ecbb150447fb2a0f6a1cd0c4c26f836163f5bd045d30243b49e10bedad9c3a974faed2469b128d02025202ee0e8e262e50081c08bf278b9de30afe9fa80ed99f0b50915bb83752051ce7b914a5b6c8eb0e4a2de2f412a377ebfbe8e3f409ef8580b4878a380c11e476588b8804b369130947a7b805aaf563125b08d79fc2a7a6dd59edbfcac7aa08de4ec98ad49fa4c88de7702238c883b2790c56b5752326843113fc7a3e860e058ac662acfecfe2f803960414b6c5a3f0e16ba8bc45d2e9442b74d13f7774f30af7f4cbb7eb1a2545914dd2562cd1cc69ca12a46b76e4b3d0fdaf520e4a4a7f0dd8ce412d8b0567f994a8c1684e5549402078b59200b8b697c776e6e58d34cd0b797938f4eba967963055852af7194e1d776f455e2e84402598e1ce415f8720000531b2935021bad2348c4b5976d3cf2d89626138a5f204102559c592a33be507dd596db1cbc03ab91f1f5a80729619bfb1bc830d88188e3f9593fb430d4050092f9064ce03ebf328aa662c7adf612240056e0418f531fe086f19509d44cd8e0c83393059bff678437c3d61acafab248c7b41119bb777354b836e9752849c80054fcad749c5660627ac7a24adce564b62426563b0caeb16769ffd5afae42643071d211d06f860445b0a384ea4275a1f6f2b0caf11ec2fead1b8a8abd71215fb0ba65cee1f28aeaf4fb54685c4b9c1d4583d05be800fb3b392c9c9b16d45b4740589c45a1d7adc9fbc4a8a91a6d95a256954408f1e1794b9b73c7fa92d9d1d3d0d62e035bd6a3c91f354608ac7d002f1ec1481b92fe1efb47dd717c58388432e0821b4642894dc1d95bbcb4bea812edd2be509e3723eb27dab02f0aa5174bfda011bac757ac05198bfae729198b21ad83ed77d7099933ca8d438223eb5172e29005f8d4bb439e9f1fd7d9319bc235a800ad8cea46cf72aa161403411fcd239c2ccc1caf86b559d263ec57ba80793cb6045195b2306dc2d3d1545b4f9f628733f0150a751cc8468d64e4fd87d8f6808c387112ea6cbd2747347a2702a1c53d036061c256f19897dced055dedc2f6000444b891b2f0f103ec52169bef5620ecc8802b9c40573c76e1a18907d9aaa82cfde4f69fbe29a031ae39e9d47161b52561104b9c4272fd23a758596329701d313cf2a2a5a0783b9f39b0d9d376b1a53d9aa02008e31c110ea76d7f3dd3b6119d18436d7d87638aaa30c633eef1fcd5923ef0f702f504ae3e3157382c50c022725f50e0de515d1bef117ca08d832e098b0240e6c2be19c7e25a8f32f876f4ea74809a659e02b8f2ec908dbd119ccf0edcd790994de8034f11691ac2cd6500c32e20287e968196dfd93de98d31a5733b19e7a0735c541ce2da123a622e10b79abd68ed242218fc198d3fd9bbe3dced2aabf070750593ef0ddbcf3da82d63d30faf24289e054434fe9b2547de07056c2ae927f00ddf5820c7620d2b9cc0f5047fe4a74d163cc3813f5465bcad682ea0be2d0070d34b1b382dc98e343b261a1a605ce916498f476b2131ff2353e1f9a3ce3e71902f2820f6f514b72f32b2a3e2d50fad8c47129849e2643ffd978f3d6a8893a6a0c1dfb540d9405f41c1b62bba4b0893273535b223deb4bfbf64c2a8b6ac040f00610d5d9beda68f687ebd4035c39c45cd80cef2c15ab5f35f24af9c0560ae08f07b50751c330e15f3ee3a8e07783dc00ca6b8f78d465d7dea2c8c83de74d5f000e240a2046c4d4346fde8802305e568074e94ff89cf0a3d5346eb77564c35b15b6b5746f3412f0a78c40323c98a985c255d63656bf1115c4c826622d462b26f608130852be14f740b8570f5f4a5511b86a784c51a5e4fb8e945e31c8040628da04fcadb8cc0c23e4b24bf2222932c7893ca6b9904dca2ff8a4968d35a0d368ac017496afccec6a815cb767f0b779ae95e3ba5260724a34f18cbc9204840414e60344dedaec24d73ccdbe4807b8f1555c074c94f53d94177fd1698997c431bd100d9a501dbae938247f5b77eb42505ef9cefefd4e7f42287903b316f036dacf80089174621ca177d5a71c9aed771de721522b0f72c815e97b130f1cbcb83877010f56c9926851bccc1f48abeb9972a7cd765435ed59666c643e8bf9f6f0dbf91e0c32da0d9416c4c27b002fe1547ad2406532ecf44c89e6245ac041ac0ce4e4eb0d7ca53b3bab439481930d4e214b3b8460354614c9fc4a2c5035671c4fbc522d0b0ea983f506dcead626b4f7932bc9b7f497f8233a1556478c0786218bac666e0ea9e7ac6a29eba7c27edc4f25dbf6906883bbf4ec47d1ebf38a3fb70c0df46f0b0541a8b5e21a9ebfa0a08a660daf10a2dac0d7c8bba437f3b931c96455b58805b0d522d58f81354805dc073ae2dfd82bc827ae72807fd533687f78a450eba70ef15be34213fc5ca3b3762944f1d018c46e7bb0b9829132633e54528c7178b7000c3852eff49d00338308b216cf77fa36f67130ca7424138560ff9adbbec1ac0f3c300aa9725662614ee790040e3668b7b512e4953b5a68a3df04f881978dac0e77be03f07de3ea414ab5de8b4148df7b2c7548de2392fed2d26dcb61deeb329a434e34961ba8fc0a8533731fbf13923c60ecaece5ac0633100fd18b1a47ab40a9c3d10e14fdd5f1c448479b933db813f16c87d74e925e91a370be9d5cc5f550f3bec745edc71c836a48d90e51777f2c480f5338917fa9ab9ce258bcf6eae6708542e1d2ac11c524ee41c307b7deac63d13dcea39ca2a3fe38f4fe0ba59a6f4052485619c52efba1b68fb0f0ef5aa921cc57fd1d341f3556a1d6b73d17f6db60b496621f542826cddad8de2e517258ab046842f696b9c4f2835506522f9d2b50093ed535605c4815979bac5627c103f51e4ad001e6a600f0d0b4ca4b81f06390b14ad02ea0c3b0349824c1e0573549bd853d20cad9fa1edcca9bc566014f0af06528ffe2ecbaa066240c9bff71fd5ddeff863b27cb00a74fccfb1db5499a8bc06eb01cdeb3b01b261e61f3fdf0f3973a4e1104fb997c8b6e3ae436f1ce0353c028c292daef3187740a653da65cf9610bc22e0fdd7dd5ae16293b057f31e8db002edb9e8b76d70aeb7d1aafa772a757c790590260f51c7671871f0df38f6cb230d84ab59ad81a924c2c8e28a7537ada86ea383b9476311c1ba4fc3ab2cdfec0205637c21cdb13444bc4b3a74e18f399b62fdabea074a3fbf866486b4ed86a6a4068b85c656cca6ed3e68b35175e1924973e82d462e4c2704e06609d552f5e81203d04fbbdf96911fd3fef07f359a8ea935d5a3657bb773783cdc060395d0081102f50063354fae3f6e43ab851dc5c29fc36d48b1e654b09260aa5e62c743cc6b0861f9bfa62752561e2a80f8275dc0e2abaf8f65572fe4fe8e8ccc2d91bdd7c6468783932798cf483e2b6793f0fbc08495d135ae16abd9d334a58bc97de071d10bf13f1dd379ef24f8e41f63787166417e18e5960f38163fb0b92a7127fa22ee03db3562c139a0887a8820e0f85f1714fd29a59d500474f92e1187bf9729c7210cf85a5b1f13d581dd7b8b25a709888f147420a493cc6e036ab9c6366c0e4ebb07026b0e3fd5b34eee445669452cf92bbab5fad18b9b164179b2bd489155c017091a448388d6ca40cea2523618c4a992c37d3c20a7139b940417cdda9c7852bd082bc30446d38f51d4d3ef9b4a8d2482dc05a1efe359d65e9fac6d673fc3a9570b123f5a609851be3b90461ccdd602d85a251164e1c757ed256c4d92b10bec9302a5e9f89069c73bbd2266ab755a4575254a43604b69965de8d131cb812e6a6e0c56a983915850fe148d329c29d15eec67464427da9d763b89c52995b32c1c500ff81d35fa348ec90c2f4680c1e073fb259df6a4dd145b8951e017948c2976050784ed0e7207997ffc619ef2ee4e53fa88af9aea63cd2f1a761151bcab58025a07e3a2b2ce40f9c25e0a88d82efd67c0fefa4cab7cfaa290865508e2e17edee80898d4eed281cd7a8d0e4090a97ff3cbc0ac62712528b367a32bea105840701e0c6588cd1a118bc1b8c4625a3e48f69b779f0f575cd2e505b362051021df8c1b04fb273a52cfe42e7fb16164d3218777622f89580bea14ed586073df23c6c9da01574ae621f62af3728281a4c3cffcfd6f192324ea9eece0755366bde98b5daf0e2b9c58587c15f7b76023125dfbd5fadb374d71481f4427e8a15eb189ee2bc4cbe3bb3b0fdcac5fce8f46a31e9a33a1ce34b8dcf22990f9e15218f67d8ce5470ae819fbd3781424adda93c5a443cbb6c209b9ca424c0eee28ab168f05331b610606f7a9f33ed3ea477451373c0f3578017beacc7b15fae66c0b11abace6d3860bc48977b4d2a9ecaca3b0e3f43b4583f86d560ae1ff0e2cb77edb5419deea3f0cacba39780fc58f3ce0c29c66a3591892c176e1a7d3bb54fbcec8f79fa2bbc004229afd6fdc18c4cb89edf1459ee314763cafe1e75287615c3dbb7f5b05fbab0a9adf444c01a3227b51509dc5bcbf4e6a2eec548d68d1fc6d1bb52673c7efe303c80b9b1cacaac0cfd73dcca1618f30116410c8e6a1475fc191bd6a080b0166087aa6531e59f9d96dc30101580f2cac5efda8fcb7996e085fac2ae03f7b0a460d5cab710600c77c4d3f7f6af775a422b9af2b687d6cab4ddff8e6190e0d9985035f6529e1a277a089ad1b5894cd8f1261918587b89e66dd9bf5891943a319b607ebf127991ac2145696f4b8489d14fe076983381b0ceb983014bea17aed90d90a79d2c9c6e58453483488bf5c892cce23273e98ba4847f39250b126885643ed00540fcb83defd5588e0a342a4d5f73b815e8b18c7d0c7a9aa32b86e65783d2b07e2465870e9a8e1364e6baa88dea32a47f215f661a692d52c0ddada551bbc8d0db7a4e1e987f9f330b0abfcab7318c30fcb4d801f008bbadad93172b8d8f0ce085648a5b033e7f5921900756f12d59d70334cfe24a848e1b85d83e316d303a100add604567b2f5703238410cb63177a22dc934864af6763498346f6039ff360352519cca87dbad1d3f8003bb46a9072b8b396114731d0e1f0df03fcdfee3a0401435fcd82fb448d96064ca438928ab3f2dbc705ef16e9b9dfd65ae8d800a49c0162c35f8ab595be1da87c6c3a8e10886b16519589f22a260d1ef3c2ab11ee9204bda92882ad266b29b1eb64f959c3cf828b27afe849a61195870c65d34ea70706c0944f8091ea483dbc06745a8658dcf5749cbb4887a079399af13cfa69a306088e5bbc7389fd33bbedc0f8b2bcd730b8fa0fb7d5c957a4551e9dce29c4b15f04e057cd99771aab75a7887b82cb12453cea07f785b4ef560e654eac26a079e90a9d3a60c39c1a3a301b9b3a2a0bb7c7071c96ce37bf59b1b847632ceba30b5d044c532e896c29fb2b3769aa0f7495f97a3475a718ce17479f805ede3c893c8d0c0e362207bf9a4c5a48ca988550185e3d010a52b4ad65bce64419142d7238c80020e43b99cb80ceb18bc6a2b045333f8ec169211dd26dc8dfa398691f1d76d30f1b4204a9113a1e353594033e50c908cae266ccd449bae6e030a0acb6619b360f92833140fe243c5be4bd1fda19455a96818f3cbee2232383fbb909c615d1050b687f4451524d507cc9130149899e040927a553b90dd324d57db73c08a5fd0e013f08be740ff23243f87b2c0f4fab5d65edf4e7297ed774852e423e9412e7be0f99a677719928d879cd56bcabfd4dce3ff96a7c5ce34f23471268f42d4b73990295b03026c77645eccf963218535168fd08ab0969ba97b812b6bf3a598e710f09450dd5123579658951b21eb143e4b76ee660a32654a0723e48d2069dcb52edde0690dbbb2bd0c2de2536eb40c89238127c48085de1eb89c8f5bd3208e2c2292422bf268ade80cb5331cbf74cb7338f5d8c99b106b837d0b7679b40907ce4fc4a054bf6418951192254108b6765270f70cecbc01f3e145ca05f1123ad79f8f09bbf7320af0e1802202b1fccb190fa8750d845bd8ea324bcbf558233ae7b65835aa84a144c11883a3a19c084b9c9a9e4a4fbc4a722294a0bd35a8374fa6910fe4b635c8ab7bc1a7951f0f16cfea09a52ab31e5c85848273df135cfacf630e2e8db9728ef733e2adde7dc65b29d6816743ee4b57cdbcc507ae8156edc3f5548e616439cc02daa04a7e0edfc5755b0463072cd9f1480c33e7730e098e6201dd68c35574847b37652d8dfc7ab8eb88788fcc3a54304f69287396bd6783c33dd2f9d92e6bf19bd48cd062b5a5b222e8cc9a84883593261ee7308701453e7250749a7b0f26a28be17dbcbe096e717476b12c1093da5718771a43de20d9b51b76c3a206946f097408973c8441e5a94cd160192ef7e6aac57b8b82ca809f7e504fb6a48dc58a18f5fa5952de6df1f3af19d3041b908946d480ad2328876bc22fc174762e475a5502d85e878e536a78f06574df2119e5c514f8e78910659bf079b189725d9ee0918829b2772828ea6691664868283974656827c44687c47b6164aca68817a888859e80063da37ac442386181fa238fb2db123b49d3f158c2b8a444c80c9c9", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 69812464, 37032133, 1422726, 375448, 406581, 449851, 89069, 223269, 53240, 11155, 7623, 1417, 10229, 2962, 8755, 3275\n ], \n \"k_image\": \"dc006e92fc1e623298b3415ddccfc96a8cae64cb7c9199505a767a16ddd39bb9\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 103642483, 4588979, 374943, 521809, 26666, 551559, 3541, 78919, 74119, 7697, 22074, 98, 2069, 12520, 991, 2010\n ], \n \"k_image\": \"d656ac13a64576e7af5ca416d99b899b0bafef5e71d50e349e467fa463b13600\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 100689894, 5890444, 1600331, 1239916, 10246, 40615, 93596, 29367, 209178, 31832, 15976, 15524, 7738, 4618, 18000, 13238\n ], \n \"k_image\": \"ca559feaf79de4445ca4d2bcc05883b25ecff2f6dd8fd02a9a14adea4849f06f\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 105335893, 1720661, 603531, 812185, 907612, 95130, 38652, 233260, 38021, 31218, 30355, 924, 43414, 12072, 1861, 5511\n ], \n \"k_image\": \"c5b7d94e661c5eb09714b243f3854cc06531b1085442834c9e870501031b73da\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 83622788, 22585650, 1698763, 363844, 674080, 176911, 33802, 60550, 34474, 499122, 34507, 109012, 2600, 2390, 11762, 678\n ], \n \"k_image\": \"a5ebf4914f887ecdfde8e7ef303a7f2cc20521a2a305ba9a618e63d95debfb22\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 55266410, 50443346, 326237, 2547259, 482686, 131728, 345875, 70764, 60539, 195316, 10817, 12486, 12413, 807, 3774, 430\n ], \n \"k_image\": \"a2b08a090f611ea1097622cc63a49256a2d94a90b8dbaaa5e53a85001c86d55a\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 104851338, 4432225, 322623, 60187, 68448, 12770, 87943, 31366, 19015, 11424, 1280, 4638, 1761, 5270, 251, 2\n ], \n \"k_image\": \"88f7594b26dcbaff22f7e7569473462c49d8fb845aa916d7a7663be8b85b8553\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 102449564, 609569, 3134675, 460320, 337596, 206075, 2480844, 10681, 62016, 8415, 133990, 3772, 6574, 1860, 4700, 386\n ], \n \"k_image\": \"7d805459f05d89c92443f43863fa5a4d17241d936fc042cc9847a33a461090c5\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 85856596, 18666365, 2117553, 3040618, 42521, 22399, 31727, 90148, 4179, 5683, 1473, 18506, 177, 11519, 809, 461\n ], \n \"k_image\": \"65bb760c9a31da39911fa6d0e918e884538f0a218d479f84a1c9cca2f9a5f500\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 98769080, 9556352, 1282527, 34176, 70608, 21210, 55660, 5274, 64238, 34977, 1007, 102, 8595, 1858, 4821, 545\n ], \n \"k_image\": \"52418ac25be58fbfcc8bd35c9833532d0fa911c875fa34b53118df5be0b3ba48\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 106117516, 1882646, 1340386, 177924, 75683, 23939, 173054, 41750, 12613, 11467, 26614, 986, 12504, 9537, 2244, 1642\n ], \n \"k_image\": \"40e57cb9a9f313f864eef7bf70dea07c2636952f3cbff30385ac26ee244a4349\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 93868601, 4410106, 10612916, 475622, 117796, 118856, 41271, 73043, 1460, 42279, 39533, 56372, 18003, 6324, 28140, 613\n ], \n \"k_image\": \"38d739cfb68aba73f0f451c7d8d8e51ae8821e17b275d03214054cc1fe4f72d6\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 105407900, 3217068, 803785, 210848, 12516, 136889, 48021, 10018, 10953, 16966, 15097, 6490, 2934, 959, 6245, 3656\n ], \n \"k_image\": \"1eda8e08b1024028064450019b924eca2e3b3e3446d1ac58d0b8e89dc4ba980d\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 83903567, 23002177, 555328, 1306991, 335319, 250467, 189789, 255613, 34743, 46807, 20533, 1166, 2110, 3917, 1713, 649\n ], \n \"k_image\": \"1cccfcece29fbd7a28052821fdd7aac6548212cab0d679dd779a37799111f9ec\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 72075355, 24982880, 8841419, 2959414, 91310, 33396, 253541, 140692, 134207, 323001, 19328, 3000, 36052, 12670, 409, 3547\n ], \n \"k_image\": \"05138378dedfae3adbd844cf76c060226aaeddcd4450c67178e41085d0ae9e53\"\n }\n }, {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 87891367, 12499871, 3444223, 3817265, 682721, 1065395, 247912, 136321, 50631, 28848, 18744, 14334, 11562, 167, 213, 718\n ], \n \"k_image\": \"0007a41ed49aa2f094518d30db5442accaa7d3632381474d649644678b6d23c0\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"8c2ba531d06e4ac990213d765751e89981303d4714d81229ac09e385c8ac1cd3\", \n \"view_tag\": \"c9\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"0c9d3c41171e04e42f6ed61a932c2ecdb5c0103d7cdd909fa0ab15881469c66a\", \n \"view_tag\": \"f5\"\n }\n }\n }\n ], \n \"extra\": [ 1, 184, 72, 194, 203, 248, 224, 238, 74, 152, 75, 246, 69, 192, 230, 17, 132, 80, 151, 16, 114, 161, 141, 35, 182, 207, 113, 111, 11, 246, 129, 253, 64, 2, 9, 1, 208, 254, 203, 171, 207, 80, 220, 87\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 236860000, \n \"ecdhInfo\": [ {\n \"amount\": \"dc9c59cdde692b10\"\n }, {\n \"amount\": \"e76b3405d76aec5c\"\n }], \n \"outPk\": [ \"479df6fa3357cbddcb22e20d2b458011dd31dfc1c78316bad7ed9ffd39ba12b8\", \"6a8ad571f7f5aa9668806d10d2b03c2c84c90690e4ddeb3dc6f870fbd5df5b09\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"c55abb99bdda211773d14dcf7cd68ca2c2e1df64896976c36da0b72b9b0b5abb\", \n \"A1\": \"f68499752558d3b7b342a554f91ea3171cba93075d35968565e37020bd60f6bf\", \n \"B\": \"0086548c6fd600cc04f704607fd008bdd1ef83ed341109114d9301c30a86d3d8\", \n \"r1\": \"7b9a9a3a6cf62d4aedea2cbe4f48af3a830c33486b3e3c7942ad7b4dfbc32207\", \n \"s1\": \"6cbaf3b5e0afffc36549482dc4e5220ad7be9284470405e2a889dc4b0eda950b\", \n \"d1\": \"9eacce92f4b6fe9bbb9f853cd5a68b1ea882a66fc1f86df6b7f21ed49e21fb07\", \n \"L\": [ \"0c2330673beaf7961285d721e00c55e6d97b77efb12cfcdac429cbe92fe7ed64\", \"1ae9878d713edc784573be96c47e80dec59c487590f721dda777066a66a388a8\", \"cbd007967d90e323d91cae997f9449518ca71dd5e0473cd88d52a1b63f4994cb\", \"355fc68976cdff244295ea25e9d579eeee92211f52ed942307827480bf639e9b\", \"945e1f12d5a0369f990945dc143dcbb3e7bb7eada7b4e10ccf65128ab3a203d2\", \"7441035465a96cac073e12db24bb696f38587021576582596bd0351ea8dcd301\", \"23af3e518560a843188e19aa666d9b70d7c55b2072c3813f05084de714988a9a\"\n ], \n \"R\": [ \"e21b543d2d50a2b7949e9c6ee3638731aa1f19909ac0978ef10ebe83e52558f6\", \"e96814d9b64fb0344d8a37e43e9933a9bcb087173ad895400a680f3f7919a585\", \"572b4c0639855b4a146492b00c82eb9d7bd9566aa94387e79f80561676a045e4\", \"be44d3a42061a710a8c5be6ac2af7531504911a4e17d27249f7395c40ca90ac6\", \"4e8a0eaee615e0a23be18c2a2b74e5afea867b60acf8ddf7301055d2e9b6556e\", \"2b8750caaddea43764d08b5dbe1497cc7db2be2ccee30629fb313078fdb9fc4f\", \"9f01b9d7e2e9cb90fdf2654411be9914ac32fe797c427f2a3f5e0ab974226f24\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"3363e401c6214a87d6d33bd5d66a6f74f273c9eaeba1210b64089c7ca7418d0a\", \"e9ea96a6e3608b004341be48b3fb658836e80e9c3c2786764db9e239d115c206\", \"e2c5d846b20c33614aa533f068a9363f9e78b728faedd5fd5ac6c2b427dd0b00\", \"278d9000c2872ff0d2506b842847a65eaf93d1f5ed3267d63cf9128158e1d307\", \"aa6a0c69a73c3a1b9914c285981e40de53329e666a98e065354dae1c92765d0a\", \"f2a1b19b7a3f102fe8a7ba53487879d77c8df704ee4785bd27a6083ab60ec006\", \"81a849c4a7064e6265c60e06924fe32cec542a40b1c89d81356cdb200e842903\", \"3f75ee3e3749acce3d130cca4e7892f68cd7cdfa8e122bc78530b2e8d0176d07\", \"ebae1b0281338c2b2ec14d71d211f1e5500ea3bf298e88b2bb39edc1a4614d0d\", \"5048bbe60650d351ec2ff4cafb7f29ed646885572bab7ca50503bd7cb1a6e407\", \"75276f4e3914a473acc0a6520ea22947173052c525ff7f69b4161bab3f4e5509\", \"7adc053156eda0d8d255298da99b7612756be610b5d4c2d4c5622c2e3d45a00a\", \"2847e2e122a38f797072440f3b2860dc4a184d42f64b1a3db4c26d43cc3c6a04\", \"0a1df4fe0cb81346469ee48b4c64ca3a163a234dd107cfa155d610e859d04405\", \"d90e1d6a6c4f5b5cd93fa65fc80abff6607d8dc1dd932abb1a760e5a05b8d900\", \"03f7429d83df3df24cad2012bd01134cf6ac445145c54434b6e12aea99ed030e\"], \n \"c1\": \"66902fd5bbbefe4ec9d59d9e38da2e3e182da804b9cd69fc6516e5c42d12e409\", \n \"D\": \"807e7e4661a8300cc35c9a5aaf05c74f315d301d3b58af8423e8b3a9dab2a5f4\"\n }, {\n \"s\": [ \"7cb7bac961689da9c8480fdcd7699abfc7b1846b5406095930e305225408a80f\", \"ff283d2ff7b05766873ea25e37a51af6e80fe42c040c09e1254fec0c561d7005\", \"078faf699880bad1bff0adcaf0fbbed6a6b708e993738fcf3f51307f49427b0d\", \"ca0a31c36ab9453b909cc184d4c63908b94427deeaac5521a838ce0e7c654708\", \"2dac768455bb669ab5297535a143999b247d8999b9c8d041a2eb3bc3d152c50a\", \"e586639c731aa945cc0ee851bcef18a27d942354cb8d66ea356d8c2c04eb490e\", \"54f4fd74727b0237fee689ea8802a8d8c885884c216702e32c8e8769430e8709\", \"954ea828466f98d09e756e5ed6c12ef5eff3a4ee36c990542f935a460da46903\", \"7bb52fb8e07f50801ab6a9b81b8eab75b73a7fe93b9d65b75679b3103d5e880a\", \"a1d7c47088f50c690def8612384bfd2f01dc17e184a9d0529735d34bba8e0704\", \"c1d20036078d9394a593de43e28afeed8e9f9e37a283de8bfa383f333281b502\", \"baab61d08ee55dc83a7a7bf7b9be015aa90cfaa3cf2c7976eb1616b6a5327707\", \"9c48c0cd37af84fd9804839055052758c47dcbf861d6f481edd26426abec9b0f\", \"23396a7e14bd9f6ce9168c88eb5cc00c16e92c7133ef6cf66c16ab51d6209401\", \"f49e4a023ecaac0ec7ffac5f168d4e7d4ccf098bf7c59a769430b9131bad6500\", \"fe9c562cafea11ce248b40a51faf4a9a380b9abf6407f1184c05ab6f1c2caf0d\"], \n \"c1\": \"83d399b9afb3f50c7d1b305bb321c14df0787e226ecd2def7bfc6b7c312dca0b\", \n \"D\": \"255e606d60022c07faf74422223d45772072dc8a7452802ec6e0a208deee8d7d\"\n }, {\n \"s\": [ \"a374add905f27f162b82bd779d88d0f533b9cb550de4b7a51679ba3469bf5b0d\", \"003038393e91408af3ab39972995190a27c377fd568695b06cf0a2c0f374680c\", \"7e6b2a71d81eb28f336edf96840978b03a9c42bc72c9004dea1ed37d1208670d\", \"a75ed7d6209b278e9362c880ad85e32253589c0ba3fb6a613df14128040e4d0b\", \"37dcdb26edc3ed3d88b1c2608439d2b930cfff4eea3c5386d27928ad0f8af70b\", \"6e81677aa7c2ceb9280628cd810e5b7e175393342d5cd560ca14ead9574bc20c\", \"bf0d7268a249e56526af3029493eb31fd3d20160aa32d30a0f53c44f9d829701\", \"05a30031d96eb6efa0bca4d61a6739c37cde501a33ed7de3b8f1fc3ea696830c\", \"52fa1350698901ad198fa276f73406da4a2d4cac670860fd0da77c42d9c67305\", \"e4044076d2fb8bf2765ecb825e468e698130674102dc58f3c7fcb8194a6ad605\", \"46555d48c63f1354f34db8b6c6a381a4052cf4fd6a30ee2274af2da5684e3d0d\", \"32f2ad376e21aed1ffd8b3c0e48032a16283c3ce6f12ac2cc90b389e81f59c05\", \"3fc9310d8c947f78ea37f66d2df64ec8c4e04b8bc58801a6a362802ad8c26106\", \"743aa699d067999feb437d92b438ca45bf1a8d1ca5106f6c8609f277a360f70b\", \"9237b6b9a393af4c7af6da7647c4bcb7b50da483f82478af3d99bcdbe4ef5e00\", \"464e5e541e187854dc98a69aa48fc444019a803cb71719f44b175e968330850f\"], \n \"c1\": \"4cc9c96f6c2c24075edcb03b79a8d82d83b49db4a33b7eb993d48e4ece3d2a0f\", \n \"D\": \"524c847d7f15c03e03708b96b6ea8eaca6a4657c3af0244e6401779a0ee21221\"\n }, {\n \"s\": [ \"fa92f13efd7721c5cc4500e7cdb8254997d8b73a7b2243f580a5e91cc246910e\", \"7fa7d13567b4164e6911f6722ed13aadd2a76f127a3435a4bd919836c363cb09\", \"ebf110b68ed56b28b4e8bd5d3e4568adfa509e914d98eb21aeaafb6734e42f07\", \"10aaa746fe4ea17c423f38ac951dd1007dc17486d2b823ecebf9fb9dcb62dd0d\", \"e523f315c266de82c74f0378fcbfd2b030c0e1e30b034ec8f7d27946b8c86403\", \"863350520c89e34975e27b05df44cbcb017e0abbb6a756faf0b34f43f2752907\", \"9fa6b98c8b7a26493a215c954448e1958f6f1aa558cee11352fceac48273440c\", \"199f152d34e7d3c805b35e61a2ce914b5e03dc5d7858ec15c44413e5b2569c00\", \"f31567df8324d01565d4e4e9e04d86f75f24dea9d9d24568cc0ff02740c50c06\", \"e0c1712ec5b711aa78a21e7433da47430ed76a9e5a20748ff5df632a9cfdce0d\", \"1e54ab98f2bf59db008b5c6a03c2d47fa12540d1c927fde4da851325e28afc0e\", \"fc1fdd8a0cb2544e57306a0b5f486299a713a8cd4aad16b38f3c1b789937690b\", \"35287cdb337f33ce203d6303892c64e8be17016436717ff0c5c1af6ad7082e0b\", \"0bb3ca7bdf4a6369598e25d28c42189fc879daef22144424854ba28fef20680b\", \"5d32e9ae7872d9c134d6d9fe5b0ffe9352ceabd3805a6af5ac2b7b6234af960a\", \"77523d6e80b27849bd7f784a98d2422ff79c902f9dcbe4609c429e5b4a9fc90b\"], \n \"c1\": \"15bac05d97ba07fe3734d3f7491c6a962ae942f382a7d28ea1fa5302c51bb40c\", \n \"D\": \"cfdbd190f3286cf798bb345b51723f6e8ea8515534773a340613d8612db8f9ad\"\n }, {\n \"s\": [ \"fff3278d190f7894a6ae534e2ef7a0a8b7b2fae577aaf438b62ff0e4d79b8a08\", \"56a76827f3e29042f3cb444e67dc16633c30d8db17c541ab4db7d81fc5a32f00\", \"b3609aa0b8d2544843206117a826e456a41aa87d80d320c09f1ac0f93ed8e30a\", \"22b70ab8b6be5dd1288e09f9c20906d6bca5f0eff1e2ed57da9465ce60ecc00f\", \"aeebd450c3c3ad2453b75c18bdb725cca06d8cee657c77564ef03cda16d06f0d\", \"8e5ac1cce961abddbb5879738d04997263622263d9f27ee8d5868814afc7a202\", \"4e8807bfbf6943fd0792d13b9bef4ff83ed82f0c34df5f9c42aa472cc2c1ac02\", \"3e152321855eb77e8f762d5b6937d9e7cb3a9f3c2419b806203aa2deb57ae906\", \"80a3c83cdcee63d0bf296027ef22cfac0938f9b115359e6c6d91306dadb2fb04\", \"41107ab8a88b18f0bde29fd68432767c7ef193cb6815c4456eb0d917b9a9e80f\", \"4cf02dee189d4b8accb839002f8b6eba365c9f3f693e156932c09941bfc64600\", \"fa9a1ed117e99068c3220c9f0e94b9d7c122c6c391e8f6dc0ddd0ec8097f4d0d\", \"a7e3987fc86c5523fc788c68b25f86ff5e347849e71171ff0f5c6b15a0b50107\", \"6b1dcd3e4ba22639beba069d6c813548c99db963077c1f2bcdd173f38e79bb05\", \"b450a4748c5959889f22d53f62476626e22587a023dfc4517d49396b0c2efc05\", \"817d8187aee15d20ef0f623615bf4da108d2429e596dce7d8e9fe6e8596c0600\"], \n \"c1\": \"9824b7bc0d7dc58a097658babc3701f19a7210f2c197eea886c5d00dfc50c108\", \n \"D\": \"570002d437713df562fa1e3d67f70450db016570e1119532ed0e3e1bdcfd3155\"\n }, {\n \"s\": [ \"792e33a1110e87d24c8eedbd1b5d731c4fdea67a7d31168432e7d7cfd6564706\", \"d6a5c45ffc307daa0cbc600a5e6e3c9c82d493388ada75deffd3c83906dba60d\", \"6de0af97e952ddad74e59b92013a6e55d63a0289e09feb33641ae2bc1b2fd60e\", \"33ebb741b522f6c0d47a331846edd4f4d82223d193e0e5aae4b88750280b5702\", \"afb63b883a67e6a442ebaf9c7c60be8037a040c0a6e1814696ca2238717ecc0e\", \"f670db23a3063db45d74557d715d643255f5cc2b02ce024a42a2c4f48d0a020c\", \"4fe82d187b3b6edb7e2e9444cb2cb3b8862523febcd7bd5e7549b5031eb8c90c\", \"27907eadeef4328d325dfa862735dc9ba8ae26df2fbf9712ac4fc813122ea10c\", \"0ffd43cf70c217fbfed3edd012d66d959d03aba43873f87634a3ec91efdc9209\", \"86321b3ae6152c4e1688b81775c069fd5a41e71e2dae304bd5c479e3247ee20a\", \"94266393a0761debae592b659f32e71c39343636ac1ab2d3732af1fa9778d701\", \"fceb0b71bad10c860e51e637430e6520d5639c6a1c430aaad3802c30a92b500f\", \"e55616cfb92ae1ce65f3eba6285da428c7849d24918f6d3bf5bcd8b37db6a403\", \"a3220064e82e94bc8a3df93e39332b133bda28c866f30e45c824039e448ef704\", \"59086810004d7613201583e9497b5c17e878238bc1280c87ed2381b8fd308606\", \"56df5be83e02f18e2308f2546a553299ca285b53c7f66ad0297c907e01dccb02\"], \n \"c1\": \"1d0e21631768d826068eeb457b877f4009977de0fda3d981dc3887515060c50b\", \n \"D\": \"6cbeb0704498abea125f623107f97b33daf3ba02d619b6edb8223167fcc1df4c\"\n }, {\n \"s\": [ \"1909cb506805d1f464b1ebeaa69a1b1a0cf02387504296c7ce63c61e0385f000\", \"36dde496366c9988b48d904c4111379548fa829d55787ed9c629ca873862a406\", \"48f6f8e24387826471f8e6047baf0babff8f21cdfb81d4930749638856f2340d\", \"306f636d277ae1792f84a293e4f66350c75023a1b5967eb40a43c440a246c603\", \"42d8e7ebaa4ee68b8551b9807d7b308574a90a7c54134112d6fdb3151af2c90a\", \"2463bad24e336dd34bffcb34713b6802e711a168e4afd30bfc3dba82550fba03\", \"6a8d9f5070875b622865ce43fa773e77ebcca52dd7fb846aca9c133eb93bfd08\", \"030bf7d2f95f541cee1f8ede2d0099177bc447d8c67a6d3b05ee3183498b1b0a\", \"9e8c271f40e36941df4924502e31d8122d28fef01063e9692152371ffbd44d0d\", \"54b527ba4a550b6191a40192e1735f9e9634df5647c3580179ed7f11d893890e\", \"968845f97aa642bccfb6b9e84a4d68189d59fc729f23059dead12b5bce438403\", \"aa7a1ef89da4ac0e4617a978acd99ce57213509702e31941dcab7530c902690a\", \"7da1e1c0ae121c31fa19cf8889ecd8b61cf086be7cfe695b172a36cdc326d504\", \"e55918e88a21efc120a54ffb6f852d5b97ccd7cba3ed1e44b6fda91be7b5de05\", \"89ee42794cc797c25249a9a6d40f873e52b491389065a950c8aed5b6675f5c06\", \"6d1dce8ae2cee39a8f7b1c4adf5fba44fbb41a81b06a5ca9b597ff6081d89a0e\"], \n \"c1\": \"df9d832bc866de4095119e7fb0eaeb8930b705d0712aa17e11754ee27da80105\", \n \"D\": \"befbd6dfc2d3e6e8a040c080a7d4508621474e11a3ba7fee3a2d6ed428324c22\"\n }, {\n \"s\": [ \"d723f61c46b0dedf57ed8a1f5b4588f9922fa5bcbfe9cb9d97d558a4030e7809\", \"c1057838edc60be81f357bf466bc5b9fe05d58ce8009fa509db7d24e0404f609\", \"b7ade4df5611ef00761069d18aec275e33941db96feb81abcf87171b7d54f001\", \"3d88f8d39dbcb57df1b0a3a3463bc75995e8193afb08815de576c1de957b700a\", \"ba945788360754f9575a3d9c3909e56b171e193da4dec2789cc41ce933c82904\", \"e5c4c01c218680c44c46ff1d501ffef20d6a5b067c523ea161e115e7b0179007\", \"835c82d226c6d3f7615d13ee729f7c926d429a33302cc61febb9ec53d24dcc00\", \"322740613d4714cdf380dec0673929b91f0c173455c1d5f605b3c2a2998e9703\", \"09c59130a49a6dfe6b9f56d4ae04e21e9b14034e54e0b8745ba2c918f39d2f0f\", \"95e48323f664da395a8e2d6e294c202a51e5cb513a664f947deb2ce6c2700006\", \"32cf0c9decc4857d801b939cb2e97498832d469e9487978a447e40b25904f80c\", \"e5d6e7d6a32ea5fdbaa470d134b318b41c8ab7e8cdffec513ad4cc2abe280406\", \"081827c389a2c247d0ee40235dd62f1ffecbf6aa3389abda43298ab752f9480f\", \"898f59005b4d8a2fdc4631bf7f2cb10a6cb789dd028e5ce71f0cb3512b3ed30a\", \"497bedd241b6bbef8bc099340e859f20d47d928fd1bd804eed2b41e266dcb00e\", \"3ba7ab8b1d442ef9200458654d613fa08ced2b8d86cbc27260e099bea23e4904\"], \n \"c1\": \"e5ce096899cee734b4a524e714c1b98e9acf571563328ef71d45e3bf6fca2d0b\", \n \"D\": \"afe7b32ad8919db80210eaef8c2c89bcbbafabcd6d5292cdfe439c1a9f1fae66\"\n }, {\n \"s\": [ \"090411640c6ccf905547102b49f7a025a3c7e095e9f7eadd457c147d96210208\", \"962f737018ec057b427e2d31ca7eb58b25e9fc4cf7cd9550129035d6b98da60b\", \"a7919d4fe9b99e4da7598fe85015c43be4eca45d1913458e9db9bb8a155c1a0e\", \"b64774939673b8914c6bfe98348182ec3a222da702175ebd2b8c970bb878d807\", \"858ebb7d35f6675bd2f4ab35af156defc38ca3fe0ec5b305f2d13481bdfaf40b\", \"09d0076aa6d6e2de0a284fc8027f7ef58df0eba11a524764b4e939371566a50a\", \"2f1c2171207626099ea70cbb62112001ce82353e7640b91370b2a277047b9903\", \"e6aac7bdc67db5d1e316b7ecd9d26d9efa52a1427aef62ffe91d19e5549f9106\", \"059a55d8085e937920beceb69b6233a950913aedb6c9913853257d80a7f2df09\", \"240a0b0e2265f861f25f3b3f020295e4c3a557d8f210a19713fbea955e2fbc00\", \"aee13bb44e9d935d547cf7b071b05d94292a4d753018e4b2058fe919e98fca02\", \"09f9e3815440b6b34990f49af2210cb6074f74dc7bbf5804a6a2986c2a1fe60c\", \"70493fb69d8a0a256d3ad34313bb2d88cd9e3dbee169bd656369c2ad0b598e03\", \"e2d43843317dcd53af92eaf7de73f89d0aae108da35e9639a951cc4e6bb6bc08\", \"478d9108aa862add6731184656515718c3bbe4c666bd3730ecbb150447fb2a0f\", \"6a1cd0c4c26f836163f5bd045d30243b49e10bedad9c3a974faed2469b128d02\"], \n \"c1\": \"025202ee0e8e262e50081c08bf278b9de30afe9fa80ed99f0b50915bb8375205\", \n \"D\": \"1ce7b914a5b6c8eb0e4a2de2f412a377ebfbe8e3f409ef8580b4878a380c11e4\"\n }, {\n \"s\": [ \"76588b8804b369130947a7b805aaf563125b08d79fc2a7a6dd59edbfcac7aa08\", \"de4ec98ad49fa4c88de7702238c883b2790c56b5752326843113fc7a3e860e05\", \"8ac662acfecfe2f803960414b6c5a3f0e16ba8bc45d2e9442b74d13f7774f30a\", \"f7f4cbb7eb1a2545914dd2562cd1cc69ca12a46b76e4b3d0fdaf520e4a4a7f0d\", \"d8ce412d8b0567f994a8c1684e5549402078b59200b8b697c776e6e58d34cd0b\", \"797938f4eba967963055852af7194e1d776f455e2e84402598e1ce415f872000\", \"0531b2935021bad2348c4b5976d3cf2d89626138a5f204102559c592a33be507\", \"dd596db1cbc03ab91f1f5a80729619bfb1bc830d88188e3f9593fb430d405009\", \"2f9064ce03ebf328aa662c7adf612240056e0418f531fe086f19509d44cd8e0c\", \"83393059bff678437c3d61acafab248c7b41119bb777354b836e9752849c8005\", \"4fcad749c5660627ac7a24adce564b62426563b0caeb16769ffd5afae4264307\", \"1d211d06f860445b0a384ea4275a1f6f2b0caf11ec2fead1b8a8abd71215fb0b\", \"a65cee1f28aeaf4fb54685c4b9c1d4583d05be800fb3b392c9c9b16d45b47405\", \"89c45a1d7adc9fbc4a8a91a6d95a256954408f1e1794b9b73c7fa92d9d1d3d0d\", \"62e035bd6a3c91f354608ac7d002f1ec1481b92fe1efb47dd717c58388432e08\", \"21b4642894dc1d95bbcb4bea812edd2be509e3723eb27dab02f0aa5174bfda01\"], \n \"c1\": \"1bac757ac05198bfae729198b21ad83ed77d7099933ca8d438223eb5172e2900\", \n \"D\": \"5f8d4bb439e9f1fd7d9319bc235a800ad8cea46cf72aa161403411fcd239c2cc\"\n }, {\n \"s\": [ \"c1caf86b559d263ec57ba80793cb6045195b2306dc2d3d1545b4f9f628733f01\", \"50a751cc8468d64e4fd87d8f6808c387112ea6cbd2747347a2702a1c53d03606\", \"1c256f19897dced055dedc2f6000444b891b2f0f103ec52169bef5620ecc8802\", \"b9c40573c76e1a18907d9aaa82cfde4f69fbe29a031ae39e9d47161b52561104\", \"b9c4272fd23a758596329701d313cf2a2a5a0783b9f39b0d9d376b1a53d9aa02\", \"008e31c110ea76d7f3dd3b6119d18436d7d87638aaa30c633eef1fcd5923ef0f\", \"702f504ae3e3157382c50c022725f50e0de515d1bef117ca08d832e098b0240e\", \"6c2be19c7e25a8f32f876f4ea74809a659e02b8f2ec908dbd119ccf0edcd7909\", \"94de8034f11691ac2cd6500c32e20287e968196dfd93de98d31a5733b19e7a07\", \"35c541ce2da123a622e10b79abd68ed242218fc198d3fd9bbe3dced2aabf0707\", \"50593ef0ddbcf3da82d63d30faf24289e054434fe9b2547de07056c2ae927f00\", \"ddf5820c7620d2b9cc0f5047fe4a74d163cc3813f5465bcad682ea0be2d0070d\", \"34b1b382dc98e343b261a1a605ce916498f476b2131ff2353e1f9a3ce3e71902\", \"f2820f6f514b72f32b2a3e2d50fad8c47129849e2643ffd978f3d6a8893a6a0c\", \"1dfb540d9405f41c1b62bba4b0893273535b223deb4bfbf64c2a8b6ac040f006\", \"10d5d9beda68f687ebd4035c39c45cd80cef2c15ab5f35f24af9c0560ae08f07\"], \n \"c1\": \"b50751c330e15f3ee3a8e07783dc00ca6b8f78d465d7dea2c8c83de74d5f000e\", \n \"D\": \"240a2046c4d4346fde8802305e568074e94ff89cf0a3d5346eb77564c35b15b6\"\n }, {\n \"s\": [ \"b5746f3412f0a78c40323c98a985c255d63656bf1115c4c826622d462b26f608\", \"130852be14f740b8570f5f4a5511b86a784c51a5e4fb8e945e31c8040628da04\", \"fcadb8cc0c23e4b24bf2222932c7893ca6b9904dca2ff8a4968d35a0d368ac01\", \"7496afccec6a815cb767f0b779ae95e3ba5260724a34f18cbc9204840414e603\", \"44dedaec24d73ccdbe4807b8f1555c074c94f53d94177fd1698997c431bd100d\", \"9a501dbae938247f5b77eb42505ef9cefefd4e7f42287903b316f036dacf8008\", \"9174621ca177d5a71c9aed771de721522b0f72c815e97b130f1cbcb83877010f\", \"56c9926851bccc1f48abeb9972a7cd765435ed59666c643e8bf9f6f0dbf91e0c\", \"32da0d9416c4c27b002fe1547ad2406532ecf44c89e6245ac041ac0ce4e4eb0d\", \"7ca53b3bab439481930d4e214b3b8460354614c9fc4a2c5035671c4fbc522d0b\", \"0ea983f506dcead626b4f7932bc9b7f497f8233a1556478c0786218bac666e0e\", \"a9e7ac6a29eba7c27edc4f25dbf6906883bbf4ec47d1ebf38a3fb70c0df46f0b\", \"0541a8b5e21a9ebfa0a08a660daf10a2dac0d7c8bba437f3b931c96455b58805\", \"b0d522d58f81354805dc073ae2dfd82bc827ae72807fd533687f78a450eba70e\", \"f15be34213fc5ca3b3762944f1d018c46e7bb0b9829132633e54528c7178b700\", \"0c3852eff49d00338308b216cf77fa36f67130ca7424138560ff9adbbec1ac0f\"], \n \"c1\": \"3c300aa9725662614ee790040e3668b7b512e4953b5a68a3df04f881978dac0e\", \n \"D\": \"77be03f07de3ea414ab5de8b4148df7b2c7548de2392fed2d26dcb61deeb329a\"\n }, {\n \"s\": [ \"434e34961ba8fc0a8533731fbf13923c60ecaece5ac0633100fd18b1a47ab40a\", \"9c3d10e14fdd5f1c448479b933db813f16c87d74e925e91a370be9d5cc5f550f\", \"3bec745edc71c836a48d90e51777f2c480f5338917fa9ab9ce258bcf6eae6708\", \"542e1d2ac11c524ee41c307b7deac63d13dcea39ca2a3fe38f4fe0ba59a6f405\", \"2485619c52efba1b68fb0f0ef5aa921cc57fd1d341f3556a1d6b73d17f6db60b\", \"496621f542826cddad8de2e517258ab046842f696b9c4f2835506522f9d2b500\", \"93ed535605c4815979bac5627c103f51e4ad001e6a600f0d0b4ca4b81f06390b\", \"14ad02ea0c3b0349824c1e0573549bd853d20cad9fa1edcca9bc566014f0af06\", \"528ffe2ecbaa066240c9bff71fd5ddeff863b27cb00a74fccfb1db5499a8bc06\", \"eb01cdeb3b01b261e61f3fdf0f3973a4e1104fb997c8b6e3ae436f1ce0353c02\", \"8c292daef3187740a653da65cf9610bc22e0fdd7dd5ae16293b057f31e8db002\", \"edb9e8b76d70aeb7d1aafa772a757c790590260f51c7671871f0df38f6cb230d\", \"84ab59ad81a924c2c8e28a7537ada86ea383b9476311c1ba4fc3ab2cdfec0205\", \"637c21cdb13444bc4b3a74e18f399b62fdabea074a3fbf866486b4ed86a6a406\", \"8b85c656cca6ed3e68b35175e1924973e82d462e4c2704e06609d552f5e81203\", \"d04fbbdf96911fd3fef07f359a8ea935d5a3657bb773783cdc060395d0081102\"], \n \"c1\": \"f50063354fae3f6e43ab851dc5c29fc36d48b1e654b09260aa5e62c743cc6b08\", \n \"D\": \"61f9bfa62752561e2a80f8275dc0e2abaf8f65572fe4fe8e8ccc2d91bdd7c646\"\n }, {\n \"s\": [ \"8783932798cf483e2b6793f0fbc08495d135ae16abd9d334a58bc97de071d10b\", \"f13f1dd379ef24f8e41f63787166417e18e5960f38163fb0b92a7127fa22ee03\", \"db3562c139a0887a8820e0f85f1714fd29a59d500474f92e1187bf9729c7210c\", \"f85a5b1f13d581dd7b8b25a709888f147420a493cc6e036ab9c6366c0e4ebb07\", \"026b0e3fd5b34eee445669452cf92bbab5fad18b9b164179b2bd489155c01709\", \"1a448388d6ca40cea2523618c4a992c37d3c20a7139b940417cdda9c7852bd08\", \"2bc30446d38f51d4d3ef9b4a8d2482dc05a1efe359d65e9fac6d673fc3a9570b\", \"123f5a609851be3b90461ccdd602d85a251164e1c757ed256c4d92b10bec9302\", \"a5e9f89069c73bbd2266ab755a4575254a43604b69965de8d131cb812e6a6e0c\", \"56a983915850fe148d329c29d15eec67464427da9d763b89c52995b32c1c500f\", \"f81d35fa348ec90c2f4680c1e073fb259df6a4dd145b8951e017948c29760507\", \"84ed0e7207997ffc619ef2ee4e53fa88af9aea63cd2f1a761151bcab58025a07\", \"e3a2b2ce40f9c25e0a88d82efd67c0fefa4cab7cfaa290865508e2e17edee808\", \"98d4eed281cd7a8d0e4090a97ff3cbc0ac62712528b367a32bea105840701e0c\", \"6588cd1a118bc1b8c4625a3e48f69b779f0f575cd2e505b362051021df8c1b04\", \"fb273a52cfe42e7fb16164d3218777622f89580bea14ed586073df23c6c9da01\"], \n \"c1\": \"574ae621f62af3728281a4c3cffcfd6f192324ea9eece0755366bde98b5daf0e\", \n \"D\": \"2b9c58587c15f7b76023125dfbd5fadb374d71481f4427e8a15eb189ee2bc4cb\"\n }, {\n \"s\": [ \"e3bb3b0fdcac5fce8f46a31e9a33a1ce34b8dcf22990f9e15218f67d8ce5470a\", \"e819fbd3781424adda93c5a443cbb6c209b9ca424c0eee28ab168f05331b6106\", \"06f7a9f33ed3ea477451373c0f3578017beacc7b15fae66c0b11abace6d3860b\", \"c48977b4d2a9ecaca3b0e3f43b4583f86d560ae1ff0e2cb77edb5419deea3f0c\", \"acba39780fc58f3ce0c29c66a3591892c176e1a7d3bb54fbcec8f79fa2bbc004\", \"229afd6fdc18c4cb89edf1459ee314763cafe1e75287615c3dbb7f5b05fbab0a\", \"9adf444c01a3227b51509dc5bcbf4e6a2eec548d68d1fc6d1bb52673c7efe303\", \"c80b9b1cacaac0cfd73dcca1618f30116410c8e6a1475fc191bd6a080b016608\", \"7aa6531e59f9d96dc30101580f2cac5efda8fcb7996e085fac2ae03f7b0a460d\", \"5cab710600c77c4d3f7f6af775a422b9af2b687d6cab4ddff8e6190e0d998503\", \"5f6529e1a277a089ad1b5894cd8f1261918587b89e66dd9bf5891943a319b607\", \"ebf127991ac2145696f4b8489d14fe076983381b0ceb983014bea17aed90d90a\", \"79d2c9c6e58453483488bf5c892cce23273e98ba4847f39250b126885643ed00\", \"540fcb83defd5588e0a342a4d5f73b815e8b18c7d0c7a9aa32b86e65783d2b07\", \"e2465870e9a8e1364e6baa88dea32a47f215f661a692d52c0ddada551bbc8d0d\", \"b7a4e1e987f9f330b0abfcab7318c30fcb4d801f008bbadad93172b8d8f0ce08\"], \n \"c1\": \"5648a5b033e7f5921900756f12d59d70334cfe24a848e1b85d83e316d303a100\", \n \"D\": \"add604567b2f5703238410cb63177a22dc934864af6763498346f6039ff36035\"\n }, {\n \"s\": [ \"2519cca87dbad1d3f8003bb46a9072b8b396114731d0e1f0df03fcdfee3a0401\", \"435fcd82fb448d96064ca438928ab3f2dbc705ef16e9b9dfd65ae8d800a49c01\", \"62c35f8ab595be1da87c6c3a8e10886b16519589f22a260d1ef3c2ab11ee9204\", \"bda92882ad266b29b1eb64f959c3cf828b27afe849a61195870c65d34ea70706\", \"c0944f8091ea483dbc06745a8658dcf5749cbb4887a079399af13cfa69a30608\", \"8e5bbc7389fd33bbedc0f8b2bcd730b8fa0fb7d5c957a4551e9dce29c4b15f04\", \"e057cd99771aab75a7887b82cb12453cea07f785b4ef560e654eac26a079e90a\", \"9d3a60c39c1a3a301b9b3a2a0bb7c7071c96ce37bf59b1b847632ceba30b5d04\", \"4c532e896c29fb2b3769aa0f7495f97a3475a718ce17479f805ede3c893c8d0c\", \"0e362207bf9a4c5a48ca988550185e3d010a52b4ad65bce64419142d7238c800\", \"20e43b99cb80ceb18bc6a2b045333f8ec169211dd26dc8dfa398691f1d76d30f\", \"1b4204a9113a1e353594033e50c908cae266ccd449bae6e030a0acb6619b360f\", \"92833140fe243c5be4bd1fda19455a96818f3cbee2232383fbb909c615d1050b\", \"687f4451524d507cc9130149899e040927a553b90dd324d57db73c08a5fd0e01\", \"3f08be740ff23243f87b2c0f4fab5d65edf4e7297ed774852e423e9412e7be0f\", \"99a677719928d879cd56bcabfd4dce3ff96a7c5ce34f23471268f42d4b739902\"], \n \"c1\": \"95b03026c77645eccf963218535168fd08ab0969ba97b812b6bf3a598e710f09\", \n \"D\": \"450dd5123579658951b21eb143e4b76ee660a32654a0723e48d2069dcb52edde\"\n }], \n \"pseudoOuts\": [ \"0690dbbb2bd0c2de2536eb40c89238127c48085de1eb89c8f5bd3208e2c22924\", \"22bf268ade80cb5331cbf74cb7338f5d8c99b106b837d0b7679b40907ce4fc4a\", \"054bf6418951192254108b6765270f70cecbc01f3e145ca05f1123ad79f8f09b\", \"bf7320af0e1802202b1fccb190fa8750d845bd8ea324bcbf558233ae7b65835a\", \"a84a144c11883a3a19c084b9c9a9e4a4fbc4a722294a0bd35a8374fa6910fe4b\", \"635c8ab7bc1a7951f0f16cfea09a52ab31e5c85848273df135cfacf630e2e8db\", \"9728ef733e2adde7dc65b29d6816743ee4b57cdbcc507ae8156edc3f5548e616\", \"439cc02daa04a7e0edfc5755b0463072cd9f1480c33e7730e098e6201dd68c35\", \"574847b37652d8dfc7ab8eb88788fcc3a54304f69287396bd6783c33dd2f9d92\", \"e6bf19bd48cd062b5a5b222e8cc9a84883593261ee7308701453e7250749a7b0\", \"f26a28be17dbcbe096e717476b12c1093da5718771a43de20d9b51b76c3a2069\", \"46f097408973c8441e5a94cd160192ef7e6aac57b8b82ca809f7e504fb6a48dc\", \"58a18f5fa5952de6df1f3af19d3041b908946d480ad2328876bc22fc174762e4\", \"75a5502d85e878e536a78f06574df2119e5c514f8e78910659bf079b189725d9\", \"ee0918829b2772828ea6691664868283974656827c44687c47b6164aca68817a\", \"888859e80063da37ac442386181fa238fb2db123b49d3f158c2b8a444c80c9c9\"]\n }\n}", + "weight": 11843 + },{ + "blob_size": 2320, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 115000000, + "id_hash": "c072513a1e96497ad7a99c2cc39182bcb4f820e42cce0f04718048424713d9b1", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261657, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261657, + "relayed": true, + "tx_blob": "0200010200108fb0ad269cfd890bb8a5980195e69e0184fc06c7f705d0d21b8df305b7c601e5da08dc0197ed03e6cd06a632cc7680bf01fb3e7cc08761a6037ca29965f27d2a145f045da5a1018ca7e6a5a5a93dbbd33d0a0003dcfa3a2800cdabeea3c3206f05408adb96d2d6fdbbf704a0372bfee0535ca036f00003992edd42ab4ef6f21ac1639c8515b5930f39788788671122993164515bedfe4c8a0003e255c00974b24fbfd3cd45fd4004d6dc76201813ac827295b1eb04e7d14d10dd9500037d42e7770c696359631ae7e566fedd1417077d2f3bdee93240f544703b299ef7e40003755335d298ae54a80e4f3fca0c1066fe744d5a2719d188c0ab10e45a94ada4d3850003e5ccb6fc793c664acfd057d7f6fcc77850032b96702ce4d7112bda338c7aa576d10003f7e699af9f0b9ff887845f0b0600816a58faf680ad32c61ee4465c643e30a340d200031de678a8a50613c5db143e7b3d5aef14be9f1f5ce2805b3a3f2fabd0af950acc380003d1af1d1d909b9d07e4cbd8d4792ce3c719280a2c4a7618d8b2be89d3e2472dab56000365159da725872bbe45cd5b5a8eb8b2082c52f161c66130ecd74aa1690e31e1cf2e2101669fe64b9088044833435038ee59827b0b3f93b042e2ea7a2de803e8889a473a06c085eb36a2d1d7927d22c62713d484cfcc32ce08d57d1588f967ef3dce69f0b186e9417afe28372e3011410c15d178d85cb7992d5489eeaa56ab735167278d301a060edacb9944a0d91f4d1890403da176509a5a8fe8b16032ba1abf24aa58fcf1f37233985203599a5196678b96873b000d7e7138e1a39ec14709f7e44ed3d5a8d9be17401d2d4d362ce2798383fc2954c8f79876471eb52ad4e7cbbd0a1647771d11aef73612f15ca15c13ac18ed477bef4492b0b229ae04b00ac4a144329a0ea2f86e4decd8ab76e8f76e604a39aa8350777c113b99f7c2808a50c8556079f6b4b1e857d75ccf4fa43429e27d1bb205c9bd8dd2ccd6151c8106eaeda4ac3f28771864870d2327e129acd4a88a16e143901bdf17e2bbba7e8934c8b05bd95a35a04a020beb1298b8ae94c2b2bf7911ad173f20a9dd9a2dfd3929a3300e8522e0db027f391f8b03ae58064b76218608c02ef5771f3058852719367c5c7cef36169357e3b9ee637eecba7f28df2ac097dad28fc995a01f42f19181d1d691f92e8e2737cac55974f4d3e0f86f674c3e84cee205f60143108ec2a3072162e9b3b82aed46df599bd192c8f923293a398281f0c67e8aae7a1a1878999827176bcfc32df00414cd6be57d8bbad907564d071e77c625005d6e497cd58d30d420d5cde92a7ef8ddcdc5e953d55eb223e95cc1e9edba4049e7728542ceacaa8bceb6dc82ce3b0294eb57476103f4669b1b446fc8b3ff970409ad02e606b08b273e39f50344351bbe3e7f1f09437982f3c9817698394df12004635da6726be57bc727d6cc2488e2d1f1a7f64cd9fffcad5281176cb43cfc36040ae73b14501d732dda57d80108176de3a885cd7ca322e7368c5d1ef63b74d38d4f94a7ea1436feead534e9bfdbe5fd186199a172462f2165026673c883f6093633257c2b940a6a5c7dc3561e7685017a7a612d59facd45ad3aedee4433d66d7f6194c0ca2b30c86c26c07ff69a8fc5c568980c3662598a19f5c63259258dacf50ee6b83395d52fba08cb0305746c9ff74c8e0431ac10b65fada1ab841921b5a70538a2a1792830106d045c51f95043ca1ee492169208ec52dd8ce307025f5297d7d40cd94668079ea06fb9b65b2ca7d8edf58062cde615fc324b921db1611f24228ff52d986087dc7c56247aff907f7434b094e2d1f6c69be514196acbf758a3ab3db25b0a80c0fc3e9076e0a934f4cf5d2bdddbd7d9af0c47fe3dfe5d8de4dc203dd4a862cde72b72f138109137de2481ea146e6758877e7bdf4d98db15e97b610acaca6ad74c33497b2ca9a3e4445dd211d89156337d0b2e6bbc5ad5f6833f36b239e79526a48fc7b86cf9c7882af011404cab69de4b9c4f2b7929e7d23763eaf5fc673c2c2755231bf1e41bf1dcd4ea549e0b610d7a449337c499817921ef2fce52795d3ac0410faea86d480fe37dfe169ec177d53a83532d27b3ccfa7663c6d727a093c62d3f7988584f579bd146fde10992155bcb47ffec0d5390e4190aaf24a8709c9954e65d370ec79a47eb973fdcee672afa283c986be21f59db0f1b914438ae83c19c43c6a0113400e6883c84aa64a788086d2e6827bf125db4f23612d7e92d8fe260b2e1e76a235ef3ab824a000713ab23f34661ccc596e2198239f29bfcc05d99a86c42fe802eed8da93490cffadfc7adc848568af250835d9e926a71c446422faa9b57cb1ee4c4b9251d8e99c43635e7ce796d0dec1918393562bb70463c67a254e58ae723dd8c2f4534ced8e8fd68c2b655a046756cd42c93b4660418b166ac1ca569cc5642462664b87d02a15cd8fcc81c335d4a131b34e880ee01241d90a51e88fbeaaeb3952f8e2c32376cb883b28445d345ccd3991632732f0b315388f9b8fc18599ac2d74bc0654e8e6f684c87a274889384dc7393b3301f04e94dc23c3c41d08ad7cebe96c4221b9c1b9f02d24ee707a28a91e7e9f9fa84073be8794c7c34beaa52086b541f9904607eb115f2111dc96b5bce5b75454214098279c030920e6d1bfbfd083421eba2365d671467b2a2a3fcba832c5a6d86a60173f228a07d33596edc8aa922a0c9b26996502b33eeec0038f74fe87485f7b6075a484e14e6c961d8417dd2cbc48029b272dd42b935f27fe7ca7afed71dceed0b5f3a4688c6ea8b0a444b442ac0396a20784f4f9f94d025e2098c482717cf4e05a1862e45b8d12b90b19773857752fe4721a49a97eedf189d25c8b0d659883d0d3e2ce49e18a2f85ecf736191b9058f16cb65d96bf12be8300642c31400e3df05a8d748a1c84d932aa94c1337ed2c6303e4e4e1e4360cb23e4879760e60501007e2d2e18200688a0d71e5fb79211614cdf88bd2cd96252cd8742a2d8ea5914f0946752e3c0ffca147d0b962337b4e8674966b3ef8ed0f7698ea50e6dfc43a8105989c046ed697d5317e81ab30add72eadaf7d5cc74e68fd4b23e1d70a3ba43d0bd64720bb8524bf732f9f5ea45fbaf38470c693834b48658c4961e4d4987e30068b15e598afbade29176f45c702a78f0af5576519e177d355d8c17e2f2a859261369cc31747f01d8cb57916b59a11ff4aba68e8ea5ead7fa431f5389f8620f759", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 80435215, 23232156, 2495160, 2601749, 114180, 97223, 452944, 96653, 25399, 142693, 220, 63127, 108262, 6438, 15180, 24448\n ], \n \"k_image\": \"fb3e7cc08761a6037ca29965f27d2a145f045da5a1018ca7e6a5a5a93dbbd33d\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"dcfa3a2800cdabeea3c3206f05408adb96d2d6fdbbf704a0372bfee0535ca036\", \n \"view_tag\": \"f0\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"992edd42ab4ef6f21ac1639c8515b5930f39788788671122993164515bedfe4c\", \n \"view_tag\": \"8a\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"e255c00974b24fbfd3cd45fd4004d6dc76201813ac827295b1eb04e7d14d10dd\", \n \"view_tag\": \"95\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"7d42e7770c696359631ae7e566fedd1417077d2f3bdee93240f544703b299ef7\", \n \"view_tag\": \"e4\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"755335d298ae54a80e4f3fca0c1066fe744d5a2719d188c0ab10e45a94ada4d3\", \n \"view_tag\": \"85\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"e5ccb6fc793c664acfd057d7f6fcc77850032b96702ce4d7112bda338c7aa576\", \n \"view_tag\": \"d1\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"f7e699af9f0b9ff887845f0b0600816a58faf680ad32c61ee4465c643e30a340\", \n \"view_tag\": \"d2\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"1de678a8a50613c5db143e7b3d5aef14be9f1f5ce2805b3a3f2fabd0af950acc\", \n \"view_tag\": \"38\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d1af1d1d909b9d07e4cbd8d4792ce3c719280a2c4a7618d8b2be89d3e2472dab\", \n \"view_tag\": \"56\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"65159da725872bbe45cd5b5a8eb8b2082c52f161c66130ecd74aa1690e31e1cf\", \n \"view_tag\": \"2e\"\n }\n }\n }\n ], \n \"extra\": [ 1, 102, 159, 230, 75, 144, 136, 4, 72, 51, 67, 80, 56, 238, 89, 130, 123, 11, 63, 147, 176, 66, 226, 234, 122, 45, 232, 3, 232, 136, 154, 71, 58\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 115000000, \n \"ecdhInfo\": [ {\n \"amount\": \"a2d1d7927d22c627\"\n }, {\n \"amount\": \"13d484cfcc32ce08\"\n }, {\n \"amount\": \"d57d1588f967ef3d\"\n }, {\n \"amount\": \"ce69f0b186e9417a\"\n }, {\n \"amount\": \"fe28372e3011410c\"\n }, {\n \"amount\": \"15d178d85cb7992d\"\n }, {\n \"amount\": \"5489eeaa56ab7351\"\n }, {\n \"amount\": \"67278d301a060eda\"\n }, {\n \"amount\": \"cb9944a0d91f4d18\"\n }, {\n \"amount\": \"90403da176509a5a\"\n }], \n \"outPk\": [ \"8fe8b16032ba1abf24aa58fcf1f37233985203599a5196678b96873b000d7e71\", \"38e1a39ec14709f7e44ed3d5a8d9be17401d2d4d362ce2798383fc2954c8f798\", \"76471eb52ad4e7cbbd0a1647771d11aef73612f15ca15c13ac18ed477bef4492\", \"b0b229ae04b00ac4a144329a0ea2f86e4decd8ab76e8f76e604a39aa8350777c\", \"113b99f7c2808a50c8556079f6b4b1e857d75ccf4fa43429e27d1bb205c9bd8d\", \"d2ccd6151c8106eaeda4ac3f28771864870d2327e129acd4a88a16e143901bdf\", \"17e2bbba7e8934c8b05bd95a35a04a020beb1298b8ae94c2b2bf7911ad173f20\", \"a9dd9a2dfd3929a3300e8522e0db027f391f8b03ae58064b76218608c02ef577\", \"1f3058852719367c5c7cef36169357e3b9ee637eecba7f28df2ac097dad28fc9\", \"95a01f42f19181d1d691f92e8e2737cac55974f4d3e0f86f674c3e84cee205f6\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"43108ec2a3072162e9b3b82aed46df599bd192c8f923293a398281f0c67e8aae\", \n \"A1\": \"7a1a1878999827176bcfc32df00414cd6be57d8bbad907564d071e77c625005d\", \n \"B\": \"6e497cd58d30d420d5cde92a7ef8ddcdc5e953d55eb223e95cc1e9edba4049e7\", \n \"r1\": \"728542ceacaa8bceb6dc82ce3b0294eb57476103f4669b1b446fc8b3ff970409\", \n \"s1\": \"ad02e606b08b273e39f50344351bbe3e7f1f09437982f3c9817698394df12004\", \n \"d1\": \"635da6726be57bc727d6cc2488e2d1f1a7f64cd9fffcad5281176cb43cfc3604\", \n \"L\": [ \"e73b14501d732dda57d80108176de3a885cd7ca322e7368c5d1ef63b74d38d4f\", \"94a7ea1436feead534e9bfdbe5fd186199a172462f2165026673c883f6093633\", \"257c2b940a6a5c7dc3561e7685017a7a612d59facd45ad3aedee4433d66d7f61\", \"94c0ca2b30c86c26c07ff69a8fc5c568980c3662598a19f5c63259258dacf50e\", \"e6b83395d52fba08cb0305746c9ff74c8e0431ac10b65fada1ab841921b5a705\", \"38a2a1792830106d045c51f95043ca1ee492169208ec52dd8ce307025f5297d7\", \"d40cd94668079ea06fb9b65b2ca7d8edf58062cde615fc324b921db1611f2422\", \"8ff52d986087dc7c56247aff907f7434b094e2d1f6c69be514196acbf758a3ab\", \"3db25b0a80c0fc3e9076e0a934f4cf5d2bdddbd7d9af0c47fe3dfe5d8de4dc20\", \"3dd4a862cde72b72f138109137de2481ea146e6758877e7bdf4d98db15e97b61\"\n ], \n \"R\": [ \"caca6ad74c33497b2ca9a3e4445dd211d89156337d0b2e6bbc5ad5f6833f36b2\", \"39e79526a48fc7b86cf9c7882af011404cab69de4b9c4f2b7929e7d23763eaf5\", \"fc673c2c2755231bf1e41bf1dcd4ea549e0b610d7a449337c499817921ef2fce\", \"52795d3ac0410faea86d480fe37dfe169ec177d53a83532d27b3ccfa7663c6d7\", \"27a093c62d3f7988584f579bd146fde10992155bcb47ffec0d5390e4190aaf24\", \"a8709c9954e65d370ec79a47eb973fdcee672afa283c986be21f59db0f1b9144\", \"38ae83c19c43c6a0113400e6883c84aa64a788086d2e6827bf125db4f23612d7\", \"e92d8fe260b2e1e76a235ef3ab824a000713ab23f34661ccc596e2198239f29b\", \"fcc05d99a86c42fe802eed8da93490cffadfc7adc848568af250835d9e926a71\", \"c446422faa9b57cb1ee4c4b9251d8e99c43635e7ce796d0dec1918393562bb70\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"463c67a254e58ae723dd8c2f4534ced8e8fd68c2b655a046756cd42c93b46604\", \"18b166ac1ca569cc5642462664b87d02a15cd8fcc81c335d4a131b34e880ee01\", \"241d90a51e88fbeaaeb3952f8e2c32376cb883b28445d345ccd3991632732f0b\", \"315388f9b8fc18599ac2d74bc0654e8e6f684c87a274889384dc7393b3301f04\", \"e94dc23c3c41d08ad7cebe96c4221b9c1b9f02d24ee707a28a91e7e9f9fa8407\", \"3be8794c7c34beaa52086b541f9904607eb115f2111dc96b5bce5b7545421409\", \"8279c030920e6d1bfbfd083421eba2365d671467b2a2a3fcba832c5a6d86a601\", \"73f228a07d33596edc8aa922a0c9b26996502b33eeec0038f74fe87485f7b607\", \"5a484e14e6c961d8417dd2cbc48029b272dd42b935f27fe7ca7afed71dceed0b\", \"5f3a4688c6ea8b0a444b442ac0396a20784f4f9f94d025e2098c482717cf4e05\", \"a1862e45b8d12b90b19773857752fe4721a49a97eedf189d25c8b0d659883d0d\", \"3e2ce49e18a2f85ecf736191b9058f16cb65d96bf12be8300642c31400e3df05\", \"a8d748a1c84d932aa94c1337ed2c6303e4e4e1e4360cb23e4879760e60501007\", \"e2d2e18200688a0d71e5fb79211614cdf88bd2cd96252cd8742a2d8ea5914f09\", \"46752e3c0ffca147d0b962337b4e8674966b3ef8ed0f7698ea50e6dfc43a8105\", \"989c046ed697d5317e81ab30add72eadaf7d5cc74e68fd4b23e1d70a3ba43d0b\"], \n \"c1\": \"d64720bb8524bf732f9f5ea45fbaf38470c693834b48658c4961e4d4987e3006\", \n \"D\": \"8b15e598afbade29176f45c702a78f0af5576519e177d355d8c17e2f2a859261\"\n }], \n \"pseudoOuts\": [ \"369cc31747f01d8cb57916b59a11ff4aba68e8ea5ead7fa431f5389f8620f759\"]\n }\n}", + "weight": 5750 + },{ + "blob_size": 1879, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 66240000, + "id_hash": "d696e0a07d4a5315239fda1d2fec3fa94c7f87148e254a2e6ce8a648bed86bb3", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261654, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261653, + "relayed": true, + "tx_blob": "020001020010d4cbc025f888800aa9b3da02d483d801b4c3188ad105b38a0ee7c3089831b542af37b3f901e68006885282d2028701428be79097b510e49fe5b25804029ac8bfa5e2a640a8b0e3e0a8199b1d26f22f050003f4c8ce3812f84c4dae9fab0e120faf7e9583c5bb024674a4ceb36550a58da368690003edcedc3b21577e2cb73380c7a829cc6707109e672cee030aa007618ff033ed9e8c00037d3b66c65d73e2c172c52ef1336987487da2507fc7c6ca0579ff7e8d34c47f4d170003d423aefc2536b8839995f569dc5e61385f8a537067f5c00aac957cccfb5a4790b5000397fcebd0877bdd71d2a90aed5a58180a0deecaed068f9e43ce44df011aecae0e382101430ad497db87046e33184d9617daa64add82a53dc16982a056b682b2f9a2da980680fcca1f6a94c40de9d6fb8935d837180bad6fc5bb224d8ed00140afb3123c36a4ff194f108db26877967b024bbd0cb51d34a7f5cb26262573b9a66cd70635204820f80d01f04297474b9ca965cdc9302126eebe75aa86a0a837f9dcface5fa38ad81bdcaa40e1fe942f2fc2768f267feece915df41d9864291b57885c1e0f8e4c93a7a4610aef477cf53b805dad5a1006071fde67ca8c47f545c2fdf3202120ef652e0173b4257b91811f7f39df6d0c9c1d2e8f00074c619e9e4322dd006c41c10b67c4ed21aae62ce8748701865c7cb3df6f168e9564b1c7f0f7ac8429f2ecc311a10557feec8395cd8e03be8f38908c2fee85f557cdb534d9775ae9583f7a73024d9a7efa1d75b74f4e62b0a40954b6ca4c0c2091beb3021f21cce994f5a679c0f45126a83d9cb431ab6babb1d3272ed9456ea6af5c35037b4a89a23640c6edf1a4576d592bbc5dd0c4f40aa3e918712d4812f5bc8a01e38e6dc1d4b5dc39ccb5e26eeaf5c88b85d968c800e10bfca42e320f6b03c3065856b58908555a266b7308321ba94e80aab0956b0c09e2f1c8c5da991672dea0c43de4c27d232f50c35e3fc836ac8eec7d6466d8af2ce9277a92aca9f4d4d4230d1dfbb042871dc92498339a6225d6ac016e0e9dde852364c31878a19a2820bd196c1f837b398a56152ae01928f9f2fb80aae7301795da93006123b6cea54f34f1232a9f1ddafa340764a5b0b305af112c72c76a6ed5d5513739fbbc56bc027b4251b23a8c7727a2abf5b3e9a803aa3d144022d129fede2abec4f787d574df639bd48d0de0d1e981d88de680a7d40033b0f93b51ed6e60b8199c2adbc7de0b8f76802d8e74d9e46d2145a61232920571bc1d23fce134c02c268b523f5d5d31876d2259b2292597c15937c3057e5c4350391327429428ac6069bdd5db4515113d046f8058506b6e04399016157964b7c7dd41b929e9fb09997f51fa6db7903465b3cab1093ad38a783b67542e75bde42bbf5c07e415c24241017f2365a3e05b1bb8eab7b4ef681d3208a98715fd84e60be86931800276ce667812e9602afa5baacb0caa1ef9fc37cbac120918564ca04d73ce130ca42c28577d504516e5f44b843a76b2c1558d142e64ce4a55c34bf197a0251022a94e973f59a4352fe5e086e79fc90319e29834ab75bb24c4438c383f19ff77463d0f322566c1b5c64f1dd5ab8472ae4e8b4ac20ab110f5281a848ceca73330fc45d3366b7bd1accb139fec1ed99f15d11ef3ec2e7207a5e7bdafa136a85ccb0a55c3e77c86a70c2496fbcd0373c8aac6067731183cf211bbefbc7d71269d6ba62c98aa791613cbd267b4424763141075bf53d6c4472d3f7685f73f726b16caff0b90183a71c42ca6a27bf6d818abea8c67eb90ce4aca1f9efcb43215214336da99b4074faba4a99c9cfb429e70759024f3d5ce150e9e97e77c4f70501efc575c485e0aea5ed0f246930d73be9d8662f41a408323beacd53135df2eeea93722a00bfc026f5827dccdb05f8e9fedbfc7632b36324d891eb8220978da3ad6e4ad1f3e3507f4b7b8f4914326b28fda56141b2be6350c9c8499afbe66da9417d03598c40f05ec043be6b64b2aa2a0a5da6ab9825d6ebc03578ef5e7370ea63d051cb9f87e01933cfe48a5b22c49d6aca2cf869f6e98bb89c51c6fc9a5cea61a03920214aa0a014a19d0f3fe97670e3990021dae0fdbb5ed4979b1e2144ec3d1ba4b68c39205a86c3350cf2315a25c4ddb21d24ff2a3bdd5e0c53556e2c917920059781700081bdc3fd3966568487382cdb556e8fce96995dc2fb2d598edd55abb423e1ab50b74fdd8568356d62c742394e7bd5e1869a8f28a8557525664b8b28ab14c3d1108e4bae38d05447408f71bdb233aab9cd9a740e242794b9c75760064fdc90c2e0b902b407f311b34d9a172731fe7aa10c9bd189071bdf6f24be900fd8711a08407052db276f4ec535ffb2341e486de7e4ef4b0bbd10de4409c80221a653455930b82edf3a40421c3c665bba621821945a05a7c6c7ca3946f0b673a7e8fa2023d0e2b05b2fc21ffbdb68b0ccb9e0aacb2623f1a843896e68eb7157f8d115a3d7e0e02fd894c154ea56eb1b0d8f296325d3a71f581b868cbade1bbb50b73bf52fa0883cf71eb20aae786f9b27637e3d19ae75ae5206c0a6f789241741bfee9ce05259fe40f2628445d7d741b152930c35ab1c40aba265817242be986971e83665677", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 78652884, 20972664, 5675433, 3539412, 401844, 92298, 230707, 139751, 6296, 8501, 7087, 31923, 98406, 10504, 43266, 135\n ], \n \"k_image\": \"428be79097b510e49fe5b25804029ac8bfa5e2a640a8b0e3e0a8199b1d26f22f\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"f4c8ce3812f84c4dae9fab0e120faf7e9583c5bb024674a4ceb36550a58da368\", \n \"view_tag\": \"69\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"edcedc3b21577e2cb73380c7a829cc6707109e672cee030aa007618ff033ed9e\", \n \"view_tag\": \"8c\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"7d3b66c65d73e2c172c52ef1336987487da2507fc7c6ca0579ff7e8d34c47f4d\", \n \"view_tag\": \"17\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"d423aefc2536b8839995f569dc5e61385f8a537067f5c00aac957cccfb5a4790\", \n \"view_tag\": \"b5\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"97fcebd0877bdd71d2a90aed5a58180a0deecaed068f9e43ce44df011aecae0e\", \n \"view_tag\": \"38\"\n }\n }\n }\n ], \n \"extra\": [ 1, 67, 10, 212, 151, 219, 135, 4, 110, 51, 24, 77, 150, 23, 218, 166, 74, 221, 130, 165, 61, 193, 105, 130, 160, 86, 182, 130, 178, 249, 162, 218, 152\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 66240000, \n \"ecdhInfo\": [ {\n \"amount\": \"6a94c40de9d6fb89\"\n }, {\n \"amount\": \"35d837180bad6fc5\"\n }, {\n \"amount\": \"bb224d8ed00140af\"\n }, {\n \"amount\": \"b3123c36a4ff194f\"\n }, {\n \"amount\": \"108db26877967b02\"\n }], \n \"outPk\": [ \"4bbd0cb51d34a7f5cb26262573b9a66cd70635204820f80d01f04297474b9ca9\", \"65cdc9302126eebe75aa86a0a837f9dcface5fa38ad81bdcaa40e1fe942f2fc2\", \"768f267feece915df41d9864291b57885c1e0f8e4c93a7a4610aef477cf53b80\", \"5dad5a1006071fde67ca8c47f545c2fdf3202120ef652e0173b4257b91811f7f\", \"39df6d0c9c1d2e8f00074c619e9e4322dd006c41c10b67c4ed21aae62ce87487\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"865c7cb3df6f168e9564b1c7f0f7ac8429f2ecc311a10557feec8395cd8e03be\", \n \"A1\": \"8f38908c2fee85f557cdb534d9775ae9583f7a73024d9a7efa1d75b74f4e62b0\", \n \"B\": \"a40954b6ca4c0c2091beb3021f21cce994f5a679c0f45126a83d9cb431ab6bab\", \n \"r1\": \"b1d3272ed9456ea6af5c35037b4a89a23640c6edf1a4576d592bbc5dd0c4f40a\", \n \"s1\": \"a3e918712d4812f5bc8a01e38e6dc1d4b5dc39ccb5e26eeaf5c88b85d968c800\", \n \"d1\": \"e10bfca42e320f6b03c3065856b58908555a266b7308321ba94e80aab0956b0c\", \n \"L\": [ \"e2f1c8c5da991672dea0c43de4c27d232f50c35e3fc836ac8eec7d6466d8af2c\", \"e9277a92aca9f4d4d4230d1dfbb042871dc92498339a6225d6ac016e0e9dde85\", \"2364c31878a19a2820bd196c1f837b398a56152ae01928f9f2fb80aae7301795\", \"da93006123b6cea54f34f1232a9f1ddafa340764a5b0b305af112c72c76a6ed5\", \"d5513739fbbc56bc027b4251b23a8c7727a2abf5b3e9a803aa3d144022d129fe\", \"de2abec4f787d574df639bd48d0de0d1e981d88de680a7d40033b0f93b51ed6e\", \"60b8199c2adbc7de0b8f76802d8e74d9e46d2145a61232920571bc1d23fce134\", \"c02c268b523f5d5d31876d2259b2292597c15937c3057e5c4350391327429428\", \"ac6069bdd5db4515113d046f8058506b6e04399016157964b7c7dd41b929e9fb\"\n ], \n \"R\": [ \"997f51fa6db7903465b3cab1093ad38a783b67542e75bde42bbf5c07e415c242\", \"41017f2365a3e05b1bb8eab7b4ef681d3208a98715fd84e60be86931800276ce\", \"667812e9602afa5baacb0caa1ef9fc37cbac120918564ca04d73ce130ca42c28\", \"577d504516e5f44b843a76b2c1558d142e64ce4a55c34bf197a0251022a94e97\", \"3f59a4352fe5e086e79fc90319e29834ab75bb24c4438c383f19ff77463d0f32\", \"2566c1b5c64f1dd5ab8472ae4e8b4ac20ab110f5281a848ceca73330fc45d336\", \"6b7bd1accb139fec1ed99f15d11ef3ec2e7207a5e7bdafa136a85ccb0a55c3e7\", \"7c86a70c2496fbcd0373c8aac6067731183cf211bbefbc7d71269d6ba62c98aa\", \"791613cbd267b4424763141075bf53d6c4472d3f7685f73f726b16caff0b9018\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"3a71c42ca6a27bf6d818abea8c67eb90ce4aca1f9efcb43215214336da99b407\", \"4faba4a99c9cfb429e70759024f3d5ce150e9e97e77c4f70501efc575c485e0a\", \"ea5ed0f246930d73be9d8662f41a408323beacd53135df2eeea93722a00bfc02\", \"6f5827dccdb05f8e9fedbfc7632b36324d891eb8220978da3ad6e4ad1f3e3507\", \"f4b7b8f4914326b28fda56141b2be6350c9c8499afbe66da9417d03598c40f05\", \"ec043be6b64b2aa2a0a5da6ab9825d6ebc03578ef5e7370ea63d051cb9f87e01\", \"933cfe48a5b22c49d6aca2cf869f6e98bb89c51c6fc9a5cea61a03920214aa0a\", \"014a19d0f3fe97670e3990021dae0fdbb5ed4979b1e2144ec3d1ba4b68c39205\", \"a86c3350cf2315a25c4ddb21d24ff2a3bdd5e0c53556e2c91792005978170008\", \"1bdc3fd3966568487382cdb556e8fce96995dc2fb2d598edd55abb423e1ab50b\", \"74fdd8568356d62c742394e7bd5e1869a8f28a8557525664b8b28ab14c3d1108\", \"e4bae38d05447408f71bdb233aab9cd9a740e242794b9c75760064fdc90c2e0b\", \"902b407f311b34d9a172731fe7aa10c9bd189071bdf6f24be900fd8711a08407\", \"052db276f4ec535ffb2341e486de7e4ef4b0bbd10de4409c80221a653455930b\", \"82edf3a40421c3c665bba621821945a05a7c6c7ca3946f0b673a7e8fa2023d0e\", \"2b05b2fc21ffbdb68b0ccb9e0aacb2623f1a843896e68eb7157f8d115a3d7e0e\"], \n \"c1\": \"02fd894c154ea56eb1b0d8f296325d3a71f581b868cbade1bbb50b73bf52fa08\", \n \"D\": \"83cf71eb20aae786f9b27637e3d19ae75ae5206c0a6f789241741bfee9ce0525\"\n }], \n \"pseudoOuts\": [ \"9fe40f2628445d7d741b152930c35ab1c40aba265817242be986971e83665677\"]\n }\n}", + "weight": 3312 + },{ + "blob_size": 1539, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 492480000, + "id_hash": "a60834967cc6d22e61acbc298d5d2c725cbf5c8c492b999f3420da126f41b6c7", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261654, + "max_used_block_height": 3195144, + "max_used_block_id_hash": "464cb0e47663a64ee8eaf483c46d6584e9a7945a0c792b19cdbde426ec3a5034", + "receive_time": 1721261653, + "relayed": true, + "tx_blob": "020001020010dab5ae1feefaf606fea6c609aca1ec018fa0e70186de3df48307c5b72ab9a001dea302de3c9c17c2b701a923a801d302d2ed8513f48724933df6229a9fb6ededdcf5d0963280ee44fa9216ceebe7941f020003c9558a2daba528058e11b62fb334f0c1324096575db177d3676f2f3a7287f154640003cfc87315c4bbbfc8053d6f4921465da881c2675a531141d272c7b4e085829909c82c01af5114379f90bb68c84743bedf90bd63aa394ea61191a0c315c9816d8e0b9efd020901d1c905878ab04b850680cceaea016f7857e7ade8bd0ee83ef9696bc9b3823e5b43d81c8f49c1f4c6e6ccdb93f7d3d500bcc38801eba594e5377f8339c5e2baed73a25fdcb6162c8cac13ab20adf8fa0652db145499fff83ca114f5b5c39b01d0531831fce743ab9dcdd3571f8a93c433dfa17e9885741b50e34ed92e5d3b41b43bd7a99784d3e95385b94d578222b3bd7e8f0d981a318c424c98eaeffb9cab22da9b9ff6d666a72f2e56751796015b36634f455d2b1f99874b6b30707a20961c12819b752f60ec321436fe0d3bfd681b14048578b14eef8bbedad3f672fc010518a1c63af4ed08d8e7b875641eff37acf9fe46ca0a1b428ea685131eab8003a3cbe82bb87769ab6c5763eb468d04c985a650dde6db581ed3926f44f68bd9040796c94d7d0655ace603e046b12e0267718d575ac32b6fbfe0b911158198d2c5bc08c54b7f62ed326d8965c90e9bb29ad63fcb6d1d4ca5f849aba2eccb5a51ed1d28f2eceda481bd1f3a0229a9cce6b8816831ff5ac7d129f8f3088cdcfe356d73cd4b07a4453a016b3cd65bcb3ac7f85bed185044ffced69b4e111af67582c85551a1fee0e370eb1360611653b571f6dd35f1ab90b1af509dd630b88e6851322e65f1189e46bde8175c4add525e5975c8de17b718155ba857dcba3695543ef6e6a71d548c4940850707eeaf3769839ec636f3e0088d92bbdd5eb2e508529cfb4c078cfa9204c35863256579aefad74fbc7e411174375840bc3070c74939a0de834131dabafa47de92c03d38384d870f3b65f73e7e411ca4130de1f0a706399b64f63dc809524dcdcc76b3a1c0eb963384c39779125ec10c7eeccf9190200a76c4df88dedc7a6b7661ef39be599844c88f5320a1288db2f6395f73907851f966fe67c584ec77c89b15e597254b6550c460f4607c9aa7287577c6c1fc3c3b0b01f0f30818dce251455e18138c4509100cf7c1c79e9b0d332a57a0e3734b8bdaddfa0a3233560a441f2bff47b98de49b8c87e5401e7dfe844b7ad4e3b669394e44816e4cb057b6afce2a9fe3915084deae4d047e698b6753ec6da7e4b3a34babe73206a5990f57933939c242e27891786882631d5fd264e26d2853aba16336ae15070f00602edfbfd9abf9702c7cf9607b52ad0a04d08518054c7f4cada448853092090164292412d8c4196fb4ddb842669ea9de50421b6f219cb05a0befe63f618f043ececbc47f1e3547e4e7abe935c972ed8f60258e1bb7b7b97a74109bfb5b6a03308939028b18f56c3128641e4bf7c7c5884fc05ee7ebdb76b85ad30cb9a1d90680dfdfecbfee9ea2e98bc50e3021f165dcf3890713572b0847f4767a244dc908c8931d54a79dbc34f35888485b977aa7d809b3513aec10d4a522175edfcc9e044a15f68a6e1f5b2095f9c7791984e794b75d3f9940b602b8984773443e4c760bf28dca4e93a036aa4be7771073d23aca7732aae7a364c628437064dc5e8dbf0dfb1fe2333a90b6950dc764e90840ebb74fb98803afe6ccd792ad637183747402c3218537f5b9416b9559b6cadd148c5a8bb52b4f92be7cf130ef729227acac092c13e6c8a9b5046688b81ded00f5ccfbd2f70bfb5aeec37de7d7ea4097feb5005590fab38475f3e37dcc9df3fa3a176d8f45e732acfd12e3f680bc4b511aa90e8c853f0d294f351f8a16a486dbd7bdbe582d48ff956a7c17d719220293d9b3088b24cbaa956ee96d662fe1f30b3d477c96dd3fab9902fcecf8692725440a380f5ffe1c8872ada9fcba8ad026cbb5e9d8324943cb5ebde77eefdcd5bb175c750a577032337113d6d1f45d488bfedbc3a25427633bb1873eb45a9a4ea726c33c0b297af95c01880e1f3bcb0ac86f4d7105e5c6cee032282fc50aa2d34c06b4c4bb", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 65772250, 14531950, 20026238, 3870892, 3788815, 1011462, 115188, 695237, 20537, 37342, 7774, 2972, 23490, 4521, 168, 339\n ], \n \"k_image\": \"d2ed8513f48724933df6229a9fb6ededdcf5d0963280ee44fa9216ceebe7941f\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"c9558a2daba528058e11b62fb334f0c1324096575db177d3676f2f3a7287f154\", \n \"view_tag\": \"64\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"cfc87315c4bbbfc8053d6f4921465da881c2675a531141d272c7b4e085829909\", \n \"view_tag\": \"c8\"\n }\n }\n }\n ], \n \"extra\": [ 1, 175, 81, 20, 55, 159, 144, 187, 104, 200, 71, 67, 190, 223, 144, 189, 99, 170, 57, 78, 166, 17, 145, 160, 195, 21, 201, 129, 109, 142, 11, 158, 253, 2, 9, 1, 209, 201, 5, 135, 138, 176, 75, 133\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 492480000, \n \"ecdhInfo\": [ {\n \"amount\": \"6f7857e7ade8bd0e\"\n }, {\n \"amount\": \"e83ef9696bc9b382\"\n }], \n \"outPk\": [ \"3e5b43d81c8f49c1f4c6e6ccdb93f7d3d500bcc38801eba594e5377f8339c5e2\", \"baed73a25fdcb6162c8cac13ab20adf8fa0652db145499fff83ca114f5b5c39b\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"d0531831fce743ab9dcdd3571f8a93c433dfa17e9885741b50e34ed92e5d3b41\", \n \"A1\": \"b43bd7a99784d3e95385b94d578222b3bd7e8f0d981a318c424c98eaeffb9cab\", \n \"B\": \"22da9b9ff6d666a72f2e56751796015b36634f455d2b1f99874b6b30707a2096\", \n \"r1\": \"1c12819b752f60ec321436fe0d3bfd681b14048578b14eef8bbedad3f672fc01\", \n \"s1\": \"0518a1c63af4ed08d8e7b875641eff37acf9fe46ca0a1b428ea685131eab8003\", \n \"d1\": \"a3cbe82bb87769ab6c5763eb468d04c985a650dde6db581ed3926f44f68bd904\", \n \"L\": [ \"96c94d7d0655ace603e046b12e0267718d575ac32b6fbfe0b911158198d2c5bc\", \"08c54b7f62ed326d8965c90e9bb29ad63fcb6d1d4ca5f849aba2eccb5a51ed1d\", \"28f2eceda481bd1f3a0229a9cce6b8816831ff5ac7d129f8f3088cdcfe356d73\", \"cd4b07a4453a016b3cd65bcb3ac7f85bed185044ffced69b4e111af67582c855\", \"51a1fee0e370eb1360611653b571f6dd35f1ab90b1af509dd630b88e6851322e\", \"65f1189e46bde8175c4add525e5975c8de17b718155ba857dcba3695543ef6e6\", \"a71d548c4940850707eeaf3769839ec636f3e0088d92bbdd5eb2e508529cfb4c\"\n ], \n \"R\": [ \"8cfa9204c35863256579aefad74fbc7e411174375840bc3070c74939a0de8341\", \"31dabafa47de92c03d38384d870f3b65f73e7e411ca4130de1f0a706399b64f6\", \"3dc809524dcdcc76b3a1c0eb963384c39779125ec10c7eeccf9190200a76c4df\", \"88dedc7a6b7661ef39be599844c88f5320a1288db2f6395f73907851f966fe67\", \"c584ec77c89b15e597254b6550c460f4607c9aa7287577c6c1fc3c3b0b01f0f3\", \"0818dce251455e18138c4509100cf7c1c79e9b0d332a57a0e3734b8bdaddfa0a\", \"3233560a441f2bff47b98de49b8c87e5401e7dfe844b7ad4e3b669394e44816e\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"4cb057b6afce2a9fe3915084deae4d047e698b6753ec6da7e4b3a34babe73206\", \"a5990f57933939c242e27891786882631d5fd264e26d2853aba16336ae15070f\", \"00602edfbfd9abf9702c7cf9607b52ad0a04d08518054c7f4cada44885309209\", \"0164292412d8c4196fb4ddb842669ea9de50421b6f219cb05a0befe63f618f04\", \"3ececbc47f1e3547e4e7abe935c972ed8f60258e1bb7b7b97a74109bfb5b6a03\", \"308939028b18f56c3128641e4bf7c7c5884fc05ee7ebdb76b85ad30cb9a1d906\", \"80dfdfecbfee9ea2e98bc50e3021f165dcf3890713572b0847f4767a244dc908\", \"c8931d54a79dbc34f35888485b977aa7d809b3513aec10d4a522175edfcc9e04\", \"4a15f68a6e1f5b2095f9c7791984e794b75d3f9940b602b8984773443e4c760b\", \"f28dca4e93a036aa4be7771073d23aca7732aae7a364c628437064dc5e8dbf0d\", \"fb1fe2333a90b6950dc764e90840ebb74fb98803afe6ccd792ad637183747402\", \"c3218537f5b9416b9559b6cadd148c5a8bb52b4f92be7cf130ef729227acac09\", \"2c13e6c8a9b5046688b81ded00f5ccfbd2f70bfb5aeec37de7d7ea4097feb500\", \"5590fab38475f3e37dcc9df3fa3a176d8f45e732acfd12e3f680bc4b511aa90e\", \"8c853f0d294f351f8a16a486dbd7bdbe582d48ff956a7c17d719220293d9b308\", \"8b24cbaa956ee96d662fe1f30b3d477c96dd3fab9902fcecf8692725440a380f\"], \n \"c1\": \"5ffe1c8872ada9fcba8ad026cbb5e9d8324943cb5ebde77eefdcd5bb175c750a\", \n \"D\": \"577032337113d6d1f45d488bfedbc3a25427633bb1873eb45a9a4ea726c33c0b\"\n }], \n \"pseudoOuts\": [ \"297af95c01880e1f3bcb0ac86f4d7105e5c6cee032282fc50aa2d34c06b4c4bb\"]\n }\n}", + "weight": 1539 + },{ + "blob_size": 1536, + "do_not_relay": false, + "double_spend_seen": false, + "fee": 491520000, + "id_hash": "aef60754dc1b2cd788faf23dd3c62afd3a0ac14e088cd6c8d22f1597860e47cd", + "kept_by_block": false, + "last_failed_height": 0, + "last_failed_id_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "last_relayed_time": 1721261653, + "max_used_block_height": 3195160, + "max_used_block_id_hash": "2f7b8ca3dbd64cb33f428ece414b2b1cef405cfcd85fab1a70383490cc7ed603", + "receive_time": 1721261653, + "relayed": true, + "tx_blob": "02000102001081d9e02d98cd8606d18f0cbc9919ce9704e78b04bdeb03e28806af8601cec110c54dafc502a6118b1c9743c7052c479dbff819502441604a914af485db2f795b7f5bc0eab877d60a1419ee54980200031085022c023e67ccef3004d93b200be5df0cca89c5a17c51d76c3ee3c107d39190000332dd926cf0eac221cabeb5beee0cc9ef68a07a79748a69c3142377b5a8dbd6c7be2c019eb1fa0d8e9c4853c7db214bf6547ddd8b23bec77445b208e296fb26d0861a5b0209016ae500293b5f1167068080b0ea0113648ac5774104fe28d4ea6e7e28511a1c5c4189735a8c2e98bb12572283f3797ff1273d5dd44312e10cbb4cfdf34c3f7664dfc643db30f011129a53843d647e7cab9e03c2df68ef71b2040d59005f4501fb8885aaa4fc7f5fcae273f7a4612c629423864cb4d12c06044dad6629f40edfb2d6cb3c9dd78407302087c767c8bf17d507471a9cb9af54dc6528de99c8dd62ca69f07a623f4ca679eccc0fa03568e346cc061ff1624c4b73ee72a7a414c68164bc2abdf7f7798e6a0f13b2c3852371c2db35ebb00c7ba018a42b0c2c31fc06a748b257eafb46efc220a57a7767664f7744420bc3ee1c7c227aa711680dd301accf87381433838debd8e517ba86d06cb7475f3b8dfa301ee879112ab2e7a00807200f21ba8eeb86935deb899b3babb7a3ebb21b2f1dfd1bb08015ae4b8ff4f16356c7e807b6bf00f6178c752d92f9630508eeccf307f8efdc7dfae7592555a0824706000a2f329413ffe6ecfe68345053f441db1815286b951cbf83b4e7c327e27019fe81f3c534b297b9388438ffb1d5acd17514678a87719b843d64df591d1e478fdac7f3940088cfe0ea54a896fbcad933fb85c9e3f060db515cc8495f4a8939102799616733953f6bb959916ebdb8cfb8c958f62e787aa7b4a3bd45c311cd83be8617ee592413d8c76bf05922147cb08447e7b899344e9c7069cf710fe22a07744704b4b118e85e16e5dc3abc02e9e6fd45e95c73ec2412355907bc4a5d3d17849043695696eb46dbeb1389bc544c5ec11d5e35a9d9be1e5aa2884377c2f4410773a62507f87e7fe992e335377585bf63a7554e352066574e4e35fdf5d1c90a7ffa6b791e317f2c7c76a85532a7ae18a74c293e3ce9c853080fe23abc42d97fb8a8320d3586343706a56e8f293322aba82e9c159a41a3ceff344177dddc3df947cf9159c194d6b9c392dd76a5ddca3f1110ca3043f7b2e82ef1b55fbc87e8b3063bd71e497c90ae647f0c21719149341298ab1402e9bbee4b674bc9509070df1e5de5f3c400ef5230773a8c5b6fb1dc556bb25a8d0110b4c6f411785927930bcbc5b5a9057c4c6b55397a8000f4d8b6cc6159a4e642aa449512e56b405beb0ee74de267b38c7135eaba1f4171e7fbe7fa79807eba65b20a78e896c94e47ae0519d587d550fbf22015c99d604c7f55019901ac5fcbd674d0d2fd6d752087ca056f89bd649fc33ddb75888ecc0327e66d0642683825f262c5cec006599bdf1f07b0f9af7553379e798af1e9644d988e703c96ae415e22d053d4c42fbb19c44d062eec4bf6ce7888a7438c2f1d5b94a415ee8ff3bd95045429378b8c2b9fb7c600656b5a6f94b1149793517bce19d0ddf2f5b30fe3a16bbebed91ee0a03c47a003778322b5d214b960acc4b9b2cdd1e55c4aed04199aa9a0b5132b2d3553c3fe087b9ffbbd7409e47528c075ee1edc51e6cedd5fe05998fddab5a3f25edb0ff2083fcf87e8e261df81a9cf178f5facd906821a543560d3f5d0bb07cf0402d69302463bc90bf04cce521b1b115ea4c57c6512695ade926f3be142001ee73e7f130bc9e506619c93bdae690697a0a642fb15921a1426de845c949799218995a96207ebd6b2904f2a881b82a065eac32ade92b8cf9c73939b858cad212976836a8108f15230cfc5131e6a379c236531ea611b1e8d5277add4f4d211cb6f9f6364cf0e8c56ab32609f43aae59b20ada5e35e217d64e44d122665073837ed50ef23c90d8132b7a8e3a732f424f3166075ca4082ba690961a894a7ed2e6f42d2e772010133381b48d999bbd4cb548c381550626e9e5b8e91c7ea1e78d01e390b5a9de6ad42feb5d5d5f1408202abac88b8c70056af4bde7b2b1a412d8feb4b0b85b88c61", + "tx_json": "{\n \"version\": 2, \n \"unlock_time\": 0, \n \"vin\": [ {\n \"key\": {\n \"amount\": 0, \n \"key_offsets\": [ 95956097, 12691096, 198609, 412860, 68558, 67047, 62909, 99426, 17199, 270542, 9925, 41647, 2214, 3595, 8599, 711\n ], \n \"k_image\": \"2c479dbff819502441604a914af485db2f795b7f5bc0eab877d60a1419ee5498\"\n }\n }\n ], \n \"vout\": [ {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"1085022c023e67ccef3004d93b200be5df0cca89c5a17c51d76c3ee3c107d391\", \n \"view_tag\": \"90\"\n }\n }\n }, {\n \"amount\": 0, \n \"target\": {\n \"tagged_key\": {\n \"key\": \"32dd926cf0eac221cabeb5beee0cc9ef68a07a79748a69c3142377b5a8dbd6c7\", \n \"view_tag\": \"be\"\n }\n }\n }\n ], \n \"extra\": [ 1, 158, 177, 250, 13, 142, 156, 72, 83, 199, 219, 33, 75, 246, 84, 125, 221, 139, 35, 190, 199, 116, 69, 178, 8, 226, 150, 251, 38, 208, 134, 26, 91, 2, 9, 1, 106, 229, 0, 41, 59, 95, 17, 103\n ], \n \"rct_signatures\": {\n \"type\": 6, \n \"txnFee\": 491520000, \n \"ecdhInfo\": [ {\n \"amount\": \"13648ac5774104fe\"\n }, {\n \"amount\": \"28d4ea6e7e28511a\"\n }], \n \"outPk\": [ \"1c5c4189735a8c2e98bb12572283f3797ff1273d5dd44312e10cbb4cfdf34c3f\", \"7664dfc643db30f011129a53843d647e7cab9e03c2df68ef71b2040d59005f45\"]\n }, \n \"rctsig_prunable\": {\n \"nbp\": 1, \n \"bpp\": [ {\n \"A\": \"fb8885aaa4fc7f5fcae273f7a4612c629423864cb4d12c06044dad6629f40edf\", \n \"A1\": \"b2d6cb3c9dd78407302087c767c8bf17d507471a9cb9af54dc6528de99c8dd62\", \n \"B\": \"ca69f07a623f4ca679eccc0fa03568e346cc061ff1624c4b73ee72a7a414c681\", \n \"r1\": \"64bc2abdf7f7798e6a0f13b2c3852371c2db35ebb00c7ba018a42b0c2c31fc06\", \n \"s1\": \"a748b257eafb46efc220a57a7767664f7744420bc3ee1c7c227aa711680dd301\", \n \"d1\": \"accf87381433838debd8e517ba86d06cb7475f3b8dfa301ee879112ab2e7a008\", \n \"L\": [ \"200f21ba8eeb86935deb899b3babb7a3ebb21b2f1dfd1bb08015ae4b8ff4f163\", \"56c7e807b6bf00f6178c752d92f9630508eeccf307f8efdc7dfae7592555a082\", \"4706000a2f329413ffe6ecfe68345053f441db1815286b951cbf83b4e7c327e2\", \"7019fe81f3c534b297b9388438ffb1d5acd17514678a87719b843d64df591d1e\", \"478fdac7f3940088cfe0ea54a896fbcad933fb85c9e3f060db515cc8495f4a89\", \"39102799616733953f6bb959916ebdb8cfb8c958f62e787aa7b4a3bd45c311cd\", \"83be8617ee592413d8c76bf05922147cb08447e7b899344e9c7069cf710fe22a\"\n ], \n \"R\": [ \"744704b4b118e85e16e5dc3abc02e9e6fd45e95c73ec2412355907bc4a5d3d17\", \"849043695696eb46dbeb1389bc544c5ec11d5e35a9d9be1e5aa2884377c2f441\", \"0773a62507f87e7fe992e335377585bf63a7554e352066574e4e35fdf5d1c90a\", \"7ffa6b791e317f2c7c76a85532a7ae18a74c293e3ce9c853080fe23abc42d97f\", \"b8a8320d3586343706a56e8f293322aba82e9c159a41a3ceff344177dddc3df9\", \"47cf9159c194d6b9c392dd76a5ddca3f1110ca3043f7b2e82ef1b55fbc87e8b3\", \"063bd71e497c90ae647f0c21719149341298ab1402e9bbee4b674bc9509070df\"\n ]\n }\n ], \n \"CLSAGs\": [ {\n \"s\": [ \"1e5de5f3c400ef5230773a8c5b6fb1dc556bb25a8d0110b4c6f411785927930b\", \"cbc5b5a9057c4c6b55397a8000f4d8b6cc6159a4e642aa449512e56b405beb0e\", \"e74de267b38c7135eaba1f4171e7fbe7fa79807eba65b20a78e896c94e47ae05\", \"19d587d550fbf22015c99d604c7f55019901ac5fcbd674d0d2fd6d752087ca05\", \"6f89bd649fc33ddb75888ecc0327e66d0642683825f262c5cec006599bdf1f07\", \"b0f9af7553379e798af1e9644d988e703c96ae415e22d053d4c42fbb19c44d06\", \"2eec4bf6ce7888a7438c2f1d5b94a415ee8ff3bd95045429378b8c2b9fb7c600\", \"656b5a6f94b1149793517bce19d0ddf2f5b30fe3a16bbebed91ee0a03c47a003\", \"778322b5d214b960acc4b9b2cdd1e55c4aed04199aa9a0b5132b2d3553c3fe08\", \"7b9ffbbd7409e47528c075ee1edc51e6cedd5fe05998fddab5a3f25edb0ff208\", \"3fcf87e8e261df81a9cf178f5facd906821a543560d3f5d0bb07cf0402d69302\", \"463bc90bf04cce521b1b115ea4c57c6512695ade926f3be142001ee73e7f130b\", \"c9e506619c93bdae690697a0a642fb15921a1426de845c949799218995a96207\", \"ebd6b2904f2a881b82a065eac32ade92b8cf9c73939b858cad212976836a8108\", \"f15230cfc5131e6a379c236531ea611b1e8d5277add4f4d211cb6f9f6364cf0e\", \"8c56ab32609f43aae59b20ada5e35e217d64e44d122665073837ed50ef23c90d\"], \n \"c1\": \"8132b7a8e3a732f424f3166075ca4082ba690961a894a7ed2e6f42d2e7720101\", \n \"D\": \"33381b48d999bbd4cb548c381550626e9e5b8e91c7ea1e78d01e390b5a9de6ad\"\n }], \n \"pseudoOuts\": [ \"42feb5d5d5f1408202abac88b8c70056af4bde7b2b1a412d8feb4b0b85b88c61\"]\n }\n}", + "weight": 1536 + }], + "untrusted": false +}"#; +} + +define_request_and_response! { + get_transaction_pool_stats (other), + GET_TRANSACTION_POOL_STATS: &str, + Request = +r#"{}"#; + Response = +r#"{ + "credits": 0, + "pool_stats": { + "bytes_max": 11843, + "bytes_med": 2219, + "bytes_min": 1528, + "bytes_total": 144192, + "fee_total": 7018100000, + "histo": [{ + "bytes": 11219, + "txs": 4 + },{ + "bytes": 9737, + "txs": 5 + },{ + "bytes": 8757, + "txs": 4 + },{ + "bytes": 14763, + "txs": 4 + },{ + "bytes": 15007, + "txs": 6 + },{ + "bytes": 15924, + "txs": 6 + },{ + "bytes": 17869, + "txs": 8 + },{ + "bytes": 10894, + "txs": 5 + },{ + "bytes": 38485, + "txs": 10 + },{ + "bytes": 1537, + "txs": 1 + }], + "histo_98pc": 186, + "num_10m": 0, + "num_double_spends": 0, + "num_failing": 0, + "num_not_relayed": 0, + "oldest": 1721261651, + "txs_total": 53 + }, + "status": "OK", + "top_hash": "", + "untrusted": false +}"#; +} + +define_request_and_response! { + stop_daemon (other), + STOP_DAEMON: &str, + Request = +r#"{}"#; + Response = +r#"{ + "status": "OK" +}"#; +} + +define_request_and_response! { + get_limit (other), + GET_LIMIT: &str, + Request = +r#"{}"#; + Response = +r#"{ + "limit_down": 1280000, + "limit_up": 1280000, + "status": "OK", + "untrusted": true +}"#; +} + +define_request_and_response! { + set_limit (other), + SET_LIMIT: &str, + Request = +r#"{ + "limit_down": 1024 +}"#; + Response = +r#"{ + "limit_down": 1024, + "limit_up": 128, + "status": "OK" + "untrusted": false +}"#; +} + +define_request_and_response! { + out_peers (other), + OUT_PEERS: &str, + Request = +r#"{ + "out_peers": 3232235535 +}"#; + Response = +r#"{ + "out_peers": 3232235535, + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + get_net_stats (other), + GET_NET_STATS: &str, + Request = +r#"{ + "in_peers": 3232235535 +}"#; + Response = +r#"{ + "in_peers": 3232235535, + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + get_outs (other), + GET_OUTS: &str, + Request = +r#"{ + "outputs": [{ + "amount": 1, + "index": 0 + },{ + "amount": 1, + "index": 1 + }], + "get_txid": true +}"#; + Response = +r#"{ + "credits": 0, + "outs": [{ + "height": 51941, + "key": "08980d939ec297dd597119f498ad69fed9ca55e3a68f29f2782aae887ef0cf8e", + "mask": "1738eb7a677c6149228a2beaa21bea9e3370802d72a3eec790119580e02bd522", + "txid": "9d651903b80fb70b9935b72081cd967f543662149aed3839222511acd9100601", + "unlocked": true + },{ + "height": 51945, + "key": "454fe46c405be77625fa7e3389a04d3be392346983f27603561ac3a3a74f4a75", + "mask": "1738eb7a677c6149228a2beaa21bea9e3370802d72a3eec790119580e02bd522", + "txid": "230bff732dc5f225df14fff82aadd1bf11b3fb7ad3a03413c396a617e843f7d0", + "unlocked": true + }], + "status": "OK", + "top_hash": "", + "untrusted": false +}"#; +} + +define_request_and_response! { + update (other), + UPDATE: &str, + Request = +r#"{ + "command": "check" +}"#; + Response = +r#"{ + "auto_uri": "", + "hash": "", + "path": "", + "status": "OK", + "untrusted": false, + "update": false, + "user_uri": "", + "version": "" +}"#; +} + +define_request_and_response! { + pop_blocks (other), + POP_BLOCKS: &str, + Request = +r#"{ + "nblocks": 6 +}"#; + Response = +r#"{ + "height": 76482, + "status": "OK", + "untrusted": false +}"#; +} + +define_request_and_response! { + UNDOCUMENTED_ENDPOINT (other), + GET_TRANSACTION_POOL_HASHES: &str, + Request = +r#"{}"#; + Response = +r#"{ + "credits": 0, + "status": "OK", + "top_hash": "", + "tx_hashes": ["aa928aed888acd6152c60194d50a4df29b0b851be6169acf11b6a8e304dd6c03","794345f321a98f3135151f3056c0fdf8188646a8dab27de971428acf3551dd11","1e9d2ae11f2168a228942077483e70940d34e8658c972bbc3e7f7693b90edf17","7375c928f261d00f07197775eb0bfa756e5f23319819152faa0b3c670fe54c1b","2e4d5f8c5a45498f37fb8b6ca4ebc1efa0c371c38c901c77e66b08c072287329","eee6d596cf855adfb10e1597d2018e3a61897ac467ef1d4a5406b8d20bfbd52f","59c574d7ba9bb4558470f74503c7518946a85ea22c60fccfbdec108ce7d8f236","0d57bec1e1075a9e1ac45cf3b3ced1ad95ccdf2a50ce360190111282a0178655","60d627b2369714a40009c07d6185ebe7fa4af324fdfa8d95a37a936eb878d062","661d7e728a901a8cb4cf851447d9cd5752462687ed0b776b605ba706f06bdc7d","b80e1f09442b00b3fffe6db5d263be6267c7586620afff8112d5a8775a6fc58e","974063906d1ddfa914baf85176b0f689d616d23f3d71ed4798458c8b4f9b9d8f","d2575ae152a180be4981a9d2fc009afcd073adaa5c6d8b022c540a62d6c905bb","3d78aa80ee50f506683bab9f02855eb10257a08adceda7cbfbdfc26b10f6b1bb","8b5bc125bdb73b708500f734501d55088c5ac381a0879e1141634eaa72b6a4da","11c06f4d2f00c912ca07313ed2ea5366f3cae914a762bed258731d3d9e3706df","b3644dc7c9a3a53465fe80ad3769e516edaaeb7835e16fdd493aac110d472ae1","ed2478ad793b923dbf652c8612c40799d764e5468897021234a14a37346bc6ee"], + "untrusted": false +}"#; +} + +define_request_and_response! { + UNDOCUMENTED_ENDPOINT (other), + GET_PUBLIC_NODES: &str, + Request = +r#"{}"#; + Response = +r#"{ + "status": "OK", + "untrusted": false, + "white": [{ + "host": "70.52.75.3", + "last_seen": 1721246387, + "rpc_credits_per_hash": 0, + "rpc_port": 18081 + },{ + "host": "zbjkbsxc5munw3qusl7j2hpcmikhqocdf4pqhnhtpzw5nt5jrmofptid.onion:18083", + "last_seen": 1720186288, + "rpc_credits_per_hash": 0, + "rpc_port": 18089 + }] +}"#; +} + +//---------------------------------------------------------------------------------------------------- Tests +#[cfg(test)] +mod test { + // use super::*; +} diff --git a/test-utils/src/rpc/mod.rs b/test-utils/src/rpc/mod.rs index 14c963a..0da6b48 100644 --- a/test-utils/src/rpc/mod.rs +++ b/test-utils/src/rpc/mod.rs @@ -1,25 +1,6 @@ -//! Monero RPC client. +//! Monero RPC data & client. //! -//! This module is a client for Monero RPC that maps the types -//! into the native types used by Cuprate found in `cuprate_types`. -//! -//! # Usage -//! ```rust,ignore -//! #[tokio::main] -//! async fn main() { -//! // Create RPC client. -//! let rpc = HttpRpcClient::new(None).await; -//! -//! // Collect 20 blocks. -//! let mut vec: Vec = vec![]; -//! for height in (3130269 - 20)..3130269 { -//! vec.push(rpc.get_verified_block_information(height).await); -//! } -//! } -//! ``` +//! This module has a `monerod` RPC [`client`] and some real request/response [`data`]. -mod client; -pub use client::HttpRpcClient; - -mod constants; -pub use constants::LOCALHOST_RPC_URL; +pub mod client; +pub mod data; diff --git a/typos.toml b/typos.toml index abab190..0317c40 100644 --- a/typos.toml +++ b/typos.toml @@ -17,4 +17,5 @@ extend-ignore-identifiers-re = [ extend-exclude = [ "/misc/gpg_keys/", "cryptonight/", + "/test-utils/src/rpc/data/json.rs", ]