@backt/protocol
Version:
Backt smart contracts implementation
1,369 lines (1,153 loc) • 70.2 kB
JavaScript
'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();