From 9a8fe5137cb11a57cd37262927518fa269566ff4 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 16:04:05 -0600 Subject: [PATCH 1/6] feat: hasura config for proposal creation --- .../tables/public_conditional_vaults.yaml | 12 ---------- .../tables/public_proposal_details.yaml | 22 +++++++++++++++++++ .../futarchy/tables/public_proposals.yaml | 13 +++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/hasura/metadata/databases/futarchy/tables/public_conditional_vaults.yaml b/packages/hasura/metadata/databases/futarchy/tables/public_conditional_vaults.yaml index a599f5c..4ba7651 100644 --- a/packages/hasura/metadata/databases/futarchy/tables/public_conditional_vaults.yaml +++ b/packages/hasura/metadata/databases/futarchy/tables/public_conditional_vaults.yaml @@ -21,18 +21,6 @@ array_relationships: name: proposals schema: public insert_permissions: - - role: anonymous - permission: - check: {} - columns: - - cond_finalize_token_mint_acct - - cond_revert_token_mint_acct - - cond_vault_acct - - nonce - - settlement_authority - - status - - underlying_mint_acct - - underlying_token_acct - role: user permission: check: {} diff --git a/packages/hasura/metadata/databases/futarchy/tables/public_proposal_details.yaml b/packages/hasura/metadata/databases/futarchy/tables/public_proposal_details.yaml index 90bc6d3..0bae24d 100644 --- a/packages/hasura/metadata/databases/futarchy/tables/public_proposal_details.yaml +++ b/packages/hasura/metadata/databases/futarchy/tables/public_proposal_details.yaml @@ -41,12 +41,34 @@ select_permissions: - content filter: {} comment: "" + - role: user + permission: + columns: + - proposal_id + - base_cond_vault_acct + - description + - fail_market_acct + - pass_market_acct + - proposal_acct + - proposer_acct + - quote_cond_vault_acct + - slug + - title + - categories + - content + filter: {} + comment: "" - role: proposer permission: columns: - proposal_id + - base_cond_vault_acct - description + - fail_market_acct + - pass_market_acct - proposal_acct + - proposer_acct + - quote_cond_vault_acct - slug - title - categories diff --git a/packages/hasura/metadata/databases/futarchy/tables/public_proposals.yaml b/packages/hasura/metadata/databases/futarchy/tables/public_proposals.yaml index 422e46b..7a8fd59 100644 --- a/packages/hasura/metadata/databases/futarchy/tables/public_proposals.yaml +++ b/packages/hasura/metadata/databases/futarchy/tables/public_proposals.yaml @@ -73,6 +73,13 @@ insert_permissions: - updated_at - initial_slot - end_slot + - description_url + - pass_threshold_bps + - duration_in_slots + - min_base_futarchic_liquidity + - min_quote_futarchic_liquidity + - twap_initial_observation + - twap_max_observation_change_per_update comment: "" select_permissions: - role: anonymous @@ -124,6 +131,12 @@ select_permissions: - quote_vault - status - autocrat_version + - duration_in_slots + - pass_threshold_bps + - twap_initial_observation + - twap_max_observation_change_per_update + - min_quote_futarchic_liquidity + - min_base_futarchic_liquidity - completed_at - created_at - ended_at From 5b82db9c5d7c0fd3aa04e04edb3ca850871dc5f7 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 16:05:01 -0600 Subject: [PATCH 2/6] feat: index duration in slots properly --- .../autocrat/autocrat-proposal-indexer.ts | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/packages/indexer/src/indexers/autocrat/autocrat-proposal-indexer.ts b/packages/indexer/src/indexers/autocrat/autocrat-proposal-indexer.ts index dd33fd4..107088f 100644 --- a/packages/indexer/src/indexers/autocrat/autocrat-proposal-indexer.ts +++ b/packages/indexer/src/indexers/autocrat/autocrat-proposal-indexer.ts @@ -176,6 +176,7 @@ export const AutocratProposalIndexer: IntervalFetchIndexer = { .add(new BN(dbDao.slotsPerProposal?.toString())) .toString() ), + durationInSlots: dbDao.slotsPerProposal, minBaseFutarchicLiquidity: dbDao.minBaseFutarchicLiquidity, minQuoteFutarchicLiquidity: dbDao.minQuoteFutarchicLiquidity, passThresholdBps: dbDao.passThresholdBps, @@ -213,20 +214,21 @@ export const AutocratProposalIndexer: IntervalFetchIndexer = { ) )[0]; - const endSlot: BN = onChainProposal.account.slotEnqueued - .add(new BN(dbDao.slotsPerProposal?.valueOf())) + const endSlot: BN = onChainProposal.account.slotEnqueued.add( + new BN(dbDao.slotsPerProposal?.valueOf()) + ); const slotDifference = onChainProposal.account.slotEnqueued .add(new BN(dbDao.slotsPerProposal?.valueOf())) .sub(new BN(currentSlot)); - + const lowHoursEstimate = Math.floor( (slotDifference.toNumber() * 400) / 1000 / 60 / 60 ); // Our check to ensure we're actually updating the time correctly. - if(currentSlot <= endSlot.toNumber() && lowHoursEstimate <= 0){ - console.error('Issue with slot update contact administrator') + if (currentSlot <= endSlot.toNumber() && lowHoursEstimate <= 0) { + console.error("Issue with slot update contact administrator"); } const endedAt = new Date(currentTime.toUTCString()); @@ -662,14 +664,14 @@ async function calculateUserPerformance( const { proposals, daos, quote_tokens, base_tokens } = proposal; - let proposalDaoAcct = daos?.daoAcct + let proposalDaoAcct = daos?.daoAcct; if (!proposalDaoAcct) { - proposalDaoAcct = proposals.daoAcct + proposalDaoAcct = proposals.daoAcct; } if (!proposalDaoAcct) { - console.error('No daoAcct found') + console.error("No daoAcct found"); } const allOrders = await usingDb((db) => { @@ -692,7 +694,10 @@ async function calculateUserPerformance( proposalFinalizedAt.getMinutes() - 2 ); - const resolvingMarket = proposals.status === ProposalStatus.Passed ? proposals.passMarketAcct : proposals.failMarketAcct; + const resolvingMarket = + proposals.status === ProposalStatus.Passed + ? proposals.passMarketAcct + : proposals.failMarketAcct; // TODO: Get spot price at proposal finalization or even current spot price // if the proposal is still active (this would be UNREALISED P&L) // TODO: If this is 0 we really need to throw and error and alert someone, we shouldn't have missing spot data @@ -754,19 +759,23 @@ async function calculateUserPerformance( totals.volumeBought = totals.volumeBought + amount; totals.buyOrderCount = totals.buyOrderCount + 1; // If this is the resolving market then we want to keep a running tally for that for P&L - if(next.marketAcct === resolvingMarket){ - totals.tokensBoughtResolvingMarket = totals.tokensBoughtResolvingMarket + size; - totals.volumeBoughtResolvingMarket = totals.volumeBoughtResolvingMarket + amount; + if (next.marketAcct === resolvingMarket) { + totals.tokensBoughtResolvingMarket = + totals.tokensBoughtResolvingMarket + size; + totals.volumeBoughtResolvingMarket = + totals.volumeBoughtResolvingMarket + amount; } - // Sell Side + // Sell Side } else if (next.side === "ASK") { totals.tokensSold = totals.tokensSold + size; totals.volumeSold = totals.volumeSold + amount; totals.sellOrderCount = totals.sellOrderCount + 1; // If this is the resolving market then we want to keep a running tally for that for P&L - if(next.marketAcct === resolvingMarket){ - totals.tokensSoldResolvingMarket = totals.tokensSoldResolvingMarket + size; - totals.volumeSoldResolvingMarket = totals.volumeSoldResolvingMarket + amount; + if (next.marketAcct === resolvingMarket) { + totals.tokensSoldResolvingMarket = + totals.tokensSoldResolvingMarket + size; + totals.volumeSoldResolvingMarket = + totals.volumeSoldResolvingMarket + amount; } } @@ -781,10 +790,13 @@ async function calculateUserPerformance( const [actor, values] = k; // NOTE: this gets us the delta, whereas we need to know the direction at the very end - const tradeSizeDelta = Math.abs(values.tokensBoughtResolvingMarket - values.tokensSoldResolvingMarket); + const tradeSizeDelta = Math.abs( + values.tokensBoughtResolvingMarket - values.tokensSoldResolvingMarket + ); // NOTE: Directionally orients our last leg - const needsSellToExit = values.tokensBoughtResolvingMarket > values.tokensSoldResolvingMarket; // boolean + const needsSellToExit = + values.tokensBoughtResolvingMarket > values.tokensSoldResolvingMarket; // boolean // We need to complete the round trip / final leg if (tradeSizeDelta !== 0) { @@ -796,9 +808,11 @@ async function calculateUserPerformance( // We've bought more than we've sold, therefore when we exit the position calulcation // we need to count the remaining volume as a sell at spot price when conditional // market is finalized. - values.volumeSoldResolvingMarket = values.volumeSoldResolvingMarket + lastLegNotional; + values.volumeSoldResolvingMarket = + values.volumeSoldResolvingMarket + lastLegNotional; } else { - values.volumeBoughtResolvingMarket = values.volumeBoughtResolvingMarket + lastLegNotional; + values.volumeBoughtResolvingMarket = + values.volumeBoughtResolvingMarket + lastLegNotional; } } @@ -810,9 +824,11 @@ async function calculateUserPerformance( tokensSold: values.tokensSold.toString(), volumeBought: values.volumeBought.toString(), volumeSold: values.volumeSold.toString(), - tokensBoughtResolvingMarket: values.tokensBoughtResolvingMarket.toString(), + tokensBoughtResolvingMarket: + values.tokensBoughtResolvingMarket.toString(), tokensSoldResolvingMarket: values.tokensSoldResolvingMarket.toString(), - volumeBoughtResolvingMarket: values.volumeBoughtResolvingMarket.toString(), + volumeBoughtResolvingMarket: + values.volumeBoughtResolvingMarket.toString(), volumeSoldResolvingMarket: values.volumeSoldResolvingMarket.toString(), buyOrdersCount: values.buyOrderCount as unknown as bigint, sellOrdersCount: values.sellOrderCount as unknown as bigint, @@ -849,9 +865,11 @@ async function calculateUserPerformance( tokensSold: insert.tokensSold, volumeBought: insert.volumeBought, volumeSold: insert.volumeSold, - tokensBoughtResolvingMarket: insert.tokensBoughtResolvingMarket, + tokensBoughtResolvingMarket: + insert.tokensBoughtResolvingMarket, tokensSoldResolvingMarket: insert.tokensSoldResolvingMarket, - volumeBoughtResolvingMarket: insert.volumeBoughtResolvingMarket, + volumeBoughtResolvingMarket: + insert.volumeBoughtResolvingMarket, volumeSoldResolvingMarket: insert.volumeSoldResolvingMarket, buyOrdersCount: insert.buyOrdersCount, sellOrdersCount: insert.sellOrdersCount, From 415c7e8b74faaf22cbf20f64921f41fadc62e565 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 14:57:47 -0600 Subject: [PATCH 3/6] feat: better swap error logging --- packages/indexer/src/builders/swaps.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/indexer/src/builders/swaps.ts b/packages/indexer/src/builders/swaps.ts index ae0df1f..7c1249e 100644 --- a/packages/indexer/src/builders/swaps.ts +++ b/packages/indexer/src/builders/swaps.ts @@ -315,7 +315,16 @@ export class SwapBuilder { } catch (e: any) { logger.errorWithChatBotAlert( "swap peristable general error", - e.message ? e.message : e + e.message + ? { + message: e.message, + stack: e.stack, + name: e.name, + cause: e.cause, + fileName: e.fileName, + lineNumber: e.lineNumber, + } + : e ); return Err({ type: SwapPersistableError.GeneralError }); } From 62a5884a5bfb4900a774f68217cc54f842301172 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 15:00:31 -0600 Subject: [PATCH 4/6] feat: calc mid price for spot --- .../jupiter/jupiter-quotes-indexer.ts | 102 +++++++++++++----- 1 file changed, 74 insertions(+), 28 deletions(-) diff --git a/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts b/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts index 16c2420..d48e921 100644 --- a/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts +++ b/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts @@ -72,75 +72,121 @@ const convertJupTokenPrice = ( return price; }; +const convertJupBaseOutTokenPrice = ( + data: JupTokenQuoteRes, + inputTokenDecimals: number, + outputTokenDecimals: number +): number => { + const price = + Number(data.inAmount ?? "0") / + 10 ** inputTokenDecimals / + (Number(data.outAmount ?? "0") / 10 ** outputTokenDecimals); + return price; +}; + export const fetchQuoteFromJupe = async ( acct: string ): Promise<[number, number | undefined] | null> => { try { - const inputToken = await usingDb((db) => + const baseToken = await usingDb((db) => db .select() .from(schema.tokens) .where(eq(schema.tokens.mintAcct, acct)) .execute() ); - // call jup - // if it's USDC we compare to USDT - const outputMint = + // Define the output mint based on the input token + const quoteMint = acct === "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" ? "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" : "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; - const outputToken = await usingDb((db) => + const quoteToken = await usingDb((db) => db .select() .from(schema.tokens) - .where(eq(schema.tokens.mintAcct, outputMint)) + .where(eq(schema.tokens.mintAcct, quoteMint)) .execute() ); - const amountVal = 1 * 10 ** inputToken[0].decimals; + const amountVal = 1 * 10 ** baseToken[0].decimals; - const url = + // Fetch ASK price (original fetch) + const askUrl = `https://public.jupiterapi.com/quote?inputMint=${acct}&` + - `outputMint=${outputMint}&` + + `outputMint=${quoteMint}&` + `amount=${amountVal.toString()}&` + "slippageBps=30&" + "swapMode=ExactIn&" + "onlyDirectRoutes=false&" + "maxAccounts=64&" + "experimentalDexes=Jupiter%20LO"; - const tokenPriceRes = await fetch(url); + const askRes = await fetch(askUrl); - if (tokenPriceRes.status !== 200) { + if (askRes.status !== 200) { logger.error( - "non-200 response from jupiter quotes:", - tokenPriceRes.status, - tokenPriceRes.statusText + "non-200 response from Jupiter ASK quote:", + askRes.status, + askRes.statusText ); + return null; } - const tokenPriceJson = (await tokenPriceRes.json()) as JupTokenQuoteRes; + const askJson = (await askRes.json()) as JupTokenQuoteRes; - if (tokenPriceJson.error) { - logger.error("jupiter response error found:", tokenPriceJson); + if (askJson.error || !askJson.outAmount || !askJson.inAmount) { + logger.error("Error with ASK quote response:", askJson); return null; } - if (!tokenPriceJson.outAmount || !tokenPriceJson.inAmount) { - logger.error("token price output or input is 0 value"); + const askPrice = convertJupTokenPrice( + askJson, + baseToken[0].decimals, + quoteToken[0].decimals + ); + + // Fetch BID price (swapped input/output) + const bidUrl = + `https://public.jupiterapi.com/quote?inputMint=${quoteMint}&` + + `outputMint=${acct}&` + + `amount=${(1 * 10 ** quoteToken[0].decimals).toString()}&` + + "slippageBps=30&" + + "swapMode=ExactIn&" + + "onlyDirectRoutes=false&" + + "maxAccounts=64&" + + "experimentalDexes=Jupiter%20LO"; + const bidRes = await fetch(bidUrl); + + if (bidRes.status !== 200) { + logger.error( + "non-200 response from Jupiter BID quote:", + bidRes.status, + bidRes.statusText + ); return null; } - return [ - convertJupTokenPrice( - tokenPriceJson, - inputToken[0].decimals, - outputToken[0].decimals - ), - tokenPriceJson.contextSlot, - ]; + + const bidJson = (await bidRes.json()) as JupTokenQuoteRes; + + if (bidJson.error || !bidJson.outAmount || !bidJson.inAmount) { + logger.error("Error with BID quote response:", bidJson); + return null; + } + + const bidPrice = convertJupBaseOutTokenPrice( + bidJson, + baseToken[0].decimals, + quoteToken[0].decimals + ); + + // Calculate the mid-price + const midPrice = (askPrice + bidPrice) / 2; + + // Return the mid-price and the context slot from the ASK response + return [midPrice, askJson.contextSlot]; } catch (e) { - logger.error("error getting price number from jupiter: ", e); + logger.error("error getting price from Jupiter: ", e); return null; } }; From 991b3716c9876e8848ef57696f0e2f3772047105 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 15:00:57 -0600 Subject: [PATCH 5/6] rm: old futarchy_indexer db schema --- .../futarchy_indexer/tables/public_candles.yaml | 3 --- .../futarchy_indexer/tables/public_daos.yaml | 3 --- .../futarchy_indexer/tables/public_markets.yaml | 3 --- .../futarchy_indexer/tables/public_orders.yaml | 11 ----------- .../futarchy_indexer/tables/public_proposals.yaml | 3 --- .../futarchy_indexer/tables/public_token_accts.yaml | 11 ----------- .../futarchy_indexer/tables/public_tokens.yaml | 3 --- .../futarchy_indexer/tables/public_transactions.yaml | 3 --- .../futarchy_indexer/tables/public_twaps.yaml | 3 --- .../databases/futarchy_indexer/tables/tables.yaml | 9 --------- 10 files changed, 52 deletions(-) delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_candles.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_daos.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_markets.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_orders.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_proposals.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_token_accts.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_tokens.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_transactions.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/public_twaps.yaml delete mode 100644 packages/hasura/metadata/databases/futarchy_indexer/tables/tables.yaml diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_candles.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_candles.yaml deleted file mode 100644 index 1a2c7e1..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_candles.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: candles - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_daos.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_daos.yaml deleted file mode 100644 index cad80e9..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_daos.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: daos - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_markets.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_markets.yaml deleted file mode 100644 index 585bf2c..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_markets.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: markets - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_orders.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_orders.yaml deleted file mode 100644 index 3a34410..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_orders.yaml +++ /dev/null @@ -1,11 +0,0 @@ -table: - name: orders - schema: public -select_permissions: - - role: client - permission: - columns: [] - filter: - actor_acct: - _eq: X-User-Wallet - comment: "" diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_proposals.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_proposals.yaml deleted file mode 100644 index 2fc48ec..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_proposals.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: proposals - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_token_accts.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_token_accts.yaml deleted file mode 100644 index 43c846d..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_token_accts.yaml +++ /dev/null @@ -1,11 +0,0 @@ -table: - name: token_accts - schema: public -select_permissions: - - role: client - permission: - columns: [] - filter: - owner_acct: - _eq: X-User-Wallet - comment: "" diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_tokens.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_tokens.yaml deleted file mode 100644 index e068e80..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_tokens.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: tokens - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_transactions.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_transactions.yaml deleted file mode 100644 index e8bbb90..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_transactions.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: transactions - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_twaps.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/public_twaps.yaml deleted file mode 100644 index 8140dc2..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/public_twaps.yaml +++ /dev/null @@ -1,3 +0,0 @@ -table: - name: twaps - schema: public diff --git a/packages/hasura/metadata/databases/futarchy_indexer/tables/tables.yaml b/packages/hasura/metadata/databases/futarchy_indexer/tables/tables.yaml deleted file mode 100644 index 3bfdfe3..0000000 --- a/packages/hasura/metadata/databases/futarchy_indexer/tables/tables.yaml +++ /dev/null @@ -1,9 +0,0 @@ -- "!include public_candles.yaml" -- "!include public_daos.yaml" -- "!include public_markets.yaml" -- "!include public_orders.yaml" -- "!include public_proposals.yaml" -- "!include public_token_accts.yaml" -- "!include public_tokens.yaml" -- "!include public_transactions.yaml" -- "!include public_twaps.yaml" From 9f566e6f7ae63ba14e7ba2b9a730c5739ccd5975 Mon Sep 17 00:00:00 2001 From: LukasDeco Date: Tue, 20 Aug 2024 17:53:58 -0600 Subject: [PATCH 6/6] fix: base as out price calc for jup --- .../src/indexers/jupiter/jupiter-quotes-indexer.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts b/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts index d48e921..68a9858 100644 --- a/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts +++ b/packages/indexer/src/indexers/jupiter/jupiter-quotes-indexer.ts @@ -77,11 +77,9 @@ const convertJupBaseOutTokenPrice = ( inputTokenDecimals: number, outputTokenDecimals: number ): number => { - const price = - Number(data.inAmount ?? "0") / - 10 ** inputTokenDecimals / - (Number(data.outAmount ?? "0") / 10 ** outputTokenDecimals); - return price; + const inPrice = Number(data.inAmount ?? "0") / 10 ** inputTokenDecimals; + const outPrice = Number(data.outAmount ?? "0") / 10 ** outputTokenDecimals; + return inPrice / outPrice; }; export const fetchQuoteFromJupe = async (