Skip to content

Commit a97288c

Browse files
committed
refactor(torii): abstract out how to format felts to avoid bugs
commit-id:d618e874
1 parent fc56768 commit a97288c

File tree

7 files changed

+61
-51
lines changed

7 files changed

+61
-51
lines changed

crates/torii/core/src/processors/store_set_record.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tracing::info;
88

99
use super::EventProcessor;
1010
use crate::processors::{ENTITY_ID_INDEX, MODEL_INDEX, NUM_KEYS_INDEX};
11-
use crate::sql::utils::felts_sql_string;
11+
use crate::sql::utils::felts_to_sql_string;
1212
use crate::sql::Sql;
1313

1414
pub(crate) const LOG_TARGET: &str = "torii_core::processors::store_set_record";
@@ -61,7 +61,7 @@ where
6161
let keys_end: usize =
6262
keys_start + event.data[NUM_KEYS_INDEX].to_usize().context("invalid usize")?;
6363
let keys = event.data[keys_start..keys_end].to_vec();
64-
let keys_str = felts_sql_string(&keys);
64+
let keys_str = felts_to_sql_string(&keys);
6565

6666
// keys_end is already the length of the values array.
6767

crates/torii/core/src/sql/erc.rs

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
1+
use std::ops::{Add, Sub};
2+
13
use anyhow::Result;
2-
use cainome::cairo_serde::ByteArray;
3-
use cainome::cairo_serde::CairoSerde;
4-
use starknet::core::types::{BlockId, BlockTag, FunctionCall, U256};
4+
use cainome::cairo_serde::{ByteArray, CairoSerde};
5+
use starknet::core::types::{BlockId, BlockTag, Felt, FunctionCall, U256};
56
use starknet::core::utils::{get_selector_from_name, parse_cairo_short_string};
6-
use starknet::{core::types::Felt, providers::Provider};
7-
use std::ops::{Add, Sub};
7+
use starknet::providers::Provider;
88

99
use super::query_queue::{Argument, QueryQueue, QueryType};
1010
use super::utils::{sql_string_to_u256, u256_to_sql_string};
11+
use super::{Sql, FELT_DELIMITER};
12+
use crate::sql::utils::{felt_and_u256_to_sql_string, felt_to_sql_string, felts_to_sql_string};
1113
use crate::utils::utc_dt_string_from_timestamp;
1214

13-
use super::Sql;
14-
1515
impl Sql {
1616
pub async fn handle_erc20_transfer<P: Provider + Sync>(
1717
&mut self,
1818
contract_address: Felt,
19-
from: Felt,
20-
to: Felt,
19+
from_address: Felt,
20+
to_address: Felt,
2121
amount: U256,
2222
provider: &P,
2323
block_timestamp: u64,
2424
) -> Result<()> {
2525
// unique token identifier in DB
26-
let token_id = format!("{:#x}", contract_address);
26+
let token_id = felt_to_sql_string(&contract_address);
2727

2828
let token_exists: bool =
2929
sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM tokens WHERE id = ?)")
@@ -43,8 +43,8 @@ impl Sql {
4343

4444
register_erc_transfer_event(
4545
contract_address,
46-
from,
47-
to,
46+
from_address,
47+
to_address,
4848
amount,
4949
&token_id,
5050
block_timestamp,
@@ -63,9 +63,9 @@ impl Sql {
6363
"SELECT account_address, balance FROM balances WHERE contract_address = ? AND \
6464
account_address IN (?, ?)",
6565
)
66-
.bind(format!("{:#x}", contract_address))
67-
.bind(format!("{:#x}", from))
68-
.bind(format!("{:#x}", to));
66+
.bind(felt_to_sql_string(&contract_address))
67+
.bind(felt_to_sql_string(&from_address))
68+
.bind(felt_to_sql_string(&to_address));
6969

7070
// (address, balance)
7171
let balances: Vec<(String, String)> = query.fetch_all(&self.pool).await?;
@@ -75,50 +75,51 @@ impl Sql {
7575

7676
let from_balance = balances
7777
.iter()
78-
.find(|(address, _)| address == &format!("{:#x}", from))
78+
.find(|(address, _)| address == &felt_to_sql_string(&from_address))
7979
.map(|(_, balance)| balance.clone())
80-
.unwrap_or_else(|| format!("{:#64x}", crypto_bigint::U256::ZERO));
80+
.unwrap_or_else(|| u256_to_sql_string(&U256::from(0u8)));
8181

8282
let to_balance = balances
8383
.iter()
84-
.find(|(address, _)| address == &format!("{:#x}", to))
84+
.find(|(address, _)| address == &felt_to_sql_string(&to_address))
8585
.map(|(_, balance)| balance.clone())
86-
.unwrap_or_else(|| format!("{:#64x}", crypto_bigint::U256::ZERO));
86+
.unwrap_or_else(|| u256_to_sql_string(&U256::from(0u8)));
8787

8888
let from_balance = sql_string_to_u256(&from_balance);
8989
let to_balance = sql_string_to_u256(&to_balance);
9090

9191
let new_from_balance =
92-
if from != Felt::ZERO { from_balance.sub(amount) } else { from_balance };
93-
let new_to_balance = if to != Felt::ZERO { to_balance.add(amount) } else { to_balance };
92+
if from_address != Felt::ZERO { from_balance.sub(amount) } else { from_balance };
93+
let new_to_balance =
94+
if to_address != Felt::ZERO { to_balance.add(amount) } else { to_balance };
9495

9596
let update_query = "
9697
INSERT INTO balances (id, balance, account_address, contract_address, token_id)
9798
VALUES (?, ?, ?, ?, ?)
9899
ON CONFLICT (id)
99100
DO UPDATE SET balance = excluded.balance";
100101

101-
if from != Felt::ZERO {
102+
if from_address != Felt::ZERO {
102103
self.query_queue.enqueue(
103104
update_query,
104105
vec![
105-
Argument::String(format!("{:#x}:{:#x}", from, contract_address)),
106+
Argument::String(felts_to_sql_string(&[from_address, contract_address])),
106107
Argument::String(u256_to_sql_string(&new_from_balance)),
107-
Argument::FieldElement(from),
108+
Argument::FieldElement(from_address),
108109
Argument::FieldElement(contract_address),
109110
Argument::String(token_id.clone()),
110111
],
111112
QueryType::Other,
112113
);
113114
}
114115

115-
if to != Felt::ZERO {
116+
if to_address != Felt::ZERO {
116117
self.query_queue.enqueue(
117118
update_query,
118119
vec![
119-
Argument::String(format!("{:#x}:{:#x}", to, contract_address)),
120+
Argument::String(felts_to_sql_string(&[to_address, contract_address])),
120121
Argument::String(u256_to_sql_string(&new_to_balance)),
121-
Argument::FieldElement(to),
122+
Argument::FieldElement(to_address),
122123
Argument::FieldElement(contract_address),
123124
Argument::String(token_id.clone()),
124125
],
@@ -134,13 +135,13 @@ impl Sql {
134135
pub async fn handle_erc721_transfer<P: Provider + Sync>(
135136
&mut self,
136137
contract_address: Felt,
137-
from: Felt,
138-
to: Felt,
138+
from_address: Felt,
139+
to_address: Felt,
139140
token_id: U256,
140141
provider: &P,
141142
block_timestamp: u64,
142143
) -> Result<()> {
143-
let token_id = format!("{:#x}:{}", contract_address, u256_to_sql_string(&token_id));
144+
let token_id = felt_and_u256_to_sql_string(&contract_address, &token_id);
144145
let token_exists: bool =
145146
sqlx::query_scalar("SELECT EXISTS(SELECT 1 FROM tokens WHERE id = ?)")
146147
.bind(token_id.clone())
@@ -159,8 +160,8 @@ impl Sql {
159160

160161
register_erc_transfer_event(
161162
contract_address,
162-
from,
163-
to,
163+
from_address,
164+
to_address,
164165
U256::from(1u8),
165166
&token_id,
166167
block_timestamp,
@@ -175,7 +176,7 @@ impl Sql {
175176
ON CONFLICT (id)
176177
DO UPDATE SET balance = excluded.balance";
177178

178-
if from != Felt::ZERO {
179+
if from_address != Felt::ZERO {
179180
self.query_queue.enqueue(
180181
update_query,
181182
vec![
@@ -193,7 +194,7 @@ impl Sql {
193194
);
194195
}
195196

196-
if to != Felt::ZERO {
197+
if to_address != Felt::ZERO {
197198
self.query_queue.enqueue(
198199
update_query,
199200
vec![

crates/torii/core/src/sql/mod.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use sqlx::{Pool, Sqlite};
1616
use starknet::core::types::{Event, Felt, InvokeTransaction, Transaction};
1717
use starknet_crypto::poseidon_hash_many;
1818
use tracing::{debug, warn};
19-
use utils::felts_sql_string;
19+
use utils::felts_to_sql_string;
2020

2121
use crate::cache::{Model, ModelCache};
2222
use crate::types::{
@@ -420,7 +420,7 @@ impl Sql {
420420
QueryType::Other,
421421
);
422422

423-
let keys_str = felts_sql_string(&keys);
423+
let keys_str = felts_to_sql_string(&keys);
424424
let insert_entities = "INSERT INTO event_messages (id, keys, event_id, executed_at) \
425425
VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET \
426426
updated_at=CURRENT_TIMESTAMP, executed_at=EXCLUDED.executed_at, \
@@ -561,15 +561,15 @@ impl Sql {
561561
Transaction::Invoke(InvokeTransaction::V1(invoke_v1_transaction)) => (
562562
Argument::FieldElement(invoke_v1_transaction.transaction_hash),
563563
Argument::FieldElement(invoke_v1_transaction.sender_address),
564-
Argument::String(felts_sql_string(&invoke_v1_transaction.calldata)),
564+
Argument::String(felts_to_sql_string(&invoke_v1_transaction.calldata)),
565565
Argument::FieldElement(invoke_v1_transaction.max_fee),
566-
Argument::String(felts_sql_string(&invoke_v1_transaction.signature)),
566+
Argument::String(felts_to_sql_string(&invoke_v1_transaction.signature)),
567567
Argument::FieldElement(invoke_v1_transaction.nonce),
568568
),
569569
Transaction::L1Handler(l1_handler_transaction) => (
570570
Argument::FieldElement(l1_handler_transaction.transaction_hash),
571571
Argument::FieldElement(l1_handler_transaction.contract_address),
572-
Argument::String(felts_sql_string(&l1_handler_transaction.calldata)),
572+
Argument::String(felts_to_sql_string(&l1_handler_transaction.calldata)),
573573
Argument::FieldElement(Felt::ZERO), // has no max_fee
574574
Argument::String("".to_string()), // has no signature
575575
Argument::FieldElement((l1_handler_transaction.nonce).into()),
@@ -604,8 +604,8 @@ impl Sql {
604604
block_timestamp: u64,
605605
) {
606606
let id = Argument::String(event_id.to_string());
607-
let keys = Argument::String(felts_sql_string(&event.keys));
608-
let data = Argument::String(felts_sql_string(&event.data));
607+
let keys = Argument::String(felts_to_sql_string(&event.keys));
608+
let data = Argument::String(felts_to_sql_string(&event.data));
609609
let hash = Argument::FieldElement(transaction_hash);
610610
let executed_at = Argument::String(utc_dt_string_from_timestamp(block_timestamp));
611611

@@ -618,8 +618,8 @@ impl Sql {
618618

619619
let emitted = EventEmitted {
620620
id: event_id.to_string(),
621-
keys: felts_sql_string(&event.keys),
622-
data: felts_sql_string(&event.data),
621+
keys: felts_to_sql_string(&event.keys),
622+
data: felts_to_sql_string(&event.data),
623623
transaction_hash: format!("{:#x}", transaction_hash),
624624
created_at: Utc::now(),
625625
executed_at: must_utc_datetime_from_timestamp(block_timestamp),

crates/torii/core/src/sql/query_queue.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl QueryQueue {
8383
Argument::Int(integer) => query.bind(integer),
8484
Argument::Bool(bool) => query.bind(bool),
8585
Argument::String(string) => query.bind(string),
86-
Argument::FieldElement(felt) => query.bind(format!("{:#x}", felt)),
86+
Argument::FieldElement(felt) => query.bind(felt_to_sql_string(felt)),
8787
}
8888
}
8989

crates/torii/core/src/sql/utils.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,19 @@ use starknet_crypto::Felt;
33

44
use super::FELT_DELIMITER;
55

6-
pub fn felts_sql_string(felts: &[Felt]) -> String {
6+
pub fn felts_to_sql_string(felts: &[Felt]) -> String {
77
felts.iter().map(|k| format!("{:#x}", k)).collect::<Vec<String>>().join(FELT_DELIMITER)
88
+ FELT_DELIMITER
99
}
1010

11+
pub(crate) fn felt_to_sql_string(felt: &Felt) -> String {
12+
format!("{:#x}", felt)
13+
}
14+
15+
pub(crate) fn felt_and_u256_to_sql_string(felt: &Felt, u256: &U256) -> String {
16+
format!("{}:{}", felt_to_sql_string(felt), u256_to_sql_string(u256))
17+
}
18+
1119
pub(crate) fn u256_to_sql_string(u256: &U256) -> String {
1220
format!("{:#064x}", u256)
1321
}

crates/torii/graphql/src/tests/subscription_test.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ mod tests {
1414
use starknet::core::types::Event;
1515
use starknet_crypto::{poseidon_hash_many, Felt};
1616
use tokio::sync::mpsc;
17-
use torii_core::sql::{felts_sql_string, Sql};
17+
use torii_core::sql::utils::felts_to_sql_string;
18+
use torii_core::sql::Sql;
1819

1920
use crate::tests::{model_fixtures, run_graphql_subscription};
2021
use crate::utils;
@@ -105,7 +106,7 @@ mod tests {
105106
],
106107
});
107108
let keys = keys_from_ty(&ty).unwrap();
108-
let keys_str = felts_sql_string(&keys);
109+
let keys_str = felts_to_sql_string(&keys);
109110
let entity_id = poseidon_hash_many(&keys);
110111
let model_id = model_id_from_ty(&ty);
111112

@@ -223,7 +224,7 @@ mod tests {
223224
});
224225

225226
let keys = keys_from_ty(&ty).unwrap();
226-
let keys_str = felts_sql_string(&keys);
227+
let keys_str = felts_to_sql_string(&keys);
227228
let entity_id = poseidon_hash_many(&keys);
228229
let model_id = model_id_from_ty(&ty);
229230

crates/torii/libp2p/src/server/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ impl<P: Provider + Sync> Relay<P> {
246246
continue;
247247
}
248248
};
249-
let keys_str = felts_sql_string(&keys);
249+
let keys_str = felts_to_sql_string(&keys);
250250
let entity_id = poseidon_hash_many(&keys);
251251
let model_id = ty_model_id(&ty).unwrap();
252252

0 commit comments

Comments
 (0)