diff --git a/crates/sana/src/managers/event_manager.rs b/crates/sana/src/managers/event_manager.rs index 333699e0..16e916c3 100644 --- a/crates/sana/src/managers/event_manager.rs +++ b/crates/sana/src/managers/event_manager.rs @@ -131,15 +131,39 @@ impl EventManager { return Err(anyhow!("Can't find event data into this event")); } - let maker_address = event + let order_type = event .keys - .get(3) - .ok_or_else(|| anyhow!("Maker address not found"))?; + .get(2) + .ok_or_else(|| anyhow!("Order type not found"))?; + + let type_1 = FieldElement::from_hex_be("0x1")?; + let type_3 = FieldElement::from_hex_be("0x3")?; + let is_basic_order = order_type == &type_1 || order_type == &type_3; + + let (from_address, to_address) = if is_basic_order { + ( + event + .keys + .get(3) + .ok_or_else(|| anyhow!("From address not found"))?, + event + .data + .first() + .ok_or_else(|| anyhow!("To address not found"))?, + ) + } else { + ( + event + .data + .first() + .ok_or_else(|| anyhow!("From address not found"))?, + event + .keys + .get(3) + .ok_or_else(|| anyhow!("To address not found"))?, + ) + }; - let taker_address = event - .data - .first() - .ok_or_else(|| anyhow!("Taker address not found"))?; let currency_address = event .data .get(1) @@ -202,21 +226,16 @@ impl EventManager { .map_err(|_| anyhow!("Failed to parse token id high"))?, }; - let event_id = Self::get_event_id( - &token_id, - maker_address, - taker_address, - block_timestamp, - event, - ); + let event_id = + Self::get_event_id(&token_id, from_address, to_address, block_timestamp, event); Ok(TokenSaleEvent { token_event_id: to_hex_str(&event_id), event_type: EventType::Sale, block_number: event.block_number, block_timestamp, - from_address: to_hex_str(maker_address), - to_address: to_hex_str(taker_address), + from_address: to_hex_str(from_address), + to_address: to_hex_str(to_address), nft_contract_address: to_hex_str(nft_contract_address), nft_type: None, transaction_hash: to_hex_str(&event.transaction_hash), diff --git a/crates/sana/src/storage/sqlx/default_storage.rs b/crates/sana/src/storage/sqlx/default_storage.rs index f832f3cd..fd07bc6a 100644 --- a/crates/sana/src/storage/sqlx/default_storage.rs +++ b/crates/sana/src/storage/sqlx/default_storage.rs @@ -312,6 +312,26 @@ impl Storage for PostgresStorage { "Updated existing transfer event: {:?}", event.token_event_id ); + + let update_query = "UPDATE token t + SET current_owner = ( + SELECT te.to_address + FROM token_event te + WHERE te.contract_address = t.contract_address + AND te.token_id = t.token_id + AND te.chain_id = t.chain_id + AND te.event_type IN ('Transfer', 'Burn', 'Mint') + ORDER BY te.block_timestamp DESC + LIMIT 1 + ), updated_timestamp = EXTRACT(epoch FROM now())::bigint + WHERE t.contract_address = $1 AND t.token_id = $2 AND t.chain_id = $3"; + + let _current_owner = sqlx::query(update_query) + .bind(event.contract_address.clone()) + .bind(event.token_id.clone()) + .bind(event.chain_id.clone()) + .execute(&self.pool) + .await?; } else { 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) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (token_event_id) DO NOTHING";