Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 35 additions & 16 deletions crates/sana/src/managers/event_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,15 +131,39 @@ impl<S: Storage> EventManager<S> {
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)
Expand Down Expand Up @@ -202,21 +226,16 @@ impl<S: Storage> EventManager<S> {
.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),
Expand Down
20 changes: 20 additions & 0 deletions crates/sana/src/storage/sqlx/default_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
Loading