diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 868ba9a..4854058 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -6,7 +6,7 @@ import { type Address } from 'viem' import type { Contract } from './types' import toast from 'svelte-french-toast' import Database from 'bun:sqlite' -import { drizzle } from 'drizzle-orm/bun-sqlite' +import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' import { contracts } from '../schema' import { and, eq } from 'drizzle-orm' import consola from 'consola' @@ -68,9 +68,26 @@ export const getContractInformation = async ( chainId: number, ): Promise => { try { - const sqlite = new Database('./data/louper.db') - const db = drizzle(sqlite) + const response = await fetch(`https://anyabi.xyz/api/get-abi/${chainId}/${address}`) + if (!response.ok) return { name: 'Unverified', address, abi: [] } + const contractData = await response.json() + + return { + ...contractData, + address, + } + } catch (e) { + consola.error(e) + throw new Error('Contract not found') + } +} +export const getCachedContractInformation = async ( + address: Address, + chainId: number, + db: BunSQLiteDatabase, +): Promise => { + try { consola.info('Fetching contract information for', address, 'on chain', chainId) const result = await db .select() @@ -85,26 +102,19 @@ export const getContractInformation = async ( address, } } - - const response = await fetch(`https://anyabi.xyz/api/get-abi/${chainId}/${address}`) - if (!response.ok) return { name: 'Unverified', address, abi: [] } - const contractData = await response.json() + const contract = await getContractInformation(address, chainId) // Update the database - // consola.info('Updating db cache') - // await db.insert(contracts).values({ - // id: `${chainId}:${address}`, - // name: contractData.name, - // address, - // abi: JSON.stringify(contractData.abi), - // chainId, - // }) - - sqlite.close() - return { - ...contractData, + consola.info('Updating db cache') + await db.insert(contracts).values({ + id: `${chainId}:${address}`, + name: contract.name, address, - } + abi: JSON.stringify(contract.abi), + chainId, + }) + + return contract } catch (e) { consola.error(e) throw new Error('Contract not found') diff --git a/src/routes/diamond/[address]/+page.server.ts b/src/routes/diamond/[address]/+page.server.ts index 8a29f36..9abf487 100644 --- a/src/routes/diamond/[address]/+page.server.ts +++ b/src/routes/diamond/[address]/+page.server.ts @@ -1,5 +1,9 @@ import type { FacetData, Contract, Diamond } from '$lib/types' -import { getContractInformation, getFuncSigBySelector } from '$lib/utils' +import { + getCachedContractInformation, + getContractInformation, + getFuncSigBySelector, +} from '$lib/utils' import { error } from '@sveltejs/kit' import type { PageServerLoad } from './$types' import { @@ -13,7 +17,7 @@ import { } from 'viem' import type { Chain } from 'viem/chains' import { chainMap } from '$lib/chains' -import { drizzle } from 'drizzle-orm/bun-sqlite' +import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' import { Database } from 'bun:sqlite' import { diamonds } from '../../../schema' import { sql } from 'drizzle-orm' @@ -42,13 +46,13 @@ export const load: PageServerLoad = async ({ params, url, locals }) => { // Build the diamond const diamond: Diamond = { - ...(await getContractInformation(getAddress(address), chain.id)), + ...(await getCachedContractInformation(getAddress(address), chain.id, locals.db)), facets: [], } // Fetch all facet information for (const [address, selectors] of facetData) { - const facet = await buildFacet(address, selectors, chain.id) + const facet = await buildFacet(address, selectors, chain.id, locals.db) if (!facet) continue diamond.facets.push(facet) diamondAbi = [...diamondAbi, ...facet.abi] @@ -86,8 +90,9 @@ const buildFacet = async ( address: Address, selectors: string[], chainId: number, + db: BunSQLiteDatabase, ): Promise => { - const facet: Contract = await getContractInformation(address, chainId) + const facet: Contract = await getCachedContractInformation(address, chainId, db) const abiSigs = [] if (!facet.abi.length) { diff --git a/src/routes/diamond/[address]/json/+server.ts b/src/routes/diamond/[address]/json/+server.ts index 66dc703..6958855 100644 --- a/src/routes/diamond/[address]/json/+server.ts +++ b/src/routes/diamond/[address]/json/+server.ts @@ -1,5 +1,9 @@ import type { FacetData, Contract, Diamond } from '$lib/types' -import { getContractInformation, getFuncSigBySelector } from '$lib/utils' +import { + getCachedContractInformation, + getContractInformation, + getFuncSigBySelector, +} from '$lib/utils' import { error, json } from '@sveltejs/kit' import type { RequestHandler } from './$types' import { @@ -13,12 +17,12 @@ import { } from 'viem' import type { Chain } from 'viem/chains' import { chainMap } from '$lib/chains' -import { drizzle } from 'drizzle-orm/bun-sqlite' +import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' import { Database } from 'bun:sqlite' import { diamonds } from '../../../../schema' import { sql } from 'drizzle-orm' -export const GET: RequestHandler = async ({ params, url }) => { +export const GET: RequestHandler = async ({ params, url, locals }) => { const { address } = params const network = url.searchParams.get('network') ?? 'mainnet' @@ -42,13 +46,13 @@ export const GET: RequestHandler = async ({ params, url }) => { // Build the diamond const diamond: Diamond = { - ...(await getContractInformation(getAddress(address), chain.id)), + ...(await getCachedContractInformation(getAddress(address), chain.id, locals.db)), facets: [], } // Fetch all facet information for (const [address, selectors] of facetData) { - const facet = await buildFacet(address, selectors, chain.id) + const facet = await buildFacet(address, selectors, chain.id, locals.db) if (!facet) continue diamond.facets.push(facet) diamondAbi = [...diamondAbi, ...facet.abi] @@ -90,8 +94,9 @@ const buildFacet = async ( address: Address, selectors: string[], chainId: number, + db: BunSQLiteDatabase, ): Promise => { - const facet: Contract = await getContractInformation(address, chainId) + const facet: Contract = await getCachedContractInformation(address, chainId, db) const abiSigs = [] if (!facet.abi.length) {