import BigNumber from "bignumber.js"; import { RAY, WAD, HALF_RAY, HALF_WAD, WAD_RAY_RATIO, } from "../../../helpers/constants"; declare module "bignumber.js" { interface BigNumber { ray: () => BigNumber; wad: () => BigNumber; halfRay: () => BigNumber; halfWad: () => BigNumber; wadMul: (a: BigNumber) => BigNumber; wadDiv: (a: BigNumber) => BigNumber; rayMul: (a: BigNumber) => BigNumber; rayDiv: (a: BigNumber) => BigNumber; rayToWad: () => BigNumber; wadToRay: () => BigNumber; rayPow: (n: BigNumber) => BigNumber; } } BigNumber.prototype.ray = (): BigNumber => { return new BigNumber(RAY).decimalPlaces(0); }; BigNumber.prototype.wad = (): BigNumber => { return new BigNumber(WAD).decimalPlaces(0); }; BigNumber.prototype.halfRay = (): BigNumber => { return new BigNumber(HALF_RAY).decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.halfWad = (): BigNumber => { return new BigNumber(HALF_WAD).decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.wadMul = function (b: BigNumber): BigNumber { return this.halfWad() .plus(this.multipliedBy(b)) .div(WAD) .decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.wadDiv = function (a: BigNumber): BigNumber { const halfA = a.div(2).decimalPlaces(0, BigNumber.ROUND_DOWN); return halfA .plus(this.multipliedBy(WAD)) .div(a) .decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.rayMul = function (a: BigNumber): BigNumber { return this.halfRay() .plus(this.multipliedBy(a)) .div(RAY) .decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.rayDiv = function (a: BigNumber): BigNumber { const halfA = a.div(2).decimalPlaces(0, BigNumber.ROUND_DOWN); return halfA .plus(this.multipliedBy(RAY)) .decimalPlaces(0, BigNumber.ROUND_DOWN) .div(a) .decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.rayToWad = function (): BigNumber { const halfRatio = new BigNumber(WAD_RAY_RATIO).div(2); return halfRatio .plus(this) .div(WAD_RAY_RATIO) .decimalPlaces(0, BigNumber.ROUND_DOWN); }; BigNumber.prototype.wadToRay = function (): BigNumber { return this.multipliedBy(WAD_RAY_RATIO).decimalPlaces( 0, BigNumber.ROUND_DOWN ); }; BigNumber.prototype.rayPow = function (n: BigNumber): BigNumber { let z = !n.modulo(2).eq(0) ? this : new BigNumber(RAY); let x = new BigNumber(this); for (n = n.div(2); !n.eq(0); n = n.div(2)) { x = x.rayMul(x); if (!n.modulo(2).eq(0)) { z = z.rayMul(x); } } return z; };