ococo/events/orders_order_fill.js

'use strict'

const { Config } = require('bfx-api-node-core')
const { DUST } = Config

/**
 * Called on atomic order fill. If it was the initial order, the OCO order
 * is submitted, otherwise the `'exec:stop'` event is emitted to trigger
 * teardown.
 *
 * @memberOf module:OCOCO
 * @listens AOHost~ordersOrderCancel
 *
 * @param {AOInstance} instance - AO instance
 * @param {object} order - the order that was filled
 * @returns {Promise} p - resolves on completion
 */
const onOrdersOrderFill = async (instance = {}, order) => {
  const { state = {}, h = {} } = instance
  const { updateState, emitSelf } = h
  const { initialOrderFilled } = state

  if (order.amount > DUST) { // partial fill
    return
  }

  if (initialOrderFilled) {
    await emitSelf('exec:stop')
  } else {
    await updateState(instance, { initialOrderFilled: true })
    await emitSelf('submit_oco_order')
  }
}

module.exports = onOrdersOrderFill