aboutsummaryrefslogtreecommitdiffstats
path: root/packages/instant
diff options
context:
space:
mode:
authorBrandon Millman <brandon@0xproject.com>2018-10-27 04:24:04 +0800
committerGitHub <noreply@github.com>2018-10-27 04:24:04 +0800
commitae64fc15e0f490078cc99c28993970ff5db945d0 (patch)
tree2877617c1d0ccca7bf8ac9687f5108cc830920bc /packages/instant
parentaf91a56a5594d07d7da6caaeff79f5a7fb31ff98 (diff)
parent6f4dbc71f223f52c16320f3c65be92f99075dfec (diff)
downloaddexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar.gz
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar.bz2
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar.lz
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar.xz
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.tar.zst
dexon-sol-tools-ae64fc15e0f490078cc99c28993970ff5db945d0.zip
Merge pull request #1188 from 0xProject/fix/instant/quote-race-conditions
[instant] Make sure quote updates are consistent with the current state
Diffstat (limited to 'packages/instant')
-rw-r--r--packages/instant/src/redux/reducer.ts47
1 files changed, 41 insertions, 6 deletions
diff --git a/packages/instant/src/redux/reducer.ts b/packages/instant/src/redux/reducer.ts
index d7e5bdfb5..614ed21ac 100644
--- a/packages/instant/src/redux/reducer.ts
+++ b/packages/instant/src/redux/reducer.ts
@@ -1,6 +1,7 @@
import { AssetBuyer, BuyQuote } from '@0x/asset-buyer';
-import { ObjectMap } from '@0x/types';
+import { AssetProxyId, ObjectMap } from '@0x/types';
import { BigNumber } from '@0x/utils';
+import { Web3Wrapper } from '@0x/web3-wrapper';
import * as _ from 'lodash';
import { assetMetaDataMap } from '../data/asset_meta_data_map';
@@ -57,11 +58,19 @@ export const reducer = (state: State = INITIAL_STATE, action: Action): State =>
selectedAssetAmount: action.data,
};
case ActionTypes.UPDATE_LATEST_BUY_QUOTE:
- return {
- ...state,
- latestBuyQuote: action.data,
- quoteRequestState: AsyncProcessState.SUCCESS,
- };
+ const newBuyQuoteIfExists = action.data;
+ const shouldUpdate =
+ _.isUndefined(newBuyQuoteIfExists) || doesBuyQuoteMatchState(newBuyQuoteIfExists, state);
+ if (shouldUpdate) {
+ return {
+ ...state,
+ latestBuyQuote: newBuyQuoteIfExists,
+ quoteRequestState: AsyncProcessState.SUCCESS,
+ };
+ } else {
+ return state;
+ }
+
case ActionTypes.SET_QUOTE_REQUEST_STATE_PENDING:
return {
...state,
@@ -122,3 +131,29 @@ export const reducer = (state: State = INITIAL_STATE, action: Action): State =>
return state;
}
};
+
+const doesBuyQuoteMatchState = (buyQuote: BuyQuote, state: State): boolean => {
+ const selectedAssetIfExists = state.selectedAsset;
+ const selectedAssetAmountIfExists = state.selectedAssetAmount;
+ // if no selectedAsset or selectedAssetAmount exists on the current state, return false
+ if (_.isUndefined(selectedAssetIfExists) || _.isUndefined(selectedAssetAmountIfExists)) {
+ return false;
+ }
+ // if buyQuote's assetData does not match that of the current selected asset, return false
+ if (selectedAssetIfExists.assetData !== buyQuote.assetData) {
+ return false;
+ }
+ // if ERC20 and buyQuote's assetBuyAmount does not match selectedAssetAmount, return false
+ // if ERC721, return true
+ const selectedAssetMetaData = selectedAssetIfExists.metaData;
+ if (selectedAssetMetaData.assetProxyId === AssetProxyId.ERC20) {
+ const selectedAssetAmountBaseUnits = Web3Wrapper.toBaseUnitAmount(
+ selectedAssetAmountIfExists,
+ selectedAssetMetaData.decimals,
+ );
+ const doesAssetAmountMatch = selectedAssetAmountBaseUnits.eq(buyQuote.assetBuyAmount);
+ return doesAssetAmountMatch;
+ } else {
+ return true;
+ }
+};