@@ -21,7 +21,6 @@ use crate::{db::models::{Block, Transaction, BlockWithTransactions}, indexer::Bl
2121use crate :: arch_rpc:: ArchRpcClient ;
2222use std:: collections:: HashSet ;
2323use axum:: http:: StatusCode as AxStatusCode ;
24- use sqlx:: Row as _;
2524
2625#[ derive( serde:: Serialize ) ]
2726pub struct TokenListRow {
@@ -322,45 +321,6 @@ pub async fn get_token_detail(
322321 Ok ( Json ( json ! ( { "error" : "not_found" } ) ) )
323322}
324323
325- // Backfill token_metadata for existing mints by scanning token_mints and decoding on-chain metadata PDAs when available.
326- // For now, we opportunistically copy name/symbol/uri from any existing token_metadata rows or leave nulls if not present.
327- pub async fn backfill_token_metadata (
328- State ( pool) : State < Arc < PgPool > > ,
329- ) -> Result < Json < serde_json:: Value > , ApiError > {
330- // If tables are missing, exit gracefully
331- let has_mints: bool = sqlx:: query_scalar ( "SELECT to_regclass('public.token_mints') IS NOT NULL" )
332- . fetch_one ( & * pool) . await . unwrap_or ( false ) ;
333- let has_metadata: bool = sqlx:: query_scalar ( "SELECT to_regclass('public.token_metadata') IS NOT NULL" )
334- . fetch_one ( & * pool) . await . unwrap_or ( false ) ;
335- if !has_mints || !has_metadata {
336- return Ok ( Json ( json ! ( { "updated" : 0 , "skipped" : true } ) ) ) ;
337- }
338-
339- // Upsert metadata rows for all known mints with placeholders where needed
340- let mints: Vec < ( String , Option < String > ) > = sqlx:: query (
341- r#"
342- SELECT tm.mint_address, md.mint_address AS has_md
343- FROM token_mints tm
344- LEFT JOIN token_metadata md ON md.mint_address = tm.mint_address
345- "#
346- )
347- . fetch_all ( & * pool)
348- . await
349- . map ( |rows| rows. into_iter ( ) . map ( |r| ( r. get :: < String , _ > ( "mint_address" ) , r. try_get :: < Option < String > , _ > ( "has_md" ) . ok ( ) . flatten ( ) ) ) . collect ( ) )
350- . unwrap_or_default ( ) ;
351-
352- let mut updated: i64 = 0 ;
353- for ( mint, has_md) in mints {
354- if has_md. is_some ( ) { continue ; }
355- let _ = sqlx:: query ( "SELECT upsert_token_metadata($1, COALESCE((SELECT program_id FROM token_mints WHERE mint_address = $1), ''), NULL, NULL, NULL, NULL)" )
356- . bind ( & mint)
357- . execute ( & * pool)
358- . await ;
359- updated += 1 ;
360- }
361- Ok ( Json ( json ! ( { "updated" : updated} ) ) )
362- }
363-
364324fn key_to_bytes ( v : & serde_json:: Value ) -> Option < Vec < u8 > > {
365325 if let Some ( arr) = v. as_array ( ) {
366326 return Some ( arr. iter ( ) . filter_map ( |x| x. as_i64 ( ) . map ( |n| n as u8 ) ) . collect ( ) ) ;
@@ -484,6 +444,7 @@ fn fallback_program_name_from_b58(b58: &str) -> Option<String> {
484444 "ComputeBudget111111111111111111111111111111" => Some ( "Compute Budget Program" . to_string ( ) ) ,
485445 "AplToken111111111111111111111111" => Some ( "APL Token Program" . to_string ( ) ) ,
486446 "AssociatedTokenAccount1111111111" => Some ( "APL Associated Token Account Program" . to_string ( ) ) ,
447+ "ArchTokenMetadata111111111111111" => Some ( "APL Token Metadata Program" . to_string ( ) ) ,
487448
488449 // Accept legacy/base58 forms for friendly label
489450 "7ZMyUmgbNckx7G5BCrdmX2XUasjDAk5uhcMpDbUDxHQ3" => Some ( "APL Token" . to_string ( ) ) ,
@@ -512,6 +473,7 @@ fn fallback_program_name_from_hex(hex_id: &str) -> Option<String> {
512473 "ComputeBudget111111111111111111111111111111" => return Some ( "Compute Budget Program" . to_string ( ) ) ,
513474 "AplToken111111111111111111111111" => return Some ( "APL Token Program" . to_string ( ) ) ,
514475 "AssociatedTokenAccount1111111111" => return Some ( "APL Associated Token Account Program" . to_string ( ) ) ,
476+ "ArchTokenMetadata111111111111111" => return Some ( "APL Token Metadata Program" . to_string ( ) ) ,
515477 _ => { }
516478 }
517479 }
0 commit comments