Skip to content

Commit 9de57fe

Browse files
committed
fix: return Some([]) for addresses with past UTxO activity to match Blockfrost
Signed-off-by: William Hankins <[email protected]>
1 parent 37ea0a9 commit 9de57fe

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

modules/address_state/src/immutable_address_store.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,13 +162,18 @@ impl ImmutableAddressStore {
162162
pub async fn get_utxos(&self, address: &Address) -> Result<Option<Vec<UTxOIdentifier>>> {
163163
let key = address.to_bytes_key()?;
164164

165+
let db_raw = self.utxos.get(&key)?;
166+
let db_had_key = db_raw.is_some();
167+
165168
let mut live: Vec<UTxOIdentifier> =
166-
self.utxos.get(&key)?.map(|bytes| decode(&bytes)).transpose()?.unwrap_or_default();
169+
db_raw.map(|bytes| decode(&bytes)).transpose()?.unwrap_or_default();
167170

168171
let pending = self.pending.lock().await;
172+
let mut pending_touched = false;
169173
for block_map in pending.iter() {
170174
if let Some(entry) = block_map.get(address) {
171175
if let Some(deltas) = &entry.utxos {
176+
pending_touched = true;
172177
for delta in deltas {
173178
match delta {
174179
UtxoDelta::Created(u) => live.push(*u),
@@ -179,8 +184,13 @@ impl ImmutableAddressStore {
179184
}
180185
}
181186

187+
// Only return None if the address never existed
182188
if live.is_empty() {
183-
Ok(None)
189+
if db_had_key || pending_touched {
190+
Ok(Some(vec![]))
191+
} else {
192+
Ok(None)
193+
}
184194
} else {
185195
Ok(Some(live))
186196
}

modules/address_state/src/state.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,20 @@ impl State {
8181
}
8282

8383
let store = self.immutable.clone();
84+
let mut db_had_address = false;
8485
let mut combined: HashSet<UTxOIdentifier> = match store.get_utxos(address).await? {
85-
Some(db) => db.into_iter().collect(),
86+
Some(db) => {
87+
db_had_address = true;
88+
db.into_iter().collect()
89+
}
8690
None => HashSet::new(),
8791
};
8892

93+
let mut pending_touched = false;
8994
for map in self.volatile.window.iter() {
9095
if let Some(entry) = map.get(address) {
9196
if let Some(deltas) = &entry.utxos {
97+
pending_touched = true;
9298
for delta in deltas {
9399
match delta {
94100
UtxoDelta::Created(u) => {
@@ -104,7 +110,11 @@ impl State {
104110
}
105111

106112
if combined.is_empty() {
107-
Ok(None)
113+
if db_had_address || pending_touched {
114+
Ok(Some(vec![]))
115+
} else {
116+
Ok(None)
117+
}
108118
} else {
109119
Ok(Some(combined.into_iter().collect()))
110120
}

0 commit comments

Comments
 (0)