Skip to content

Commit 0cda1d0

Browse files
committed
fix
1 parent e5977a4 commit 0cda1d0

File tree

1 file changed

+41
-27
lines changed
  • toolkit/data-sources/db-sync/src/bridge

1 file changed

+41
-27
lines changed

toolkit/data-sources/db-sync/src/bridge/cache.rs

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -53,26 +53,31 @@ impl TokenUtxoCache {
5353

5454
pub(crate) fn serve_from_cache(
5555
&self,
56-
checkpoint: BridgeDataCheckpoint,
56+
checkpoint: BridgeCheckpoint,
5757
to_block: McBlockNumber,
5858
) -> Option<Vec<BridgeUtxo>> {
5959
if self.end_block < to_block {
6060
return None;
6161
}
6262

6363
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(
7375
self.transfers
7476
.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+
})
7681
.take_while(|utxo| to_block >= utxo.block_number.into())
7782
.cloned()
7883
.collect(),
@@ -120,6 +125,23 @@ where
120125
.ok_or(format!("Could not find block for hash {current_mc_block_hash:?}"))?;
121126
let to_block = current_mc_block.block_no.into();
122127

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+
123145
let utxos = match self.try_serve_from_cache(data_checkpoint.clone(), to_block).await {
124146
Some(utxos) => utxos,
125147
None => {
@@ -167,7 +189,7 @@ impl CachedTokenBridgeDataSourceImpl {
167189

168190
async fn try_serve_from_cache(
169191
&self,
170-
data_checkpoint: BridgeDataCheckpoint,
192+
data_checkpoint: BridgeCheckpoint,
171193
to_block: McBlockNumber,
172194
) -> Option<Vec<BridgeUtxo>> {
173195
let cache = self.cache.lock().await;
@@ -177,23 +199,15 @@ impl CachedTokenBridgeDataSourceImpl {
177199
async fn fill_cache(
178200
&self,
179201
main_chain_scripts: MainChainScripts,
180-
data_checkpoint: BridgeDataCheckpoint,
202+
data_checkpoint: BridgeCheckpoint,
181203
to_block: McBlockNumber,
182204
) -> 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+
});
195209

196-
let data_checkpoint = BridgeCheckpoint::Block { number: from_block.0 - 1 };
210+
let data_checkpoint = BridgeCheckpoint::Block { number: from_block.0 };
197211

198212
let asset = Asset {
199213
policy_id: main_chain_scripts.token_policy_id.into(),
@@ -217,7 +231,7 @@ impl CachedTokenBridgeDataSourceImpl {
217231
.await?;
218232

219233
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);
221235

222236
Ok(())
223237
}

0 commit comments

Comments
 (0)