UNPKG

@backt/protocol

Version:
1,369 lines (1,153 loc) 70.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral'); var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _templateObject = (0, _taggedTemplateLiteral3.default)([''], ['']); var _bignumber = require('bignumber.js'); var _bignumber2 = _interopRequireDefault(_bignumber); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _contracts = require('./contracts'); var _utils = require('./utils'); var _calc = require('./calc'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // strip off any decimal component of a wei value as wei is the smallest unit of ETH var safeWeiValue = function safeWeiValue(weiValue) { return weiValue.toFixed(0); }; var CFDAPI = function () { (0, _createClass3.default)(CFDAPI, [{ key: 'newCFD', /** * Create a new CFD. * * See creatorFee() for details of required fees in addition to the initial * collateral. * * @param marketIdStr Contract for this market (eg. "Poloniex_ETH_USD") * @param strikePrice Contract strike price * @param notionalAmountWei Contract amount * @param leverage The leverage (between 0.01 and 5.00) * @param isBuyer Creator wants to be contract buyer or seller * @param creator Creator of this contract who will sign the transaction * * @return Promise resolving to a new cfd truffle-contract instance on * success or a promise failure if the tx failed */ value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(marketIdStr, strikePrice, notionalAmountWei, leverage, isBuyer, creator) { var decimals, strikePriceBN, marketId, leverageValue, notionalBN, deposit, valueWei, createTx, cfdAddress; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: (0, _utils.assertBigNumberOrString)(strikePrice); (0, _utils.assertBigNumberOrString)(notionalAmountWei); (0, _utils.assertBigNumberOrString)(leverage); _context.next = 5; return this.feeds.decimals.call(); case 5: decimals = _context.sent; strikePriceBN = (0, _utils.toContractBigNumber)(strikePrice, decimals).toString(); marketId = this.marketIdStrToBytes(marketIdStr); leverageValue = parseFloat(leverage); if (!(isNaN(leverageValue) === true || leverageValue === 0)) { _context.next = 11; break; } return _context.abrupt('return', _bluebird2.default.reject(new Error('invalid leverage'))); case 11: notionalBN = new _bignumber2.default(notionalAmountWei); deposit = notionalBN.dividedBy(leverageValue); valueWei = deposit.plus((0, _calc.creatorFee)(notionalBN)); _context.next = 16; return this.cfdFactory.createContract(marketId, strikePriceBN, notionalAmountWei, isBuyer, { from: creator, value: safeWeiValue(valueWei), gas: 500000 }); case 16: createTx = _context.sent; if (!(0, _utils.txFailed)(createTx.receipt.status)) { _context.next = 19; break; } return _context.abrupt('return', _bluebird2.default.reject(new Error('transaction status != 1. tx:[' + JSON.stringify(createTx, null, 2) + ']'))); case 19: cfdAddress = createTx.receipt.logs[1].address; return _context.abrupt('return', this.cfd.at(cfdAddress)); case 21: case 'end': return _context.stop(); } } }, _callee, this); })); function newCFD(_x, _x2, _x3, _x4, _x5, _x6) { return _ref.apply(this, arguments); } return newCFD; }() /** * Deposit is called by a party wishing to join a new CFD. * * See joinerFee() for details of required fees in addition to the initial * collateral. These fees are added on to the passed amount. * * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'deposit', value: function () { var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(cfdAddress, depositAccount, amount) { var cfd, fee; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: cfd = this.cfd.at(cfdAddress); _context2.next = 3; return this.joinFee(cfd); case 3: fee = _context2.sent; return _context2.abrupt('return', cfd.deposit({ from: depositAccount, value: safeWeiValue(amount.plus(fee)), gas: 1000000 })); case 5: case 'end': return _context2.stop(); } } }, _callee2, this); })); function deposit(_x7, _x8, _x9) { return _ref2.apply(this, arguments); } return deposit; }() /** * Get details of a CFD given a deployment address. * @param cfdAddress Address of a deployed CFD */ }, { key: 'getCFD', value: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(cfdAddress) { var cfd, self; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: // TODO: call getCode to check it exists cfd = this.cfd.at(cfdAddress); self = this; return _context3.abrupt('return', _bluebird2.default.all([cfd.getCfdAttributes.call(), // [buyer,seller,market,strikePrice,notionalAmountWei,buyerSelling,sellerSelling,status] cfd.getCfdAttributes2.call(), // [buyerInitialNotional,sellerInitialNotional,buyerDepositBalance,sellerDepositBalance,buyerSaleStrikePrice,sellerSaleStrikePrice,buyerInitialStrikePrice,sellerInitialStrikePrice] cfd.getCfdAttributes3.call(), // [termninated,upgradeCalledBy] self.feeds.decimals.call()]).then(function (values) { // Got all the data, fetch the data that needed previous values var strikePrice = (0, _utils.fromContractBigNumber)(values[0][3], values[3]); return _bluebird2.default.all([self.marketIdBytesToStr(values[0][2]), // [0] cfd.cutOffPrice.call(values[0][4], values[1][2], strikePrice, true), // [1] cfd.cutOffPrice.call(values[0][4], values[1][3], strikePrice, false) // [2] ]).then(function (values2) { // Got the rest of the data return { address: cfdAddress, status: values[0][7], liquidated: values[2][0], upgradeCalledBy: values[2][1], buyer: values[0][0], buyerIsSelling: values[0][5], seller: values[0][1], sellerIsSelling: values[0][6], market: values2[0], notionalAmountWei: values[0][4], buyerInitialNotional: values[1][0], sellerInitialNotional: values[1][1], strikePrice: strikePrice, buyerSaleStrikePrice: (0, _utils.fromContractBigNumber)(values[1][4], values[3]), sellerSaleStrikePrice: (0, _utils.fromContractBigNumber)(values[1][5], values[3]), buyerDepositBalance: values[1][2], sellerDepositBalance: values[1][3], buyerInitialStrikePrice: (0, _utils.fromContractBigNumber)(values[1][6], values[3]), sellerInitialStrikePrice: (0, _utils.fromContractBigNumber)(values[1][7], values[3]), buyerLiquidationPrice: values2[1], sellerLiquidationPrice: values2[2] }; }); })); case 3: case 'end': return _context3.stop(); } } }, _callee3, this); })); function getCFD(_x10) { return _ref3.apply(this, arguments); } return getCFD; }() /** * Fulfill a request to mark a CFD for sale by calling sellPrepare on the CFD * and sending the fee for a single market price read. * @param cfdAddress Address of a deployed CFD * @param sellerAccount Account settling the position. * @param desiredStrikePrice Sellers wants to sell at this strike price. * @param timeLimit Sale expired after this time (UNIX epoch seconds). * Defaults to 0 for no limit. * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'sellCFD', value: function () { var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(cfdAddress, sellerAccount, desiredStrikePrice) { var timeLimit = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; var cfd, decimals, desiredStrikePriceBN; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: cfd = this.cfd.at(cfdAddress); _context4.next = 3; return cfd.isContractParty.call(sellerAccount); case 3: _context4.t0 = _context4.sent; if (!(_context4.t0 === false)) { _context4.next = 6; break; } return _context4.abrupt('return', _bluebird2.default.reject(new Error(sellerAccount + ' is not a party to CFD ' + cfdAddress))); case 6: _context4.next = 8; return this.feeds.decimals.call(); case 8: decimals = _context4.sent; desiredStrikePriceBN = (0, _utils.toContractBigNumber)(desiredStrikePrice, decimals).toString(); return _context4.abrupt('return', cfd.sellPrepare(desiredStrikePriceBN, timeLimit, { from: sellerAccount, gas: 100000 })); case 11: case 'end': return _context4.stop(); } } }, _callee4, this); })); function sellCFD(_x12, _x13, _x14) { return _ref4.apply(this, arguments); } return sellCFD; }() /** * Fulfill a request to change the sale price for a CFD for sale * @param cfdAddress Address of a deployed CFD * @param sellerAccount Account settling the position. * @param desiredStrikePrice Sellers wants to sell at this strike price. * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'changeSaleCFD', value: function () { var _ref5 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5(cfdAddress, sellerAccount, desiredStrikePrice) { var cfd, decimals, desiredStrikePriceBN; return _regenerator2.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: cfd = this.cfd.at(cfdAddress); _context5.next = 3; return cfd.isContractParty.call(sellerAccount); case 3: _context5.t0 = _context5.sent; if (!(_context5.t0 === false)) { _context5.next = 6; break; } return _context5.abrupt('return', _bluebird2.default.reject(new Error(sellerAccount + ' is not a party to CFD ' + cfdAddress))); case 6: _context5.next = 8; return this.feeds.decimals.call(); case 8: decimals = _context5.sent; desiredStrikePriceBN = (0, _utils.toContractBigNumber)(desiredStrikePrice, decimals).toString(); return _context5.abrupt('return', cfd.sellUpdate(desiredStrikePriceBN, { from: sellerAccount })); case 11: case 'end': return _context5.stop(); } } }, _callee5, this); })); function changeSaleCFD(_x15, _x16, _x17) { return _ref5.apply(this, arguments); } return changeSaleCFD; }() /** * Fulfill a request to update the strike price for a non-initialized CFD * @param cfdAddress Address of a deployed CFD * @param userAccount User's account making the request * @param desiredStrikePrice User wants this strike price value for his CFD * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'changeStrikePriceCFD', value: function () { var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(cfdAddress, userAccount, desiredStrikePrice) { var cfd, decimals, desiredStrikePriceBN; return _regenerator2.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: cfd = this.cfd.at(cfdAddress); _context6.next = 3; return cfd.isContractParty.call(userAccount); case 3: _context6.t0 = _context6.sent; if (!(_context6.t0 === false)) { _context6.next = 6; break; } return _context6.abrupt('return', _bluebird2.default.reject(new Error(userAccount + ' is not a party to CFD ' + cfdAddress))); case 6: _context6.next = 8; return this.feeds.decimals.call(); case 8: decimals = _context6.sent; desiredStrikePriceBN = (0, _utils.toContractBigNumber)(desiredStrikePrice, decimals).toString(); return _context6.abrupt('return', cfd.changeStrikePrice(desiredStrikePriceBN, { from: userAccount })); case 11: case 'end': return _context6.stop(); } } }, _callee6, this); })); function changeStrikePriceCFD(_x18, _x19, _x20) { return _ref6.apply(this, arguments); } return changeStrikePriceCFD; }() /** * Buy a contract for sale * @param cfdAddress, Address of the deployed CFD * @param account, The address of the account who is topuping * @param valueToBuy, The amount (in Wei) the user has to pay * @param isBuyerSide, Boolean if the user is buyer or seller * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'buyCFD', value: function () { var _ref7 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee7(cfdAddress, account, valueToBuy, isBuyerSide) { var cfd, valueToBuyBN, valuePlusBuy; return _regenerator2.default.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: cfd = this.cfd.at(cfdAddress); valueToBuyBN = new _bignumber2.default(valueToBuy); _context7.t0 = valueToBuyBN; _context7.next = 5; return this.joinFee(cfd); case 5: _context7.t1 = _context7.sent; valuePlusBuy = _context7.t0.plus.call(_context7.t0, _context7.t1); return _context7.abrupt('return', cfd.buy(isBuyerSide, { from: account, value: safeWeiValue(valuePlusBuy), gas: 200000 })); case 8: case 'end': return _context7.stop(); } } }, _callee7, this); })); function buyCFD(_x21, _x22, _x23, _x24) { return _ref7.apply(this, arguments); } return buyCFD; }() /** * Force liquidation a contract * @param cfdAddress, Address of the deployed CFD * @param account, The address of the account who is terminating * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'forceTerminate', value: function () { var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(cfdAddress, account) { var cfd; return _regenerator2.default.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: cfd = this.cfd.at(cfdAddress); return _context8.abrupt('return', cfd.forceTerminate({ from: account, gas: 150000 })); case 2: case 'end': return _context8.stop(); } } }, _callee8, this); })); function forceTerminate(_x25, _x26) { return _ref8.apply(this, arguments); } return forceTerminate; }() /** * Topup a CFD by the amount sent by the user * @param cfdAddress, Address of the deployed CFD * @param account, The address of the account who is topuping * @param valueToAdd, The amount (in Wei) the user wants to add */ }, { key: 'topup', value: function () { var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee9(cfdAddress, account, valueToAdd) { var cfd; return _regenerator2.default.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: cfd = this.cfd.at(cfdAddress); _context9.next = 3; return cfd.isContractParty.call(account); case 3: _context9.t0 = _context9.sent; if (!(_context9.t0 === false)) { _context9.next = 6; break; } return _context9.abrupt('return', _bluebird2.default.reject(new Error(account + ' is not a party to CFD ' + cfdAddress))); case 6: return _context9.abrupt('return', cfd.topup({ from: account, value: safeWeiValue(valueToAdd) })); case 7: case 'end': return _context9.stop(); } } }, _callee9, this); })); function topup(_x27, _x28, _x29) { return _ref9.apply(this, arguments); } return topup; }() /** * Withdraw the amount from a CFD * @param cfdAddress, Address of the deployed CFD * @param account, The address of the account who is withdrawing * @param valueToWithdraw, The amount (in Wei) the user wants to withdraw */ }, { key: 'withdraw', value: function () { var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee10(cfdAddress, account, valueToWithdraw) { var cfd; return _regenerator2.default.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: cfd = this.cfd.at(cfdAddress)(_templateObject); _context10.next = 3; return cfd.isContractParty.call(account); case 3: _context10.t0 = _context10.sent; if (!(_context10.t0 === false)) { _context10.next = 6; break; } return _context10.abrupt('return', _bluebird2.default.reject(new Error(account + ' is not a party to CFD ' + cfdAddress))); case 6: return _context10.abrupt('return', cfd.withdraw(valueToWithdraw, { from: account })); case 7: case 'end': return _context10.stop(); } } }, _callee10, this); })); function withdraw(_x30, _x31, _x32) { return _ref10.apply(this, arguments); } return withdraw; }() /** * Tansfer the position in a contract to another account. * @param cfdAddress, Address of the deployed CFD * @param fromAccount, Account who is transferring the position * @param toAccount, Account who the position gets transferred too * @return Promise resolving to success with tx details or reject depending * on the outcome. */ }, { key: 'transferPosition', value: function () { var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(cfdAddress, fromAccount, toAccount) { var cfd; return _regenerator2.default.wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: cfd = this.cfd.at(cfdAddress); return _context11.abrupt('return', cfd.transferPosition(toAccount, { from: fromAccount, gas: 50000 })); case 2: case 'end': return _context11.stop(); } } }, _callee11, this); })); function transferPosition(_x33, _x34, _x35) { return _ref11.apply(this, arguments); } return transferPosition; }() /** * Get contracts that have been created but don't yet have a counterparty. * @param options Object with optional properties: * fromBlock Block to query events from (default=0) * @param onSuccessCallback Callback receives list of matching cfd address's * @param onErrorCallback Callback receives error details on error */ }, { key: 'contractsWaitingCounterparty', value: function contractsWaitingCounterparty(_ref12, onSuccessCallback, onErrorCallback) { var _ref12$fromBlock = _ref12.fromBlock, fromBlock = _ref12$fromBlock === undefined ? 0 : _ref12$fromBlock; var _this = this; var self = this; var hasLiquidated = function () { var _ref13 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee12(cfd) { return _regenerator2.default.wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: return _context12.abrupt('return', cfd.closed.call()); case 1: case 'end': return _context12.stop(); } } }, _callee12, _this); })); return function hasLiquidated(_x36) { return _ref13.apply(this, arguments); }; }(); var getAttributes = function () { var _ref14 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee13(cfd) { return _regenerator2.default.wrap(function _callee13$(_context13) { while (1) { switch (_context13.prev = _context13.next) { case 0: return _context13.abrupt('return', cfd.getCfdAttributes.call()); case 1: case 'end': return _context13.stop(); } } }, _callee13, _this); })); return function getAttributes(_x37) { return _ref14.apply(this, arguments); }; }(); var getAttributes2 = function () { var _ref15 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee14(cfd) { return _regenerator2.default.wrap(function _callee14$(_context14) { while (1) { switch (_context14.prev = _context14.next) { case 0: return _context14.abrupt('return', cfd.getCfdAttributes2.call()); case 1: case 'end': return _context14.stop(); } } }, _callee14, _this); })); return function getAttributes2(_x38) { return _ref15.apply(this, arguments); }; }(); var getMarketStr = function () { var _ref16 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee15(market) { return _regenerator2.default.wrap(function _callee15$(_context15) { while (1) { switch (_context15.prev = _context15.next) { case 0: return _context15.abrupt('return', self.marketIdBytesToStr(market)); case 1: case 'end': return _context15.stop(); } } }, _callee15, _this); })); return function getMarketStr(_x39) { return _ref16.apply(this, arguments); }; }(); var getStrikePrice = function () { var _ref17 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee16(cfd, decimals) { return _regenerator2.default.wrap(function _callee16$(_context16) { while (1) { switch (_context16.prev = _context16.next) { case 0: _context16.t0 = _utils.fromContractBigNumber; _context16.next = 3; return cfd.strikePrice.call(); case 3: _context16.t1 = _context16.sent; _context16.t2 = decimals; return _context16.abrupt('return', (0, _context16.t0)(_context16.t1, _context16.t2)); case 6: case 'end': return _context16.stop(); } } }, _callee16, _this); })); return function getStrikePrice(_x40, _x41) { return _ref17.apply(this, arguments); }; }(); // Get the CFD that are not initialized and not closed var filterCfds = function () { var _ref18 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee17(cfdRecs) { var result, initiatedFlags, hasLiquidatedArr; return _regenerator2.default.wrap(function _callee17$(_context17) { while (1) { switch (_context17.prev = _context17.next) { case 0: result = cfdRecs; // Filter out the initialized cfds _context17.next = 3; return _bluebird2.default.all(result.map(function (_ref19) { var cfd = _ref19.cfd; return cfd.initiated.call(); })); case 3: initiatedFlags = _context17.sent; result = result.filter(function (rec, idx) { return initiatedFlags[idx] === false; }); // Filter out the closed cfds _context17.next = 7; return _bluebird2.default.all(result.map(function (_ref20) { var cfd = _ref20.cfd; return hasLiquidated(cfd); })); case 7: hasLiquidatedArr = _context17.sent; result = result.filter(function (rec, idx) { return hasLiquidatedArr[idx] === false; }); return _context17.abrupt('return', result); case 10: case 'end': return _context17.stop(); } } }, _callee17, _this); })); return function filterCfds(_x42) { return _ref18.apply(this, arguments); }; }(); // For each CFD, get the market and the status var getDetailsCfds = function () { var _ref21 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee18(filteredCfds) { var result, decimals, attributesCfds, attributes2Cfds, marketCfdsStr, strikePriceCfds; return _regenerator2.default.wrap(function _callee18$(_context18) { while (1) { switch (_context18.prev = _context18.next) { case 0: result = filteredCfds; // Get decimals _context18.next = 3; return self.feeds.decimals.call(); case 3: decimals = _context18.sent; _context18.next = 6; return _bluebird2.default.all(result.map(function (_ref22) { var cfd = _ref22.cfd; return getAttributes(cfd); })); case 6: attributesCfds = _context18.sent; _context18.next = 9; return _bluebird2.default.all(result.map(function (_ref23) { var cfd = _ref23.cfd; return getAttributes2(cfd); })); case 9: attributes2Cfds = _context18.sent; _context18.next = 12; return _bluebird2.default.all(result.map(function (cfd, idx) { return getMarketStr(attributesCfds[idx][2]); })); case 12: marketCfdsStr = _context18.sent; _context18.next = 15; return _bluebird2.default.all(result.map(function (_ref24) { var cfd = _ref24.cfd; return getStrikePrice(cfd, decimals); })); case 15: strikePriceCfds = _context18.sent; // For each contract, set their specific market and status result = result.map(function (cfd, idx) { cfd.cfd.details = cfd.cfd.details === undefined ? {} : cfd.cfd.details; cfd.cfd.details.buyer = attributesCfds[idx][0]; cfd.cfd.details.seller = attributesCfds[idx][1]; cfd.cfd.details.market = marketCfdsStr[idx]; cfd.cfd.details.notional = attributesCfds[idx][4]; cfd.cfd.details.buyerDepositBalance = attributes2Cfds[idx][2]; cfd.cfd.details.sellerDepositBalance = attributes2Cfds[idx][3]; cfd.cfd.details.strikePrice = strikePriceCfds[idx]; return cfd; }); return _context18.abrupt('return', result); case 18: case 'end': return _context18.stop(); } } }, _callee18, _this); })); return function getDetailsCfds(_x43) { return _ref21.apply(this, arguments); }; }(); var event = this.cfdRegistry.LogCFDRegistryNew({}, { fromBlock: fromBlock, toBlock: 'latest' }); event.get(function (error, events) { if (error) { onErrorCallback(error); return; } _this.eventsToCfdRecs(events).then(function (cfdRecs) { return filterCfds(cfdRecs); }).then(function (filteredCfds) { return getDetailsCfds(filteredCfds); }).then(function (filteredDetailedCfds) { return onSuccessCallback(filteredDetailedCfds); }); }); } /** * Get contracts that a party is or has been associated with (as buyer or * seller). * @param partyAddress Get contracts for this party * @param options Object with optional properties: * fromBlock Block to query events from (default=0) * includeLiquidated Include liquidated cfd's in the results * (default=false) * includeTransferred Include cfd's that partyAddress transferred or * sold to another account (ie. cfd's they were * once a part of but no longer are) * (default=false) * @param onSuccessCallback Callback receives list of matching cfd address's * @param onErrorCallback Callback receives error details on error */ }, { key: 'contractsForParty', value: function contractsForParty(partyAddress, _ref25, onSuccessCallback, onErrorCallback) { var _ref25$fromBlock = _ref25.fromBlock, fromBlock = _ref25$fromBlock === undefined ? 0 : _ref25$fromBlock, _ref25$includeLiquida = _ref25.includeLiquidated, includeLiquidated = _ref25$includeLiquida === undefined ? false : _ref25$includeLiquida, _ref25$includeTransfe = _ref25.includeTransferred, includeTransferred = _ref25$includeTransfe === undefined ? false : _ref25$includeTransfe; var _this2 = this; var self = this; var getAttributes = function () { var _ref26 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee19(cfd) { return _regenerator2.default.wrap(function _callee19$(_context19) { while (1) { switch (_context19.prev = _context19.next) { case 0: return _context19.abrupt('return', cfd.getCfdAttributes.call()); case 1: case 'end': return _context19.stop(); } } }, _callee19, _this2); })); return function getAttributes(_x44) { return _ref26.apply(this, arguments); }; }(); var getMarketStr = function () { var _ref27 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee20(market) { return _regenerator2.default.wrap(function _callee20$(_context20) { while (1) { switch (_context20.prev = _context20.next) { case 0: return _context20.abrupt('return', self.marketIdBytesToStr(market)); case 1: case 'end': return _context20.stop(); } } }, _callee20, _this2); })); return function getMarketStr(_x45) { return _ref27.apply(this, arguments); }; }(); var hasLiquidated = function () { var _ref28 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee21(cfd) { return _regenerator2.default.wrap(function _callee21$(_context21) { while (1) { switch (_context21.prev = _context21.next) { case 0: return _context21.abrupt('return', cfd.closed.call()); case 1: case 'end': return _context21.stop(); } } }, _callee21, _this2); })); return function hasLiquidated(_x46) { return _ref28.apply(this, arguments); }; }(); var hasTransferred = function () { var _ref29 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee22(cfd, party) { return _regenerator2.default.wrap(function _callee22$(_context22) { while (1) { switch (_context22.prev = _context22.next) { case 0: _context22.t1 = party; _context22.next = 3; return cfd.buyer.call(); case 3: _context22.t2 = _context22.sent; _context22.t0 = _context22.t1 !== _context22.t2; if (!_context22.t0) { _context22.next = 11; break; } _context22.t3 = party; _context22.next = 9; return cfd.seller.call(); case 9: _context22.t4 = _context22.sent; _context22.t0 = _context22.t3 !== _context22.t4; case 11: return _context22.abrupt('return', _context22.t0); case 12: case 'end': return _context22.stop(); } } }, _callee22, _this2); })); return function hasTransferred(_x47, _x48) { return _ref29.apply(this, arguments); }; }(); // Filter the CFDS to get the one we want var filterCfds = function () { var _ref30 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee23(cfdRecs) { var result, hasLiquidatedArr, hasTransferredArr; return _regenerator2.default.wrap(function _callee23$(_context23) { while (1) { switch (_context23.prev = _context23.next) { case 0: result = cfdRecs; if (!(includeLiquidated === false)) { _context23.next = 6; break; } _context23.next = 4; return _bluebird2.default.all(result.map(function (_ref31) { var cfd = _ref31.cfd; return hasLiquidated(cfd); })); case 4: hasLiquidatedArr = _context23.sent; result = result.filter(function (rec, idx) { return hasLiquidatedArr[idx] === false; }); case 6: if (!(includeTransferred === false)) { _context23.next = 11; break; } _context23.next = 9; return _bluebird2.default.all(result.map(function (_ref32) { var cfd = _ref32.cfd; return hasTransferred(cfd, partyAddress); })); case 9: hasTransferredArr = _context23.sent; result = result.filter(function (rec, idx) { return hasTransferredArr[idx] === false; }); case 11: return _context23.abrupt('return', result); case 12: case 'end': return _context23.stop(); } } }, _callee23, _this2); })); return function filterCfds(_x49) { return _ref30.apply(this, arguments); }; }(); // For each CFD, get the market and the status var getDetailsCfds = function () { var _ref33 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee24(filteredCfds) { var result, attributesCfds, marketCfdsStr; return _regenerator2.default.wrap(function _callee24$(_context24) { while (1) { switch (_context24.prev = _context24.next) { case 0: result = filteredCfds; _context24.next = 3; return _bluebird2.default.all(result.map(function (_ref34) { var cfd = _ref34.cfd; return getAttributes(cfd); })); case 3: attributesCfds = _context24.sent; _context24.next = 6; return _bluebird2.default.all(result.map(function (cfd, idx) { return getMarketStr(attributesCfds[idx][2]); })); case 6: marketCfdsStr = _context24.sent; // For each contract, set their specific market and status result = result.map(function (cfd, idx) { cfd.cfd.details = cfd.cfd.details === undefined ? {} : cfd.cfd.details; cfd.cfd.details.buyer = attributesCfds[idx][0]; cfd.cfd.details.seller = attributesCfds[idx][1]; cfd.cfd.details.market = marketCfdsStr[idx]; cfd.cfd.details.status = attributesCfds[idx][7]; cfd.cfd.details.buyerIsSelling = attributesCfds[idx][5]; cfd.cfd.details.sellerIsSelling = attributesCfds[idx][6]; return cfd; }); return _context24.abrupt('return', result); case 9: case 'end': return _context24.stop(); } } }, _callee24, _this2); })); return function getDetailsCfds(_x50) { return _ref33.apply(this, arguments); }; }(); var event = this.cfdRegistry.LogCFDRegistryParty({ party: partyAddress }, { fromBlock: fromBlock, toBlock: 'latest' }); event.get(function (error, events) { if (error) { onErrorCallback(error); return; } _this2.eventsToCfdRecs(events).then(function (cfdRecs) { return filterCfds(cfdRecs); }).then(function (filteredCfds) { return getDetailsCfds(filteredCfds); }).then(function (filteredDetailedCfds) { return onSuccessCallback(filteredDetailedCfds); }); }); } /** * Get all contracts for a specific market * @param marketId * @param options Object with optional properties: * fromBlock Block to query events from (default=0) * includeLiquidated Include liquidated cfd's in the results * (default=false) * @param onSuccessCallback Callback receives list of matching cfd address's * @param onErrorCallback Callback receives error details on error */ }, { key: 'contractsForMarket', value: function contractsForMarket(marketId, _ref35, onSuccessCallback, onErrorCallback) { var _ref35$fromBlock = _ref35.fromBlock, fromBlock = _ref35$fromBlock === undefined ? 0 : _ref35$fromBlock, _ref35$includeLiquida = _ref35.includeLiquidated, includeLiquidated = _ref35$includeLiquida === undefined ? false : _ref35$includeLiquida; var _this3 = this; var self = this; var hasLiquidated = function () { var _ref36 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee25(cfd) { return _regenerator2.default.wrap(function _callee25$(_context25) { while (1) { switch (_context25.prev = _context25.next) { case 0: return _context25.abrupt('return', cfd.closed.call()); case 1: case 'end': return _context25.stop(); } } }, _callee25, _this3); })); return function hasLiquidated(_x51) { return _ref36.apply(this, arguments); }; }(); var getDetailsCfd = function () { var _ref37 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee26(cfd) { return _regenerator2.default.wrap(function _callee26$(_context26) { while (1) { switch (_context26.prev = _context26.next) { case 0: return _context26.abrupt('return', self.getCFD(cfd.address)); case 1: case 'end': return _context26.stop(); } } }, _callee26, _this3); })); return function getDetailsCfd(_x52) { return _ref37.apply(this, arguments); }; }(); var market = this.marketIdStrToBytes(marketId); var event = this.cfdFactory.LogCFDFactoryNew({ marketId: market }, { fromBlock: fromBlock, toBlock: 'latest' }); var filterCfds = function () { var _ref38 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee27(cfdRecs) { var result, hasLiquidatedArr, results; return _regenerator2.default.wrap(function _callee27$(_context27) { while (1) { switch (_context27.prev = _context27.next) { case 0: result = cfdRecs; if (!(includeLiquidated === false)) { _context27.next = 6; break; } _context27.next = 4; return _bluebird2.default.all(result.map(function (_ref39) { var cfd = _ref39.cfd; return hasLiquidated(cfd); })); case 4: hasLiquidatedArr = _context27.sent; result = result.filter(function (rec, idx) { return hasLiquidatedArr[idx] === false; }); case 6: _context27.next = 8; return _bluebird2.default.all(result.map(function (_ref40) { var cfd = _ref40.cfd; return getDetailsCfd(cfd); })); case 8: results = _context27.sent; return _context27.abrupt('return', results); case 10: case 'end': return _context27.stop(); } } }, _callee27, _this3); })); return function filterCfds(_x53) { return _ref38.apply(this, arguments); }; }(); event.get(function (error, events) { if (error) { onErrorCallback(error); return; } var eventsCfd = events.map(function (event, idx) { return { cfd: self.cfd.at(event.args.newCFDAddr) }; }); filterCfds(eventsCfd).then(function (filteredCfds) { return onSuccessCallback(filteredCfds); }); }); } /** * Get contracts available for sale (sellPrepare() called and waiting a buy()) * @param options Object with optional properties: * fromBlock Block to query events from (default=0) * @param onSuccessCallback Callback receives list of matching cfd address's * @param onErrorCallback Callback receives error details on error */ }, { key: 'contractsForSale', value: function contractsForSale(_ref41, onSuccessCallback, onErrorCallback) { var _ref41$fromBlock = _ref41.fromBlock, fromBlock = _ref41$fromBlock === undefined ? 0 : _ref41$fromBlock; var _this4 = this; var self = this; var hasSideOnSale = function () { var _ref42 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee28(cfd) { return _regenerator2.default.wrap(function _callee28$(_context28) { while (1) { switch (_context28.prev = _context28.next) { case 0: _context28.next = 2; return cfd.closed.call(); case 2: _context28.t1 = _context28.sent; _context28.t0 = _context28.t1 === false; if (!_context28.t0) { _context28.next = 15; break; } _context28.next = 7; return cfd.isSellerSelling.call(); case 7: _context28.t3 = _context28.sent; _context28.t2 = _context28.t3 === true; if (_context28.t2) { _context28.next = 14; break; } _context28.next = 12; return cfd.isBuyerSelling.call();