@@ -4,6 +4,7 @@ use super::{
44use crate :: api:: method:: utils:: parse_account_model_with_context;
55use crate :: common:: typedefs:: account:: AccountV2 ;
66use crate :: common:: typedefs:: account:: AccountWithContext ;
7+ use crate :: common:: typedefs:: hash:: Hash ;
78use crate :: common:: typedefs:: token_data:: TokenData ;
89use crate :: common:: typedefs:: { account:: Account , serializable_signature:: SerializableSignature } ;
910use crate :: dao:: generated:: accounts:: Model ;
@@ -99,11 +100,19 @@ pub struct AccountWithOptionalTokenDataV2 {
99100 pub optionalTokenData : Option < TokenData > ,
100101}
101102
103+ #[ derive( Debug , Clone , PartialEq , Eq , Serialize , ToSchema ) ]
104+ #[ serde( deny_unknown_fields, rename_all = "camelCase" ) ]
105+ #[ allow( non_snake_case) ]
106+ pub struct ClosedAccountWithOptionalTokenData {
107+ pub account : ClosedAccount ,
108+ pub optionalTokenData : Option < TokenData > ,
109+ }
110+
102111#[ derive( Debug , Clone , PartialEq , Eq , Serialize , ToSchema ) ]
103112#[ serde( deny_unknown_fields, rename_all = "camelCase" ) ]
104113#[ allow( non_snake_case) ]
105114pub struct CompressionInfoV2 {
106- pub closedAccounts : Vec < AccountWithOptionalTokenDataV2 > ,
115+ pub closedAccounts : Vec < ClosedAccountWithOptionalTokenData > ,
107116 pub openedAccounts : Vec < AccountWithOptionalTokenDataV2 > ,
108117}
109118
@@ -245,6 +254,30 @@ fn parse_optional_token_data_v2(
245254 } )
246255}
247256
257+ fn parse_optional_token_data_for_multiple_accounts_closed_account (
258+ accounts : Vec < ClosedAccount > ,
259+ ) -> Result < Vec < ClosedAccountWithOptionalTokenData > , PhotonApiError > {
260+ accounts
261+ . into_iter ( )
262+ . map ( parse_optional_token_data_closed_account)
263+ . collect ( )
264+ }
265+
266+ fn parse_optional_token_data_closed_account (
267+ account : ClosedAccount ,
268+ ) -> Result < ClosedAccountWithOptionalTokenData , PhotonApiError > {
269+ let hash = account. account . hash . clone ( ) ;
270+ Ok ( ClosedAccountWithOptionalTokenData {
271+ optionalTokenData : parse_token_data_v2 ( & account. account ) . map_err ( |e| {
272+ PhotonApiError :: UnexpectedError ( format ! (
273+ "Failed to parse token data for account {}: {}" ,
274+ hash, e
275+ ) )
276+ } ) ?,
277+ account,
278+ } )
279+ }
280+
248281fn parse_optional_token_data_for_multiple_accounts_v2 (
249282 accounts : Vec < AccountV2 > ,
250283) -> Result < Vec < AccountWithOptionalTokenDataV2 > , PhotonApiError > {
@@ -254,6 +287,14 @@ fn parse_optional_token_data_for_multiple_accounts_v2(
254287 . collect ( )
255288}
256289
290+ #[ derive( Debug , Clone , PartialEq , Eq , Serialize , ToSchema , Default ) ]
291+ #[ serde( deny_unknown_fields, rename_all = "camelCase" ) ]
292+ pub struct ClosedAccount {
293+ pub account : AccountV2 ,
294+ pub nullifier : Hash ,
295+ pub tx_hash : Hash ,
296+ }
297+
257298pub async fn get_transaction_helper_v2 (
258299 conn : & DatabaseConnection ,
259300 signature : SerializableSignature ,
@@ -297,21 +338,32 @@ pub async fn get_transaction_helper_v2(
297338
298339 println ! ( "closed_accounts: {:?}" , closed_accounts) ;
299340
300- let closed_accounts = closed_accounts
301- . into_iter ( )
302- . map ( |x| AccountV2 {
303- hash : x. account . hash ,
304- address : x. account . address ,
305- data : x. account . data ,
306- owner : x. account . owner ,
307- lamports : x. account . lamports ,
308- tree : x. account . tree ,
309- leaf_index : x. account . leaf_index ,
310- seq : x. account . seq ,
311- slot_created : x. account . slot_created ,
312- queue : x. context . queue ,
313- } )
314- . collect :: < Vec < AccountV2 > > ( ) ;
341+ let closed_accounts =
342+ closed_accounts
343+ . into_iter ( )
344+ . map ( |x| -> Result < ClosedAccount , PhotonApiError > {
345+ Ok ( ClosedAccount {
346+ account : AccountV2 {
347+ hash : x. account . hash ,
348+ address : x. account . address ,
349+ data : x. account . data ,
350+ owner : x. account . owner ,
351+ lamports : x. account . lamports ,
352+ tree : x. account . tree ,
353+ leaf_index : x. account . leaf_index ,
354+ seq : x. account . seq ,
355+ slot_created : x. account . slot_created ,
356+ queue : x. context . queue ,
357+ } ,
358+ nullifier : x. context . nullifier . ok_or ( PhotonApiError :: UnexpectedError (
359+ String :: from ( "Nullifier does not exist for closed account." ) ,
360+ ) ) ?,
361+ tx_hash : x. context . tx_hash . ok_or ( PhotonApiError :: UnexpectedError (
362+ String :: from ( "Nullifier does not exist for closed account." ) ,
363+ ) ) ?,
364+ } )
365+ } )
366+ . collect :: < Result < Vec < ClosedAccount > , PhotonApiError > > ( ) ?;
315367
316368 let out_accounts = status_update
317369 . out_accounts
@@ -333,7 +385,9 @@ pub async fn get_transaction_helper_v2(
333385 Ok ( GetTransactionResponseV2 {
334386 transaction : txn,
335387 compressionInfo : CompressionInfoV2 {
336- closedAccounts : parse_optional_token_data_for_multiple_accounts_v2 ( closed_accounts) ?,
388+ closedAccounts : parse_optional_token_data_for_multiple_accounts_closed_account (
389+ closed_accounts,
390+ ) ?,
337391 openedAccounts : parse_optional_token_data_for_multiple_accounts_v2 ( out_accounts) ?,
338392 } ,
339393 } )
0 commit comments