@project-serum/serum
Advanced tools
Comparing version 0.1.1 to 0.2.0
@@ -23,2 +23,4 @@ "use strict"; | ||
var _tokenInstructions = require("./token-instructions"); | ||
var DEX_PROGRAM_ID = new _web.PublicKey('9o1FisE366msTQcEvXapyMorTLmvezrxSD8DnM5e5XKw'); | ||
@@ -149,6 +151,10 @@ exports.DEX_PROGRAM_ID = DEX_PROGRAM_ID; | ||
isSigner: false, | ||
isWritable: false | ||
isWritable: true | ||
}, { | ||
pubkey: quoteVault, | ||
isSigner: false, | ||
isWritable: true | ||
}, { | ||
pubkey: _tokenInstructions.TOKEN_PROGRAM_ID, | ||
isSigner: false, | ||
isWritable: false | ||
@@ -155,0 +161,0 @@ }], |
@@ -32,2 +32,4 @@ "use strict"; | ||
var _web = require("@solana/web3.js"); | ||
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } | ||
@@ -53,3 +55,3 @@ | ||
var MARKET_STATE_LAYOUT = (0, _bufferLayout.struct)([accountFlags('accountFlags'), (0, _layout.publicKeyLayout)('ownAddress'), (0, _layout.u64)('vaultSignerNonce'), (0, _layout.publicKeyLayout)('baseMint'), (0, _layout.publicKeyLayout)('quoteMint'), (0, _layout.publicKeyLayout)('baseVault'), (0, _layout.u64)('baseDepositsTotal'), (0, _layout.u64)('baseFeesAccrued'), (0, _layout.publicKeyLayout)('quoteVault'), (0, _layout.u64)('quoteDepositsTotal'), (0, _layout.u64)('quoteFeesAccrued'), (0, _layout.u64)('quoteDustThreshold'), (0, _layout.publicKeyLayout)('requestQueue'), (0, _layout.publicKeyLayout)('eventQueue'), (0, _layout.publicKeyLayout)('bids'), (0, _layout.publicKeyLayout)('asks'), (0, _layout.u64)('baseLotSize'), (0, _layout.u64)('quoteLotSize')]); | ||
var MARKET_STATE_LAYOUT = (0, _bufferLayout.struct)([accountFlags('accountFlags'), (0, _layout.publicKeyLayout)('ownAddress'), (0, _layout.u64)('vaultSignerNonce'), (0, _layout.publicKeyLayout)('baseMint'), (0, _layout.publicKeyLayout)('quoteMint'), (0, _layout.publicKeyLayout)('baseVault'), (0, _layout.u64)('baseDepositsTotal'), (0, _layout.u64)('baseFeesAccrued'), (0, _layout.publicKeyLayout)('quoteVault'), (0, _layout.u64)('quoteDepositsTotal'), (0, _layout.u64)('quoteFeesAccrued'), (0, _layout.u64)('quoteDustThreshold'), (0, _layout.publicKeyLayout)('requestQueue'), (0, _layout.publicKeyLayout)('eventQueue'), (0, _layout.publicKeyLayout)('bids'), (0, _layout.publicKeyLayout)('asks'), (0, _layout.u64)('baseLotSize'), (0, _layout.u64)('quoteLotSize'), (0, _layout.u64)('feeRateBps')]); | ||
exports.MARKET_STATE_LAYOUT = MARKET_STATE_LAYOUT; | ||
@@ -135,7 +137,5 @@ | ||
}, { | ||
key: "placeOrder", | ||
key: "findBaseTokenAccountsForOwner", | ||
value: function () { | ||
var _placeOrder = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(connection, _ref) { | ||
var owner, payer, side, price, size, _ref$orderType, orderType; | ||
var _findBaseTokenAccountsForOwner = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(connection, ownerAddress) { | ||
return _regenerator.default.wrap(function _callee3$(_context3) { | ||
@@ -145,6 +145,11 @@ while (1) { | ||
case 0: | ||
owner = _ref.owner, payer = _ref.payer, side = _ref.side, price = _ref.price, size = _ref.size, _ref$orderType = _ref.orderType, orderType = _ref$orderType === void 0 ? 'limit' : _ref$orderType; | ||
throw new Error('not yet implemented'); | ||
_context3.next = 2; | ||
return connection.getTokenAccountsByOwner(ownerAddress, { | ||
mint: this.baseMintAddress | ||
}); | ||
case 2: | ||
return _context3.abrupt("return", _context3.sent.value); | ||
case 3: | ||
case "end": | ||
@@ -154,6 +159,105 @@ return _context3.stop(); | ||
} | ||
}, _callee3); | ||
}, _callee3, this); | ||
})); | ||
function placeOrder(_x3, _x4) { | ||
function findBaseTokenAccountsForOwner(_x3, _x4) { | ||
return _findBaseTokenAccountsForOwner.apply(this, arguments); | ||
} | ||
return findBaseTokenAccountsForOwner; | ||
}() | ||
}, { | ||
key: "findQuoteTokenAccountsForOwner", | ||
value: function () { | ||
var _findQuoteTokenAccountsForOwner = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(connection, ownerAddress) { | ||
return _regenerator.default.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
_context4.next = 2; | ||
return connection.getTokenAccountsByOwner(ownerAddress, { | ||
mint: this.quoteMintAddress | ||
}); | ||
case 2: | ||
return _context4.abrupt("return", _context4.sent.value); | ||
case 3: | ||
case "end": | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee4, this); | ||
})); | ||
function findQuoteTokenAccountsForOwner(_x5, _x6) { | ||
return _findQuoteTokenAccountsForOwner.apply(this, arguments); | ||
} | ||
return findQuoteTokenAccountsForOwner; | ||
}() | ||
}, { | ||
key: "findOpenOrdersAccountsForOwner", | ||
value: function () { | ||
var _findOpenOrdersAccountsForOwner = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(connection, ownerAddress) { | ||
return _regenerator.default.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
return _context5.abrupt("return", OpenOrders.findForMarketAndOwner(connection, this.address, ownerAddress)); | ||
case 1: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
})); | ||
function findOpenOrdersAccountsForOwner(_x7, _x8) { | ||
return _findOpenOrdersAccountsForOwner.apply(this, arguments); | ||
} | ||
return findOpenOrdersAccountsForOwner; | ||
}() | ||
}, { | ||
key: "placeOrder", | ||
value: function () { | ||
var _placeOrder = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(connection, _ref) { | ||
var owner, payer, side, price, size, _ref$orderType, orderType, _yield$this$makePlace, transaction, signers; | ||
return _regenerator.default.wrap(function _callee6$(_context6) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
case 0: | ||
owner = _ref.owner, payer = _ref.payer, side = _ref.side, price = _ref.price, size = _ref.size, _ref$orderType = _ref.orderType, orderType = _ref$orderType === void 0 ? 'limit' : _ref$orderType; | ||
_context6.next = 3; | ||
return this.makePlaceOrderTransaction(connection, { | ||
owner: owner, | ||
payer: payer, | ||
side: side, | ||
price: price, | ||
size: size, | ||
orderType: orderType | ||
}); | ||
case 3: | ||
_yield$this$makePlace = _context6.sent; | ||
transaction = _yield$this$makePlace.transaction; | ||
signers = _yield$this$makePlace.signers; | ||
_context6.next = 8; | ||
return connection.sendTransaction(transaction, signers); | ||
case 8: | ||
return _context6.abrupt("return", _context6.sent); | ||
case 9: | ||
case "end": | ||
return _context6.stop(); | ||
} | ||
} | ||
}, _callee6, this); | ||
})); | ||
function placeOrder(_x9, _x10) { | ||
return _placeOrder.apply(this, arguments); | ||
@@ -165,8 +269,87 @@ } | ||
}, { | ||
key: "makePlaceOrderTransaction", | ||
value: function () { | ||
var _makePlaceOrderTransaction = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(connection, _ref2) { | ||
var _owner$publicKey; | ||
var owner, payer, side, price, size, _ref2$orderType, orderType, ownerAddress, openOrdersAccounts, transaction, signers, openOrdersAddress, newOpenOrdersAccount; | ||
return _regenerator.default.wrap(function _callee7$(_context7) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
case 0: | ||
owner = _ref2.owner, payer = _ref2.payer, side = _ref2.side, price = _ref2.price, size = _ref2.size, _ref2$orderType = _ref2.orderType, orderType = _ref2$orderType === void 0 ? 'limit' : _ref2$orderType; | ||
ownerAddress = (_owner$publicKey = owner.publicKey) !== null && _owner$publicKey !== void 0 ? _owner$publicKey : owner; | ||
_context7.next = 4; | ||
return this.findOpenOrdersAccountsForOwner(connection, ownerAddress); | ||
case 4: | ||
openOrdersAccounts = _context7.sent; | ||
// TODO: cache this | ||
transaction = new _web.Transaction(); | ||
signers = [owner]; | ||
if (!(openOrdersAccounts.length === 0)) { | ||
_context7.next = 18; | ||
break; | ||
} | ||
newOpenOrdersAccount = new _web.Account(); | ||
_context7.t0 = transaction; | ||
_context7.next = 12; | ||
return OpenOrders.makeCreateAccountTransaction(connection, this.address, ownerAddress, newOpenOrdersAccount.publicKey); | ||
case 12: | ||
_context7.t1 = _context7.sent; | ||
_context7.t0.add.call(_context7.t0, _context7.t1); | ||
openOrdersAddress = newOpenOrdersAccount.publicKey; | ||
signers.push(newOpenOrdersAccount); | ||
_context7.next = 19; | ||
break; | ||
case 18: | ||
openOrdersAddress = openOrdersAccounts[0].address; | ||
case 19: | ||
transaction.add(_instructions.DexInstructions.newOrder({ | ||
market: this.address, | ||
requestQueue: this._decoded.requestQueue, | ||
baseVault: this._decoded.baseVault, | ||
quoteVault: this._decoded.quoteVault, | ||
openOrders: openOrdersAddress, | ||
owner: ownerAddress, | ||
payer: payer, | ||
side: side, | ||
limitPrice: this.priceNumberToLots(price), | ||
maxQuantity: this.baseSizeNumberToLots(size), | ||
orderType: orderType | ||
})); | ||
return _context7.abrupt("return", { | ||
transaction: transaction, | ||
signers: signers | ||
}); | ||
case 21: | ||
case "end": | ||
return _context7.stop(); | ||
} | ||
} | ||
}, _callee7, this); | ||
})); | ||
function makePlaceOrderTransaction(_x11, _x12) { | ||
return _makePlaceOrderTransaction.apply(this, arguments); | ||
} | ||
return makePlaceOrderTransaction; | ||
}() | ||
}, { | ||
key: "cancelOrder", | ||
value: function () { | ||
var _cancelOrder = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(connection, order) { | ||
return _regenerator.default.wrap(function _callee4$(_context4) { | ||
var _cancelOrder = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(connection, order) { | ||
return _regenerator.default.wrap(function _callee8$(_context8) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
switch (_context8.prev = _context8.next) { | ||
case 0: | ||
@@ -177,9 +360,9 @@ throw new Error('not yet implemented'); | ||
case "end": | ||
return _context4.stop(); | ||
return _context8.stop(); | ||
} | ||
} | ||
}, _callee4); | ||
}, _callee8); | ||
})); | ||
function cancelOrder(_x5, _x6) { | ||
function cancelOrder(_x13, _x14) { | ||
return _cancelOrder.apply(this, arguments); | ||
@@ -191,36 +374,70 @@ } | ||
}, { | ||
key: "priceBnToNumber", | ||
value: function priceBnToNumber(price) { | ||
key: "priceLotsToNumber", | ||
value: function priceLotsToNumber(price) { | ||
return divideBnToNumber(price.mul(this._decoded.quoteLotSize).mul(new _bn.default(10).pow(this._baseMintDecimals)), this._decoded.baseLotSize.mul(new _bn.default(10).pow(this._quoteMintDecimals))); | ||
} | ||
}, { | ||
key: "baseSizeBnToNumber", | ||
value: function baseSizeBnToNumber(size) { | ||
key: "priceNumberToLots", | ||
value: function priceNumberToLots(price) { | ||
return new _bn.default(Math.round(price * Math.pow(10, this._quoteMintDecimals) * this._decoded.baseLotSize.toNumber() / (Math.pow(10, this._baseMintDecimals) * this._decoded.quoteLotSize.toNumber()))); | ||
} | ||
}, { | ||
key: "baseSizeLotsToNumber", | ||
value: function baseSizeLotsToNumber(size) { | ||
return divideBnToNumber(size.mul(this._decoded.baseLotSize), new _bn.default(10).pow(this._baseMintDecimals)); | ||
} | ||
}, { | ||
key: "quoteSizeBnToNumber", | ||
value: function quoteSizeBnToNumber(size) { | ||
key: "baseSizeNumberToLots", | ||
value: function baseSizeNumberToLots(size) { | ||
var native = new _bn.default(Math.round(size * Math.pow(10, this._baseMintDecimals))); // rounds down to the nearest lot size | ||
return native.div(this._decoded.baseLotSize); | ||
} | ||
}, { | ||
key: "quoteSizeLotsToNumber", | ||
value: function quoteSizeLotsToNumber(size) { | ||
return divideBnToNumber(size.mul(this._decoded.quoteLotSize), new _bn.default(10).pow(this._quoteMintDecimals)); | ||
} | ||
}], [{ | ||
key: "decode", | ||
value: function decode(buffer) { | ||
return MARKET_STATE_LAYOUT.decode(buffer); | ||
}, { | ||
key: "quoteSizeNumberToLots", | ||
value: function quoteSizeNumberToLots(size) { | ||
var native = new _bn.default(Math.round(size * Math.pow(10, this._quoteMintDecimals))); // rounds down to the nearest lot size | ||
return native.div(this._decoded.quoteLotSize); | ||
} | ||
}, { | ||
key: "address", | ||
get: function get() { | ||
return this._decoded.ownAddress; | ||
} | ||
}, { | ||
key: "publicKey", | ||
get: function get() { | ||
return this.address; | ||
} | ||
}, { | ||
key: "baseMintAddress", | ||
get: function get() { | ||
return this._decoded.baseMint; | ||
} | ||
}, { | ||
key: "quoteMintAddress", | ||
get: function get() { | ||
return this._decoded.quoteMint; | ||
} | ||
}], [{ | ||
key: "load", | ||
value: function () { | ||
var _load = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(connection, address) { | ||
var _yield$connection$get3, owner, data, decoded, _Promise$all, _Promise$all2, baseMintDecimals, quoteMintDecimals; | ||
var _load = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(connection, address) { | ||
var _yield$connection$get3, owner, data, decoded, _yield$Promise$all, _yield$Promise$all2, baseMintDecimals, quoteMintDecimals; | ||
return _regenerator.default.wrap(function _callee5$(_context5) { | ||
return _regenerator.default.wrap(function _callee9$(_context9) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
switch (_context9.prev = _context9.next) { | ||
case 0: | ||
_context5.next = 2; | ||
_context9.next = 2; | ||
return connection.getAccountInfo(address); | ||
case 2: | ||
_yield$connection$get3 = _context5.sent; | ||
_yield$connection$get3 = _context9.sent; | ||
owner = _yield$connection$get3.owner; | ||
@@ -230,3 +447,3 @@ data = _yield$connection$get3.data; | ||
if (owner.equals(_instructions.DEX_PROGRAM_ID)) { | ||
_context5.next = 7; | ||
_context9.next = 7; | ||
break; | ||
@@ -239,14 +456,30 @@ } | ||
decoded = MARKET_STATE_LAYOUT.decode(data); | ||
_Promise$all = Promise.all([getMintDecimals(decoded.baseMint), getMintDecimals(decoded.quoteMint)]), _Promise$all2 = (0, _slicedToArray2.default)(_Promise$all, 2), baseMintDecimals = _Promise$all2[0], quoteMintDecimals = _Promise$all2[1]; | ||
return _context5.abrupt("return", new Market(decoded, baseMintDecimals, quoteMintDecimals)); | ||
if (!(!decoded.accountFlags.initialized || !decoded.accountFlags.market || !decoded.ownAddress.equals(address))) { | ||
_context9.next = 10; | ||
break; | ||
} | ||
throw new Error('Invalid market'); | ||
case 10: | ||
_context9.next = 12; | ||
return Promise.all([getMintDecimals(connection, decoded.baseMint), getMintDecimals(connection, decoded.quoteMint)]); | ||
case 12: | ||
_yield$Promise$all = _context9.sent; | ||
_yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 2); | ||
baseMintDecimals = _yield$Promise$all2[0]; | ||
quoteMintDecimals = _yield$Promise$all2[1]; | ||
return _context9.abrupt("return", new Market(decoded, baseMintDecimals, quoteMintDecimals)); | ||
case 17: | ||
case "end": | ||
return _context5.stop(); | ||
return _context9.stop(); | ||
} | ||
} | ||
}, _callee5); | ||
}, _callee9); | ||
})); | ||
function load(_x7, _x8) { | ||
function load(_x15, _x16) { | ||
return _load.apply(this, arguments); | ||
@@ -257,2 +490,7 @@ } | ||
}() | ||
}, { | ||
key: "LAYOUT", | ||
get: function get() { | ||
return MARKET_STATE_LAYOUT; | ||
} | ||
}]); | ||
@@ -267,6 +505,168 @@ return Market; | ||
var OpenOrders = function OpenOrders() { | ||
(0, _classCallCheck2.default)(this, OpenOrders); | ||
}; | ||
var OpenOrders = /*#__PURE__*/function () { | ||
function OpenOrders(address, decoded) { | ||
(0, _classCallCheck2.default)(this, OpenOrders); | ||
this.address = address; | ||
Object.assign(this, decoded); | ||
} | ||
(0, _createClass2.default)(OpenOrders, [{ | ||
key: "publicKey", | ||
get: function get() { | ||
return this.address; | ||
} | ||
}], [{ | ||
key: "findForMarketAndOwner", | ||
value: function () { | ||
var _findForMarketAndOwner = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(connection, marketAddress, ownerAddress) { | ||
var filters, accounts; | ||
return _regenerator.default.wrap(function _callee10$(_context10) { | ||
while (1) { | ||
switch (_context10.prev = _context10.next) { | ||
case 0: | ||
filters = [{ | ||
memcmp: { | ||
offset: OPEN_ORDERS_LAYOUT.offsetOf('market'), | ||
bytes: marketAddress.toBase58() | ||
} | ||
}, { | ||
memcmp: { | ||
offset: OPEN_ORDERS_LAYOUT.offsetOf('owner'), | ||
bytes: ownerAddress.toBase58() | ||
} | ||
}, { | ||
dataSize: OPEN_ORDERS_LAYOUT.span | ||
}]; | ||
_context10.next = 3; | ||
return getFilteredProgramAccounts(connection, _instructions.DEX_PROGRAM_ID, filters); | ||
case 3: | ||
accounts = _context10.sent; | ||
return _context10.abrupt("return", accounts.map(function (_ref3) { | ||
var publicKey = _ref3.publicKey, | ||
accountInfo = _ref3.accountInfo; | ||
return OpenOrders.fromAccountInfo(publicKey, accountInfo); | ||
})); | ||
case 5: | ||
case "end": | ||
return _context10.stop(); | ||
} | ||
} | ||
}, _callee10); | ||
})); | ||
function findForMarketAndOwner(_x17, _x18, _x19) { | ||
return _findForMarketAndOwner.apply(this, arguments); | ||
} | ||
return findForMarketAndOwner; | ||
}() | ||
}, { | ||
key: "load", | ||
value: function () { | ||
var _load2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(connection, address) { | ||
var accountInfo; | ||
return _regenerator.default.wrap(function _callee11$(_context11) { | ||
while (1) { | ||
switch (_context11.prev = _context11.next) { | ||
case 0: | ||
_context11.next = 2; | ||
return connection.getAccountInfo(address); | ||
case 2: | ||
accountInfo = _context11.sent; | ||
if (!(accountInfo === null)) { | ||
_context11.next = 5; | ||
break; | ||
} | ||
throw new Error('Open orders account not found'); | ||
case 5: | ||
return _context11.abrupt("return", OpenOrders.fromAccountInfo(connection, accountInfo)); | ||
case 6: | ||
case "end": | ||
return _context11.stop(); | ||
} | ||
} | ||
}, _callee11); | ||
})); | ||
function load(_x20, _x21) { | ||
return _load2.apply(this, arguments); | ||
} | ||
return load; | ||
}() | ||
}, { | ||
key: "fromAccountInfo", | ||
value: function fromAccountInfo(address, accountInfo) { | ||
var owner = accountInfo.owner, | ||
data = accountInfo.data; | ||
if (!owner.equals(_instructions.DEX_PROGRAM_ID)) { | ||
throw new Error('Address not owned by program'); | ||
} | ||
var decoded = OPEN_ORDERS_LAYOUT.decode(data); | ||
if (!decoded.accountFlags.initialized || !decoded.accountFlags.openOrders) { | ||
throw new Error('Invalid open orders account'); | ||
} | ||
return new OpenOrders(address, decoded); | ||
} | ||
}, { | ||
key: "makeCreateAccountTransaction", | ||
value: function () { | ||
var _makeCreateAccountTransaction = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(connection, marketAddress, ownerAddress, newAccountAddress) { | ||
return _regenerator.default.wrap(function _callee12$(_context12) { | ||
while (1) { | ||
switch (_context12.prev = _context12.next) { | ||
case 0: | ||
_context12.t0 = _web.SystemProgram; | ||
_context12.t1 = ownerAddress; | ||
_context12.t2 = newAccountAddress; | ||
_context12.next = 5; | ||
return connection.getMinimumBalanceForRentExemption(OPEN_ORDERS_LAYOUT.span); | ||
case 5: | ||
_context12.t3 = _context12.sent; | ||
_context12.t4 = OPEN_ORDERS_LAYOUT.span; | ||
_context12.t5 = _instructions.DEX_PROGRAM_ID; | ||
_context12.t6 = { | ||
fromPubkey: _context12.t1, | ||
newAccountPubkey: _context12.t2, | ||
lamports: _context12.t3, | ||
space: _context12.t4, | ||
programId: _context12.t5 | ||
}; | ||
return _context12.abrupt("return", _context12.t0.createAccount.call(_context12.t0, _context12.t6)); | ||
case 10: | ||
case "end": | ||
return _context12.stop(); | ||
} | ||
} | ||
}, _callee12); | ||
})); | ||
function makeCreateAccountTransaction(_x22, _x23, _x24, _x25) { | ||
return _makeCreateAccountTransaction.apply(this, arguments); | ||
} | ||
return makeCreateAccountTransaction; | ||
}() | ||
}, { | ||
key: "LAYOUT", | ||
get: function get() { | ||
return OPEN_ORDERS_LAYOUT; | ||
} | ||
}]); | ||
return OpenOrders; | ||
}(); | ||
exports.OpenOrders = OpenOrders; | ||
@@ -321,8 +721,8 @@ var ORDERBOOK_LAYOUT = (0, _bufferLayout.struct)([accountFlags('accountFlags'), _slab.SLAB_LAYOUT.replicate('slab')]); | ||
return levels.map(function (_ref2) { | ||
var _ref3 = (0, _slicedToArray2.default)(_ref2, 2), | ||
price = _ref3[0], | ||
size = _ref3[1]; | ||
return levels.map(function (_ref4) { | ||
var _ref5 = (0, _slicedToArray2.default)(_ref4, 2), | ||
priceLots = _ref5[0], | ||
sizeLots = _ref5[1]; | ||
return [_this.market.priceBnToNumber(price), _this.market.baseSizeBnToNumber(size.mul(_this.market.baseLotSize))]; | ||
return [_this.market.priceLotsToNumber(priceLots), _this.market.baseSizeLotsToNumber(sizeLots.mul(_this.market.baseLotSize)), priceLots, sizeLots]; | ||
}); | ||
@@ -335,8 +735,8 @@ } | ||
return _regenerator.default.wrap(function value$(_context6) { | ||
return _regenerator.default.wrap(function value$(_context13) { | ||
while (1) { | ||
switch (_context6.prev = _context6.next) { | ||
switch (_context13.prev = _context13.next) { | ||
case 0: | ||
_iterator2 = _createForOfIteratorHelper(this.slab); | ||
_context6.prev = 1; | ||
_context13.prev = 1; | ||
@@ -347,3 +747,3 @@ _iterator2.s(); | ||
if ((_step2 = _iterator2.n()).done) { | ||
_context6.next = 10; | ||
_context13.next = 10; | ||
break; | ||
@@ -354,3 +754,3 @@ } | ||
price = getPriceFromKey(key); | ||
_context6.next = 8; | ||
_context13.next = 8; | ||
return { | ||
@@ -360,4 +760,6 @@ orderId: key, | ||
owner: owner, | ||
price: this.market.priceBnToNumber(price), | ||
quantity: this.market.baseSizeBnToNumber(quantity), | ||
price: this.market.priceLotsToNumber(price), | ||
priceLots: price, | ||
size: this.market.baseSizeLotsToNumber(quantity), | ||
sizeLots: quantity, | ||
side: this.isBids ? 'buy' : 'sell' | ||
@@ -367,25 +769,25 @@ }; | ||
case 8: | ||
_context6.next = 3; | ||
_context13.next = 3; | ||
break; | ||
case 10: | ||
_context6.next = 15; | ||
_context13.next = 15; | ||
break; | ||
case 12: | ||
_context6.prev = 12; | ||
_context6.t0 = _context6["catch"](1); | ||
_context13.prev = 12; | ||
_context13.t0 = _context13["catch"](1); | ||
_iterator2.e(_context6.t0); | ||
_iterator2.e(_context13.t0); | ||
case 15: | ||
_context6.prev = 15; | ||
_context13.prev = 15; | ||
_iterator2.f(); | ||
return _context6.finish(15); | ||
return _context13.finish(15); | ||
case 18: | ||
case "end": | ||
return _context6.stop(); | ||
return _context13.stop(); | ||
} | ||
@@ -423,3 +825,3 @@ } | ||
function getMintDecimals(_x9, _x10) { | ||
function getMintDecimals(_x26, _x27) { | ||
return _getMintDecimals.apply(this, arguments); | ||
@@ -429,26 +831,83 @@ } | ||
function _getMintDecimals() { | ||
_getMintDecimals = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(connection, mint) { | ||
_getMintDecimals = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(connection, mint) { | ||
var _yield$connection$get4, data, _MINT_LAYOUT$decode, decimals; | ||
return _regenerator.default.wrap(function _callee6$(_context7) { | ||
return _regenerator.default.wrap(function _callee13$(_context14) { | ||
while (1) { | ||
switch (_context7.prev = _context7.next) { | ||
switch (_context14.prev = _context14.next) { | ||
case 0: | ||
_context7.next = 2; | ||
_context14.next = 2; | ||
return connection.getAccountInfo(mint); | ||
case 2: | ||
_yield$connection$get4 = _context7.sent; | ||
_yield$connection$get4 = _context14.sent; | ||
data = _yield$connection$get4.data; | ||
_MINT_LAYOUT$decode = MINT_LAYOUT.decode(data), decimals = _MINT_LAYOUT$decode.decimals; | ||
return _context7.abrupt("return", decimals); | ||
return _context14.abrupt("return", decimals); | ||
case 6: | ||
case "end": | ||
return _context7.stop(); | ||
return _context14.stop(); | ||
} | ||
} | ||
}, _callee6); | ||
}, _callee13); | ||
})); | ||
return _getMintDecimals.apply(this, arguments); | ||
} | ||
function getFilteredProgramAccounts(_x28, _x29, _x30) { | ||
return _getFilteredProgramAccounts.apply(this, arguments); | ||
} | ||
function _getFilteredProgramAccounts() { | ||
_getFilteredProgramAccounts = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(connection, programId, filters) { | ||
var resp; | ||
return _regenerator.default.wrap(function _callee14$(_context15) { | ||
while (1) { | ||
switch (_context15.prev = _context15.next) { | ||
case 0: | ||
_context15.next = 2; | ||
return connection._rpcRequest('getProgramAccounts', [programId.toBase58(), { | ||
commitment: connection.commitment, | ||
filters: filters, | ||
encoding: 'binary64' | ||
}]); | ||
case 2: | ||
resp = _context15.sent; | ||
if (!resp.error) { | ||
_context15.next = 5; | ||
break; | ||
} | ||
throw new Error(resp.error.message); | ||
case 5: | ||
return _context15.abrupt("return", resp.result.map(function (_ref6) { | ||
var pubkey = _ref6.pubkey, | ||
_ref6$account = _ref6.account, | ||
data = _ref6$account.data, | ||
executable = _ref6$account.executable, | ||
owner = _ref6$account.owner, | ||
lamports = _ref6$account.lamports; | ||
return { | ||
publicKey: new _web.PublicKey(pubkey), | ||
accountInfo: { | ||
data: Buffer.from(data, 'base64'), | ||
executable: executable, | ||
owner: new _web.PublicKey(owner), | ||
lamports: lamports | ||
} | ||
}; | ||
})); | ||
case 6: | ||
case "end": | ||
return _context15.stop(); | ||
} | ||
} | ||
}, _callee14); | ||
})); | ||
return _getFilteredProgramAccounts.apply(this, arguments); | ||
} |
{ | ||
"name": "@project-serum/serum", | ||
"version": "0.1.1", | ||
"version": "0.2.0", | ||
"description": "Library for interacting with the serum dex", | ||
@@ -13,5 +13,5 @@ "license": "MIT", | ||
"scripts": { | ||
"build": "yarn babel src --out-dir lib", | ||
"build": "babel src --out-dir lib", | ||
"start": "babel src --out-dir lib --watch", | ||
"clean": "rm -rf lib", | ||
"start": "yarn babel src --out-dir lib --watch", | ||
"prepare": "run-s clean build", | ||
@@ -61,3 +61,3 @@ "test": "run-s test:unit test:lint test:build", | ||
"dependencies": { | ||
"@solana/web3.js": "^0.66.3", | ||
"@solana/web3.js": "^0.68", | ||
"bn.js": "^5.1.2", | ||
@@ -64,0 +64,0 @@ "buffer-layout": "^1.2.0" |
@@ -1,2 +0,2 @@ | ||
![npm (scoped)](https://img.shields.io/npm/v/@project-serum/serum) | ||
[![npm (scoped)](https://img.shields.io/npm/v/@project-serum/serum)](https://www.npmjs.com/package/@project-serum/serum) | ||
[![Build Status](https://travis-ci.com/project-serum/serum-js.svg?token=1ySaVeP6gHs8QRr2VTEi&branch=master)](https://travis-ci.com/project-serum/serum-js) | ||
@@ -27,3 +27,3 @@ | ||
order.price, | ||
order.quantity, | ||
order.size, | ||
order.side, | ||
@@ -30,0 +30,0 @@ ); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
66915
8
1618
+ Added@solana/web3.js@0.68.0(transitive)
- Removed@solana/web3.js@0.66.4(transitive)
Updated@solana/web3.js@^0.68