Merge pull request #379 from 0xProject/portal_json
Make portal order JSON compatible with 0x.js
This commit is contained in:
@@ -2,6 +2,7 @@ import {
|
|||||||
BlockParam,
|
BlockParam,
|
||||||
BlockRange,
|
BlockRange,
|
||||||
DecodedLogEvent,
|
DecodedLogEvent,
|
||||||
|
ECSignature,
|
||||||
ExchangeContractEventArgs,
|
ExchangeContractEventArgs,
|
||||||
ExchangeEvents,
|
ExchangeEvents,
|
||||||
IndexedFilterValues,
|
IndexedFilterValues,
|
||||||
@@ -35,10 +36,10 @@ import {
|
|||||||
BlockchainErrs,
|
BlockchainErrs,
|
||||||
ContractInstance,
|
ContractInstance,
|
||||||
EtherscanLinkSuffixes,
|
EtherscanLinkSuffixes,
|
||||||
|
Order as PortalOrder,
|
||||||
ProviderType,
|
ProviderType,
|
||||||
Side,
|
Side,
|
||||||
SideToAssetToken,
|
SideToAssetToken,
|
||||||
SignatureData,
|
|
||||||
Token,
|
Token,
|
||||||
TokenByAddress,
|
TokenByAddress,
|
||||||
} from 'ts/types';
|
} from 'ts/types';
|
||||||
@@ -288,39 +289,24 @@ export class Blockchain {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
public portalOrderToSignedOrder(
|
public portalOrderToZeroExOrder(portalOrder: PortalOrder): SignedOrder {
|
||||||
maker: string,
|
|
||||||
taker: string,
|
|
||||||
makerTokenAddress: string,
|
|
||||||
takerTokenAddress: string,
|
|
||||||
makerTokenAmount: BigNumber,
|
|
||||||
takerTokenAmount: BigNumber,
|
|
||||||
makerFee: BigNumber,
|
|
||||||
takerFee: BigNumber,
|
|
||||||
expirationUnixTimestampSec: BigNumber,
|
|
||||||
feeRecipient: string,
|
|
||||||
signatureData: SignatureData,
|
|
||||||
salt: BigNumber,
|
|
||||||
): SignedOrder {
|
|
||||||
const ecSignature = signatureData;
|
|
||||||
const exchangeContractAddress = this.getExchangeContractAddressIfExists();
|
const exchangeContractAddress = this.getExchangeContractAddressIfExists();
|
||||||
const takerOrNullAddress = _.isEmpty(taker) ? constants.NULL_ADDRESS : taker;
|
const zeroExSignedOrder = {
|
||||||
const signedOrder = {
|
|
||||||
ecSignature,
|
|
||||||
exchangeContractAddress,
|
exchangeContractAddress,
|
||||||
expirationUnixTimestampSec,
|
maker: portalOrder.signedOrder.maker,
|
||||||
feeRecipient,
|
taker: portalOrder.signedOrder.taker,
|
||||||
maker,
|
makerTokenAddress: portalOrder.signedOrder.makerTokenAddress,
|
||||||
makerFee,
|
takerTokenAddress: portalOrder.signedOrder.takerTokenAddress,
|
||||||
makerTokenAddress,
|
makerTokenAmount: new BigNumber(portalOrder.signedOrder.makerTokenAmount),
|
||||||
makerTokenAmount,
|
takerTokenAmount: new BigNumber(portalOrder.signedOrder.takerTokenAmount),
|
||||||
salt,
|
makerFee: new BigNumber(portalOrder.signedOrder.makerFee),
|
||||||
taker: takerOrNullAddress,
|
takerFee: new BigNumber(portalOrder.signedOrder.takerFee),
|
||||||
takerFee,
|
expirationUnixTimestampSec: new BigNumber(portalOrder.signedOrder.expirationUnixTimestampSec),
|
||||||
takerTokenAddress,
|
feeRecipient: portalOrder.signedOrder.feeRecipient,
|
||||||
takerTokenAmount,
|
ecSignature: portalOrder.signedOrder.ecSignature,
|
||||||
|
salt: new BigNumber(portalOrder.signedOrder.salt),
|
||||||
};
|
};
|
||||||
return signedOrder;
|
return zeroExSignedOrder;
|
||||||
}
|
}
|
||||||
public async fillOrderAsync(signedOrder: SignedOrder, fillTakerTokenAmount: BigNumber): Promise<BigNumber> {
|
public async fillOrderAsync(signedOrder: SignedOrder, fillTakerTokenAmount: BigNumber): Promise<BigNumber> {
|
||||||
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
|
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
|
||||||
@@ -413,7 +399,7 @@ export class Blockchain {
|
|||||||
|
|
||||||
return newTokenBalancePromise;
|
return newTokenBalancePromise;
|
||||||
}
|
}
|
||||||
public async signOrderHashAsync(orderHash: string): Promise<SignatureData> {
|
public async signOrderHashAsync(orderHash: string): Promise<ECSignature> {
|
||||||
utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
|
utils.assert(!_.isUndefined(this._zeroEx), 'ZeroEx must be instantiated.');
|
||||||
const makerAddress = this._userAddress;
|
const makerAddress = this._userAddress;
|
||||||
// If makerAddress is undefined, this means they have a web3 instance injected into their browser
|
// If makerAddress is undefined, this means they have a web3 instance injected into their browser
|
||||||
@@ -436,11 +422,8 @@ export class Blockchain {
|
|||||||
makerAddress,
|
makerAddress,
|
||||||
shouldAddPersonalMessagePrefix,
|
shouldAddPersonalMessagePrefix,
|
||||||
);
|
);
|
||||||
const signatureData = _.extend({}, ecSignature, {
|
this._dispatcher.updateECSignature(ecSignature);
|
||||||
hash: orderHash,
|
return ecSignature;
|
||||||
});
|
|
||||||
this._dispatcher.updateSignatureData(signatureData);
|
|
||||||
return signatureData;
|
|
||||||
}
|
}
|
||||||
public async mintTestTokensAsync(token: Token) {
|
public async mintTestTokensAsync(token: Token) {
|
||||||
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
|
utils.assert(this._doesUserAddressExist(), BlockchainCallErrs.UserHasNoAssociatedAddresses);
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ import { EthereumAddress } from 'ts/components/ui/ethereum_address';
|
|||||||
import { Identicon } from 'ts/components/ui/identicon';
|
import { Identicon } from 'ts/components/ui/identicon';
|
||||||
import { VisualOrder } from 'ts/components/visual_order';
|
import { VisualOrder } from 'ts/components/visual_order';
|
||||||
import { Dispatcher } from 'ts/redux/dispatcher';
|
import { Dispatcher } from 'ts/redux/dispatcher';
|
||||||
import { orderSchema } from 'ts/schemas/order_schema';
|
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
|
||||||
import { SchemaValidator } from 'ts/schemas/validator';
|
import { validator } from 'ts/schemas/validator';
|
||||||
import { AlertTypes, BlockchainErrs, Order, Token, TokenByAddress, WebsitePaths } from 'ts/types';
|
import { AlertTypes, BlockchainErrs, Order, Token, TokenByAddress, WebsitePaths } from 'ts/types';
|
||||||
import { colors } from 'ts/utils/colors';
|
import { colors } from 'ts/utils/colors';
|
||||||
import { constants } from 'ts/utils/constants';
|
import { constants } from 'ts/utils/constants';
|
||||||
@@ -59,7 +59,6 @@ interface FillOrderState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
||||||
private _validator: SchemaValidator;
|
|
||||||
private _isUnmounted: boolean;
|
private _isUnmounted: boolean;
|
||||||
constructor(props: FillOrderProps) {
|
constructor(props: FillOrderProps) {
|
||||||
super(props);
|
super(props);
|
||||||
@@ -82,7 +81,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
isConfirmingTokenTracking: false,
|
isConfirmingTokenTracking: false,
|
||||||
tokensToTrack: [],
|
tokensToTrack: [],
|
||||||
};
|
};
|
||||||
this._validator = new SchemaValidator();
|
|
||||||
}
|
}
|
||||||
public componentWillMount() {
|
public componentWillMount() {
|
||||||
if (!_.isEmpty(this.state.orderJSON)) {
|
if (!_.isEmpty(this.state.orderJSON)) {
|
||||||
@@ -109,7 +107,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
<FillOrderJSON
|
<FillOrderJSON
|
||||||
blockchain={this.props.blockchain}
|
blockchain={this.props.blockchain}
|
||||||
tokenByAddress={this.props.tokenByAddress}
|
tokenByAddress={this.props.tokenByAddress}
|
||||||
networkId={this.props.networkId}
|
|
||||||
orderJSON={this.state.orderJSON}
|
orderJSON={this.state.orderJSON}
|
||||||
onFillOrderJSONChanged={this._onFillOrderJSONChanged.bind(this)}
|
onFillOrderJSONChanged={this._onFillOrderJSONChanged.bind(this)}
|
||||||
/>
|
/>
|
||||||
@@ -136,7 +133,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
<FillOrderJSON
|
<FillOrderJSON
|
||||||
blockchain={this.props.blockchain}
|
blockchain={this.props.blockchain}
|
||||||
tokenByAddress={this.props.tokenByAddress}
|
tokenByAddress={this.props.tokenByAddress}
|
||||||
networkId={this.props.networkId}
|
|
||||||
orderJSON={this.state.orderJSON}
|
orderJSON={this.state.orderJSON}
|
||||||
onFillOrderJSONChanged={this._onFillOrderJSONChanged.bind(this)}
|
onFillOrderJSONChanged={this._onFillOrderJSONChanged.bind(this)}
|
||||||
/>
|
/>
|
||||||
@@ -182,16 +178,16 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
private _renderVisualOrder() {
|
private _renderVisualOrder() {
|
||||||
const takerTokenAddress = this.state.parsedOrder.taker.token.address;
|
const takerTokenAddress = this.state.parsedOrder.signedOrder.takerTokenAddress;
|
||||||
const takerToken = this.props.tokenByAddress[takerTokenAddress];
|
const takerToken = this.props.tokenByAddress[takerTokenAddress];
|
||||||
const orderTakerAmount = new BigNumber(this.state.parsedOrder.taker.amount);
|
const orderTakerAmount = new BigNumber(this.state.parsedOrder.signedOrder.takerTokenAmount);
|
||||||
const orderMakerAmount = new BigNumber(this.state.parsedOrder.maker.amount);
|
const orderMakerAmount = new BigNumber(this.state.parsedOrder.signedOrder.makerTokenAmount);
|
||||||
const takerAssetToken = {
|
const takerAssetToken = {
|
||||||
amount: orderTakerAmount.minus(this.state.unavailableTakerAmount),
|
amount: orderTakerAmount.minus(this.state.unavailableTakerAmount),
|
||||||
symbol: takerToken.symbol,
|
symbol: takerToken.symbol,
|
||||||
};
|
};
|
||||||
const fillToken = this.props.tokenByAddress[takerToken.address];
|
const fillToken = this.props.tokenByAddress[takerTokenAddress];
|
||||||
const makerTokenAddress = this.state.parsedOrder.maker.token.address;
|
const makerTokenAddress = this.state.parsedOrder.signedOrder.makerTokenAddress;
|
||||||
const makerToken = this.props.tokenByAddress[makerTokenAddress];
|
const makerToken = this.props.tokenByAddress[makerTokenAddress];
|
||||||
const makerAssetToken = {
|
const makerAssetToken = {
|
||||||
amount: orderMakerAmount.times(takerAssetToken.amount).div(orderTakerAmount),
|
amount: orderMakerAmount.times(takerAssetToken.amount).div(orderTakerAmount),
|
||||||
@@ -201,10 +197,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
amount: this.props.orderFillAmount,
|
amount: this.props.orderFillAmount,
|
||||||
symbol: takerToken.symbol,
|
symbol: takerToken.symbol,
|
||||||
};
|
};
|
||||||
const orderTaker = !_.isEmpty(this.state.parsedOrder.taker.address)
|
const parsedOrderExpiration = new BigNumber(this.state.parsedOrder.signedOrder.expirationUnixTimestampSec);
|
||||||
? this.state.parsedOrder.taker.address
|
|
||||||
: this.props.userAddress;
|
|
||||||
const parsedOrderExpiration = new BigNumber(this.state.parsedOrder.expiration);
|
|
||||||
const exchangeRate = orderMakerAmount.div(orderTakerAmount);
|
const exchangeRate = orderMakerAmount.div(orderTakerAmount);
|
||||||
|
|
||||||
let orderReceiveAmount = 0;
|
let orderReceiveAmount = 0;
|
||||||
@@ -213,7 +206,8 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
orderReceiveAmount = this._formatCurrencyAmount(orderReceiveAmountBigNumber, makerToken.decimals);
|
orderReceiveAmount = this._formatCurrencyAmount(orderReceiveAmountBigNumber, makerToken.decimals);
|
||||||
}
|
}
|
||||||
const isUserMaker =
|
const isUserMaker =
|
||||||
!_.isUndefined(this.state.parsedOrder) && this.state.parsedOrder.maker.address === this.props.userAddress;
|
!_.isUndefined(this.state.parsedOrder) &&
|
||||||
|
this.state.parsedOrder.signedOrder.maker === this.props.userAddress;
|
||||||
const expiryDate = utils.convertToReadableDateTimeFromUnixTimestamp(parsedOrderExpiration);
|
const expiryDate = utils.convertToReadableDateTimeFromUnixTimestamp(parsedOrderExpiration);
|
||||||
return (
|
return (
|
||||||
<div className="pt3 pb1">
|
<div className="pt3 pb1">
|
||||||
@@ -224,11 +218,11 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
Maker:
|
Maker:
|
||||||
</div>
|
</div>
|
||||||
<div className="col col-2 pr1">
|
<div className="col col-2 pr1">
|
||||||
<Identicon address={this.state.parsedOrder.maker.address} diameter={23} />
|
<Identicon address={this.state.parsedOrder.signedOrder.maker} diameter={23} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col col-6">
|
<div className="col col-6">
|
||||||
<EthereumAddress
|
<EthereumAddress
|
||||||
address={this.state.parsedOrder.maker.address}
|
address={this.state.parsedOrder.signedOrder.maker}
|
||||||
networkId={this.props.networkId}
|
networkId={this.props.networkId}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -237,8 +231,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
<div className="lg-px4 md-px4 sm-px0">
|
<div className="lg-px4 md-px4 sm-px0">
|
||||||
<div className="lg-px4 md-px4 sm-px1 pt1">
|
<div className="lg-px4 md-px4 sm-px1 pt1">
|
||||||
<VisualOrder
|
<VisualOrder
|
||||||
orderTakerAddress={orderTaker}
|
|
||||||
orderMakerAddress={this.state.parsedOrder.maker.address}
|
|
||||||
makerAssetToken={makerAssetToken}
|
makerAssetToken={makerAssetToken}
|
||||||
takerAssetToken={takerAssetToken}
|
takerAssetToken={takerAssetToken}
|
||||||
tokenByAddress={this.props.tokenByAddress}
|
tokenByAddress={this.props.tokenByAddress}
|
||||||
@@ -361,15 +353,16 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const makerTokenIfExists = this.props.tokenByAddress[this.state.parsedOrder.maker.token.address];
|
const makerTokenIfExists = this.props.tokenByAddress[this.state.parsedOrder.signedOrder.makerTokenAddress];
|
||||||
const takerTokenIfExists = this.props.tokenByAddress[this.state.parsedOrder.taker.token.address];
|
const takerTokenIfExists = this.props.tokenByAddress[this.state.parsedOrder.signedOrder.takerTokenAddress];
|
||||||
|
|
||||||
const tokensToTrack = [];
|
const tokensToTrack: Token[] = [];
|
||||||
const isUnseenMakerToken = _.isUndefined(makerTokenIfExists);
|
const isUnseenMakerToken = _.isUndefined(makerTokenIfExists);
|
||||||
const isMakerTokenTracked = !_.isUndefined(makerTokenIfExists) && makerTokenIfExists.isTracked;
|
const isMakerTokenTracked = !_.isUndefined(makerTokenIfExists) && makerTokenIfExists.isTracked;
|
||||||
if (isUnseenMakerToken) {
|
if (isUnseenMakerToken) {
|
||||||
tokensToTrack.push({
|
tokensToTrack.push({
|
||||||
...this.state.parsedOrder.maker.token,
|
...this.state.parsedOrder.metadata.makerToken,
|
||||||
|
address: this.state.parsedOrder.signedOrder.makerTokenAddress,
|
||||||
iconUrl: undefined,
|
iconUrl: undefined,
|
||||||
isTracked: false,
|
isTracked: false,
|
||||||
isRegistered: false,
|
isRegistered: false,
|
||||||
@@ -381,7 +374,8 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
const isTakerTokenTracked = !_.isUndefined(takerTokenIfExists) && takerTokenIfExists.isTracked;
|
const isTakerTokenTracked = !_.isUndefined(takerTokenIfExists) && takerTokenIfExists.isTracked;
|
||||||
if (isUnseenTakerToken) {
|
if (isUnseenTakerToken) {
|
||||||
tokensToTrack.push({
|
tokensToTrack.push({
|
||||||
...this.state.parsedOrder.taker.token,
|
...this.state.parsedOrder.metadata.takerToken,
|
||||||
|
address: this.state.parsedOrder.signedOrder.takerTokenAddress,
|
||||||
iconUrl: undefined,
|
iconUrl: undefined,
|
||||||
isTracked: false,
|
isTracked: false,
|
||||||
isRegistered: false,
|
isRegistered: false,
|
||||||
@@ -403,9 +397,10 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
private async _validateFillOrderFireAndForgetAsync(orderJSON: string) {
|
private async _validateFillOrderFireAndForgetAsync(orderJSON: string) {
|
||||||
let orderJSONErrMsg = '';
|
let orderJSONErrMsg = '';
|
||||||
let parsedOrder: Order;
|
let parsedOrder: Order;
|
||||||
|
let orderHash: string;
|
||||||
try {
|
try {
|
||||||
const order = JSON.parse(orderJSON);
|
const order = JSON.parse(orderJSON);
|
||||||
const validationResult = this._validator.validate(order, orderSchema);
|
const validationResult = validator.validate(order, portalOrderSchema);
|
||||||
if (validationResult.errors.length > 0) {
|
if (validationResult.errors.length > 0) {
|
||||||
orderJSONErrMsg = 'Submitted order JSON is not a valid order';
|
orderJSONErrMsg = 'Submitted order JSON is not a valid order';
|
||||||
utils.consoleLog(`Unexpected order JSON validation error: ${validationResult.errors.join(', ')}`);
|
utils.consoleLog(`Unexpected order JSON validation error: ${validationResult.errors.join(', ')}`);
|
||||||
@@ -413,41 +408,36 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
}
|
}
|
||||||
parsedOrder = order;
|
parsedOrder = order;
|
||||||
|
|
||||||
const exchangeContractAddr = this.props.blockchain.getExchangeContractAddressIfExists();
|
const makerAmount = new BigNumber(parsedOrder.signedOrder.makerTokenAmount);
|
||||||
const makerAmount = new BigNumber(parsedOrder.maker.amount);
|
const takerAmount = new BigNumber(parsedOrder.signedOrder.takerTokenAmount);
|
||||||
const takerAmount = new BigNumber(parsedOrder.taker.amount);
|
const expiration = new BigNumber(parsedOrder.signedOrder.expirationUnixTimestampSec);
|
||||||
const expiration = new BigNumber(parsedOrder.expiration);
|
const salt = new BigNumber(parsedOrder.signedOrder.salt);
|
||||||
const salt = new BigNumber(parsedOrder.salt);
|
const parsedMakerFee = new BigNumber(parsedOrder.signedOrder.makerFee);
|
||||||
const parsedMakerFee = new BigNumber(parsedOrder.maker.feeAmount);
|
const parsedTakerFee = new BigNumber(parsedOrder.signedOrder.takerFee);
|
||||||
const parsedTakerFee = new BigNumber(parsedOrder.taker.feeAmount);
|
|
||||||
|
|
||||||
const zeroExOrder: ZeroExOrder = {
|
const zeroExOrder: ZeroExOrder = {
|
||||||
exchangeContractAddress: parsedOrder.exchangeContract,
|
exchangeContractAddress: parsedOrder.signedOrder.exchangeContractAddress,
|
||||||
expirationUnixTimestampSec: expiration,
|
expirationUnixTimestampSec: expiration,
|
||||||
feeRecipient: parsedOrder.feeRecipient,
|
feeRecipient: parsedOrder.signedOrder.feeRecipient,
|
||||||
maker: parsedOrder.maker.address,
|
maker: parsedOrder.signedOrder.maker,
|
||||||
makerFee: parsedMakerFee,
|
makerFee: parsedMakerFee,
|
||||||
makerTokenAddress: parsedOrder.maker.token.address,
|
makerTokenAddress: parsedOrder.signedOrder.makerTokenAddress,
|
||||||
makerTokenAmount: makerAmount,
|
makerTokenAmount: makerAmount,
|
||||||
salt,
|
salt,
|
||||||
taker: _.isEmpty(parsedOrder.taker.address) ? constants.NULL_ADDRESS : parsedOrder.taker.address,
|
taker: _.isEmpty(parsedOrder.signedOrder.taker)
|
||||||
|
? constants.NULL_ADDRESS
|
||||||
|
: parsedOrder.signedOrder.taker,
|
||||||
takerFee: parsedTakerFee,
|
takerFee: parsedTakerFee,
|
||||||
takerTokenAddress: parsedOrder.taker.token.address,
|
takerTokenAddress: parsedOrder.signedOrder.takerTokenAddress,
|
||||||
takerTokenAmount: takerAmount,
|
takerTokenAmount: takerAmount,
|
||||||
};
|
};
|
||||||
const orderHash = ZeroEx.getOrderHashHex(zeroExOrder);
|
orderHash = ZeroEx.getOrderHashHex(zeroExOrder);
|
||||||
|
|
||||||
const signature = parsedOrder.signature;
|
const exchangeContractAddr = this.props.blockchain.getExchangeContractAddressIfExists();
|
||||||
const isValidSignature = ZeroEx.isValidSignature(signature.hash, signature, parsedOrder.maker.address);
|
const signature = parsedOrder.signedOrder.ecSignature;
|
||||||
if (this.props.networkId !== parsedOrder.networkId) {
|
const isValidSignature = ZeroEx.isValidSignature(orderHash, signature, parsedOrder.signedOrder.maker);
|
||||||
orderJSONErrMsg = `This order was made on another Ethereum network
|
if (exchangeContractAddr !== parsedOrder.signedOrder.exchangeContractAddress) {
|
||||||
(id: ${parsedOrder.networkId}). Connect to this network to fill.`;
|
orderJSONErrMsg = 'This order was made on another network or using a deprecated Exchange contract';
|
||||||
parsedOrder = undefined;
|
|
||||||
} else if (exchangeContractAddr !== parsedOrder.exchangeContract) {
|
|
||||||
orderJSONErrMsg = 'This order was made using a deprecated 0x Exchange contract.';
|
|
||||||
parsedOrder = undefined;
|
|
||||||
} else if (orderHash !== signature.hash) {
|
|
||||||
orderJSONErrMsg = 'Order hash does not match supplied plaintext values';
|
|
||||||
parsedOrder = undefined;
|
parsedOrder = undefined;
|
||||||
} else if (!isValidSignature) {
|
} else if (!isValidSignature) {
|
||||||
orderJSONErrMsg = 'Order signature is invalid';
|
orderJSONErrMsg = 'Order signature is invalid';
|
||||||
@@ -478,13 +468,12 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
// Clear cache entry if user updates orderJSON to invalid entry
|
// Clear cache entry if user updates orderJSON to invalid entry
|
||||||
this.props.dispatcher.updateUserSuppliedOrderCache(undefined);
|
this.props.dispatcher.updateUserSuppliedOrderCache(undefined);
|
||||||
} else {
|
} else {
|
||||||
const orderHash = parsedOrder.signature.hash;
|
|
||||||
unavailableTakerAmount = await this.props.blockchain.getUnavailableTakerAmountAsync(orderHash);
|
unavailableTakerAmount = await this.props.blockchain.getUnavailableTakerAmountAsync(orderHash);
|
||||||
const isMakerTokenAddressInRegistry = await this.props.blockchain.isAddressInTokenRegistryAsync(
|
const isMakerTokenAddressInRegistry = await this.props.blockchain.isAddressInTokenRegistryAsync(
|
||||||
parsedOrder.maker.token.address,
|
parsedOrder.signedOrder.makerTokenAddress,
|
||||||
);
|
);
|
||||||
const isTakerTokenAddressInRegistry = await this.props.blockchain.isAddressInTokenRegistryAsync(
|
const isTakerTokenAddressInRegistry = await this.props.blockchain.isAddressInTokenRegistryAsync(
|
||||||
parsedOrder.taker.token.address,
|
parsedOrder.signedOrder.takerTokenAddress,
|
||||||
);
|
);
|
||||||
this.setState({
|
this.setState({
|
||||||
isMakerTokenAddressInRegistry,
|
isMakerTokenAddressInRegistry,
|
||||||
@@ -529,20 +518,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
globalErrMsg = 'You must specify a fill amount';
|
globalErrMsg = 'You must specify a fill amount';
|
||||||
}
|
}
|
||||||
|
|
||||||
const signedOrder = this.props.blockchain.portalOrderToSignedOrder(
|
const signedOrder = this.props.blockchain.portalOrderToZeroExOrder(parsedOrder);
|
||||||
parsedOrder.maker.address,
|
|
||||||
parsedOrder.taker.address,
|
|
||||||
parsedOrder.maker.token.address,
|
|
||||||
parsedOrder.taker.token.address,
|
|
||||||
new BigNumber(parsedOrder.maker.amount),
|
|
||||||
new BigNumber(parsedOrder.taker.amount),
|
|
||||||
new BigNumber(parsedOrder.maker.feeAmount),
|
|
||||||
new BigNumber(parsedOrder.taker.feeAmount),
|
|
||||||
new BigNumber(this.state.parsedOrder.expiration),
|
|
||||||
parsedOrder.feeRecipient,
|
|
||||||
parsedOrder.signature,
|
|
||||||
new BigNumber(parsedOrder.salt),
|
|
||||||
);
|
|
||||||
if (_.isEmpty(globalErrMsg)) {
|
if (_.isEmpty(globalErrMsg)) {
|
||||||
try {
|
try {
|
||||||
await this.props.blockchain.validateFillOrderThrowIfInvalidAsync(
|
await this.props.blockchain.validateFillOrderThrowIfInvalidAsync(
|
||||||
@@ -551,7 +527,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
this.props.userAddress,
|
this.props.userAddress,
|
||||||
);
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
globalErrMsg = utils.zeroExErrToHumanReadableErrMsg(err.message, parsedOrder.taker.address);
|
globalErrMsg = utils.zeroExErrToHumanReadableErrMsg(err.message, parsedOrder.signedOrder.taker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!_.isEmpty(globalErrMsg)) {
|
if (!_.isEmpty(globalErrMsg)) {
|
||||||
@@ -562,7 +538,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const networkName = constants.NETWORK_NAME_BY_ID[this.props.networkId];
|
const networkName = constants.NETWORK_NAME_BY_ID[this.props.networkId];
|
||||||
const eventLabel = `${parsedOrder.taker.token.symbol}-${networkName}`;
|
const eventLabel = `${parsedOrder.metadata.takerToken.symbol}-${networkName}`;
|
||||||
try {
|
try {
|
||||||
const orderFilledAmount: BigNumber = await this.props.blockchain.fillOrderAsync(
|
const orderFilledAmount: BigNumber = await this.props.blockchain.fillOrderAsync(
|
||||||
signedOrder,
|
signedOrder,
|
||||||
@@ -572,7 +548,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
category: 'Portal',
|
category: 'Portal',
|
||||||
action: 'Fill Order Success',
|
action: 'Fill Order Success',
|
||||||
label: eventLabel,
|
label: eventLabel,
|
||||||
value: parsedOrder.taker.amount,
|
value: parsedOrder.signedOrder.takerTokenAmount,
|
||||||
});
|
});
|
||||||
// After fill completes, let's force fetch the token balances
|
// After fill completes, let's force fetch the token balances
|
||||||
this.props.dispatcher.forceTokenStateRefetch();
|
this.props.dispatcher.forceTokenStateRefetch();
|
||||||
@@ -591,7 +567,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
category: 'Portal',
|
category: 'Portal',
|
||||||
action: 'Fill Order Failure',
|
action: 'Fill Order Failure',
|
||||||
label: eventLabel,
|
label: eventLabel,
|
||||||
value: parsedOrder.taker.amount,
|
value: parsedOrder.signedOrder.takerTokenAmount,
|
||||||
});
|
});
|
||||||
const errMsg = `${err}`;
|
const errMsg = `${err}`;
|
||||||
if (utils.didUserDenyWeb3Request(errMsg)) {
|
if (utils.didUserDenyWeb3Request(errMsg)) {
|
||||||
@@ -618,7 +594,6 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const parsedOrder = this.state.parsedOrder;
|
const parsedOrder = this.state.parsedOrder;
|
||||||
const orderHash = parsedOrder.signature.hash;
|
|
||||||
const takerAddress = this.props.userAddress;
|
const takerAddress = this.props.userAddress;
|
||||||
|
|
||||||
if (_.isUndefined(takerAddress)) {
|
if (_.isUndefined(takerAddress)) {
|
||||||
@@ -630,28 +605,16 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
}
|
}
|
||||||
let globalErrMsg = '';
|
let globalErrMsg = '';
|
||||||
|
|
||||||
const takerTokenAmount = new BigNumber(parsedOrder.taker.amount);
|
const takerTokenAmount = new BigNumber(parsedOrder.signedOrder.takerTokenAmount);
|
||||||
|
|
||||||
const signedOrder = this.props.blockchain.portalOrderToSignedOrder(
|
const signedOrder = this.props.blockchain.portalOrderToZeroExOrder(parsedOrder);
|
||||||
parsedOrder.maker.address,
|
const orderHash = ZeroEx.getOrderHashHex(signedOrder);
|
||||||
parsedOrder.taker.address,
|
|
||||||
parsedOrder.maker.token.address,
|
|
||||||
parsedOrder.taker.token.address,
|
|
||||||
new BigNumber(parsedOrder.maker.amount),
|
|
||||||
takerTokenAmount,
|
|
||||||
new BigNumber(parsedOrder.maker.feeAmount),
|
|
||||||
new BigNumber(parsedOrder.taker.feeAmount),
|
|
||||||
new BigNumber(this.state.parsedOrder.expiration),
|
|
||||||
parsedOrder.feeRecipient,
|
|
||||||
parsedOrder.signature,
|
|
||||||
new BigNumber(parsedOrder.salt),
|
|
||||||
);
|
|
||||||
const unavailableTakerAmount = await this.props.blockchain.getUnavailableTakerAmountAsync(orderHash);
|
const unavailableTakerAmount = await this.props.blockchain.getUnavailableTakerAmountAsync(orderHash);
|
||||||
const availableTakerTokenAmount = takerTokenAmount.minus(unavailableTakerAmount);
|
const availableTakerTokenAmount = takerTokenAmount.minus(unavailableTakerAmount);
|
||||||
try {
|
try {
|
||||||
await this.props.blockchain.validateCancelOrderThrowIfInvalidAsync(signedOrder, availableTakerTokenAmount);
|
await this.props.blockchain.validateCancelOrderThrowIfInvalidAsync(signedOrder, availableTakerTokenAmount);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
globalErrMsg = utils.zeroExErrToHumanReadableErrMsg(err.message, parsedOrder.taker.address);
|
globalErrMsg = utils.zeroExErrToHumanReadableErrMsg(err.message, parsedOrder.signedOrder.taker);
|
||||||
}
|
}
|
||||||
if (!_.isEmpty(globalErrMsg)) {
|
if (!_.isEmpty(globalErrMsg)) {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -661,7 +624,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const networkName = constants.NETWORK_NAME_BY_ID[this.props.networkId];
|
const networkName = constants.NETWORK_NAME_BY_ID[this.props.networkId];
|
||||||
const eventLabel = `${parsedOrder.maker.token.symbol}-${networkName}`;
|
const eventLabel = `${parsedOrder.metadata.makerToken.symbol}-${networkName}`;
|
||||||
try {
|
try {
|
||||||
await this.props.blockchain.cancelOrderAsync(signedOrder, availableTakerTokenAmount);
|
await this.props.blockchain.cancelOrderAsync(signedOrder, availableTakerTokenAmount);
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -674,7 +637,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
category: 'Portal',
|
category: 'Portal',
|
||||||
action: 'Cancel Order Success',
|
action: 'Cancel Order Success',
|
||||||
label: eventLabel,
|
label: eventLabel,
|
||||||
value: parsedOrder.maker.amount,
|
value: parsedOrder.signedOrder.makerTokenAmount,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -689,7 +652,7 @@ export class FillOrder extends React.Component<FillOrderProps, FillOrderState> {
|
|||||||
category: 'Portal',
|
category: 'Portal',
|
||||||
action: 'Cancel Order Failure',
|
action: 'Cancel Order Failure',
|
||||||
label: eventLabel,
|
label: eventLabel,
|
||||||
value: parsedOrder.maker.amount,
|
value: parsedOrder.signedOrder.makerTokenAmount,
|
||||||
});
|
});
|
||||||
globalErrMsg = 'Failed to cancel order, please refresh and try again';
|
globalErrMsg = 'Failed to cancel order, please refresh and try again';
|
||||||
utils.consoleLog(`${err}`);
|
utils.consoleLog(`${err}`);
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ import { utils } from 'ts/utils/utils';
|
|||||||
interface FillOrderJSONProps {
|
interface FillOrderJSONProps {
|
||||||
blockchain: Blockchain;
|
blockchain: Blockchain;
|
||||||
tokenByAddress: TokenByAddress;
|
tokenByAddress: TokenByAddress;
|
||||||
networkId: number;
|
|
||||||
orderJSON: string;
|
orderJSON: string;
|
||||||
onFillOrderJSONChanged: (event: any) => void;
|
onFillOrderJSONChanged: (event: any) => void;
|
||||||
}
|
}
|
||||||
@@ -34,8 +33,7 @@ export class FillOrderJSON extends React.Component<FillOrderJSONProps, FillOrder
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
const hintOrderExpiryTimestamp = utils.initialOrderExpiryUnixTimestampSec();
|
const hintOrderExpiryTimestamp = utils.initialOrderExpiryUnixTimestampSec();
|
||||||
const hintSignatureData = {
|
const hintECSignature = {
|
||||||
hash: '0xf965a9978a0381ab58f5a2408ad967c...',
|
|
||||||
r: '0xf01103f759e2289a28593eaf22e5820032...',
|
r: '0xf01103f759e2289a28593eaf22e5820032...',
|
||||||
s: '937862111edcba395f8a9e0cc1b2c5e12320...',
|
s: '937862111edcba395f8a9e0cc1b2c5e12320...',
|
||||||
v: 27,
|
v: 27,
|
||||||
@@ -43,7 +41,6 @@ export class FillOrderJSON extends React.Component<FillOrderJSONProps, FillOrder
|
|||||||
const hintSalt = ZeroEx.generatePseudoRandomSalt();
|
const hintSalt = ZeroEx.generatePseudoRandomSalt();
|
||||||
const feeRecipient = constants.NULL_ADDRESS;
|
const feeRecipient = constants.NULL_ADDRESS;
|
||||||
const hintOrder = utils.generateOrder(
|
const hintOrder = utils.generateOrder(
|
||||||
this.props.networkId,
|
|
||||||
exchangeContract,
|
exchangeContract,
|
||||||
hintSideToAssetToken,
|
hintSideToAssetToken,
|
||||||
hintOrderExpiryTimestamp,
|
hintOrderExpiryTimestamp,
|
||||||
@@ -52,7 +49,7 @@ export class FillOrderJSON extends React.Component<FillOrderJSONProps, FillOrder
|
|||||||
constants.MAKER_FEE,
|
constants.MAKER_FEE,
|
||||||
constants.TAKER_FEE,
|
constants.TAKER_FEE,
|
||||||
feeRecipient,
|
feeRecipient,
|
||||||
hintSignatureData,
|
hintECSignature,
|
||||||
this.props.tokenByAddress,
|
this.props.tokenByAddress,
|
||||||
hintSalt,
|
hintSalt,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Order, ZeroEx } from '0x.js';
|
import { ECSignature, Order, ZeroEx } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import Dialog from 'material-ui/Dialog';
|
import Dialog from 'material-ui/Dialog';
|
||||||
@@ -17,18 +17,9 @@ import { HelpTooltip } from 'ts/components/ui/help_tooltip';
|
|||||||
import { LifeCycleRaisedButton } from 'ts/components/ui/lifecycle_raised_button';
|
import { LifeCycleRaisedButton } from 'ts/components/ui/lifecycle_raised_button';
|
||||||
import { SwapIcon } from 'ts/components/ui/swap_icon';
|
import { SwapIcon } from 'ts/components/ui/swap_icon';
|
||||||
import { Dispatcher } from 'ts/redux/dispatcher';
|
import { Dispatcher } from 'ts/redux/dispatcher';
|
||||||
import { orderSchema } from 'ts/schemas/order_schema';
|
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
|
||||||
import { SchemaValidator } from 'ts/schemas/validator';
|
import { validator } from 'ts/schemas/validator';
|
||||||
import {
|
import { AlertTypes, BlockchainErrs, HashData, Side, SideToAssetToken, Token, TokenByAddress } from 'ts/types';
|
||||||
AlertTypes,
|
|
||||||
BlockchainErrs,
|
|
||||||
HashData,
|
|
||||||
Side,
|
|
||||||
SideToAssetToken,
|
|
||||||
SignatureData,
|
|
||||||
Token,
|
|
||||||
TokenByAddress,
|
|
||||||
} from 'ts/types';
|
|
||||||
import { colors } from 'ts/utils/colors';
|
import { colors } from 'ts/utils/colors';
|
||||||
import { constants } from 'ts/utils/constants';
|
import { constants } from 'ts/utils/constants';
|
||||||
import { errorReporter } from 'ts/utils/error_reporter';
|
import { errorReporter } from 'ts/utils/error_reporter';
|
||||||
@@ -49,7 +40,7 @@ interface GenerateOrderFormProps {
|
|||||||
orderExpiryTimestamp: BigNumber;
|
orderExpiryTimestamp: BigNumber;
|
||||||
networkId: number;
|
networkId: number;
|
||||||
userAddress: string;
|
userAddress: string;
|
||||||
orderSignatureData: SignatureData;
|
orderECSignature: ECSignature;
|
||||||
orderTakerAddress: string;
|
orderTakerAddress: string;
|
||||||
orderSalt: BigNumber;
|
orderSalt: BigNumber;
|
||||||
sideToAssetToken: SideToAssetToken;
|
sideToAssetToken: SideToAssetToken;
|
||||||
@@ -64,7 +55,6 @@ interface GenerateOrderFormState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, GenerateOrderFormState> {
|
export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, GenerateOrderFormState> {
|
||||||
private _validator: SchemaValidator;
|
|
||||||
constructor(props: GenerateOrderFormProps) {
|
constructor(props: GenerateOrderFormProps) {
|
||||||
super(props);
|
super(props);
|
||||||
this.state = {
|
this.state = {
|
||||||
@@ -72,7 +62,6 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
shouldShowIncompleteErrs: false,
|
shouldShowIncompleteErrs: false,
|
||||||
signingState: SigningState.UNSIGNED,
|
signingState: SigningState.UNSIGNED,
|
||||||
};
|
};
|
||||||
this._validator = new SchemaValidator();
|
|
||||||
}
|
}
|
||||||
public componentDidMount() {
|
public componentDidMount() {
|
||||||
window.scrollTo(0, 0);
|
window.scrollTo(0, 0);
|
||||||
@@ -88,6 +77,8 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
allowed to fill this order. If no taker is<br> \
|
allowed to fill this order. If no taker is<br> \
|
||||||
specified, anyone is able to fill it.';
|
specified, anyone is able to fill it.';
|
||||||
const exchangeContractIfExists = this.props.blockchain.getExchangeContractAddressIfExists();
|
const exchangeContractIfExists = this.props.blockchain.getExchangeContractAddressIfExists();
|
||||||
|
const initialTakerAddress =
|
||||||
|
this.props.orderTakerAddress === ZeroEx.NULL_ADDRESS ? '' : this.props.orderTakerAddress;
|
||||||
return (
|
return (
|
||||||
<div className="clearfix mb2 lg-px4 md-px4 sm-px2">
|
<div className="clearfix mb2 lg-px4 md-px4 sm-px2">
|
||||||
<h3>Generate an order</h3>
|
<h3>Generate an order</h3>
|
||||||
@@ -168,7 +159,7 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
<div className="pt1 flex mx-auto">
|
<div className="pt1 flex mx-auto">
|
||||||
<IdenticonAddressInput
|
<IdenticonAddressInput
|
||||||
label="Taker"
|
label="Taker"
|
||||||
initialAddress={this.props.orderTakerAddress}
|
initialAddress={initialTakerAddress}
|
||||||
updateOrderAddress={this._updateOrderAddress.bind(this)}
|
updateOrderAddress={this._updateOrderAddress.bind(this)}
|
||||||
/>
|
/>
|
||||||
<div className="pt3">
|
<div className="pt3">
|
||||||
@@ -209,14 +200,13 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
<OrderJSON
|
<OrderJSON
|
||||||
exchangeContractIfExists={exchangeContractIfExists}
|
exchangeContractIfExists={exchangeContractIfExists}
|
||||||
orderExpiryTimestamp={this.props.orderExpiryTimestamp}
|
orderExpiryTimestamp={this.props.orderExpiryTimestamp}
|
||||||
orderSignatureData={this.props.orderSignatureData}
|
orderECSignature={this.props.orderECSignature}
|
||||||
orderTakerAddress={this.props.orderTakerAddress}
|
orderTakerAddress={this.props.orderTakerAddress}
|
||||||
orderMakerAddress={this.props.userAddress}
|
orderMakerAddress={this.props.userAddress}
|
||||||
orderSalt={this.props.orderSalt}
|
orderSalt={this.props.orderSalt}
|
||||||
orderMakerFee={this.props.hashData.makerFee}
|
orderMakerFee={this.props.hashData.makerFee}
|
||||||
orderTakerFee={this.props.hashData.takerFee}
|
orderTakerFee={this.props.hashData.takerFee}
|
||||||
orderFeeRecipient={this.props.hashData.feeRecipientAddress}
|
orderFeeRecipient={this.props.hashData.feeRecipientAddress}
|
||||||
networkId={this.props.networkId}
|
|
||||||
sideToAssetToken={this.props.sideToAssetToken}
|
sideToAssetToken={this.props.sideToAssetToken}
|
||||||
tokenByAddress={this.props.tokenByAddress}
|
tokenByAddress={this.props.tokenByAddress}
|
||||||
/>
|
/>
|
||||||
@@ -327,9 +317,8 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
|
|
||||||
let globalErrMsg = '';
|
let globalErrMsg = '';
|
||||||
try {
|
try {
|
||||||
const signatureData = await this.props.blockchain.signOrderHashAsync(orderHash);
|
const ecSignature = await this.props.blockchain.signOrderHashAsync(orderHash);
|
||||||
const order = utils.generateOrder(
|
const order = utils.generateOrder(
|
||||||
this.props.networkId,
|
|
||||||
exchangeContractAddr,
|
exchangeContractAddr,
|
||||||
this.props.sideToAssetToken,
|
this.props.sideToAssetToken,
|
||||||
hashData.orderExpiryTimestamp,
|
hashData.orderExpiryTimestamp,
|
||||||
@@ -338,11 +327,11 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
hashData.makerFee,
|
hashData.makerFee,
|
||||||
hashData.takerFee,
|
hashData.takerFee,
|
||||||
hashData.feeRecipientAddress,
|
hashData.feeRecipientAddress,
|
||||||
signatureData,
|
ecSignature,
|
||||||
this.props.tokenByAddress,
|
this.props.tokenByAddress,
|
||||||
hashData.orderSalt,
|
hashData.orderSalt,
|
||||||
);
|
);
|
||||||
const validationResult = this._validator.validate(order, orderSchema);
|
const validationResult = validator.validate(order, portalOrderSchema);
|
||||||
if (validationResult.errors.length > 0) {
|
if (validationResult.errors.length > 0) {
|
||||||
globalErrMsg = 'Order signing failed. Please refresh and try again';
|
globalErrMsg = 'Order signing failed. Please refresh and try again';
|
||||||
utils.consoleLog(`Unexpected error occured: Order validation failed:
|
utils.consoleLog(`Unexpected error occured: Order validation failed:
|
||||||
@@ -367,7 +356,8 @@ export class GenerateOrderForm extends React.Component<GenerateOrderFormProps, G
|
|||||||
}
|
}
|
||||||
private _updateOrderAddress(address?: string): void {
|
private _updateOrderAddress(address?: string): void {
|
||||||
if (!_.isUndefined(address)) {
|
if (!_.isUndefined(address)) {
|
||||||
this.props.dispatcher.updateOrderTakerAddress(address);
|
const normalizedAddress = _.isEmpty(address) ? ZeroEx.NULL_ADDRESS : address;
|
||||||
|
this.props.dispatcher.updateOrderTakerAddress(normalizedAddress);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
import { ECSignature } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import Paper from 'material-ui/Paper';
|
import Paper from 'material-ui/Paper';
|
||||||
import TextField from 'material-ui/TextField';
|
import TextField from 'material-ui/TextField';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { CopyIcon } from 'ts/components/ui/copy_icon';
|
import { CopyIcon } from 'ts/components/ui/copy_icon';
|
||||||
import { SideToAssetToken, SignatureData, TokenByAddress, WebsitePaths } from 'ts/types';
|
import { SideToAssetToken, TokenByAddress, WebsitePaths } from 'ts/types';
|
||||||
import { configs } from 'ts/utils/configs';
|
import { configs } from 'ts/utils/configs';
|
||||||
import { constants } from 'ts/utils/constants';
|
import { constants } from 'ts/utils/constants';
|
||||||
import { errorReporter } from 'ts/utils/error_reporter';
|
import { errorReporter } from 'ts/utils/error_reporter';
|
||||||
@@ -13,14 +14,13 @@ import { utils } from 'ts/utils/utils';
|
|||||||
interface OrderJSONProps {
|
interface OrderJSONProps {
|
||||||
exchangeContractIfExists: string;
|
exchangeContractIfExists: string;
|
||||||
orderExpiryTimestamp: BigNumber;
|
orderExpiryTimestamp: BigNumber;
|
||||||
orderSignatureData: SignatureData;
|
orderECSignature: ECSignature;
|
||||||
orderTakerAddress: string;
|
orderTakerAddress: string;
|
||||||
orderMakerAddress: string;
|
orderMakerAddress: string;
|
||||||
orderSalt: BigNumber;
|
orderSalt: BigNumber;
|
||||||
orderMakerFee: BigNumber;
|
orderMakerFee: BigNumber;
|
||||||
orderTakerFee: BigNumber;
|
orderTakerFee: BigNumber;
|
||||||
orderFeeRecipient: string;
|
orderFeeRecipient: string;
|
||||||
networkId: number;
|
|
||||||
sideToAssetToken: SideToAssetToken;
|
sideToAssetToken: SideToAssetToken;
|
||||||
tokenByAddress: TokenByAddress;
|
tokenByAddress: TokenByAddress;
|
||||||
}
|
}
|
||||||
@@ -40,7 +40,6 @@ export class OrderJSON extends React.Component<OrderJSONProps, OrderJSONState> {
|
|||||||
}
|
}
|
||||||
public render() {
|
public render() {
|
||||||
const order = utils.generateOrder(
|
const order = utils.generateOrder(
|
||||||
this.props.networkId,
|
|
||||||
this.props.exchangeContractIfExists,
|
this.props.exchangeContractIfExists,
|
||||||
this.props.sideToAssetToken,
|
this.props.sideToAssetToken,
|
||||||
this.props.orderExpiryTimestamp,
|
this.props.orderExpiryTimestamp,
|
||||||
@@ -49,7 +48,7 @@ export class OrderJSON extends React.Component<OrderJSONProps, OrderJSONState> {
|
|||||||
this.props.orderMakerFee,
|
this.props.orderMakerFee,
|
||||||
this.props.orderTakerFee,
|
this.props.orderTakerFee,
|
||||||
this.props.orderFeeRecipient,
|
this.props.orderFeeRecipient,
|
||||||
this.props.orderSignatureData,
|
this.props.orderECSignature,
|
||||||
this.props.tokenByAddress,
|
this.props.tokenByAddress,
|
||||||
this.props.orderSalt,
|
this.props.orderSalt,
|
||||||
);
|
);
|
||||||
@@ -162,7 +161,6 @@ You can see and fill it here: ${this.state.shareLink}`);
|
|||||||
}
|
}
|
||||||
private _getOrderUrl() {
|
private _getOrderUrl() {
|
||||||
const order = utils.generateOrder(
|
const order = utils.generateOrder(
|
||||||
this.props.networkId,
|
|
||||||
this.props.exchangeContractIfExists,
|
this.props.exchangeContractIfExists,
|
||||||
this.props.sideToAssetToken,
|
this.props.sideToAssetToken,
|
||||||
this.props.orderExpiryTimestamp,
|
this.props.orderExpiryTimestamp,
|
||||||
@@ -171,7 +169,7 @@ You can see and fill it here: ${this.state.shareLink}`);
|
|||||||
this.props.orderMakerFee,
|
this.props.orderMakerFee,
|
||||||
this.props.orderTakerFee,
|
this.props.orderTakerFee,
|
||||||
this.props.orderFeeRecipient,
|
this.props.orderFeeRecipient,
|
||||||
this.props.orderSignatureData,
|
this.props.orderECSignature,
|
||||||
this.props.tokenByAddress,
|
this.props.tokenByAddress,
|
||||||
this.props.orderSalt,
|
this.props.orderSalt,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ import { FlashMessage } from 'ts/components/ui/flash_message';
|
|||||||
import { GenerateOrderForm } from 'ts/containers/generate_order_form';
|
import { GenerateOrderForm } from 'ts/containers/generate_order_form';
|
||||||
import { localStorage } from 'ts/local_storage/local_storage';
|
import { localStorage } from 'ts/local_storage/local_storage';
|
||||||
import { Dispatcher } from 'ts/redux/dispatcher';
|
import { Dispatcher } from 'ts/redux/dispatcher';
|
||||||
import { orderSchema } from 'ts/schemas/order_schema';
|
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
|
||||||
import { SchemaValidator } from 'ts/schemas/validator';
|
import { validator } from 'ts/schemas/validator';
|
||||||
import { BlockchainErrs, HashData, Order, ProviderType, ScreenWidths, TokenByAddress, WebsitePaths } from 'ts/types';
|
import { BlockchainErrs, HashData, Order, ProviderType, ScreenWidths, TokenByAddress, WebsitePaths } from 'ts/types';
|
||||||
import { colors } from 'ts/utils/colors';
|
import { colors } from 'ts/utils/colors';
|
||||||
import { configs } from 'ts/utils/configs';
|
import { configs } from 'ts/utils/configs';
|
||||||
@@ -367,9 +367,8 @@ export class Portal extends React.Component<PortalAllProps, PortalAllState> {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const validator = new SchemaValidator();
|
|
||||||
const order = JSON.parse(decodeURIComponent(orderPair[1]));
|
const order = JSON.parse(decodeURIComponent(orderPair[1]));
|
||||||
const validationResult = validator.validate(order, orderSchema);
|
const validationResult = validator.validate(order, portalOrderSchema);
|
||||||
if (validationResult.errors.length > 0) {
|
if (validationResult.errors.length > 0) {
|
||||||
utils.consoleLog(`Invalid shared order: ${validationResult.errors}`);
|
utils.consoleLog(`Invalid shared order: ${validationResult.errors}`);
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import { utils } from 'ts/utils/utils';
|
|||||||
const PRECISION = 5;
|
const PRECISION = 5;
|
||||||
|
|
||||||
interface VisualOrderProps {
|
interface VisualOrderProps {
|
||||||
orderTakerAddress: string;
|
|
||||||
orderMakerAddress: string;
|
|
||||||
makerAssetToken: AssetToken;
|
makerAssetToken: AssetToken;
|
||||||
takerAssetToken: AssetToken;
|
takerAssetToken: AssetToken;
|
||||||
makerToken: Token;
|
makerToken: Token;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { ECSignature } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
@@ -6,7 +7,7 @@ import { Blockchain } from 'ts/blockchain';
|
|||||||
import { GenerateOrderForm as GenerateOrderFormComponent } from 'ts/components/generate_order/generate_order_form';
|
import { GenerateOrderForm as GenerateOrderFormComponent } from 'ts/components/generate_order/generate_order_form';
|
||||||
import { Dispatcher } from 'ts/redux/dispatcher';
|
import { Dispatcher } from 'ts/redux/dispatcher';
|
||||||
import { State } from 'ts/redux/reducer';
|
import { State } from 'ts/redux/reducer';
|
||||||
import { BlockchainErrs, HashData, SideToAssetToken, SignatureData, TokenByAddress } from 'ts/types';
|
import { BlockchainErrs, HashData, SideToAssetToken, TokenByAddress } from 'ts/types';
|
||||||
|
|
||||||
interface GenerateOrderFormProps {
|
interface GenerateOrderFormProps {
|
||||||
blockchain: Blockchain;
|
blockchain: Blockchain;
|
||||||
@@ -18,7 +19,7 @@ interface ConnectedState {
|
|||||||
blockchainErr: BlockchainErrs;
|
blockchainErr: BlockchainErrs;
|
||||||
blockchainIsLoaded: boolean;
|
blockchainIsLoaded: boolean;
|
||||||
orderExpiryTimestamp: BigNumber;
|
orderExpiryTimestamp: BigNumber;
|
||||||
orderSignatureData: SignatureData;
|
orderECSignature: ECSignature;
|
||||||
userAddress: string;
|
userAddress: string;
|
||||||
orderTakerAddress: string;
|
orderTakerAddress: string;
|
||||||
orderSalt: BigNumber;
|
orderSalt: BigNumber;
|
||||||
@@ -32,7 +33,7 @@ const mapStateToProps = (state: State, ownProps: GenerateOrderFormProps): Connec
|
|||||||
blockchainErr: state.blockchainErr,
|
blockchainErr: state.blockchainErr,
|
||||||
blockchainIsLoaded: state.blockchainIsLoaded,
|
blockchainIsLoaded: state.blockchainIsLoaded,
|
||||||
orderExpiryTimestamp: state.orderExpiryTimestamp,
|
orderExpiryTimestamp: state.orderExpiryTimestamp,
|
||||||
orderSignatureData: state.orderSignatureData,
|
orderECSignature: state.orderECSignature,
|
||||||
orderTakerAddress: state.orderTakerAddress,
|
orderTakerAddress: state.orderTakerAddress,
|
||||||
orderSalt: state.orderSalt,
|
orderSalt: state.orderSalt,
|
||||||
networkId: state.networkId,
|
networkId: state.networkId,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { ECSignature } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import { Dispatch } from 'redux';
|
import { Dispatch } from 'redux';
|
||||||
import { State } from 'ts/redux/reducer';
|
import { State } from 'ts/redux/reducer';
|
||||||
@@ -10,7 +11,6 @@ import {
|
|||||||
ScreenWidths,
|
ScreenWidths,
|
||||||
Side,
|
Side,
|
||||||
SideToAssetToken,
|
SideToAssetToken,
|
||||||
SignatureData,
|
|
||||||
Token,
|
Token,
|
||||||
TokenByAddress,
|
TokenByAddress,
|
||||||
} from 'ts/types';
|
} from 'ts/types';
|
||||||
@@ -148,10 +148,10 @@ export class Dispatcher {
|
|||||||
type: ActionTypes.ForceTokenStateRefetch,
|
type: ActionTypes.ForceTokenStateRefetch,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public updateSignatureData(signatureData: SignatureData) {
|
public updateECSignature(ecSignature: ECSignature) {
|
||||||
this._dispatch({
|
this._dispatch({
|
||||||
data: signatureData,
|
data: ecSignature,
|
||||||
type: ActionTypes.UpdateOrderSignatureData,
|
type: ActionTypes.UpdateOrderECSignature,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
public updateUserEtherBalance(balance: BigNumber) {
|
public updateUserEtherBalance(balance: BigNumber) {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ZeroEx } from '0x.js';
|
import { ECSignature, ZeroEx } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
ScreenWidths,
|
ScreenWidths,
|
||||||
Side,
|
Side,
|
||||||
SideToAssetToken,
|
SideToAssetToken,
|
||||||
SignatureData,
|
|
||||||
TokenByAddress,
|
TokenByAddress,
|
||||||
} from 'ts/types';
|
} from 'ts/types';
|
||||||
import { utils } from 'ts/utils/utils';
|
import { utils } from 'ts/utils/utils';
|
||||||
@@ -29,7 +28,7 @@ export interface State {
|
|||||||
orderExpiryTimestamp: BigNumber;
|
orderExpiryTimestamp: BigNumber;
|
||||||
orderFillAmount: BigNumber;
|
orderFillAmount: BigNumber;
|
||||||
orderTakerAddress: string;
|
orderTakerAddress: string;
|
||||||
orderSignatureData: SignatureData;
|
orderECSignature: ECSignature;
|
||||||
orderSalt: BigNumber;
|
orderSalt: BigNumber;
|
||||||
nodeVersion: string;
|
nodeVersion: string;
|
||||||
screenWidth: ScreenWidths;
|
screenWidth: ScreenWidths;
|
||||||
@@ -59,13 +58,12 @@ const INITIAL_STATE: State = {
|
|||||||
networkId: undefined,
|
networkId: undefined,
|
||||||
orderExpiryTimestamp: utils.initialOrderExpiryUnixTimestampSec(),
|
orderExpiryTimestamp: utils.initialOrderExpiryUnixTimestampSec(),
|
||||||
orderFillAmount: undefined,
|
orderFillAmount: undefined,
|
||||||
orderSignatureData: {
|
orderECSignature: {
|
||||||
hash: '',
|
|
||||||
r: '',
|
r: '',
|
||||||
s: '',
|
s: '',
|
||||||
v: 27,
|
v: 27,
|
||||||
},
|
},
|
||||||
orderTakerAddress: '',
|
orderTakerAddress: ZeroEx.NULL_ADDRESS,
|
||||||
orderSalt: ZeroEx.generatePseudoRandomSalt(),
|
orderSalt: ZeroEx.generatePseudoRandomSalt(),
|
||||||
nodeVersion: undefined,
|
nodeVersion: undefined,
|
||||||
screenWidth: utils.getScreenWidth(),
|
screenWidth: utils.getScreenWidth(),
|
||||||
@@ -188,10 +186,10 @@ export function reducer(state: State = INITIAL_STATE, action: Action) {
|
|||||||
lastForceTokenStateRefetch: moment().unix(),
|
lastForceTokenStateRefetch: moment().unix(),
|
||||||
};
|
};
|
||||||
|
|
||||||
case ActionTypes.UpdateOrderSignatureData: {
|
case ActionTypes.UpdateOrderECSignature: {
|
||||||
return {
|
return {
|
||||||
...state,
|
...state,
|
||||||
orderSignatureData: action.data,
|
orderECSignature: action.data,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
9
packages/website/ts/schemas/metadata_schema.ts
Normal file
9
packages/website/ts/schemas/metadata_schema.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export const orderMetadataSchema = {
|
||||||
|
id: '/OrderMetadata',
|
||||||
|
properties: {
|
||||||
|
makerToken: { $ref: '/PortalTokenMetadata' },
|
||||||
|
takerToken: { $ref: '/PortalTokenMetadata' },
|
||||||
|
},
|
||||||
|
required: ['makerToken', 'takerToken'],
|
||||||
|
type: 'object',
|
||||||
|
};
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
export const orderSchema = {
|
|
||||||
id: '/Order',
|
|
||||||
properties: {
|
|
||||||
maker: { $ref: '/OrderTaker' },
|
|
||||||
taker: { $ref: '/OrderTaker' },
|
|
||||||
salt: { type: 'string' },
|
|
||||||
signature: { $ref: '/SignatureData' },
|
|
||||||
expiration: { type: 'string' },
|
|
||||||
feeRecipient: { type: 'string' },
|
|
||||||
exchangeContract: { type: 'string' },
|
|
||||||
networkId: { type: 'number' },
|
|
||||||
},
|
|
||||||
required: ['maker', 'taker', 'salt', 'signature', 'expiration', 'feeRecipient', 'exchangeContract', 'networkId'],
|
|
||||||
type: 'object',
|
|
||||||
};
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
export const orderTakerSchema = {
|
|
||||||
id: '/OrderTaker',
|
|
||||||
properties: {
|
|
||||||
address: { type: 'string' },
|
|
||||||
token: { $ref: '/Token' },
|
|
||||||
amount: { type: 'string' },
|
|
||||||
feeAmount: { type: 'string' },
|
|
||||||
},
|
|
||||||
required: ['address', 'token', 'amount', 'feeAmount'],
|
|
||||||
type: 'object',
|
|
||||||
};
|
|
||||||
9
packages/website/ts/schemas/portal_order_schema.ts
Normal file
9
packages/website/ts/schemas/portal_order_schema.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export const portalOrderSchema = {
|
||||||
|
id: '/PortalOrder',
|
||||||
|
properties: {
|
||||||
|
signedOrder: { $ref: '/SignedOrder' },
|
||||||
|
metadata: { $ref: '/OrderMetadata' },
|
||||||
|
},
|
||||||
|
required: ['signedOrder', 'metadata'],
|
||||||
|
type: 'object',
|
||||||
|
};
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
export const tokenSchema = {
|
export const portalTokenMetadataSchema = {
|
||||||
id: '/Token',
|
id: '/PortalTokenMetadata',
|
||||||
properties: {
|
properties: {
|
||||||
name: { type: 'string' },
|
name: { type: 'string' },
|
||||||
symbol: { type: 'string' },
|
symbol: { type: 'string' },
|
||||||
decimals: { type: 'number' },
|
decimals: { type: 'number' },
|
||||||
address: { type: 'string' },
|
|
||||||
},
|
},
|
||||||
required: ['name', 'symbol', 'decimals', 'address'],
|
required: ['name', 'symbol', 'decimals'],
|
||||||
type: 'object',
|
type: 'object',
|
||||||
};
|
};
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
export const signatureDataSchema = {
|
|
||||||
id: '/SignatureData',
|
|
||||||
properties: {
|
|
||||||
hash: { type: 'string' },
|
|
||||||
r: { type: 'string' },
|
|
||||||
s: { type: 'string' },
|
|
||||||
v: { type: 'number' },
|
|
||||||
},
|
|
||||||
required: ['hash', 'r', 's', 'v'],
|
|
||||||
type: 'object',
|
|
||||||
};
|
|
||||||
@@ -1,19 +1,12 @@
|
|||||||
|
import { SchemaValidator } from '@0xproject/json-schemas';
|
||||||
import { Schema as JSONSchema, Validator } from 'jsonschema';
|
import { Schema as JSONSchema, Validator } from 'jsonschema';
|
||||||
import { orderSchema } from 'ts/schemas/order_schema';
|
import { orderMetadataSchema } from 'ts/schemas/metadata_schema';
|
||||||
import { orderTakerSchema } from 'ts/schemas/order_taker_schema';
|
import { portalOrderSchema } from 'ts/schemas/portal_order_schema';
|
||||||
import { signatureDataSchema } from 'ts/schemas/signature_data_schema';
|
import { portalTokenMetadataSchema } from 'ts/schemas/portal_token_metadata';
|
||||||
import { tokenSchema } from 'ts/schemas/token_schema';
|
|
||||||
|
|
||||||
export class SchemaValidator {
|
const validator = new SchemaValidator();
|
||||||
private _validator: Validator;
|
validator.addSchema(portalTokenMetadataSchema);
|
||||||
constructor() {
|
validator.addSchema(orderMetadataSchema);
|
||||||
this._validator = new Validator();
|
validator.addSchema(portalOrderSchema);
|
||||||
this._validator.addSchema(signatureDataSchema as JSONSchema, signatureDataSchema.id);
|
|
||||||
this._validator.addSchema(tokenSchema as JSONSchema, tokenSchema.id);
|
export { validator };
|
||||||
this._validator.addSchema(orderTakerSchema as JSONSchema, orderTakerSchema.id);
|
|
||||||
this._validator.addSchema(orderSchema as JSONSchema, orderSchema.id);
|
|
||||||
}
|
|
||||||
public validate(instance: object, schema: Schema) {
|
|
||||||
return this._validator.validate(instance, schema);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { ECSignature } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
@@ -34,13 +35,6 @@ export interface SideToAssetToken {
|
|||||||
[side: string]: AssetToken;
|
[side: string]: AssetToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SignatureData {
|
|
||||||
hash: string;
|
|
||||||
r: string;
|
|
||||||
s: string;
|
|
||||||
v: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface HashData {
|
export interface HashData {
|
||||||
depositAmount: BigNumber;
|
depositAmount: BigNumber;
|
||||||
depositTokenContractAddr: string;
|
depositTokenContractAddr: string;
|
||||||
@@ -59,25 +53,32 @@ export interface OrderToken {
|
|||||||
name: string;
|
name: string;
|
||||||
symbol: string;
|
symbol: string;
|
||||||
decimals: number;
|
decimals: number;
|
||||||
address: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OrderParty {
|
export interface SignedOrder {
|
||||||
address: string;
|
maker: string;
|
||||||
token: OrderToken;
|
taker: string;
|
||||||
amount: string;
|
makerTokenAddress: string;
|
||||||
feeAmount: string;
|
takerTokenAddress: string;
|
||||||
|
makerFee: string;
|
||||||
|
takerFee: string;
|
||||||
|
makerTokenAmount: string;
|
||||||
|
takerTokenAmount: string;
|
||||||
|
expirationUnixTimestampSec: string;
|
||||||
|
feeRecipient: string;
|
||||||
|
salt: string;
|
||||||
|
ecSignature: ECSignature;
|
||||||
|
exchangeContractAddress: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface OrderMetadata {
|
||||||
|
makerToken: OrderToken;
|
||||||
|
takerToken: OrderToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Order {
|
export interface Order {
|
||||||
maker: OrderParty;
|
signedOrder: SignedOrder;
|
||||||
taker: OrderParty;
|
metadata: OrderMetadata;
|
||||||
expiration: string;
|
|
||||||
feeRecipient: string;
|
|
||||||
salt: string;
|
|
||||||
signature: SignatureData;
|
|
||||||
exchangeContract: string;
|
|
||||||
networkId: number;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Fill {
|
export interface Fill {
|
||||||
@@ -118,7 +119,7 @@ export enum ActionTypes {
|
|||||||
UpdateChosenAssetTokenAddress = 'UPDATE_CHOSEN_ASSET_TOKEN_ADDRESS',
|
UpdateChosenAssetTokenAddress = 'UPDATE_CHOSEN_ASSET_TOKEN_ADDRESS',
|
||||||
UpdateOrderTakerAddress = 'UPDATE_ORDER_TAKER_ADDRESS',
|
UpdateOrderTakerAddress = 'UPDATE_ORDER_TAKER_ADDRESS',
|
||||||
UpdateOrderSalt = 'UPDATE_ORDER_SALT',
|
UpdateOrderSalt = 'UPDATE_ORDER_SALT',
|
||||||
UpdateOrderSignatureData = 'UPDATE_ORDER_SIGNATURE_DATA',
|
UpdateOrderECSignature = 'UPDATE_ORDER_EC_SIGNATURE',
|
||||||
UpdateTokenByAddress = 'UPDATE_TOKEN_BY_ADDRESS',
|
UpdateTokenByAddress = 'UPDATE_TOKEN_BY_ADDRESS',
|
||||||
RemoveTokenFromTokenByAddress = 'REMOVE_TOKEN_FROM_TOKEN_BY_ADDRESS',
|
RemoveTokenFromTokenByAddress = 'REMOVE_TOKEN_FROM_TOKEN_BY_ADDRESS',
|
||||||
ForceTokenStateRefetch = 'FORCE_TOKEN_STATE_REFETCH',
|
ForceTokenStateRefetch = 'FORCE_TOKEN_STATE_REFETCH',
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ExchangeContractErrs, ZeroExError } from '0x.js';
|
import { ECSignature, ExchangeContractErrs, ZeroEx, ZeroExError } from '0x.js';
|
||||||
import { BigNumber } from '@0xproject/utils';
|
import { BigNumber } from '@0xproject/utils';
|
||||||
import deepEqual = require('deep-equal');
|
import deepEqual = require('deep-equal');
|
||||||
import isMobile = require('is-mobile');
|
import isMobile = require('is-mobile');
|
||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
ScreenWidths,
|
ScreenWidths,
|
||||||
Side,
|
Side,
|
||||||
SideToAssetToken,
|
SideToAssetToken,
|
||||||
SignatureData,
|
|
||||||
Token,
|
Token,
|
||||||
TokenByAddress,
|
TokenByAddress,
|
||||||
} from 'ts/types';
|
} from 'ts/types';
|
||||||
@@ -59,50 +58,48 @@ export const utils = {
|
|||||||
return formattedDate;
|
return formattedDate;
|
||||||
},
|
},
|
||||||
generateOrder(
|
generateOrder(
|
||||||
networkId: number,
|
exchangeContractAddress: string,
|
||||||
exchangeContract: string,
|
|
||||||
sideToAssetToken: SideToAssetToken,
|
sideToAssetToken: SideToAssetToken,
|
||||||
orderExpiryTimestamp: BigNumber,
|
expirationUnixTimestampSec: BigNumber,
|
||||||
orderTakerAddress: string,
|
orderTakerAddress: string,
|
||||||
orderMakerAddress: string,
|
orderMakerAddress: string,
|
||||||
makerFee: BigNumber,
|
makerFee: BigNumber,
|
||||||
takerFee: BigNumber,
|
takerFee: BigNumber,
|
||||||
feeRecipient: string,
|
feeRecipient: string,
|
||||||
signatureData: SignatureData,
|
ecSignature: ECSignature,
|
||||||
tokenByAddress: TokenByAddress,
|
tokenByAddress: TokenByAddress,
|
||||||
orderSalt: BigNumber,
|
orderSalt: BigNumber,
|
||||||
): Order {
|
): Order {
|
||||||
const makerToken = tokenByAddress[sideToAssetToken[Side.Deposit].address];
|
const makerToken = tokenByAddress[sideToAssetToken[Side.Deposit].address];
|
||||||
const takerToken = tokenByAddress[sideToAssetToken[Side.Receive].address];
|
const takerToken = tokenByAddress[sideToAssetToken[Side.Receive].address];
|
||||||
const order = {
|
const order = {
|
||||||
maker: {
|
signedOrder: {
|
||||||
address: orderMakerAddress,
|
maker: orderMakerAddress,
|
||||||
token: {
|
taker: orderTakerAddress,
|
||||||
|
makerFee: makerFee.toString(),
|
||||||
|
takerFee: takerFee.toString(),
|
||||||
|
makerTokenAmount: sideToAssetToken[Side.Deposit].amount.toString(),
|
||||||
|
takerTokenAmount: sideToAssetToken[Side.Receive].amount.toString(),
|
||||||
|
makerTokenAddress: makerToken.address,
|
||||||
|
takerTokenAddress: takerToken.address,
|
||||||
|
expirationUnixTimestampSec: expirationUnixTimestampSec.toString(),
|
||||||
|
feeRecipient,
|
||||||
|
salt: orderSalt.toString(),
|
||||||
|
ecSignature,
|
||||||
|
exchangeContractAddress,
|
||||||
|
},
|
||||||
|
metadata: {
|
||||||
|
makerToken: {
|
||||||
name: makerToken.name,
|
name: makerToken.name,
|
||||||
symbol: makerToken.symbol,
|
symbol: makerToken.symbol,
|
||||||
decimals: makerToken.decimals,
|
decimals: makerToken.decimals,
|
||||||
address: makerToken.address,
|
|
||||||
},
|
},
|
||||||
amount: sideToAssetToken[Side.Deposit].amount.toString(),
|
takerToken: {
|
||||||
feeAmount: makerFee.toString(),
|
|
||||||
},
|
|
||||||
taker: {
|
|
||||||
address: orderTakerAddress,
|
|
||||||
token: {
|
|
||||||
name: takerToken.name,
|
name: takerToken.name,
|
||||||
symbol: takerToken.symbol,
|
symbol: takerToken.symbol,
|
||||||
decimals: takerToken.decimals,
|
decimals: takerToken.decimals,
|
||||||
address: takerToken.address,
|
|
||||||
},
|
},
|
||||||
amount: sideToAssetToken[Side.Receive].amount.toString(),
|
|
||||||
feeAmount: takerFee.toString(),
|
|
||||||
},
|
},
|
||||||
expiration: orderExpiryTimestamp.toString(),
|
|
||||||
feeRecipient,
|
|
||||||
salt: orderSalt.toString(),
|
|
||||||
signature: signatureData,
|
|
||||||
exchangeContract,
|
|
||||||
networkId,
|
|
||||||
};
|
};
|
||||||
return order;
|
return order;
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user