Commit 4755e4f4 authored by Noah Zinsmeister's avatar Noah Zinsmeister

add math methods to Fraction

parent 9da46ab8
...@@ -41,6 +41,28 @@ export class Fraction { ...@@ -41,6 +41,28 @@ export class Fraction {
return new Fraction(this.denominator, this.numerator) return new Fraction(this.denominator, this.numerator)
} }
add(other: Fraction | BigintIsh): Fraction {
const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))
return new Fraction(
JSBI.add(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
),
JSBI.multiply(this.denominator, otherParsed.denominator)
)
}
subtract(other: Fraction | BigintIsh): Fraction {
const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))
return new Fraction(
JSBI.subtract(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(otherParsed.numerator, this.denominator)
),
JSBI.multiply(this.denominator, otherParsed.denominator)
)
}
multiply(other: Fraction | BigintIsh): Fraction { multiply(other: Fraction | BigintIsh): Fraction {
const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other)) const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))
return new Fraction( return new Fraction(
...@@ -49,6 +71,14 @@ export class Fraction { ...@@ -49,6 +71,14 @@ export class Fraction {
) )
} }
divide(other: Fraction | BigintIsh): Fraction {
const otherParsed = other instanceof Fraction ? other : new Fraction(parseBigintIsh(other))
return new Fraction(
JSBI.multiply(this.numerator, otherParsed.denominator),
JSBI.multiply(this.denominator, otherParsed.numerator)
)
}
toSignificant( toSignificant(
significantDigits: number, significantDigits: number,
format: object = { groupSeparator: '' }, format: object = { groupSeparator: '' },
......
import invariant from 'tiny-invariant' import invariant from 'tiny-invariant'
import JSBI from 'jsbi'
import { TradeType } from '../constants' import { TradeType } from '../constants'
import { Pair } from './pair' import { Pair } from './pair'
import { Route } from './route' import { Route } from './route'
import { Fraction, TokenAmount } from './fractions' import { TokenAmount } from './fractions'
import { Price } from './fractions/price' import { Price } from './fractions/price'
import { Percent } from './fractions/percent' import { Percent } from './fractions/percent'
function getSlippage(midPrice: Price, inputAmount: TokenAmount, outputAmount: TokenAmount): Percent { function getSlippage(midPrice: Price, inputAmount: TokenAmount, outputAmount: TokenAmount): Percent {
const exactQuote = midPrice.raw.multiply(inputAmount.raw) const exactQuote = midPrice.raw.multiply(inputAmount.raw)
// calculate (exactQuote - outputAmount) / exactQuote // calculate slippage := (exactQuote - outputAmount) / exactQuote
const exactDifference = new Fraction( const slippage = exactQuote.subtract(outputAmount.raw).divide(exactQuote)
JSBI.subtract(exactQuote.numerator, JSBI.multiply(outputAmount.raw, exactQuote.denominator)),
exactQuote.denominator
)
const slippage = exactDifference.multiply(exactQuote.invert())
return new Percent(slippage.numerator, slippage.denominator) return new Percent(slippage.numerator, slippage.denominator)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment