@firefly-exchange/library-sui
Version:
Sui library housing helper methods, classes to interact with Bluefin protocol(s) deployed on Sui
56 lines (55 loc) • 2.79 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Balance = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const library_1 = require("../library");
const constants_1 = require("../constants");
class Balance {
constructor(mro, qPos, margin, oiOpen, isPosPositive) {
this.mro = new bignumber_js_1.default(mro);
this.qPos = new bignumber_js_1.default(qPos);
this.margin = new bignumber_js_1.default(margin);
this.oiOpen = new bignumber_js_1.default(oiOpen);
this.isPosPositive = isPosPositive;
}
static fromPosition(position) {
return new Balance(position.mro, position.qPos, position.margin, position.oiOpen, position.isPosPositive);
}
pPos() {
return this.qPos.gt(0)
? this.oiOpen.multipliedBy(constants_1.BIGNUMBER_BASE_ON_CHAIN).dividedBy(this.qPos)
: new bignumber_js_1.default("0");
}
marginRatio(price, settlementAmount = (0, bignumber_js_1.default)(0)) {
// if no position, margin ratio is one
if (this.qPos.isEqualTo(0))
return constants_1.BIGNUMBER_BASE_ON_CHAIN;
let marginRatio;
const balance = price.times(this.qPos).dividedBy(constants_1.BIGNUMBER_BASE_ON_CHAIN);
if (this.isPosPositive) {
// long position
const debt = this.oiOpen.minus(this.margin).minus(settlementAmount);
const debtRatio = debt.times(constants_1.BIGNUMBER_BASE_ON_CHAIN).dividedBy(balance); // if this ratio exceeds 1 it means that the exchange is underwater.
// It must be below 1 - maintenance ratio
marginRatio = constants_1.BIGNUMBER_BASE_ON_CHAIN.minus(debtRatio);
}
else {
// short position
const debt = this.oiOpen.plus(this.margin).plus(settlementAmount);
const debtRatio = debt.times(constants_1.BIGNUMBER_BASE_ON_CHAIN).dividedBy(balance);
marginRatio = debtRatio.minus(constants_1.BIGNUMBER_BASE_ON_CHAIN);
}
return marginRatio;
}
printPosition() {
console.log("isPosPositive:", this.isPosPositive);
console.log("margin:", (0, library_1.toBaseNumber)(this.margin, 3, constants_1.BASE_DECIMALS_ON_CHAIN));
console.log("oiOpen:", (0, library_1.toBaseNumber)(this.oiOpen, 3, constants_1.BASE_DECIMALS_ON_CHAIN));
console.log("qPos:", (0, library_1.toBaseNumber)(this.qPos, 3, constants_1.BASE_DECIMALS_ON_CHAIN));
console.log("mro:", (0, library_1.toBaseNumber)(this.mro, 3, constants_1.BASE_DECIMALS_ON_CHAIN));
}
}
exports.Balance = Balance;
;