@@ -53,26 +53,31 @@ impl TokenUtxoCache {
53
53
54
54
pub ( crate ) fn serve_from_cache (
55
55
& self ,
56
- checkpoint : BridgeDataCheckpoint ,
56
+ checkpoint : BridgeCheckpoint ,
57
57
to_block : McBlockNumber ,
58
58
) -> Option < Vec < BridgeUtxo > > {
59
59
if self . end_block < to_block {
60
60
return None ;
61
61
}
62
62
63
63
match checkpoint {
64
- BridgeDataCheckpoint :: Block ( from_block) if self . start_block <= from_block => Some (
65
- self . transfers
66
- . iter ( )
67
- . skip_while ( |utxo| from_block > utxo. block_number . into ( ) )
68
- . take_while ( |utxo| to_block >= utxo. block_number . into ( ) )
69
- . cloned ( )
70
- . collect ( ) ,
71
- ) ,
72
- BridgeDataCheckpoint :: Utxo ( from_utxo) if self . utxo_ids . contains ( & from_utxo) => Some (
64
+ BridgeCheckpoint :: Block { number : from_block } if self . start_block . 0 <= from_block => {
65
+ Some (
66
+ self . transfers
67
+ . iter ( )
68
+ . skip_while ( |utxo| from_block > utxo. block_number . 0 )
69
+ . take_while ( |utxo| to_block. 0 >= utxo. block_number . 0 )
70
+ . cloned ( )
71
+ . collect ( ) ,
72
+ )
73
+ } ,
74
+ BridgeCheckpoint :: Utxo { block_number, tx_ix, tx_out_ix } => Some (
73
75
self . transfers
74
76
. iter ( )
75
- . skip_while ( |utxo| utxo. utxo_id ( ) != from_utxo)
77
+ . skip_while ( |utxo| {
78
+ ( utxo. block_number . 0 , utxo. tx_ix . 0 , utxo. utxo_ix . 0 )
79
+ <= ( block_number, tx_ix, tx_out_ix)
80
+ } )
76
81
. take_while ( |utxo| to_block >= utxo. block_number . into ( ) )
77
82
. cloned ( )
78
83
. collect ( ) ,
@@ -120,6 +125,23 @@ where
120
125
. ok_or ( format ! ( "Could not find block for hash {current_mc_block_hash:?}" ) ) ?;
121
126
let to_block = current_mc_block. block_no . into ( ) ;
122
127
128
+ let data_checkpoint = match data_checkpoint {
129
+ BridgeDataCheckpoint :: Utxo ( utxo) => {
130
+ let TxBlockInfo { block_number, tx_ix } =
131
+ get_block_info_for_utxo ( & self . pool , utxo. tx_hash . into ( ) ) . await ?. ok_or (
132
+ format ! (
133
+ "Could not find block info for data checkpoint: {data_checkpoint:?}"
134
+ ) ,
135
+ ) ?;
136
+ BridgeCheckpoint :: Utxo {
137
+ block_number : block_number. 0 ,
138
+ tx_ix : tx_ix. 0 ,
139
+ tx_out_ix : utxo. index . 0 ,
140
+ }
141
+ } ,
142
+ BridgeDataCheckpoint :: Block ( number) => BridgeCheckpoint :: Block { number : number. 0 } ,
143
+ } ;
144
+
123
145
let utxos = match self . try_serve_from_cache ( data_checkpoint. clone ( ) , to_block) . await {
124
146
Some ( utxos) => utxos,
125
147
None => {
@@ -167,7 +189,7 @@ impl CachedTokenBridgeDataSourceImpl {
167
189
168
190
async fn try_serve_from_cache (
169
191
& self ,
170
- data_checkpoint : BridgeDataCheckpoint ,
192
+ data_checkpoint : BridgeCheckpoint ,
171
193
to_block : McBlockNumber ,
172
194
) -> Option < Vec < BridgeUtxo > > {
173
195
let cache = self . cache . lock ( ) . await ;
@@ -177,23 +199,15 @@ impl CachedTokenBridgeDataSourceImpl {
177
199
async fn fill_cache (
178
200
& self ,
179
201
main_chain_scripts : MainChainScripts ,
180
- data_checkpoint : BridgeDataCheckpoint ,
202
+ data_checkpoint : BridgeCheckpoint ,
181
203
to_block : McBlockNumber ,
182
204
) -> Result < ( ) , Box < dyn Error + Send + Sync > > {
183
- let from_block = match data_checkpoint {
184
- BridgeDataCheckpoint :: Utxo ( utxo) => {
185
- let TxBlockInfo { block_number, .. } =
186
- get_block_info_for_utxo ( & self . pool , utxo. tx_hash . into ( ) ) . await ?. ok_or (
187
- format ! (
188
- "Could not find block info for data checkpoint: {data_checkpoint:?}"
189
- ) ,
190
- ) ?;
191
- block_number
192
- } ,
193
- BridgeDataCheckpoint :: Block ( block_number) => block_number. into ( ) ,
194
- } ;
205
+ let from_block = McBlockNumber ( match data_checkpoint {
206
+ BridgeCheckpoint :: Block { number } => number. saturating_sub ( 1 ) ,
207
+ BridgeCheckpoint :: Utxo { block_number, .. } => block_number. saturating_sub ( 1 ) ,
208
+ } ) ;
195
209
196
- let data_checkpoint = BridgeCheckpoint :: Block { number : from_block. 0 - 1 } ;
210
+ let data_checkpoint = BridgeCheckpoint :: Block { number : from_block. 0 } ;
197
211
198
212
let asset = Asset {
199
213
policy_id : main_chain_scripts. token_policy_id . into ( ) ,
@@ -217,7 +231,7 @@ impl CachedTokenBridgeDataSourceImpl {
217
231
. await ?;
218
232
219
233
let mut cache = self . cache . lock ( ) . await ;
220
- cache. set_cached_transfers ( from_block. into ( ) , to_block. into ( ) , utxos) ;
234
+ cache. set_cached_transfers ( from_block, to_block. into ( ) , utxos) ;
221
235
222
236
Ok ( ( ) )
223
237
}
0 commit comments