Skip to content

Commit

Permalink
Use singleton
Browse files Browse the repository at this point in the history
  • Loading branch information
ezynda3 committed Mar 10, 2024
1 parent e06b374 commit caca11b
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 31 deletions.
50 changes: 30 additions & 20 deletions src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -68,9 +68,26 @@ export const getContractInformation = async (
chainId: number,
): Promise<Contract> => {
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<Contract> => {
try {
consola.info('Fetching contract information for', address, 'on chain', chainId)
const result = await db
.select()
Expand All @@ -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')
Expand Down
15 changes: 10 additions & 5 deletions src/routes/diamond/[address]/+page.server.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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'
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -86,8 +90,9 @@ const buildFacet = async (
address: Address,
selectors: string[],
chainId: number,
db: BunSQLiteDatabase,
): Promise<Contract | undefined> => {
const facet: Contract = await getContractInformation(address, chainId)
const facet: Contract = await getCachedContractInformation(address, chainId, db)

const abiSigs = []
if (!facet.abi.length) {
Expand Down
17 changes: 11 additions & 6 deletions src/routes/diamond/[address]/json/+server.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand All @@ -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 = <string>url.searchParams.get('network') ?? 'mainnet'

Expand All @@ -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]
Expand Down Expand Up @@ -90,8 +94,9 @@ const buildFacet = async (
address: Address,
selectors: string[],
chainId: number,
db: BunSQLiteDatabase,
): Promise<Contract | undefined> => {
const facet: Contract = await getContractInformation(address, chainId)
const facet: Contract = await getCachedContractInformation(address, chainId, db)

const abiSigs = []
if (!facet.abi.length) {
Expand Down

0 comments on commit caca11b

Please sign in to comment.