diff --git a/package-lock.json b/package-lock.json index a4a0d55..cb91a85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1521,9 +1521,9 @@ "integrity": "sha512-p0oOHXr60hXZuLNsQ/PsOQtCfia79thm7MjPxTrnnBvD+csJoHzARYMB0IFj/KTw6U5vLXODgjJAn8x6QksLwg==" }, "@oceanprotocol/lib": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-0.9.5.tgz", - "integrity": "sha512-r+mcLwTgB+A42Q1lX0Ni+Yv3xgaujU3uOrSrKs+uNfVt/VCitublgZYnOhZws2odinJt2Ca7cjDPK4QtNzw7MQ==", + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-0.9.7.tgz", + "integrity": "sha512-C47Bv1d9IEvWkI2cOAYUE115jc6iN87ddDdl/BTCAiHKVllhl3TvoSMD+kdwfTivnsiW6HytpqL56IGtA/F4zQ==", "requires": { "@ethereum-navigator/navigator": "^0.5.0", "@oceanprotocol/contracts": "^0.5.7", diff --git a/package.json b/package.json index 2ffd8f1..dc6fe2d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "dist/" ], "dependencies": { - "@oceanprotocol/lib": "^0.9.6", + "@oceanprotocol/lib": "^0.9.7", "axios": "^0.21.0", "decimal.js": "^10.2.1", "web3": "^1.3.0", diff --git a/src/hooks/useMetadata/useMetadata.ts b/src/hooks/useMetadata/useMetadata.ts index d5a198c..0dc2113 100644 --- a/src/hooks/useMetadata/useMetadata.ts +++ b/src/hooks/useMetadata/useMetadata.ts @@ -19,6 +19,7 @@ interface UseMetadata { price: BestPrice | undefined isLoaded: boolean getPrice: (dataTokenAddress: string) => Promise + refreshPrice: () => void } function useMetadata(asset?: DID | string | DDO): UseMetadata { @@ -42,8 +43,15 @@ function useMetadata(asset?: DID | string | DDO): UseMetadata { ) const getPrice = useCallback( - async (dataTokenAddress: string): Promise => { - const price = await getBestDataTokenPrice(ocean, dataTokenAddress) + async ( + dataTokenAddress: string, + poolAddress?: string + ): Promise => { + const price = await getBestDataTokenPrice( + ocean, + dataTokenAddress, + poolAddress + ) return price }, [ocean] @@ -74,7 +82,14 @@ function useMetadata(asset?: DID | string | DDO): UseMetadata { } init() }, [asset, getDDO]) - + async function refreshPrice(): Promise { + if (!internalDdo) return + const livePrice = await getPrice( + internalDdo.dataToken, + internalDdo.price.pools[0] + ) + setPrice(livePrice) + } // // Get metadata & price for stored DDO // @@ -98,7 +113,10 @@ function useMetadata(asset?: DID | string | DDO): UseMetadata { return // Set price again, but from chain - const priceLive = await getPrice(internalDdo.dataToken) + const priceLive = await getPrice( + internalDdo.dataToken, + internalDdo.price.pools[0] + ) priceLive && internalDdo.price !== priceLive && setPrice(priceLive) } init() @@ -111,8 +129,8 @@ function useMetadata(asset?: DID | string | DDO): UseMetadata { // ) // return - // const priceLive = await getPrice(internalDdo.dataToken) - // priceLive && setPrice(priceLive) + // await refreshPrice + // }, 10000) // return () => { @@ -127,7 +145,8 @@ function useMetadata(asset?: DID | string | DDO): UseMetadata { title, price, isLoaded, - getPrice + getPrice, + refreshPrice } } diff --git a/src/utils/dtUtils.ts b/src/utils/dtUtils.ts index 05632a4..bf34394 100644 --- a/src/utils/dtUtils.ts +++ b/src/utils/dtUtils.ts @@ -85,19 +85,32 @@ export async function getCheapestExchange( export async function getFirstPool( ocean: Ocean, - dataTokenAddress: string + dataTokenAddress: string, + poolAddress?: string ): Promise { - const tokenPools = await ocean.pool.searchPoolforDT(dataTokenAddress) + let firstPoolAddress = poolAddress + if (!poolAddress) { + const tokenPools = await ocean.pool.searchPoolforDT(dataTokenAddress) - if (tokenPools === undefined || tokenPools.length === 0) { + if (tokenPools === undefined || tokenPools.length === 0) { + return { + address: '', + price: 0 + } + } + firstPoolAddress = tokenPools[0] + } + if (!firstPoolAddress) { return { address: '', price: 0 } } - const firstPoolAddress = tokenPools[0] + const firstPoolPrice = await ocean.pool.getOceanNeeded(firstPoolAddress, '1') + const oceanReserve = await ocean.pool.getOceanReserve(firstPoolAddress) + const dtReserve = await ocean.pool.getDTReserve(firstPoolAddress) return { @@ -110,9 +123,10 @@ export async function getFirstPool( export async function getBestDataTokenPrice( ocean: Ocean, - dataTokenAddress: string + dataTokenAddress: string, + poolAddress?: string ): Promise { - const cheapestPool = await getFirstPool(ocean, dataTokenAddress) + const cheapestPool = await getFirstPool(ocean, dataTokenAddress, poolAddress) const cheapestExchange = await getCheapestExchange(ocean, dataTokenAddress) Decimal.set({ precision: 5 })