From 913ef5d65d4f6a8d451559005bd6091e4a9f54fd Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 23 Jul 2019 12:43:21 -0400 Subject: [PATCH 01/25] chore(issuer): add table to compliance page --- .../src/pages/compliance/CompliancePage.js | 123 ++++++++++-------- 1 file changed, 66 insertions(+), 57 deletions(-) diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index b62b77523..87d2ac0fb 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -1,64 +1,63 @@ // @flow /* eslint-disable react/jsx-no-bind, react/no-unused-state */ // TODO @bshevchenko -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { reset } from 'redux-form'; -import { BigNumber } from 'bignumber.js'; import { - Page, - etherscanAddress, addressShortifier, confirm, + etherscanAddress, NotFoundPage, + Page, + Grid, } from '@polymathnetwork/ui'; +import { BigNumber } from 'bignumber.js'; import { Button, DataTable, - // PaginationV2, - Modal, // DatePicker, // DatePickerInput, Icon, InlineNotification, - Toggle, - TextInput, + // PaginationV2, + Modal, OverflowMenu, OverflowMenuItem, + TextInput, + Toggle, } from 'carbon-components-react'; -import type { - Investor, - Address, - SecurityToken, -} from '@polymathnetwork/js/types'; - -import Progress from '../token/components/Progress'; +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { reset } from 'redux-form'; import { - importWhitelist, - exportWhitelist, addInvestor, + disableOwnershipRestrictions, + editInvestors, + enableOwnershipRestrictions, + exportWhitelist, fetchWhitelist, + importWhitelist, listLength, + PERMANENT_LOCKUP_TS, removeInvestors, - editInvestors, resetUploaded, - disableOwnershipRestrictions, - enableOwnershipRestrictions, - updateOwnershipPercentage, - PERMANENT_LOCKUP_TS, toggleFreeze, + updateOwnershipPercentage, } from '../../actions/compliance'; +import Progress from '../token/components/Progress'; import AddInvestorForm, { formName as addInvestorFormName, } from './components/AddInvestorForm'; import { formName as editInvestorsFormName } from './components/EditInvestorsForm'; import ImportWhitelistModal from './components/ImportWhitelistModal'; +import './style.scss'; +import type { + Investor, + Address, + SecurityToken, +} from '@polymathnetwork/js/types'; import type { RootState } from '../../redux/reducer'; import type { InvestorCSVRow } from '../../actions/compliance'; -import './style.scss'; - const { Table, TableBody, @@ -617,16 +616,48 @@ class CompliancePage extends Component { // const paginatedRows = this.paginationRendering() return ( + + + + +

Token Whitelist

+

+ Whitelisted addresses may hold, buy, or sell the security token + and may participate into the STO.
Security token buy/sell + operations may be subject to restrictions. +

+
+
+ + + + + + + + + + +
- -

Token Whitelist

-

- Whitelisted addresses may hold, buy, or sell the security token and - may participate into the STO.
Security token buy/sell - operations may be subject to restrictions. -


-
{
- - - - -
- +
{/* Date: Tue, 23 Jul 2019 17:33:04 -0400 Subject: [PATCH 02/25] chore(issuer): something --- packages/polymath-issuer/test | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/polymath-issuer/test diff --git a/packages/polymath-issuer/test b/packages/polymath-issuer/test new file mode 100644 index 000000000..e69de29bb From 0b94a9987c5d742e8889bd7c1435b475ad041ce9 Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 30 Jul 2019 11:48:39 -0400 Subject: [PATCH 03/25] chore(issuer): add general permission table --- .../src/components/WhitelistTable/index.tsx | 45 +++ .../polymath-issuer/src/actions/compliance.js | 18 ++ .../src/pages/compliance/CompliancePage.js | 262 +++++++++--------- .../compliance/components/WhitelistModal.js | 94 +++++++ .../compliance/components/WhitelistTable.js | 119 ++++++++ .../src/pages/compliance/style.scss | 49 +++- .../src/reducers/compliance.js | 15 + 7 files changed, 472 insertions(+), 130 deletions(-) create mode 100644 packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx create mode 100644 packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js create mode 100644 packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js diff --git a/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx b/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx new file mode 100644 index 000000000..4d4d7a13d --- /dev/null +++ b/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx @@ -0,0 +1,45 @@ +// @flow + +import React, { Component } from 'react'; +import { + Table, + Box, + ButtonSmall, + IconButton, + icons, + InlineFlex, + Icon, + Button, + Label, + TooltipPrimary, +} from '@polymathnetwork/new-ui'; + + +const columns = [ + { + Header: 'Whitelist Manager Wallet Address', + accessor: 'Address', + width: 250, + Cell: ({ value }) => value + }, + { + Header: 'Manager Details', + accessor: 'Details', + width: 250, + Cell: ({ value }) => value + } +]; +class WhitelistTable extends Component { + render() { + return ( + + +
+ ) + } +} + +export default WhitelistTable; \ No newline at end of file diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index a6b494493..5514a4cf5 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -39,6 +39,24 @@ export const listLength = (listLength: number) => ({ listLength, }); +export const LOAD_MANAGERS = 'compliance/LOAD_MANAGERS'; +export const loadWhitelist = managers => ({ + type: LOAD_MANAGERS, + managers, +}); + +export const ADD_MANAGER = 'compliance/ADD_MANAGER'; +export const addManager = manager => ({ + type: ADD_MANAGER, + manager, +}); + +export const REMOVE_MANAGER = 'compliance/REMOVE_MANAGER'; +export const removeManager = id => ({ + type: REMOVE_MANAGER, + id, +}); + export const RESET_UPLOADED = 'compliance/RESET_UPLOADED'; export const resetUploaded = () => ({ type: RESET_UPLOADED }); diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index 87d2ac0fb..dbdf64fd3 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -48,6 +48,8 @@ import AddInvestorForm, { } from './components/AddInvestorForm'; import { formName as editInvestorsFormName } from './components/EditInvestorsForm'; import ImportWhitelistModal from './components/ImportWhitelistModal'; +import WhitelistTable from './components/WhitelistTable'; +import WhitelistModal from './components/WhitelistModal'; import './style.scss'; import type { Investor, @@ -141,6 +143,8 @@ type State = {| startDateAdded: ?Date, endDateAdded: ?Date, isPercentageToggled: boolean, + isWhitelistToggled: boolean, + isWhitelistModalOpen: boolean, percentage: ?number, |}; @@ -168,6 +172,7 @@ class CompliancePage extends Component { startDateAdded: null, endDateAdded: null, isPercentageToggled: false, + isWhitelistToggled: false, percentage: undefined, }; @@ -176,6 +181,7 @@ class CompliancePage extends Component { if (this.props.percentage) { this.setState({ percentage: this.props.percentage }); } + // TODO: check redux for whitelist enable } componentWillReceiveProps(nextProps) { @@ -185,6 +191,7 @@ class CompliancePage extends Component { ) { this.setState({ percentage: nextProps.percentage }); } + // TODO: check redux for whitelist enable } handleChangePages = pc => { @@ -403,6 +410,11 @@ class CompliancePage extends Component { this.props.removeInvestors(addresses); }; + handleToggleWhitelist = (isToggled: boolean) => { + this.setState({ isWhitelistToggled: isToggled }); + // check redux state for if the app already has this GPM enabled + }; + handleTogglePercentage = (isToggled: boolean) => { const { isPercentageEnabled, isPercentagePaused } = this.props; if (!isPercentageEnabled) { @@ -619,7 +631,7 @@ class CompliancePage extends Component { - +

Token Whitelist

Whitelisted addresses may hold, buy, or sell the security token @@ -644,6 +656,10 @@ class CompliancePage extends Component { onSubmit={this.handleImport} onClose={this.handleImportModalClose} /> + {/* */} - -
-
-
- - - -
- {/* - - {}} - onChange={() => {}} - /> - {}} - onChange={() => {}} - /> - - */} - -
- - + + +
+
+
+ {/* + + */} +

Ownership Restrictions

+
+
+ + +
+ +
+ +
+ + +
+
+
+
+
+ + +
+
+
+ {/* + + */} +

Whitelist Management

+
+
+ + +
-
- -
- - + > + +
+
+
-
-
-
-
- {/* - - - -

- Please enter the information below to edit the chosen investors. -

-
- -
- */} -
+ + + ); } diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js new file mode 100644 index 000000000..e8a4cd5fb --- /dev/null +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js @@ -0,0 +1,94 @@ +// @flow + +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Modal, Button } from '@polymathnetwork/ui'; +import { withFormik } from 'formik'; +import { Form } from 'carbon-components-react'; +import { + bull, + PageCentered, + ContentBox, + Heading, + FormItem, + TextInput, +} from '@polymathnetwork/ui'; +import validator from '@polymathnetwork/ui/validator'; +import { addManager } from '../../../actions/compliance'; +(''); + +type Props = { + isOpen: boolean, + handleClose: () => any, +}; + +const formSchema = validator.object().shape({ + address: validator + .string() + .isAddress('Invalid Address') + .isRequired('Required'), + details: validator.string().isRequired('Required'), +}); + +export const ConfirmEmailFormComponent = ({ handleSubmit, handleClose }) => ( +
+ + + Whitelist Manager Wallet Address + + + + + + + + Whitelist Manager Details + + + + + + + + + +
+); + +const formikEnhancer = withFormik({ + validationSchema: formSchema, + displayName: 'ConfirmEmailForm', + validateOnChange: false, + handleSubmit: (values, { props }) => { + const { dispatch } = props; + console.log(values); + props.handleClose(); + dispatch(addManager({ address: values.address, details: values.details })); + }, +}); + +const FormikEnhancedForm = formikEnhancer(ConfirmEmailFormComponent); +const ConnectedForm = connect()(FormikEnhancedForm); + +class WhitelistModal extends Component { + render() { + const { isOpen, handleClose } = this.props; + return ( + + Add Whitelist Manager + +

+ Specify the investor wallet address of the new whitelist manager. + Each manager will have permission to update the whitelist. Consult + with your legal team before adding a new wallet to the list. +

+ +
+
+ ); + } +} + +export default WhitelistModal; diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js new file mode 100644 index 000000000..24cb842c6 --- /dev/null +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js @@ -0,0 +1,119 @@ +// @flow + +import React, { Component } from 'react'; +import { DataTable } from 'carbon-components-react'; +import { Button } from '@polymathnetwork/ui'; +import WhitelistModal from './WhitelistModal'; +import { connect } from 'react-redux'; +import { addManager } from '../../../actions/compliance'; +const { + TableContainer, + Table, + TableHead, + TableRow, + TableBody, + TableCell, + TableHeader, + TableToolbar, + TableToolbarContent, +} = DataTable; + +const columns = [ + { + header: 'Whitelist Manager Wallet Address', + key: 'address', + width: 250, + Cell: ({ value }) => value, + }, + { + header: 'Manager Details', + key: 'details', + width: 250, + Cell: ({ value }) => value, + }, +]; + +type State = {| + isWhitelistModalOpen: boolean, +|}; + +class WhitelistTable extends Component { + state = { + isWhitelistModalOpen: false, + }; + + handleOpen = () => { + this.setState({ isWhitelistModalOpen: true }); + }; + + handleClose = () => { + this.setState({ isWhitelistModalOpen: false }); + }; + + render() { + const { approvedManagers } = this.props; + return ( +
+ + { + console.log(approvedManagers); + console.log(rows); + return ( + + + + {/* pass in `onInputChange` change here to make filtering work */} + + + + + + + {headers.map(header => ( + + {header.header} + + ))} + + + + {rows.map(row => ( + console.log('test')} + > + {row.cells.map(cell => ( + {cell.value} + ))} + + ))} + +
+
+ ); + }} + /> +
+ ); + } +} + +const mapStateToProps = state => ({ + approvedManagers: state.whitelist.approvedManagers, +}); + +const mapDispatchToProps = dispatch => ({}); + +export default connect(mapStateToProps)(WhitelistTable); diff --git a/packages/polymath-issuer/src/pages/compliance/style.scss b/packages/polymath-issuer/src/pages/compliance/style.scss index 3125165c8..d397186ce 100644 --- a/packages/polymath-issuer/src/pages/compliance/style.scss +++ b/packages/polymath-issuer/src/pages/compliance/style.scss @@ -1,20 +1,63 @@ .compliance-form { - width: 60%; + width: 100%; + + .whitelist-settings { + display: flex; + flex-direction: column; + margin-top: 20px; + margin-bottom: 20px; + > .bx--form-item { + //&:first-child { + // max-width: 325px; + //} + + &:last-child { + margin-bottom: 0 !important; + overflow: scroll; + + .bx--form-item { + position: relative; + float: left; + + input { + width: 84px; + min-width: 84px; + + &::-webkit-outer-spin-button, + &::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + } + + &:after { + content: '%'; + position: absolute; + top: 13px; + left: 55px; + color: #8c9ba5; + font-size: 14px; + } + } + } + } + } .compliance-settings { display: flex; + flex-direction: row; margin-top: 20px; margin-bottom: 20px; > .bx--form-item { - max-width: 220px; + max-width: 300px; //&:first-child { // max-width: 325px; //} &:last-child { - margin-top: -22px; + margin-top: -24px; margin-bottom: 0 !important; height: 100px; diff --git a/packages/polymath-issuer/src/reducers/compliance.js b/packages/polymath-issuer/src/reducers/compliance.js index 2eb55749f..3c93d4a79 100644 --- a/packages/polymath-issuer/src/reducers/compliance.js +++ b/packages/polymath-issuer/src/reducers/compliance.js @@ -25,6 +25,7 @@ export type WhitelistState = {| listLength: number, freezeStatus: ?boolean, isFrozenModalOpen: ?boolean, + approvedManagers: Array, |}; const defaultState: WhitelistState = { @@ -42,6 +43,7 @@ const defaultState: WhitelistState = { listLength: 10, freezeStatus: null, isFrozenModalOpen: null, + approvedManagers: [], }; // NOTE @RafaelVidaurre: WARNING For some reason this reducer is being renamed. @@ -49,6 +51,19 @@ const defaultState: WhitelistState = { // eslint-disable-next-line complexity export default (state: WhitelistState = defaultState, action: Object) => { switch (action.type) { + case a.ADD_MANAGER: + return { + ...state, + approvedManagers: [ + ...state.approvedManagers, + { ...action.manager, id: action.manager.address }, + ], + }; + case a.LOAD_MANAGERS: + return { + ...state, + approvedManagers: action.managers, + }; case a.TRANSFER_MANAGER: return { ...state, From a5e42f120f7ba532921be56f0e85af4662a8815f Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 30 Jul 2019 12:15:24 -0400 Subject: [PATCH 04/25] chore(issuer): remove extra component --- .../src/components/WhitelistTable/index.tsx | 45 ------------------- packages/polymath-issuer/test | 0 2 files changed, 45 deletions(-) delete mode 100644 packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx delete mode 100644 packages/polymath-issuer/test diff --git a/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx b/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx deleted file mode 100644 index 4d4d7a13d..000000000 --- a/packages/new-polymath-issuer/src/components/WhitelistTable/index.tsx +++ /dev/null @@ -1,45 +0,0 @@ -// @flow - -import React, { Component } from 'react'; -import { - Table, - Box, - ButtonSmall, - IconButton, - icons, - InlineFlex, - Icon, - Button, - Label, - TooltipPrimary, -} from '@polymathnetwork/new-ui'; - - -const columns = [ - { - Header: 'Whitelist Manager Wallet Address', - accessor: 'Address', - width: 250, - Cell: ({ value }) => value - }, - { - Header: 'Manager Details', - accessor: 'Details', - width: 250, - Cell: ({ value }) => value - } -]; -class WhitelistTable extends Component { - render() { - return ( - - -
- ) - } -} - -export default WhitelistTable; \ No newline at end of file diff --git a/packages/polymath-issuer/test b/packages/polymath-issuer/test deleted file mode 100644 index e69de29bb..000000000 From b38ee672eda53504ccd7b5d1b618850418d28a09 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 31 Jul 2019 13:15:12 -0400 Subject: [PATCH 05/25] chore(issuer): add GPM methods --- .../polymath-issuer/src/actions/compliance.js | 37 +++++++++++++++++++ .../src/pages/compliance/CompliancePage.js | 3 ++ .../compliance/components/WhitelistTable.js | 4 +- .../src/contracts/PermissionManager.js | 10 +++++ 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index 5514a4cf5..9eb3b88aa 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -57,6 +57,13 @@ export const removeManager = id => ({ id, }); +export const TOGGLE_WHITELIST_MANAGEMENT = + 'compliance/TOGGLE_WHITELIST_MANAGEMENT'; +export const toggleWhitelistManagement = (isToggled: boolean) => ({ + type: TOGGLE_WHITELIST_MANAGEMENT, + isToggled, +}); + export const RESET_UPLOADED = 'compliance/RESET_UPLOADED'; export const resetUploaded = () => ({ type: RESET_UPLOADED }); @@ -77,6 +84,36 @@ export type InvestorCSVRow = [ string, ]; +export const fetchManagers = () => async ( + dispatch: Function, + getState: GetState +) => { + dispatch(ui.fetching()); + // $FlowFixMe + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + console.log(permissionManager); + // console.log(permissionManager.getAllDelegates('CHANGE_PERMISSION')); + + // const generalPermissionAddress = await st.getModuleByName("GeneralPermissionManager"); + try { + if (permissionManager) { + console.log( + await permissionManager.addDelegate( + '0x821aEa9a577a9b44299B9c15c88cf3087F3b5544', + 'This is some details' + ) + ); + dispatch(toggleWhitelistManagement(true)); + // getAllDelegates + } else { + dispatch(toggleWhitelistManagement(false)); + } + } catch (e) { + console.log(e); + } +}; + export const fetchWhitelist = () => async ( dispatch: Function, getState: GetState diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index dbdf64fd3..cc9deaf19 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -41,6 +41,7 @@ import { resetUploaded, toggleFreeze, updateOwnershipPercentage, + fetchManagers, } from '../../actions/compliance'; import Progress from '../token/components/Progress'; import AddInvestorForm, { @@ -130,6 +131,7 @@ const mapDispatchToProps = { enableOwnershipRestrictions, updateOwnershipPercentage, toggleFreeze, + fetchManagers, }; type Props = StateProps & DispatchProps; @@ -181,6 +183,7 @@ class CompliancePage extends Component { if (this.props.percentage) { this.setState({ percentage: this.props.percentage }); } + this.props.fetchManagers(); // TODO: check redux for whitelist enable } diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js index 24cb842c6..42d9671f8 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js @@ -62,12 +62,10 @@ class WhitelistTable extends Component { headers={columns} rows={ approvedManagers < 1 - ? [{ address: '-', details: '-' }] + ? [{ id: '0', address: '-', details: '-' }] : approvedManagers } render={({ rows, headers, getHeaderProps }) => { - console.log(approvedManagers); - console.log(rows); return ( diff --git a/packages/polymath-js/src/contracts/PermissionManager.js b/packages/polymath-js/src/contracts/PermissionManager.js index a79e37567..b7591e9d2 100644 --- a/packages/polymath-js/src/contracts/PermissionManager.js +++ b/packages/polymath-js/src/contracts/PermissionManager.js @@ -18,4 +18,14 @@ export default class PermissionManager extends Contract { } version = version; } + + async addDelegate(at: Address, details: string) { + return this._methods.addDelegate(at, this._toBytes(details)).call(); + } + + async getAllDelegates(permission: string) { + return this._methods + .getAllDelegatesWithPerm(this.address, this._toBytes(permission)) + .call(); + } } From 837c51c63efa4d41629ca8e6822de728e9234248 Mon Sep 17 00:00:00 2001 From: Fahd Date: Fri, 2 Aug 2019 10:50:33 -0400 Subject: [PATCH 06/25] chore(issuer): add and remove delegates from GTM --- .../polymath-issuer/src/actions/compliance.js | 131 +++++++++++++++--- .../src/pages/compliance/CompliancePage.js | 21 ++- .../compliance/components/WhitelistModal.js | 5 +- .../compliance/components/WhitelistTable.js | 33 ++++- .../src/reducers/compliance.js | 17 +++ .../src/contracts/PermissionManager.js | 27 +++- .../src/contracts/SecurityToken.js | 15 ++ 7 files changed, 215 insertions(+), 34 deletions(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index 9eb3b88aa..5956894f5 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -14,6 +14,7 @@ import { formName as addInvestorFormName } from '../pages/compliance/components/ import { formName as editInvestorsFormName } from '../pages/compliance/components/EditInvestorsForm'; import { parseWhitelistCsv } from '../utils/parsers'; import { STAGE_OVERVIEW } from '../reducers/sto'; +import Web3 from 'web3'; import type { Investor, Address } from '@polymathnetwork/js/types'; import type { GetState } from '../redux/reducer'; @@ -40,7 +41,7 @@ export const listLength = (listLength: number) => ({ }); export const LOAD_MANAGERS = 'compliance/LOAD_MANAGERS'; -export const loadWhitelist = managers => ({ +export const loadManagers = managers => ({ type: LOAD_MANAGERS, managers, }); @@ -52,9 +53,9 @@ export const addManager = manager => ({ }); export const REMOVE_MANAGER = 'compliance/REMOVE_MANAGER'; -export const removeManager = id => ({ +export const removeManager = address => ({ type: REMOVE_MANAGER, - id, + address, }); export const TOGGLE_WHITELIST_MANAGEMENT = @@ -90,30 +91,128 @@ export const fetchManagers = () => async ( ) => { dispatch(ui.fetching()); // $FlowFixMe - const st: SecurityToken = getState().token.token.contract; - const permissionManager = await st.getPermissionManager(); - console.log(permissionManager); - // console.log(permissionManager.getAllDelegates('CHANGE_PERMISSION')); - - // const generalPermissionAddress = await st.getModuleByName("GeneralPermissionManager"); try { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); if (permissionManager) { - console.log( - await permissionManager.addDelegate( - '0x821aEa9a577a9b44299B9c15c88cf3087F3b5544', - 'This is some details' - ) - ); + const transferManager = await st.getTransferManager(); + if (transferManager) { + const delegates = await permissionManager.getAllDelegates( + transferManager.address, + 'ADMIN' + ); // put in const + let delegateDetails = []; + for (const delegate of delegates) { + let details = await permissionManager.getDelegateDetails(delegate); + delegateDetails.push({ id: delegate, address: delegate, details }); + } + dispatch(loadManagers(delegateDetails)); + } dispatch(toggleWhitelistManagement(true)); - // getAllDelegates } else { dispatch(toggleWhitelistManagement(false)); } + dispatch(ui.fetched()); } catch (e) { console.log(e); } }; +export const addAddressToTransferManager = ( + delegate: Address, + details: string +) => async (dispatch: Function, getState: GetState) => { + dispatch( + ui.tx( + ['Adding New Whitelist Manager', 'Setting Permissions'], + async () => { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + if (permissionManager) { + const transferManager = await st.getTransferManager(); + if (transferManager) { + console.log(delegate, details); + // TODO: Check if the delegate already exists + await permissionManager.addDelegate(delegate, details); + await permissionManager.changePermission( + delegate, + transferManager.address, + 'ADMIN', + true + ); + } + } + }, + 'New Whistlist Manager Added', + () => { + dispatch(addManager({ address: delegate, details: details })); + }, + undefined, + undefined, + undefined, + true + ) + ); +}; + +// TODO: Add confirm dialog box +export const removeAddressFromTransferManager = (delegate: Address) => async ( + dispatch: Function, + getState: GetState +) => { + dispatch( + ui.tx( + ['Removing Whitelist Manager'], + async () => { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + if (permissionManager) { + const transferManager = await st.getTransferManager(); + if (transferManager) { + await permissionManager.changePermission( + delegate, + transferManager.address, + 'ADMIN', + false + ); + } + } + }, + 'Whitelist Manager Removed', + () => { + dispatch(removeManager(delegate)); + }, + undefined, + undefined, + undefined, + true + ) + ); +}; + +export const addGeneralPermissionModule = () => async ( + dispatch: Function, + getState: GetState +) => { + dispatch( + ui.tx( + ['Enabling General Permissions Manager for General Transfer Manager'], + async () => { + const st: SecurityToken = getState().token.token.contract; + await st.setPermissionManager(); + }, + 'General Permissions Manager for General Transfer Manager Enabled', + () => { + dispatch(toggleWhitelistManagement(true)); + }, + undefined, + undefined, + undefined, + true + ) + ); +}; + export const fetchWhitelist = () => async ( dispatch: Function, getState: GetState diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index cc9deaf19..9a2d6ffaf 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -42,6 +42,8 @@ import { toggleFreeze, updateOwnershipPercentage, fetchManagers, + toggleWhitelistManagement, + addGeneralPermissionModule, } from '../../actions/compliance'; import Progress from '../token/components/Progress'; import AddInvestorForm, { @@ -103,6 +105,7 @@ type DispatchProps = {| enableOwnershipRestrictions: (percentage?: number) => any, updateOwnershipPercentage: (percentage: number) => any, toggleFreeze: () => any, + addGeneralPermissionModule: () => any, |}; const mapStateToProps = (state: RootState) => ({ @@ -114,6 +117,7 @@ const mapStateToProps = (state: RootState) => ({ isPercentagePaused: state.whitelist.percentageTM.isPaused, percentage: state.whitelist.percentageTM.percentage, isTokenFrozen: state.whitelist.freezeStatus, + isWhitelistToggled: state.whitelist.isToggled, }); const mapDispatchToProps = { @@ -132,6 +136,8 @@ const mapDispatchToProps = { updateOwnershipPercentage, toggleFreeze, fetchManagers, + toggleWhitelistManagement, + addGeneralPermissionModule, }; type Props = StateProps & DispatchProps; @@ -174,7 +180,6 @@ class CompliancePage extends Component { startDateAdded: null, endDateAdded: null, isPercentageToggled: false, - isWhitelistToggled: false, percentage: undefined, }; @@ -413,9 +418,12 @@ class CompliancePage extends Component { this.props.removeInvestors(addresses); }; - handleToggleWhitelist = (isToggled: boolean) => { - this.setState({ isWhitelistToggled: isToggled }); - // check redux state for if the app already has this GPM enabled + handleToggleWhitelist = async (isToggled: boolean) => { + if (isToggled) { + await this.props.addGeneralPermissionModule(); + } else { + this.props.toggleWhitelistManagement(false); + } }; handleTogglePercentage = (isToggled: boolean) => { @@ -728,6 +736,7 @@ class CompliancePage extends Component {
{
@@ -785,7 +794,7 @@ class CompliancePage extends Component {
diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js index e8a4cd5fb..6f69c9de1 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js @@ -14,7 +14,7 @@ import { TextInput, } from '@polymathnetwork/ui'; import validator from '@polymathnetwork/ui/validator'; -import { addManager } from '../../../actions/compliance'; +import { addAddressToTransferManager } from '../../../actions/compliance'; (''); type Props = { @@ -63,9 +63,8 @@ const formikEnhancer = withFormik({ validateOnChange: false, handleSubmit: (values, { props }) => { const { dispatch } = props; - console.log(values); props.handleClose(); - dispatch(addManager({ address: values.address, details: values.details })); + dispatch(addAddressToTransferManager(values.address, values.details)); }, }); diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js index 42d9671f8..3951b76fd 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js @@ -1,11 +1,11 @@ // @flow import React, { Component } from 'react'; -import { DataTable } from 'carbon-components-react'; +import { DataTable, Icon } from 'carbon-components-react'; import { Button } from '@polymathnetwork/ui'; import WhitelistModal from './WhitelistModal'; import { connect } from 'react-redux'; -import { addManager } from '../../../actions/compliance'; +import { removeAddressFromTransferManager } from '../../../actions/compliance'; const { TableContainer, Table, @@ -50,6 +50,10 @@ class WhitelistTable extends Component { this.setState({ isWhitelistModalOpen: false }); }; + handleDelete = id => { + this.props.removeAddressFromTransferManager(id); + }; + render() { const { approvedManagers } = this.props; return ( @@ -80,21 +84,33 @@ class WhitelistTable extends Component { {headers.map(header => ( - + {header.header} ))} + {rows.map(row => ( console.log('test')} > {row.cells.map(cell => ( {cell.value} ))} + this.handleDelete(row.id)}> + + ))} @@ -112,6 +128,11 @@ const mapStateToProps = state => ({ approvedManagers: state.whitelist.approvedManagers, }); -const mapDispatchToProps = dispatch => ({}); +const mapDispatchToProps = { + removeAddressFromTransferManager, +}; -export default connect(mapStateToProps)(WhitelistTable); +export default connect( + mapStateToProps, + mapDispatchToProps +)(WhitelistTable); diff --git a/packages/polymath-issuer/src/reducers/compliance.js b/packages/polymath-issuer/src/reducers/compliance.js index 3c93d4a79..57a28da73 100644 --- a/packages/polymath-issuer/src/reducers/compliance.js +++ b/packages/polymath-issuer/src/reducers/compliance.js @@ -44,6 +44,7 @@ const defaultState: WhitelistState = { freezeStatus: null, isFrozenModalOpen: null, approvedManagers: [], + isToggled: false, }; // NOTE @RafaelVidaurre: WARNING For some reason this reducer is being renamed. @@ -51,6 +52,22 @@ const defaultState: WhitelistState = { // eslint-disable-next-line complexity export default (state: WhitelistState = defaultState, action: Object) => { switch (action.type) { + case a.TOGGLE_WHITELIST_MANAGEMENT: + return { + ...state, + isToggled: action.isToggled, + }; + case a.REMOVE_MANAGER: + let index = state.approvedManagers.findIndex( + i => i.address === action.address + ); + return { + ...state, + approvedManagers: [ + ...state.approvedManagers.slice(0, index), + ...state.approvedManagers.slice(index + 1), + ], + }; case a.ADD_MANAGER: return { ...state, diff --git a/packages/polymath-js/src/contracts/PermissionManager.js b/packages/polymath-js/src/contracts/PermissionManager.js index b7591e9d2..8042b1899 100644 --- a/packages/polymath-js/src/contracts/PermissionManager.js +++ b/packages/polymath-js/src/contracts/PermissionManager.js @@ -20,12 +20,33 @@ export default class PermissionManager extends Contract { } async addDelegate(at: Address, details: string) { - return this._methods.addDelegate(at, this._toBytes(details)).call(); + return this._tx(this._methods.addDelegate(at, this._toBytes(details))); } - async getAllDelegates(permission: string) { + async getDelegateDetails(delegate: Address) { + let details = await this._methods.delegateDetails(delegate).call(); + return this._toAscii(details); + } + + async getAllDelegates(moduleAddress: Address, permission: string) { return this._methods - .getAllDelegatesWithPerm(this.address, this._toBytes(permission)) + .getAllDelegatesWithPerm(moduleAddress, this._toBytes(permission)) .call(); } + + async changePermission( + delegate: Address, + moduleAddress: Address, + permission: string, + valid: boolean + ) { + return this._tx( + this._methods.changePermission( + delegate, + moduleAddress, + this._toBytes(permission), + valid + ) + ); + } } diff --git a/packages/polymath-js/src/contracts/SecurityToken.js b/packages/polymath-js/src/contracts/SecurityToken.js index afb47cb24..44aff74ea 100644 --- a/packages/polymath-js/src/contracts/SecurityToken.js +++ b/packages/polymath-js/src/contracts/SecurityToken.js @@ -474,6 +474,21 @@ export default class SecurityToken extends Contract { ); } + async setPermissionManager(): Promise { + const generalPermissionManagerFactory = await this.getModuleFactory( + 'GeneralPermissionManager', + MODULE_TYPES.PERMISSION + ); + const setupCost = await generalPermissionManagerFactory.setupCost(); + const data = this._toBytes(''); + return this.addModule( + generalPermissionManagerFactory.address, + data, + PolyToken.addDecimals(setupCost), + 0 + ); + } + async setCountTM(count: number): Promise { const countTransferManagerFactory = await this.getModuleFactory( 'CountTransferManager', From 5afd0d84c111305106613003a8ce78c40a3a7737 Mon Sep 17 00:00:00 2001 From: Fahd Date: Fri, 2 Aug 2019 20:02:57 -0400 Subject: [PATCH 07/25] chore(issuer): add heroku --- packages/polymath-issuer/Procfile | 2 +- packages/polymath-issuer/package.json | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/polymath-issuer/Procfile b/packages/polymath-issuer/Procfile index d0ef3a4e0..06f843a08 100644 --- a/packages/polymath-issuer/Procfile +++ b/packages/polymath-issuer/Procfile @@ -1 +1 @@ -web: cd packages/polymath-issuer && yarn start \ No newline at end of file +web: cd packages/polymath-issuer && yarn start:prod \ No newline at end of file diff --git a/packages/polymath-issuer/package.json b/packages/polymath-issuer/package.json index 169f68c82..4a21c528c 100644 --- a/packages/polymath-issuer/package.json +++ b/packages/polymath-issuer/package.json @@ -7,11 +7,11 @@ "node": ">=8.9" }, "scripts": { - "start": "serve -s build", + "start": "node scripts/start.js", + "start:prod": "serve -s build", "build": "node scripts/build.js", "test": "node ./scripts/test.js --env=jsdom", - "typecheck": "flow --show-all-branches", - "heroku-postbuild": "npm run build" + "typecheck": "flow --show-all-branches" }, "dependencies": { "@babel/runtime": "7.0.0", From 13a833882b35a801f0f5244ef1e8e09fc7530cd8 Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 6 Aug 2019 11:45:18 -0400 Subject: [PATCH 08/25] chore(issuer): check delegates when adding, fix other flow issues --- .../polymath-issuer/src/actions/compliance.js | 90 ++++++++++++------- packages/polymath-issuer/src/constants.js | 4 + .../src/pages/compliance/CompliancePage.js | 30 ++++--- .../compliance/components/WhitelistModal.js | 17 +++- .../compliance/components/WhitelistTable.js | 18 ++-- .../src/pages/compliance/style.scss | 4 + .../src/contracts/PermissionManager.js | 4 + 7 files changed, 110 insertions(+), 57 deletions(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index 5956894f5..f861a1399 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -14,6 +14,7 @@ import { formName as addInvestorFormName } from '../pages/compliance/components/ import { formName as editInvestorsFormName } from '../pages/compliance/components/EditInvestorsForm'; import { parseWhitelistCsv } from '../utils/parsers'; import { STAGE_OVERVIEW } from '../reducers/sto'; +import { PERM_TYPES } from '../constants'; import Web3 from 'web3'; import type { Investor, Address } from '@polymathnetwork/js/types'; @@ -99,8 +100,8 @@ export const fetchManagers = () => async ( if (transferManager) { const delegates = await permissionManager.getAllDelegates( transferManager.address, - 'ADMIN' - ); // put in const + PERM_TYPES.ADMIN + ); let delegateDetails = []; for (const delegate of delegates) { let details = await permissionManager.getDelegateDetails(delegate); @@ -122,22 +123,27 @@ export const addAddressToTransferManager = ( delegate: Address, details: string ) => async (dispatch: Function, getState: GetState) => { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + const titles = ['Adding New Whitelist Manager', 'Setting Permissions']; + const isDelegate = await permissionManager.checkDelegate(delegate); + if (isDelegate) { + titles.shift(); + } dispatch( ui.tx( - ['Adding New Whitelist Manager', 'Setting Permissions'], + titles, async () => { - const st: SecurityToken = getState().token.token.contract; - const permissionManager = await st.getPermissionManager(); if (permissionManager) { const transferManager = await st.getTransferManager(); if (transferManager) { - console.log(delegate, details); - // TODO: Check if the delegate already exists - await permissionManager.addDelegate(delegate, details); + if (!isDelegate) { + await permissionManager.addDelegate(delegate, details); + } await permissionManager.changePermission( delegate, transferManager.address, - 'ADMIN', + PERM_TYPES.ADMIN, true ); } @@ -161,31 +167,47 @@ export const removeAddressFromTransferManager = (delegate: Address) => async ( getState: GetState ) => { dispatch( - ui.tx( - ['Removing Whitelist Manager'], + ui.confirm( +
+

+ Once removed, the investor wallet will no longer have permission to + update the whitelist. Consult your legal team before removing a wallet + from the list. +

+
, async () => { - const st: SecurityToken = getState().token.token.contract; - const permissionManager = await st.getPermissionManager(); - if (permissionManager) { - const transferManager = await st.getTransferManager(); - if (transferManager) { - await permissionManager.changePermission( - delegate, - transferManager.address, - 'ADMIN', - false - ); - } - } - }, - 'Whitelist Manager Removed', - () => { - dispatch(removeManager(delegate)); + dispatch( + ui.tx( + ['Removing Whitelist Manager'], + async () => { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + if (permissionManager) { + const transferManager = await st.getTransferManager(); + if (transferManager) { + await permissionManager.changePermission( + delegate, + transferManager.address, + PERM_TYPES.ADMIN, + false + ); + } + } + }, + 'Whitelist Manager Removed', + () => { + dispatch(removeManager(delegate)); + }, + undefined, + undefined, + undefined, + true + ) + ); }, + `Remove the Investor Wallet from the Whitelist Managers List?`, undefined, - undefined, - undefined, - true + 'pui-large-confirm-modal' ) ); }; @@ -194,11 +216,15 @@ export const addGeneralPermissionModule = () => async ( dispatch: Function, getState: GetState ) => { + const st: SecurityToken = getState().token.token.contract; + if (st.getPermissionManager()) { + dispatch(toggleWhitelistManagement(true)); + return; + } dispatch( ui.tx( ['Enabling General Permissions Manager for General Transfer Manager'], async () => { - const st: SecurityToken = getState().token.token.contract; await st.setPermissionManager(); }, 'General Permissions Manager for General Transfer Manager Enabled', diff --git a/packages/polymath-issuer/src/constants.js b/packages/polymath-issuer/src/constants.js index 95f63540c..c31153c6f 100644 --- a/packages/polymath-issuer/src/constants.js +++ b/packages/polymath-issuer/src/constants.js @@ -8,6 +8,10 @@ export const EVENT_TYPES = { TOKEN_PURCHASE: 'TokenPurchase', }; +export const PERM_TYPES = { + ADMIN: 'ADMIN', +}; + export const MODULE_TYPES = { PERMISSION: 1, TRANSFER: 2, diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index 9a2d6ffaf..fc3845635 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -681,6 +681,22 @@ class CompliancePage extends Component { Export Whitelist + + + + + @@ -764,20 +780,6 @@ class CompliancePage extends Component {

- {/* - - */}

Whitelist Management

diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js index 6f69c9de1..8f2146819 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js @@ -61,15 +61,26 @@ const formikEnhancer = withFormik({ validationSchema: formSchema, displayName: 'ConfirmEmailForm', validateOnChange: false, - handleSubmit: (values, { props }) => { - const { dispatch } = props; + handleSubmit: (values, { setFieldError, props }) => { + const { dispatch, approvedManagers } = props; + const addressExists = approvedManagers.find( + i => i.address === values.address + ); + if (addressExists) { + setFieldError('address', 'Address is already added to Whitelist Manager'); + return; + } props.handleClose(); dispatch(addAddressToTransferManager(values.address, values.details)); }, }); +const mapStateToProps = state => ({ + approvedManagers: state.whitelist.approvedManagers, +}); + const FormikEnhancedForm = formikEnhancer(ConfirmEmailFormComponent); -const ConnectedForm = connect()(FormikEnhancedForm); +const ConnectedForm = connect(mapStateToProps)(FormikEnhancedForm); class WhitelistModal extends Component { render() { diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js index 3951b76fd..1df4adf1e 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js @@ -103,14 +103,16 @@ class WhitelistTable extends Component { {row.cells.map(cell => ( {cell.value} ))} - this.handleDelete(row.id)}> - - + {approvedManagers.length > 0 ? ( + this.handleDelete(row.id)} + > + + + ) : ( + + )} ))} diff --git a/packages/polymath-issuer/src/pages/compliance/style.scss b/packages/polymath-issuer/src/pages/compliance/style.scss index d397186ce..e792a3393 100644 --- a/packages/polymath-issuer/src/pages/compliance/style.scss +++ b/packages/polymath-issuer/src/pages/compliance/style.scss @@ -1,3 +1,7 @@ +.delete-icon { + cursor: pointer; +} + .compliance-form { width: 100%; diff --git a/packages/polymath-js/src/contracts/PermissionManager.js b/packages/polymath-js/src/contracts/PermissionManager.js index 8042b1899..6d685ac63 100644 --- a/packages/polymath-js/src/contracts/PermissionManager.js +++ b/packages/polymath-js/src/contracts/PermissionManager.js @@ -23,6 +23,10 @@ export default class PermissionManager extends Contract { return this._tx(this._methods.addDelegate(at, this._toBytes(details))); } + async checkDelegate(at: Address) { + return this._methods.checkDelegate(at).call(); + } + async getDelegateDetails(delegate: Address) { let details = await this._methods.delegateDetails(delegate).call(); return this._toAscii(details); From 2188e369fdc6011fa410c93f4af39549029fa321 Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 6 Aug 2019 11:45:43 -0400 Subject: [PATCH 09/25] chore(): remove format on save --- .vscode/settings.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ffc1f9486..de1aaf044 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,4 @@ { - "editor.formatOnSave": true, "prettier.eslintIntegration": true, "search.exclude": { "**/node_modules": true, From 737b6fcd7db8ba516e3c00e3a20d8666c187c120 Mon Sep 17 00:00:00 2001 From: Fahd Date: Tue, 6 Aug 2019 14:46:49 -0400 Subject: [PATCH 10/25] chore(issuer): add await for async action --- packages/polymath-issuer/src/actions/compliance.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index f861a1399..0bcee1191 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -217,7 +217,7 @@ export const addGeneralPermissionModule = () => async ( getState: GetState ) => { const st: SecurityToken = getState().token.token.contract; - if (st.getPermissionManager()) { + if (await st.getPermissionManager()) { dispatch(toggleWhitelistManagement(true)); return; } From 2e93c91a4f7aac3ff4d7ca63978263af4b820717 Mon Sep 17 00:00:00 2001 From: Remon Nashid Date: Wed, 7 Aug 2019 12:03:55 -0400 Subject: [PATCH 11/25] chore: remove email cc --- packages/polymath-offchain/src/utils/emails.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/polymath-offchain/src/utils/emails.js b/packages/polymath-offchain/src/utils/emails.js index 8e8e4b0be..1db5eeb7b 100644 --- a/packages/polymath-offchain/src/utils/emails.js +++ b/packages/polymath-offchain/src/utils/emails.js @@ -42,9 +42,6 @@ export const sendEmail = async ( from: { email: 'noreply@polymath.network', name: 'Polymath Network' }, replyTo, to: { email, name }, - // @FIXME remon-nashid: requests to SendGrid fail when cc and receiver addresses are the same. - // hardcoding CC email to my email to save the day. - cc: 'remon@polymath.network', subject, html: body, }; From 7422350b031994bcfa6e15153ae8a34b4b17510e Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 7 Aug 2019 13:40:37 -0400 Subject: [PATCH 12/25] chore(issuer): archive GPM when switch toggled --- .../polymath-issuer/src/actions/compliance.js | 91 +++++++++++++++---- .../src/pages/compliance/CompliancePage.js | 7 +- .../src/contracts/SecurityToken.js | 12 +++ 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index 0bcee1191..d6e457320 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -86,6 +86,20 @@ export type InvestorCSVRow = [ string, ]; +// make more functional and switch transfermanager to module +async function getDelegateDetails(permissionManager, transferManager) { + const delegates = await permissionManager.getAllDelegates( + transferManager.address, + PERM_TYPES.ADMIN + ); + let delegateDetails = []; + for (const delegate of delegates) { + let details = await permissionManager.getDelegateDetails(delegate); + delegateDetails.push({ id: delegate, address: delegate, details }); + } + return delegateDetails; +} + export const fetchManagers = () => async ( dispatch: Function, getState: GetState @@ -95,18 +109,17 @@ export const fetchManagers = () => async ( try { const st: SecurityToken = getState().token.token.contract; const permissionManager = await st.getPermissionManager(); - if (permissionManager) { + if (!permissionManager) { + return; + } + const moduleMetadata = await st.getModule(permissionManager.address); + if (permissionManager && !moduleMetadata.isArchived) { const transferManager = await st.getTransferManager(); if (transferManager) { - const delegates = await permissionManager.getAllDelegates( - transferManager.address, - PERM_TYPES.ADMIN + const delegateDetails = await getDelegateDetails( + permissionManager, + transferManager ); - let delegateDetails = []; - for (const delegate of delegates) { - let details = await permissionManager.getDelegateDetails(delegate); - delegateDetails.push({ id: delegate, address: delegate, details }); - } dispatch(loadManagers(delegateDetails)); } dispatch(toggleWhitelistManagement(true)); @@ -212,24 +225,22 @@ export const removeAddressFromTransferManager = (delegate: Address) => async ( ); }; -export const addGeneralPermissionModule = () => async ( +export const archiveGeneralPermissionModule = () => async ( dispatch: Function, getState: GetState ) => { const st: SecurityToken = getState().token.token.contract; - if (await st.getPermissionManager()) { - dispatch(toggleWhitelistManagement(true)); - return; - } dispatch( ui.tx( - ['Enabling General Permissions Manager for General Transfer Manager'], + ['Disabling General Permissions Manager'], async () => { - await st.setPermissionManager(); + const permissionManager = await st.getPermissionManager(); + await st.archiveModule(permissionManager.address); }, - 'General Permissions Manager for General Transfer Manager Enabled', + 'General Permissions Manager Disabled', () => { - dispatch(toggleWhitelistManagement(true)); + dispatch(toggleWhitelistManagement(false)); + dispatch(loadManagers([])); }, undefined, undefined, @@ -239,6 +250,50 @@ export const addGeneralPermissionModule = () => async ( ); }; +export const addGeneralPermissionModule = () => async ( + dispatch: Function, + getState: GetState +) => { + try { + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + const transferManager = await st.getTransferManager(); + let moduleMetadata = {}; + let delegateDetails = []; + + if (permissionManager) + moduleMetadata = await st.getModule(permissionManager.address); + + dispatch( + ui.tx( + ['Enabling General Permissions Manager for General Transfer Manager'], + async () => { + if (moduleMetadata.isArchived) { + await st.unarchiveModule(permissionManager.address); + delegateDetails = await getDelegateDetails( + permissionManager, + transferManager + ); + } else { + await st.setPermissionManager(); + } + }, + 'General Permissions Manager for General Transfer Manager Enabled', + () => { + dispatch(loadManagers(delegateDetails)); + dispatch(toggleWhitelistManagement(true)); + }, + undefined, + undefined, + undefined, + true + ) + ); + } catch (e) { + console.log(e); + } +}; + export const fetchWhitelist = () => async ( dispatch: Function, getState: GetState diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index fc3845635..e13dfa59f 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -44,6 +44,7 @@ import { fetchManagers, toggleWhitelistManagement, addGeneralPermissionModule, + archiveGeneralPermissionModule, } from '../../actions/compliance'; import Progress from '../token/components/Progress'; import AddInvestorForm, { @@ -106,6 +107,7 @@ type DispatchProps = {| updateOwnershipPercentage: (percentage: number) => any, toggleFreeze: () => any, addGeneralPermissionModule: () => any, + archiveGeneralPermissionModule: () => any, |}; const mapStateToProps = (state: RootState) => ({ @@ -138,6 +140,7 @@ const mapDispatchToProps = { fetchManagers, toggleWhitelistManagement, addGeneralPermissionModule, + archiveGeneralPermissionModule, }; type Props = StateProps & DispatchProps; @@ -189,7 +192,6 @@ class CompliancePage extends Component { this.setState({ percentage: this.props.percentage }); } this.props.fetchManagers(); - // TODO: check redux for whitelist enable } componentWillReceiveProps(nextProps) { @@ -199,7 +201,6 @@ class CompliancePage extends Component { ) { this.setState({ percentage: nextProps.percentage }); } - // TODO: check redux for whitelist enable } handleChangePages = pc => { @@ -422,7 +423,7 @@ class CompliancePage extends Component { if (isToggled) { await this.props.addGeneralPermissionModule(); } else { - this.props.toggleWhitelistManagement(false); + await this.props.archiveGeneralPermissionModule(); } }; diff --git a/packages/polymath-js/src/contracts/SecurityToken.js b/packages/polymath-js/src/contracts/SecurityToken.js index 44aff74ea..9a3e98af6 100644 --- a/packages/polymath-js/src/contracts/SecurityToken.js +++ b/packages/polymath-js/src/contracts/SecurityToken.js @@ -515,4 +515,16 @@ export default class SecurityToken extends Contract { 0 ); } + + async getModule(at: Address): Promise { + return this._methods.getModule(at).call(); + } + + async arhiveModule(at: Address): Promise { + return this._tx(this._methods.archiveModule(at)); + } + + async unarchiveModule(at: Address): Promise { + return this._tx(this._methods.unarchiveModule(at)); + } } From c17aaa1256ad2be17bd9f05d9fdf6f6f73daf703 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 7 Aug 2019 16:25:25 -0400 Subject: [PATCH 13/25] chore(issuer): fix styling --- .../src/pages/compliance/CompliancePage.js | 12 +++++------- .../pages/compliance/components/WhitelistModal.js | 5 ++--- .../polymath-issuer/src/pages/compliance/style.scss | 6 ++++++ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js index e13dfa59f..3b0ebf53c 100644 --- a/packages/polymath-issuer/src/pages/compliance/CompliancePage.js +++ b/packages/polymath-issuer/src/pages/compliance/CompliancePage.js @@ -642,8 +642,8 @@ class CompliancePage extends Component { - - + +

Token Whitelist

Whitelisted addresses may hold, buy, or sell the security token @@ -651,9 +651,7 @@ class CompliancePage extends Component { operations may be subject to restrictions.

-
- - + - + { Export Whitelist - + (
- + Whitelist Manager Wallet Address @@ -41,7 +40,7 @@ export const ConfirmEmailFormComponent = ({ handleSubmit, handleClose }) => ( - + Whitelist Manager Details diff --git a/packages/polymath-issuer/src/pages/compliance/style.scss b/packages/polymath-issuer/src/pages/compliance/style.scss index e792a3393..5a6c919b3 100644 --- a/packages/polymath-issuer/src/pages/compliance/style.scss +++ b/packages/polymath-issuer/src/pages/compliance/style.scss @@ -2,6 +2,12 @@ cursor: pointer; } +.form-item-header { + margin-top: 12px; + margin-bottom: 5px; + font-size: 14px; +} + .compliance-form { width: 100%; From 3167741cbd688dc8d1fb8c661806a651fe10e1c3 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 7 Aug 2019 20:03:18 -0400 Subject: [PATCH 14/25] chore(issuer): remove investor address text --- .../polymath-issuer/src/actions/compliance.js | 76 +++++++++---------- .../compliance/components/WhitelistModal.js | 2 +- 2 files changed, 37 insertions(+), 41 deletions(-) diff --git a/packages/polymath-issuer/src/actions/compliance.js b/packages/polymath-issuer/src/actions/compliance.js index d6e457320..74a071f8e 100644 --- a/packages/polymath-issuer/src/actions/compliance.js +++ b/packages/polymath-issuer/src/actions/compliance.js @@ -183,7 +183,7 @@ export const removeAddressFromTransferManager = (delegate: Address) => async ( ui.confirm(

- Once removed, the investor wallet will no longer have permission to + Once removed, the whitelist manager will no longer have permission to update the whitelist. Consult your legal team before removing a wallet from the list.

@@ -218,7 +218,7 @@ export const removeAddressFromTransferManager = (delegate: Address) => async ( ) ); }, - `Remove the Investor Wallet from the Whitelist Managers List?`, + `Remove the Whitelist Manager from the Whitelist Managers List?`, undefined, 'pui-large-confirm-modal' ) @@ -254,44 +254,40 @@ export const addGeneralPermissionModule = () => async ( dispatch: Function, getState: GetState ) => { - try { - const st: SecurityToken = getState().token.token.contract; - const permissionManager = await st.getPermissionManager(); - const transferManager = await st.getTransferManager(); - let moduleMetadata = {}; - let delegateDetails = []; - - if (permissionManager) - moduleMetadata = await st.getModule(permissionManager.address); - - dispatch( - ui.tx( - ['Enabling General Permissions Manager for General Transfer Manager'], - async () => { - if (moduleMetadata.isArchived) { - await st.unarchiveModule(permissionManager.address); - delegateDetails = await getDelegateDetails( - permissionManager, - transferManager - ); - } else { - await st.setPermissionManager(); - } - }, - 'General Permissions Manager for General Transfer Manager Enabled', - () => { - dispatch(loadManagers(delegateDetails)); - dispatch(toggleWhitelistManagement(true)); - }, - undefined, - undefined, - undefined, - true - ) - ); - } catch (e) { - console.log(e); - } + const st: SecurityToken = getState().token.token.contract; + const permissionManager = await st.getPermissionManager(); + const transferManager = await st.getTransferManager(); + let moduleMetadata = {}; + let delegateDetails = []; + + if (permissionManager) + moduleMetadata = await st.getModule(permissionManager.address); + + dispatch( + ui.tx( + ['Enabling General Permissions Manager for General Transfer Manager'], + async () => { + if (moduleMetadata.isArchived) { + await st.unarchiveModule(permissionManager.address); + delegateDetails = await getDelegateDetails( + permissionManager, + transferManager + ); + } else { + await st.setPermissionManager(); + } + }, + 'General Permissions Manager for General Transfer Manager Enabled', + () => { + dispatch(loadManagers(delegateDetails)); + dispatch(toggleWhitelistManagement(true)); + }, + undefined, + undefined, + undefined, + true + ) + ); }; export const fetchWhitelist = () => async ( diff --git a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js index 220fdb23c..9553c2f1f 100644 --- a/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js +++ b/packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js @@ -89,7 +89,7 @@ class WhitelistModal extends Component { Add Whitelist Manager

- Specify the investor wallet address of the new whitelist manager. + Specify the whitelist manager address of the new whitelist manager. Each manager will have permission to update the whitelist. Consult with your legal team before adding a new wallet to the list.

From 1f6bdfb8c515eb875a4a09a71a0ab0b6def40bf6 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 11:33:18 -0400 Subject: [PATCH 15/25] chore(issuer): add sonar scanner --- .circleci/config.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 30d31e623..48b719c61 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,8 +19,26 @@ references: run: name: Yarn install command: yarn install --frozen-lockfile + run_sonar: &run_sonar + run: + name: Run Sonarqube scanner + command: > + export SONAR_SCANNER_OPTS="-Xmx2048m" + eval ./sonar-scanner-3.2.0.1227-linux/bin/sonar-scanner + -Dsonar.projectKey=issuer \ + -Dsonar.sources=. \ + -Dsonar.sourceEncoding=US-ASCII \ + -Dsonar.exclusions=vendor/bundle/** \ + -Dsonar.host.url=https://sonarqube.onehq.com \ + -Dsonar.projectVersion=0 \ + -Dsonar.login=${SONARQUBE_TOKEN} $SONAR_SCANNER_OPTS_CUSTOM jobs: + run: + name: Install SonarScanner + command: + wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip + unzip sonar-scanner-cli-4.0.0.1744-linux.zip install_dependencies: <<: *container_config steps: @@ -56,6 +74,7 @@ jobs: <<: *container_config steps: - checkout + - *run_sonar - *restore_yarn_cache - *yarn_install - *save_cache From 46a2e0ecbd37f2908b5f641643a13618984adb30 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 11:39:17 -0400 Subject: [PATCH 16/25] chore(issuer): add docker field --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 48b719c61..784765b35 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,6 +35,7 @@ references: jobs: run: + <<: *container_config name: Install SonarScanner command: wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip From 3e68f91c880f6f91a667f3da707e323af3e5ddc3 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 11:43:02 -0400 Subject: [PATCH 17/25] chore(issuer): test --- .circleci/config.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 784765b35..78897e1b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,6 +15,12 @@ references: key: yarn-packages-{{ checksum "yarn.lock" }} paths: - ~/.cache/yarn + install_sonar: &install_sonar + run: + name: Install SonarScanner + command: + wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip + unzip sonar-scanner-cli-4.0.0.1744-linux.zip yarn_install: &yarn_install run: name: Yarn install @@ -34,12 +40,6 @@ references: -Dsonar.login=${SONARQUBE_TOKEN} $SONAR_SCANNER_OPTS_CUSTOM jobs: - run: - <<: *container_config - name: Install SonarScanner - command: - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip - unzip sonar-scanner-cli-4.0.0.1744-linux.zip install_dependencies: <<: *container_config steps: From 98d7a004aea22987486a5148fca8b54e43044857 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 11:50:26 -0400 Subject: [PATCH 18/25] chore(issuer): test --- .circleci/config.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 78897e1b1..b498d1996 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,7 +30,7 @@ references: name: Run Sonarqube scanner command: > export SONAR_SCANNER_OPTS="-Xmx2048m" - eval ./sonar-scanner-3.2.0.1227-linux/bin/sonar-scanner + eval ./sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner -Dsonar.projectKey=issuer \ -Dsonar.sources=. \ -Dsonar.sourceEncoding=US-ASCII \ @@ -75,6 +75,7 @@ jobs: <<: *container_config steps: - checkout + - *install_sonar - *run_sonar - *restore_yarn_cache - *yarn_install From fa6755409e22633bd5a04e1ebd433466c393c2b8 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 14:39:25 -0400 Subject: [PATCH 19/25] chore(issuer): multiline command --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b498d1996..c51be8912 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,7 +18,7 @@ references: install_sonar: &install_sonar run: name: Install SonarScanner - command: + command: | wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip unzip sonar-scanner-cli-4.0.0.1744-linux.zip yarn_install: &yarn_install @@ -28,7 +28,7 @@ references: run_sonar: &run_sonar run: name: Run Sonarqube scanner - command: > + command: | export SONAR_SCANNER_OPTS="-Xmx2048m" eval ./sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner -Dsonar.projectKey=issuer \ From 6be079dee5e31bfac988343a933cd86b4f0e45c4 Mon Sep 17 00:00:00 2001 From: Fahd Date: Wed, 14 Aug 2019 16:54:37 -0400 Subject: [PATCH 20/25] chore(issuer): set correct url --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c51be8912..e6aaf41d6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,7 +35,7 @@ references: -Dsonar.sources=. \ -Dsonar.sourceEncoding=US-ASCII \ -Dsonar.exclusions=vendor/bundle/** \ - -Dsonar.host.url=https://sonarqube.onehq.com \ + -Dsonar.host.url=https://sonarcloud.io \ -Dsonar.projectVersion=0 \ -Dsonar.login=${SONARQUBE_TOKEN} $SONAR_SCANNER_OPTS_CUSTOM From 4d08d77173de06a1221fc36392ff613b1a18dcba Mon Sep 17 00:00:00 2001 From: Fahd Date: Fri, 16 Aug 2019 11:10:38 -0400 Subject: [PATCH 21/25] chore(issuer): fix circleci --- .circleci/config.yml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e6aaf41d6..30d31e623 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,29 +15,10 @@ references: key: yarn-packages-{{ checksum "yarn.lock" }} paths: - ~/.cache/yarn - install_sonar: &install_sonar - run: - name: Install SonarScanner - command: | - wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.0.0.1744-linux.zip - unzip sonar-scanner-cli-4.0.0.1744-linux.zip yarn_install: &yarn_install run: name: Yarn install command: yarn install --frozen-lockfile - run_sonar: &run_sonar - run: - name: Run Sonarqube scanner - command: | - export SONAR_SCANNER_OPTS="-Xmx2048m" - eval ./sonar-scanner-4.0.0.1744-linux/bin/sonar-scanner - -Dsonar.projectKey=issuer \ - -Dsonar.sources=. \ - -Dsonar.sourceEncoding=US-ASCII \ - -Dsonar.exclusions=vendor/bundle/** \ - -Dsonar.host.url=https://sonarcloud.io \ - -Dsonar.projectVersion=0 \ - -Dsonar.login=${SONARQUBE_TOKEN} $SONAR_SCANNER_OPTS_CUSTOM jobs: install_dependencies: @@ -75,8 +56,6 @@ jobs: <<: *container_config steps: - checkout - - *install_sonar - - *run_sonar - *restore_yarn_cache - *yarn_install - *save_cache From 7ba4057de1a6ed969db790b42f4481addb0094e4 Mon Sep 17 00:00:00 2001 From: Remon Nashid Date: Fri, 16 Aug 2019 12:19:47 -0400 Subject: [PATCH 22/25] chore(issuer): alter provider form text on testnet --- .../src/pages/providers/ApplyForm.js | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/polymath-issuer/src/pages/providers/ApplyForm.js b/packages/polymath-issuer/src/pages/providers/ApplyForm.js index 8f1043469..4e9ff2e07 100644 --- a/packages/polymath-issuer/src/pages/providers/ApplyForm.js +++ b/packages/polymath-issuer/src/pages/providers/ApplyForm.js @@ -65,7 +65,8 @@ const linkTooltip = (title: string) => ( ); -export const ApplyFormComponent = ({ handleSubmit, onClose }) => { +export const ApplyFormComponent = args => { + const { handleSubmit, onClose, networkId } = args; return ( @@ -145,25 +146,45 @@ export const ApplyFormComponent = ({ handleSubmit, onClose }) => {

-

- When you click submit, an email which contains the information entered - on that screen will be sent to the Advisory firm(s) you have selected. - None of this information is stored on Polymath servers, only your - browser's cache. To clear this information, simply clear your - browser's cache. -

+ {networkId === 1 ? ( +

+ When you click submit, an email which contains the information entered + on that screen will be sent to the Advisory firm(s) you have selected. + None of this information is stored on Polymath servers, only your + browser's cache. To clear this information, simply clear your + browser's cache. +

+ ) : ( +

+ + + You are using Token Studio in a testnet environment. When you + click submit, an email WILL NOT be sent to the providers you have + selected. To send an email to the selected providers, please log + into Token Studio with mainnet. +
+ None of this information is stored on Polymath servers, only your + browser's cache. To clear this information, simply clear your + browser's cache. +
+
+

+ )}
); }; -const mapStateToProps = ({ providers: { application } }) => ({ application }); +const mapStateToProps = ({ + providers: { application }, + network: { id: networkId }, +}) => ({ application, networkId }); const formikEnhancer = withFormik({ validationSchema: formSchema, displayName: 'ApplyForm', validatOnChange: false, - mapPropsToValues: ({ application }) => { + mapPropsToValues: ({ application, networkId }) => { const { companyName, companyDesc, From 319189359229bbf8193aa4a7c13cfb425bd63271 Mon Sep 17 00:00:00 2001 From: Remon Nashid Date: Fri, 16 Aug 2019 12:22:07 -0400 Subject: [PATCH 23/25] chore(issuer): remove unnecessary code --- packages/polymath-issuer/src/pages/providers/ApplyForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/polymath-issuer/src/pages/providers/ApplyForm.js b/packages/polymath-issuer/src/pages/providers/ApplyForm.js index 4e9ff2e07..9baa74b74 100644 --- a/packages/polymath-issuer/src/pages/providers/ApplyForm.js +++ b/packages/polymath-issuer/src/pages/providers/ApplyForm.js @@ -184,7 +184,7 @@ const formikEnhancer = withFormik({ validationSchema: formSchema, displayName: 'ApplyForm', validatOnChange: false, - mapPropsToValues: ({ application, networkId }) => { + mapPropsToValues: ({ application }) => { const { companyName, companyDesc, From af25dad5ebb7c3d2db6c95b07ae1f03635d2b007 Mon Sep 17 00:00:00 2001 From: Remon Nashid Date: Fri, 16 Aug 2019 15:05:17 -0400 Subject: [PATCH 24/25] chore(issuer): use MAINNET_NETWORK_ID --- packages/polymath-issuer/src/pages/providers/ApplyForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/polymath-issuer/src/pages/providers/ApplyForm.js b/packages/polymath-issuer/src/pages/providers/ApplyForm.js index 9baa74b74..28f2299d0 100644 --- a/packages/polymath-issuer/src/pages/providers/ApplyForm.js +++ b/packages/polymath-issuer/src/pages/providers/ApplyForm.js @@ -10,7 +10,7 @@ import { TextArea, } from '@polymathnetwork/ui'; import validator from '@polymathnetwork/ui/validator'; - +import { MAINNET_NETWORK_ID } from '@polymathnetwork/shared/constants'; import { applyProviders } from '../../actions/providers'; const requiredMessage = 'Required.'; @@ -146,7 +146,7 @@ export const ApplyFormComponent = args => {

- {networkId === 1 ? ( + {networkId === MAINNET_NETWORK_ID ? (

When you click submit, an email which contains the information entered on that screen will be sent to the Advisory firm(s) you have selected. From 5129639f0307d102be4a65f909dc3ffe274a5c6b Mon Sep 17 00:00:00 2001 From: Remon Nashid Date: Fri, 16 Aug 2019 15:15:06 -0400 Subject: [PATCH 25/25] chore(issuer): replace args with props --- packages/polymath-issuer/src/pages/providers/ApplyForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/polymath-issuer/src/pages/providers/ApplyForm.js b/packages/polymath-issuer/src/pages/providers/ApplyForm.js index 28f2299d0..ae939059c 100644 --- a/packages/polymath-issuer/src/pages/providers/ApplyForm.js +++ b/packages/polymath-issuer/src/pages/providers/ApplyForm.js @@ -65,8 +65,8 @@ const linkTooltip = (title: string) => ( ); -export const ApplyFormComponent = args => { - const { handleSubmit, onClose, networkId } = args; +export const ApplyFormComponent = props => { + const { handleSubmit, onClose, networkId } = props; return (