From 14a22cc8c3cc00617ab041c01290512f35e1ec87 Mon Sep 17 00:00:00 2001 From: Lasse Alm Date: Thu, 6 Feb 2025 21:47:43 +0100 Subject: [PATCH 1/5] fix contracts ordering --- backend-rust/src/graphql_api/contract.rs | 40 ++++++++++-------------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/backend-rust/src/graphql_api/contract.rs b/backend-rust/src/graphql_api/contract.rs index ab5ff047..22d59d6a 100644 --- a/backend-rust/src/graphql_api/contract.rs +++ b/backend-rust/src/graphql_api/contract.rs @@ -225,27 +225,35 @@ impl Contract { let skip = skip.unwrap_or(0); let take = take.unwrap_or(config.contract_events_collection_limit); + let total_contract_events_count: u64 = sqlx::query_scalar!( + "SELECT + COUNT(*) + FROM contract_events + WHERE contract_index = $1 AND contract_sub_index = $2", + self.contract_address_index.0 as i64, + self.contract_address_sub_index.0 as i64 + ) + .fetch_one(pool) + .await? + .unwrap_or(0) + .try_into()?; // If `skip` is 0 and at least one event is taken, include the // `init_transaction_event`. - let include_initial_event = skip == 0 && take > 0; + let include_initial_event = skip <= total_contract_events_count && skip + take >= total_contract_events_count; // Adjust the `take` and `skip` values considering if the // `init_transaction_event` is requested to be included or not. - let take_without_initial_event = take.saturating_sub(include_initial_event as u64); - let skip_without_initial_event = skip.saturating_sub(1); // Limit the number of events to be fetched from the `contract_events` table. let limit = std::cmp::min( - take_without_initial_event, + take, config.contract_events_collection_limit.saturating_sub(include_initial_event as u64), ); let mut contract_events = vec![]; let mut initial_contract_event_exists_in_database = false; - // Get the events from the `contract_events` table. let mut rows = sqlx::query!( " - SELECT * FROM ( SELECT event_index_per_contract, contract_events.transaction_index, @@ -266,15 +274,14 @@ impl Contract { ON contract_events.block_height = blocks.height WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = \ $2 - AND event_index_per_contract >= $4 - LIMIT $3 - ) AS contract_data + AND event_index_per_contract < $4 ORDER BY event_index_per_contract DESC + LIMIT $3 ", self.contract_address_index.0 as i64, self.contract_address_sub_index.0 as i64, limit as i64 + 1, - skip_without_initial_event as i64 + (total_contract_events_count - skip) as i64 ) .fetch_all(pool) .await?; @@ -396,19 +403,6 @@ impl Contract { contract_events.push(initial_event); } - let total_contract_events_count: u64 = sqlx::query_scalar!( - "SELECT - COUNT(*) - FROM contract_events - WHERE contract_index = $1 AND contract_sub_index = $2", - self.contract_address_index.0 as i64, - self.contract_address_sub_index.0 as i64 - ) - .fetch_one(pool) - .await? - .unwrap_or(0) - .try_into()?; - Ok(ContractEventsCollectionSegment { page_info: CollectionSegmentInfo { has_next_page, From d31923a7e257ce24e7f37c9e6447c8db1c77a714 Mon Sep 17 00:00:00 2001 From: Lasse Alm Date: Thu, 6 Feb 2025 21:49:15 +0100 Subject: [PATCH 2/5] events of wrong order --- backend-rust/src/graphql_api/contract.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend-rust/src/graphql_api/contract.rs b/backend-rust/src/graphql_api/contract.rs index 22d59d6a..62a075a7 100644 --- a/backend-rust/src/graphql_api/contract.rs +++ b/backend-rust/src/graphql_api/contract.rs @@ -239,7 +239,8 @@ impl Contract { .try_into()?; // If `skip` is 0 and at least one event is taken, include the // `init_transaction_event`. - let include_initial_event = skip <= total_contract_events_count && skip + take >= total_contract_events_count; + let include_initial_event = + skip <= total_contract_events_count && skip + take >= total_contract_events_count; // Adjust the `take` and `skip` values considering if the // `init_transaction_event` is requested to be included or not. From 47d9180a4ba35e5053d77bcf4fb9684887bc1296 Mon Sep 17 00:00:00 2001 From: Lasse Alm Date: Fri, 7 Feb 2025 09:58:40 +0100 Subject: [PATCH 3/5] fix fmt --- ...e4dc6b06af35f982b8a70d87adecde3a96942.json | 73 +++++++++++++++++++ ...2b1c88ad8b7e2aa75f8398b805c80b4bdd273.json | 73 ------------------- 2 files changed, 73 insertions(+), 73 deletions(-) create mode 100644 backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json delete mode 100644 backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json diff --git a/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json b/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json new file mode 100644 index 00000000..7a3e8583 --- /dev/null +++ b/backend-rust/.sqlx/query-2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942.json @@ -0,0 +1,73 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT\n event_index_per_contract,\n contract_events.transaction_index,\n trace_element_index,\n contract_events.block_height AS event_block_height,\n transactions.hash as transaction_hash,\n transactions.events,\n accounts.address as creator,\n blocks.slot_time as block_slot_time,\n blocks.height as block_height\n FROM contract_events\n JOIN transactions\n ON contract_events.block_height = transactions.block_height\n AND contract_events.transaction_index = transactions.index\n JOIN accounts\n ON transactions.sender_index = accounts.index\n JOIN blocks\n ON contract_events.block_height = blocks.height\n WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = $2\n AND event_index_per_contract < $4\n ORDER BY event_index_per_contract DESC\n LIMIT $3\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "event_index_per_contract", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "transaction_index", + "type_info": "Int8" + }, + { + "ordinal": 2, + "name": "trace_element_index", + "type_info": "Int8" + }, + { + "ordinal": 3, + "name": "event_block_height", + "type_info": "Int8" + }, + { + "ordinal": 4, + "name": "transaction_hash", + "type_info": "Bpchar" + }, + { + "ordinal": 5, + "name": "events", + "type_info": "Jsonb" + }, + { + "ordinal": 6, + "name": "creator", + "type_info": "Varchar" + }, + { + "ordinal": 7, + "name": "block_slot_time", + "type_info": "Timestamptz" + }, + { + "ordinal": 8, + "name": "block_height", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8", + "Int8", + "Int8", + "Int8" + ] + }, + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + false + ] + }, + "hash": "2eaeb1383c2b23096e399e75d66e4dc6b06af35f982b8a70d87adecde3a96942" +} diff --git a/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json b/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json deleted file mode 100644 index 9595d074..00000000 --- a/backend-rust/.sqlx/query-80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT * FROM (\n SELECT\n event_index_per_contract,\n contract_events.transaction_index,\n trace_element_index,\n contract_events.block_height AS event_block_height,\n transactions.hash as transaction_hash,\n transactions.events,\n accounts.address as creator,\n blocks.slot_time as block_slot_time,\n blocks.height as block_height\n FROM contract_events\n JOIN transactions\n ON contract_events.block_height = transactions.block_height\n AND contract_events.transaction_index = transactions.index\n JOIN accounts\n ON transactions.sender_index = accounts.index\n JOIN blocks\n ON contract_events.block_height = blocks.height\n WHERE contract_events.contract_index = $1 AND contract_events.contract_sub_index = $2\n AND event_index_per_contract >= $4\n LIMIT $3\n ) AS contract_data\n ORDER BY event_index_per_contract DESC\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "event_index_per_contract", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "transaction_index", - "type_info": "Int8" - }, - { - "ordinal": 2, - "name": "trace_element_index", - "type_info": "Int8" - }, - { - "ordinal": 3, - "name": "event_block_height", - "type_info": "Int8" - }, - { - "ordinal": 4, - "name": "transaction_hash", - "type_info": "Bpchar" - }, - { - "ordinal": 5, - "name": "events", - "type_info": "Jsonb" - }, - { - "ordinal": 6, - "name": "creator", - "type_info": "Varchar" - }, - { - "ordinal": 7, - "name": "block_slot_time", - "type_info": "Timestamptz" - }, - { - "ordinal": 8, - "name": "block_height", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int8", - "Int8", - "Int8", - "Int8" - ] - }, - "nullable": [ - false, - false, - false, - false, - false, - true, - false, - false, - false - ] - }, - "hash": "80c9dbcf9005651c95c0dd535272b1c88ad8b7e2aa75f8398b805c80b4bdd273" -} From bc34ff722750a1d3ae8a3a285303d2841d41fb56 Mon Sep 17 00:00:00 2001 From: Lasse Alm Date: Fri, 7 Feb 2025 12:07:40 +0100 Subject: [PATCH 4/5] fix integer overflow --- backend-rust/src/graphql_api/contract.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend-rust/src/graphql_api/contract.rs b/backend-rust/src/graphql_api/contract.rs index 62a075a7..3a68ab56 100644 --- a/backend-rust/src/graphql_api/contract.rs +++ b/backend-rust/src/graphql_api/contract.rs @@ -252,6 +252,7 @@ impl Contract { let mut contract_events = vec![]; let mut initial_contract_event_exists_in_database = false; + // Get the events from the `contract_events` table. let mut rows = sqlx::query!( " @@ -282,7 +283,7 @@ impl Contract { self.contract_address_index.0 as i64, self.contract_address_sub_index.0 as i64, limit as i64 + 1, - (total_contract_events_count - skip) as i64 + total_contract_events_count as i64 - skip as i64 ) .fetch_all(pool) .await?; From 289d1f0f44966c5ac5767bda5480bf76e5f98c84 Mon Sep 17 00:00:00 2001 From: Lasse Alm Date: Fri, 7 Feb 2025 12:28:45 +0100 Subject: [PATCH 5/5] updated changelog --- backend-rust/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/backend-rust/CHANGELOG.md b/backend-rust/CHANGELOG.md index e88c90e2..790624f4 100644 --- a/backend-rust/CHANGELOG.md +++ b/backend-rust/CHANGELOG.md @@ -26,6 +26,7 @@ Database schema version: 2 - Issue for `Query::transaction_metrics` producing an internal error when query period is beyond the genesis block. - Next and previous page on contracts - Contract rejected event skips in the correct way +- Contract events order fixed ## [0.1.19] - 2025-01-30