src/modules/markets/actions/submit-new-market.js
import {
invalidateMarketCreation,
clearNewMarket
} from "modules/markets/actions/update-new-market";
import { addNewMarketCreationTransactions } from "modules/transactions/actions/add-transactions";
import { ZERO } from "modules/trades/constants/numbers";
import { MODAL_ACCOUNT_APPROVAL } from "modules/modal/constants/modal-types";
import makePath from "modules/routes/helpers/make-path";
import noop from "utils/noop";
import { createBigNumber } from "utils/create-big-number";
import { updateModal } from "modules/modal/actions/update-modal";
import { TRANSACTIONS } from "modules/routes/constants/views";
import { buildCreateMarket } from "modules/markets/helpers/build-create-market";
import { sortOrders } from "modules/orders/helpers/liquidity";
import { addMarketLiquidityOrders } from "modules/orders/actions/liquidity-management";
export function submitNewMarket(newMarket, history, callback = noop) {
return (dispatch, getState) => {
const { universe, loginAccount, contractAddresses } = getState();
const { createMarket, formattedNewMarket } = buildCreateMarket(
newMarket,
false,
universe,
loginAccount,
contractAddresses
);
const hasOrders = Object.keys(newMarket.orderBook).length;
newMarket.orderBook = sortOrders(newMarket.orderBook);
dispatch(
getHasApproval(hasOrders, err => {
if (err) return callback(err);
createMarket({
...formattedNewMarket,
meta: loginAccount.meta,
onSent: res => {
dispatch(
addNewMarketCreationTransactions({
...formattedNewMarket,
...res
})
);
history.push(makePath(TRANSACTIONS));
dispatch(clearNewMarket());
if (hasOrders) {
dispatch(
addMarketLiquidityOrders({
marketId: res.callReturn,
liquidityOrders: newMarket.orderBook
})
);
// orders submission will be kicked off from handleMarketCreatedLog event
}
},
onSuccess: res => {
const marketId = res.callReturn;
if (callback) callback(null, marketId);
},
onFailed: err => {
console.error("ERROR create market failed:", err);
callback(err);
dispatch(invalidateMarketCreation(err.message));
}
});
})
);
};
}
function getHasApproval(hasOrders, callback) {
return (dispatch, getState) => {
const { loginAccount } = getState();
if (hasOrders && createBigNumber(loginAccount.allowance).lte(ZERO)) {
dispatch(
updateModal({
type: MODAL_ACCOUNT_APPROVAL,
continueDefault: true,
approveOnSent: noop,
approveCallback: (err, res) => {
if (err) return callback(err);
callback(null);
}
})
);
} else {
callback(null);
}
};
}