From 55e43c5e89c2c3599e6741f2ed935ca46dda5256 Mon Sep 17 00:00:00 2001 From: Sergey Timoshin Date: Fri, 13 Feb 2026 16:59:49 +0000 Subject: [PATCH 1/3] chore: update photon subproject to latest commit --- external/photon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/external/photon b/external/photon index 0df2397c2c..84ddfc0f58 160000 --- a/external/photon +++ b/external/photon @@ -1 +1 @@ -Subproject commit 0df2397c2c7d8458f45df9279e999a730ba56482 +Subproject commit 84ddfc0f586806373567faf75f45158076a4f133 From d4b37827e9f35408019ae671d3d8f21196d0fd53 Mon Sep 17 00:00:00 2001 From: Sergey Timoshin Date: Sat, 14 Feb 2026 18:20:30 +0000 Subject: [PATCH 2/3] fix: update account data handling to strip discriminator prefix and include discriminator length --- external/photon | 2 +- sdk-libs/client/src/indexer/types/account.rs | 16 ++++++--- .../client/src/indexer/types/interface.rs | 9 +++-- sdk-libs/photon-api/src/codegen.rs | 35 +++++++++++++++++-- 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/external/photon b/external/photon index 84ddfc0f58..49064168e6 160000 --- a/external/photon +++ b/external/photon @@ -1 +1 @@ -Subproject commit 84ddfc0f586806373567faf75f45158076a4f133 +Subproject commit 49064168e6a546ef8c7408b5d0f5ee835fc7b9a7 diff --git a/sdk-libs/client/src/indexer/types/account.rs b/sdk-libs/client/src/indexer/types/account.rs index 3c0ab5eaa8..584eb4812b 100644 --- a/sdk-libs/client/src/indexer/types/account.rs +++ b/sdk-libs/client/src/indexer/types/account.rs @@ -92,10 +92,15 @@ impl TryFrom<&photon_api::types::AccountV2> for CompressedAccount { fn try_from(account: &photon_api::types::AccountV2) -> Result { let data = if let Some(data) = &account.data { + let disc_len = *data.discriminator_length as usize; + let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?; + // Strip the discriminator prefix — photon now sends combined + // (disc + payload) but CompressedAccountData.data is payload-only. + let payload = full_data[disc_len..].to_vec(); Ok::, IndexerError>(Some(CompressedAccountData { discriminator: (*data.discriminator).to_le_bytes(), - data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?, + data: payload, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, })) } else { @@ -149,10 +154,13 @@ impl TryFrom<&photon_api::types::Account> for CompressedAccount { fn try_from(account: &photon_api::types::Account) -> Result { let data = if let Some(data) = &account.data { + let disc_len = *data.discriminator_length as usize; + let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?; + let payload = full_data[disc_len..].to_vec(); Ok::, IndexerError>(Some(CompressedAccountData { discriminator: (*data.discriminator).to_le_bytes(), - data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?, + data: payload, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, })) } else { diff --git a/sdk-libs/client/src/indexer/types/interface.rs b/sdk-libs/client/src/indexer/types/interface.rs index 61d8d109aa..8cef0170a0 100644 --- a/sdk-libs/client/src/indexer/types/interface.rs +++ b/sdk-libs/client/src/indexer/types/interface.rs @@ -57,13 +57,18 @@ fn decode_tree_info_v2( } /// Decode cold data from photon_api AccountData format. +/// Photon sends combined (disc + payload) in the `data` field; +/// strip the discriminator prefix so `ColdData.data` is payload-only. fn decode_account_data(data: &photon_api::types::AccountData) -> Result { let disc_val = *data.discriminator; let discriminator = disc_val.to_le_bytes(); + let disc_len = *data.discriminator_length as usize; + let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?; + let payload = full_data[disc_len..].to_vec(); Ok(ColdData { discriminator, - data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?, + data: payload, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, }) } diff --git a/sdk-libs/photon-api/src/codegen.rs b/sdk-libs/photon-api/src/codegen.rs index 4dd88bda05..2f50543ca7 100644 --- a/sdk-libs/photon-api/src/codegen.rs +++ b/sdk-libs/photon-api/src/codegen.rs @@ -200,7 +200,8 @@ All endpoints return AccountV2.*/ /// "required": [ /// "data", /// "dataHash", - /// "discriminator" + /// "discriminator", + /// "discriminatorLength" /// ], /// "properties": { /// "data": { @@ -211,6 +212,9 @@ All endpoints return AccountV2.*/ /// }, /// "discriminator": { /// "$ref": "#/components/schemas/UnsignedInteger" + /// }, + /// "discriminatorLength": { + /// "$ref": "#/components/schemas/UnsignedInteger" /// } /// }, /// "additionalProperties": false @@ -224,6 +228,8 @@ All endpoints return AccountV2.*/ #[serde(rename = "dataHash")] pub data_hash: Hash, pub discriminator: UnsignedInteger, + #[serde(rename = "discriminatorLength")] + pub discriminator_length: UnsignedInteger, } impl AccountData { pub fn builder() -> builder::AccountData { @@ -28763,13 +28769,22 @@ All endpoints return AccountV2.*/ super::UnsignedInteger, ::std::string::String, >, + discriminator_length: ::std::result::Result< + super::UnsignedInteger, + ::std::string::String, + >, } impl ::std::default::Default for AccountData { fn default() -> Self { Self { data: Err("no value supplied for data".to_string()), data_hash: Err("no value supplied for data_hash".to_string()), - discriminator: Err("no value supplied for discriminator".to_string()), + discriminator: Err( + "no value supplied for discriminator".to_string(), + ), + discriminator_length: Err( + "no value supplied for discriminator_length".to_string(), + ), } } } @@ -28810,6 +28825,20 @@ All endpoints return AccountV2.*/ }); self } + pub fn discriminator_length(mut self, value: T) -> Self + where + T: ::std::convert::TryInto, + T::Error: ::std::fmt::Display, + { + self.discriminator_length = value + .try_into() + .map_err(|e| { + format!( + "error converting supplied value for discriminator_length: {e}" + ) + }); + self + } } impl ::std::convert::TryFrom for super::AccountData { type Error = super::error::ConversionError; @@ -28820,6 +28849,7 @@ All endpoints return AccountV2.*/ data: value.data?, data_hash: value.data_hash?, discriminator: value.discriminator?, + discriminator_length: value.discriminator_length?, }) } } @@ -28829,6 +28859,7 @@ All endpoints return AccountV2.*/ data: Ok(value.data), data_hash: Ok(value.data_hash), discriminator: Ok(value.discriminator), + discriminator_length: Ok(value.discriminator_length), } } } From 2a6716fbb9157c040cd8b1434f93ce9940f13737 Mon Sep 17 00:00:00 2001 From: Sergey Timoshin Date: Sun, 15 Feb 2026 21:34:08 +0000 Subject: [PATCH 3/3] chore: update photon subproject and refactor account data handling to remove discriminator length --- external/photon | 2 +- sdk-libs/client/src/indexer/types/account.rs | 16 +++------ .../client/src/indexer/types/interface.rs | 9 ++--- sdk-libs/photon-api/src/codegen.rs | 35 ++----------------- 4 files changed, 9 insertions(+), 53 deletions(-) diff --git a/external/photon b/external/photon index 49064168e6..84ddfc0f58 160000 --- a/external/photon +++ b/external/photon @@ -1 +1 @@ -Subproject commit 49064168e6a546ef8c7408b5d0f5ee835fc7b9a7 +Subproject commit 84ddfc0f586806373567faf75f45158076a4f133 diff --git a/sdk-libs/client/src/indexer/types/account.rs b/sdk-libs/client/src/indexer/types/account.rs index 584eb4812b..3c0ab5eaa8 100644 --- a/sdk-libs/client/src/indexer/types/account.rs +++ b/sdk-libs/client/src/indexer/types/account.rs @@ -92,15 +92,10 @@ impl TryFrom<&photon_api::types::AccountV2> for CompressedAccount { fn try_from(account: &photon_api::types::AccountV2) -> Result { let data = if let Some(data) = &account.data { - let disc_len = *data.discriminator_length as usize; - let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?; - // Strip the discriminator prefix — photon now sends combined - // (disc + payload) but CompressedAccountData.data is payload-only. - let payload = full_data[disc_len..].to_vec(); Ok::, IndexerError>(Some(CompressedAccountData { discriminator: (*data.discriminator).to_le_bytes(), - data: payload, + data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, })) } else { @@ -154,13 +149,10 @@ impl TryFrom<&photon_api::types::Account> for CompressedAccount { fn try_from(account: &photon_api::types::Account) -> Result { let data = if let Some(data) = &account.data { - let disc_len = *data.discriminator_length as usize; - let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?; - let payload = full_data[disc_len..].to_vec(); Ok::, IndexerError>(Some(CompressedAccountData { discriminator: (*data.discriminator).to_le_bytes(), - data: payload, + data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, })) } else { diff --git a/sdk-libs/client/src/indexer/types/interface.rs b/sdk-libs/client/src/indexer/types/interface.rs index 8cef0170a0..61d8d109aa 100644 --- a/sdk-libs/client/src/indexer/types/interface.rs +++ b/sdk-libs/client/src/indexer/types/interface.rs @@ -57,18 +57,13 @@ fn decode_tree_info_v2( } /// Decode cold data from photon_api AccountData format. -/// Photon sends combined (disc + payload) in the `data` field; -/// strip the discriminator prefix so `ColdData.data` is payload-only. fn decode_account_data(data: &photon_api::types::AccountData) -> Result { let disc_val = *data.discriminator; let discriminator = disc_val.to_le_bytes(); - let disc_len = *data.discriminator_length as usize; - let full_data = base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) - .map_err(|e| IndexerError::decode_error("data", e))?; - let payload = full_data[disc_len..].to_vec(); Ok(ColdData { discriminator, - data: payload, + data: base64::decode_config(&*data.data, base64::STANDARD_NO_PAD) + .map_err(|e| IndexerError::decode_error("data", e))?, data_hash: decode_base58_to_fixed_array(&data.data_hash)?, }) } diff --git a/sdk-libs/photon-api/src/codegen.rs b/sdk-libs/photon-api/src/codegen.rs index 2f50543ca7..4dd88bda05 100644 --- a/sdk-libs/photon-api/src/codegen.rs +++ b/sdk-libs/photon-api/src/codegen.rs @@ -200,8 +200,7 @@ All endpoints return AccountV2.*/ /// "required": [ /// "data", /// "dataHash", - /// "discriminator", - /// "discriminatorLength" + /// "discriminator" /// ], /// "properties": { /// "data": { @@ -212,9 +211,6 @@ All endpoints return AccountV2.*/ /// }, /// "discriminator": { /// "$ref": "#/components/schemas/UnsignedInteger" - /// }, - /// "discriminatorLength": { - /// "$ref": "#/components/schemas/UnsignedInteger" /// } /// }, /// "additionalProperties": false @@ -228,8 +224,6 @@ All endpoints return AccountV2.*/ #[serde(rename = "dataHash")] pub data_hash: Hash, pub discriminator: UnsignedInteger, - #[serde(rename = "discriminatorLength")] - pub discriminator_length: UnsignedInteger, } impl AccountData { pub fn builder() -> builder::AccountData { @@ -28769,22 +28763,13 @@ All endpoints return AccountV2.*/ super::UnsignedInteger, ::std::string::String, >, - discriminator_length: ::std::result::Result< - super::UnsignedInteger, - ::std::string::String, - >, } impl ::std::default::Default for AccountData { fn default() -> Self { Self { data: Err("no value supplied for data".to_string()), data_hash: Err("no value supplied for data_hash".to_string()), - discriminator: Err( - "no value supplied for discriminator".to_string(), - ), - discriminator_length: Err( - "no value supplied for discriminator_length".to_string(), - ), + discriminator: Err("no value supplied for discriminator".to_string()), } } } @@ -28825,20 +28810,6 @@ All endpoints return AccountV2.*/ }); self } - pub fn discriminator_length(mut self, value: T) -> Self - where - T: ::std::convert::TryInto, - T::Error: ::std::fmt::Display, - { - self.discriminator_length = value - .try_into() - .map_err(|e| { - format!( - "error converting supplied value for discriminator_length: {e}" - ) - }); - self - } } impl ::std::convert::TryFrom for super::AccountData { type Error = super::error::ConversionError; @@ -28849,7 +28820,6 @@ All endpoints return AccountV2.*/ data: value.data?, data_hash: value.data_hash?, discriminator: value.discriminator?, - discriminator_length: value.discriminator_length?, }) } } @@ -28859,7 +28829,6 @@ All endpoints return AccountV2.*/ data: Ok(value.data), data_hash: Ok(value.data_hash), discriminator: Ok(value.discriminator), - discriminator_length: Ok(value.discriminator_length), } } }