create-eth
Version:
Create a Scaffold-ETH-2 app
73 lines (65 loc) • 2.48 kB
text/typescript
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;
}
};