Calculate log index from transaction itself

ameten/scraper-sealevel-e2e
Danil Nemirovsky 2 weeks ago
parent 8ce4aaf16f
commit ff41bad7e2
  1. 22
      rust/main/chains/hyperlane-sealevel/src/interchain_gas.rs
  2. 39
      rust/main/chains/hyperlane-sealevel/src/log_meta_composer.rs
  3. 18
      rust/main/chains/hyperlane-sealevel/src/mailbox.rs

@ -12,7 +12,7 @@ use tracing::{info, instrument};
use hyperlane_core::{ use hyperlane_core::{
config::StrOrIntParseError, ChainCommunicationError, ChainResult, ContractLocator, config::StrOrIntParseError, ChainCommunicationError, ChainResult, ContractLocator,
HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexed, Indexer, HyperlaneChain, HyperlaneContract, HyperlaneDomain, HyperlaneProvider, Indexed, Indexer,
InterchainGasPaymaster, InterchainGasPayment, LogMeta, SequenceAwareIndexer, H256, U256, InterchainGasPaymaster, InterchainGasPayment, LogMeta, SequenceAwareIndexer, H256,
}; };
use crate::account::{search_accounts_by_discriminator, search_and_validate_account}; use crate::account::{search_accounts_by_discriminator, search_and_validate_account};
@ -150,10 +150,19 @@ impl SealevelInterchainGasPaymasterIndexer {
self.interchain_payment_account(account) self.interchain_payment_account(account)
})?; })?;
self.sealevel_gas_payment(sequence_number, &valid_payment_pda_pubkey)
.await
}
async fn sealevel_gas_payment(
&self,
sequence_number: u64,
payment_pda_pubkey: &Pubkey,
) -> ChainResult<SealevelGasPayment> {
// Now that we have the valid gas payment PDA pubkey, we can get the full account data. // Now that we have the valid gas payment PDA pubkey, we can get the full account data.
let account = self let account = self
.rpc_client .rpc_client
.get_account_with_finalized_commitment(&valid_payment_pda_pubkey) .get_account_with_finalized_commitment(payment_pda_pubkey)
.await?; .await?;
let gas_payment_account = GasPaymentAccount::fetch(&mut account.data.as_ref()) let gas_payment_account = GasPaymentAccount::fetch(&mut account.data.as_ref())
.map_err(ChainCommunicationError::from_other)? .map_err(ChainCommunicationError::from_other)?
@ -169,11 +178,7 @@ impl SealevelInterchainGasPaymasterIndexer {
}; };
let log_meta = self let log_meta = self
.interchain_payment_log_meta( .interchain_payment_log_meta(payment_pda_pubkey, &gas_payment_account.slot)
U256::from(sequence_number),
&valid_payment_pda_pubkey,
&gas_payment_account.slot,
)
.await?; .await?;
Ok(SealevelGasPayment::new( Ok(SealevelGasPayment::new(
@ -189,14 +194,13 @@ impl SealevelInterchainGasPaymasterIndexer {
async fn interchain_payment_log_meta( async fn interchain_payment_log_meta(
&self, &self,
log_index: U256,
payment_pda_pubkey: &Pubkey, payment_pda_pubkey: &Pubkey,
payment_pda_slot: &Slot, payment_pda_slot: &Slot,
) -> ChainResult<LogMeta> { ) -> ChainResult<LogMeta> {
let block = self.rpc_client.get_block(*payment_pda_slot).await?; let block = self.rpc_client.get_block(*payment_pda_slot).await?;
self.log_meta_composer self.log_meta_composer
.log_meta(block, log_index, payment_pda_pubkey, payment_pda_slot) .log_meta(block, payment_pda_pubkey, payment_pda_slot)
.map_err(Into::<ChainCommunicationError>::into) .map_err(Into::<ChainCommunicationError>::into)
} }

@ -36,7 +36,6 @@ impl LogMetaComposer {
pub fn log_meta( pub fn log_meta(
&self, &self,
block: UiConfirmedBlock, block: UiConfirmedBlock,
log_index: U256,
pda_pubkey: &Pubkey, pda_pubkey: &Pubkey,
pda_slot: &Slot, pda_slot: &Slot,
) -> Result<LogMeta, HyperlaneSealevelError> { ) -> Result<LogMeta, HyperlaneSealevelError> {
@ -64,15 +63,17 @@ impl LogMetaComposer {
)))? )))?
} }
let (transaction_index, transaction_hash) = let (transaction_index, transaction_hash, program_index) = transaction_hashes
transaction_hashes .into_iter()
.into_iter() .next()
.next() .ok_or(HyperlaneSealevelError::NoTransactions(format!(
.ok_or(HyperlaneSealevelError::NoTransactions(format!(
"block which should contain {} transaction does not contain any after filtering", "block which should contain {} transaction does not contain any after filtering",
self.transaction_description, self.transaction_description,
)))?; )))?;
// Construct log index which will be increasing relative to block
let log_index = U256::from((transaction_index << 8) + (program_index as usize));
let log_meta = LogMeta { let log_meta = LogMeta {
address: self.program_id.to_bytes().into(), address: self.program_id.to_bytes().into(),
block_number: *pda_slot, block_number: *pda_slot,
@ -120,7 +121,8 @@ pub fn is_interchain_payment_instruction(instruction_data: &[u8]) -> bool {
} }
/// This function searches for relevant transactions in the vector of provided transactions and /// This function searches for relevant transactions in the vector of provided transactions and
/// returns the relative index and hashes of such transactions. /// returns the relative index and hashes of such transactions together with index of the relevant
/// instruction.
/// ///
/// This function takes a program identifier and the identifier for PDA and searches transactions /// This function takes a program identifier and the identifier for PDA and searches transactions
/// which act upon this program and the PDA. /// which act upon this program and the PDA.
@ -144,16 +146,19 @@ fn search_transactions(
program_id: &Pubkey, program_id: &Pubkey,
pda_pubkey: &Pubkey, pda_pubkey: &Pubkey,
is_specified_instruction: fn(&[u8]) -> bool, is_specified_instruction: fn(&[u8]) -> bool,
) -> Vec<(usize, H512)> { ) -> Vec<(usize, H512, u8)> {
transactions transactions
.into_iter() .into_iter()
.enumerate() .enumerate()
.filter_map(|(index, tx)| filter_by_encoding(tx).map(|(tx, meta)| (index, tx, meta))) .filter_map(|(txn_index, tx)| {
.filter_map(|(index, tx, meta)| { filter_by_encoding(tx).map(|(tx, meta)| (txn_index, tx, meta))
filter_by_validity(tx, meta) })
.map(|(hash, account_keys, instructions)| (index, hash, account_keys, instructions)) .filter_map(|(txn_index, tx, meta)| {
filter_by_validity(tx, meta).map(|(hash, account_keys, instructions)| {
(txn_index, hash, account_keys, instructions)
})
}) })
.filter_map(|(index, hash, account_keys, instructions)| { .filter_map(|(txn_index, hash, account_keys, instructions)| {
filter_by_relevancy( filter_by_relevancy(
program_id, program_id,
pda_pubkey, pda_pubkey,
@ -162,9 +167,9 @@ fn search_transactions(
instructions, instructions,
is_specified_instruction, is_specified_instruction,
) )
.map(|hash| (index, hash)) .map(|(hash, program_index)| (txn_index, hash, program_index))
}) })
.collect::<Vec<(usize, H512)>>() .collect::<Vec<(usize, H512, u8)>>()
} }
fn filter_by_relevancy( fn filter_by_relevancy(
@ -174,7 +179,7 @@ fn filter_by_relevancy(
account_keys: Vec<String>, account_keys: Vec<String>,
instructions: Vec<UiCompiledInstruction>, instructions: Vec<UiCompiledInstruction>,
is_specified_instruction: fn(&[u8]) -> bool, is_specified_instruction: fn(&[u8]) -> bool,
) -> Option<H512> { ) -> Option<(H512, u8)> {
let account_index_map = account_index_map(account_keys); let account_index_map = account_index_map(account_keys);
let program_id_str = program_id.to_string(); let program_id_str = program_id.to_string();
@ -213,7 +218,7 @@ fn filter_by_relevancy(
return None; return None;
} }
Some(hash) Some((hash, program.program_id_index))
} }
fn filter_by_validity( fn filter_by_validity(

@ -718,7 +718,6 @@ impl SealevelMailboxIndexer {
let log_meta = self let log_meta = self
.dispatch_message_log_meta( .dispatch_message_log_meta(
U256::from(nonce),
&valid_message_storage_pda_pubkey, &valid_message_storage_pda_pubkey,
&dispatched_message_account.slot, &dispatched_message_account.slot,
) )
@ -743,7 +742,6 @@ impl SealevelMailboxIndexer {
async fn dispatch_message_log_meta( async fn dispatch_message_log_meta(
&self, &self,
log_index: U256,
message_storage_pda_pubkey: &Pubkey, message_storage_pda_pubkey: &Pubkey,
message_account_slot: &Slot, message_account_slot: &Slot,
) -> ChainResult<LogMeta> { ) -> ChainResult<LogMeta> {
@ -755,12 +753,7 @@ impl SealevelMailboxIndexer {
.await?; .await?;
self.dispatch_message_log_meta_composer self.dispatch_message_log_meta_composer
.log_meta( .log_meta(block, message_storage_pda_pubkey, message_account_slot)
block,
log_index,
message_storage_pda_pubkey,
message_account_slot,
)
.map_err(Into::<ChainCommunicationError>::into) .map_err(Into::<ChainCommunicationError>::into)
} }
@ -800,7 +793,6 @@ impl SealevelMailboxIndexer {
let log_meta = self let log_meta = self
.delivered_message_log_meta( .delivered_message_log_meta(
U256::from(nonce),
&valid_message_storage_pda_pubkey, &valid_message_storage_pda_pubkey,
&delivered_message_account.slot, &delivered_message_account.slot,
) )
@ -823,7 +815,6 @@ impl SealevelMailboxIndexer {
async fn delivered_message_log_meta( async fn delivered_message_log_meta(
&self, &self,
log_index: U256,
message_storage_pda_pubkey: &Pubkey, message_storage_pda_pubkey: &Pubkey,
message_account_slot: &Slot, message_account_slot: &Slot,
) -> ChainResult<LogMeta> { ) -> ChainResult<LogMeta> {
@ -835,12 +826,7 @@ impl SealevelMailboxIndexer {
.await?; .await?;
self.delivery_message_log_meta_composer self.delivery_message_log_meta_composer
.log_meta( .log_meta(block, message_storage_pda_pubkey, message_account_slot)
block,
log_index,
message_storage_pda_pubkey,
message_account_slot,
)
.map_err(Into::<ChainCommunicationError>::into) .map_err(Into::<ChainCommunicationError>::into)
} }
} }

Loading…
Cancel
Save