diff --git a/.sqlx/query-65341427fdf27bce4c2f9ec5e705c6fd923b63f11645d8ff7aa661fe3bd4c58e.json b/.sqlx/query-6f86fc2bd2cbb81c658293aad73e5e14f238bb015839e33674b644d59e08ffa5.json similarity index 71% rename from .sqlx/query-65341427fdf27bce4c2f9ec5e705c6fd923b63f11645d8ff7aa661fe3bd4c58e.json rename to .sqlx/query-6f86fc2bd2cbb81c658293aad73e5e14f238bb015839e33674b644d59e08ffa5.json index 6db308f..cf7fe8d 100644 --- a/.sqlx/query-65341427fdf27bce4c2f9ec5e705c6fd923b63f11645d8ff7aa661fe3bd4c58e.json +++ b/.sqlx/query-6f86fc2bd2cbb81c658293aad73e5e14f238bb015839e33674b644d59e08ffa5.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n coinbase_receiver_info AS (\n SELECT\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no,\n coinbase_receiver_pk.value AS coinbase_receiver\n FROM\n blocks_internal_commands AS bic\n INNER JOIN internal_commands AS ic ON bic.internal_command_id=ic.id\n INNER JOIN blocks_internal_commands AS bic_coinbase_receiver ON bic.block_id=bic_coinbase_receiver.block_id\n AND (\n bic.internal_command_id<>bic_coinbase_receiver.internal_command_id\n OR bic.sequence_no<>bic_coinbase_receiver.sequence_no\n OR bic.secondary_sequence_no<>bic_coinbase_receiver.secondary_sequence_no\n )\n INNER JOIN internal_commands AS ic_coinbase_receiver ON ic.command_type='fee_transfer_via_coinbase'\n AND ic_coinbase_receiver.command_type='coinbase'\n AND bic_coinbase_receiver.internal_command_id=ic_coinbase_receiver.id\n INNER JOIN public_keys AS coinbase_receiver_pk ON ic_coinbase_receiver.receiver_id=coinbase_receiver_pk.id\n ),\n internal_commands_info AS (\n SELECT DISTINCT\n ON (\n ica.block_id,\n ica.id,\n ica.sequence_no,\n ica.secondary_sequence_no\n ) ica.id,\n ica.command_type AS \"command_type: InternalCommandType\",\n ica.receiver_id,\n ica.fee,\n ica.hash,\n ica.receiver AS receiver,\n cri.coinbase_receiver AS \"coinbase_receiver?\",\n ica.sequence_no,\n ica.secondary_sequence_no,\n ica.block_id,\n ica.status AS \"status: TransactionStatus\",\n b.state_hash,\n b.height\n FROM\n internal_commands_aggregated AS ica\n INNER JOIN blocks AS b ON ica.block_id=b.id\n AND (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n LEFT JOIN coinbase_receiver_info AS cri ON ica.block_id=cri.block_id\n AND ica.id=cri.internal_command_id\n AND ica.sequence_no=cri.sequence_no\n AND ica.secondary_sequence_no=cri.secondary_sequence_no\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=ica.hash\n OR $2 IS NULL\n )\n AND (\n (\n $3=ica.receiver\n OR $3=cri.coinbase_receiver\n )\n AND $4=''\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=ica.status\n OR $5 IS NULL\n )\n AND (\n $6=ica.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=ica.receiver\n OR $7=cri.coinbase_receiver\n )\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n internal_commands_info\n )\nSELECT\n i.*,\n id_count.total_count,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n internal_commands_info\n ORDER BY\n block_id,\n id,\n sequence_no,\n secondary_sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS i\n LEFT JOIN account_identifiers AS ai ON i.receiver_id=ai.public_key_id\n LEFT JOIN accounts_created AS ac ON ai.id=ac.account_identifier_id\n AND i.block_id=ac.block_id\n AND i.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n i.receiver_id=ic2.receiver_id\n AND bic2.block_id=i.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n i.receiver_id=uc2.receiver_id\n AND buc2.block_id=i.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n i.block_id,\n i.id,\n i.sequence_no,\n i.secondary_sequence_no\n", + "query": "WITH\n coinbase_receiver_info AS (\n SELECT\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no,\n coinbase_receiver_pk.value AS coinbase_receiver\n FROM\n blocks_internal_commands AS bic\n INNER JOIN internal_commands AS ic ON bic.internal_command_id=ic.id\n INNER JOIN blocks_internal_commands AS bic_coinbase_receiver ON bic.block_id=bic_coinbase_receiver.block_id\n AND (\n bic.internal_command_id<>bic_coinbase_receiver.internal_command_id\n OR bic.sequence_no<>bic_coinbase_receiver.sequence_no\n OR bic.secondary_sequence_no<>bic_coinbase_receiver.secondary_sequence_no\n )\n INNER JOIN internal_commands AS ic_coinbase_receiver ON ic.command_type='fee_transfer_via_coinbase'\n AND ic_coinbase_receiver.command_type='coinbase'\n AND bic_coinbase_receiver.internal_command_id=ic_coinbase_receiver.id\n INNER JOIN public_keys AS coinbase_receiver_pk ON ic_coinbase_receiver.receiver_id=coinbase_receiver_pk.id\n ),\n internal_commands_info AS (\n SELECT DISTINCT\n ON (\n ica.block_id,\n ica.id,\n ica.sequence_no,\n ica.secondary_sequence_no\n ) ica.id,\n ica.command_type AS \"command_type: InternalCommandType\",\n ica.receiver_id,\n ica.fee,\n ica.hash,\n ica.receiver AS receiver,\n cri.coinbase_receiver AS \"coinbase_receiver?\",\n ica.sequence_no,\n ica.secondary_sequence_no,\n ica.block_id,\n ica.status AS \"status: TransactionStatus\",\n b.state_hash,\n b.height\n FROM\n internal_commands_aggregated AS ica\n INNER JOIN blocks AS b ON ica.block_id=b.id\n AND (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n LEFT JOIN coinbase_receiver_info AS cri ON ica.block_id=cri.block_id\n AND ica.id=cri.internal_command_id\n AND ica.sequence_no=cri.sequence_no\n AND ica.secondary_sequence_no=cri.secondary_sequence_no\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=ica.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n $3=ica.receiver\n OR $3=cri.coinbase_receiver\n )\n OR $3 IS NULL\n )\n )\n AND (\n $4=''\n OR $4 IS NULL\n )\n AND (\n $5=ica.status\n OR $5 IS NULL\n )\n AND (\n $6=ica.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=ica.receiver\n OR $7=cri.coinbase_receiver\n )\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n internal_commands_info\n )\nSELECT\n i.*,\n id_count.total_count,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n internal_commands_info\n ORDER BY\n block_id,\n id,\n sequence_no,\n secondary_sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS i\n LEFT JOIN account_identifiers AS ai ON i.receiver_id=ai.public_key_id\n LEFT JOIN accounts_created AS ac ON ai.id=ac.account_identifier_id\n AND i.block_id=ac.block_id\n AND i.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n i.receiver_id=ic2.receiver_id\n AND bic2.block_id=i.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n i.receiver_id=uc2.receiver_id\n AND buc2.block_id=i.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n i.block_id,\n i.id,\n i.sequence_no,\n i.secondary_sequence_no\n", "describe": { "columns": [ { @@ -151,5 +151,5 @@ false ] }, - "hash": "65341427fdf27bce4c2f9ec5e705c6fd923b63f11645d8ff7aa661fe3bd4c58e" + "hash": "6f86fc2bd2cbb81c658293aad73e5e14f238bb015839e33674b644d59e08ffa5" } diff --git a/.sqlx/query-42778b362d013cc8aee326e73238a90bdeaee91872de8c760c19d57e5e2ee477.json b/.sqlx/query-a010d9bea96554cb18027c6e284bce86040419ac6803886ebe42d672d36f6137.json similarity index 73% rename from .sqlx/query-42778b362d013cc8aee326e73238a90bdeaee91872de8c760c19d57e5e2ee477.json rename to .sqlx/query-a010d9bea96554cb18027c6e284bce86040419ac6803886ebe42d672d36f6137.json index 1c812d6..446ce4b 100644 --- a/.sqlx/query-42778b362d013cc8aee326e73238a90bdeaee91872de8c760c19d57e5e2ee477.json +++ b/.sqlx/query-a010d9bea96554cb18027c6e284bce86040419ac6803886ebe42d672d36f6137.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n zkapp_commands_info AS (\n SELECT\n zca.id,\n zca.memo,\n zca.hash,\n zca.fee_payer,\n pk_update_body.value AS pk_update_body,\n zca.fee,\n zca.valid_until,\n zca.nonce,\n zca.sequence_no,\n zca.status AS \"status: TransactionStatus\",\n zaub.balance_change,\n zca.block_id,\n b.state_hash,\n b.height,\n token_update_body.value AS token,\n ARRAY(\n SELECT\n unnest(zauf.failures)\n FROM\n zkapp_account_update_failures AS zauf\n WHERE\n zauf.id=ANY (zca.failure_reasons_ids)\n ) AS failure_reasons\n FROM\n zkapp_commands_aggregated AS zca\n INNER JOIN blocks AS b ON zca.block_id=b.id\n AND (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n LEFT JOIN zkapp_account_update AS zau ON zau.id=ANY (zca.zkapp_account_updates_ids)\n INNER JOIN zkapp_account_update_body AS zaub ON zau.body_id=zaub.id\n INNER JOIN account_identifiers AS ai_update_body ON zaub.account_identifier_id=ai_update_body.id\n INNER JOIN public_keys AS pk_update_body ON ai_update_body.public_key_id=pk_update_body.id\n INNER JOIN tokens AS token_update_body ON ai_update_body.token_id=token_update_body.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=zca.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n $3=zca.fee_payer\n AND $4=''\n )\n OR (\n $3=pk_update_body.value\n AND $4=token_update_body.value\n )\n )\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=zca.status\n OR $5 IS NULL\n )\n AND (\n $6=zca.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=zca.fee_payer\n OR $7=pk_update_body.value\n )\n OR $7 IS NULL\n )\n ),\n zkapp_commands_ids AS (\n SELECT DISTINCT\n id,\n block_id,\n sequence_no\n FROM\n zkapp_commands_info\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n zkapp_commands_ids\n )\nSELECT\n zc.*,\n id_count.total_count\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n zkapp_commands_ids\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS ids\n INNER JOIN zkapp_commands_info AS zc ON ids.id=zc.id\n AND ids.block_id=zc.block_id\n AND ids.sequence_no=zc.sequence_no\nORDER BY\n ids.block_id,\n ids.id,\n ids.sequence_no\n", + "query": "WITH\n zkapp_commands_info AS (\n SELECT\n zca.id,\n zca.memo,\n zca.hash,\n zca.fee_payer,\n pk_update_body.value AS pk_update_body,\n zca.fee,\n zca.valid_until,\n zca.nonce,\n zca.sequence_no,\n zca.status AS \"status: TransactionStatus\",\n zaub.balance_change,\n zca.block_id,\n b.state_hash,\n b.height,\n token_update_body.value AS token,\n ARRAY(\n SELECT\n unnest(zauf.failures)\n FROM\n zkapp_account_update_failures AS zauf\n WHERE\n zauf.id=ANY (zca.failure_reasons_ids)\n ) AS failure_reasons\n FROM\n zkapp_commands_aggregated AS zca\n INNER JOIN blocks AS b ON zca.block_id=b.id\n AND (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n LEFT JOIN zkapp_account_update AS zau ON zau.id=ANY (zca.zkapp_account_updates_ids)\n INNER JOIN zkapp_account_update_body AS zaub ON zau.body_id=zaub.id\n INNER JOIN account_identifiers AS ai_update_body ON zaub.account_identifier_id=ai_update_body.id\n INNER JOIN public_keys AS pk_update_body ON ai_update_body.public_key_id=pk_update_body.id\n INNER JOIN tokens AS token_update_body ON ai_update_body.token_id=token_update_body.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=zca.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n $4=token_update_body.value\n AND (\n $3=pk_update_body.value\n OR $3=zca.fee_payer\n )\n )\n AND $3 IS NOT NULL\n AND $4 IS NOT NULL\n )\n OR (\n (\n $3=zca.fee_payer\n OR $3=pk_update_body.value\n )\n AND $3 IS NOT NULL\n AND $4 IS NULL\n )\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=zca.status\n OR $5 IS NULL\n )\n AND (\n $6=zca.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=zca.fee_payer\n OR $7=pk_update_body.value\n )\n OR $7 IS NULL\n )\n ),\n zkapp_commands_ids AS (\n SELECT DISTINCT\n id,\n block_id,\n sequence_no\n FROM\n zkapp_commands_info\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n zkapp_commands_ids\n )\nSELECT\n zc.*,\n id_count.total_count\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n zkapp_commands_ids\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS ids\n INNER JOIN zkapp_commands_info AS zc ON ids.id=zc.id\n AND ids.block_id=zc.block_id\n AND ids.sequence_no=zc.sequence_no\nORDER BY\n ids.block_id,\n ids.id,\n ids.sequence_no,\n zc.balance_change\n", "describe": { "columns": [ { @@ -152,5 +152,5 @@ null ] }, - "hash": "42778b362d013cc8aee326e73238a90bdeaee91872de8c760c19d57e5e2ee477" + "hash": "a010d9bea96554cb18027c6e284bce86040419ac6803886ebe42d672d36f6137" } diff --git a/.sqlx/query-d93db1f20d1bba42aa81b0262b61265537ece2ae5d5278afa3e9027b2066aeb4.json b/.sqlx/query-a0f2e0b67d702a9e8b2b609f9a20d0c8a84527cc8cd3422733259f626966d791.json similarity index 73% rename from .sqlx/query-d93db1f20d1bba42aa81b0262b61265537ece2ae5d5278afa3e9027b2066aeb4.json rename to .sqlx/query-a0f2e0b67d702a9e8b2b609f9a20d0c8a84527cc8cd3422733259f626966d791.json index d9052f7..49c9c6d 100644 --- a/.sqlx/query-d93db1f20d1bba42aa81b0262b61265537ece2ae5d5278afa3e9027b2066aeb4.json +++ b/.sqlx/query-a0f2e0b67d702a9e8b2b609f9a20d0c8a84527cc8cd3422733259f626966d791.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n coinbase_receiver_info AS (\n SELECT\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no,\n coinbase_receiver_pk.value AS coinbase_receiver\n FROM\n blocks_internal_commands AS bic\n INNER JOIN internal_commands AS ic ON bic.internal_command_id=ic.id\n INNER JOIN blocks_internal_commands AS bic_coinbase_receiver ON bic.block_id=bic_coinbase_receiver.block_id\n AND (\n bic.internal_command_id<>bic_coinbase_receiver.internal_command_id\n OR bic.sequence_no<>bic_coinbase_receiver.sequence_no\n OR bic.secondary_sequence_no<>bic_coinbase_receiver.secondary_sequence_no\n )\n INNER JOIN internal_commands AS ic_coinbase_receiver ON ic.command_type='fee_transfer_via_coinbase'\n AND ic_coinbase_receiver.command_type='coinbase'\n AND bic_coinbase_receiver.internal_command_id=ic_coinbase_receiver.id\n INNER JOIN public_keys AS coinbase_receiver_pk ON ic_coinbase_receiver.receiver_id=coinbase_receiver_pk.id\n ),\n internal_commands_info AS (\n SELECT DISTINCT\n ON (\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no\n ) i.id,\n i.command_type AS \"command_type: InternalCommandType\",\n i.receiver_id,\n i.fee,\n i.hash,\n pk.value AS receiver,\n cri.coinbase_receiver AS \"coinbase_receiver?\",\n bic.sequence_no,\n bic.secondary_sequence_no,\n bic.block_id,\n bic.status AS \"status: TransactionStatus\",\n b.state_hash,\n b.height\n FROM\n internal_commands AS i\n INNER JOIN blocks_internal_commands AS bic ON i.id=bic.internal_command_id\n INNER JOIN public_keys AS pk ON i.receiver_id=pk.id\n INNER JOIN blocks AS b ON bic.block_id=b.id\n LEFT JOIN coinbase_receiver_info AS cri ON bic.block_id=cri.block_id\n AND bic.internal_command_id=cri.internal_command_id\n AND bic.sequence_no=cri.sequence_no\n AND bic.secondary_sequence_no=cri.secondary_sequence_no\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=i.hash\n OR $2 IS NULL\n )\n AND (\n (\n $3=pk.value\n OR $3=cri.coinbase_receiver\n )\n AND $4=''\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=bic.status\n OR $5 IS NULL\n )\n AND (\n $6=bic.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=pk.value\n OR $7=cri.coinbase_receiver\n )\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n internal_commands_info\n )\nSELECT\n i.*,\n id_count.total_count,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n internal_commands_info\n ORDER BY\n block_id,\n id,\n sequence_no,\n secondary_sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS i\n LEFT JOIN account_identifiers AS ai ON i.receiver_id=ai.public_key_id\n LEFT JOIN accounts_created AS ac ON ai.id=ac.account_identifier_id\n AND i.block_id=ac.block_id\n AND i.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n i.receiver_id=ic2.receiver_id\n AND bic2.block_id=i.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n i.receiver_id=uc2.receiver_id\n AND buc2.block_id=i.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n i.block_id,\n i.id,\n i.sequence_no,\n i.secondary_sequence_no\n", + "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n coinbase_receiver_info AS (\n SELECT\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no,\n coinbase_receiver_pk.value AS coinbase_receiver\n FROM\n blocks_internal_commands AS bic\n INNER JOIN internal_commands AS ic ON bic.internal_command_id=ic.id\n INNER JOIN blocks_internal_commands AS bic_coinbase_receiver ON bic.block_id=bic_coinbase_receiver.block_id\n AND (\n bic.internal_command_id<>bic_coinbase_receiver.internal_command_id\n OR bic.sequence_no<>bic_coinbase_receiver.sequence_no\n OR bic.secondary_sequence_no<>bic_coinbase_receiver.secondary_sequence_no\n )\n INNER JOIN internal_commands AS ic_coinbase_receiver ON ic.command_type='fee_transfer_via_coinbase'\n AND ic_coinbase_receiver.command_type='coinbase'\n AND bic_coinbase_receiver.internal_command_id=ic_coinbase_receiver.id\n INNER JOIN public_keys AS coinbase_receiver_pk ON ic_coinbase_receiver.receiver_id=coinbase_receiver_pk.id\n ),\n internal_commands_info AS (\n SELECT DISTINCT\n ON (\n bic.block_id,\n bic.internal_command_id,\n bic.sequence_no,\n bic.secondary_sequence_no\n ) i.id,\n i.command_type AS \"command_type: InternalCommandType\",\n i.receiver_id,\n i.fee,\n i.hash,\n pk.value AS receiver,\n cri.coinbase_receiver AS \"coinbase_receiver?\",\n bic.sequence_no,\n bic.secondary_sequence_no,\n bic.block_id,\n bic.status AS \"status: TransactionStatus\",\n b.state_hash,\n b.height\n FROM\n internal_commands AS i\n INNER JOIN blocks_internal_commands AS bic ON i.id=bic.internal_command_id\n INNER JOIN public_keys AS pk ON i.receiver_id=pk.id\n INNER JOIN blocks AS b ON bic.block_id=b.id\n LEFT JOIN coinbase_receiver_info AS cri ON bic.block_id=cri.block_id\n AND bic.internal_command_id=cri.internal_command_id\n AND bic.sequence_no=cri.sequence_no\n AND bic.secondary_sequence_no=cri.secondary_sequence_no\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=i.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n $3=pk.value\n OR $3=cri.coinbase_receiver\n )\n OR $3 IS NULL\n )\n )\n AND (\n $4=''\n OR $4 IS NULL\n )\n AND (\n $5=bic.status\n OR $5 IS NULL\n )\n AND (\n $6=bic.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=pk.value\n OR $7=cri.coinbase_receiver\n )\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n internal_commands_info\n )\nSELECT\n i.*,\n id_count.total_count,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n internal_commands_info\n ORDER BY\n block_id,\n id,\n sequence_no,\n secondary_sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS i\n LEFT JOIN account_identifiers AS ai ON i.receiver_id=ai.public_key_id\n LEFT JOIN accounts_created AS ac ON ai.id=ac.account_identifier_id\n AND i.block_id=ac.block_id\n AND i.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n i.receiver_id=ic2.receiver_id\n AND bic2.block_id=i.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n i.receiver_id=uc2.receiver_id\n AND buc2.block_id=i.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n i.block_id,\n i.id,\n i.sequence_no,\n i.secondary_sequence_no\n", "describe": { "columns": [ { @@ -151,5 +151,5 @@ false ] }, - "hash": "d93db1f20d1bba42aa81b0262b61265537ece2ae5d5278afa3e9027b2066aeb4" + "hash": "a0f2e0b67d702a9e8b2b609f9a20d0c8a84527cc8cd3422733259f626966d791" } diff --git a/.sqlx/query-411a992540d9c8a1eaa3461adc67005bb4515d21a064c1ad13ab9746e23763da.json b/.sqlx/query-a70a673e1e6cd9d6f1814a386007cbff5254627d58df0e00e72d32ef0fb35b8e.json similarity index 75% rename from .sqlx/query-411a992540d9c8a1eaa3461adc67005bb4515d21a064c1ad13ab9746e23763da.json rename to .sqlx/query-a70a673e1e6cd9d6f1814a386007cbff5254627d58df0e00e72d32ef0fb35b8e.json index 8bf03bd..876fdfe 100644 --- a/.sqlx/query-411a992540d9c8a1eaa3461adc67005bb4515d21a064c1ad13ab9746e23763da.json +++ b/.sqlx/query-a70a673e1e6cd9d6f1814a386007cbff5254627d58df0e00e72d32ef0fb35b8e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n zkapp_commands_info AS (\n SELECT\n zc.id,\n zc.memo,\n zc.hash,\n pk_fee_payer.value AS fee_payer,\n pk_update_body.value AS pk_update_body,\n zfpb.fee,\n zfpb.valid_until,\n zfpb.nonce,\n bzc.sequence_no,\n bzc.status AS \"status: TransactionStatus\",\n zaub.balance_change,\n bzc.block_id,\n b.state_hash,\n b.height,\n token_update_body.value AS token,\n ARRAY(\n SELECT\n unnest(zauf.failures)\n FROM\n zkapp_account_update_failures AS zauf\n WHERE\n zauf.id=ANY (bzc.failure_reasons_ids)\n ) AS failure_reasons\n FROM\n zkapp_commands AS zc\n INNER JOIN blocks_zkapp_commands AS bzc ON zc.id=bzc.zkapp_command_id\n INNER JOIN zkapp_fee_payer_body AS zfpb ON zc.zkapp_fee_payer_body_id=zfpb.id\n INNER JOIN public_keys AS pk_fee_payer ON zfpb.public_key_id=pk_fee_payer.id\n INNER JOIN blocks AS b ON bzc.block_id=b.id\n LEFT JOIN zkapp_account_update AS zau ON zau.id=ANY (zc.zkapp_account_updates_ids)\n INNER JOIN zkapp_account_update_body AS zaub ON zau.body_id=zaub.id\n INNER JOIN account_identifiers AS ai_update_body ON zaub.account_identifier_id=ai_update_body.id\n INNER JOIN public_keys AS pk_update_body ON ai_update_body.public_key_id=pk_update_body.id\n INNER JOIN tokens AS token_update_body ON ai_update_body.token_id=token_update_body.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=zc.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n $3=pk_fee_payer.value\n AND $4=''\n )\n OR (\n $3=pk_update_body.value\n AND $4=token_update_body.value\n )\n )\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=bzc.status\n OR $5 IS NULL\n )\n AND (\n $6=bzc.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=pk_fee_payer.value\n OR $7=pk_update_body.value\n )\n OR $7 IS NULL\n )\n ),\n zkapp_commands_ids AS (\n SELECT DISTINCT\n id,\n block_id,\n sequence_no\n FROM\n zkapp_commands_info\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n zkapp_commands_ids\n )\nSELECT\n zc.*,\n id_count.total_count\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n zkapp_commands_ids\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS ids\n INNER JOIN zkapp_commands_info AS zc ON ids.id=zc.id\n AND ids.block_id=zc.block_id\n AND ids.sequence_no=zc.sequence_no\nORDER BY\n ids.block_id,\n ids.id,\n ids.sequence_no\n", + "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n zkapp_commands_info AS (\n SELECT\n zc.id,\n zc.memo,\n zc.hash,\n pk_fee_payer.value AS fee_payer,\n pk_update_body.value AS pk_update_body,\n zfpb.fee,\n zfpb.valid_until,\n zfpb.nonce,\n bzc.sequence_no,\n bzc.status AS \"status: TransactionStatus\",\n zaub.balance_change,\n bzc.block_id,\n b.state_hash,\n b.height,\n token_update_body.value AS token,\n ARRAY(\n SELECT\n unnest(zauf.failures)\n FROM\n zkapp_account_update_failures AS zauf\n WHERE\n zauf.id=ANY (bzc.failure_reasons_ids)\n ) AS failure_reasons\n FROM\n zkapp_commands AS zc\n INNER JOIN blocks_zkapp_commands AS bzc ON zc.id=bzc.zkapp_command_id\n INNER JOIN zkapp_fee_payer_body AS zfpb ON zc.zkapp_fee_payer_body_id=zfpb.id\n INNER JOIN public_keys AS pk_fee_payer ON zfpb.public_key_id=pk_fee_payer.id\n INNER JOIN blocks AS b ON bzc.block_id=b.id\n LEFT JOIN zkapp_account_update AS zau ON zau.id=ANY (zc.zkapp_account_updates_ids)\n INNER JOIN zkapp_account_update_body AS zaub ON zau.body_id=zaub.id\n INNER JOIN account_identifiers AS ai_update_body ON zaub.account_identifier_id=ai_update_body.id\n INNER JOIN public_keys AS pk_update_body ON ai_update_body.public_key_id=pk_update_body.id\n INNER JOIN tokens AS token_update_body ON ai_update_body.token_id=token_update_body.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=zc.hash\n OR $2 IS NULL\n )\n AND (\n (\n (\n (\n $4=token_update_body.value\n AND (\n $3=pk_update_body.value\n OR $3=pk_fee_payer.value\n )\n )\n )\n AND $3 IS NOT NULL\n AND $4 IS NOT NULL\n )\n OR (\n (\n $3=pk_fee_payer.value\n OR $3=pk_update_body.value\n )\n AND $3 IS NOT NULL\n AND $4 IS NULL\n )\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=bzc.status\n OR $5 IS NULL\n )\n AND (\n $6=bzc.status\n OR $6 IS NULL\n )\n AND (\n (\n $7=pk_fee_payer.value\n OR $7=pk_update_body.value\n )\n OR $7 IS NULL\n )\n ),\n zkapp_commands_ids AS (\n SELECT DISTINCT\n id,\n block_id,\n sequence_no\n FROM\n zkapp_commands_info\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n zkapp_commands_ids\n )\nSELECT\n zc.*,\n id_count.total_count\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n zkapp_commands_ids\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS ids\n INNER JOIN zkapp_commands_info AS zc ON ids.id=zc.id\n AND ids.block_id=zc.block_id\n AND ids.sequence_no=zc.sequence_no\nORDER BY\n ids.block_id,\n ids.id,\n ids.sequence_no,\n zc.balance_change\n", "describe": { "columns": [ { @@ -152,5 +152,5 @@ null ] }, - "hash": "411a992540d9c8a1eaa3461adc67005bb4515d21a064c1ad13ab9746e23763da" + "hash": "a70a673e1e6cd9d6f1814a386007cbff5254627d58df0e00e72d32ef0fb35b8e" } diff --git a/.sqlx/query-32fb4070f630d7d577d972a59c44a13c3924c0e6d1cf502cdb368140b5a94b39.json b/.sqlx/query-d51a4688ddcf1114e8d17384444a441e26c3d930957684466f24c34c48cca8c8.json similarity index 70% rename from .sqlx/query-32fb4070f630d7d577d972a59c44a13c3924c0e6d1cf502cdb368140b5a94b39.json rename to .sqlx/query-d51a4688ddcf1114e8d17384444a441e26c3d930957684466f24c34c48cca8c8.json index 129bf6e..0b2813a 100644 --- a/.sqlx/query-32fb4070f630d7d577d972a59c44a13c3924c0e6d1cf502cdb368140b5a94b39.json +++ b/.sqlx/query-d51a4688ddcf1114e8d17384444a441e26c3d930957684466f24c34c48cca8c8.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n user_command_info AS (\n SELECT DISTINCT\n ON (\n buc.block_id,\n buc.user_command_id,\n buc.sequence_no\n ) u.id,\n u.command_type AS \"command_type: UserCommandType\",\n u.fee_payer_id,\n u.source_id,\n u.receiver_id,\n u.nonce,\n u.amount,\n u.fee,\n u.valid_until,\n u.memo,\n u.hash,\n buc.block_id,\n buc.sequence_no,\n buc.status AS \"status: TransactionStatus\",\n buc.failure_reason,\n b.state_hash,\n b.chain_status AS \"chain_status: ChainStatus\",\n b.height\n FROM\n user_commands AS u\n INNER JOIN blocks_user_commands AS buc ON u.id=buc.user_command_id\n INNER JOIN public_keys AS pk ON u.fee_payer_id=pk.id\n OR (\n buc.status='applied'\n AND (\n u.source_id=pk.id\n OR u.receiver_id=pk.id\n )\n )\n INNER JOIN blocks AS b ON buc.block_id=b.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=u.hash\n OR $2 IS NULL\n )\n AND (\n $3=pk.value\n AND $4=''\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=buc.status\n OR $5 IS NULL\n )\n AND (\n $6=buc.status\n OR $6 IS NULL\n )\n AND (\n $7=pk.value\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n user_command_info\n )\nSELECT\n u.*,\n id_count.total_count,\n pk_payer.value AS fee_payer,\n pk_source.value AS source,\n pk_receiver.value AS receiver,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n user_command_info\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS u\n INNER JOIN public_keys AS pk_payer ON u.fee_payer_id=pk_payer.id\n INNER JOIN public_keys AS pk_source ON u.source_id=pk_source.id\n INNER JOIN public_keys AS pk_receiver ON u.receiver_id=pk_receiver.id\n /* Account creation fees are attributed to the first successful command in the\n block that mentions the account with the following LEFT JOINs */\n LEFT JOIN account_identifiers AS ai_receiver ON u.receiver_id=ai_receiver.public_key_id\n LEFT JOIN accounts_created AS ac ON u.block_id=ac.block_id\n AND ai_receiver.id=ac.account_identifier_id\n AND u.\"status: TransactionStatus\"='applied'\n AND u.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n u.receiver_id=ic2.receiver_id\n AND bic2.block_id=u.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n u.receiver_id=uc2.receiver_id\n AND buc2.block_id=u.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n u.block_id,\n u.id,\n u.sequence_no\n", + "query": "WITH\n canonical_blocks AS (\n SELECT\n *\n FROM\n blocks\n WHERE\n chain_status='canonical'\n ),\n max_canonical_height AS (\n SELECT\n max(HEIGHT) AS max_height\n FROM\n canonical_blocks\n ),\n pending_blocks AS (\n SELECT\n b.*\n FROM\n blocks AS b,\n max_canonical_height AS m\n WHERE\n b.height>m.max_height\n AND b.chain_status='pending'\n ),\n blocks AS (\n SELECT\n *\n FROM\n canonical_blocks\n UNION ALL\n SELECT\n *\n FROM\n pending_blocks\n ),\n user_command_info AS (\n SELECT DISTINCT\n ON (\n buc.block_id,\n buc.user_command_id,\n buc.sequence_no\n ) u.id,\n u.command_type AS \"command_type: UserCommandType\",\n u.fee_payer_id,\n u.source_id,\n u.receiver_id,\n u.nonce,\n u.amount,\n u.fee,\n u.valid_until,\n u.memo,\n u.hash,\n buc.block_id,\n buc.sequence_no,\n buc.status AS \"status: TransactionStatus\",\n buc.failure_reason,\n b.state_hash,\n b.chain_status AS \"chain_status: ChainStatus\",\n b.height\n FROM\n user_commands AS u\n INNER JOIN blocks_user_commands AS buc ON u.id=buc.user_command_id\n INNER JOIN public_keys AS pk ON u.fee_payer_id=pk.id\n OR (\n buc.status='applied'\n AND (\n u.source_id=pk.id\n OR u.receiver_id=pk.id\n )\n )\n INNER JOIN blocks AS b ON buc.block_id=b.id\n WHERE\n (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=u.hash\n OR $2 IS NULL\n )\n AND (\n $3=pk.value\n OR $3 IS NULL\n )\n AND (\n $4=''\n OR $4 IS NULL\n )\n AND (\n $5=buc.status\n OR $5 IS NULL\n )\n AND (\n $6=buc.status\n OR $6 IS NULL\n )\n AND (\n $7=pk.value\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n user_command_info\n )\nSELECT\n u.*,\n id_count.total_count,\n pk_payer.value AS fee_payer,\n pk_source.value AS source,\n pk_receiver.value AS receiver,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n user_command_info\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS u\n INNER JOIN public_keys AS pk_payer ON u.fee_payer_id=pk_payer.id\n INNER JOIN public_keys AS pk_source ON u.source_id=pk_source.id\n INNER JOIN public_keys AS pk_receiver ON u.receiver_id=pk_receiver.id\n /* Account creation fees are attributed to the first successful command in the\n block that mentions the account with the following LEFT JOINs */\n LEFT JOIN account_identifiers AS ai_receiver ON u.receiver_id=ai_receiver.public_key_id\n LEFT JOIN accounts_created AS ac ON u.block_id=ac.block_id\n AND ai_receiver.id=ac.account_identifier_id\n AND u.\"status: TransactionStatus\"='applied'\n AND u.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n u.receiver_id=ic2.receiver_id\n AND bic2.block_id=u.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n u.receiver_id=uc2.receiver_id\n AND buc2.block_id=u.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n u.block_id,\n u.id,\n u.sequence_no\n", "describe": { "columns": [ { @@ -209,5 +209,5 @@ false ] }, - "hash": "32fb4070f630d7d577d972a59c44a13c3924c0e6d1cf502cdb368140b5a94b39" + "hash": "d51a4688ddcf1114e8d17384444a441e26c3d930957684466f24c34c48cca8c8" } diff --git a/.sqlx/query-391efd59ae4d18800d3ed5e1850083a8b5aa335fbb27bd607e546e44e9544e92.json b/.sqlx/query-e1119d4ab6f8d5163ba39c3076791603c5e4e2df5f71c3e85537cf2f90069d4d.json similarity index 68% rename from .sqlx/query-391efd59ae4d18800d3ed5e1850083a8b5aa335fbb27bd607e546e44e9544e92.json rename to .sqlx/query-e1119d4ab6f8d5163ba39c3076791603c5e4e2df5f71c3e85537cf2f90069d4d.json index a884970..13d452d 100644 --- a/.sqlx/query-391efd59ae4d18800d3ed5e1850083a8b5aa335fbb27bd607e546e44e9544e92.json +++ b/.sqlx/query-e1119d4ab6f8d5163ba39c3076791603c5e4e2df5f71c3e85537cf2f90069d4d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "WITH\n user_command_info AS (\n SELECT DISTINCT\n ON (uca.block_id, uca.id, uca.sequence_no) uca.id,\n uca.command_type AS \"command_type: UserCommandType\",\n uca.fee_payer_id,\n uca.source_id,\n uca.receiver_id,\n uca.nonce,\n uca.amount,\n uca.fee,\n uca.valid_until,\n uca.memo,\n uca.hash,\n uca.block_id,\n uca.sequence_no,\n uca.status AS \"status: TransactionStatus\",\n uca.failure_reason,\n b.state_hash,\n b.chain_status AS \"chain_status: ChainStatus\",\n b.height\n FROM\n user_commands_aggregated AS uca\n INNER JOIN public_keys AS pk ON uca.fee_payer_id=pk.id\n OR (\n uca.status='applied'\n AND (\n uca.source_id=pk.id\n OR uca.receiver_id=pk.id\n )\n )\n INNER JOIN blocks AS b ON uca.block_id=b.id\n WHERE\n (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n AND (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=uca.hash\n OR $2 IS NULL\n )\n AND (\n $3=pk.value\n AND $4=''\n OR (\n $3 IS NULL\n AND $4 IS NULL\n )\n )\n AND (\n $5=uca.status\n OR $5 IS NULL\n )\n AND (\n $6=uca.status\n OR $6 IS NULL\n )\n AND (\n $7=pk.value\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n user_command_info\n )\nSELECT\n u.*,\n id_count.total_count,\n pk_payer.value AS fee_payer,\n pk_source.value AS source,\n pk_receiver.value AS receiver,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n user_command_info\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS u\n INNER JOIN public_keys AS pk_payer ON u.fee_payer_id=pk_payer.id\n INNER JOIN public_keys AS pk_source ON u.source_id=pk_source.id\n INNER JOIN public_keys AS pk_receiver ON u.receiver_id=pk_receiver.id\n /* Account creation fees are attributed to the first successful command in the\n block that mentions the account with the following LEFT JOINs */\n LEFT JOIN account_identifiers AS ai_receiver ON u.receiver_id=ai_receiver.public_key_id\n LEFT JOIN accounts_created AS ac ON u.block_id=ac.block_id\n AND ai_receiver.id=ac.account_identifier_id\n AND u.\"status: TransactionStatus\"='applied'\n AND u.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n u.receiver_id=ic2.receiver_id\n AND bic2.block_id=u.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n u.receiver_id=uc2.receiver_id\n AND buc2.block_id=u.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n u.block_id,\n u.id,\n u.sequence_no\n", + "query": "WITH\n user_command_info AS (\n SELECT DISTINCT\n ON (uca.block_id, uca.id, uca.sequence_no) uca.id,\n uca.command_type AS \"command_type: UserCommandType\",\n uca.fee_payer_id,\n uca.source_id,\n uca.receiver_id,\n uca.nonce,\n uca.amount,\n uca.fee,\n uca.valid_until,\n uca.memo,\n uca.hash,\n uca.block_id,\n uca.sequence_no,\n uca.status AS \"status: TransactionStatus\",\n uca.failure_reason,\n b.state_hash,\n b.chain_status AS \"chain_status: ChainStatus\",\n b.height\n FROM\n user_commands_aggregated AS uca\n INNER JOIN public_keys AS pk ON uca.fee_payer_id=pk.id\n OR (\n uca.status='applied'\n AND (\n uca.source_id=pk.id\n OR uca.receiver_id=pk.id\n )\n )\n INNER JOIN blocks AS b ON uca.block_id=b.id\n WHERE\n (\n b.chain_status='canonical'\n OR b.chain_status='pending'\n )\n AND (\n $1>=b.height\n OR $1 IS NULL\n )\n AND (\n $2=uca.hash\n OR $2 IS NULL\n )\n AND (\n $3=pk.value\n OR $3 IS NULL\n )\n AND (\n $4=''\n OR $4 IS NULL\n )\n AND (\n $5=uca.status\n OR $5 IS NULL\n )\n AND (\n $6=uca.status\n OR $6 IS NULL\n )\n AND (\n $7=pk.value\n OR $7 IS NULL\n )\n ),\n id_count AS (\n SELECT\n count(*) AS total_count\n FROM\n user_command_info\n )\nSELECT\n u.*,\n id_count.total_count,\n pk_payer.value AS fee_payer,\n pk_source.value AS source,\n pk_receiver.value AS receiver,\n ac.creation_fee AS \"creation_fee?\"\nFROM\n id_count,\n (\n SELECT\n *\n FROM\n user_command_info\n ORDER BY\n block_id,\n id,\n sequence_no\n LIMIT\n $8\n OFFSET\n $9\n ) AS u\n INNER JOIN public_keys AS pk_payer ON u.fee_payer_id=pk_payer.id\n INNER JOIN public_keys AS pk_source ON u.source_id=pk_source.id\n INNER JOIN public_keys AS pk_receiver ON u.receiver_id=pk_receiver.id\n /* Account creation fees are attributed to the first successful command in the\n block that mentions the account with the following LEFT JOINs */\n LEFT JOIN account_identifiers AS ai_receiver ON u.receiver_id=ai_receiver.public_key_id\n LEFT JOIN accounts_created AS ac ON u.block_id=ac.block_id\n AND ai_receiver.id=ac.account_identifier_id\n AND u.\"status: TransactionStatus\"='applied'\n AND u.sequence_no=(\n SELECT\n least(\n (\n SELECT\n min(bic2.sequence_no)\n FROM\n blocks_internal_commands AS bic2\n INNER JOIN internal_commands AS ic2 ON bic2.internal_command_id=ic2.id\n WHERE\n u.receiver_id=ic2.receiver_id\n AND bic2.block_id=u.block_id\n AND bic2.status='applied'\n ),\n (\n SELECT\n min(buc2.sequence_no)\n FROM\n blocks_user_commands AS buc2\n INNER JOIN user_commands AS uc2 ON buc2.user_command_id=uc2.id\n WHERE\n u.receiver_id=uc2.receiver_id\n AND buc2.block_id=u.block_id\n AND buc2.status='applied'\n )\n )\n )\nORDER BY\n u.block_id,\n u.id,\n u.sequence_no\n", "describe": { "columns": [ { @@ -209,5 +209,5 @@ false ] }, - "hash": "391efd59ae4d18800d3ed5e1850083a8b5aa335fbb27bd607e546e44e9544e92" + "hash": "e1119d4ab6f8d5163ba39c3076791603c5e4e2df5f71c3e85537cf2f90069d4d" } diff --git a/sql/queries/indexer_internal_commands.sql b/sql/queries/indexer_internal_commands.sql index 6356e06..c23e0dd 100644 --- a/sql/queries/indexer_internal_commands.sql +++ b/sql/queries/indexer_internal_commands.sql @@ -95,15 +95,17 @@ WITH ) AND ( ( - $3=pk.value - OR $3=cri.coinbase_receiver - ) - AND $4='' - OR ( - $3 IS NULL - AND $4 IS NULL + ( + $3=pk.value + OR $3=cri.coinbase_receiver + ) + OR $3 IS NULL ) ) + AND ( + $4='' + OR $4 IS NULL + ) AND ( $5=bic.status OR $5 IS NULL diff --git a/sql/queries/indexer_internal_commands_optimized.sql b/sql/queries/indexer_internal_commands_optimized.sql index 3057f0a..5ef4cd5 100644 --- a/sql/queries/indexer_internal_commands_optimized.sql +++ b/sql/queries/indexer_internal_commands_optimized.sql @@ -62,15 +62,17 @@ WITH ) AND ( ( - $3=ica.receiver - OR $3=cri.coinbase_receiver - ) - AND $4='' - OR ( - $3 IS NULL - AND $4 IS NULL + ( + $3=ica.receiver + OR $3=cri.coinbase_receiver + ) + OR $3 IS NULL ) ) + AND ( + $4='' + OR $4 IS NULL + ) AND ( $5=ica.status OR $5 IS NULL diff --git a/sql/queries/indexer_user_commands.sql b/sql/queries/indexer_user_commands.sql index e5bbfd4..ec21ac4 100644 --- a/sql/queries/indexer_user_commands.sql +++ b/sql/queries/indexer_user_commands.sql @@ -81,11 +81,11 @@ WITH ) AND ( $3=pk.value - AND $4='' - OR ( - $3 IS NULL - AND $4 IS NULL - ) + OR $3 IS NULL + ) + AND ( + $4='' + OR $4 IS NULL ) AND ( $5=buc.status diff --git a/sql/queries/indexer_user_commands_optimized.sql b/sql/queries/indexer_user_commands_optimized.sql index e2b3764..49578ef 100644 --- a/sql/queries/indexer_user_commands_optimized.sql +++ b/sql/queries/indexer_user_commands_optimized.sql @@ -45,11 +45,11 @@ WITH ) AND ( $3=pk.value - AND $4='' - OR ( - $3 IS NULL - AND $4 IS NULL - ) + OR $3 IS NULL + ) + AND ( + $4='' + OR $4 IS NULL ) AND ( $5=uca.status diff --git a/sql/queries/indexer_zkapp_commands.sql b/sql/queries/indexer_zkapp_commands.sql index 05f89e8..6f04ba9 100644 --- a/sql/queries/indexer_zkapp_commands.sql +++ b/sql/queries/indexer_zkapp_commands.sql @@ -82,13 +82,24 @@ WITH AND ( ( ( - $3=pk_fee_payer.value - AND $4='' + ( + $4=token_update_body.value + AND ( + $3=pk_update_body.value + OR $3=pk_fee_payer.value + ) + ) ) - OR ( - $3=pk_update_body.value - AND $4=token_update_body.value + AND $3 IS NOT NULL + AND $4 IS NOT NULL + ) + OR ( + ( + $3=pk_fee_payer.value + OR $3=pk_update_body.value ) + AND $3 IS NOT NULL + AND $4 IS NULL ) OR ( $3 IS NULL @@ -150,4 +161,5 @@ FROM ORDER BY ids.block_id, ids.id, - ids.sequence_no + ids.sequence_no, + zc.balance_change diff --git a/sql/queries/indexer_zkapp_commands_optimized.sql b/sql/queries/indexer_zkapp_commands_optimized.sql index 6aa7b42..d107010 100644 --- a/sql/queries/indexer_zkapp_commands_optimized.sql +++ b/sql/queries/indexer_zkapp_commands_optimized.sql @@ -48,13 +48,22 @@ WITH AND ( ( ( - $3=zca.fee_payer - AND $4='' + $4=token_update_body.value + AND ( + $3=pk_update_body.value + OR $3=zca.fee_payer + ) ) - OR ( - $3=pk_update_body.value - AND $4=token_update_body.value + AND $3 IS NOT NULL + AND $4 IS NOT NULL + ) + OR ( + ( + $3=zca.fee_payer + OR $3=pk_update_body.value ) + AND $3 IS NOT NULL + AND $4 IS NULL ) OR ( $3 IS NULL @@ -116,4 +125,5 @@ FROM ORDER BY ids.block_id, ids.id, - ids.sequence_no + ids.sequence_no, + zc.balance_change diff --git a/src/api/block.rs b/src/api/block.rs index e0e7047..439da0c 100644 --- a/src/api/block.rs +++ b/src/api/block.rs @@ -221,6 +221,7 @@ fn user_command_metadata_to_operations(metadata: &UserCommandMetadata) -> Vec Vec Vec { @@ -257,6 +260,7 @@ fn user_command_metadata_to_operations(metadata: &UserCommandMetadata) -> Vec Vec None, None, None, + None, )); } match metadata.command_type { @@ -298,6 +304,7 @@ fn internal_command_metadata_to_operation(metadata: &InternalCommandMetadata) -> None, None, None, + None, )); } InternalCommandType::FeeTransfer => { @@ -309,6 +316,7 @@ fn internal_command_metadata_to_operation(metadata: &InternalCommandMetadata) -> None, None, None, + None, )); } InternalCommandType::FeeTransferViaCoinbase => { @@ -321,6 +329,7 @@ fn internal_command_metadata_to_operation(metadata: &InternalCommandMetadata) -> None, None, None, + None, )); operations.push(operation( 3, @@ -330,6 +339,7 @@ fn internal_command_metadata_to_operation(metadata: &InternalCommandMetadata) -> None, None, None, + None, )); } else { return Err(MinaMeshError::InvariantViolation); diff --git a/src/api/search_transactions.rs b/src/api/search_transactions.rs index e8b5eec..644ca9f 100644 --- a/src/api/search_transactions.rs +++ b/src/api/search_transactions.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, HashMap}; +use std::collections::BTreeMap; use coinbase_mesh::models::{ AccountIdentifier, BlockIdentifier, BlockTransaction, Operation, SearchTransactionsRequest, @@ -42,6 +42,7 @@ impl MinaMesh { let internal_commands_total_count = internal_commands.first().and_then(|ic| ic.total_count).unwrap_or(0); transactions.extend(internal_commands.into_iter().map(|uc| uc.into())); txs_len += internal_commands_len; + total_count += internal_commands_total_count; } else { // otherwise only fetch the first internal command to get the total count @@ -218,7 +219,7 @@ impl MinaMesh { } pub fn zkapp_commands_to_block_transactions(commands: Vec) -> Vec { - let mut block_map: HashMap<(i64, String), BTreeMap>> = HashMap::new(); + let mut block_map: BTreeMap<(i64, String), BTreeMap>> = BTreeMap::new(); for command in commands { // Group by block identifier (block index and block hash) @@ -242,6 +243,7 @@ pub fn zkapp_commands_to_block_transactions(commands: Vec) -> Vec< Some(&TransactionStatus::Applied), None, None, + None, )); } @@ -251,13 +253,14 @@ pub fn zkapp_commands_to_block_transactions(commands: Vec) -> Vec< Some(&command.balance_change), &AccountIdentifier { address: command.pk_update_body.clone(), - metadata: Some(json!({ "token_id": DEFAULT_TOKEN_ID })), + metadata: Some(json!({ "token_id": command.token })), sub_account: None, }, OperationType::ZkappBalanceUpdate, Some(&command.status), None, None, + command.token.as_ref(), )); } @@ -338,6 +341,7 @@ impl From for BlockTransaction { Some(status), None, None, + None, )); operation_index += 1; } @@ -352,6 +356,7 @@ impl From for BlockTransaction { Some(status), None, None, + None, )); } @@ -364,6 +369,7 @@ impl From for BlockTransaction { Some(status), None, None, + None, )); } @@ -377,6 +383,7 @@ impl From for BlockTransaction { Some(status), None, None, + None, )); operation_index += 1; @@ -388,6 +395,7 @@ impl From for BlockTransaction { Some(status), Some(vec![operation_index - 1]), None, + None, )); } } @@ -497,6 +505,7 @@ impl From for BlockTransaction { Some(&TransactionStatus::Applied), None, operations_metadata_value.as_ref(), + None, )); operation_index += 1; @@ -511,6 +520,7 @@ impl From for BlockTransaction { Some(&user_command.status), None, operations_metadata_value.as_ref(), + None, )); operation_index += 1; @@ -528,6 +538,7 @@ impl From for BlockTransaction { Some(&user_command.status), None, operations_metadata_value.as_ref(), + None, )); operation_index += 1; @@ -541,6 +552,7 @@ impl From for BlockTransaction { Some(&user_command.status), Some(vec![operation_index - 1]), operations_metadata_value.as_ref(), + None, )); } @@ -554,6 +566,7 @@ impl From for BlockTransaction { Some(&user_command.status), None, Some(&json!({ "delegate_change_target": user_command.receiver })), + None, )); } } @@ -580,13 +593,29 @@ pub struct SearchTransactionsQueryParams { pub address: Option, } +impl std::fmt::Display for SearchTransactionsQueryParams { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "max_block: {:?}, transaction_hash: {:?}, account_identifier: {:?}, token_id: {:?}, status: {:?}, success_status: {:?}, address: {:?}", + self.max_block, self.transaction_hash, self.account_identifier, self.token_id, self.status, self.success_status, self.address + ) + } +} + impl TryFrom for SearchTransactionsQueryParams { type Error = MinaMeshError; fn try_from(req: SearchTransactionsRequest) -> Result { let max_block = req.max_block; let transaction_hash = req.transaction_identifier.map(|t| t.hash); - let token_id = req.account_identifier.as_ref().and_then(|a| a.metadata.as_ref().map(|meta| meta.to_string())); + // token_id can be found in the metadata of the account_identifier + let token_id = req + .account_identifier + .as_ref() + .and_then(|a| a.metadata.as_ref()) + .and_then(|m| m.get("token_id")) + .map(|t| t.as_str().unwrap().to_string()); let account_identifier = req.account_identifier.map(|a| a.address); let status = match req.status.as_deref() { @@ -608,8 +637,7 @@ impl TryFrom for SearchTransactionsQueryParams { }; let address = req.address; - - Ok(SearchTransactionsQueryParams { + let st = SearchTransactionsQueryParams { max_block, transaction_hash, account_identifier, @@ -617,7 +645,8 @@ impl TryFrom for SearchTransactionsQueryParams { status, success_status, address, - }) + }; + Ok(st) } } diff --git a/src/operation.rs b/src/operation.rs index cbcf625..90d6bad 100644 --- a/src/operation.rs +++ b/src/operation.rs @@ -1,8 +1,10 @@ use coinbase_mesh::models::{AccountIdentifier, Amount, Currency, Operation, OperationIdentifier}; use convert_case::{Case, Casing}; +use serde_json::json; -use crate::{OperationStatus, OperationType, TransactionStatus}; +use crate::{util::DEFAULT_TOKEN_ID, OperationStatus, OperationType, TransactionStatus}; +#[allow(clippy::too_many_arguments)] pub fn operation( ident: i64, amount: Option<&String>, @@ -11,10 +13,23 @@ pub fn operation( status: Option<&TransactionStatus>, related_operations: Option>, metadata: Option<&serde_json::Value>, + token: Option<&String>, ) -> Operation { + // if token is provided and different from DEFAULT_TOKEN_ID, then create a new + // currency with the token else create a new currency with "MINA" + let currency = token + .map(|token_id| { + if token_id != DEFAULT_TOKEN_ID { + Currency { symbol: "MINA+".to_owned(), decimals: 9, metadata: Some(json!({ "token_id": token_id })) } + } else { + Currency::new("MINA".to_owned(), 9) + } + }) + .unwrap_or(Currency::new("MINA".to_owned(), 9)); + Operation { operation_identifier: Box::new(OperationIdentifier::new(ident)), - amount: amount.map(|value| Box::new(Amount::new(value.to_owned(), Currency::new("MINA".to_string(), 9)))), + amount: amount.map(|value| Box::new(Amount::new(value.to_owned(), currency))), account: Some(Box::new(account.to_owned())), status: Some( status.map(|item| OperationStatus::from(item.to_owned())).unwrap_or(OperationStatus::Success).to_string(), diff --git a/src/sql_to_mesh.rs b/src/sql_to_mesh.rs index 38c412f..d970390 100644 --- a/src/sql_to_mesh.rs +++ b/src/sql_to_mesh.rs @@ -28,6 +28,7 @@ pub fn zkapp_commands_to_transactions(commands: Vec) -> Vec) -> Vec Result<()> { let mina_mesh = MinaMeshConfig::from_env().to_mina_mesh().await?; + // cspell:disable-next-line + let address = "B62qkd6yYALkQMq2SFd5B57bJbGBMA2QuGtLPMzRhhnvexRtVRycZWP"; - let request = SearchTransactionsRequest { - network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "mainnet".to_string())), - // cspell:disable-next-line - address: Some("B62qkd6yYALkQMq2SFd5B57bJbGBMA2QuGtLPMzRhhnvexRtVRycZWP".to_string()), + let request_addr = SearchTransactionsRequest { + network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "testnet".to_string())), + address: Some(address.to_string()), limit: Some(5), offset: Some(0), ..Default::default() }; - let response = mina_mesh.search_transactions(request).await; + let response_addr = mina_mesh.search_transactions(request_addr).await; - assert!(response.is_ok()); - assert_debug_snapshot!(response); + let request_acct_id = SearchTransactionsRequest { + network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "testnet".to_string())), + account_identifier: Some(Box::new(AccountIdentifier::new(address.to_string()))), + limit: Some(5), + offset: Some(0), + ..Default::default() + }; + + let response_acct_id = mina_mesh.search_transactions(request_acct_id).await; + + assert_eq!(response_addr, response_acct_id); + assert!(response_addr.is_ok()); + assert_debug_snapshot!(response_addr); Ok(()) } @@ -107,3 +119,66 @@ async fn search_transactions_zkapp_failed() -> Result<()> { assert_debug_snapshot!(response); Ok(()) } + +#[tokio::test] +async fn search_transactions_zkapp_tokens_account_identifier() -> Result<()> { + let mina_mesh = MinaMeshConfig::from_env().to_mina_mesh().await?; + let max_block = 319857; + // cspell:disable + let token_id = "xBxjFpJkbWpbGua7Lf36S1NLhffFoEChyP3pz6SYKnx7dFCTwg"; + let address1 = "B62qituGxc1ZNbWfz4SnftNUaJ78YYYsmuuuJr1FFHjbRqLir7tvBew"; + let address2 = "B62qjwDWxjf4LtJ4YWJQDdTNPqZ69ZyeCzbpAFKN7EoZzYig5ZRz8JE"; + // cspell:enable + let metadata = serde_json::json!({ "token_id": token_id }); + + let request_address1_token = SearchTransactionsRequest { + network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "testnet".to_string())), + max_block: Some(max_block), + account_identifier: Some(Box::new(AccountIdentifier { + address: address1.to_string(), + metadata: Some(metadata.clone()), + ..Default::default() + })), + limit: Some(1), + ..Default::default() + }; + let response_address1_token = mina_mesh.search_transactions(request_address1_token).await; + + let request_address2_token = SearchTransactionsRequest { + network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "testnet".to_string())), + max_block: Some(max_block), + account_identifier: Some(Box::new(AccountIdentifier { + address: address2.to_string(), + metadata: Some(metadata.clone()), + ..Default::default() + })), + limit: Some(1), + ..Default::default() + }; + let response_address2_token = mina_mesh.search_transactions(request_address2_token).await; + + assert!(response_address1_token.is_ok()); + assert_eq!(response_address1_token, response_address2_token); + assert_debug_snapshot!(response_address1_token); + Ok(()) +} + +#[tokio::test] +async fn search_transactions_zkapp_tokens_tx_hash() -> Result<()> { + let mina_mesh = MinaMeshConfig::from_env().to_mina_mesh().await?; + + let request_tx_hash = SearchTransactionsRequest { + network_identifier: Box::new(NetworkIdentifier::new("mina".to_string(), "testnet".to_string())), + transaction_identifier: Some(Box::new(TransactionIdentifier::new( + // cspell:disable-next-line + "5JuotEHhjuYbu2oucyTiVhJX3Abx5DPL4NXnM7CP9hfJZLE5G8n9".to_string(), + ))), + limit: Some(1), + ..Default::default() + }; + let response_tx_hash = mina_mesh.search_transactions(request_tx_hash).await; + + assert!(response_tx_hash.is_ok()); + assert_debug_snapshot!(response_tx_hash); + Ok(()) +} diff --git a/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_account_identifier.snap b/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_account_identifier.snap new file mode 100644 index 0000000..d548837 --- /dev/null +++ b/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_account_identifier.snap @@ -0,0 +1,101 @@ +--- +source: tests/search_transactions.rs +expression: response_address1_token +--- +Ok( + SearchTransactionsResponse { + transactions: [ + BlockTransaction { + block_identifier: BlockIdentifier { + index: 319856, + hash: "3NKjAbntQZNxPwbHkRbDAjPrMRoR58MAFepDsPtyQ3vSbhAWEeuu", + }, + transaction: Transaction { + transaction_identifier: TransactionIdentifier { + hash: "5JuotEHhjuYbu2oucyTiVhJX3Abx5DPL4NXnM7CP9hfJZLE5G8n9", + }, + operations: [ + Operation { + operation_identifier: OperationIdentifier { + index: 0, + network_index: None, + }, + related_operations: None, + type: "zkapp_fee_payer_dec", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qituGxc1ZNbWfz4SnftNUaJ78YYYsmuuuJr1FFHjbRqLir7tvBew", + sub_account: None, + metadata: Some( + Object { + "token_id": String("wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "-100000000", + currency: Currency { + symbol: "MINA", + decimals: 9, + metadata: None, + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + Operation { + operation_identifier: OperationIdentifier { + index: 1, + network_index: None, + }, + related_operations: None, + type: "zkapp_balance_update", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qjwDWxjf4LtJ4YWJQDdTNPqZ69ZyeCzbpAFKN7EoZzYig5ZRz8JE", + sub_account: None, + metadata: Some( + Object { + "token_id": String("xBxjFpJkbWpbGua7Lf36S1NLhffFoEChyP3pz6SYKnx7dFCTwg"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "10000000000000", + currency: Currency { + symbol: "MINA+", + decimals: 9, + metadata: Some( + Object { + "token_id": String("xBxjFpJkbWpbGua7Lf36S1NLhffFoEChyP3pz6SYKnx7dFCTwg"), + }, + ), + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + ], + related_transactions: None, + metadata: None, + }, + }, + ], + total_count: 1, + next_offset: None, + }, +) diff --git a/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_tx_hash.snap b/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_tx_hash.snap new file mode 100644 index 0000000..2e59d79 --- /dev/null +++ b/tests/snapshots/search_transactions__search_transactions_zkapp_tokens_tx_hash.snap @@ -0,0 +1,171 @@ +--- +source: tests/search_transactions.rs +expression: response_tx_hash +--- +Ok( + SearchTransactionsResponse { + transactions: [ + BlockTransaction { + block_identifier: BlockIdentifier { + index: 319856, + hash: "3NKjAbntQZNxPwbHkRbDAjPrMRoR58MAFepDsPtyQ3vSbhAWEeuu", + }, + transaction: Transaction { + transaction_identifier: TransactionIdentifier { + hash: "5JuotEHhjuYbu2oucyTiVhJX3Abx5DPL4NXnM7CP9hfJZLE5G8n9", + }, + operations: [ + Operation { + operation_identifier: OperationIdentifier { + index: 0, + network_index: None, + }, + related_operations: None, + type: "zkapp_fee_payer_dec", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qituGxc1ZNbWfz4SnftNUaJ78YYYsmuuuJr1FFHjbRqLir7tvBew", + sub_account: None, + metadata: Some( + Object { + "token_id": String("wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "-100000000", + currency: Currency { + symbol: "MINA", + decimals: 9, + metadata: None, + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + Operation { + operation_identifier: OperationIdentifier { + index: 1, + network_index: None, + }, + related_operations: None, + type: "zkapp_balance_update", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qjwDWxjf4LtJ4YWJQDdTNPqZ69ZyeCzbpAFKN7EoZzYig5ZRz8JE", + sub_account: None, + metadata: Some( + Object { + "token_id": String("wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "0", + currency: Currency { + symbol: "MINA", + decimals: 9, + metadata: None, + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + Operation { + operation_identifier: OperationIdentifier { + index: 2, + network_index: None, + }, + related_operations: None, + type: "zkapp_balance_update", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qituGxc1ZNbWfz4SnftNUaJ78YYYsmuuuJr1FFHjbRqLir7tvBew", + sub_account: None, + metadata: Some( + Object { + "token_id": String("wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "-1000000000", + currency: Currency { + symbol: "MINA", + decimals: 9, + metadata: None, + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + Operation { + operation_identifier: OperationIdentifier { + index: 3, + network_index: None, + }, + related_operations: None, + type: "zkapp_balance_update", + status: Some( + "Success", + ), + account: Some( + AccountIdentifier { + address: "B62qjwDWxjf4LtJ4YWJQDdTNPqZ69ZyeCzbpAFKN7EoZzYig5ZRz8JE", + sub_account: None, + metadata: Some( + Object { + "token_id": String("xBxjFpJkbWpbGua7Lf36S1NLhffFoEChyP3pz6SYKnx7dFCTwg"), + }, + ), + }, + ), + amount: Some( + Amount { + value: "10000000000000", + currency: Currency { + symbol: "MINA+", + decimals: 9, + metadata: Some( + Object { + "token_id": String("xBxjFpJkbWpbGua7Lf36S1NLhffFoEChyP3pz6SYKnx7dFCTwg"), + }, + ), + }, + metadata: None, + }, + ), + coin_change: None, + metadata: None, + }, + ], + related_transactions: None, + metadata: None, + }, + }, + ], + total_count: 1, + next_offset: None, + }, +)