diff --git a/config/mainnet/staging.json b/config/mainnet/staging.json index 4cfea2da1..b8ce82229 100644 --- a/config/mainnet/staging.json +++ b/config/mainnet/staging.json @@ -13,7 +13,8 @@ "title": "Gnosis Trading Interface" }, "whitelist": { - "0x9eab578556de5782445ec036f25a41902ba19eeb": "Gnosis" + "0x9eab578556de5782445ec036f25a41902ba19eeb": "Gnosis", + "0xe7e3272a84cf3fe180345b9f7234ba705eb5e2ca": "Mikhail" }, "thirdparty": { "googleAnalytics": { diff --git a/package-lock.json b/package-lock.json index 4cfc7836f..4428fe36a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1338,6 +1338,45 @@ "integrity": "sha512-FBMd0IiARPtH5aaOFUVki6evHiJQiY0pFy7fizyRF7dtwc+el3nwpzvhb9qBNzceG1OIJModG1xpE0DDFjPXwA==", "dev": true }, + "@babel/register": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.0.0.tgz", + "integrity": "sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "find-cache-dir": "^1.0.0", + "home-or-tmp": "^3.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + }, + "dependencies": { + "home-or-tmp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-3.0.0.tgz", + "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, "@babel/runtime": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0.tgz", @@ -3249,13 +3288,14 @@ } }, "autoprefixer": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.3.tgz", - "integrity": "sha512-No9xrkPCGIHc9I52e+u1MuvkwfTOIXQt3tu+jGSONAJf4awvQmqOTWmk7JhA9Q3BTvBYIRdpS9PLFtrmpZcImg==", + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.4.tgz", + "integrity": "sha512-EZ5oGTl8A7Tpr/iKxaX/j898Y3QvWEAEQ2xIc9ddgZwI4p63a5HLIxpZmfRSOBC4/AEyBdtToTVKwV1rUj6qQA==", "dev": true, "requires": { - "browserslist": "^4.0.2", - "caniuse-lite": "^1.0.30000878", + "@babel/register": "^7.0.0", + "browserslist": "^4.1.0", + "caniuse-lite": "^1.0.30000884", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", "postcss": "^7.0.2", @@ -3271,6 +3311,12 @@ "color-convert": "^1.9.0" } }, + "caniuse-lite": { + "version": "1.0.30000884", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz", + "integrity": "sha512-ibROerckpTH6U5zReSjbaitlH4gl5V4NWNCBzRNCa3GEDmzzkfStk+2k5mO4ZDM6pwtdjbZ3hjvsYhPGVLWgNw==", + "dev": true + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -15318,6 +15364,12 @@ } } }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, "node-notifier": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", @@ -16242,6 +16294,15 @@ "pinkie": "^2.0.0" } }, + "pirates": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", + "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, "pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -22753,9 +22814,9 @@ "dev": true }, "webpack": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.1.tgz", - "integrity": "sha512-vdPYogljzWPhFKDj3Gcp01Vqgu7K3IQlybc3XIdKSQHelK1C3eIQuysEUR7MxKJmdandZlQB/9BG2Jb1leJHaw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.2.tgz", + "integrity": "sha512-hCK8FPco2Paz9FVMlo3ZdVd7Jsr7qxoiEwhd7f4dMaWBLZtc7E+/9QNee4CYHlVSvpmspWBnhFpx4MiWSl3nNg==", "dev": true, "requires": { "@webassemblyjs/ast": "1.5.13", @@ -22782,7 +22843,7 @@ "tapable": "^1.0.0", "uglifyjs-webpack-plugin": "^1.2.4", "watchpack": "^1.5.0", - "webpack-sources": "^1.0.1" + "webpack-sources": "^1.2.0" }, "dependencies": { "acorn-dynamic-import": { diff --git a/package.json b/package.json index 86927310a..65a977f7d 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@storybook/addon-links": "^3.4.8", "@storybook/react": "^3.4.8", "autodll-webpack-plugin": "^0.4.2", - "autoprefixer": "^9.1.1", + "autoprefixer": "^9.1.4", "babel-core": "^7.0.0-0", "babel-eslint": "^9.0.0", "babel-jest": "^23.2.0", @@ -166,7 +166,7 @@ "truffle-hdwallet-provider": "0.0.6", "uglifyjs-webpack-plugin": "^1.3.0", "url-loader": "^1.1.1", - "webpack": "^4.16.4", + "webpack": "^4.17.2", "webpack-cli": "^3.0.4", "webpack-dev-server": "^3.1.4" } diff --git a/src/routes/Dashboard/components/Dashboard/UserSection/Holdings/Share.js b/src/routes/Dashboard/components/Dashboard/UserSection/Holdings/Share.js index a2a626403..53e086cef 100644 --- a/src/routes/Dashboard/components/Dashboard/UserSection/Holdings/Share.js +++ b/src/routes/Dashboard/components/Dashboard/UserSection/Holdings/Share.js @@ -5,6 +5,7 @@ import className from 'classnames/bind' import OutcomeColorBox from 'components/Outcome/OutcomeColorBox' import DecimalValue from 'components/DecimalValue' import CurrencyName from 'components/CurrencyName' +import { LOWEST_VALUE } from 'utils/constants' import { weiToEth } from 'utils/helpers' import { OutcomeRecord } from 'store/models/market' @@ -13,11 +14,20 @@ import style from './style.scss' const cx = className.bind(style) const Share = ({ - id, marketTitle, marketType, market, outcomeToken, collateralTokenAddress, balance, marginalPrice, + id, + marketTitle, + marketType, + market, + outcomeToken, + collateralTokenAddress, + balance, + marginalPrice, redeemWinnings, + winnings, }) => { const showSellLink = !market.closed && !market.resolved - const showRedeemLink = market.resolved + const showRedeemLink = market.resolved && winnings >= LOWEST_VALUE + const handleRedeemWinnings = () => redeemWinnings(market) return ( @@ -29,19 +39,25 @@ const Share = ({
-   + +   {outcomeToken.name}
-   - {collateralTokenAddress ? : ETH } + +   + {collateralTokenAddress ? : ETH}
{showSellLink && SELL} - {showRedeemLink && } + {showRedeemLink && ( + + )}
@@ -58,6 +74,7 @@ Share.propTypes = { outcomeToken: PropTypes.shape(OutcomeRecord).isRequired, collateralTokenAddress: PropTypes.string.isRequired, redeemWinnings: PropTypes.func.isRequired, + winnings: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired, } export default Share diff --git a/src/routes/Dashboard/containers/Dashboard/utils/calcShareWinnings.js b/src/routes/Dashboard/containers/Dashboard/utils/calcShareWinnings.js index 351652fca..8d63f8933 100644 --- a/src/routes/Dashboard/containers/Dashboard/utils/calcShareWinnings.js +++ b/src/routes/Dashboard/containers/Dashboard/utils/calcShareWinnings.js @@ -3,10 +3,9 @@ import { OUTCOME_TYPES } from 'utils/constants' const SCALAR_OUTCOME_RANGE = 1000000 -const calcShareWinningsCategorical = (share, market) => { - const { winningOutcome } = market +const calcShareWinningsCategorical = (share, { winningOutcome }) => { const shareOutcome = share.outcomeToken.index - if (shareOutcome !== winningOutcome) { + if (shareOutcome !== winningOutcome.index) { return '0' } diff --git a/src/routes/MarketDetails/components/MarketDetail/Details/index.js b/src/routes/MarketDetails/components/MarketDetail/Details/index.js index 4c2bc1b19..aff390e7f 100644 --- a/src/routes/MarketDetails/components/MarketDetail/Details/index.js +++ b/src/routes/MarketDetails/components/MarketDetail/Details/index.js @@ -82,7 +82,7 @@ const Details = ({ winningsAmount={winningsTotal} handleRedeemWinnings={handleRedeemWinnings} transactionGas={redeemWinningsTransactionGas} - collateralToken={market.event.collateralToken} + collateralToken={market.collateralToken} /> )} diff --git a/src/routes/MarketDetails/containers/MarketDetailPage/index.js b/src/routes/MarketDetails/containers/MarketDetailPage/index.js index 53b7aa7a8..ad180dbd2 100644 --- a/src/routes/MarketDetails/containers/MarketDetailPage/index.js +++ b/src/routes/MarketDetails/containers/MarketDetailPage/index.js @@ -83,7 +83,7 @@ const mapDispatchToProps = dispatch => ({ buyShares: (market, outcomeIndex, outcomeTokenCount, cost) => dispatch(buyMarketShares(market, outcomeIndex, outcomeTokenCount, cost)), sellShares: (market, outcomeIndex, outcomeTokenCount, earnings) => dispatch(sellMarketShares(market, outcomeIndex, outcomeTokenCount, earnings)), changeUrl: url => dispatch(replace(url)), - redeemWinnings: market => redeemMarket(market), + redeemWinnings: market => dispatch(redeemMarket(market)), requestGasCost: (contractType, opts) => dispatch(requestGasCost(contractType, opts)), requestGasPrice: () => dispatch(requestGasPrice()), requestTokenSymbol: tokenAddress => dispatch(requestTokenSymbol(tokenAddress)), diff --git a/src/store/selectors/account/shares.js b/src/store/selectors/account/shares.js index d4744d279..d2812b936 100644 --- a/src/store/selectors/account/shares.js +++ b/src/store/selectors/account/shares.js @@ -3,6 +3,7 @@ import { createSelector } from 'reselect' import Decimal from 'decimal.js' import { getCollateralToken } from 'store/selectors/blockchain' import { normalizeHex } from 'utils/helpers' +import { calcShareWinnings } from 'routes/Dashboard/containers/Dashboard/utils' export const sharesWithMarketsSelector = createSelector( state => state.marketList, @@ -22,6 +23,15 @@ const shareSelector = createSelector(sharesWithMarketsSelector, getCollateralTok && typeof share.market !== 'undefined' && normalizeHex(share.collateralTokenAddress) === normalizeHex(collateralToken.address), ) + .map((share) => { + let shareWinnings = '0' + + if (share.market.resolved) { + shareWinnings = calcShareWinnings(share, share.market) + } + + return share.set('winnings', shareWinnings) + }) .sortBy(share => share.marketResolution, (dateA, dateB) => (dateA.isBefore(dateB) ? -1 : 1)) .values(), )) diff --git a/src/store/selectors/market/shares.js b/src/store/selectors/market/shares.js index 6e1d77eb2..959c8f5a6 100644 --- a/src/store/selectors/market/shares.js +++ b/src/store/selectors/market/shares.js @@ -6,10 +6,10 @@ export const sharesForMarketSelector = (state, marketAddress) => { const market = state.marketList.get(marketAddress) if (market) { - const marketShares = state.marketShares.filter(marketShare => ( - marketShare.eventAddress === market.eventAddress && - marketShare.collateralTokenAddress === collateralToken.address - )) + const marketShares = state.accountShares.filter( + marketShare => marketShare.eventAddress === market.eventAddress + && marketShare.collateralTokenAddress === collateralToken.address, + ) return List(marketShares.values()) }