Comparing version 0.2.8 to 0.2.9
import { Symbol, Asset } from "eos-common"; | ||
import { nRelay, EosAccount, HydratedRelay } from "./interfaces"; | ||
export declare abstract class AbstractBancorCalculator { | ||
constructor(); | ||
estimateCost(amountDesired: Asset, from: Symbol): Promise<Asset>; | ||
@@ -6,0 +5,0 @@ estimateReturn(amount: Asset, to: Symbol): Promise<Asset>; |
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const index_1 = require("./index"); | ||
class AbstractBancorCalculator { | ||
constructor() { } | ||
estimateCost(amountDesired, from) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const reverseRelaysRequired = index_1.createPath(amountDesired.symbol, from, yield this.fetchRelays()); | ||
const hydratedRelays = yield this.hydrateRelays(reverseRelaysRequired); | ||
const costAmount = hydratedRelays.reduce((lastCost, relay) => { | ||
const fromReserveBalance = relay.reserves.find((reserve) => reserve.amount.symbol.isEqual(lastCost.symbol)); | ||
const toReserveBalance = relay.reserves.find((reserve) => !reserve.amount.symbol.isEqual(lastCost.symbol)); | ||
const result = index_1.calculateCost(toReserveBalance.amount, fromReserveBalance.amount, lastCost); | ||
return result; | ||
}, amountDesired); | ||
return costAmount; | ||
}); | ||
async estimateCost(amountDesired, from) { | ||
const reverseRelaysRequired = index_1.createPath(amountDesired.symbol, from, await this.fetchRelays()); | ||
const hydratedRelays = await this.hydrateRelays(reverseRelaysRequired); | ||
const costAmount = hydratedRelays.reduce((lastCost, relay) => { | ||
const fromReserveBalance = relay.reserves.find((reserve) => reserve.amount.symbol.isEqual(lastCost.symbol)); | ||
const toReserveBalance = relay.reserves.find((reserve) => !reserve.amount.symbol.isEqual(lastCost.symbol)); | ||
const result = index_1.calculateCost(toReserveBalance.amount, fromReserveBalance.amount, lastCost); | ||
return result; | ||
}, amountDesired); | ||
return costAmount; | ||
} | ||
estimateReturn(amount, to) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const relaysRequired = index_1.createPath(amount.symbol, to, yield this.fetchRelays()); | ||
const hydratedRelays = yield this.hydrateRelays(relaysRequired); | ||
const returnAmount = hydratedRelays.reduce((lastReward, relay) => { | ||
const fromReserveBalance = relay.reserves.find((reserve) => reserve.amount.symbol.isEqual(lastReward.symbol)); | ||
const toReserveBalance = relay.reserves.find((reserve) => !reserve.amount.symbol.isEqual(lastReward.symbol)); | ||
const result = index_1.calculateReturn(fromReserveBalance.amount, toReserveBalance.amount, lastReward); | ||
return result; | ||
}, amount); | ||
return returnAmount; | ||
}); | ||
async estimateReturn(amount, to) { | ||
const relaysRequired = index_1.createPath(amount.symbol, to, await this.fetchRelays()); | ||
const hydratedRelays = await this.hydrateRelays(relaysRequired); | ||
const returnAmount = hydratedRelays.reduce((lastReward, relay) => { | ||
const fromReserveBalance = relay.reserves.find((reserve) => reserve.amount.symbol.isEqual(lastReward.symbol)); | ||
const toReserveBalance = relay.reserves.find((reserve) => !reserve.amount.symbol.isEqual(lastReward.symbol)); | ||
const result = index_1.calculateReturn(fromReserveBalance.amount, toReserveBalance.amount, lastReward); | ||
return result; | ||
}, amount); | ||
return returnAmount; | ||
} | ||
// Fetch balance returns Assets of the things | ||
hydrateRelay(balances, relay) { | ||
const result = Object.assign(Object.assign({}, relay), { reserves: relay.reserves.map((reserve) => ({ | ||
const result = Object.assign(Object.assign({}, relay), { fee: 0, reserves: relay.reserves.map((reserve) => ({ | ||
amount: balances.find(balance => balance.symbol.isEqual(reserve.symbol)), | ||
@@ -51,15 +37,13 @@ contract: reserve.contract | ||
} | ||
hydrateRelays(relays) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const hydratedRelays = []; | ||
for (var i = 0; i < relays.length; i++) { | ||
let reserves = relays[i].isMultiContract | ||
? yield this.fetchMultiRelayReserves(relays[i].contract, relays[i].smartToken.symbol.code()) | ||
: yield this.fetchSingleRelayReserves(relays[i].contract); | ||
let newRelay = this.hydrateRelay(reserves, relays[i]); | ||
// @ts-ignore | ||
hydratedRelays.push(newRelay); | ||
} | ||
return hydratedRelays; | ||
}); | ||
async hydrateRelays(relays) { | ||
const hydratedRelays = []; | ||
for (var i = 0; i < relays.length; i++) { | ||
let reserves = relays[i].isMultiContract | ||
? await this.fetchMultiRelayReserves(relays[i].contract, relays[i].smartToken.symbol.code()) | ||
: await this.fetchSingleRelayReserves(relays[i].contract); | ||
let newRelay = this.hydrateRelay(reserves, relays[i]); | ||
// @ts-ignore | ||
hydratedRelays.push(newRelay); | ||
} | ||
return hydratedRelays; | ||
} | ||
@@ -66,0 +50,0 @@ } |
@@ -58,2 +58,4 @@ import { Converter, nRelay, ChoppedRelay } from "./interfaces"; | ||
export declare function calculateCost(balanceFrom: Asset, balanceTo: Asset, amountDesired: Asset): Asset; | ||
export declare function calculateReserveToSmart(reserveAmount: Asset, reserveBalance: Asset, smartSupply: Asset, ratio?: number): Asset; | ||
export declare function calculateSmartToReserve(smartTokens: Asset, reserveBalance: Asset, smartSupply: Asset, ratio?: number): Asset; | ||
/** | ||
@@ -90,1 +92,6 @@ * Compose Memo | ||
export declare function createPath(from: Symbol, to: Symbol, relays: nRelay[]): nRelay[]; | ||
export declare function chargeFee(asset: Asset, decimalFee: number, magnitude?: number): Asset; | ||
export declare function liquidate(smartTokens: Asset, reserveBalance: Asset, smartSupply: Asset): Asset; | ||
export declare function calculateLiquidateCost(reserveTokens: Asset, reserveBalance: Asset, smartSupply: Asset): Asset; | ||
export declare function fund(smartTokens: Asset, reserveBalance: Asset, smartSupply: Asset): Asset; | ||
export declare function calculateFundReturn(reserveTokens: Asset, reserveBalance: Asset, smartSupply: Asset): Asset; |
@@ -41,2 +41,5 @@ "use strict"; | ||
throw new Error("From symbol does not match amount symbol"); | ||
if (amount.amount >= balanceFrom.amount) | ||
throw new Error("Impossible to buy the entire reserve or more"); | ||
decimal_js_1.default.set({ precision: 15, rounding: decimal_js_1.default.ROUND_DOWN }); | ||
const balanceFromNumber = balanceFrom.toDecimal(); | ||
@@ -47,6 +50,7 @@ const balanceToNumber = balanceTo.toDecimal(); | ||
.div(balanceFromNumber.plus(amountNumber)) | ||
.times(balanceToNumber) | ||
.toFixed(balanceTo.symbol.precision, decimal_js_1.default.ROUND_DOWN); | ||
const formatted = new decimal_js_1.default(Number(reward) * Math.pow(10, balanceTo.symbol.precision)).toFixed(0, decimal_js_1.default.ROUND_DOWN); | ||
return new eos_common_1.Asset(Number(formatted), balanceTo.symbol); | ||
.times(balanceToNumber); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, balanceTo.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_DOWN) | ||
.toNumber(), balanceTo.symbol); | ||
} | ||
@@ -88,10 +92,39 @@ exports.calculateReturn = calculateReturn; | ||
const oneNumber = new decimal_js_1.default(1); | ||
decimal_js_1.default.set({ precision: 15, rounding: decimal_js_1.default.ROUND_UP }); | ||
const reward = balanceFromNumber | ||
.div(oneNumber.minus(amountNumber.div(balanceToNumber))) | ||
.minus(balanceFromNumber) | ||
.toFixed(0, decimal_js_1.default.ROUND_UP); | ||
const formatted = new decimal_js_1.default(Number(reward) * Math.pow(10, balanceTo.symbol.precision)).toFixed(0, decimal_js_1.default.ROUND_DOWN); | ||
return new eos_common_1.Asset(Number(formatted), balanceFrom.symbol); | ||
.minus(balanceFromNumber); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, balanceFrom.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_FLOOR) | ||
.toNumber(), balanceFrom.symbol); | ||
} | ||
exports.calculateCost = calculateCost; | ||
function calculateReserveToSmart(reserveAmount, reserveBalance, smartSupply, ratio = 0.5) { | ||
const smartSupplyN = smartSupply.toDecimal().times(-1); | ||
const balanceN = reserveBalance.toDecimal(); | ||
const depositAmountN = reserveAmount.toDecimal(); | ||
const one = new decimal_js_1.default(1); | ||
decimal_js_1.default.set({ precision: 15, rounding: decimal_js_1.default.ROUND_DOWN }); | ||
const reward = smartSupplyN.times(one.minus(one.plus(depositAmountN.div(balanceN)).pow(ratio))); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, smartSupply.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_FLOOR) | ||
.toNumber(), smartSupply.symbol); | ||
} | ||
exports.calculateReserveToSmart = calculateReserveToSmart; | ||
function calculateSmartToReserve(smartTokens, reserveBalance, smartSupply, ratio = 0.5) { | ||
const reserveTokensN = smartTokens.toDecimal(); | ||
const reserveBalanceN = reserveBalance.toDecimal(); | ||
const smartSupplyN = smartSupply.toDecimal(); | ||
const one = new decimal_js_1.default(1); | ||
const ratioN = one.div(new decimal_js_1.default(ratio)); | ||
decimal_js_1.default.set({ precision: 15, rounding: decimal_js_1.default.ROUND_DOWN }); | ||
const reward = reserveBalanceN.times(one.minus(decimal_js_1.default.pow(one.minus(reserveTokensN.div(smartSupplyN)), ratioN))); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, reserveBalance.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_FLOOR) | ||
.toNumber(), reserveBalance.symbol); | ||
} | ||
exports.calculateSmartToReserve = calculateSmartToReserve; | ||
/** | ||
@@ -204,3 +237,3 @@ * Compose Memo | ||
} | ||
// Opposite of unChopRelays | ||
// Opposite of ChopRelays | ||
function unChopRelays(choppedRelays, relays) { | ||
@@ -223,2 +256,69 @@ return choppedRelays.reduce((accum, choppedRelay) => { | ||
exports.createPath = createPath; | ||
function chargeFee(asset, decimalFee, magnitude = 1) { | ||
decimal_js_1.default.set({ precision: 15, rounding: decimal_js_1.default.ROUND_DOWN }); | ||
const assetAmount = asset.toDecimal(); | ||
const one = new decimal_js_1.default(1); | ||
const totalFee = assetAmount.times(one.minus(decimal_js_1.default.pow(one.minus(decimalFee), magnitude))); | ||
const newAmount = assetAmount.minus(totalFee); | ||
return new eos_common_1.Asset(newAmount | ||
.times(Math.pow(10, asset.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_FLOOR) | ||
.toNumber(), asset.symbol); | ||
} | ||
exports.chargeFee = chargeFee; | ||
function liquidate(smartTokens, reserveBalance, smartSupply) { | ||
const smartTokensN = smartTokens.toDecimal(); | ||
const reserveBalanceN = reserveBalance.toDecimal(); | ||
const smartSupplyN = smartSupply.toDecimal(); | ||
const reward = smartTokensN.times(reserveBalanceN).div(smartSupplyN); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, reserveBalance.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_DOWN) | ||
.toNumber(), reserveBalance.symbol); | ||
} | ||
exports.liquidate = liquidate; | ||
function calculateLiquidateCost(reserveTokens, reserveBalance, smartSupply) { | ||
const reserveTokensN = reserveTokens.toDecimal(); | ||
const reserveBalanceN = reserveBalance.toDecimal(); | ||
const smartSupplyN = smartSupply.toDecimal(); | ||
const reward = reserveTokensN.times(smartSupplyN).div(reserveBalanceN); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, smartSupply.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_DOWN) | ||
.toNumber(), smartSupply.symbol); | ||
} | ||
exports.calculateLiquidateCost = calculateLiquidateCost; | ||
function fund(smartTokens, reserveBalance, smartSupply) { | ||
const reserveTokensN = smartTokens.toDecimal(); | ||
const reserveBalanceN = reserveBalance.toDecimal(); | ||
const smartSupplyN = smartSupply.toDecimal(); | ||
const one = new decimal_js_1.default(1); | ||
// (smart_amount * balance - 1) / current_smart_supply + 1; | ||
const reward = reserveTokensN | ||
.times(reserveBalanceN) | ||
.minus(one) | ||
.div(smartSupplyN) | ||
.plus(one); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, reserveBalance.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_DOWN) | ||
.toNumber(), reserveBalance.symbol); | ||
} | ||
exports.fund = fund; | ||
function calculateFundReturn(reserveTokens, reserveBalance, smartSupply) { | ||
const reserveTokensN = reserveTokens.toDecimal(); | ||
const reserveBalanceN = reserveBalance.toDecimal(); | ||
const smartSupplyN = smartSupply.toDecimal(); | ||
const one = new decimal_js_1.default(1); | ||
const reward = reserveTokensN | ||
.times(smartSupplyN) | ||
.minus(smartSupplyN) | ||
.plus(one) | ||
.div(reserveBalanceN); | ||
return new eos_common_1.Asset(reward | ||
.times(Math.pow(10, smartSupply.symbol.precision)) | ||
.toDecimalPlaces(0, decimal_js_1.default.ROUND_DOWN) | ||
.toNumber(), smartSupply.symbol); | ||
} | ||
exports.calculateFundReturn = calculateFundReturn; | ||
//# sourceMappingURL=index.js.map |
@@ -70,2 +70,3 @@ import { Symbol, Asset } from "eos-common"; | ||
isMultiContract: boolean; | ||
fee: number; | ||
} | ||
@@ -72,0 +73,0 @@ export interface nRelay { |
{ | ||
"name": "bancorx", | ||
"version": "0.2.8", | ||
"version": "0.2.9", | ||
"description": "BancorX Utility", | ||
@@ -26,2 +26,3 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"decimal.js": "^10.2.0", | ||
"eos-common": "^0.1.36", | ||
@@ -28,0 +29,0 @@ "underscore": "^1.9.1", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
54546
781
4
+ Addeddecimal.js@^10.2.0