-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathnoop.rs
More file actions
121 lines (106 loc) · 3.7 KB
/
noop.rs
File metadata and controls
121 lines (106 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//! Noop/stub trait implementations for the mock `Chain`.
//!
//! These types satisfy the trait bounds required by the `Chain` constructor
//! but are never called during normal test execution because:
//! - Triggers are provided directly via `StaticStreamBuilder` (no scanning needed)
//! - The real `EthereumRuntimeAdapterBuilder` is used for host functions
//! (ethereum.call, ethereum.getBalance, ethereum.hasCode), backed by the call cache
use async_trait::async_trait;
use graph::blockchain::block_stream::{BlockRefetcher, BlockWithTriggers, FirehoseCursor};
use graph::blockchain::{BlockPtr, Blockchain, TriggersAdapter, TriggersAdapterSelector};
use graph::components::store::DeploymentLocator;
use graph::prelude::{BlockHash, BlockNumber, Error};
use graph::slog::{Discard, Logger};
use std::collections::BTreeSet;
use std::marker::PhantomData;
use std::sync::Arc;
use graph::slog::o;
/// No-op block refetcher. Tests have no reorgs, so refetching is never needed.
pub(super) struct StaticBlockRefetcher<C: Blockchain> {
pub _phantom: PhantomData<C>,
}
#[async_trait]
impl<C: Blockchain> BlockRefetcher<C> for StaticBlockRefetcher<C> {
fn required(&self, _chain: &C) -> bool {
false
}
async fn get_block(
&self,
_chain: &C,
_logger: &Logger,
_cursor: FirehoseCursor,
) -> Result<C::Block, Error> {
Err(anyhow::anyhow!(
"StaticBlockRefetcher::get_block should never be called — block refetching is disabled in test mode"
))
}
}
pub(super) struct NoopAdapterSelector<C> {
pub _phantom: PhantomData<C>,
}
impl<C: Blockchain> TriggersAdapterSelector<C> for NoopAdapterSelector<C> {
fn triggers_adapter(
&self,
_loc: &DeploymentLocator,
_capabilities: &<C as Blockchain>::NodeCapabilities,
_unified_api_version: graph::data::subgraph::UnifiedMappingApiVersion,
) -> Result<Arc<dyn TriggersAdapter<C>>, Error> {
Ok(Arc::new(NoopTriggersAdapter {
_phantom: PhantomData,
}))
}
}
/// Returns empty/default results. Never called since triggers come from `StaticStreamBuilder`.
struct NoopTriggersAdapter<C: Blockchain> {
_phantom: PhantomData<C>,
}
#[async_trait]
impl<C: Blockchain> TriggersAdapter<C> for NoopTriggersAdapter<C> {
async fn ancestor_block(
&self,
_ptr: BlockPtr,
_offset: BlockNumber,
_root: Option<BlockHash>,
) -> Result<Option<<C as Blockchain>::Block>, Error> {
Ok(None)
}
async fn load_block_ptrs_by_numbers(
&self,
_logger: Logger,
_block_numbers: BTreeSet<BlockNumber>,
) -> Result<Vec<C::Block>, Error> {
Ok(vec![])
}
async fn chain_head_ptr(&self) -> Result<Option<BlockPtr>, Error> {
Ok(None)
}
async fn scan_triggers(
&self,
_from: BlockNumber,
_to: BlockNumber,
_filter: &C::TriggerFilter,
) -> Result<(Vec<BlockWithTriggers<C>>, BlockNumber), Error> {
Ok((vec![], 0))
}
async fn triggers_in_block(
&self,
_logger: &Logger,
block: <C as Blockchain>::Block,
_filter: &<C as Blockchain>::TriggerFilter,
) -> Result<BlockWithTriggers<C>, Error> {
let logger = Logger::root(Discard, o!());
Ok(BlockWithTriggers::new(block, Vec::new(), &logger))
}
async fn is_on_main_chain(&self, _ptr: BlockPtr) -> Result<Option<BlockPtr>, Error> {
Ok(None)
}
async fn parent_ptr(&self, block: &BlockPtr) -> Result<Option<BlockPtr>, Error> {
match block.number {
0 => Ok(None),
n => Ok(Some(BlockPtr {
hash: BlockHash::default(),
number: n - 1,
})),
}
}
}