@@ -381,19 +381,30 @@ impl StaticHandler {
381381 & self ,
382382 contract_address : & str ,
383383 ) -> Result < ( serde_json:: Value , String ) > {
384- // Find the first token with this contract address
384+ // Find tokens with this contract address that have non-empty metadata
385385 let pattern = format ! ( "{}:%" , contract_address) ;
386- let query_str = format ! ( "SELECT metadata, id FROM {TOKENS_TABLE} WHERE id LIKE ? LIMIT 1" ) ;
387- let query_result = sqlx:: query_as :: < _ , ( String , String ) > ( & query_str)
386+ let query_str = format ! (
387+ "SELECT metadata, id FROM {TOKENS_TABLE} WHERE id LIKE ? AND metadata != '' ORDER BY id LIMIT 100"
388+ ) ;
389+ let query_results = sqlx:: query_as :: < _ , ( String , String ) > ( & query_str)
388390 . bind ( & pattern)
389- . fetch_one ( & self . pool )
391+ . fetch_all ( & self . pool )
390392 . await
391393 . context ( "Failed to find any tokens for contract address" ) ?;
392394
393- let metadata: serde_json:: Value =
394- serde_json:: from_str ( & query_result. 0 ) . context ( "Failed to parse token metadata" ) ?;
395+ // Try to find a token with valid metadata that contains an image field
396+ for ( metadata_str, token_id) in query_results {
397+ if let Ok ( metadata) = serde_json:: from_str :: < serde_json:: Value > ( & metadata_str) {
398+ if metadata. get ( "image" ) . is_some ( ) {
399+ return Ok ( ( metadata, token_id) ) ;
400+ }
401+ }
402+ }
395403
396- Ok ( ( metadata, query_result. 1 ) )
404+ Err ( anyhow:: anyhow!(
405+ "No tokens found with valid image metadata for contract address: {}" ,
406+ contract_address
407+ ) )
397408 }
398409
399410 async fn check_if_image_outdated (
@@ -537,21 +548,50 @@ impl StaticHandler {
537548 // Try to get metadata and image_uri, with fallback for contracts
538549 let metadata = match query_result {
539550 Ok ( result) => {
540- let metadata: serde_json :: Value =
541- serde_json :: from_str ( & result. 0 ) . context ( "Failed to parse metadata" ) ? ;
542-
543- // Check if image field exists
544- if metadata . get ( "image" ) . is_some ( ) {
545- metadata
546- } else if is_contract {
547- // Fallback: try to find first token with this contract address
548- debug ! ( target: LOG_TARGET , contract_address = %token_id, "No image found in contract metadata, searching for first token") ;
549- let ( fallback_metadata , fallback_token_id ) =
550- self . get_first_token_metadata ( token_id ) . await ? ;
551- debug ! ( target : LOG_TARGET , contract_address = %token_id , fallback_token = %fallback_token_id , "Using fallback token image" ) ;
552- fallback_metadata
551+ // Check if metadata is empty or whitespace-only
552+ let metadata_str = result. 0 . trim ( ) ;
553+ if metadata_str . is_empty ( ) {
554+ if is_contract {
555+ // Fallback: try to find first token with this contract address
556+ debug ! ( target : LOG_TARGET , contract_address = %token_id , "Empty metadata for contract, searching for first token" ) ;
557+ let ( fallback_metadata , fallback_token_id ) =
558+ self . get_first_token_metadata ( token_id ) . await ? ;
559+ debug ! ( target: LOG_TARGET , contract_address = %token_id, fallback_token = %fallback_token_id , "Using fallback token image ") ;
560+ fallback_metadata
561+ } else {
562+ return Err ( anyhow :: anyhow! ( "Empty metadata for token" ) ) ;
563+ }
553564 } else {
554- return Err ( anyhow:: anyhow!( "Image URL not found in metadata" ) ) ;
565+ // Try to parse the metadata
566+ match serde_json:: from_str :: < serde_json:: Value > ( metadata_str) {
567+ Ok ( metadata) => {
568+ // Check if image field exists
569+ if metadata. get ( "image" ) . is_some ( ) {
570+ metadata
571+ } else if is_contract {
572+ // Fallback: try to find first token with this contract address
573+ debug ! ( target: LOG_TARGET , contract_address = %token_id, "No image found in contract metadata, searching for first token" ) ;
574+ let ( fallback_metadata, fallback_token_id) =
575+ self . get_first_token_metadata ( token_id) . await ?;
576+ debug ! ( target: LOG_TARGET , contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image" ) ;
577+ fallback_metadata
578+ } else {
579+ return Err ( anyhow:: anyhow!( "Image URL not found in metadata" ) ) ;
580+ }
581+ }
582+ Err ( e) => {
583+ if is_contract {
584+ // Fallback: try to find first token with this contract address
585+ debug ! ( target: LOG_TARGET , contract_address = %token_id, error = ?e, "Failed to parse contract metadata, searching for first token" ) ;
586+ let ( fallback_metadata, fallback_token_id) =
587+ self . get_first_token_metadata ( token_id) . await ?;
588+ debug ! ( target: LOG_TARGET , contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image" ) ;
589+ fallback_metadata
590+ } else {
591+ return Err ( anyhow:: anyhow!( "Failed to parse metadata: {}" , e) ) ;
592+ }
593+ }
594+ }
555595 }
556596 }
557597 Err ( _) if is_contract => {
0 commit comments