Initial commit with 🏗️ Scaffold-ETH 2 @ 1.0.5
This commit is contained in:
72
packages/nextjs/utils/scaffold-eth/fetchPriceFromUniswap.ts
Normal file
72
packages/nextjs/utils/scaffold-eth/fetchPriceFromUniswap.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
import { ChainWithAttributes, getAlchemyHttpUrl } from "./networks";
|
||||
import { CurrencyAmount, Token } from "@uniswap/sdk-core";
|
||||
import { Pair, Route } from "@uniswap/v2-sdk";
|
||||
import { Address, createPublicClient, fallback, http, parseAbi } from "viem";
|
||||
import { mainnet } from "viem/chains";
|
||||
|
||||
const alchemyHttpUrl = getAlchemyHttpUrl(mainnet.id);
|
||||
const rpcFallbacks = alchemyHttpUrl ? [http(alchemyHttpUrl), http()] : [http()];
|
||||
const publicClient = createPublicClient({
|
||||
chain: mainnet,
|
||||
transport: fallback(rpcFallbacks),
|
||||
});
|
||||
|
||||
const ABI = parseAbi([
|
||||
"function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)",
|
||||
"function token0() external view returns (address)",
|
||||
"function token1() external view returns (address)",
|
||||
]);
|
||||
|
||||
export const fetchPriceFromUniswap = async (targetNetwork: ChainWithAttributes): Promise<number> => {
|
||||
if (
|
||||
targetNetwork.nativeCurrency.symbol !== "ETH" &&
|
||||
targetNetwork.nativeCurrency.symbol !== "SEP" &&
|
||||
!targetNetwork.nativeCurrencyTokenAddress
|
||||
) {
|
||||
return 0;
|
||||
}
|
||||
try {
|
||||
const DAI = new Token(1, "0x6B175474E89094C44Da98b954EedeAC495271d0F", 18);
|
||||
const TOKEN = new Token(
|
||||
1,
|
||||
targetNetwork.nativeCurrencyTokenAddress || "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
|
||||
18,
|
||||
);
|
||||
const pairAddress = Pair.getAddress(TOKEN, DAI) as Address;
|
||||
|
||||
const wagmiConfig = {
|
||||
address: pairAddress,
|
||||
abi: ABI,
|
||||
};
|
||||
|
||||
const reserves = await publicClient.readContract({
|
||||
...wagmiConfig,
|
||||
functionName: "getReserves",
|
||||
});
|
||||
|
||||
const token0Address = await publicClient.readContract({
|
||||
...wagmiConfig,
|
||||
functionName: "token0",
|
||||
});
|
||||
|
||||
const token1Address = await publicClient.readContract({
|
||||
...wagmiConfig,
|
||||
functionName: "token1",
|
||||
});
|
||||
const token0 = [TOKEN, DAI].find(token => token.address === token0Address) as Token;
|
||||
const token1 = [TOKEN, DAI].find(token => token.address === token1Address) as Token;
|
||||
const pair = new Pair(
|
||||
CurrencyAmount.fromRawAmount(token0, reserves[0].toString()),
|
||||
CurrencyAmount.fromRawAmount(token1, reserves[1].toString()),
|
||||
);
|
||||
const route = new Route([pair], TOKEN, DAI);
|
||||
const price = parseFloat(route.midPrice.toSignificant(6));
|
||||
return price;
|
||||
} catch (error) {
|
||||
console.error(
|
||||
`useNativeCurrencyPrice - Error fetching ${targetNetwork.nativeCurrency.symbol} price from Uniswap: `,
|
||||
error,
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user