Skip to content

Commit a3fa7ca

Browse files
committed
feat: expose new ethereum sql type wrappers for bytes types
1 parent 9f57384 commit a3fa7ca

File tree

3 files changed

+131
-11
lines changed

3 files changed

+131
-11
lines changed

core/src/database/postgres/sql_type_wrapper.rs

Lines changed: 120 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,13 @@ pub enum EthereumSqlTypeWrapper {
5353

5454
// 256-bit integers
5555
U256(U256),
56+
U256Bytes(U256),
5657
I256(I256),
58+
I256Bytes(I256),
5759
VecU256(Vec<U256>),
60+
VecU256Bytes(Vec<U256>),
5861
VecI256(Vec<I256>),
62+
VecI256Bytes(Vec<I256>),
5963

6064
// 512-bit integers
6165
U512(U512),
@@ -65,15 +69,19 @@ pub enum EthereumSqlTypeWrapper {
6569
H128(H128),
6670
H160(H160),
6771
H256(H256),
72+
H256Bytes(H256),
6873
H512(H512),
6974
VecH128(Vec<H128>),
7075
VecH160(Vec<H160>),
7176
VecH256(Vec<H256>),
77+
VecH256Bytes(Vec<H256>),
7278
VecH512(Vec<H512>),
7379

7480
// Address
7581
Address(Address),
82+
AddressBytes(Address),
7683
VecAddress(Vec<Address>),
84+
VecAddressBytes(Vec<Address>),
7785

7886
// Strings and Bytes
7987
String(String),
@@ -123,9 +131,13 @@ impl EthereumSqlTypeWrapper {
123131

124132
// 256-bit integers
125133
EthereumSqlTypeWrapper::U256(_) => "U256",
134+
EthereumSqlTypeWrapper::U256Bytes(_) => "U256Bytes",
126135
EthereumSqlTypeWrapper::I256(_) => "I256",
136+
EthereumSqlTypeWrapper::I256Bytes(_) => "I256Bytes",
127137
EthereumSqlTypeWrapper::VecU256(_) => "VecU256",
138+
EthereumSqlTypeWrapper::VecU256Bytes(_) => "VecU256Bytes",
128139
EthereumSqlTypeWrapper::VecI256(_) => "VecI256",
140+
EthereumSqlTypeWrapper::VecI256Bytes(_) => "VecI256Bytes",
129141

130142
// 512-bit integers
131143
EthereumSqlTypeWrapper::U512(_) => "U512",
@@ -135,15 +147,19 @@ impl EthereumSqlTypeWrapper {
135147
EthereumSqlTypeWrapper::H128(_) => "H128",
136148
EthereumSqlTypeWrapper::H160(_) => "H160",
137149
EthereumSqlTypeWrapper::H256(_) => "H256",
150+
EthereumSqlTypeWrapper::H256Bytes(_) => "H256Bytes",
138151
EthereumSqlTypeWrapper::H512(_) => "H512",
139152
EthereumSqlTypeWrapper::VecH128(_) => "VecH128",
140153
EthereumSqlTypeWrapper::VecH160(_) => "VecH160",
141154
EthereumSqlTypeWrapper::VecH256(_) => "VecH256",
155+
EthereumSqlTypeWrapper::VecH256Bytes(_) => "VecH256Bytes",
142156
EthereumSqlTypeWrapper::VecH512(_) => "VecH512",
143157

144158
// Address
145159
EthereumSqlTypeWrapper::Address(_) => "Address",
160+
EthereumSqlTypeWrapper::AddressBytes(_) => "AddressBytes",
146161
EthereumSqlTypeWrapper::VecAddress(_) => "VecAddress",
162+
EthereumSqlTypeWrapper::VecAddressBytes(_) => "VecAddressBytes",
147163

148164
// Strings and Bytes
149165
EthereumSqlTypeWrapper::String(_) => "String",
@@ -193,9 +209,13 @@ impl EthereumSqlTypeWrapper {
193209

194210
// 256-bit integers (kept as VARCHAR for decimal string representation)
195211
EthereumSqlTypeWrapper::U256(_) => PgType::VARCHAR,
212+
EthereumSqlTypeWrapper::U256Bytes(_) => PgType::BYTEA,
196213
EthereumSqlTypeWrapper::I256(_) => PgType::VARCHAR,
214+
EthereumSqlTypeWrapper::I256Bytes(_) => PgType::BYTEA,
197215
EthereumSqlTypeWrapper::VecU256(_) => PgType::VARCHAR_ARRAY,
216+
EthereumSqlTypeWrapper::VecU256Bytes(_) => PgType::BYTEA_ARRAY,
198217
EthereumSqlTypeWrapper::VecI256(_) => PgType::VARCHAR_ARRAY,
218+
EthereumSqlTypeWrapper::VecI256Bytes(_) => PgType::BYTEA_ARRAY,
199219

200220
// 512-bit integers
201221
EthereumSqlTypeWrapper::U512(_) => PgType::TEXT,
@@ -204,16 +224,22 @@ impl EthereumSqlTypeWrapper {
204224
// Hashes
205225
EthereumSqlTypeWrapper::H128(_) => PgType::BYTEA,
206226
EthereumSqlTypeWrapper::H160(_) => PgType::BYTEA,
227+
// TODO! LOOK AT THIS TYPE AS IT IS SAVED AS CHAR IN NO CODE
207228
EthereumSqlTypeWrapper::H256(_) => PgType::BYTEA,
229+
EthereumSqlTypeWrapper::H256Bytes(_) => PgType::BYTEA,
208230
EthereumSqlTypeWrapper::H512(_) => PgType::BYTEA,
209231
EthereumSqlTypeWrapper::VecH128(_) => PgType::BYTEA_ARRAY,
210232
EthereumSqlTypeWrapper::VecH160(_) => PgType::BYTEA_ARRAY,
233+
// TODO! LOOK AT THIS TYPE AS IT IS SAVED AS CHAR IN NO CODE
211234
EthereumSqlTypeWrapper::VecH256(_) => PgType::BYTEA_ARRAY,
235+
EthereumSqlTypeWrapper::VecH256Bytes(_) => PgType::BYTEA_ARRAY,
212236
EthereumSqlTypeWrapper::VecH512(_) => PgType::BYTEA_ARRAY,
213237

214238
// Address
215239
EthereumSqlTypeWrapper::Address(_) => PgType::BPCHAR,
240+
EthereumSqlTypeWrapper::AddressBytes(_) => PgType::BYTEA,
216241
EthereumSqlTypeWrapper::VecAddress(_) => PgType::TEXT_ARRAY,
242+
EthereumSqlTypeWrapper::VecAddressBytes(_) => PgType::BYTEA_ARRAY,
217243

218244
// Strings and Bytes
219245
EthereumSqlTypeWrapper::String(_) => PgType::TEXT,
@@ -262,6 +288,13 @@ impl ToSql for EthereumSqlTypeWrapper {
262288
let i256_value = u256_to_i256(*value);
263289
String::to_sql(&i256_value.to_string(), ty, out)
264290
}
291+
EthereumSqlTypeWrapper::U256Bytes(value) => {
292+
let mut bytes = [0u8; 32];
293+
value.to_big_endian(&mut bytes);
294+
let bytes = Bytes::from(bytes);
295+
out.extend_from_slice(&bytes);
296+
Ok(IsNull::No)
297+
}
265298
EthereumSqlTypeWrapper::VecU256(values) => {
266299
if values.is_empty() {
267300
Ok(IsNull::Yes)
@@ -278,10 +311,30 @@ impl ToSql for EthereumSqlTypeWrapper {
278311
String::to_sql(&formatted_str, ty, out)
279312
}
280313
}
314+
EthereumSqlTypeWrapper::VecU256Bytes(values) => {
315+
if values.is_empty() {
316+
Ok(IsNull::Yes)
317+
} else {
318+
for value in values {
319+
let mut bytes = [0u8; 32];
320+
value.to_big_endian(&mut bytes);
321+
let bytes = Bytes::from(bytes);
322+
out.extend_from_slice(&bytes);
323+
}
324+
Ok(IsNull::No)
325+
}
326+
}
281327
EthereumSqlTypeWrapper::I256(value) => {
282328
let value = value.to_string();
283329
String::to_sql(&value, ty, out)
284330
}
331+
EthereumSqlTypeWrapper::I256Bytes(value) => {
332+
let mut bytes = [0u8; 32];
333+
value.to_big_endian(&mut bytes);
334+
let bytes = Bytes::from(bytes);
335+
out.extend_from_slice(&bytes);
336+
Ok(IsNull::No)
337+
}
285338
EthereumSqlTypeWrapper::VecI256(values) => {
286339
if values.is_empty() {
287340
Ok(IsNull::Yes)
@@ -292,6 +345,19 @@ impl ToSql for EthereumSqlTypeWrapper {
292345
String::to_sql(&formatted_str, ty, out)
293346
}
294347
}
348+
EthereumSqlTypeWrapper::VecI256Bytes(values) => {
349+
if values.is_empty() {
350+
Ok(IsNull::Yes)
351+
} else {
352+
for value in values {
353+
let mut bytes = [0u8; 32];
354+
value.to_big_endian(&mut bytes);
355+
let bytes = Bytes::from(bytes);
356+
out.extend_from_slice(&bytes);
357+
}
358+
Ok(IsNull::No)
359+
}
360+
}
295361
EthereumSqlTypeWrapper::U512(value) => {
296362
let value = value.to_string();
297363
String::to_sql(&value, ty, out)
@@ -337,6 +403,11 @@ impl ToSql for EthereumSqlTypeWrapper {
337403
out.extend_from_slice(hex.as_bytes());
338404
Ok(IsNull::No)
339405
}
406+
EthereumSqlTypeWrapper::H256Bytes(value) => {
407+
let bytes: Bytes = value.as_bytes().to_vec().into();
408+
out.extend_from_slice(&bytes);
409+
Ok(IsNull::No)
410+
}
340411
EthereumSqlTypeWrapper::VecH256(values) => {
341412
let hexes: Vec<String> = values.iter().map(|s| format!("{:?}", s)).collect();
342413
if hexes.is_empty() {
@@ -345,6 +416,17 @@ impl ToSql for EthereumSqlTypeWrapper {
345416
hexes.to_sql(ty, out)
346417
}
347418
}
419+
EthereumSqlTypeWrapper::VecH256Bytes(values) => {
420+
if values.is_empty() {
421+
Ok(IsNull::Yes)
422+
} else {
423+
for value in values {
424+
let bytes: Bytes = value.as_bytes().to_vec().into();
425+
out.extend_from_slice(&bytes);
426+
}
427+
Ok(IsNull::No)
428+
}
429+
}
348430
EthereumSqlTypeWrapper::H512(value) => {
349431
let hex = format!("{:?}", value);
350432
out.extend_from_slice(hex.as_bytes());
@@ -362,6 +444,11 @@ impl ToSql for EthereumSqlTypeWrapper {
362444
let hex = format!("{:?}", value);
363445
String::to_sql(&hex, ty, out)
364446
}
447+
EthereumSqlTypeWrapper::AddressBytes(value) => {
448+
let bytes: Bytes = value.as_bytes().to_vec().into();
449+
out.extend_from_slice(&bytes);
450+
Ok(IsNull::No)
451+
}
365452
EthereumSqlTypeWrapper::VecAddress(values) => {
366453
let addresses: Vec<String> = values.iter().map(|s| format!("{:?}", s)).collect();
367454
if addresses.is_empty() {
@@ -370,6 +457,17 @@ impl ToSql for EthereumSqlTypeWrapper {
370457
addresses.to_sql(ty, out)
371458
}
372459
}
460+
EthereumSqlTypeWrapper::VecAddressBytes(values) => {
461+
if values.is_empty() {
462+
Ok(IsNull::Yes)
463+
} else {
464+
for value in values {
465+
let bytes: Bytes = value.as_bytes().to_vec().into();
466+
out.extend_from_slice(&bytes);
467+
}
468+
Ok(IsNull::No)
469+
}
470+
}
373471
EthereumSqlTypeWrapper::Bool(value) => bool::to_sql(value, ty, out),
374472
EthereumSqlTypeWrapper::VecBool(values) => {
375473
if values.is_empty() {
@@ -409,11 +507,13 @@ impl ToSql for EthereumSqlTypeWrapper {
409507
Ok(IsNull::No)
410508
}
411509
EthereumSqlTypeWrapper::VecBytes(values) => {
412-
let hexes: Vec<String> = values.iter().map(|s| format!("{:?}", s)).collect();
413-
if hexes.is_empty() {
510+
if values.is_empty() {
414511
Ok(IsNull::Yes)
415512
} else {
416-
hexes.to_sql(ty, out)
513+
for value in values {
514+
out.extend_from_slice(value);
515+
}
516+
Ok(IsNull::No)
417517
}
418518
}
419519
EthereumSqlTypeWrapper::U32(value) => {
@@ -1089,12 +1189,13 @@ pub fn map_ethereum_wrapper_to_json(
10891189
EthereumSqlTypeWrapper::VecI128(i128s) => {
10901190
json!(i128s.iter().map(|i| i.to_string()).collect::<Vec<_>>())
10911191
}
1092-
EthereumSqlTypeWrapper::U256(u) => {
1192+
EthereumSqlTypeWrapper::U256(u) | EthereumSqlTypeWrapper::U256Bytes(u) => {
10931193
// handle two's complement without adding a new type
10941194
let i256_value = u256_to_i256(*u);
10951195
json!(i256_value.to_string())
10961196
}
1097-
EthereumSqlTypeWrapper::VecU256(u256s) => {
1197+
EthereumSqlTypeWrapper::VecU256(u256s) |
1198+
EthereumSqlTypeWrapper::VecU256Bytes(u256s) => {
10981199
json!(u256s
10991200
.iter()
11001201
.map(|u| {
@@ -1104,8 +1205,11 @@ pub fn map_ethereum_wrapper_to_json(
11041205
})
11051206
.collect::<Vec<_>>())
11061207
}
1107-
EthereumSqlTypeWrapper::I256(i) => json!(i.to_string()),
1108-
EthereumSqlTypeWrapper::VecI256(i256s) => {
1208+
EthereumSqlTypeWrapper::I256(i) | EthereumSqlTypeWrapper::I256Bytes(i) => {
1209+
json!(i.to_string())
1210+
}
1211+
EthereumSqlTypeWrapper::VecI256(i256s) |
1212+
EthereumSqlTypeWrapper::VecI256Bytes(i256s) => {
11091213
json!(i256s.iter().map(|i| i.to_string()).collect::<Vec<_>>())
11101214
}
11111215
EthereumSqlTypeWrapper::U512(u) => json!(u.to_string()),
@@ -1116,12 +1220,17 @@ pub fn map_ethereum_wrapper_to_json(
11161220
EthereumSqlTypeWrapper::VecH128(h128s) => json!(h128s),
11171221
EthereumSqlTypeWrapper::H160(h) => json!(h),
11181222
EthereumSqlTypeWrapper::VecH160(h160s) => json!(h160s),
1119-
EthereumSqlTypeWrapper::H256(h) => json!(h),
1120-
EthereumSqlTypeWrapper::VecH256(h256s) => json!(h256s),
1223+
EthereumSqlTypeWrapper::H256(h) | EthereumSqlTypeWrapper::H256Bytes(h) => {
1224+
json!(h)
1225+
}
1226+
EthereumSqlTypeWrapper::VecH256(h256s) |
1227+
EthereumSqlTypeWrapper::VecH256Bytes(h256s) => json!(h256s),
11211228
EthereumSqlTypeWrapper::H512(h) => json!(h),
11221229
EthereumSqlTypeWrapper::VecH512(h512s) => json!(h512s),
1123-
EthereumSqlTypeWrapper::Address(address) => json!(address),
1124-
EthereumSqlTypeWrapper::VecAddress(addresses) => json!(addresses),
1230+
EthereumSqlTypeWrapper::Address(address) |
1231+
EthereumSqlTypeWrapper::AddressBytes(address) => json!(address),
1232+
EthereumSqlTypeWrapper::VecAddress(addresses) |
1233+
EthereumSqlTypeWrapper::VecAddressBytes(addresses) => json!(addresses),
11251234
EthereumSqlTypeWrapper::Bool(b) => json!(b),
11261235
EthereumSqlTypeWrapper::VecBool(bools) => json!(bools),
11271236
EthereumSqlTypeWrapper::U32(u) => json!(u),

documentation/docs/pages/docs/changelog.mdx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
### Features
77
-------------------------------------------------
88
- feat: expose an insert_bulk new postgres function to make inserting bulk data easier
9+
- feat: expose new ethereum sql type wrappers for bytes types
910

1011
### Bug fixes
1112
-------------------------------------------------

documentation/docs/pages/docs/start-building/rust-project-deep-dive/indexers.mdx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -796,9 +796,13 @@ pub enum EthereumSqlTypeWrapper {
796796
797797
// 256-bit integers
798798
U256(U256),
799+
U256Bytes(U256),
799800
I256(I256),
801+
I256Bytes(I256),
800802
VecU256(Vec<U256>),
803+
VecU256Bytes(Vec<U256>),
801804
VecI256(Vec<I256>),
805+
VecI256Bytes(Vec<I256>),
802806
803807
// 512-bit integers
804808
U512(U512),
@@ -808,21 +812,27 @@ pub enum EthereumSqlTypeWrapper {
808812
H128(H128),
809813
H160(H160),
810814
H256(H256),
815+
H256Bytes(H256),
811816
H512(H512),
812817
VecH128(Vec<H128>),
813818
VecH160(Vec<H160>),
814819
VecH256(Vec<H256>),
820+
VecH256Bytes(Vec<H256>),
815821
VecH512(Vec<H512>),
816822
817823
// Address
818824
Address(Address),
825+
AddressBytes(Address),
819826
VecAddress(Vec<Address>),
827+
VecAddressBytes(Vec<Address>),
820828
821829
// Strings and Bytes
822830
String(String),
823831
VecString(Vec<String>),
824832
Bytes(Bytes),
825833
VecBytes(Vec<Bytes>),
834+
835+
DateTime(DateTime<Utc>),
826836
}
827837
828838
// to use it you just pass the value in the enum

0 commit comments

Comments
 (0)