all files / src/ quoteUtils.js

92% Statements 23/25
62.5% Branches 5/8
100% Functions 4/4
92% Lines 23/25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99                                                                                                                                                       
'use strict'
 
const assert = require('assert')
const co = require('co')
const request = require('superagent')
const BigNumber = require('bignumber.js')
 
/**
 * @param {URI} connector
 * @param {Object} params
 * @param {String} params.sourceLedger
 * @param {String} params.destinationLedger
 * @param {Number} params.destinationExpiryDuration
 * @param {Number} params.sourceExpiryDuration
 * Exactly one of the following:
 * @param {String} params.sourceAmount
 * @param {String} params.destinationAmount
 * @returns {Promise<Quote>}
 */
function getQuoteFromConnector (connector, params) {
  return co(function * () {
    const res = yield request.get(connector + '/quote')
      .query({
        source_ledger: params.sourceLedger,
        destination_ledger: params.destinationLedger,
        destination_expiry_duration: params.destinationExpiryDuration,
        source_expiry_duration: params.sourceExpiryDuration
      })
      .query(params.sourceAmount
        ? {source_amount: params.sourceAmount}
        : {destination_amount: params.destinationAmount})
    const quote = res.body
 
    // Verify that the connector returned the correct fields.
    assert.equal(quote.source_ledger, params.sourceLedger, 'quote has unexpected source_ledger')
    assert.equal(quote.destination_ledger, params.destinationLedger, 'quote has unexpected destination_ledger')
    Iif (params.sourceAmount) {
      assert.ok((new BigNumber(quote.source_amount)).equals(params.sourceAmount),
        'quote has unexpected source_amount')
    } else {
      assert.ok((new BigNumber(quote.destination_amount)).equals(params.destinationAmount),
        'quote has unexpected destination_amount')
    }
    return quote
  })
}
 
/**
 * @param {Quote} quote1
 * @param {Quote} quote2
 * @returns {Quote}
 */
function getCheaperQuote (quote1, quote2) {
  Iif ((new BigNumber(quote1.source_amount))
      .lessThan(quote2.source_amount)) {
    return quote1
  }
 
  if ((new BigNumber(quote1.destination_amount))
      .lessThan(quote2.destination_amount)) {
    return quote1
  }
 
  return quote2
}
 
/**
 * @param {Quote} quote
 * @param {String} sourceAccount
 * @param {String} destinationAccount
 * @param {Quote} quote
 * @returns {Transfer}
 */
function quoteToTransfer (quote, sourceAccount, destinationAccount) {
  return {
    ledger: quote.source_ledger,
    debits: [{
      account: sourceAccount,
      amount: quote.source_amount
    }],
    credits: [{
      account: quote.source_connector_account,
      amount: quote.source_amount,
      memo: {
        ilp_header: {
          ledger: quote.destination_ledger,
          account: destinationAccount,
          amount: quote.destination_amount
        }
      }
    }],
    expiry_duration: quote.source_expiry_duration
  }
}
 
exports.getQuoteFromConnector = getQuoteFromConnector
exports.getCheaperQuote = getCheaperQuote
exports.quoteToTransfer = quoteToTransfer