From 3bdeaec5b0a8a716bfaf8a7ffc0abeee0a16347d Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Tue, 10 Sep 2024 18:04:54 +0300 Subject: [PATCH 01/12] Update config stuff --- bun.lockb | Bin 586324 -> 586300 bytes vite.config.ts | 12 +++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 9e88507d583a015c803cc51b1059b54d66a7415c..d0c52df4d9330f9438bad5da727765c431aeb557 100755 GIT binary patch delta 8519 zcmeI1Yj{o9y2t0tT60}QDlWN8gfyjFttKlWQ6Y4r?&4nRmXKGN^p6pon{QK^}q}{fp^vfM;tZTE_y}DPpZAAXuK_Q7R?{#156>oc1 zZKiK;k8f}NWQ@A9P*1RDFV?kJ(Yo%=T@`ObA)&I6oE)bIs^wXFqLK8muC-Guv-B3m zCy=jI$t#c@t7N46FNcwkp!4(u-K~n|>51n5TuWRc*9Lv0CzzqSs?a&`TA~Kbf!8Ox z*1f8+(U4uMh$U$xR9J6E;kf#h(tWq*_7^{wioOuIGSss_Z6rc$~gXEeG_v zwL%4F>8(7M7VAfQxJ;U+*{k8>zvccY*CYQw%zIXL{J+_Ot`3yw0qXsmx^EjBT5pX> zSdqVm{5j-(kb5EThg?VgI`jU>eNj$BE`IMIH+crt^qOUO2Heq4ME?I${f|pE8%u@d zGDWRZ^9xL!)umk~AJx)h>a6cmXY)<{JXs#oFIF{w7p@&Uglkg|;o1dt{E(@inw$^N zBp=|SdKb>BQGqE{l~%S>AnhE+rORs0VO+{O3~*P#Rn`0mK>QJal}7-ssoMg66i|we zJgtwK%Cgl*qs@)ntNYh+pXqP*qz^G4(?$6`yH`e!(X|>lC1&jU^X}^dBGl?mX0sZa zY>pQ{?>petaov)wtJ7ZQJpyM>PBD8Xrx=66Otxi)N)EHuRzGDL%ezWQSzvO0B#lL@ z!XyNP1t5(hlklutNi=Odn1rPrcHFxPPEcp38?{?bq`S~fyfldnl>>nMeJ~kWEm#NoO(Uxf){#usPi9&N z)|qU26&tMi0d^srK}T7l?qoB`0>IjkeLxln_5#@~Fd0-3tPxq3syP#LoJ02zTypZ# zTryeZ$5>he`8+V`IusTm%Z-!^CUXpfl|jf3t_71Fst4;J6GPfazi{XTvdv(SF0DRb z8^SGBP-_6zfb4U!2(Sv6G`^MWdFa2vBy9te!9>EE2tdlC-wV(?v9~h69b^rm=X<;G ziL{fj5%d@a!7j2F!A62ffOyEH(;%~>Qb))BOZu9yg=p^kNigXT z4}5JJ*(v(91oP+0oF;1pR*Z?%M}CHN@ufiXLtTlTZ|T<>`V(xY?Eg74`j@ubz{UeM zLVg~O66vqPGQcF=VdcL=7xI++MAjB;Dp?s>JFxjMiHW;p_{yQ-8)Rin{7m+m%zp$- z(mlcs(BE@*qmkgO}%A*@#A`u{@M4R9Br zq<@ojhu%&0D_IiQ_i}4SdIToh)B|>n>~}KxnsS}&G3)jMD*=-j`_qj6!L{D7Qab9m z+em|bU>C?tV6shpVcW^fWOC$okQrpJgKYtm0JV_GG29F$0cr)4J_gAAyD>8Dgm2(N z0+}}}4+MLOtUCP$fi)p}j(&r|evp=tYLE?q&Li_B8w$2jn5=(I!er>r=~#;_1?;j+ z9jP|iFz72}b;yQ;WrE3R@dJ}_rNU;=FOYt3g2~fTPD>D&OZpoDYfi@yI=%%q9Z}sD zd0nzJ=yaH*P%x=G61GJEQa$>Of{x_Mgp*0VQw+lTWTR#NM+qAcz759{2snw*2r%hn z3~U{k1YRVV#LQS&E|>(~i)7=VbHF6_(pwI}-!dUX|ZX|EB^2F#^n2eK@%wPYR1=79Z!tP|N>un)mf zk#`1@_?QQ?BDN&ryVLI@Xd78lCBwSNeY(3hK9G9QaRIahVj8R`*+OUuI$^!Y7C}pZ zN$L$ItG*bv6rD)wN57AuPa_DW&DZJYhMxEAOT-(1GU_ETiB^gDA*}ofnRGr>6?}wm zZOOc(fXWcal2X8Ala|5mk`1Tda13;+C(~~o56N~wFF@EyOwK0T3B8aki)*8h$x82stpJk%b<6(CiX4FX(s2nL4}#Ss zTgnCxft6Xb%Ai$b`Cxd}rL97~jI029FzYU7dxyb>g5@I50h0+Ik>zVa$5pI+6fA*k zH7kDs)(UJ5@-_7P5_&!cBWW%DzJm59TSvcRU_NC3q~CEce=yfth|lPF0y-E_*m|;l*jvOQ$qN%-EDR*?1*UWCpe+edZ@th0<1X+K#Z zbR)6@WJO>S3vz-El3j)#&R{)6b_J{z*e==sd_ZaEDl7m{qWdt}_t3$te3X^1fu(~< z#D76n3_Y5DUy@x1b7A@A6nsT?1A02yF)$YftChfl8F0q|W%4&+F<^2sPO@?-^e9x8 zlkpANE$DPGNvBx%2WY&i)$);_rQeUxDeU80Fq!aexqS=+EI{Er9q&NP4e2oQ3uHe* z%MD4`cVuPIm2Y*BT_n2;oy1Nqk^Kyof_?uIc_El|d=Iw0a?n`+%XBOU+|PZ#LUteQ z0N7W^uY$?t3fM7-W5|oy-~;I6WH(s%Ay^VRk<(H__6u}xFgYzZg~|T^8b51 zH5)!s;U~eUS2C=>9Z=4!1eq5dtD)Q(juKFE2SZWw#z$?K1eBSqI?8p(3^E^-zraK! zo-AN8(dWPpLP$K>=~n|RUtVeptVZYyI3HyRGP#eVsMW+r2WW|t>d0jYYk|p`mi>Q@ zelj?DKPOvQgMKnNVbV}dGI@_76PA^9)n;XX6y`xoszVk4b{GScW%DBogqAIlRg(t@ zGA#%nGCP@h09i0}K3O1H2$-}ds}WSiTv}ZeI-(%6l!uSZE)-hsPBP27tQ-a{Z}lX} z0|`Z~9zJ9+GNUlEaA@g7233!&K6F=T=_?$$^dWBryIJ~F!3K1U0F*nR3?PDz&qK?W zNF(xuL#9RI;{^P~{{^ymdH5rp-)g93_if>-#&pB*bXaB->+LMnu!^uxaeWm`{tS_K zx$^F|6HMOM%In!~FnJ}L1nU9o3F`%uSF&x@=xn2f{)cCMwsB6^`>3fai~t|`+hhQ2 zAZ(B)cZD&`N7*(QW4-Lv)TbMbzUur2@*?aKOzO&uvhQI9*ta6pvd9SWyNY5tic3)c z3iMLsm(}PZG;mcdE;0hl#h_~34x^6BFEY%b*HF9+ON67eBb7HpuapMVb=0UOZ7xP} zD6AW7uUS1QG8XvA%$s0IUV>fpEWd0t^wRfu3a%P|*X=UA!SLOqe6AS*m_y_><7ue0 zBwy2I67n^C3QXSE$&ZU7)uz~p(a$L#%+|B4*my~|7hlH(q*m&i>qcu+v?E&i-Y^21 zHFY?fRlddx$EqDWdFoDZ(qM;8AKcW@%;|{Ix}ZuBuDn^8xV=x4_)=a`gKiihAjNvDo`WF5$|ZGww4$HA+hLMn~;&7mIAl-tFCTX z6R__QT%3+LRqn9Vu|Z?*=-^3-ks1~w?nyXf-e_@U?c(aK@^+PbiFEHwZg34x{(VnxV#=58Kl%F+N9X71~YO9|$OpOn;#;PQLd`!7z307;$ zEw$8{GZvd_^s>cQ{ak9PrfSKBiU&rtT3==f^*p|1N$`?-!D`cwMzE*nZOaQL^<|mm zExoUL`L3m%Z3O;2#?UiW(ql`oXX#zbUcGK9{xHTt&U6o`>+1EWI`o6#rw>!7%Pm3rG|%mF zONK53>!>?DuUA-}G`44j;n9YaC1CU)AW#_y7O^ delta 8357 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 Jgh%#${{`Vu4f_B9 diff --git a/vite.config.ts b/vite.config.ts index ec916a0..5fcc8d4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,5 +3,15 @@ import { defineConfig } from 'vite' import { nodePolyfills } from 'vite-plugin-node-polyfills' export default defineConfig({ - plugins: [nodePolyfills(), sveltekit()], + plugins: [ + nodePolyfills({ + include: ['path', 'stream', 'util'], + globals: { + Buffer: true, + global: true, + process: true, + }, + }), + sveltekit(), + ], }) From dbce4e2acff769a63c64f0502a05c458e4c25147 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Wed, 11 Sep 2024 18:51:52 +0300 Subject: [PATCH 02/12] Add more logging --- bun.lockb | Bin 586300 -> 586300 bytes src/lib/utils.ts | 14 ++++++++++---- src/routes/diamond/[address]/+page.server.ts | 2 ++ src/routes/diamond/[address]/json/+server.ts | 11 ++++------- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/bun.lockb b/bun.lockb index d0c52df4d9330f9438bad5da727765c431aeb557..4c2c8b1c8f70f9b8336cc4e39b871ddbc7a5cb80 100755 GIT binary patch delta 37 tcmdn<%Sl<7N!>F7M3lne;+fO>KV5^VQqWD*7k&b+Y=5OJ^(d~503x< delta 37 tcmdn<%Sl<7N!>F7M3lne;+d&=oz# => { try { const response = await fetch(`https://anyabi.xyz/api/get-abi/${chainId}/${address}`) - if (!response.ok) return { name: 'Unverified', address, abi: [] } + if (!response.ok) { + consola.info('ABI not found.') + return { name: 'Unverified', address, abi: [] } + } const contractData = await response.json() return { @@ -78,7 +81,8 @@ export const getContractInformation = async ( } } catch (e) { consola.error(e) - throw new Error('Contract not found') + consola.info('ABI not found.') + return { name: 'Unverified', address, abi: [] } } } @@ -89,6 +93,7 @@ export const getCachedContractInformation = async ( ): Promise => { try { consola.info('Fetching contract information for', address, 'on chain', chainId) + consola.info('Checking for cached ABI...') const result = await db .select() .from(contracts) @@ -102,6 +107,7 @@ export const getCachedContractInformation = async ( address, } } + consola.info('Not found in cache. Fetching from anyabi.xyz...') const contract = await getContractInformation(address, chainId) // Don't cache unverified contracts @@ -110,7 +116,7 @@ export const getCachedContractInformation = async ( } // Update the database - consola.info('Updating db cache') + consola.info('Updating db cache...') await db.insert(contracts).values({ id: `${chainId}:${address}`, name: contract.name, @@ -122,7 +128,7 @@ export const getCachedContractInformation = async ( return contract } catch (e) { consola.error(e) - throw new Error('Contract not found') + throw new Error('Failed to fetch contract information') } } diff --git a/src/routes/diamond/[address]/+page.server.ts b/src/routes/diamond/[address]/+page.server.ts index 60a0f16..fd47753 100644 --- a/src/routes/diamond/[address]/+page.server.ts +++ b/src/routes/diamond/[address]/+page.server.ts @@ -16,6 +16,7 @@ import { chainMap } from '$lib/chains' import { type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' import { diamonds } from '../../../schema' import { sql } from 'drizzle-orm' +import consola from 'consola' export const load: PageServerLoad = async ({ params, url, locals }) => { const { address } = params @@ -54,6 +55,7 @@ export const load: PageServerLoad = async ({ params, url, locals }) => { } // Udate the database + consola.info('Updating stats...') await locals.db .insert(diamonds) .values({ diff --git a/src/routes/diamond/[address]/json/+server.ts b/src/routes/diamond/[address]/json/+server.ts index 6958855..f317c99 100644 --- a/src/routes/diamond/[address]/json/+server.ts +++ b/src/routes/diamond/[address]/json/+server.ts @@ -17,10 +17,10 @@ import { } from 'viem' import type { Chain } from 'viem/chains' import { chainMap } from '$lib/chains' -import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' -import { Database } from 'bun:sqlite' +import { type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' import { diamonds } from '../../../../schema' import { sql } from 'drizzle-orm' +import consola from 'consola' export const GET: RequestHandler = async ({ params, url, locals }) => { const { address } = params @@ -59,9 +59,8 @@ export const GET: RequestHandler = async ({ params, url, locals }) => { } // Udate the database - const sqlite = new Database('./data/louper.db') - const db = drizzle(sqlite) - await db + consola.info('Updating stats...') + await locals.db .insert(diamonds) .values({ id: `${network}:${address}`, @@ -77,8 +76,6 @@ export const GET: RequestHandler = async ({ params, url, locals }) => { }, }) - sqlite.close() - return json({ chain: network, diamond, From 55429a3bf336e8d666a24cd57db6cf24e757f3c9 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Wed, 18 Sep 2024 16:48:58 +0300 Subject: [PATCH 03/12] move hooks to only run on the server --- src/{hooks.ts => hooks.server.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/{hooks.ts => hooks.server.ts} (100%) diff --git a/src/hooks.ts b/src/hooks.server.ts similarity index 100% rename from src/hooks.ts rename to src/hooks.server.ts From 7dc942da21edac6f4b493fa8e73e577f70ed06dd Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Wed, 18 Sep 2024 17:04:45 +0300 Subject: [PATCH 04/12] move sqlite deps out of client --- src/lib/utils.server.ts | 88 ++++++++++++++++++++ src/lib/utils.ts | 85 +++---------------- src/routes/diamond/[address]/+page.server.ts | 2 +- src/routes/diamond/[address]/json/+server.ts | 6 +- 4 files changed, 101 insertions(+), 80 deletions(-) create mode 100644 src/lib/utils.server.ts diff --git a/src/lib/utils.server.ts b/src/lib/utils.server.ts new file mode 100644 index 0000000..96a47ee --- /dev/null +++ b/src/lib/utils.server.ts @@ -0,0 +1,88 @@ +import type { Address } from 'viem' +import type { Contract } from './types' +import consola from 'consola' +import type { BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' +import { contracts } from '../schema' +import { and, eq } from 'drizzle-orm' + +export const getContractInformation = async ( + address: Address, + chainId: number, +): Promise => { + try { + const response = await fetch(`https://anyabi.xyz/api/get-abi/${chainId}/${address}`) + if (!response.ok) { + consola.info('ABI not found.') + return { name: 'Unverified', address, abi: [] } + } + const contractData = await response.json() + + return { + ...contractData, + address, + } + } catch (e) { + consola.error(e) + consola.info('ABI not found.') + return { name: 'Unverified', address, abi: [] } + } +} + +export const getCachedContractInformation = async ( + address: Address, + chainId: number, + db: BunSQLiteDatabase, +): Promise => { + try { + consola.info('Fetching contract information for', address, 'on chain', chainId) + consola.info('Checking for cached ABI...') + const result = await db + .select() + .from(contracts) + .where(and(eq(contracts.address, address), eq(contracts.chainId, chainId))) + + if (result.length) { + consola.info('Found in db cache') + return { + name: result[0].name, + abi: [...JSON.parse(result[0].abi)], + address, + } + } + consola.info('Not found in cache. Fetching from anyabi.xyz...') + const contract = await getContractInformation(address, chainId) + + // Don't cache unverified contracts + if (contract.name === 'Unverified') { + return contract + } + + // Update the database + 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('Failed to fetch contract information') + } +} + +export const getFuncSigBySelector = async (selector: string): Promise => { + const response = await fetch( + `https://api.openchain.xyz/signature-database/v1/lookup?function=${selector}&filter=true`, + ) + const data = await response.json() + + if (data && data.result && data.result.function && data.result.function[selector]) { + return data.result.function[selector][0].name + } + + return 'unknown()' +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 361be22..64aac73 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -3,12 +3,8 @@ import { twMerge } from 'tailwind-merge' import { cubicOut } from 'svelte/easing' import type { TransitionConfig } from 'svelte/transition' import { type Abi, type AbiFunction, type Address } from 'viem' -import type { Contract } from './types' import toast from 'svelte-french-toast' -import Database from 'bun:sqlite' -import { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite' -import { contracts } from '../schema' -import { and, eq } from 'drizzle-orm' +import type { Contract } from './types' import consola from 'consola' export function cn(...inputs: ClassValue[]) { @@ -63,6 +59,16 @@ export const flyAndScale = ( } } +export const copyToClipboard = async (text: string) => { + await navigator.clipboard.writeText(text) + toast.success('Copied to clipboard!') +} + +export const abiMethods = (abi: Abi): AbiFunction[] => + abi.filter((i) => i.type === 'function') as AbiFunction[] + +export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) + export const getContractInformation = async ( address: Address, chainId: number, @@ -85,72 +91,3 @@ export const getContractInformation = async ( return { name: 'Unverified', address, abi: [] } } } - -export const getCachedContractInformation = async ( - address: Address, - chainId: number, - db: BunSQLiteDatabase, -): Promise => { - try { - consola.info('Fetching contract information for', address, 'on chain', chainId) - consola.info('Checking for cached ABI...') - const result = await db - .select() - .from(contracts) - .where(and(eq(contracts.address, address), eq(contracts.chainId, chainId))) - - if (result.length) { - consola.info('Found in db cache') - return { - name: result[0].name, - abi: [...JSON.parse(result[0].abi)], - address, - } - } - consola.info('Not found in cache. Fetching from anyabi.xyz...') - const contract = await getContractInformation(address, chainId) - - // Don't cache unverified contracts - if (contract.name === 'Unverified') { - return contract - } - - // Update the database - 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('Failed to fetch contract information') - } -} - -export const copyToClipboard = async (text: string) => { - await navigator.clipboard.writeText(text) - toast.success('Copied to clipboard!') -} - -export const getFuncSigBySelector = async (selector: string): Promise => { - const response = await fetch( - `https://api.openchain.xyz/signature-database/v1/lookup?function=${selector}&filter=true`, - ) - const data = await response.json() - - if (data && data.result && data.result.function && data.result.function[selector]) { - return data.result.function[selector][0].name - } - - return 'unknown()' -} - -export const abiMethods = (abi: Abi): AbiFunction[] => - abi.filter((i) => i.type === 'function') as AbiFunction[] - -export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) diff --git a/src/routes/diamond/[address]/+page.server.ts b/src/routes/diamond/[address]/+page.server.ts index fd47753..84c13a5 100644 --- a/src/routes/diamond/[address]/+page.server.ts +++ b/src/routes/diamond/[address]/+page.server.ts @@ -1,5 +1,5 @@ import type { FacetData, Contract, Diamond } from '$lib/types' -import { getCachedContractInformation, getFuncSigBySelector } from '$lib/utils' +import { getCachedContractInformation, getFuncSigBySelector } from '$lib/utils.server' import { error } from '@sveltejs/kit' import type { PageServerLoad } from './$types' import { diff --git a/src/routes/diamond/[address]/json/+server.ts b/src/routes/diamond/[address]/json/+server.ts index f317c99..8dc4b22 100644 --- a/src/routes/diamond/[address]/json/+server.ts +++ b/src/routes/diamond/[address]/json/+server.ts @@ -1,9 +1,5 @@ import type { FacetData, Contract, Diamond } from '$lib/types' -import { - getCachedContractInformation, - getContractInformation, - getFuncSigBySelector, -} from '$lib/utils' +import { getCachedContractInformation, getFuncSigBySelector } from '$lib/utils.server' import { error, json } from '@sveltejs/kit' import type { RequestHandler } from './$types' import { From c88db474ab03baf4a5bc7e90dd8c85c9d10eb6c1 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Wed, 18 Sep 2024 17:34:05 +0300 Subject: [PATCH 05/12] use older version of bun... --- Dockerfile | 2 +- src/routes/diamond/[address]/json/+server.ts | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 4eb4996..2472da6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.1-slim +FROM oven/bun:1.0-slim WORKDIR /app COPY package.json package.json diff --git a/src/routes/diamond/[address]/json/+server.ts b/src/routes/diamond/[address]/json/+server.ts index 8dc4b22..3c5f7ca 100644 --- a/src/routes/diamond/[address]/json/+server.ts +++ b/src/routes/diamond/[address]/json/+server.ts @@ -71,12 +71,15 @@ export const GET: RequestHandler = async ({ params, url, locals }) => { visits: sql`${diamonds.visits} + 1`, }, }) + consola.info('Stats updated.') - return json({ + const response = { chain: network, diamond, diamondAbi, - }) + } + + return json(response) } catch (e) { console.error(e) throw error(400, { message: 'Unable to fetch diamond details' }) From 740624270b0f54f6d70f4574c2d9bfd25d546628 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Wed, 18 Sep 2024 17:51:54 +0300 Subject: [PATCH 06/12] bump version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2472da6..e85f7dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM oven/bun:1.0-slim +FROM oven/bun:1.1.20-slim WORKDIR /app COPY package.json package.json From f10cc1d35677fbe7b0e9445d5a0ba097883cf5db Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Thu, 19 Sep 2024 09:27:29 +0300 Subject: [PATCH 07/12] Add better handling for unknown selectors --- src/lib/utils.server.ts | 2 +- src/routes/diamond/[address]/+page.server.ts | 1 + .../diamond/[address]/FacetsTable.svelte | 36 +++++++++++++------ src/routes/diamond/[address]/json/+server.ts | 5 +++ 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/lib/utils.server.ts b/src/lib/utils.server.ts index 96a47ee..0b04a13 100644 --- a/src/lib/utils.server.ts +++ b/src/lib/utils.server.ts @@ -84,5 +84,5 @@ export const getFuncSigBySelector = async (selector: string): Promise => return data.result.function[selector][0].name } - return 'unknown()' + return `unknown_${selector}()` } diff --git a/src/routes/diamond/[address]/+page.server.ts b/src/routes/diamond/[address]/+page.server.ts index 84c13a5..f2a4249 100644 --- a/src/routes/diamond/[address]/+page.server.ts +++ b/src/routes/diamond/[address]/+page.server.ts @@ -102,6 +102,7 @@ const buildFacet = async ( const fileredAbi: Abi = facet.abi.filter((item) => { if (item.type !== 'function') return true + if (item.name.indexOf('unknown_') > -1) return true if (!item.outputs) { item.outputs = [] } diff --git a/src/routes/diamond/[address]/FacetsTable.svelte b/src/routes/diamond/[address]/FacetsTable.svelte index 601f3d8..69c8c06 100644 --- a/src/routes/diamond/[address]/FacetsTable.svelte +++ b/src/routes/diamond/[address]/FacetsTable.svelte @@ -70,17 +70,31 @@ - - {toFunctionSelector(m)} - - + {#if m.name.indexOf('unknown_') > -1} + + {m.name.split('_')[1]} + + + {:else} + + {toFunctionSelector(m)} + + + {/if} {/each} diff --git a/src/routes/diamond/[address]/json/+server.ts b/src/routes/diamond/[address]/json/+server.ts index 3c5f7ca..53e27e6 100644 --- a/src/routes/diamond/[address]/json/+server.ts +++ b/src/routes/diamond/[address]/json/+server.ts @@ -105,6 +105,11 @@ const buildFacet = async ( const fileredAbi: Abi = facet.abi.filter((item) => { if (item.type !== 'function') return true + if (item.name.indexOf('unknown_') > -1) { + if (selectors.includes(item.name.split('_')[1])) { + return true + } + } if (!item.outputs) { item.outputs = [] } From 70ba19d40cbf7f7686d7c6a21c1baa3ac0f74e77 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Thu, 19 Sep 2024 09:46:25 +0300 Subject: [PATCH 08/12] Allow removing of unknown selectors --- src/routes/diamond/[address]/EditFacet.svelte | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/routes/diamond/[address]/EditFacet.svelte b/src/routes/diamond/[address]/EditFacet.svelte index 6fbd91e..08fd020 100644 --- a/src/routes/diamond/[address]/EditFacet.svelte +++ b/src/routes/diamond/[address]/EditFacet.svelte @@ -22,6 +22,8 @@ parseAbi, zeroAddress, type WriteContractReturnType, + type AbiItem, + type AbiFunction, } from 'viem' import type { Chain } from 'viem/chains' import ConnectWallet from './ConnectWallet.svelte' @@ -263,6 +265,13 @@ } } } + + const getFunctionSelector = (m: AbiFunction) => { + if (m.name.indexOf('unknown_') > -1) { + return m.name.split('_')[1] + } + return toFunctionSelector(m) + }
@@ -364,10 +373,10 @@
@@ -375,12 +384,12 @@
- {toFunctionSelector(m)} + {getFunctionSelector(m)} {m.name}
@@ -423,23 +432,23 @@ - r.includes(toFunctionSelector(m)), + r.includes(getFunctionSelector(m)), )} />
- r.includes(toFunctionSelector(m)), + r.includes(getFunctionSelector(m)), )} class="flex items-center p-1 rounded-md bg-opacity-90" > - {toFunctionSelector(m)} + {getFunctionSelector(m)} {m.name}
From 540e54fa6dab24c3fdeaea8e4192e4dcdf112c45 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Fri, 20 Sep 2024 13:09:35 +0300 Subject: [PATCH 09/12] Update viem --- bun.lockb | Bin 586300 -> 586916 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index 4c2c8b1c8f70f9b8336cc4e39b871ddbc7a5cb80..b6e63efc0cb2bb934c2c325fed9c74fb4bbfe2ea 100755 GIT binary patch delta 66345 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 OoQj`mo0s7*>wf`-GbtSa delta 65421 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 KRN#4mh5sK4!@`CD diff --git a/package.json b/package.json index f435ce0..cc2dcfc 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "svelte-tags-input": "^5.0.0", "tailwind-merge": "^1.14.0", "tailwind-variants": "^0.1.20", - "viem": "^2.21.4" + "viem": "^2.21.10" }, "trustedDependencies": [ "@sveltejs/kit", From 3dfd6b21d110f7d996e0d4d26c4d3aeccad306f5 Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Tue, 19 Nov 2024 12:59:03 +0300 Subject: [PATCH 10/12] Update viem --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc2dcfc..e1b106b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "svelte-tags-input": "^5.0.0", "tailwind-merge": "^1.14.0", "tailwind-variants": "^0.1.20", - "viem": "^2.21.10" + "viem": "^2.21.48" }, "trustedDependencies": [ "@sveltejs/kit", From fc0c8e3b8e7b6e1800c596c8932605bb19149c9f Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Tue, 19 Nov 2024 13:22:46 +0300 Subject: [PATCH 11/12] Pin vite-plugin-svelte --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e1b106b..b46f035 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "devDependencies": { "@sveltejs/adapter-auto": "^2.1.1", "@sveltejs/kit": "^2.5.26", + "@sveltejs/vite-plugin-svelte": "3.1.2", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "autoprefixer": "^10.4.20", From c68003f99e6c49b331ad943d4facafade67a932c Mon Sep 17 00:00:00 2001 From: Ed Zynda Date: Tue, 19 Nov 2024 13:26:18 +0300 Subject: [PATCH 12/12] Remove old workflows --- .github/workflows/rollout.staging.yml | 25 ------------------------- .github/workflows/rollout.yml | 25 ------------------------- 2 files changed, 50 deletions(-) delete mode 100644 .github/workflows/rollout.staging.yml delete mode 100644 .github/workflows/rollout.yml diff --git a/.github/workflows/rollout.staging.yml b/.github/workflows/rollout.staging.yml deleted file mode 100644 index 5d0eb4a..0000000 --- a/.github/workflows/rollout.staging.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: rollout-staging - -on: - workflow_dispatch: - schedule: - - cron: '0 */6 * * *' - -jobs: - docker: - runs-on: ubuntu-latest - - steps: - - name: Install doctl - uses: digitalocean/action-doctl@v2 - with: - token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} - - - name: Save DigitalOcean kubeconfig with short-lived credentials - run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 662138bb-8236-4da5-8c6d-c602fb6eef82 - - - name: Deploy to DigitalOcean Kubernetes - run: kubectl rollout restart deployment/louper-deployment-staging -n louper-staging - - - name: Verify deployment - run: kubectl rollout status deployment/louper-deployment-staging -n louper-staging diff --git a/.github/workflows/rollout.yml b/.github/workflows/rollout.yml deleted file mode 100644 index 3bc8453..0000000 --- a/.github/workflows/rollout.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: rollout-prod - -on: - workflow_dispatch: - schedule: - - cron: '0 */6 * * *' - -jobs: - docker: - runs-on: ubuntu-latest - - steps: - - name: Install doctl - uses: digitalocean/action-doctl@v2 - with: - token: ${{ secrets.DIGITALOCEAN_ACCESS_TOKEN }} - - - name: Save DigitalOcean kubeconfig with short-lived credentials - run: doctl kubernetes cluster kubeconfig save --expiry-seconds 600 662138bb-8236-4da5-8c6d-c602fb6eef82 - - - name: Deploy to DigitalOcean Kubernetes - run: kubectl rollout restart deployment/louper-deployment -n louper - - - name: Verify deployment - run: kubectl rollout status deployment/louper-deployment -n louper