11import { useEffect , useState } from 'react' ;
2- import { createPublicClient , http , formatUnits } from 'viem' ;
32
43// Naga Prod PriceFeed contract address
54const NAGA_PROD_PRICE_FEED_ADDRESS = '0x88F5535Fa6dA5C225a3C06489fE4e3405b87608C' ;
@@ -215,8 +214,12 @@ async function getLitKeyPrice() {
215214/**
216215 * Convert wei to LITKEY tokens (18 decimals)
217216 */
218- function weiToTokens ( wei ) {
219- return Number ( formatUnits ( wei , 18 ) ) ;
217+ function weiToTokens ( wei , viem ) {
218+ if ( ! viem || ! viem . formatUnits ) {
219+ // Fallback if viem isn't loaded yet
220+ return Number ( wei ) / 1e18 ;
221+ }
222+ return Number ( viem . formatUnits ( wei , 18 ) ) ;
220223}
221224
222225/**
@@ -238,13 +241,40 @@ export const CurrentPricesTable = () => {
238241 const [ litActionConfigs , setLitActionConfigs ] = useState ( [ ] ) ;
239242 const [ litKeyPriceUSD , setLitKeyPriceUSD ] = useState ( null ) ;
240243 const [ usagePercent , setUsagePercent ] = useState ( null ) ;
244+ const [ viemLoaded , setViemLoaded ] = useState ( false ) ;
245+
246+ // Load viem from CDN
247+ useEffect ( ( ) => {
248+ // Check if viem is already loaded
249+ if ( window . viem ) {
250+ setViemLoaded ( true ) ;
251+ return ;
252+ }
253+
254+ // Load viem from esm.sh CDN (supports ES modules)
255+ import ( 'https://esm.sh/[email protected] ' ) . then ( ( viemModule ) => { 256+ window . viem = viemModule ;
257+ setViemLoaded ( true ) ;
258+ } ) . catch ( ( err ) => {
259+ console . error ( 'Error loading viem:' , err ) ;
260+ setError ( 'Failed to load viem library from CDN' ) ;
261+ setLoading ( false ) ;
262+ } ) ;
263+ } , [ ] ) ;
241264
242265 useEffect ( ( ) => {
266+ if ( ! viemLoaded || ! window . viem ) {
267+ return ;
268+ }
269+
243270 async function fetchPrices ( ) {
244271 try {
245272 setLoading ( true ) ;
246273 setError ( null ) ;
247274
275+ const viem = window . viem ;
276+ const { createPublicClient, http } = viem ;
277+
248278 // Create public client
249279 const publicClient = createPublicClient ( {
250280 chain : LIT_CHAIN ,
@@ -302,7 +332,7 @@ export const CurrentPricesTable = () => {
302332 }
303333
304334 fetchPrices ( ) ;
305- } , [ ] ) ;
335+ } , [ viemLoaded ] ) ;
306336
307337 if ( loading ) {
308338 return (
@@ -386,9 +416,9 @@ export const CurrentPricesTable = () => {
386416 </ thead >
387417 < tbody >
388418 { PRODUCT_IDS . map ( ( productId , index ) => {
389- const basePriceInTokens = weiToTokens ( basePrices [ index ] ) ;
390- const maxPriceInTokens = weiToTokens ( maxPrices [ index ] ) ;
391- const currentPriceInTokens = weiToTokens ( currentPrices [ index ] ) ;
419+ const basePriceInTokens = weiToTokens ( basePrices [ index ] , window . viem ) ;
420+ const maxPriceInTokens = weiToTokens ( maxPrices [ index ] , window . viem ) ;
421+ const currentPriceInTokens = weiToTokens ( currentPrices [ index ] , window . viem ) ;
392422 const basePriceInUSD = litKeyPriceUSD
393423 ? basePriceInTokens * litKeyPriceUSD
394424 : null ;
@@ -489,7 +519,7 @@ export const CurrentPricesTable = () => {
489519 `Component ${ priceComponentNum } ` ;
490520 const measurementName =
491521 MEASUREMENT_NAMES [ priceMeasurementNum ] || '' ;
492- const priceInTokens = weiToTokens ( config . price ) ;
522+ const priceInTokens = weiToTokens ( config . price , window . viem ) ;
493523 const priceInUSD = litKeyPriceUSD
494524 ? priceInTokens * litKeyPriceUSD
495525 : null ;
0 commit comments