github.com/status-im/status-go@v1.1.0/services/wallet/activity/recipients.sql (about)

     1  -- Query to retrive all recipients for selected addresses and networks
     2  WITH filter_conditions AS (
     3  	SELECT 
     4  		? AS filterAllAddresses,
     5  		? AS includeAllNetworks,
     6  		? AS pendingStatus
     7  ),
     8  filter_addresses(address) AS (
     9  	VALUES 
    10  		%s
    11  ),
    12  filter_networks(network_id) AS (
    13  	VALUES
    14  		%s
    15  ),
    16  pending_network_ids AS (
    17  	SELECT
    18  		multi_transaction_id
    19  	FROM
    20  		pending_transactions,
    21  		filter_conditions
    22  	WHERE
    23  		pending_transactions.multi_transaction_id != 0
    24  		AND pending_transactions.status = pendingStatus
    25  		AND pending_transactions.network_id IN filter_networks
    26  	GROUP BY
    27  		pending_transactions.multi_transaction_id
    28  ),
    29  tr_network_ids AS (
    30  	SELECT
    31  		multi_transaction_id
    32  	FROM
    33  		transfers
    34  	WHERE
    35  		transfers.loaded == 1
    36  		AND transfers.multi_transaction_id != 0
    37  		AND network_id IN filter_networks
    38  	GROUP BY
    39  		transfers.multi_transaction_id
    40  )
    41  SELECT
    42  	to_address,
    43  	MIN(timestamp) AS min_timestamp
    44  FROM (
    45  	SELECT
    46  		transfers.tx_to_address as to_address,
    47  		MIN(transfers.timestamp) AS timestamp
    48  	FROM
    49  		transfers, filter_conditions
    50  	WHERE
    51  		transfers.multi_transaction_id = 0 AND transfers.tx_to_address NOT NULL
    52  		AND (filterAllAddresses OR transfers.address IN filter_addresses)
    53  		AND (includeAllNetworks OR transfers.network_id IN filter_networks)
    54  	GROUP BY
    55  		transfers.tx_to_address
    56  
    57  	UNION
    58  
    59  	SELECT
    60  		pending_transactions.to_address AS to_address,
    61  		MIN(pending_transactions.timestamp) AS timestamp
    62  	FROM
    63  		pending_transactions, filter_conditions
    64  	WHERE
    65  		pending_transactions.multi_transaction_id = 0 AND pending_transactions.to_address NOT NULL
    66  		AND (filterAllAddresses OR pending_transactions.from_address IN filter_addresses)
    67  		AND (includeAllNetworks OR pending_transactions.network_id IN filter_networks)
    68  	GROUP BY
    69  		pending_transactions.to_address
    70  
    71  	UNION
    72  
    73  	SELECT
    74  		multi_transactions.to_address AS to_address,
    75  		MIN(multi_transactions.timestamp) AS timestamp
    76  	FROM
    77  		multi_transactions, filter_conditions
    78  	WHERE
    79  		(filterAllAddresses OR multi_transactions.from_address IN filter_addresses)
    80  		AND (
    81  			includeAllNetworks
    82  			OR (multi_transactions.from_network_id IN filter_networks)
    83  			OR (multi_transactions.to_network_id IN filter_networks)
    84  			OR (
    85  				COALESCE(multi_transactions.from_network_id, 0) = 0
    86  				AND COALESCE(multi_transactions.to_network_id, 0) = 0
    87  				AND (
    88  					EXISTS (
    89  						SELECT
    90  							1
    91  						FROM
    92  							tr_network_ids
    93  						WHERE
    94  							multi_transactions.id = tr_network_ids.multi_transaction_id
    95  					)
    96  					OR EXISTS (
    97  						SELECT
    98  							1
    99  						FROM
   100  							pending_network_ids
   101  						WHERE
   102  							multi_transactions.id = pending_network_ids.multi_transaction_id
   103  					)
   104  				)
   105  			)
   106  		)
   107  	GROUP BY
   108  		multi_transactions.to_address
   109  ) AS combined_result
   110  GROUP BY
   111  	to_address
   112  ORDER BY
   113  	min_timestamp DESC
   114  LIMIT ? OFFSET ?;