Skip to content

Commit

Permalink
Add helper to get the swap price (#216)
Browse files Browse the repository at this point in the history
  • Loading branch information
macalinao committed Aug 29, 2021
1 parent fc2dbbb commit 7fe5da6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
1 change: 1 addition & 0 deletions packages/stableswap-sdk/src/calculator/index.ts
@@ -1,2 +1,3 @@
export * from "./amounts";
export * from "./curve";
export * from "./price";
44 changes: 44 additions & 0 deletions packages/stableswap-sdk/src/calculator/price.ts
@@ -0,0 +1,44 @@
import { Price, TokenAmount } from "@saberhq/token-utils";
import BN from "bn.js";

import type { IExchangeInfo } from "..";
import { calculateEstimatedSwapOutputAmount } from "..";

/**
* Gets the price of the second token in the swap, i.e. "Token 1", with respect to "Token 0".
*
* To get the price of "Token 0", use `.invert()` on the result of this function.
* @returns
*/
export const calculateSwapPrice = (exchangeInfo: IExchangeInfo): Price => {
const reserve0 = exchangeInfo.reserves[0].amount;
const reserve1 = exchangeInfo.reserves[1].amount;

// We try to get at least 4 decimal points of precision here
// Otherwise, we attempt to swap 1% of total supply of the pool
// or at most, $1
const inputAmountNum = Math.max(
10_000,
Math.min(
10 ** reserve0.token.decimals,
Math.floor(parseInt(reserve0.toU64().div(new BN(100)).toString()))
)
);

const inputAmount = new TokenAmount(reserve0.token, inputAmountNum);
const outputAmount = calculateEstimatedSwapOutputAmount(
exchangeInfo,
inputAmount
);

const frac = outputAmount.outputAmountBeforeFees.asFraction.divide(
inputAmount.asFraction
);

return new Price(
reserve0.token,
reserve1.token,
frac.denominator,
frac.numerator
);
};

1 comment on commit 7fe5da6

@vercel
Copy link

@vercel vercel bot commented on 7fe5da6 Aug 29, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.