Skip to content

Commit 3f627c7

Browse files
authored
chain/ethereum: Fix POI inconsistencies in receipt handling (#6200)
1 parent 9426ef6 commit 3f627c7

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

chain/ethereum/src/ethereum_adapter.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use std::time::Instant;
5858
use crate::adapter::EthereumRpcError;
5959
use crate::adapter::ProviderStatus;
6060
use crate::chain::BlockFinality;
61-
use crate::trigger::LogRef;
61+
use crate::trigger::{LogPosition, LogRef};
6262
use crate::Chain;
6363
use crate::NodeCapabilities;
6464
use crate::TriggerFilter;
@@ -1978,8 +1978,24 @@ pub(crate) fn parse_log_triggers(
19781978
.transaction_receipts
19791979
.iter()
19801980
.flat_map(move |receipt| {
1981-
receipt.logs.iter().enumerate().map(move |(index, _)| {
1982-
EthereumTrigger::Log(LogRef::LogPosition(index, receipt.cheap_clone()))
1981+
receipt.logs.iter().enumerate().map(move |(index, log)| {
1982+
let requires_transaction_receipt = log
1983+
.topics
1984+
.first()
1985+
.map(|signature| {
1986+
log_filter.requires_transaction_receipt(
1987+
signature,
1988+
Some(&log.address),
1989+
&log.topics,
1990+
)
1991+
})
1992+
.unwrap_or(false);
1993+
1994+
EthereumTrigger::Log(LogRef::LogPosition(LogPosition {
1995+
index,
1996+
receipt: receipt.cheap_clone(),
1997+
requires_transaction_receipt,
1998+
}))
19831999
})
19842000
})
19852001
.collect()

chain/ethereum/src/trigger.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,24 +235,43 @@ impl ToAscPtr for MappingTrigger {
235235
}
236236
}
237237

238+
#[derive(Clone, Debug)]
239+
pub struct LogPosition {
240+
pub index: usize,
241+
pub receipt: Arc<TransactionReceipt>,
242+
pub requires_transaction_receipt: bool,
243+
}
244+
238245
#[derive(Clone, Debug)]
239246
pub enum LogRef {
240247
FullLog(Arc<Log>, Option<Arc<TransactionReceipt>>),
241-
LogPosition(usize, Arc<TransactionReceipt>),
248+
LogPosition(LogPosition),
242249
}
243250

244251
impl LogRef {
245252
pub fn log(&self) -> &Log {
246253
match self {
247254
LogRef::FullLog(log, _) => log.as_ref(),
248-
LogRef::LogPosition(index, receipt) => receipt.logs.get(*index).unwrap(),
255+
LogRef::LogPosition(pos) => pos.receipt.logs.get(pos.index).unwrap(),
249256
}
250257
}
251258

259+
/// Returns the transaction receipt if it's available and required.
260+
///
261+
/// For `FullLog` variants, returns the receipt if present.
262+
/// For `LogPosition` variants, only returns the receipt if the
263+
/// `requires_transaction_receipt` flag is true, otherwise returns None
264+
/// even though the receipt is stored internally.
252265
pub fn receipt(&self) -> Option<&Arc<TransactionReceipt>> {
253266
match self {
254267
LogRef::FullLog(_, receipt) => receipt.as_ref(),
255-
LogRef::LogPosition(_, receipt) => Some(receipt),
268+
LogRef::LogPosition(pos) => {
269+
if pos.requires_transaction_receipt {
270+
Some(&pos.receipt)
271+
} else {
272+
None
273+
}
274+
}
256275
}
257276
}
258277

0 commit comments

Comments
 (0)