@@ -19,8 +19,8 @@ use crate::{
19
19
const BATCH_SIZE : u64 = 100_000 ;
20
20
21
21
pub struct PangeaIndexer {
22
- pangea_client : Client < WsProvider > ,
23
- fuel_provider : Provider ,
22
+ pangea_host : String ,
23
+ provider : Provider ,
24
24
operation_tx : Sender < OperationMessage > ,
25
25
chain_id : ChainId ,
26
26
contract_h256 : H256 ,
@@ -36,37 +36,42 @@ impl PangeaIndexer {
36
36
"FUEL" => ChainId :: FUEL ,
37
37
_ => ChainId :: FUELTESTNET ,
38
38
} ;
39
-
40
- let username = env:: var ( "PANGEA_USERNAME" ) . unwrap ( ) ;
41
- let password = env:: var ( "PANGEA_PASSWORD" ) . unwrap ( ) ;
42
-
43
- let pangea_client = ClientBuilder :: default ( )
44
- . endpoint ( & config. pangea_host )
45
- . credential ( username, password)
46
- . build :: < WsProvider > ( )
47
- . await ?;
39
+ let pangea_host = config. pangea_host . clone ( ) ;
48
40
49
41
let provider_url = match chain_id {
50
42
ChainId :: FUEL => Ok ( "mainnet.fuel.network" ) ,
51
43
ChainId :: FUELTESTNET => Ok ( "testnet.fuel.network" ) ,
52
44
_ => Err ( Error :: InvalidChainId ) ,
53
45
} ?;
54
- let fuel_provider = Provider :: connect ( provider_url) . await ?;
46
+ let provider = Provider :: connect ( provider_url) . await ?;
55
47
56
48
log:: info!( "CHAIN: {:?}, PROVIDER: {:?}" , chain_id, provider_url) ;
57
49
58
50
Ok ( Self {
59
- pangea_client ,
60
- fuel_provider ,
51
+ pangea_host ,
52
+ provider ,
61
53
operation_tx,
62
54
chain_id,
63
55
contract_h256 : H256 :: from_str ( market_id) ?,
64
56
} )
65
57
}
66
58
59
+ pub async fn create_pangea_client ( & self ) -> Result < Client < WsProvider > , Error > {
60
+ let username = env:: var ( "PANGEA_USERNAME" ) . unwrap ( ) ;
61
+ let password = env:: var ( "PANGEA_PASSWORD" ) . unwrap ( ) ;
62
+
63
+ let pangea_client = ClientBuilder :: default ( )
64
+ . endpoint ( & self . pangea_host )
65
+ . credential ( username, password)
66
+ . build :: < WsProvider > ( )
67
+ . await ?;
68
+
69
+ Ok ( pangea_client)
70
+ }
71
+
67
72
pub async fn start ( & self , latest_processed_block : i64 ) -> Result < ( ) , Error > {
68
73
// Get latest block number from blockchain
69
- let latest_block = self . fuel_provider . latest_block_height ( ) . await . unwrap ( ) as i64 ;
74
+ let latest_block = self . provider . latest_block_height ( ) . await . unwrap ( ) as i64 ;
70
75
71
76
log:: info!( "Prune newest orders & trades" ) ;
72
77
self . prune ( latest_processed_block) . await ?;
@@ -107,6 +112,8 @@ impl PangeaIndexer {
107
112
mut latest_processed_block : i64 ,
108
113
to_block : i64 ,
109
114
) -> Result < i64 , Error > {
115
+ let client = self . create_pangea_client ( ) . await ?;
116
+
110
117
while latest_processed_block < to_block {
111
118
let to_block = ( latest_processed_block + BATCH_SIZE as i64 ) . min ( to_block) ;
112
119
@@ -118,8 +125,7 @@ impl PangeaIndexer {
118
125
..Default :: default ( )
119
126
} ;
120
127
121
- let stream = self
122
- . pangea_client
128
+ let stream = client
123
129
. get_fuel_spark_orders_by_format ( batch_request, Format :: JsonStream , false )
124
130
. await
125
131
. expect ( "Failed to get fuel spark orders batch" ) ;
@@ -168,46 +174,59 @@ impl PangeaIndexer {
168
174
let max_backoff = Duration :: from_secs ( 32 ) ;
169
175
170
176
loop {
171
- let deltas_request = GetSparkOrderRequest {
172
- from_block : Bound :: Exact ( latest_processed_block + 1 ) ,
173
- to_block : Bound :: Subscribe ,
174
- market_id__in : HashSet :: from ( [ self . contract_h256 ] ) ,
175
- chains : HashSet :: from ( [ self . chain_id ] ) ,
176
- ..Default :: default ( )
177
- } ;
178
-
179
- match self
180
- . pangea_client
181
- . get_fuel_spark_orders_by_format ( deltas_request, Format :: JsonStream , true )
182
- . await
183
- {
184
- Ok ( stream) => {
185
- backoff = Duration :: from_secs ( 1 ) ;
186
- futures:: pin_mut!( stream) ;
187
-
188
- while let Some ( data) = stream. next ( ) . await {
189
- match data {
190
- Ok ( data) => {
191
- let data = String :: from_utf8 ( data) ?;
192
- let event = serde_json:: from_str :: < PangeaEvent > ( & data) ?;
193
- latest_processed_block = event. block_number ;
194
-
195
- log:: debug!( "LATEST_PROCESSED_BLOCK: {}" , latest_processed_block) ;
196
-
197
- self . handle_event ( & event) . await ;
198
- self . operation_tx
199
- . send ( OperationMessage :: Dispatch ( latest_processed_block) )
200
- . unwrap ( ) ;
201
- }
202
- Err ( e) => {
203
- log:: error!( "Error in the stream of new orders (deltas): {e}" ) ;
204
- break ;
177
+ match self . create_pangea_client ( ) . await {
178
+ Ok ( client) => {
179
+ let deltas_request = GetSparkOrderRequest {
180
+ from_block : Bound :: Exact ( latest_processed_block + 1 ) ,
181
+ to_block : Bound :: Subscribe ,
182
+ market_id__in : HashSet :: from ( [ self . contract_h256 ] ) ,
183
+ chains : HashSet :: from ( [ self . chain_id ] ) ,
184
+ ..Default :: default ( )
185
+ } ;
186
+
187
+ match client
188
+ . get_fuel_spark_orders_by_format ( deltas_request, Format :: JsonStream , true )
189
+ . await
190
+ {
191
+ Ok ( stream) => {
192
+ backoff = Duration :: from_secs ( 1 ) ;
193
+ futures:: pin_mut!( stream) ;
194
+
195
+ while let Some ( data) = stream. next ( ) . await {
196
+ match data {
197
+ Ok ( data) => {
198
+ let data = String :: from_utf8 ( data) ?;
199
+ let event = serde_json:: from_str :: < PangeaEvent > ( & data) ?;
200
+ latest_processed_block = event. block_number ;
201
+
202
+ log:: debug!(
203
+ "LATEST_PROCESSED_BLOCK: {}" ,
204
+ latest_processed_block
205
+ ) ;
206
+
207
+ self . handle_event ( & event) . await ;
208
+ self . operation_tx
209
+ . send ( OperationMessage :: Dispatch (
210
+ latest_processed_block,
211
+ ) )
212
+ . unwrap ( ) ;
213
+ }
214
+ Err ( e) => {
215
+ log:: error!(
216
+ "Error in the stream of new orders (deltas): {e}"
217
+ ) ;
218
+ break ;
219
+ }
220
+ }
205
221
}
206
222
}
223
+ Err ( e) => {
224
+ log:: error!( "Failed to get fuel spark deltas: {e}" ) ;
225
+ }
207
226
}
208
227
}
209
228
Err ( e) => {
210
- log:: error!( "Failed to get fuel spark deltas : {e}" ) ;
229
+ log:: error!( "Failed to create pangea client : {e}" ) ;
211
230
}
212
231
}
213
232
0 commit comments