lib/order/structure/maker/withMakerTxns.js

/*
 * Copyright (C) 2021-2022 Algodex VASP (BVI) Corp.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/.
 */

const getMakerTxns = require('./getMakerTxns');

/**
 * # 🔗 withMakerTxns
 * Accepts an [Order]{@link Order} with execution type [Maker]{@tutorial Maker} and generates the relevant transactions.
 *
 *
 * ### Existing Escrow (Only relevant for [makePlaceAlgo]{@link module:txns/buy.makePlaceAlgo} )
 * When a user places a maker order, we first check to see if the [Algodex Orderbook]{@tutorial Orderbook} already has an Order entry at that price, from that User.
 *  * If that order exists, we generate a set of transactions that adds to the existing order.
 *  * If the order does not exist, we generate a set of transactions to create a new maker order.
 *
 * You can learn more about the differences between the two types of transactions in the trasnaction table for [makePlaceAlgoTxns]{@link module:txns/buy.makePlaceAlgoTxns} factory.
 *
 * ### When is it used?
 * This method and the corresponding Factory is used anytime a Maker order is added to the [Algodex Orderbook]{@tutorial Orderbook}.
 *
 * This method is the maker leg of [getMakerTakerTxns]{@link module:order/structures.getMakerTakerTxns}.
 *
 * This method would be ideal for use in algorithmic trading strategies and for programmaticaly providing liquidity to the [Algodex Orderbook]{@tutorial Orderbook}
 *
 *
 *
 *
 * @example
 * const [AlgodexAPI]{@link AlgodexApi} = require(@algodex/algodex-sdk)
 * const api = new [AlgodexAPI]{@link AlgodexApi}(require('../config.json'))
 * const order = {
 *   "client": api.algod,
 *   "indexer": api.indexer,
 *   "asset": {
 *     "id": 15322902,
 *     "decimals": 6,
 *   },
 *   "address": "TJFFNUYWHPPIYDE4DGGYPGHWKGAPJEWP3DGE5THZS3B2M2XIAPQ2WY3X4I",
 *   "price": 2.22,
 *   "amount": 1,
 *   "total": 2,
 *   "execution": "maker",
 *   "type": "buy",
 *   "appId": 22045503,
 *   "version": 6
 * }
 * const {[compile]{@link module:order/compile}} = require(@algodex/algodex-sdk/order)
 *
 * //order.execution === 'maker'
 * let res = await withMakerTxns(api, await [compile]{@link module:order/compile}(order))
 * console.log(res.contract.txns)
 * //Outputs:
 * [makePlaceAlgoTxns]{@link module:txns/buy.makePlaceAlgoTxns} || [makePlaceAssetTxns]{@link module:txns/sell.makePlaceAssetTxns}
 *
 * @param {Api} api Instance of AlgodexApi
 * @param {Order} order The User's Order
 * @return {Promise<Order>}
 * @memberOf module:order/structure
 * @see [getMakerTxns]{@link getMakerTxns} || [makePlaceAlgoTxns]{@link module:txns/buy.makePlaceAlgoTxns} || [makePlaceAssetTxns]{@link module:txns/sell.makePlaceAssetTxns}
 */
async function withMakerTxns(api, order) {
  const isExistingEscrow = await api.getIsExistingEscrow(order);
  if (isExistingEscrow) {
    order.contract = {
      ...order.contract,
      creator: order.address,
    };
  }

  return {
    ...order,
    contract: {
      ...order.contract,
      txns: await getMakerTxns(order, isExistingEscrow),
      creator: order.address,
    },
  };
}
module.exports = withMakerTxns;