diff --git a/rust/processor/src/db/parquet/models/user_transaction_models/parquet_signatures.rs b/rust/processor/src/db/parquet/models/user_transaction_models/parquet_signatures.rs index 51b7deb3f..133e5f484 100644 --- a/rust/processor/src/db/parquet/models/user_transaction_models/parquet_signatures.rs +++ b/rust/processor/src/db/parquet/models/user_transaction_models/parquet_signatures.rs @@ -13,9 +13,11 @@ use aptos_protos::transaction::v1::{ FeePayerSignature as ProtoFeePayerSignature, MultiAgentSignature as ProtoMultiAgentSignature, MultiEd25519Signature as MultiEd25519SignaturePb, MultiKeySignature as MultiKeySignaturePb, Signature as TransactionSignaturePb, SingleKeySignature as SingleKeySignaturePb, + AbstractionSignature as AbstractionSignaturePb, SingleSender as SingleSenderPb, }; use serde::{Deserialize, Serialize}; +use tracing::warn; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Signature { @@ -80,6 +82,10 @@ impl Signature { } pub fn get_signature_type(t: &TransactionSignaturePb) -> String { + if t.signature.is_none() { + warn!("Transaction signature is unknown"); + return String::from("unknown"); + } match t.signature.as_ref().unwrap() { SignatureEnum::Ed25519(_) => String::from("ed25519_signature"), SignatureEnum::MultiEd25519(_) => String::from("multi_ed25519_signature"), @@ -87,6 +93,10 @@ impl Signature { SignatureEnum::FeePayer(_) => String::from("fee_payer_signature"), SignatureEnum::SingleSender(sender) => { let account_signature = sender.sender.as_ref().unwrap(); + if account_signature.signature.is_none() { + warn!("Transaction signature is unknown"); + return String::from("unknown"); + } let signature = account_signature.signature.as_ref().unwrap(); match signature { AccountSignatureEnum::Ed25519(_) => String::from("ed25519_signature"), @@ -99,6 +109,7 @@ impl Signature { AccountSignatureEnum::MultiKeySignature(_) => { String::from("multi_key_signature") }, + AccountSignatureEnum::Abstraction(_) => String::from("abstraction_signature"), } }, } @@ -145,6 +156,30 @@ impl Signature { } } + fn parse_abstraction_signature( + _s: &AbstractionSignaturePb, + sender: &String, + transaction_version: i64, + transaction_block_height: i64, + is_sender_primary: bool, + multi_agent_index: i64, + override_address: Option<&String>, + ) -> Self { + let signer = standardize_address(override_address.unwrap_or(sender)); + Self { + txn_version: transaction_version, + transaction_block_height, + signer, + is_sender_primary, + type_: String::from("abstraction_signature"), + public_key: "Not implemented".into(), + threshold: 1, + signature: "Not implemented".into(), + multi_agent_index, + multi_sig_index: 0, + } + } + fn parse_multi_ed25519_signature( s: &MultiEd25519SignaturePb, sender: &String, @@ -263,6 +298,12 @@ impl Signature { multi_agent_index: i64, override_address: Option<&String>, ) -> Vec { + if s.signature.is_none() { + warn!( + transaction_version = transaction_version, + "Transaction signature is unknown"); + return vec![]; + } let signature = s.signature.as_ref().unwrap(); match signature { AccountSignatureEnum::Ed25519(sig) => vec![Self::parse_ed25519_signature( @@ -303,6 +344,15 @@ impl Signature { multi_agent_index, override_address, ), + AccountSignatureEnum::Abstraction(sig) => vec![Self::parse_abstraction_signature( + sig, + sender, + transaction_version, + transaction_block_height, + is_sender_primary, + multi_agent_index, + override_address, + )], } } @@ -494,6 +544,10 @@ impl Signature { transaction_version: i64, transaction_block_height: i64, ) -> Vec { + if s.sender.is_none() { + warn!("Transaction signature is unknown"); + return vec![]; + } let signature = s.sender.as_ref().unwrap(); match signature.signature.as_ref() { Some(AccountSignatureEnum::SingleKeySignature(s)) => { @@ -534,6 +588,15 @@ impl Signature { 0, None, ), + Some(AccountSignatureEnum::Abstraction(sig)) => vec![Self::parse_abstraction_signature( + sig, + sender, + transaction_version, + transaction_block_height, + true, + 0, + None, + )], None => vec![], } } diff --git a/rust/processor/src/db/postgres/models/account_restoration_models/account_restoration_utils.rs b/rust/processor/src/db/postgres/models/account_restoration_models/account_restoration_utils.rs index c548906e1..a9cf027cf 100644 --- a/rust/processor/src/db/postgres/models/account_restoration_models/account_restoration_utils.rs +++ b/rust/processor/src/db/postgres/models/account_restoration_models/account_restoration_utils.rs @@ -12,6 +12,7 @@ use aptos_protos::transaction::v1::{ account_signature::Signature as AccountSignature, signature::Signature, transaction::TxnData, Transaction, }; +use tracing::warn; trait AuthKeyScheme { const SCHEME: u8; @@ -265,7 +266,10 @@ impl SignatureInfo { }, Signature::SingleSender(single_sender) => { let account_signature = single_sender.sender.as_ref().unwrap(); - + if account_signature.signature.is_none() { + warn!("Transaction signature is unknown"); + return None; + } let signature_info = match account_signature.signature.as_ref().unwrap() { AccountSignature::Ed25519(sig) => Self::ed25519(sig.public_key.clone()), AccountSignature::MultiEd25519(sigs) => { @@ -301,6 +305,7 @@ impl SignatureInfo { .collect::>(); Self::multi_key(threshold, prefixes, public_keys, verified) }, + AccountSignature::Abstraction(_sig) => return None, }; signature_info }, diff --git a/rust/processor/src/db/postgres/models/user_transactions_models/signatures.rs b/rust/processor/src/db/postgres/models/user_transactions_models/signatures.rs index 0ff2ea1c1..9dda0eb2b 100644 --- a/rust/processor/src/db/postgres/models/user_transactions_models/signatures.rs +++ b/rust/processor/src/db/postgres/models/user_transactions_models/signatures.rs @@ -9,17 +9,11 @@ use crate::{ }; use anyhow::{Context, Result}; use aptos_protos::transaction::v1::{ - account_signature::Signature as AccountSignatureEnum, - any_signature::{SignatureVariant, Type as AnySignatureTypeEnumPb}, - signature::Signature as SignatureEnum, - AccountSignature as ProtoAccountSignature, Ed25519Signature as Ed25519SignaturePB, - FeePayerSignature as ProtoFeePayerSignature, MultiAgentSignature as ProtoMultiAgentSignature, - MultiEd25519Signature as MultiEd25519SignaturePb, MultiKeySignature as MultiKeySignaturePb, - Signature as TransactionSignaturePb, SingleKeySignature as SingleKeySignaturePb, - SingleSender as SingleSenderPb, + account_signature::Signature as AccountSignatureEnum, any_signature::{SignatureVariant, Type as AnySignatureTypeEnumPb}, signature::Signature as SignatureEnum, AbstractionSignature as AbstractionSignaturePb, AccountSignature as ProtoAccountSignature, Ed25519Signature as Ed25519SignaturePB, FeePayerSignature as ProtoFeePayerSignature, MultiAgentSignature as ProtoMultiAgentSignature, MultiEd25519Signature as MultiEd25519SignaturePb, MultiKeySignature as MultiKeySignaturePb, Signature as TransactionSignaturePb, SingleKeySignature as SingleKeySignaturePb, SingleSender as SingleSenderPb }; use field_count::FieldCount; use serde::{Deserialize, Serialize}; +use tracing::warn; #[derive(Clone, Debug, Deserialize, FieldCount, Identifiable, Insertable, Serialize)] #[diesel(primary_key( @@ -111,8 +105,12 @@ impl Signature { AccountSignatureEnum::MultiKeySignature(_) => { String::from("multi_key_signature") }, + AccountSignatureEnum::Abstraction(_) => { + String::from("abstraction_signature") + } } }, + } } @@ -158,6 +156,31 @@ impl Signature { } } + fn parse_abstraction_signature( + _s: &AbstractionSignaturePb, + sender: &String, + transaction_version: i64, + transaction_block_height: i64, + is_sender_primary: bool, + multi_agent_index: i64, + override_address: Option<&String>, + ) -> Self { + let signer = standardize_address(override_address.unwrap_or(sender)); + Self { + transaction_version, + transaction_block_height, + signer, + is_sender_primary, + type_: String::from("abstraction_signature"), + public_key: "Not implemented".into(), + threshold: 1, + public_key_indices: serde_json::Value::Array(vec![]), + signature: "Not implemented".into(), + multi_agent_index, + multi_sig_index: 0, + } + } + fn parse_multi_ed25519_signature( s: &MultiEd25519SignaturePb, sender: &String, @@ -284,6 +307,15 @@ impl Signature { multi_agent_index: i64, override_address: Option<&String>, ) -> Vec { + // Skip parsing if unknow signagure is found. + if s.signature.as_ref().is_none() { + warn!( + transaction_version=transaction_version, + "Unknown signature is found!" + ); + return vec![]; + } + let signature = s.signature.as_ref().unwrap(); match signature { AccountSignatureEnum::Ed25519(sig) => vec![Self::parse_ed25519_signature( @@ -324,6 +356,19 @@ impl Signature { multi_agent_index, override_address, ), + AccountSignatureEnum::Abstraction(sig) => { + vec![ + Self::parse_abstraction_signature( + sig, + sender, + transaction_version, + transaction_block_height, + is_sender_primary, + multi_agent_index, + override_address, + ) + ] + } } } @@ -528,6 +573,13 @@ impl Signature { transaction_block_height: i64, ) -> Vec { let signature = s.sender.as_ref().unwrap(); + if signature.signature.is_none() { + warn!( + transaction_version = transaction_version, + "Transaction signature is unknown" + ); + return vec![]; + } match signature.signature.as_ref() { Some(AccountSignatureEnum::SingleKeySignature(s)) => { vec![Self::parse_single_key_signature( @@ -567,6 +619,15 @@ impl Signature { 0, None, ), + Some(AccountSignatureEnum::Abstraction(s)) => vec![Self::parse_abstraction_signature( + s, + sender, + transaction_version, + transaction_block_height, + true, + 0, + None, + )], None => vec![], } }