|
1 |
| -use anyhow::anyhow; |
2 | 1 | use clap::Parser;
|
3 |
| -use config::PoolConfig; |
4 |
| -use oura::{ |
5 |
| - filters::selection::{self, Predicate}, |
6 |
| - mapper, |
7 |
| - model::EventData, |
8 |
| - pipelining::{FilterProvider, SourceProvider, StageReceiver}, |
9 |
| - sources::{n2n, AddressArg, BearerKind, IntersectArg, MagicArg, PointArg}, |
10 |
| - utils::{ChainWellKnownInfo, Utils, WithUtils}, |
11 |
| -}; |
12 |
| -use std::{fs, str::FromStr, sync::Arc, thread::JoinHandle}; |
| 2 | +use std::fs; |
13 | 3 | use tracing_subscriber::prelude::*;
|
14 | 4 |
|
15 | 5 | mod config;
|
| 6 | +mod setup; |
| 7 | +mod sink; |
16 | 8 |
|
17 | 9 | #[derive(Parser, Debug)]
|
18 | 10 | #[command(version)]
|
@@ -45,113 +37,7 @@ async fn main() -> anyhow::Result<()> {
|
45 | 37 | .with(filter)
|
46 | 38 | .init();
|
47 | 39 |
|
48 |
| - let (_handles, input) = oura_bootstrap(args.start, args.socket)?; |
49 |
| - start(input, &config.pools).await?; |
| 40 | + let (_handles, input) = setup::oura_bootstrap(args.start, args.socket)?; |
| 41 | + sink::start(input, &config.pools).await?; |
50 | 42 | Ok(())
|
51 | 43 | }
|
52 |
| - |
53 |
| -pub async fn start(input: StageReceiver, pools: &[PoolConfig]) -> anyhow::Result<()> { |
54 |
| - tracing::info!("Starting"); |
55 |
| - loop { |
56 |
| - let event = input.recv()?; |
57 |
| - |
58 |
| - match &event.data { |
59 |
| - EventData::Transaction(transaction_record) => { |
60 |
| - if let Some(outputs) = &transaction_record.outputs { |
61 |
| - let mut pool = None; |
62 |
| - for output in outputs { |
63 |
| - pool = pool.or_else(|| pools.iter().find(|p| p.address == output.address)); |
64 |
| - } |
65 |
| - if let Some(pool) = pool { |
66 |
| - tracing::info!("Found transaction for addr: {}", pool.address); |
67 |
| - for output in outputs { |
68 |
| - tracing::info!( |
69 |
| - "Address: {} {}, {:?}", |
70 |
| - output.address, |
71 |
| - output.amount, |
72 |
| - output.assets |
73 |
| - ); |
74 |
| - } |
75 |
| - } |
76 |
| - } |
77 |
| - } |
78 |
| - _ => { |
79 |
| - tracing::info!("{:?}", event.data); |
80 |
| - } |
81 |
| - } |
82 |
| - } |
83 |
| -} |
84 |
| - |
85 |
| -pub fn oura_bootstrap( |
86 |
| - start_block: Option<String>, |
87 |
| - socket: String, |
88 |
| -) -> anyhow::Result<(Vec<JoinHandle<()>>, StageReceiver)> { |
89 |
| - let magic = MagicArg::from_str("mainnet").unwrap(); |
90 |
| - |
91 |
| - let well_known = ChainWellKnownInfo::try_from_magic(*magic) |
92 |
| - .map_err(|_| anyhow!("chain well known info failed"))?; |
93 |
| - |
94 |
| - let utils = Arc::new(Utils::new(well_known)); |
95 |
| - |
96 |
| - let mapper = mapper::Config { |
97 |
| - include_transaction_details: true, |
98 |
| - include_block_cbor: true, |
99 |
| - ..Default::default() |
100 |
| - }; |
101 |
| - |
102 |
| - let intersect = match start_block { |
103 |
| - Some(s) => { |
104 |
| - let (slot, hash) = match s.split_once(':') { |
105 |
| - Some((s, h)) => (s.parse::<u64>()?, h), |
106 |
| - None => return Err(anyhow!("invalid start")), |
107 |
| - }; |
108 |
| - println!("{} {}", slot, hash); |
109 |
| - Some(IntersectArg::Point(PointArg(slot, hash.to_string()))) |
110 |
| - } |
111 |
| - None => None, |
112 |
| - }; |
113 |
| - |
114 |
| - #[allow(deprecated)] |
115 |
| - let source_config = n2n::Config { |
116 |
| - address: if socket.contains(':') { |
117 |
| - AddressArg(BearerKind::Tcp, socket) |
118 |
| - } else { |
119 |
| - AddressArg(BearerKind::Unix, socket) |
120 |
| - }, |
121 |
| - magic: Some(magic), |
122 |
| - well_known: None, |
123 |
| - mapper, |
124 |
| - since: None, |
125 |
| - min_depth: 0, |
126 |
| - intersect, |
127 |
| - retry_policy: None, |
128 |
| - finalize: None, // TODO: configurable |
129 |
| - }; |
130 |
| - |
131 |
| - let source_setup = WithUtils::new(source_config, utils); |
132 |
| - |
133 |
| - let check = Predicate::VariantIn(vec![String::from("Transaction")]); |
134 |
| - |
135 |
| - let filter_setup = selection::Config { check }; |
136 |
| - |
137 |
| - let mut handles = Vec::new(); |
138 |
| - |
139 |
| - tracing::info!("{}", "Attempting to connect to node..."); |
140 |
| - |
141 |
| - let (source_handle, source_rx) = source_setup.bootstrap().map_err(|e| { |
142 |
| - tracing::error!("{}", e); |
143 |
| - anyhow!("failed to bootstrap source. Are you sure cardano-node is running?") |
144 |
| - })?; |
145 |
| - |
146 |
| - tracing::info!("{}", "Connection to node established"); |
147 |
| - |
148 |
| - handles.push(source_handle); |
149 |
| - |
150 |
| - let (filter_handle, filter_rx) = filter_setup |
151 |
| - .bootstrap(source_rx) |
152 |
| - .map_err(|_| anyhow!("failed to bootstrap filter"))?; |
153 |
| - |
154 |
| - handles.push(filter_handle); |
155 |
| - |
156 |
| - Ok((handles, filter_rx)) |
157 |
| -} |
0 commit comments