1
+ use std:: ops:: { Add , Sub } ;
2
+
1
3
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 } ;
5
6
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 ;
8
8
9
9
use super :: query_queue:: { Argument , QueryQueue , QueryType } ;
10
10
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} ;
11
13
use crate :: utils:: utc_dt_string_from_timestamp;
12
14
13
- use super :: Sql ;
14
-
15
15
impl Sql {
16
16
pub async fn handle_erc20_transfer < P : Provider + Sync > (
17
17
& mut self ,
18
18
contract_address : Felt ,
19
- from : Felt ,
20
- to : Felt ,
19
+ from_address : Felt ,
20
+ to_address : Felt ,
21
21
amount : U256 ,
22
22
provider : & P ,
23
23
block_timestamp : u64 ,
24
24
) -> Result < ( ) > {
25
25
// unique token identifier in DB
26
- let token_id = format ! ( "{:#x}" , contract_address) ;
26
+ let token_id = felt_to_sql_string ( & contract_address) ;
27
27
28
28
let token_exists: bool =
29
29
sqlx:: query_scalar ( "SELECT EXISTS(SELECT 1 FROM tokens WHERE id = ?)" )
@@ -43,8 +43,8 @@ impl Sql {
43
43
44
44
register_erc_transfer_event (
45
45
contract_address,
46
- from ,
47
- to ,
46
+ from_address ,
47
+ to_address ,
48
48
amount,
49
49
& token_id,
50
50
block_timestamp,
@@ -63,9 +63,9 @@ impl Sql {
63
63
"SELECT account_address, balance FROM balances WHERE contract_address = ? AND \
64
64
account_address IN (?, ?)",
65
65
)
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 ) ) ;
69
69
70
70
// (address, balance)
71
71
let balances: Vec < ( String , String ) > = query. fetch_all ( & self . pool ) . await ?;
@@ -75,50 +75,51 @@ impl Sql {
75
75
76
76
let from_balance = balances
77
77
. iter ( )
78
- . find ( |( address, _) | address == & format ! ( "{:#x}" , from ) )
78
+ . find ( |( address, _) | address == & felt_to_sql_string ( & from_address ) )
79
79
. 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 ) ) ) ;
81
81
82
82
let to_balance = balances
83
83
. iter ( )
84
- . find ( |( address, _) | address == & format ! ( "{:#x}" , to ) )
84
+ . find ( |( address, _) | address == & felt_to_sql_string ( & to_address ) )
85
85
. 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 ) ) ) ;
87
87
88
88
let from_balance = sql_string_to_u256 ( & from_balance) ;
89
89
let to_balance = sql_string_to_u256 ( & to_balance) ;
90
90
91
91
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 } ;
94
95
95
96
let update_query = "
96
97
INSERT INTO balances (id, balance, account_address, contract_address, token_id)
97
98
VALUES (?, ?, ?, ?, ?)
98
99
ON CONFLICT (id)
99
100
DO UPDATE SET balance = excluded.balance" ;
100
101
101
- if from != Felt :: ZERO {
102
+ if from_address != Felt :: ZERO {
102
103
self . query_queue . enqueue (
103
104
update_query,
104
105
vec ! [
105
- Argument :: String ( format! ( "{:#x}:{:#x}" , from , contract_address) ) ,
106
+ Argument :: String ( felts_to_sql_string ( & [ from_address , contract_address] ) ) ,
106
107
Argument :: String ( u256_to_sql_string( & new_from_balance) ) ,
107
- Argument :: FieldElement ( from ) ,
108
+ Argument :: FieldElement ( from_address ) ,
108
109
Argument :: FieldElement ( contract_address) ,
109
110
Argument :: String ( token_id. clone( ) ) ,
110
111
] ,
111
112
QueryType :: Other ,
112
113
) ;
113
114
}
114
115
115
- if to != Felt :: ZERO {
116
+ if to_address != Felt :: ZERO {
116
117
self . query_queue . enqueue (
117
118
update_query,
118
119
vec ! [
119
- Argument :: String ( format! ( "{:#x}:{:#x}" , to , contract_address) ) ,
120
+ Argument :: String ( felts_to_sql_string ( & [ to_address , contract_address] ) ) ,
120
121
Argument :: String ( u256_to_sql_string( & new_to_balance) ) ,
121
- Argument :: FieldElement ( to ) ,
122
+ Argument :: FieldElement ( to_address ) ,
122
123
Argument :: FieldElement ( contract_address) ,
123
124
Argument :: String ( token_id. clone( ) ) ,
124
125
] ,
@@ -134,13 +135,13 @@ impl Sql {
134
135
pub async fn handle_erc721_transfer < P : Provider + Sync > (
135
136
& mut self ,
136
137
contract_address : Felt ,
137
- from : Felt ,
138
- to : Felt ,
138
+ from_address : Felt ,
139
+ to_address : Felt ,
139
140
token_id : U256 ,
140
141
provider : & P ,
141
142
block_timestamp : u64 ,
142
143
) -> 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) ;
144
145
let token_exists: bool =
145
146
sqlx:: query_scalar ( "SELECT EXISTS(SELECT 1 FROM tokens WHERE id = ?)" )
146
147
. bind ( token_id. clone ( ) )
@@ -159,8 +160,8 @@ impl Sql {
159
160
160
161
register_erc_transfer_event (
161
162
contract_address,
162
- from ,
163
- to ,
163
+ from_address ,
164
+ to_address ,
164
165
U256 :: from ( 1u8 ) ,
165
166
& token_id,
166
167
block_timestamp,
@@ -175,7 +176,7 @@ impl Sql {
175
176
ON CONFLICT (id)
176
177
DO UPDATE SET balance = excluded.balance" ;
177
178
178
- if from != Felt :: ZERO {
179
+ if from_address != Felt :: ZERO {
179
180
self . query_queue . enqueue (
180
181
update_query,
181
182
vec ! [
@@ -193,7 +194,7 @@ impl Sql {
193
194
) ;
194
195
}
195
196
196
- if to != Felt :: ZERO {
197
+ if to_address != Felt :: ZERO {
197
198
self . query_queue . enqueue (
198
199
update_query,
199
200
vec ! [
0 commit comments