Skip to content

Commit 13a8338

Browse files
author
Fahd
committed
chore(issuer): check delegates when adding, fix other flow issues
1 parent 5afd0d8 commit 13a8338

7 files changed

Lines changed: 110 additions & 57 deletions

File tree

packages/polymath-issuer/src/actions/compliance.js

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { formName as addInvestorFormName } from '../pages/compliance/components/
1414
import { formName as editInvestorsFormName } from '../pages/compliance/components/EditInvestorsForm';
1515
import { parseWhitelistCsv } from '../utils/parsers';
1616
import { STAGE_OVERVIEW } from '../reducers/sto';
17+
import { PERM_TYPES } from '../constants';
1718
import Web3 from 'web3';
1819

1920
import type { Investor, Address } from '@polymathnetwork/js/types';
@@ -99,8 +100,8 @@ export const fetchManagers = () => async (
99100
if (transferManager) {
100101
const delegates = await permissionManager.getAllDelegates(
101102
transferManager.address,
102-
'ADMIN'
103-
); // put in const
103+
PERM_TYPES.ADMIN
104+
);
104105
let delegateDetails = [];
105106
for (const delegate of delegates) {
106107
let details = await permissionManager.getDelegateDetails(delegate);
@@ -122,22 +123,27 @@ export const addAddressToTransferManager = (
122123
delegate: Address,
123124
details: string
124125
) => async (dispatch: Function, getState: GetState) => {
126+
const st: SecurityToken = getState().token.token.contract;
127+
const permissionManager = await st.getPermissionManager();
128+
const titles = ['Adding New Whitelist Manager', 'Setting Permissions'];
129+
const isDelegate = await permissionManager.checkDelegate(delegate);
130+
if (isDelegate) {
131+
titles.shift();
132+
}
125133
dispatch(
126134
ui.tx(
127-
['Adding New Whitelist Manager', 'Setting Permissions'],
135+
titles,
128136
async () => {
129-
const st: SecurityToken = getState().token.token.contract;
130-
const permissionManager = await st.getPermissionManager();
131137
if (permissionManager) {
132138
const transferManager = await st.getTransferManager();
133139
if (transferManager) {
134-
console.log(delegate, details);
135-
// TODO: Check if the delegate already exists
136-
await permissionManager.addDelegate(delegate, details);
140+
if (!isDelegate) {
141+
await permissionManager.addDelegate(delegate, details);
142+
}
137143
await permissionManager.changePermission(
138144
delegate,
139145
transferManager.address,
140-
'ADMIN',
146+
PERM_TYPES.ADMIN,
141147
true
142148
);
143149
}
@@ -161,31 +167,47 @@ export const removeAddressFromTransferManager = (delegate: Address) => async (
161167
getState: GetState
162168
) => {
163169
dispatch(
164-
ui.tx(
165-
['Removing Whitelist Manager'],
170+
ui.confirm(
171+
<div>
172+
<p>
173+
Once removed, the investor wallet will no longer have permission to
174+
update the whitelist. Consult your legal team before removing a wallet
175+
from the list.
176+
</p>
177+
</div>,
166178
async () => {
167-
const st: SecurityToken = getState().token.token.contract;
168-
const permissionManager = await st.getPermissionManager();
169-
if (permissionManager) {
170-
const transferManager = await st.getTransferManager();
171-
if (transferManager) {
172-
await permissionManager.changePermission(
173-
delegate,
174-
transferManager.address,
175-
'ADMIN',
176-
false
177-
);
178-
}
179-
}
180-
},
181-
'Whitelist Manager Removed',
182-
() => {
183-
dispatch(removeManager(delegate));
179+
dispatch(
180+
ui.tx(
181+
['Removing Whitelist Manager'],
182+
async () => {
183+
const st: SecurityToken = getState().token.token.contract;
184+
const permissionManager = await st.getPermissionManager();
185+
if (permissionManager) {
186+
const transferManager = await st.getTransferManager();
187+
if (transferManager) {
188+
await permissionManager.changePermission(
189+
delegate,
190+
transferManager.address,
191+
PERM_TYPES.ADMIN,
192+
false
193+
);
194+
}
195+
}
196+
},
197+
'Whitelist Manager Removed',
198+
() => {
199+
dispatch(removeManager(delegate));
200+
},
201+
undefined,
202+
undefined,
203+
undefined,
204+
true
205+
)
206+
);
184207
},
208+
`Remove the Investor Wallet from the Whitelist Managers List?`,
185209
undefined,
186-
undefined,
187-
undefined,
188-
true
210+
'pui-large-confirm-modal'
189211
)
190212
);
191213
};
@@ -194,11 +216,15 @@ export const addGeneralPermissionModule = () => async (
194216
dispatch: Function,
195217
getState: GetState
196218
) => {
219+
const st: SecurityToken = getState().token.token.contract;
220+
if (st.getPermissionManager()) {
221+
dispatch(toggleWhitelistManagement(true));
222+
return;
223+
}
197224
dispatch(
198225
ui.tx(
199226
['Enabling General Permissions Manager for General Transfer Manager'],
200227
async () => {
201-
const st: SecurityToken = getState().token.token.contract;
202228
await st.setPermissionManager();
203229
},
204230
'General Permissions Manager for General Transfer Manager Enabled',

packages/polymath-issuer/src/constants.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export const EVENT_TYPES = {
88
TOKEN_PURCHASE: 'TokenPurchase',
99
};
1010

11+
export const PERM_TYPES = {
12+
ADMIN: 'ADMIN',
13+
};
14+
1115
export const MODULE_TYPES = {
1216
PERMISSION: 1,
1317
TRANSFER: 2,

packages/polymath-issuer/src/pages/compliance/CompliancePage.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,22 @@ class CompliancePage extends Component<Props, State> {
681681
Export Whitelist
682682
</Button>
683683
</Grid.Col>
684+
<Grid.Col>
685+
<OverflowMenu floatingMenu flipped style={{ float: 'right' }}>
686+
<OverflowMenuItem
687+
itemText={
688+
this.props.isTokenFrozen
689+
? 'Resume All Transfers'
690+
: 'Pause All Transfers'
691+
}
692+
onClick={
693+
this.props.isTokenFrozen
694+
? this.handleUnFreezeModalOpen
695+
: this.handleFreezeModalOpen
696+
}
697+
/>
698+
</OverflowMenu>
699+
</Grid.Col>
684700
</Grid.Row>
685701
<Grid.Row>
686702
<Grid.Col gridSpan={[12, 12, 6, 6]}>
@@ -764,20 +780,6 @@ class CompliancePage extends Component<Props, State> {
764780
<div id="compliance">
765781
<br />
766782
<div className="pui-page-box compliance-form">
767-
{/* <OverflowMenu floatingMenu flipped style={{ float: 'right' }}>
768-
<OverflowMenuItem
769-
itemText={
770-
this.props.isTokenFrozen
771-
? 'Resume All Transfers'
772-
: 'Pause All Transfers'
773-
}
774-
onClick={
775-
this.props.isTokenFrozen
776-
? this.handleUnFreezeModalOpen
777-
: this.handleFreezeModalOpen
778-
}
779-
/>
780-
</OverflowMenu> */}
781783
<h1 className="pui-h1">Whitelist Management</h1>
782784
<div className="whitelist-settings">
783785
<div className="bx--form-item">

packages/polymath-issuer/src/pages/compliance/components/WhitelistModal.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,26 @@ const formikEnhancer = withFormik({
6161
validationSchema: formSchema,
6262
displayName: 'ConfirmEmailForm',
6363
validateOnChange: false,
64-
handleSubmit: (values, { props }) => {
65-
const { dispatch } = props;
64+
handleSubmit: (values, { setFieldError, props }) => {
65+
const { dispatch, approvedManagers } = props;
66+
const addressExists = approvedManagers.find(
67+
i => i.address === values.address
68+
);
69+
if (addressExists) {
70+
setFieldError('address', 'Address is already added to Whitelist Manager');
71+
return;
72+
}
6673
props.handleClose();
6774
dispatch(addAddressToTransferManager(values.address, values.details));
6875
},
6976
});
7077

78+
const mapStateToProps = state => ({
79+
approvedManagers: state.whitelist.approvedManagers,
80+
});
81+
7182
const FormikEnhancedForm = formikEnhancer(ConfirmEmailFormComponent);
72-
const ConnectedForm = connect()(FormikEnhancedForm);
83+
const ConnectedForm = connect(mapStateToProps)(FormikEnhancedForm);
7384

7485
class WhitelistModal extends Component<Props> {
7586
render() {

packages/polymath-issuer/src/pages/compliance/components/WhitelistTable.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,14 +103,16 @@ class WhitelistTable extends Component<Props, State> {
103103
{row.cells.map(cell => (
104104
<TableCell key={cell.id}>{cell.value}</TableCell>
105105
))}
106-
<TableCell onClick={() => this.handleDelete(row.id)}>
107-
<Icon
108-
name="delete"
109-
// fill="#E71D32"
110-
width="12"
111-
height="12"
112-
/>
113-
</TableCell>
106+
{approvedManagers.length > 0 ? (
107+
<TableCell
108+
className="delete-icon"
109+
onClick={() => this.handleDelete(row.id)}
110+
>
111+
<Icon name="delete" width="12" height="12" />
112+
</TableCell>
113+
) : (
114+
<TableCell />
115+
)}
114116
</TableRow>
115117
))}
116118
</TableBody>

packages/polymath-issuer/src/pages/compliance/style.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.delete-icon {
2+
cursor: pointer;
3+
}
4+
15
.compliance-form {
26
width: 100%;
37

packages/polymath-js/src/contracts/PermissionManager.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ export default class PermissionManager extends Contract {
2323
return this._tx(this._methods.addDelegate(at, this._toBytes(details)));
2424
}
2525

26+
async checkDelegate(at: Address) {
27+
return this._methods.checkDelegate(at).call();
28+
}
29+
2630
async getDelegateDetails(delegate: Address) {
2731
let details = await this._methods.delegateDetails(delegate).call();
2832
return this._toAscii(details);

0 commit comments

Comments
 (0)