Skip to content

Commit 8d95efa

Browse files
committed
fix(sana): correct buyer/seller address mapping in sale events
1 parent 4239572 commit 8d95efa

2 files changed

Lines changed: 55 additions & 16 deletions

File tree

crates/sana/src/managers/event_manager.rs

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -131,15 +131,39 @@ impl<S: Storage> EventManager<S> {
131131
return Err(anyhow!("Can't find event data into this event"));
132132
}
133133

134-
let maker_address = event
134+
let order_type = event
135135
.keys
136-
.get(3)
137-
.ok_or_else(|| anyhow!("Maker address not found"))?;
136+
.get(2)
137+
.ok_or_else(|| anyhow!("Order type not found"))?;
138+
139+
let type_1 = FieldElement::from_hex_be("0x1")?;
140+
let type_3 = FieldElement::from_hex_be("0x3")?;
141+
let is_basic_order = order_type == &type_1 || order_type == &type_3;
142+
143+
let (from_address, to_address) = if is_basic_order {
144+
(
145+
event
146+
.keys
147+
.get(3)
148+
.ok_or_else(|| anyhow!("From address not found"))?,
149+
event
150+
.data
151+
.first()
152+
.ok_or_else(|| anyhow!("To address not found"))?,
153+
)
154+
} else {
155+
(
156+
event
157+
.data
158+
.first()
159+
.ok_or_else(|| anyhow!("Taker address not found"))?,
160+
event
161+
.keys
162+
.get(3)
163+
.ok_or_else(|| anyhow!("Maker address not found"))?,
164+
)
165+
};
138166

139-
let taker_address = event
140-
.data
141-
.first()
142-
.ok_or_else(|| anyhow!("Taker address not found"))?;
143167
let currency_address = event
144168
.data
145169
.get(1)
@@ -202,21 +226,16 @@ impl<S: Storage> EventManager<S> {
202226
.map_err(|_| anyhow!("Failed to parse token id high"))?,
203227
};
204228

205-
let event_id = Self::get_event_id(
206-
&token_id,
207-
maker_address,
208-
taker_address,
209-
block_timestamp,
210-
event,
211-
);
229+
let event_id =
230+
Self::get_event_id(&token_id, from_address, to_address, block_timestamp, event);
212231

213232
Ok(TokenSaleEvent {
214233
token_event_id: to_hex_str(&event_id),
215234
event_type: EventType::Sale,
216235
block_number: event.block_number,
217236
block_timestamp,
218-
from_address: to_hex_str(maker_address),
219-
to_address: to_hex_str(taker_address),
237+
from_address: to_hex_str(from_address),
238+
to_address: to_hex_str(to_address),
220239
nft_contract_address: to_hex_str(nft_contract_address),
221240
nft_type: None,
222241
transaction_hash: to_hex_str(&event.transaction_hash),

crates/sana/src/storage/sqlx/default_storage.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,26 @@ impl Storage for PostgresStorage {
312312
"Updated existing transfer event: {:?}",
313313
event.token_event_id
314314
);
315+
316+
let update_query = "UPDATE token t
317+
SET current_owner = (
318+
SELECT te.to_address
319+
FROM token_event te
320+
WHERE te.contract_address = t.contract_address
321+
AND te.token_id = t.token_id
322+
AND te.chain_id = t.chain_id
323+
AND te.event_type IN ('Transfer', 'Burn', 'Mint')
324+
ORDER BY te.block_timestamp DESC
325+
LIMIT 1
326+
), updated_timestamp = EXTRACT(epoch FROM now())::bigint
327+
WHERE t.contract_address = $1 AND t.token_id = $2 AND t.chain_id = $3";
328+
329+
let _current_owner = sqlx::query(update_query)
330+
.bind(event.contract_address.clone())
331+
.bind(event.token_id.clone())
332+
.bind(event.chain_id.clone())
333+
.execute(&self.pool)
334+
.await?;
315335
} else {
316336
let insert_query = "INSERT INTO token_event (token_event_id, contract_address, chain_id, token_id, token_id_hex, event_type, block_timestamp, transaction_hash, to_address, from_address)
317337
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (token_event_id) DO NOTHING";

0 commit comments

Comments
 (0)