From a779dbece532eb8cbb16f6d80974b85ebf37522b Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Mon, 3 Mar 2025 20:40:22 +0000 Subject: [PATCH 1/3] consistent tree field in v2 responses --- .../method/get_compressed_account_proof/v2.rs | 12 ++++++------ .../get_multiple_compressed_account_proofs/v2.rs | 6 +++--- src/api/method/get_queue_elements.rs | 10 +++++----- .../get_transaction_with_compression_info.rs | 4 ++-- src/api/method/get_validity_proof/common.rs | 8 ++++---- src/api/method/get_validity_proof/mod.rs | 3 ++- src/api/method/get_validity_proof/v2.rs | 2 +- src/common/typedefs/account/v2.rs | 2 +- src/ingester/persist/persisted_state_tree.rs | 2 +- src/openapi/mod.rs | 6 +++--- .../batched_state_tree_tests.rs | 16 ++++++++-------- 11 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/api/method/get_compressed_account_proof/v2.rs b/src/api/method/get_compressed_account_proof/v2.rs index 4511fa54..5aa35342 100644 --- a/src/api/method/get_compressed_account_proof/v2.rs +++ b/src/api/method/get_compressed_account_proof/v2.rs @@ -1,5 +1,5 @@ use crate::api::error::PhotonApiError; -use crate::api::method::get_validity_proof::ContextInfo; +use crate::api::method::get_validity_proof::TreeContextInfo; use crate::api::method::utils::HashRequest; use crate::common::typedefs::context::Context; use crate::common::typedefs::hash::Hash; @@ -33,7 +33,7 @@ pub struct GetCompressedAccountProofResponseValueV2 { pub hash: Hash, pub root_seq: u64, pub prove_by_index: bool, - pub context: ContextInfo, + pub tree_context: TreeContextInfo, } impl From for GetCompressedAccountProofResponseValueV2 { @@ -46,9 +46,9 @@ impl From for GetCompressedAccountProofResponseValueV2 { root_seq: proof.root_seq, prove_by_index: false, // Default values to be overridden as needed - context: ContextInfo { + tree_context: TreeContextInfo { tree_type: 0, - merkle_tree: proof.merkle_tree, + tree: proof.merkle_tree, queue: Default::default(), cpi_context: None, }, @@ -127,8 +127,8 @@ pub async fn get_compressed_account_proof_v2( // Enrich with account data if available if let Some(account) = account { - result.context.tree_type = account.tree_type as u16; - result.context.queue = SerializablePubkey::try_from(account.queue)?; + result.tree_context.tree_type = account.tree_type as u16; + result.tree_context.queue = SerializablePubkey::try_from(account.queue)?; } let response = GetCompressedAccountProofResponseV2 { diff --git a/src/api/method/get_multiple_compressed_account_proofs/v2.rs b/src/api/method/get_multiple_compressed_account_proofs/v2.rs index 3038e2b8..9db92439 100644 --- a/src/api/method/get_multiple_compressed_account_proofs/v2.rs +++ b/src/api/method/get_multiple_compressed_account_proofs/v2.rs @@ -1,7 +1,7 @@ use crate::api::error::PhotonApiError; use crate::api::method::get_compressed_account_proof::GetCompressedAccountProofResponseValueV2; use crate::api::method::get_multiple_compressed_account_proofs::HashList; -use crate::api::method::get_validity_proof::ContextInfo; +use crate::api::method::get_validity_proof::TreeContextInfo; use crate::api::method::utils::PAGE_LIMIT; use crate::common::typedefs::context::Context; use crate::common::typedefs::hash::Hash; @@ -145,9 +145,9 @@ pub async fn get_multiple_compressed_account_proofs_v2( // Enrich with account data for value in &mut result { if let Some(account) = account_map.get(&value.hash.to_vec()) { - value.context = ContextInfo { + value.tree_context = TreeContextInfo { tree_type: account.tree_type as u16, - merkle_tree: SerializablePubkey::try_from(account.tree.clone())?, + tree: SerializablePubkey::try_from(account.tree.clone())?, queue: SerializablePubkey::try_from(account.queue.clone())?, cpi_context: None, }; diff --git a/src/api/method/get_queue_elements.rs b/src/api/method/get_queue_elements.rs index a9f10547..5e66f394 100644 --- a/src/api/method/get_queue_elements.rs +++ b/src/api/method/get_queue_elements.rs @@ -17,7 +17,7 @@ use crate::ingester::persist::get_multiple_compressed_leaf_proofs_by_indices; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema, Default)] #[serde(deny_unknown_fields, rename_all = "camelCase")] pub struct GetQueueElementsRequest { - pub merkle_tree: Hash, + pub tree: Hash, pub start_offset: Option, pub num_elements: u16, pub queue_type: u8, @@ -37,7 +37,7 @@ pub struct GetQueueElementsResponseValue { pub root: Hash, pub leaf_index: u64, pub leaf: Hash, - pub merkle_tree: Hash, + pub tree: Hash, pub root_seq: u64, pub tx_hash: Option, pub account_hash: Hash, @@ -68,7 +68,7 @@ pub async fn get_queue_elements( } let mut query_condition = - Condition::all().add(accounts::Column::Tree.eq(request.merkle_tree.to_vec())); + Condition::all().add(accounts::Column::Tree.eq(request.tree.to_vec())); match queue_type { QueueType::BatchedInput => { @@ -132,7 +132,7 @@ pub async fn get_queue_elements( ( get_multiple_compressed_leaf_proofs_by_indices( &tx, - SerializablePubkey::from(request.merkle_tree.0), + SerializablePubkey::from(request.tree.0), indices, ) .await?, @@ -158,7 +158,7 @@ pub async fn get_queue_elements( root: proof.root, leaf_index: proof.leaf_index as u64, leaf: proof.hash, - merkle_tree: Hash::from(proof.merkle_tree.0.to_bytes()), + tree: Hash::from(proof.merkle_tree.0.to_bytes()), root_seq: proof.root_seq, tx_hash, account_hash, diff --git a/src/api/method/get_transaction_with_compression_info.rs b/src/api/method/get_transaction_with_compression_info.rs index 61fc9cdb..d14c8766 100644 --- a/src/api/method/get_transaction_with_compression_info.rs +++ b/src/api/method/get_transaction_with_compression_info.rs @@ -385,7 +385,7 @@ pub async fn get_transaction_helper_v2( tree: x.account.tree, queue: x.context.queue, cpi_context: None, - next_context: None, + next_tree_context: None, }, }, nullifier: x.context.nullifier.unwrap_or_default(), @@ -412,7 +412,7 @@ pub async fn get_transaction_helper_v2( tree: x.account.tree, queue: x.context.queue, cpi_context: None, - next_context: None, + next_tree_context: None, }, }) .collect::>(); diff --git a/src/api/method/get_validity_proof/common.rs b/src/api/method/get_validity_proof/common.rs index 1997960b..89e3959a 100644 --- a/src/api/method/get_validity_proof/common.rs +++ b/src/api/method/get_validity_proof/common.rs @@ -131,7 +131,7 @@ impl From for GetValidityProofResponseV2 { tree: SerializablePubkey::from(tree_info.tree), queue: SerializablePubkey::from(tree_info.queue), cpi_context: None, - next_context: None, + next_tree_context: None, } }) .collect(), @@ -275,15 +275,15 @@ pub struct MerkleContextV2 { // nullifier_queue in legacy trees, output_queue in V2 trees. pub queue: SerializablePubkey, pub cpi_context: Option, - pub next_context: Option, + pub next_tree_context: Option, } #[derive(Serialize, Deserialize, ToSchema, Debug, Default, Clone, Eq, PartialEq)] #[serde(rename_all = "camelCase")] #[allow(non_snake_case)] -pub struct ContextInfo { +pub struct TreeContextInfo { pub tree_type: u16, - pub merkle_tree: SerializablePubkey, + pub tree: SerializablePubkey, pub queue: SerializablePubkey, pub cpi_context: Option, } diff --git a/src/api/method/get_validity_proof/mod.rs b/src/api/method/get_validity_proof/mod.rs index e6131274..5403113a 100644 --- a/src/api/method/get_validity_proof/mod.rs +++ b/src/api/method/get_validity_proof/mod.rs @@ -3,9 +3,10 @@ mod v1; mod v2; pub use common::{ - CompressedProof, CompressedProofWithContext, CompressedProofWithContextV2, ContextInfo, + CompressedProof, CompressedProofWithContext, CompressedProofWithContextV2, GetValidityProofRequest, GetValidityProofRequestDocumentation, GetValidityProofRequestV2, GetValidityProofResponse, GetValidityProofResponseV2, MerkleContextV2, RootIndex, + TreeContextInfo, }; pub use v1::get_validity_proof; pub use v2::get_validity_proof_v2; diff --git a/src/api/method/get_validity_proof/v2.rs b/src/api/method/get_validity_proof/v2.rs index a1d69db3..4be621f7 100644 --- a/src/api/method/get_validity_proof/v2.rs +++ b/src/api/method/get_validity_proof/v2.rs @@ -117,7 +117,7 @@ pub async fn get_validity_proof_v2( queue: SerializablePubkey::try_from_slice(account.queue.as_slice()) .unwrap_or(SerializablePubkey::default()), cpi_context: None, - next_context: None, + next_tree_context: None, }, ); // proof by index has no root. diff --git a/src/common/typedefs/account/v2.rs b/src/common/typedefs/account/v2.rs index c5debb59..5f09e3cd 100644 --- a/src/common/typedefs/account/v2.rs +++ b/src/common/typedefs/account/v2.rs @@ -72,7 +72,7 @@ impl TryFrom for AccountV2 { tree: account.tree.try_into()?, queue: account.queue.clone().try_into()?, cpi_context: None, - next_context: None, + next_tree_context: None, }, }) } diff --git a/src/ingester/persist/persisted_state_tree.rs b/src/ingester/persist/persisted_state_tree.rs index 5f557f92..cc7f2f78 100644 --- a/src/ingester/persist/persisted_state_tree.rs +++ b/src/ingester/persist/persisted_state_tree.rs @@ -504,7 +504,7 @@ mod tests { root: Hash::try_from(ZERO_BYTES[31].to_vec()).unwrap(), leaf_index: test_leaf_index, hash: Hash::try_from(ZERO_BYTES[0].to_vec()).unwrap(), - merkle_tree: merkle_tree, + merkle_tree, root_seq: 0, }; diff --git a/src/openapi/mod.rs b/src/openapi/mod.rs index bd2f108a..d1ca5521 100644 --- a/src/openapi/mod.rs +++ b/src/openapi/mod.rs @@ -28,8 +28,8 @@ use crate::api::method::get_transaction_with_compression_info::{ ClosedAccountWithOptionalTokenData, }; use crate::api::method::get_validity_proof::{ - CompressedProof, CompressedProofWithContext, CompressedProofWithContextV2, ContextInfo, - MerkleContextV2, RootIndex, + CompressedProof, CompressedProofWithContext, CompressedProofWithContextV2, MerkleContextV2, + RootIndex, TreeContextInfo, }; use crate::api::method::utils::PaginatedSignatureInfoList; use crate::api::method::utils::SignatureInfo; @@ -135,7 +135,7 @@ const JSON_CONTENT_TYPE: &str = "application/json"; OwnerBalancesResponse, TokenBalanceListV2, MerkleContextV2, - ContextInfo, + TreeContextInfo, GetCompressedAccountProofResponseValueV1, GetCompressedAccountProofResponseValueV2, GetMultipleCompressedAccountProofsResponseValue diff --git a/tests/integration_tests/batched_state_tree_tests.rs b/tests/integration_tests/batched_state_tree_tests.rs index 177e05cd..010729e7 100644 --- a/tests/integration_tests/batched_state_tree_tests.rs +++ b/tests/integration_tests/batched_state_tree_tests.rs @@ -128,7 +128,7 @@ async fn test_batched_tree_transactions( let get_queue_elements_result = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedOutput as u8, num_elements: 100, @@ -154,7 +154,7 @@ async fn test_batched_tree_transactions( let get_queue_elements_result = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedInput as u8, num_elements: 100, @@ -228,7 +228,7 @@ async fn test_batched_tree_transactions( let pre_output_queue_elements = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedOutput as u8, num_elements: 100, @@ -238,7 +238,7 @@ async fn test_batched_tree_transactions( let pre_input_queue_elements = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedInput as u8, num_elements: 100, @@ -257,7 +257,7 @@ async fn test_batched_tree_transactions( let post_output_queue_elements = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedOutput as u8, num_elements: 100, @@ -267,7 +267,7 @@ async fn test_batched_tree_transactions( let post_input_queue_elements = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedInput as u8, num_elements: 100, @@ -397,7 +397,7 @@ async fn test_batched_tree_transactions( let get_queue_elements_result = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedOutput as u8, num_elements: 100, @@ -413,7 +413,7 @@ async fn test_batched_tree_transactions( let get_queue_elements_result = setup .api .get_queue_elements(GetQueueElementsRequest { - merkle_tree: merkle_tree_pubkey.to_bytes().into(), + tree: merkle_tree_pubkey.to_bytes().into(), start_offset: None, queue_type: QueueType::BatchedInput as u8, num_elements: 100, From 7bb52e90ffc1b56bfdb184f576de61d5a37cc3a0 Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Tue, 4 Mar 2025 02:07:24 +0000 Subject: [PATCH 2/3] validityproofv2 merkle_context -> merkle_contexts --- src/api/method/get_validity_proof/common.rs | 4 ++-- src/api/method/get_validity_proof/v2.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/api/method/get_validity_proof/common.rs b/src/api/method/get_validity_proof/common.rs index 89e3959a..f67dffcb 100644 --- a/src/api/method/get_validity_proof/common.rs +++ b/src/api/method/get_validity_proof/common.rs @@ -120,7 +120,7 @@ impl From for GetValidityProofResponseV2 { .collect(), leafIndices: response.value.leafIndices, leaves: response.value.leaves, - merkle_context: response + merkle_contexts: response .value .merkleTrees .iter() @@ -297,7 +297,7 @@ pub struct CompressedProofWithContextV2 { pub rootIndices: Vec, pub leafIndices: Vec, pub leaves: Vec, - pub merkle_context: Vec, + pub merkle_contexts: Vec, } #[derive(Serialize, Deserialize, Debug)] diff --git a/src/api/method/get_validity_proof/v2.rs b/src/api/method/get_validity_proof/v2.rs index 4be621f7..3f7d2db0 100644 --- a/src/api/method/get_validity_proof/v2.rs +++ b/src/api/method/get_validity_proof/v2.rs @@ -108,7 +108,7 @@ pub async fn get_validity_proof_v2( .value .leaves .insert(index, Hash::new(account.hash.as_slice())?.to_string()); - v2_response.value.merkle_context.insert( + v2_response.value.merkle_contexts.insert( index, MerkleContextV2 { tree_type: account.tree_type as u16, From e5a55bec8d0d29951cea26c1cc7a4e44a2c188eb Mon Sep 17 00:00:00 2001 From: Swenschaeferjohann Date: Wed, 5 Mar 2025 01:25:56 +0000 Subject: [PATCH 3/3] update naming for get_transaction_with_compression_info helpers v2 --- .../get_transaction_with_compression_info.rs | 32 +++++++++---------- src/openapi/mod.rs | 8 ++--- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/api/method/get_transaction_with_compression_info.rs b/src/api/method/get_transaction_with_compression_info.rs index d14c8766..4c1c1ea0 100644 --- a/src/api/method/get_transaction_with_compression_info.rs +++ b/src/api/method/get_transaction_with_compression_info.rs @@ -104,8 +104,8 @@ pub struct AccountWithOptionalTokenDataV2 { #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] #[serde(deny_unknown_fields, rename_all = "camelCase")] #[allow(non_snake_case)] -pub struct ClosedAccountWithOptionalTokenData { - pub account: ClosedAccount, +pub struct ClosedAccountWithOptionalTokenDataV2 { + pub account: ClosedAccountV2, pub optionalTokenData: Option, } @@ -113,7 +113,7 @@ pub struct ClosedAccountWithOptionalTokenData { #[serde(deny_unknown_fields, rename_all = "camelCase")] #[allow(non_snake_case)] pub struct CompressionInfoV2 { - pub closedAccounts: Vec, + pub closedAccounts: Vec, pub openedAccounts: Vec, } @@ -285,20 +285,20 @@ fn parse_optional_token_data_v2( }) } -fn parse_optional_token_data_for_multiple_accounts_closed_account( - accounts: Vec, -) -> Result, PhotonApiError> { +fn parse_optional_token_data_for_multiple_closed_accounts_v2( + accounts: Vec, +) -> Result, PhotonApiError> { accounts .into_iter() - .map(parse_optional_token_data_closed_account) + .map(parse_optional_token_data_closed_account_v2) .collect() } -fn parse_optional_token_data_closed_account( - account: ClosedAccount, -) -> Result { +fn parse_optional_token_data_closed_account_v2( + account: ClosedAccountV2, +) -> Result { let hash = account.account.hash.clone(); - Ok(ClosedAccountWithOptionalTokenData { + Ok(ClosedAccountWithOptionalTokenDataV2 { optionalTokenData: parse_token_data_v2(&account.account).map_err(|e| { PhotonApiError::UnexpectedError(format!( "Failed to parse token data for account {}: {}", @@ -320,7 +320,7 @@ fn parse_optional_token_data_for_multiple_accounts_v2( #[derive(Debug, Clone, PartialEq, Eq, Serialize, ToSchema)] #[serde(deny_unknown_fields, rename_all = "camelCase")] -pub struct ClosedAccount { +pub struct ClosedAccountV2 { pub account: AccountV2, pub nullifier: Hash, pub tx_hash: Hash, @@ -368,8 +368,8 @@ pub async fn get_transaction_helper_v2( .collect::, PhotonApiError>>()?; let closed_accounts = closed_accounts .into_iter() - .map(|x| -> Result { - Ok(ClosedAccount { + .map(|x| -> Result { + Ok(ClosedAccountV2 { account: AccountV2 { hash: x.account.hash, address: x.account.address, @@ -392,7 +392,7 @@ pub async fn get_transaction_helper_v2( tx_hash: x.context.tx_hash.unwrap_or_default(), }) }) - .collect::, PhotonApiError>>()?; + .collect::, PhotonApiError>>()?; let out_accounts = status_update .out_accounts @@ -420,7 +420,7 @@ pub async fn get_transaction_helper_v2( Ok(GetTransactionResponseV2 { transaction: txn, compressionInfo: CompressionInfoV2 { - closedAccounts: parse_optional_token_data_for_multiple_accounts_closed_account( + closedAccounts: parse_optional_token_data_for_multiple_closed_accounts_v2( closed_accounts, )?, openedAccounts: parse_optional_token_data_for_multiple_accounts_v2(out_accounts)?, diff --git a/src/openapi/mod.rs b/src/openapi/mod.rs index d1ca5521..38b56e27 100644 --- a/src/openapi/mod.rs +++ b/src/openapi/mod.rs @@ -24,8 +24,8 @@ use crate::api::method::get_multiple_new_address_proofs::MerkleContextWithNewAdd use crate::api::method::get_queue_elements::GetQueueElementsResponseValue; use crate::api::method::get_transaction_with_compression_info::CompressionInfoV2; use crate::api::method::get_transaction_with_compression_info::{ - AccountWithOptionalTokenData, AccountWithOptionalTokenDataV2, ClosedAccount, - ClosedAccountWithOptionalTokenData, + AccountWithOptionalTokenData, AccountWithOptionalTokenDataV2, ClosedAccountV2, + ClosedAccountWithOptionalTokenDataV2, }; use crate::api::method::get_validity_proof::{ CompressedProof, CompressedProofWithContext, CompressedProofWithContextV2, MerkleContextV2, @@ -113,8 +113,8 @@ const JSON_CONTENT_TYPE: &str = "application/json"; AccountData, AccountState, AccountWithOptionalTokenData, - ClosedAccountWithOptionalTokenData, - ClosedAccount, + ClosedAccountWithOptionalTokenDataV2, + ClosedAccountV2, AccountWithOptionalTokenDataV2, UnixTimestamp, UnsignedInteger,