Skip to content
This repository was archived by the owner on Apr 26, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/lib/chain-mapping/chains.ts
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,21 @@ const chainMapping: Record<string, string> = {
FVMT: "Filecoin Testnet",
HEDERA: "Hedera",
HEDERAT: "Hedera Testnet",
BERAT2: "Berachain Testnet",
BERA: "Berachain Mainnet",
BNB: "BNB Chain Mainnet",
BNT: "BNB Chain Testnet",
POLYGONA: "Polygon Amoy Testnet",
MOVEMENTT: "Movement Testnet",
HYPERLIQUID: "Hyperliquid Mainnet",
HYPERLIQUIDT: "Hyperliquid Testnet",
XLM: "Stellar Mainnet",
XLMT: "Stellar Testnet",
SONIC: "Sonic Mainnet",
BTC: "Bitcoin Mainnet",
BTCT: "Bitcoin Testnet",
BCH: "Bitcoin Cash Mainnet",
BCHT: "Bitcoin Cash Testnet",
};

/**
Expand Down
16 changes: 16 additions & 0 deletions src/lib/icons/data/chain-icons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,4 +173,20 @@ export const chainDictionary: { [key: string]: ChainInfo } = {
secret2t: { name: "Secret Testnet", icon: "/icons/secret.png" },
hedera: { name: "Hedera", icon: "/icons/hedera.svg" },
hederat: { name: "Hedera Testnet", icon: "/icons/hedera.svg" },
polygona: { name: "Polygon", icon: "/icons/polygon-pos.svg" },
bnb: { name: "BNB Chain", icon: "/icons/binance-smart-chain.svg" },
bnt: { name: "BNB Chain Testnet", icon: "/icons/binance-smart-chain.svg" },
bera: { name: "Berachain", icon: "/icons/berachain-icon.webp" },
berat: { name: "Berachain Testnet", icon: "/icons/berachain-icon.webp" },
hyperliquid: { name: "Hyperliquid", icon: "/icons/HL-green.svg" },
hyperliquidt: { name: "Hyperliquid Testnet", icon: "/icons/HL-green.svg" },
xlm: { name: "Stellar", icon: "/icons/stellar.svg" },
xlmt: { name: "Stellar Testnet", icon: "/icons/stellar.svg" },
sonic: { name: "Sonic", icon: "/icons/sonic.svg" },
union: { name: "Union", icon: "/icons/union.svg" },
uniont: { name: "Union Testnet", icon: "/icons/union.svg" },
btct: { name: "Bitcoin Testnet", icon: "/icons/bitcoin.svg" },
bch: { name: "Bitcoin Cash", icon: "/icons/bitcoincash.svg" },
bcht: { name: "Bitcoin Cash Testnet", icon: "/icons/bitcoincash.svg" },
avaxt: { name: "Avalanche Testnet", icon: "/icons/avalanche.svg" },
};
13 changes: 12 additions & 1 deletion src/redis/resources/index/IndexTopChainsResource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,18 @@ export class IndexTopChainsResource extends RedisResourceBase<IndexTopChainsData
"HYPERLIQUID",
"HYPERLIQUIDT",
"HEDERA",
"HEDERAT"
"HEDERAT",
"XLM",
"XLMT",
"SONIC",
"UNION",
"UNIONT",
"BTC",
"BTCT",
"BCH",
"BCHT",
"AVAX",
"AVAXT"
].map(chain => chain.toLowerCase().trim());

const testnetChains = [
Expand Down
12 changes: 7 additions & 5 deletions src/utils/db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { MaskPassword, JSONStringify } from './fmt';

interface DbConnection {
db: PostgresJsDatabase;
sqlClient: ReturnType<typeof postgres>;
lastUsed: number;
inUse: boolean;
createdAt: number;
Expand Down Expand Up @@ -194,10 +195,11 @@ class DbConnectionPoolClass {
for (let attempt = 0; attempt < urls.length; attempt++) {
try {
const url = await this.getNextValidUrl(urls);
const db = await this.createDbConnection(url);
const { db, sqlClient } = await this.createDbConnection(url);
await db.select({ now: sql`NOW()` }).from(sql`(SELECT 1) AS foo`).limit(1);
return {
db,
sqlClient,
lastUsed: Date.now(),
inUse: false,
createdAt: Date.now(),
Expand Down Expand Up @@ -225,7 +227,7 @@ class DbConnectionPoolClass {
throw lastError || new Error('Failed to connect to any database URL');
}

private async createDbConnection(url: string): Promise<PostgresJsDatabase> {
private async createDbConnection(url: string): Promise<{ db: PostgresJsDatabase; sqlClient: ReturnType<typeof postgres> }> {
const config = this.connectionString === "jsinfo"
? {
idle_timeout: 60 * 2,
Expand All @@ -240,7 +242,7 @@ class DbConnectionPoolClass {
};

const queryClient = postgres(url, config);
return drizzle(queryClient);
return { db: drizzle(queryClient), sqlClient: queryClient };
}

private async getConnection(queryKey: string): Promise<DbConnection> {
Expand Down Expand Up @@ -305,9 +307,9 @@ class DbConnectionPoolClass {
try {
return await queryFn(conn.db).finally(async () => {
// Close the postgres client
if (this.connections.includes(conn)) return;
if (!this.connections.includes(conn)) return;

await (conn.db as any).client.end();
await conn.sqlClient.end();
// Remove from connections array
this.connections = this.connections.filter(c => c.id !== conn.id);

Expand Down
Loading