From 3e0f43e44eee05e47a3f93cee6c0263263a1510c Mon Sep 17 00:00:00 2001 From: Chris Clark Date: Thu, 25 Jun 2015 16:34:03 -0700 Subject: [PATCH] Convert getOrderBook and add unit test --- src/api/index.js | 4 +- src/api/ledger/balances.js | 2 +- src/api/ledger/orderbook.js | 201 +--- src/api/ledger/orders.js | 6 +- src/api/ledger/parse/account-order.js | 25 +- src/api/ledger/parse/order-base.js | 27 - src/api/ledger/parse/order.js | 21 +- src/api/ledger/parse/orderbook-order.js | 40 + src/api/ledger/pathfind.js | 2 +- src/api/ledger/settings.js | 2 +- src/api/ledger/trustlines.js | 2 +- src/core/remote.js | 4 +- test/api-test.js | 16 + test/fixtures/book-offers-response.js | 1183 +++++++++++++++++++++ test/fixtures/get-orderbook-response.json | 370 +++++++ test/fixtures/get-orders-response.json | 47 +- test/mock-rippled.js | 13 + 17 files changed, 1736 insertions(+), 229 deletions(-) delete mode 100644 src/api/ledger/parse/order-base.js create mode 100644 src/api/ledger/parse/orderbook-order.js create mode 100644 test/fixtures/book-offers-response.js create mode 100644 test/fixtures/get-orderbook-response.json diff --git a/src/api/index.js b/src/api/index.js index ee6b31c1..d38d0f61 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -11,7 +11,7 @@ const getTrustlines = require('./ledger/trustlines'); const getBalances = require('./ledger/balances'); // const getPathFind = require('./ledger/pathfind'); const getOrders = require('./ledger/orders'); -// const getOrderBook = require('./ledger/orderbook'); +const getOrderBook = require('./ledger/orderbook'); const getSettings = require('./ledger/settings'); const preparePayment = require('./transaction/payment'); const prepareTrustline = require('./transaction/trustline'); @@ -39,7 +39,7 @@ RippleAPI.prototype = { getBalances, // getPathFind, getOrders, - // getOrderBook, + getOrderBook, getSettings, preparePayment, diff --git a/src/api/ledger/balances.js b/src/api/ledger/balances.js index a741a40a..980dad5b 100644 --- a/src/api/ledger/balances.js +++ b/src/api/ledger/balances.js @@ -40,4 +40,4 @@ function getBalances(account, options, callback) { ], composeAsync(formatBalances, callback)); } -module.exports = getBalances; +module.exports = utils.wrapCatch(getBalances); diff --git a/src/api/ledger/orderbook.js b/src/api/ledger/orderbook.js index b489cceb..5923cfcb 100644 --- a/src/api/ledger/orderbook.js +++ b/src/api/ledger/orderbook.js @@ -1,171 +1,54 @@ 'use strict'; const _ = require('lodash'); +const async = require('async'); const utils = require('./utils'); -const ripple = utils.common.core; +const parseOrderbookOrder = require('./parse/orderbook-order'); const validate = utils.common.validate; -const bignum = require('bignumber.js'); +const composeAsync = utils.common.composeAsync; + +// account is to specify a "perspective", which affects which unfunded offers +// are returned +function getBookOffers(remote, account, ledgerVersion, limit, + takerGets, takerPays, callback) { + remote.requestBookOffers({ + taker_gets: takerGets, + taker_pays: takerPays, + ledger: ledgerVersion || 'validated', + limit: limit, + taker: account + }, composeAsync((data) => data.offers.map(parseOrderbookOrder), callback)); +} + +function isSameIssue(a, b) { + return a.currency === b.currency && a.counterparty === b.counterparty; +} + +function orderFilter(issue, direction, order) { + return isSameIssue(issue, order.specification.quantity) + && order.specification.direction === direction; +} + +function formatBidsAndAsks(orderbook, orders) { + // the "base" currency is the currency that you are buying or selling + // the "counter" is the currency that the "base" is priced in + // a "bid"/"ask" is an order to buy/sell the base, respectively + const bids = orders.filter(_.partial(orderFilter, orderbook.base, 'buy')); + const asks = orders.filter(_.partial(orderFilter, orderbook.base, 'sell')); + return {bids, asks}; +} -/** - * Get the most recent spapshot of the order book for a currency pair - * - * @url - * @param {RippleAddress} request.params.account - * - The ripple address to use as point-of-view - * (returns unfunded orders for this account) - * @param {String ISO 4217 Currency Code + RippleAddress} request.params.base - * - Base currency as currency+issuer - * @param {String ISO 4217 Currency Code + RippleAddress} - * request.params.counter - Counter currency as currency+issuer - * - * @query - * @param {String} [request.query.limit] - * - Set a limit to the number of results returned - * - * @param {Express.js Request} request - */ function getOrderBook(account, orderbook, options, callback) { - const self = this; validate.address(account); validate.orderbook(orderbook); validate.options(options); - const params = _.assign({}, orderbook, options, { - validated: true, - order_book: orderbook.base + '/' + orderbook.counter - }); - - function getLastValidatedLedger(parameters) { - const promise = new Promise(function(resolve, reject) { - const ledgerRequest = self.remote.requestLedger('validated'); - - ledgerRequest.once('success', function(res) { - parameters.ledger = res.ledger.ledger_index; - resolve(parameters); - }); - - ledgerRequest.once('error', reject); - ledgerRequest.request(); - }); - - return promise; - } - - function getBookOffers(taker_gets, taker_pays, parameters) { - const promise = new Promise(function(resolve, reject) { - const bookOffersRequest = self.remote.requestBookOffers({ - taker_gets: {currency: taker_gets.currency, - issuer: taker_gets.counterparty}, - taker_pays: {currency: taker_pays.currency, - issuer: taker_pays.counterparty}, - ledger: parameters.ledger, - limit: parameters.limit, - taker: account - }); - - bookOffersRequest.once('success', resolve); - bookOffersRequest.once('error', reject); - bookOffersRequest.request(); - }); - - return promise; - } - - function getBids(parameters) { - const taker_gets = parameters.counter; - const taker_pays = parameters.base; - - return getBookOffers(taker_gets, taker_pays, parameters); - } - - function getAsks(parameters) { - const taker_gets = parameters.base; - const taker_pays = parameters.counter; - - return getBookOffers(taker_gets, taker_pays, parameters); - } - - function getBidsAndAsks(parameters) { - return Promise.join( - getBids(parameters), - getAsks(parameters), - function(bids, asks) { - return [bids, asks, parameters]; - } - ); - } - - function getParsedBookOffers(offers, isAsk) { - return offers.reduce(function(orderBook, off) { - let price; - const order_maker = off.Account; - const sequence = off.Sequence; - - // Transaction Flags - const passive = (off.Flags & ripple.Remote.flags.offer.Passive) !== 0; - const sell = (off.Flags & ripple.Remote.flags.offer.Sell) !== 0; - - const taker_gets_total = utils.parseCurrencyAmount(off.TakerGets); - const taker_gets_funded = off.taker_gets_funded ? - utils.parseCurrencyAmount(off.taker_gets_funded) : taker_gets_total; - - const taker_pays_total = utils.parseCurrencyAmount(off.TakerPays); - const taker_pays_funded = off.taker_pays_funded ? - utils.parseCurrencyAmount(off.taker_pays_funded) : taker_pays_total; - - if (isAsk) { - price = { - currency: taker_pays_total.currency, - counterparty: taker_pays_total.counterparty, - value: bignum(taker_pays_total.value).div( - bignum(taker_gets_total.value)) - }; - } else { - price = { - currency: taker_gets_total.currency, - counterparty: taker_gets_total.counterparty, - value: bignum(taker_gets_total.value).div( - bignum(taker_pays_total.value)) - }; - } - - price.value = price.value.toString(); - - orderBook.push({ - price: price, - taker_gets_funded: taker_gets_funded, - taker_gets_total: taker_gets_total, - taker_pays_funded: taker_pays_funded, - taker_pays_total: taker_pays_total, - order_maker: order_maker, - sequence: sequence, - passive: passive, - sell: sell - }); - - return orderBook; - }, []); - } - - function respondWithOrderBook(bids, asks, parameters) { - const promise = new Promise(function(resolve) { - const orderBook = { - order_book: parameters.order_book, - ledger: parameters.ledger, - validated: parameters.validated, - bids: getParsedBookOffers(bids.offers), - asks: getParsedBookOffers(asks.offers, true) - }; - - resolve(callback(null, orderBook)); - }); - - return promise; - } - - getLastValidatedLedger(params) - .then(getBidsAndAsks) - .spread(respondWithOrderBook) - .catch(callback); + const getter = _.partial(getBookOffers, this.remote, account, + options.ledgerVersion, options.limit); + const getOrders = _.partial(getter, orderbook.base, orderbook.counter); + const getReverseOrders = _.partial(getter, orderbook.counter, orderbook.base); + async.parallel([getOrders, getReverseOrders], + composeAsync((data) => formatBidsAndAsks(orderbook, _.flatten(data)), + callback)); } -module.exports = getOrderBook; +module.exports = utils.wrapCatch(getOrderBook); diff --git a/src/api/ledger/orders.js b/src/api/ledger/orders.js index ef540945..19331533 100644 --- a/src/api/ledger/orders.js +++ b/src/api/ledger/orders.js @@ -30,8 +30,8 @@ function getAccountOrders(account, options, callback) { const getter = _.partial(requestAccountOffers, this.remote, account, ledgerVersion, options); utils.getRecursive(getter, limit, - composeAsync((orders) => _.sortBy(orders, (order) => order.state.sequence), - callback)); + composeAsync((orders) => _.sortBy(orders, + (order) => order.properties.sequence), callback)); } -module.exports = getAccountOrders; +module.exports = utils.wrapCatch(getAccountOrders); diff --git a/src/api/ledger/parse/account-order.js b/src/api/ledger/parse/account-order.js index 9de3cd48..b79344e4 100644 --- a/src/api/ledger/parse/account-order.js +++ b/src/api/ledger/parse/account-order.js @@ -1,14 +1,27 @@ 'use strict'; -const parseOrderBase = require('./order-base'); +const utils = require('./utils'); +const flags = utils.core.Remote.flags.offer; +const parseAmount = require('./amount'); // rippled 'account_offers' returns a different format for orders than 'tx' -function parseAccountOrder(order) { - const specification = parseOrderBase( - order.taker_gets, order.taker_pays, order.flags); - const state = { +// the flags are also different +function parseAccountOrder(order: Object): Object { + const direction = (order.flags & flags.Sell) === 0 ? 'buy' : 'sell'; + const takerGetsAmount = parseAmount(order.taker_gets); + const takerPaysAmount = parseAmount(order.taker_pays); + const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount; + const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount; + + const specification = utils.removeUndefined({ + direction: direction, + quantity: quantity, + totalPrice: totalPrice, + passive: ((order.flags & flags.Passive) !== 0) || undefined + }); + const properties = { sequence: order.seq }; - return {specification, state}; + return {specification, properties}; } module.exports = parseAccountOrder; diff --git a/src/api/ledger/parse/order-base.js b/src/api/ledger/parse/order-base.js deleted file mode 100644 index 8bf29f96..00000000 --- a/src/api/ledger/parse/order-base.js +++ /dev/null @@ -1,27 +0,0 @@ -/* @flow */ -'use strict'; -const utils = require('./utils'); -const parseAmount = require('./amount'); -const orderFlags = utils.core.Transaction.flags.OfferCreate; - -/*:: type Amount = string | {currency: string, issuer: string, value: string} */ -function parseOrder(takerGets: Amount, takerPays: Amount, flags: number): - Object { - const direction = (flags & orderFlags.Sell) === 0 ? 'buy' : 'sell'; - const takerGetsAmount = parseAmount(takerGets); - const takerPaysAmount = parseAmount(takerPays); - const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount; - const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount; - - return utils.removeUndefined({ - direction: direction, - quantity: quantity, - totalPrice: totalPrice, - passive: ((flags & orderFlags.Passive) !== 0) || undefined, - immediateOrCancel: ((flags & orderFlags.ImmediateOrCancel) !== 0) - || undefined, - fillOrKill: ((flags & orderFlags.FillOrKill) !== 0) || undefined - }); -} - -module.exports = parseOrder; diff --git a/src/api/ledger/parse/order.js b/src/api/ledger/parse/order.js index 8f9d6590..13060fd7 100644 --- a/src/api/ledger/parse/order.js +++ b/src/api/ledger/parse/order.js @@ -1,11 +1,28 @@ /* @flow */ 'use strict'; const assert = require('assert'); -const parseOrderBase = require('./order-base'); +const utils = require('./utils'); +const parseAmount = require('./amount'); +const flags = utils.core.Transaction.flags.OfferCreate; function parseOrder(tx: Object): Object { assert(tx.TransactionType === 'OfferCreate'); - return parseOrderBase(tx.TakerGets, tx.TakerPays, tx.Flags); + + const direction = (tx.Flags & flags.Sell) === 0 ? 'buy' : 'sell'; + const takerGetsAmount = parseAmount(tx.TakerGets); + const takerPaysAmount = parseAmount(tx.TakerPays); + const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount; + const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount; + + return utils.removeUndefined({ + direction: direction, + quantity: quantity, + totalPrice: totalPrice, + passive: ((tx.Flags & flags.Passive) !== 0) || undefined, + immediateOrCancel: ((tx.Flags & flags.ImmediateOrCancel) !== 0) + || undefined, + fillOrKill: ((tx.Flags & flags.FillOrKill) !== 0) || undefined + }); } module.exports = parseOrder; diff --git a/src/api/ledger/parse/orderbook-order.js b/src/api/ledger/parse/orderbook-order.js new file mode 100644 index 00000000..8754b2e5 --- /dev/null +++ b/src/api/ledger/parse/orderbook-order.js @@ -0,0 +1,40 @@ +'use strict'; +const _ = require('lodash'); +const utils = require('./utils'); +const flags = utils.core.Remote.flags.offer; +const parseAmount = require('./amount'); + +function parseOrderbookOrder(order: Object): Object { + const direction = (order.Flags & flags.Sell) === 0 ? 'buy' : 'sell'; + const takerGetsAmount = parseAmount(order.TakerGets); + const takerPaysAmount = parseAmount(order.TakerPays); + const quantity = (direction === 'buy') ? takerPaysAmount : takerGetsAmount; + const totalPrice = (direction === 'buy') ? takerGetsAmount : takerPaysAmount; + + const specification = utils.removeUndefined({ + direction: direction, + quantity: quantity, + totalPrice: totalPrice, + passive: ((order.Flags & flags.Passive) !== 0) || undefined + }); + // "quality" is omitted intentionally as it corresponds to + // either price or inverse price, and it is better to avoid + // inverting floats where precision issues can arise + const properties = { + maker: order.Account, + sequence: order.Sequence + }; + const takerGetsFunded = order.taker_gets_funded ? + parseAmount(order.taker_gets_funded) : undefined; + const takerPaysFunded = order.taker_pays_funded ? + parseAmount(order.taker_pays_funded) : undefined; + const available = utils.removeUndefined({ + availableQuantity: direction === 'buy' ? takerPaysFunded : takerGetsFunded, + priceOfAvailableQuantity: direction === 'buy' ? + takerGetsFunded : takerPaysFunded + }); + const state = _.isEmpty(available) ? undefined : available; + return utils.removeUndefined({specification, properties, state}); +} + +module.exports = parseOrderbookOrder; diff --git a/src/api/ledger/pathfind.js b/src/api/ledger/pathfind.js index 540ad4aa..85506d7c 100644 --- a/src/api/ledger/pathfind.js +++ b/src/api/ledger/pathfind.js @@ -144,4 +144,4 @@ function getPathFind(pathfind, callback) { async.waterfall(steps, callback); } -module.exports = getPathFind; +module.exports = utils.wrapCatch(getPathFind); diff --git a/src/api/ledger/settings.js b/src/api/ledger/settings.js index 4efc888a..aa6a3b1e 100644 --- a/src/api/ledger/settings.js +++ b/src/api/ledger/settings.js @@ -41,4 +41,4 @@ function getSettings(account, callback) { }); } -module.exports = getSettings; +module.exports = utils.wrapCatch(getSettings); diff --git a/src/api/ledger/trustlines.js b/src/api/ledger/trustlines.js index 97e45956..816b7067 100644 --- a/src/api/ledger/trustlines.js +++ b/src/api/ledger/trustlines.js @@ -45,4 +45,4 @@ function getTrustlines(account: string, options: Options, utils.getRecursive(getter, limit, callback); } -module.exports = getTrustlines; +module.exports = utils.wrapCatch(getTrustlines); diff --git a/src/core/remote.js b/src/core/remote.js index 739ab738..90839eaf 100644 --- a/src/core/remote.js +++ b/src/core/remote.js @@ -1610,7 +1610,7 @@ Remote.prototype.requestBookOffers = function(options_, callback_) { const request = new Request(this, 'book_offers'); request.message.taker_gets = { - currency: Currency.json_rewrite(gets.currency, {force_hex: true}) + currency: Currency.json_rewrite(gets.currency) }; if (!Currency.from_json(request.message.taker_gets.currency).is_native()) { @@ -1618,7 +1618,7 @@ Remote.prototype.requestBookOffers = function(options_, callback_) { } request.message.taker_pays = { - currency: Currency.json_rewrite(pays.currency, {force_hex: true}) + currency: Currency.json_rewrite(pays.currency) }; if (!Currency.from_json(request.message.taker_pays.currency).is_native()) { diff --git a/test/api-test.js b/test/api-test.js index 73dcd696..24541a9e 100644 --- a/test/api-test.js +++ b/test/api-test.js @@ -28,12 +28,14 @@ const trustlinesResponse = require('./fixtures/trustlines-response'); const walletResponse = require('./fixtures/wallet.json'); const getSettingsResponse = require('./fixtures/get-settings-response'); const getOrdersResponse = require('./fixtures/get-orders-response'); +const getOrderBookResponse = require('./fixtures/get-orderbook-response'); function checkResult(expected, done, error, response) { if (error) { done(error); return; } + // console.log(JSON.stringify(response, null, 2)); assert.deepEqual(response, expected); done(); } @@ -137,4 +139,18 @@ describe('RippleAPI', function() { _.partial(checkResult, getOrdersResponse, done)); }); + it('getOrderBook', function(done) { + const orderbook = { + base: { + currency: 'USD', + counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + }, + counter: { + currency: 'BTC', + counterparty: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + } + }; + this.api.getOrderBook(address, orderbook, {}, + _.partial(checkResult, getOrderBookResponse, done)); + }); }); diff --git a/test/fixtures/book-offers-response.js b/test/fixtures/book-offers-response.js new file mode 100644 index 00000000..5f614bb6 --- /dev/null +++ b/test/fixtures/book-offers-response.js @@ -0,0 +1,1183 @@ +/* eslint-disable max-len */ +'use strict'; +const _ = require('lodash'); + +module.exports.requestBookOffersBidsResponse = function(request, options={}) { + _.defaults(options, { + gets: { + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + }, + pays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + } + }); + + return JSON.stringify({ + id: request.id, + result: { + ledger_index: 10716345, + offers: [ + { + Account: 'r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B15A60037FFCF', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '544932DC56D72E845AF2B738821FE07865E32EC196270678AB0D947F54E9F49F', + PreviousTxnLgrSeq: 10679000, + Sequence: 434, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '3205.1' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.gets.issuer, + value: '10' + }, + index: 'CE457115A4ADCC8CB351B3E35A0851E48DE16605C23E305017A9B697B156DE5A', + owner_funds: '41952.95917199965', + quality: '0.003120027456241615' + }, + { + Account: 'rDYCRhpahKEhCFV25xScg67Bwf4W9sTYAm', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B1A2BC2EC5000', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'F68F9658AB3D462FEB027E6C380F054BC6D2514B43EC3C6AD46EE19C59BF1CC3', + PreviousTxnLgrSeq: 10704238, + Sequence: 233, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '1599.063669386278' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '4.99707396683212' + }, + index: 'BF14FBB305159DBCAEA91B7E848408F5B559A91B160EBCB6D244958A6A16EA6B', + owner_funds: '3169.910902910102', + quality: '0.003125' + }, + { + Account: 'raudnGKfTK23YKfnS7ixejHrqGERTYNFXk', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B2BF1C2F4D4C9', + BookNode: '0000000000000000', + Expiration: 472785284, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000008F0', + PreviousTxnID: '446410E1CD718AC01929DD16B558FCF6B3A7B8BF208C420E67A280C089C5C59B', + PreviousTxnLgrSeq: 10713576, + Sequence: 110104, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '143.1050962074379' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0.4499999999999999' + }, + index: '67924B0EAA15784CC00CCD5FDD655EE2D6D2AE40341776B5F14E52341E7FC73E', + owner_funds: '0', + quality: '0.003144542101755081', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0' + } + }, + { + Account: 'rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B2CD7A2BFBB75', + BookNode: '0000000000000000', + Expiration: 472772651, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000003CD', + PreviousTxnID: 'D49164AB68DDA3AEC9DFCC69A35685C4F532B5C231D3C1D25FEA7D5D0224FB84', + PreviousTxnLgrSeq: 10711128, + Sequence: 35625, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '254.329207354604' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0.8' + }, + index: '567BF2825173E3FB28FC94E436B6EB30D9A415FC2335E6D25CDE1BE47B25D120', + owner_funds: '0', + quality: '0.003145529403882357', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0' + } + }, + { + Account: 'rwBYyfufTzk77zUSKEu4MvixfarC35av1J', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B3621DF140FDA', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000008', + PreviousTxnID: '2E371E2B287C8A9FBB3424E4204B17AD9FA1BAA9F3B33C7D2261E3B038AFF083', + PreviousTxnLgrSeq: 10716291, + Sequence: 387756, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '390.4979' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '1.23231134568807' + }, + index: '8CA23E55BF9F46AC7E803D3DB40FD03225EFCA66650D4CF0CBDD28A7CCDC8400', + owner_funds: '5704.824764087842', + quality: '0.003155743848271834' + }, + { + Account: 'rwjsRktX1eguUr1pHTffyHnC4uyrvX58V1', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B3A4D41FF4211', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '91763FA7089C63CC4D5D14CBA6A5A5BF7ECE949B0D34F00FD35E733AF9F05AF1', + PreviousTxnLgrSeq: 10716292, + Sequence: 208927, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '1' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0.003160328237957649' + }, + index: '7206866E39D9843623EE79E570242753DEE3C597F3856AEFB4631DD5AD8B0557', + owner_funds: '45.55665106096075', + quality: '0.003160328237957649' + }, + { + Account: 'r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B4748E68669A7', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '3B3CF6FF1A336335E78513CF77AFD3A784ACDD7B1B4D3F1F16E22957A060BFAE', + PreviousTxnLgrSeq: 10639969, + Sequence: 429, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '4725' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '15' + }, + index: '42894809370C7E6B23498EF8E22AD4B05F02B94F08E6983357A51EA96A95FF7F', + quality: '0.003174603174603175' + }, + { + Account: 'rDbsCJr5m8gHDCNEHCZtFxcXHsD4S9jH83', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B58077ED03C1B', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000001', + PreviousTxnID: '98F3F2D02D3BB0AEAC09EECCF2F24BBE5E1AB2C71C40D7BD0A5199E12541B6E2', + PreviousTxnLgrSeq: 10715839, + Sequence: 110099, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '1.24252537879871' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.gets.issuer, + value: '0.003967400879423823' + }, + index: 'F4404D6547149419D3607F81D7080979FBB3AFE2661F9A933E2F6C07AC1D1F6D', + owner_funds: '73.52163803897041', + quality: '0.003193013959408667' + }, + { + Account: 'rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B72A555B981A3', + BookNode: '0000000000000000', + Expiration: 472772652, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000003CD', + PreviousTxnID: '146C8DBB047BAAFAE5B8C8DECCCDACD9DFCD7A464E5AB273230FF975E9B83CF7', + PreviousTxnLgrSeq: 10711128, + Sequence: 35627, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '496.5429474010489' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '1.6' + }, + index: '50CAA04E81D0009115B61C132FC9887FA9E5336E0CB8A2E7D3280ADBF6ABC043', + quality: '0.003222279177208227', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0' + } + }, + { + Account: 'r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B730474DD96E5', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '624F9ADA85EC3BE845EAC075B47E01E4F89288EAF27823C715777B3DFFB21F24', + PreviousTxnLgrSeq: 10639989, + Sequence: 431, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '3103' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '10' + }, + index: '8A319A496288228AD9CAD74375E32FA81805C56A9AD84798A26756A8B3F9EE23', + quality: '0.003222687721559781' + } + ], + validated: false + }, + status: 'success', + type: 'response' + }); +}; + +module.exports.requestBookOffersBidsPartialFundedResponse = function(request, options) { + options = options || {}; + + _.defaults(options, { + gets: { + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + }, + pays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + } + }); + + return JSON.stringify({ + id: request.id, + status: 'success', + type: 'response', + result: { + ledger_current_index: 10714274, + offers: [ + { + Account: 'rpUirQxhaFqMp7YHPLMZCWxgZQbaZkp4bM', + BookDirectory: '20294C923E80A51B487EB9547B3835FD483748B170D2D0A4520B75DA97A99CE7', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '52801D1249261E410632BF6C00F503B1F51B31798C1E7DBD67B976FE65BE4DA4', + PreviousTxnLgrSeq: 10630313, + Sequence: 132, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '310' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '1' + }, + index: '861D15BECDA5DCA1327CF4D8080C181425F043AC969A992C5FAE5D12813785D0', + owner_funds: '259.7268806690133', + quality: '0.003225806451612903', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '259.2084637415302' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '0.8361563346500974' + } + } + ] + } + }); +}; + +module.exports.requestBookOffersAsksPartialFundedResponse = function(request, options={}) { + + _.defaults(options, { + gets: { + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + }, + pays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + } + }); + + return JSON.stringify({ + id: request.id, + status: 'success', + type: 'response', + result: { + ledger_current_index: 10714274, + offers: [ + { + Account: 'rPyYxUGK8L4dgEvjPs3aRc1B1jEiLr3Hx5', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570BCB85BCA78000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'D22993C68C94ACE3F2FCE4A334EBEA98CC46DCA92886C12B5E5B4780B5E17D4E', + PreviousTxnLgrSeq: 10711938, + Sequence: 392, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.8095' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '268.754' + }, + index: '18B136E08EF50F0DEE8521EA22D16A950CD8B6DDF5F6E07C35F7FDDBBB09718D', + owner_funds: '0.8095132334507441', + quality: '332', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.8078974385735969' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '268.2219496064341' + } + } + ] + } + }); +}; + +module.exports.requestBookOffersAsksResponse = function(request, options={}) { + _.defaults(options, { + pays: { + currency: 'BTC', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + }, + gets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B' + } + }); + + + return JSON.stringify({ + id: request.id, + status: 'success', + type: 'response', + result: { + ledger_current_index: 10714274, + offers: [ + { + Account: 'rwBYyfufTzk77zUSKEu4MvixfarC35av1J', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570B9980E49C7DE8', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000008', + PreviousTxnID: '92DBA0BE18B331AC61FB277211477A255D3B5EA9C5FE689171DE689FB45FE18A', + PreviousTxnLgrSeq: 10714030, + Sequence: 386940, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.2849323720855092' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '93.030522464522' + }, + index: '8092033091034D94219BC1131AF7A6B469D790D81831CB479AB6F67A32BE4E13', + owner_funds: '31.77682120227525', + quality: '326.5003614141928' + }, + { + Account: 'rwjsRktX1eguUr1pHTffyHnC4uyrvX58V1', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570BBF1EEFA2FB0A', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'C6BDA152363E3CFE18688A6830B49F3DB2B05976110B5908EA4EB66D93DEEB1F', + PreviousTxnLgrSeq: 10714031, + Sequence: 207855, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.00302447007930511' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '1' + }, + index: '8DB3520FF9CB16A0EA955056C49115F8CFB03A587D0A4AFC844F1D220EFCE0B9', + owner_funds: '0.0670537912615556', + quality: '330.6364334177034' + }, + { + Account: 'raudnGKfTK23YKfnS7ixejHrqGERTYNFXk', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570BC3A506FC016F', + BookNode: '0000000000000000', + Expiration: 472785283, + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000008F0', + PreviousTxnID: '77E763F1D02F58965CD1AD94F557B37A582FAC7760B71F391B856959836C2F7B', + PreviousTxnLgrSeq: 10713576, + Sequence: 110103, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.3' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '99.34014894048333' + }, + index: '9ECDFD31B28643FD3A54658398C5715D6DAD574F83F04529CB24765770F9084D', + owner_funds: '4.021116654525635', + quality: '331.1338298016111' + }, + { + Account: 'rPyYxUGK8L4dgEvjPs3aRc1B1jEiLr3Hx5', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570BCB85BCA78000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'D22993C68C94ACE3F2FCE4A334EBEA98CC46DCA92886C12B5E5B4780B5E17D4E', + PreviousTxnLgrSeq: 10711938, + Sequence: 392, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.8095' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '268.754' + }, + index: '18B136E08EF50F0DEE8521EA22D16A950CD8B6DDF5F6E07C35F7FDDBBB09718D', + owner_funds: '0.8095132334507441', + quality: '332', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.8078974385735969' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '268.2219496064341' + } + }, + { + Account: 'raudnGKfTK23YKfnS7ixejHrqGERTYNFXk', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570C00450D461510', + BookNode: '0000000000000000', + Expiration: 472785284, + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000008F0', + PreviousTxnID: '1F4D9D859D9AABA888C0708A572B38919A3AEF2C8C1F5A13F58F44C92E5FF3FB', + PreviousTxnLgrSeq: 10713576, + Sequence: 110105, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.4499999999999999' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '152.0098333185607' + }, + index: '9F380E0B39E2AF8AA9608C3E39A5A8628E6D0F44385C6D12BE06F4FEC8D83351', + quality: '337.7996295968016' + }, + { + Account: 'rDbsCJr5m8gHDCNEHCZtFxcXHsD4S9jH83', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570C560B764D760C', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000001', + PreviousTxnID: '9A0B6B76F0D86614F965A2FFCC8859D8607F4E424351D4CFE2FBE24510F93F25', + PreviousTxnLgrSeq: 10708382, + Sequence: 110061, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.003768001830745216' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '1.308365894430151' + }, + index: 'B971769686CE1B9139502770158A4E7C011CFF8E865E5AAE5428E23AAA0E146D', + owner_funds: '0.2229210189326514', + quality: '347.2306949944844' + }, + { + Account: 'rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570C87DF25DC4FC6', + BookNode: '0000000000000000', + Expiration: 472783298, + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000003D2', + PreviousTxnID: 'E5F9A10F29A4BB3634D5A84FC96931E17267B58E0D2D5ADE24FFB751E52ADB9E', + PreviousTxnLgrSeq: 10713533, + Sequence: 35788, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.5' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '176.3546101589987' + }, + index: 'D2CB71038AD0ECAF4B5FF0A953AD1257225D0071E6F3AF9ADE67F05590B45C6E', + owner_funds: '6.617688680663627', + quality: '352.7092203179974' + }, + { + Account: 'rN6jbxx4H6NxcnmkzBxQnbCWLECNKrgSSf', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570CC0B8E0E2C000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '2E16ACFEAC2306E3B3483D445787F3496FACF9504F7A5E909620C1A73E2EDE54', + PreviousTxnLgrSeq: 10558020, + Sequence: 491, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.5' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '179.48' + }, + index: 'DA853913C8013C9471957349EDAEE4DF4846833B8CCB92008E2A8994E37BEF0D', + owner_funds: '0.5', + quality: '358.96', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.499001996007984' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '179.1217564870259' + } + }, + { + Account: 'rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570CD2F24C9C145D', + BookNode: '0000000000000000', + Expiration: 472783299, + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000003D2', + PreviousTxnID: 'B1B12E47043B4260223A2C4240D19E93526B55B1DB38DEED335DACE7C04FEB23', + PreviousTxnLgrSeq: 10713534, + Sequence: 35789, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.8' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '288.7710263794967' + }, + index: 'B89AD580E908F7337CCBB47A0BAAC6417EF13AC3465E34E8B7DD3BED016EA833', + quality: '360.9637829743709' + }, + { + Account: 'rUeCeioKJkbYhv4mRGuAbZpPcqkMCoYq6N', + BookDirectory: '6EAB7C172DEFA430DBFAD120FDC373B5F5AF8B191649EC98570D0069F50EA028', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000012', + PreviousTxnID: 'F0E8ABF07F83DF0B5EF5B417E8E29A45A5503BA8F26FBC86447CC6B1FAD6A1C4', + PreviousTxnLgrSeq: 10447672, + Sequence: 5255, + TakerGets: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.5' + }, + TakerPays: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '182.9814890090516' + }, + index: 'D652DCE4B19C6CB43912651D3A975371D3B2A16A034EDF07BC11BF721AEF94A4', + owner_funds: '0.225891986027944', + quality: '365.9629780181032', + taker_gets_funded: { + currency: options.gets.currency, + issuer: options.gets.issuer, + value: '0.2254411038203033' + }, + taker_pays_funded: { + currency: options.pays.currency, + issuer: options.pays.issuer, + value: '82.50309772176658' + } + } + ], + validated: false + } + }); +}; + +module.exports.requestBookOffersXRPBaseResponse = function(request) { + return JSON.stringify({ + id: request.id, + status: 'success', + type: 'response', + result: { + ledger_index: request.ledger_index, + offers: [ + { + Account: 'rEiUs9rEiGHmpaprkYDNyXnJYg4ANxWLy9', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C10FB4C37E64D39', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000007', + PreviousTxnID: 'C4CF947D0C4CCFC667B60ACA552C9381BD4901800297C1DCBA9E162B56FE3097', + PreviousTxnLgrSeq: 11004060, + Sequence: 32667, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '577.9185501389138' + }, + TakerPays: '27623954214', + index: 'B1330CDE9D818DBAF27DF16B9474880710FBC57F309F2A9B7D6AC9C4EBB0C722', + owner_funds: '577.9127710112036', + quality: '47799044.01296697', + taker_gets_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '576.7592525061912' + }, + taker_pays_funded: '27568540895' + }, + { + Account: 'rEiUs9rEiGHmpaprkYDNyXnJYg4ANxWLy9', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C10FB5758F3ACDC', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000007', + PreviousTxnID: 'BAA6974BC4E267FA53A91A7C820DE5E064FE2329763E42B712F0E0A5F6ABA0C9', + PreviousTxnLgrSeq: 11004026, + Sequence: 32661, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '578.129773249599' + }, + TakerPays: '27634326809', + index: 'D5B3EB16FD23C03716C1ACDE274702D61EFD6807F15284A95C4CDF34375CAF71', + quality: '47799522.00461532', + taker_gets_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0' + }, + taker_pays_funded: '0' + }, + { + Account: 'rsvZ4ucGpMvfSYFQXB4nFaQhxiW5CUy2zx', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C10FB627A06C000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000002', + PreviousTxnID: '6221CBEC5E06E604B5AD32979D4C04CD3EA24404B6E07EC3508E708CC6FC1A9D', + PreviousTxnLgrSeq: 11003996, + Sequence: 549, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '265.0254187774191' + }, + TakerPays: '12668215016', + index: 'A9AC351832B9A17FDA35650B6EE32C0A48F6AC661730E9855CC47498C171860C', + owner_funds: '2676.502797501436', + quality: '47800000' + }, + { + Account: 'rfCFLzNJYvvnoGHWQYACmJpTgkLUaugLEw', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C110D996CF89F0E', + BookNode: '0000000000000000', + Expiration: 474062867, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000000E1', + PreviousTxnID: '80CFB17188F02FF19759CC19E6E543ACF3F7299C11746FCDD8D7D3BBD18FBC5E', + PreviousTxnLgrSeq: 11004047, + Sequence: 2665862, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '193' + }, + TakerPays: '9264052522', + index: '67C79EAA9F4EB638E2FC8F569C29E9E02F79F38BB136B66FD13857EB60432913', + owner_funds: '3962.913768867934', + quality: '48000272.13471502' + }, + { + Account: 'rM3X3QSr8icjTGpaF52dozhbT2BZSXJQYM', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C110F696023CF97', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000005302', + PreviousTxnID: '4DAC7F491E106C4BF2292C387144AB08D758B3DE04A1698BBD97468C893A375B', + PreviousTxnLgrSeq: 11003934, + Sequence: 1425976, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '161.8304886' + }, + TakerPays: '7771132207', + index: 'A9696EDF0D7AC89ACBAF62E3CEDCD14DE82B441046CC748FE92A1DEB90D40A4A', + owner_funds: '2673.609970934654', + quality: '48020198.63023511' + }, + { + Account: 'r4rCiFc9jpMeCpKioVJUMbT1hU4kj3XiSt', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C11107D2C579CB9', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '9559B82392D110D543FA47670A0619A423078FABD8DBD69B6620B83CBC851BE2', + PreviousTxnLgrSeq: 11003872, + Sequence: 44405, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '605.341293717861' + }, + TakerPays: '29075779685', + index: 'F38F7F427823927F3870AB66E9C01529DDA7567CE62F9687992729B8F14E7937', + owner_funds: '637.5308256246498', + quality: '48032044.04976825' + }, + { + Account: 'rNEib8Z73zSTYTi1WqzU4b1BQMXxnpYg1s', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C11108A8F4D49EA', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000001', + PreviousTxnID: '1C41470EFDF9D83252C6EA702B7B8D8824A560D63B75880D652B1898D8519B98', + PreviousTxnLgrSeq: 11004058, + Sequence: 781823, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '166.647580164238' + }, + TakerPays: '8004519725', + index: '042EDAF04F4C0709831439DEC15384CA9C5C9926B63FB87D1352BD5FEDD2FC68', + owner_funds: '166.6476801642377', + quality: '48032618.99819498', + taker_gets_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '166.3150500641094' + }, + taker_pays_funded: '7988547433' + }, + { + Account: 'rPCFVxAqP2XdaPmih1ZSjmCPNxoyMiy2ne', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C11108A97DE552A', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000001', + PreviousTxnID: '053C4A7116D258C2D83128B0552ADA2FCD3C50058953495B382114DED5D03CD1', + PreviousTxnLgrSeq: 11003869, + Sequence: 50020, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '792.5367174829754' + }, + TakerPays: '38067615332', + index: 'EFF326D799C5D722F4367250DC3C9E3DADB300D4E96D634A58E1F4B534F754C7', + owner_funds: '816.6776190772376', + quality: '48032620.43542826' + }, + { + Account: 'rEiUs9rEiGHmpaprkYDNyXnJYg4ANxWLy9', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C111177AF892263', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000007', + PreviousTxnID: 'D7E587874A4ACB0F2F5557416E8834EA3A9A9DCCF493A139DFC1DF1AA21FA24C', + PreviousTxnLgrSeq: 11003728, + Sequence: 32647, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '732.679143498934' + }, + TakerPays: '35199960104', + index: '3B2748D2270588F2A180CA2C6B7262B3D95F37BF5EE052600059F23BFFD4ED82', + quality: '48042803.47861603', + taker_gets_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0' + }, + taker_pays_funded: '0' + }, + { + Account: 'rEiUs9rEiGHmpaprkYDNyXnJYg4ANxWLy9', + BookDirectory: '4627DFFCFF8B5A265EDBD8AE8C14A52325DBFEDAF4F5C32E5C111182DF1CF82E', + BookNode: '0000000000000000', + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000007', + PreviousTxnID: 'CD503C7524F4C16369C671D1E3419B8C7AA45D4D9049137B700C1F83F4B2A6ED', + PreviousTxnLgrSeq: 11003716, + Sequence: 32645, + TakerGets: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '732.679143498934' + }, + TakerPays: '35200312104', + index: 'C307AAACE73B101EA03D33C4A9FADECA19439F49F0AAF080FE37FA676B69F6D5', + quality: '48043283.90719534', + taker_gets_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0' + }, + taker_pays_funded: '0' + } + ], + validated: true + } + }); +}; + +module.exports.requestBookOffersXRPCounterResponse = function(request) { + return JSON.stringify({ + id: request.id, + status: 'success', + type: 'response', + result: { + ledger_index: request.ledger_index, + offers: [ + { + Account: 'rDhvfvsyBBTe8VFRp9q9hTmuUH91szQDyo', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D0773EDCBC36C00', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'CE8CF4B56D56B8625E97A0A885750228DA04FB3957F55DB812F571E82DBF409D', + PreviousTxnLgrSeq: 11003859, + Sequence: 554, + TakerGets: '1000000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '20.9779' + }, + index: 'CE14A7A75F12FDD166FDFBE446CF737CE0D467F6F11299E69DA10EDFD9C984EB', + owner_funds: '1037828768', + quality: '0.0000000209779' + }, + { + Account: 'rLVCrkavabdvHiNtcMedN3BAmz3AUc2L5j', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D07741EB0BD2000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '000000000000000A', + PreviousTxnID: '3F98A2AC970BCB077BFB6E6A99D1395C878DBD869F8327FE3BA226DE50229898', + PreviousTxnLgrSeq: 10997095, + Sequence: 7344, + TakerGets: '70000000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1468.6' + }, + index: '9D7D345AC880071453B18F78BB2CDD8DB98B38025F4C6DC8A9CDA7ECDD7229C1', + owner_funds: '189998700393', + quality: '0.00000002098' + }, + { + Account: 'rL5916QJwSMnUqcCv9savsXA7Xtq83fhzS', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D0775F05A074000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'C8BA89CE93BCC203225337086752AB98AD87D201CFE8B8F768D8B33A95A442C9', + PreviousTxnLgrSeq: 10996282, + Sequence: 243, + TakerGets: '100000000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '2100' + }, + index: '307CE6343140915231E11E0FE993D2A256DEC18092A2B546EFA0B4214139FAFC', + owner_funds: '663185088622', + quality: '0.000000021' + }, + { + Account: 'rGPmoJKzmocGgJoWUmU4KYxig2RUC7cESo', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D0777C203516000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '3DE17110F54AD94B4F853ADA985AB02EE9E4B6382E9912E0128ED0D0DCAF71D2', + PreviousTxnLgrSeq: 10997799, + Sequence: 91, + TakerGets: '58200000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1223.364' + }, + index: '8BFFF54B164E52C4B66EE193829D589EA03F0FAD86A585EB3208C3D2FDEE2CAF', + owner_funds: '58199748000', + quality: '0.00000002102', + taker_gets_funded: '58199748000', + taker_pays_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1223.35870296' + } + }, + { + Account: 'rfCFLzNJYvvnoGHWQYACmJpTgkLUaugLEw', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D077C885DE9E684', + BookNode: '0000000000000000', + Expiration: 474062867, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000000E1', + PreviousTxnID: '3E6B6CB8518CC6DF19E8EA0D38D0268ECE35DCCB59DE25DC5A340D4DB68312F8', + PreviousTxnLgrSeq: 11004047, + Sequence: 2665861, + TakerGets: '8589393882', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '181' + }, + index: 'B2247E0118DAF88318EBB495A03F54C115FC9420AF85499D95D208912B059A86', + owner_funds: '412756265349', + quality: '0.0000000210724996998106' + }, + { + Account: 'rn7Dk7YcNRmUb9q9WUVX1oh9Kp1Dkuy9xE', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D077CB4EB7E6D1E', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000009', + PreviousTxnID: '2AF95FB960B7E4E0E9E88BCBF4465BD37DCC7D0B2D8C640F6B4384DDAB77E75E', + PreviousTxnLgrSeq: 10999181, + Sequence: 881318, + TakerGets: '1983226007', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '41.79532441712259' + }, + index: 'AC3E2571C15C4A405D19DD0665B798AAACE843D87849544237DA7B29541990AB', + owner_funds: '0', + quality: '0.00000002107441323863326', + taker_gets_funded: '0', + taker_pays_funded: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '0' + } + }, + { + Account: 'rLVCrkavabdvHiNtcMedN3BAmz3AUc2L5j', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D077F08A879E000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '000000000000000A', + PreviousTxnID: '68D5EEA742C3EFD3E8CB3B998542042885C2D7E4BFAF47C15DF1681AD9D1E42A', + PreviousTxnLgrSeq: 10995569, + Sequence: 7335, + TakerGets: '60000000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1266' + }, + index: '4ED8112E78F86DB75E5A14A6C2EE45F3EA9CBC5644EAFA81F970F688F0CC04D7', + quality: '0.0000000211' + }, + { + Account: 'rN24WWiyC6q1yWmm6b3Z6yMycohvnutLUQ', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D077F08A879E000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: '22BDB32176381066833FC64BC1D6D56F033F99695CBC996DAC848C36F2FC800C', + PreviousTxnLgrSeq: 10996022, + Sequence: 367, + TakerGets: '8000000000', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '168.8' + }, + index: '7B1F18E506BA7B06C18B10A4D0F45FA6213F94B5ACA1912B0C4A3C9F899862D5', + owner_funds: '16601355477', + quality: '0.0000000211' + }, + { + Account: 'rfCFLzNJYvvnoGHWQYACmJpTgkLUaugLEw', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D0782A08429CE0B', + BookNode: '0000000000000000', + Expiration: 474062643, + Flags: 0, + LedgerEntryType: 'Offer', + OwnerNode: '00000000000000E1', + PreviousTxnID: 'A737529DC88EE6EFF684729BFBEB1CD89FF186A20041D6237EB1B36A192C4DF3', + PreviousTxnLgrSeq: 11004000, + Sequence: 2665799, + TakerGets: '85621672636', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '1810' + }, + index: 'C63B614E60EB46FAA4F9F5E3B6D5535E18F909F936788514280F59EDB6C899BD', + quality: '0.00000002113950760685067' + }, + { + Account: 'rHRC9cBUYwEnrDZce6SkAkDTo8P9G1un3U', + BookDirectory: 'DFA3B6DDAB58C7E8E5D944E736DA4B7046C30E4F460FD9DE4D078394CFB33000', + BookNode: '0000000000000000', + Flags: 131072, + LedgerEntryType: 'Offer', + OwnerNode: '0000000000000000', + PreviousTxnID: 'B08E26494F49ACCDFA22151369E2171558E5D62BA22DCFFD001DF2C45E0727DB', + PreviousTxnLgrSeq: 10984137, + Sequence: 17, + TakerGets: '100752658247', + TakerPays: { + currency: 'USD', + issuer: 'rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B', + value: '2130.918721932529' + }, + index: '72F31EC2BDE26A721CC78EB8D42B2BC4A3E36DCF6E7D4B73C53D4A40F4728A88', + owner_funds: '4517636158733', + quality: '0.00000002115' + } + ], + validated: true + } + }); +}; diff --git a/test/fixtures/get-orderbook-response.json b/test/fixtures/get-orderbook-response.json new file mode 100644 index 00000000..c5b49bee --- /dev/null +++ b/test/fixtures/get-orderbook-response.json @@ -0,0 +1,370 @@ +{ + "bids": [ + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "10", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "3205.1", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ", + "sequence": 434 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "4.99707396683212", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "1599.063669386278", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDYCRhpahKEhCFV25xScg67Bwf4W9sTYAm", + "sequence": 233 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "0.4499999999999999", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "143.1050962074379", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "raudnGKfTK23YKfnS7ixejHrqGERTYNFXk", + "sequence": 110104 + }, + "state": { + "availableQuantity": { + "currency": "USD", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "priceOfAvailableQuantity": { + "currency": "BTC", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "0.8", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "254.329207354604", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE", + "sequence": 35625 + }, + "state": { + "availableQuantity": { + "currency": "USD", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "priceOfAvailableQuantity": { + "currency": "BTC", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "1.23231134568807", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "390.4979", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rwBYyfufTzk77zUSKEu4MvixfarC35av1J", + "sequence": 387756 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "0.003160328237957649", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "1", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rwjsRktX1eguUr1pHTffyHnC4uyrvX58V1", + "sequence": 208927 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "15", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "4725", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ", + "sequence": 429 + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "1.6", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "496.5429474010489", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE", + "sequence": 35627 + }, + "state": { + "availableQuantity": { + "currency": "USD", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "priceOfAvailableQuantity": { + "currency": "BTC", + "value": "0", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + } + }, + { + "specification": { + "direction": "buy", + "quantity": { + "currency": "USD", + "value": "10", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "3103", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "r49y2xKuKVG2dPkNHgWQAV61cjxk8gryjQ", + "sequence": 431 + } + } + ], + "asks": [ + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.3", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "99.34014894048333", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "raudnGKfTK23YKfnS7ixejHrqGERTYNFXk", + "sequence": 110103 + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.8095", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "268.754", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rPyYxUGK8L4dgEvjPs3aRc1B1jEiLr3Hx5", + "sequence": 392 + }, + "state": { + "availableQuantity": { + "currency": "USD", + "value": "0.8078974385735969", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "priceOfAvailableQuantity": { + "currency": "BTC", + "value": "268.2219496064341", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.4499999999999999", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "152.0098333185607", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "raudnGKfTK23YKfnS7ixejHrqGERTYNFXk", + "sequence": 110105 + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.003768001830745216", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "1.308365894430151", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDbsCJr5m8gHDCNEHCZtFxcXHsD4S9jH83", + "sequence": 110061 + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.5", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "176.3546101589987", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE", + "sequence": 35788 + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.5", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "179.48", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rN6jbxx4H6NxcnmkzBxQnbCWLECNKrgSSf", + "sequence": 491 + }, + "state": { + "availableQuantity": { + "currency": "USD", + "value": "0.499001996007984", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "priceOfAvailableQuantity": { + "currency": "BTC", + "value": "179.1217564870259", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + } + }, + { + "specification": { + "direction": "sell", + "quantity": { + "currency": "USD", + "value": "0.8", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + }, + "totalPrice": { + "currency": "BTC", + "value": "288.7710263794967", + "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" + } + }, + "properties": { + "maker": "rDVBvAQScXrGRGnzrxRrcJPeNLeLeUTAqE", + "sequence": 35789 + } + } + ] +} diff --git a/test/fixtures/get-orders-response.json b/test/fixtures/get-orders-response.json index 6d00cd44..8373b149 100644 --- a/test/fixtures/get-orders-response.json +++ b/test/fixtures/get-orders-response.json @@ -1,20 +1,19 @@ [ { "specification": { - "direction": "buy", + "direction": "sell", "quantity": { - "currency": "USD", - "value": "1122.990930900328", - "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" - }, - "totalPrice": { "currency": "EUR", "value": "17.70155237781915", "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" }, - "immediateOrCancel": true + "totalPrice": { + "currency": "USD", + "value": "1122.990930900328", + "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" + } }, - "state": { + "properties": { "sequence": 719930 } }, @@ -32,7 +31,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 756999 } }, @@ -50,7 +49,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 757002 } }, @@ -68,7 +67,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 757003 } }, @@ -86,7 +85,7 @@ "counterparty": "rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc" } }, - "state": { + "properties": { "sequence": 782148 } }, @@ -104,7 +103,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 787368 } }, @@ -122,7 +121,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 787408 } }, @@ -140,7 +139,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 803438 } }, @@ -158,7 +157,7 @@ "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" } }, - "state": { + "properties": { "sequence": 807858 } }, @@ -176,7 +175,7 @@ "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" } }, - "state": { + "properties": { "sequence": 807896 } }, @@ -193,7 +192,7 @@ "counterparty": "rsP3mgGb2tcYUrxiLFiHJiQXhsziegtwBc" } }, - "state": { + "properties": { "sequence": 814018 } }, @@ -211,7 +210,7 @@ "counterparty": "rMwjYedjc7qqtKYVLiAccJSmCwih4LnE2q" } }, - "state": { + "properties": { "sequence": 827522 } }, @@ -229,7 +228,7 @@ "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" } }, - "state": { + "properties": { "sequence": 833591 } }, @@ -247,7 +246,7 @@ "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" } }, - "state": { + "properties": { "sequence": 833592 } }, @@ -265,7 +264,7 @@ "counterparty": "r9Dr5xwkeLegBeXq6ujinjSBLQzQ1zQGjH" } }, - "state": { + "properties": { "sequence": 838954 } }, @@ -282,7 +281,7 @@ "value": "2229.229447" } }, - "state": { + "properties": { "sequence": 843730 } }, @@ -300,7 +299,7 @@ "counterparty": "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B" } }, - "state": { + "properties": { "sequence": 844068 } } diff --git a/test/mock-rippled.js b/test/mock-rippled.js index 97266380..d2b9f242 100644 --- a/test/mock-rippled.js +++ b/test/mock-rippled.js @@ -7,6 +7,7 @@ const fixtures = require('./fixtures/mock'); const addresses = require('./fixtures/addresses'); const hashes = require('./fixtures/hashes'); const accountOffersResponse = require('./fixtures/acct-offers-response'); +const bookOffers = require('./fixtures/book-offers-response'); module.exports = function(port) { const mock = new WebSocketServer({port: port}); @@ -129,5 +130,17 @@ module.exports = function(port) { } }); + mock.on('request_book_offers', function(request, conn) { + if (request.taker_gets.currency === 'BTC' + && request.taker_pays.currency === 'USD') { + conn.send(bookOffers.requestBookOffersBidsResponse(request)); + } else if (request.taker_gets.currency === 'USD' + && request.taker_pays.currency === 'BTC') { + conn.send(bookOffers.requestBookOffersAsksResponse(request)); + } else { + assert(false, 'Unrecognized order book: ' + JSON.stringify(request)); + } + }); + return mock; };