Files
protocol/packages/website/ts/utils/order_parser.ts
2018-08-30 13:36:44 -07:00

76 lines
2.7 KiB
TypeScript

import { BigNumber, logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
import { validator } from 'ts/schemas/validator';
import { PortalOrder } from 'ts/types';
export const orderParser = {
parseQueryString(queryString: string): PortalOrder | undefined {
if (queryString.length === 0) {
return undefined;
}
const queryParams = queryString.substring(1).split('&');
const orderQueryParam = _.find(queryParams, queryParam => {
const queryPair = queryParam.split('=');
return queryPair[0] === 'order';
});
if (_.isUndefined(orderQueryParam)) {
return undefined;
}
const orderPair = orderQueryParam.split('=');
if (orderPair.length !== 2) {
return undefined;
}
const order = JSON.parse(decodeURIComponent(orderPair[1]));
const validationResult = validator.validate(order, portalOrderSchema);
if (validationResult.errors.length > 0) {
logUtils.log(`Invalid shared order: ${validationResult.errors}`);
return undefined;
}
const signedOrder = _.get(order, 'signedOrder');
const convertedSignedOrder = convertOrderStringFieldsToBigNumber(signedOrder);
const result = {
...order,
signedOrder: convertedSignedOrder,
};
return result;
},
parseJsonString(orderJson: string): PortalOrder {
const order = JSON.parse(orderJson);
const signedOrder = _.get(order, 'signedOrder');
const convertedSignedOrder = convertOrderStringFieldsToBigNumber(signedOrder);
const result = {
...order,
signedOrder: convertedSignedOrder,
};
return result;
},
};
// TODO: consolidate this function with that in typeConverters in @0xproject/connect
function convertOrderStringFieldsToBigNumber(order: any): any {
return convertStringsFieldsToBigNumbers(order, [
'makerAssetAmount',
'takerAssetAmount',
'makerFee',
'takerFee',
'expirationTimeSeconds',
'salt',
]);
}
// TODO: consolidate this function with that in typeConverters in @0xproject/connect
function convertStringsFieldsToBigNumbers(obj: any, fields: string[]): any {
const result = _.assign({}, obj);
_.each(fields, field => {
_.update(result, field, (value: string) => {
if (_.isUndefined(value)) {
throw new Error(`Could not find field '${field}' while converting string fields to BigNumber.`);
}
return new BigNumber(value);
});
});
return result;
}