1
+ use std:: ops:: Range ;
2
+
1
3
use async_trait:: async_trait;
2
4
use mockall:: { automock, predicate:: * } ;
3
5
use serde:: Deserialize ;
@@ -12,11 +14,8 @@ pub const EARLIEST_AVAILABLE_SLOT: i32 = 5616303;
12
14
// These are accepted blocks only.
13
15
#[ derive( Deserialize ) ]
14
16
pub struct MaybeMevBlock {
15
- #[ serde( rename = "slotNumber" ) ]
16
- slot_number : i32 ,
17
- #[ serde( rename = "blockNumber" ) ]
17
+ slot : i32 ,
18
18
block_number : i32 ,
19
- #[ serde( rename = "blockHash" ) ]
20
19
block_hash : String ,
21
20
#[ serde( rename = "value" ) ]
22
21
bid : Option < WeiNewtype > ,
@@ -28,7 +27,7 @@ impl TryFrom<MaybeMevBlock> for MevBlock {
28
27
fn try_from ( raw : MaybeMevBlock ) -> Result < Self , Self :: Error > {
29
28
match raw. bid {
30
29
Some ( bid) => Ok ( MevBlock {
31
- slot : raw. slot_number ,
30
+ slot : raw. slot ,
32
31
block_number : raw. block_number ,
33
32
block_hash : raw. block_hash ,
34
33
bid,
@@ -41,7 +40,8 @@ impl TryFrom<MaybeMevBlock> for MevBlock {
41
40
#[ automock]
42
41
#[ async_trait]
43
42
pub trait RelayApi {
44
- async fn fetch_mev_blocks ( & self , start_slot : i32 , end_slot : i32 ) -> Vec < MevBlock > ;
43
+ async fn fetch_mev_block ( & self , slot : i32 ) -> Option < MevBlock > ;
44
+ async fn fetch_mev_blocks ( & self , slots : Range < i32 > ) -> Vec < MevBlock > ;
45
45
}
46
46
47
47
pub struct RelayApiHttp {
@@ -52,7 +52,7 @@ pub struct RelayApiHttp {
52
52
impl RelayApiHttp {
53
53
pub fn new ( ) -> Self {
54
54
Self {
55
- server_url : "https://relay.ultrasound.money" . into ( ) ,
55
+ server_url : "https://relay-analytics .ultrasound.money" . into ( ) ,
56
56
client : reqwest:: Client :: new ( ) ,
57
57
}
58
58
}
@@ -73,21 +73,36 @@ impl Default for RelayApiHttp {
73
73
74
74
#[ async_trait]
75
75
impl RelayApi for RelayApiHttp {
76
- async fn fetch_mev_blocks ( & self , start_slot : i32 , end_slot : i32 ) -> Vec < MevBlock > {
76
+ async fn fetch_mev_block ( & self , slot : i32 ) -> Option < MevBlock > {
77
+ let url = format ! (
78
+ "{}/relay/v1/data/bidtraces/proposer_payload_delivered?slot={}" ,
79
+ self . server_url, slot
80
+ ) ;
77
81
self . client
78
- . get ( format ! (
79
- "{}/api/block-production?start_slot={}&end_slot={}" ,
80
- self . server_url, start_slot, end_slot
81
- ) )
82
+ . get ( url)
82
83
. send ( )
83
84
. await
84
85
. unwrap ( )
85
86
. json :: < Vec < MaybeMevBlock > > ( )
86
87
. await
87
- . unwrap ( )
88
- . into_iter ( )
89
- . filter_map ( |block| block. try_into ( ) . ok ( ) )
90
- . collect ( )
88
+ . ok ( )
89
+ . and_then ( |blocks| blocks. into_iter ( ) . next ( ) )
90
+ . and_then ( |block| block. try_into ( ) . ok ( ) )
91
+ }
92
+
93
+ async fn fetch_mev_blocks ( & self , slots : Range < i32 > ) -> Vec < MevBlock > {
94
+ let mut blocks = Vec :: new ( ) ;
95
+
96
+ for slot in slots {
97
+ if let Some ( block) = self . fetch_mev_block ( slot) . await {
98
+ blocks. push ( block) ;
99
+ }
100
+
101
+ // add small delay to avoid rate limiting
102
+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_millis ( 100 ) ) . await ;
103
+ }
104
+
105
+ blocks
91
106
}
92
107
}
93
108
@@ -101,13 +116,16 @@ mod tests {
101
116
async fn fetch_mev_blocks_test ( ) {
102
117
let mut server = mockito:: Server :: new ( ) ;
103
118
server
104
- . mock ( "GET" , "/api/block-production?start_slot=0&end_slot=10" )
119
+ . mock (
120
+ "GET" ,
121
+ "/relay/v1/data/bidtraces/proposer_payload_delivered?slot=0" ,
122
+ )
105
123
. with_status ( 200 )
106
124
. with_body (
107
125
json ! ( [ {
108
- "slotNumber " : 1 ,
109
- "blockNumber " : 9191911 ,
110
- "blockHash " : "abc" ,
126
+ "slot " : 0 ,
127
+ "block_number " : 9191911 ,
128
+ "block_hash " : "abc" ,
111
129
"value" : "100"
112
130
} ] )
113
131
. to_string ( ) ,
@@ -116,11 +134,11 @@ mod tests {
116
134
117
135
let relay_api = RelayApiHttp :: new_with_url ( & server. url ( ) ) ;
118
136
119
- let blocks = relay_api. fetch_mev_blocks ( 0 , 10 ) . await ;
137
+ let blocks = relay_api. fetch_mev_blocks ( 0 .. 1 ) . await ;
120
138
assert_eq ! ( blocks. len( ) , 1 ) ;
121
139
122
140
let block = & blocks[ 0 ] ;
123
- assert_eq ! ( block. slot, 1 ) ;
141
+ assert_eq ! ( block. slot, 0 ) ;
124
142
assert_eq ! ( block. block_number, 9191911 ) ;
125
143
assert_eq ! ( block. block_hash, "abc" ) ;
126
144
assert_eq ! ( block. bid. 0 , 100 ) ;
0 commit comments