Compare commits

..

2 Commits

Author SHA1 Message Date
c41ea74b60
pricing of LP as valuation through tokenValue on treasury
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-06-05 17:40:56 +03:00
3b11ac0162
markdown multiplication for correct representation of bond price, including LP bonds
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-06-05 17:23:37 +03:00
9 changed files with 39 additions and 13 deletions

View File

@ -1,7 +1,7 @@
{ {
"name": "ghost-dao-interface", "name": "ghost-dao-interface",
"private": true, "private": true,
"version": "0.0.30", "version": "0.0.32",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

File diff suppressed because one or more lines are too long

View File

@ -20,6 +20,7 @@ import { PrimaryButton, SecondaryButton } from "../../Button";
import { useBalance } from "../../../hooks/tokens"; import { useBalance } from "../../../hooks/tokens";
import { useDaiPrice, useFtsoPrice, useStnkPrice, useGhstPrice } from "../../../hooks/prices"; import { useDaiPrice, useFtsoPrice, useStnkPrice, useGhstPrice } from "../../../hooks/prices";
import { useLpValuation } from "../../../hooks/treasury";
import { useAccount } from "wagmi"; import { useAccount } from "wagmi";
const addTokenToWallet = async (token, userAddress) => { const addTokenToWallet = async (token, userAddress) => {
@ -175,7 +176,7 @@ export const useWallet = (chainId, userAddress) => {
const ftsoPrice = useFtsoPrice(chainId); const ftsoPrice = useFtsoPrice(chainId);
const stnkPrice = useStnkPrice(chainId); const stnkPrice = useStnkPrice(chainId);
const ghstPrice = useGhstPrice(chainId); const ghstPrice = useGhstPrice(chainId);
// TODO: add lp price const lpDaiFtsoPrice = useLpValuation(chainId, "GDAI_FTSO", 1000000000000000000n);
const tokens = { const tokens = {
dai: { dai: {
@ -215,7 +216,7 @@ export const useWallet = (chainId, userAddress) => {
symbol: "UNI-V2", symbol: "UNI-V2",
address: lpDaiFtsoBalanceAddress, address: lpDaiFtsoBalanceAddress,
balance: lpDaiFtsoBalance, balance: lpDaiFtsoBalance,
price: ftsoPrice, price: lpDaiFtsoPrice,
icons: ["GDAI", "FTSO"], icons: ["GDAI", "FTSO"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/uni-v2.svg", externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/uni-v2.svg",
} }

View File

@ -48,6 +48,10 @@ export const GHOST_GOVERNANCE_ADDRESSES = {
[NetworkId.TESTNET_SEPOLIA]: "0xD40E6442Ee01c234CD8AaF335122CfbB2aec8548", [NetworkId.TESTNET_SEPOLIA]: "0xD40E6442Ee01c234CD8AaF335122CfbB2aec8548",
}; };
export const BONDING_CALCULATOR_ADDRESSES = {
[NetworkId.TESTNET_SEPOLIA]: "0x29a6bb5De7a1049632E107544CaEF05e518451e7",
}
export const UNISWAP_V2_ROUTER = { export const UNISWAP_V2_ROUTER = {
[NetworkId.TESTNET_SEPOLIA]: "0xee567fe1712faf6149d80da1e6934e354124cfe3", [NetworkId.TESTNET_SEPOLIA]: "0xee567fe1712faf6149d80da1e6934e354124cfe3",
}; };

View File

@ -23,16 +23,13 @@ import { useTotalSupply } from "../../../hooks/tokens";
import { import {
DAI_ADDRESSES, DAI_ADDRESSES,
FTSO_ADDRESSES, FTSO_ADDRESSES,
STNK_ADDRESSES,
GHST_ADDRESSES,
FTSO_DAI_LP_ADDRESSES,
} from "../../../constants/addresses"; } from "../../../constants/addresses";
const FarmPools = ({ chainId }) => { const FarmPools = ({ chainId }) => {
const isSmallScreen = useMediaQuery("(max-width: 775px)"); const isSmallScreen = useMediaQuery("(max-width: 775px)");
const { totalSupply: daiFtsoUniTotalSupply } = useTotalSupply(chainId, FTSO_DAI_LP_ADDRESSES[chainId]); const { totalSupply: daiFtsoUniTotalSupply } = useTotalSupply(chainId, "GDAI_FTSO");
const daiFtsoUniValuation = useLpValuation(chainId, FTSO_DAI_LP_ADDRESSES[chainId], daiFtsoUniTotalSupply._value); const daiFtsoUniValuation = useLpValuation(chainId, "GDAI_FTSO", daiFtsoUniTotalSupply._value);
const pools = [ const pools = [
{ {

View File

@ -4,9 +4,14 @@ import toast from "react-hot-toast";
import { config } from "../../config"; import { config } from "../../config";
import { BOND_DEPOSITORY_ADDRESSES, DAO_TREASURY_ADDRESSES } from "../../constants/addresses"; import {
BOND_DEPOSITORY_ADDRESSES,
DAO_TREASURY_ADDRESSES,
BONDING_CALCULATOR_ADDRESSES,
} from "../../constants/addresses";
import { abi as BondAbi } from "../../abi/GhostBondDepository.json"; import { abi as BondAbi } from "../../abi/GhostBondDepository.json";
import { abi as TreasuryAbi } from "../../abi/GhostTreasury.json"; import { abi as TreasuryAbi } from "../../abi/GhostTreasury.json";
import { abi as BondingCalculatorAbi } from "../../abi/GhostBondingCalculator.json";
import { useFtsoPrice } from "../prices"; import { useFtsoPrice } from "../prices";
import { getTokenAddress, getTokenIcons, getTokenName, getBondNameDisplayName, getTokenPurchaseLink } from "../helpers"; import { getTokenAddress, getTokenIcons, getTokenName, getBondNameDisplayName, getTokenPurchaseLink } from "../helpers";
@ -85,6 +90,20 @@ export const useLiveBonds = (chainId) => {
}) })
}); });
const { data: markdowns } = useReadContracts({
contracts: markets?.map((_, index) => {
const quoteTokenAddress = markets?.at(index).result?.at(1) ? markets.at(index).result.at(1) : "";
return {
abi: BondingCalculatorAbi,
address: BONDING_CALCULATOR_ADDRESSES[chainId],
functionName: "markdown",
args: [quoteTokenAddress],
scopeKey: `markdown-${quoteTokenAddress}-${chainId}`,
chainId: chainId,
}
})
});
const liveBonds = liveIndexesRaw ? liveIndexesRaw.map((bondIndex, index) => { const liveBonds = liveIndexesRaw ? liveIndexesRaw.map((bondIndex, index) => {
const id = Number(bondIndex); const id = Number(bondIndex);
@ -97,9 +116,12 @@ export const useLiveBonds = (chainId) => {
const quoteTokenPerUsd = quotePrices?.at(index).result const quoteTokenPerUsd = quotePrices?.at(index).result
? new DecimalBigNumber(quotePrices.at(index).result * (10n ** 9n), quoteTokenDecimals) ? new DecimalBigNumber(quotePrices.at(index).result * (10n ** 9n), quoteTokenDecimals)
: new DecimalBigNumber(0n, quoteTokenDecimals); : new DecimalBigNumber(0n, quoteTokenDecimals);
const markdown = markdowns?.at(index).result
? new DecimalBigNumber(markdowns.at(index).result, quoteTokenDecimals)
: new DecimalBigNumber(1n, 0);
const quoteTokenPerBaseToken = new DecimalBigNumber(marketPrice, 9); const quoteTokenPerBaseToken = new DecimalBigNumber(marketPrice, 9);
const priceInUsd = quoteTokenPerUsd.mul(quoteTokenPerBaseToken); const priceInUsd = quoteTokenPerUsd.mul(quoteTokenPerBaseToken).mul(markdown);
const discount = baseTokenPerUsd._value > 0n const discount = baseTokenPerUsd._value > 0n
? baseTokenPerUsd.sub(priceInUsd).div(baseTokenPerUsd) ? baseTokenPerUsd.sub(priceInUsd).div(baseTokenPerUsd)
: new DecimalBigNumber("0", baseTokenPerUsd._decimals); : new DecimalBigNumber("0", baseTokenPerUsd._decimals);

View File

@ -65,7 +65,7 @@ export const getTokenAddress = (chainId, name) => {
case "GHST": case "GHST":
address = GHST_ADDRESSES[chainId]; address = GHST_ADDRESSES[chainId];
break; break;
case "DAI_FTSO": case "GDAI_FTSO":
address = FTSO_DAI_LP_ADDRESSES[chainId]; address = FTSO_DAI_LP_ADDRESSES[chainId];
break; break;
} }

View File

@ -2,7 +2,6 @@ import { useReadContract } from "wagmi";
import { useCurrentIndex } from "../staking"; import { useCurrentIndex } from "../staking";
import { useUniswapV2PairReserves } from "../uniswapv2"; import { useUniswapV2PairReserves } from "../uniswapv2";
import { useLpValuation } from "../treasury";
import { DecimalBigNumber } from "../../helpers/DecimalBigNumber"; import { DecimalBigNumber } from "../../helpers/DecimalBigNumber";
import { FTSO_DAI_LP_ADDRESSES, DAI_ADDRESSES } from "../../constants/addresses"; import { FTSO_DAI_LP_ADDRESSES, DAI_ADDRESSES } from "../../constants/addresses";

View File

@ -4,6 +4,7 @@ import { DAO_TREASURY_ADDRESSES } from "../../constants/addresses";
import { abi as TreasuryAbi } from "../../abi/GhostTreasury.json"; import { abi as TreasuryAbi } from "../../abi/GhostTreasury.json";
import { DecimalBigNumber } from "../../helpers/DecimalBigNumber"; import { DecimalBigNumber } from "../../helpers/DecimalBigNumber";
import { getTokenAddress } from "../helpers";
export const useTotalReserves = (chainId) => { export const useTotalReserves = (chainId) => {
const { data: totalReservesRaw } = useReadContract({ const { data: totalReservesRaw } = useReadContract({
@ -21,13 +22,14 @@ export const useTotalReserves = (chainId) => {
}; };
export const useLpValuation = (chainId, pairAddress, pairSupply) => { export const useLpValuation = (chainId, pairAddress, pairSupply) => {
const convertedPairAddress = getTokenAddress(chainId, pairAddress);
const { data: valuationRaw } = useReadContract({ const { data: valuationRaw } = useReadContract({
abi: TreasuryAbi, abi: TreasuryAbi,
address: DAO_TREASURY_ADDRESSES[chainId], address: DAO_TREASURY_ADDRESSES[chainId],
functionName: "tokenValue", functionName: "tokenValue",
scopeKey: `tokenValue-${pairAddress}-${pairSupply.toString()}-${chainId}`, scopeKey: `tokenValue-${pairAddress}-${pairSupply.toString()}-${chainId}`,
args: [ args: [
pairAddress, convertedPairAddress,
pairSupply, pairSupply,
], ],
chainId, chainId,