@@ -8,13 +8,17 @@ use sqlx::{Pool, Row, Sqlite, SqliteConnection};
8
8
use tokio_stream:: StreamExt ;
9
9
use torii_sqlite:: simple_broker:: SimpleBroker ;
10
10
use torii_sqlite:: types:: Token ;
11
+ use tracing:: warn;
11
12
12
13
use super :: handle_cursor;
13
14
use crate :: constants:: {
14
- DEFAULT_LIMIT , ERC20_TOKEN_NAME , ERC20_TYPE_NAME , ERC721_TOKEN_NAME , ERC721_TYPE_NAME ,
15
- ID_COLUMN ,
15
+ DEFAULT_LIMIT , ERC1155_TOKEN_NAME , ERC1155_TYPE_NAME , ERC20_TOKEN_NAME , ERC20_TYPE_NAME ,
16
+ ERC721_TOKEN_NAME , ERC721_TYPE_NAME , ID_COLUMN ,
17
+ } ;
18
+ use crate :: mapping:: {
19
+ ERC1155_TOKEN_TYPE_MAPPING , ERC20_TOKEN_TYPE_MAPPING , ERC721_TOKEN_TYPE_MAPPING ,
20
+ TOKEN_TYPE_MAPPING ,
16
21
} ;
17
- use crate :: mapping:: { ERC20_TOKEN_TYPE_MAPPING , ERC721_TOKEN_TYPE_MAPPING , TOKEN_TYPE_MAPPING } ;
18
22
use crate :: object:: connection:: page_info:: PageInfoObject ;
19
23
use crate :: object:: connection:: {
20
24
connection_arguments, cursor, parse_connection_arguments, ConnectionArguments ,
@@ -58,10 +62,28 @@ impl BasicObject for Erc721TokenObject {
58
62
}
59
63
}
60
64
65
+ #[ derive( Debug ) ]
66
+ pub struct Erc1155TokenObject ;
67
+
68
+ impl BasicObject for Erc1155TokenObject {
69
+ fn name ( & self ) -> ( & str , & str ) {
70
+ ERC1155_TOKEN_NAME
71
+ }
72
+
73
+ fn type_name ( & self ) -> & str {
74
+ ERC1155_TYPE_NAME
75
+ }
76
+
77
+ fn type_mapping ( & self ) -> & TypeMapping {
78
+ & ERC1155_TOKEN_TYPE_MAPPING
79
+ }
80
+ }
81
+
61
82
#[ derive( Debug , Clone ) ]
62
83
pub enum ErcTokenType {
63
84
Erc20 ( Erc20Token ) ,
64
85
Erc721 ( Erc721Token ) ,
86
+ Erc1155 ( Erc1155Token ) ,
65
87
}
66
88
67
89
#[ derive( Debug , Clone ) ]
@@ -86,6 +108,20 @@ pub struct Erc721Token {
86
108
pub image_path : String ,
87
109
}
88
110
111
+ #[ derive( Debug , Clone ) ]
112
+ pub struct Erc1155Token {
113
+ pub name : String ,
114
+ pub symbol : String ,
115
+ pub token_id : String ,
116
+ pub contract_address : String ,
117
+ pub amount : String ,
118
+ pub metadata : String ,
119
+ pub metadata_name : Option < String > ,
120
+ pub metadata_description : Option < String > ,
121
+ pub metadata_attributes : Option < String > ,
122
+ pub image_path : String ,
123
+ }
124
+
89
125
impl ErcTokenType {
90
126
pub fn to_field_value < ' a > ( self ) -> FieldValue < ' a > {
91
127
match self {
@@ -122,6 +158,30 @@ impl ErcTokenType {
122
158
] ) ) ) ,
123
159
ERC721_TYPE_NAME . to_string ( ) ,
124
160
) ,
161
+ ErcTokenType :: Erc1155 ( token) => FieldValue :: with_type (
162
+ FieldValue :: value ( Value :: Object ( ValueMapping :: from ( [
163
+ ( Name :: new ( "name" ) , Value :: String ( token. name ) ) ,
164
+ ( Name :: new ( "symbol" ) , Value :: String ( token. symbol ) ) ,
165
+ ( Name :: new ( "tokenId" ) , Value :: String ( token. token_id ) ) ,
166
+ ( Name :: new ( "contractAddress" ) , Value :: String ( token. contract_address ) ) ,
167
+ ( Name :: new ( "amount" ) , Value :: String ( token. amount ) ) ,
168
+ ( Name :: new ( "metadata" ) , Value :: String ( token. metadata ) ) ,
169
+ (
170
+ Name :: new ( "metadataName" ) ,
171
+ token. metadata_name . map ( Value :: String ) . unwrap_or ( Value :: Null ) ,
172
+ ) ,
173
+ (
174
+ Name :: new ( "metadataDescription" ) ,
175
+ token. metadata_description . map ( Value :: String ) . unwrap_or ( Value :: Null ) ,
176
+ ) ,
177
+ (
178
+ Name :: new ( "metadataAttributes" ) ,
179
+ token. metadata_attributes . map ( Value :: String ) . unwrap_or ( Value :: Null ) ,
180
+ ) ,
181
+ ( Name :: new ( "imagePath" ) , Value :: String ( token. image_path ) ) ,
182
+ ] ) ) ) ,
183
+ ERC1155_TYPE_NAME . to_string ( ) ,
184
+ ) ,
125
185
}
126
186
}
127
187
}
@@ -446,7 +506,65 @@ impl ResolvableObject for TokenObject {
446
506
} ;
447
507
ErcTokenType :: Erc721 ( token)
448
508
}
449
- _ => return None ,
509
+ "erc1155" => {
510
+ let id = row. get:: <String , _>( "id" ) ;
511
+ let token_id =
512
+ id. split( ':' ) . collect:: <Vec <& str >>( ) [ 1 ] . to_string( ) ;
513
+
514
+ let metadata_str: String = row. get( "metadata" ) ;
515
+ let (
516
+ metadata_str,
517
+ metadata_name,
518
+ metadata_description,
519
+ metadata_attributes,
520
+ image_path,
521
+ ) = if metadata_str. is_empty( ) {
522
+ ( String :: new( ) , None , None , None , String :: new( ) )
523
+ } else {
524
+ let metadata: serde_json:: Value =
525
+ serde_json:: from_str( & metadata_str)
526
+ . expect( "metadata is always json" ) ;
527
+ let metadata_name = metadata. get( "name" ) . map( |v| {
528
+ v. to_string( ) . trim_matches( '"' ) . to_string( )
529
+ } ) ;
530
+ let metadata_description =
531
+ metadata. get( "description" ) . map( |v| {
532
+ v. to_string( ) . trim_matches( '"' ) . to_string( )
533
+ } ) ;
534
+ let metadata_attributes =
535
+ metadata. get( "attributes" ) . map( |v| {
536
+ v. to_string( ) . trim_matches( '"' ) . to_string( )
537
+ } ) ;
538
+
539
+ let image_path =
540
+ format!( "{}/image" , id. replace( ":" , "/" ) ) ;
541
+ (
542
+ metadata_str,
543
+ metadata_name,
544
+ metadata_description,
545
+ metadata_attributes,
546
+ image_path,
547
+ )
548
+ } ;
549
+
550
+ let token = Erc1155Token {
551
+ name: row. get( "name" ) ,
552
+ metadata: metadata_str,
553
+ contract_address: row. get( "contract_address" ) ,
554
+ symbol: row. get( "symbol" ) ,
555
+ token_id,
556
+ amount: "0" . to_string( ) ,
557
+ metadata_name,
558
+ metadata_description,
559
+ metadata_attributes,
560
+ image_path,
561
+ } ;
562
+ ErcTokenType :: Erc1155 ( token)
563
+ }
564
+ _ => {
565
+ warn!( "Unknown contract type: {}" , contract_type) ;
566
+ return None ;
567
+ }
450
568
} ;
451
569
452
570
Some ( Ok ( FieldValue :: owned_any( token_metadata) ) )
@@ -516,6 +634,52 @@ fn create_token_metadata_from_row(row: &SqliteRow) -> sqlx::Result<ErcTokenType>
516
634
} ;
517
635
ErcTokenType :: Erc721 ( token)
518
636
}
519
- _ => return Err ( sqlx:: Error :: RowNotFound ) ,
637
+ "erc1155" => {
638
+ // contract_address:token_id
639
+ let id = row. get :: < String , _ > ( "id" ) ;
640
+ let token_id = id. split ( ':' ) . collect :: < Vec < & str > > ( ) [ 1 ] . to_string ( ) ;
641
+
642
+ let metadata_str: String = row. get ( "metadata" ) ;
643
+ let (
644
+ metadata_str,
645
+ metadata_name,
646
+ metadata_description,
647
+ metadata_attributes,
648
+ image_path,
649
+ ) = if metadata_str. is_empty ( ) {
650
+ ( String :: new ( ) , None , None , None , String :: new ( ) )
651
+ } else {
652
+ let metadata: serde_json:: Value =
653
+ serde_json:: from_str ( & metadata_str) . expect ( "metadata is always json" ) ;
654
+ let metadata_name =
655
+ metadata. get ( "name" ) . map ( |v| v. to_string ( ) . trim_matches ( '"' ) . to_string ( ) ) ;
656
+ let metadata_description = metadata
657
+ . get ( "description" )
658
+ . map ( |v| v. to_string ( ) . trim_matches ( '"' ) . to_string ( ) ) ;
659
+ let metadata_attributes =
660
+ metadata. get ( "attributes" ) . map ( |v| v. to_string ( ) . trim_matches ( '"' ) . to_string ( ) ) ;
661
+
662
+ let image_path = format ! ( "{}/image" , id. replace( ":" , "/" ) ) ;
663
+ ( metadata_str, metadata_name, metadata_description, metadata_attributes, image_path)
664
+ } ;
665
+
666
+ let token = Erc1155Token {
667
+ name : row. get ( "name" ) ,
668
+ metadata : metadata_str,
669
+ contract_address : row. get ( "contract_address" ) ,
670
+ symbol : row. get ( "symbol" ) ,
671
+ token_id,
672
+ amount : "0" . to_string ( ) ,
673
+ metadata_name,
674
+ metadata_description,
675
+ metadata_attributes,
676
+ image_path,
677
+ } ;
678
+ ErcTokenType :: Erc1155 ( token)
679
+ }
680
+ _ => {
681
+ warn ! ( "Unknown contract type: {}" , contract_type) ;
682
+ return Err ( sqlx:: Error :: RowNotFound ) ;
683
+ }
520
684
} )
521
685
}
0 commit comments