Skip to content

Commit b56962e

Browse files
authored
Merge pull request #638 from PolymathNetwork/release
Release 2.1
2 parents 6ef7240 + 1a17880 commit b56962e

File tree

13 files changed

+868
-196
lines changed

13 files changed

+868
-196
lines changed

.vscode/settings.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{
2-
"editor.formatOnSave": true,
32
"prettier.eslintIntegration": true,
43
"search.exclude": {
54
"**/node_modules": true,

packages/polymath-issuer/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"node": ">=8.9"
88
},
99
"scripts": {
10-
"start:prod": "serve -s build",
1110
"start": "node scripts/start.js",
11+
"start:prod": "serve -s build",
1212
"build": "node scripts/build.js",
1313
"test": "node ./scripts/test.js --env=jsdom",
1414
"typecheck": "flow --show-all-branches"

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

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ 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';
18+
import Web3 from 'web3';
1719

1820
import type { Investor, Address } from '@polymathnetwork/js/types';
1921
import type { GetState } from '../redux/reducer';
@@ -39,6 +41,31 @@ export const listLength = (listLength: number) => ({
3941
listLength,
4042
});
4143

44+
export const LOAD_MANAGERS = 'compliance/LOAD_MANAGERS';
45+
export const loadManagers = managers => ({
46+
type: LOAD_MANAGERS,
47+
managers,
48+
});
49+
50+
export const ADD_MANAGER = 'compliance/ADD_MANAGER';
51+
export const addManager = manager => ({
52+
type: ADD_MANAGER,
53+
manager,
54+
});
55+
56+
export const REMOVE_MANAGER = 'compliance/REMOVE_MANAGER';
57+
export const removeManager = address => ({
58+
type: REMOVE_MANAGER,
59+
address,
60+
});
61+
62+
export const TOGGLE_WHITELIST_MANAGEMENT =
63+
'compliance/TOGGLE_WHITELIST_MANAGEMENT';
64+
export const toggleWhitelistManagement = (isToggled: boolean) => ({
65+
type: TOGGLE_WHITELIST_MANAGEMENT,
66+
isToggled,
67+
});
68+
4269
export const RESET_UPLOADED = 'compliance/RESET_UPLOADED';
4370
export const resetUploaded = () => ({ type: RESET_UPLOADED });
4471

@@ -59,6 +86,210 @@ export type InvestorCSVRow = [
5986
string,
6087
];
6188

89+
// make more functional and switch transfermanager to module
90+
async function getDelegateDetails(permissionManager, transferManager) {
91+
const delegates = await permissionManager.getAllDelegates(
92+
transferManager.address,
93+
PERM_TYPES.ADMIN
94+
);
95+
let delegateDetails = [];
96+
for (const delegate of delegates) {
97+
let details = await permissionManager.getDelegateDetails(delegate);
98+
delegateDetails.push({ id: delegate, address: delegate, details });
99+
}
100+
return delegateDetails;
101+
}
102+
103+
export const fetchManagers = () => async (
104+
dispatch: Function,
105+
getState: GetState
106+
) => {
107+
dispatch(ui.fetching());
108+
// $FlowFixMe
109+
try {
110+
const st: SecurityToken = getState().token.token.contract;
111+
const permissionManager = await st.getPermissionManager();
112+
if (!permissionManager) {
113+
return;
114+
}
115+
const moduleMetadata = await st.getModule(permissionManager.address);
116+
if (permissionManager && !moduleMetadata.isArchived) {
117+
const transferManager = await st.getTransferManager();
118+
if (transferManager) {
119+
const delegateDetails = await getDelegateDetails(
120+
permissionManager,
121+
transferManager
122+
);
123+
dispatch(loadManagers(delegateDetails));
124+
}
125+
dispatch(toggleWhitelistManagement(true));
126+
} else {
127+
dispatch(toggleWhitelistManagement(false));
128+
}
129+
dispatch(ui.fetched());
130+
} catch (e) {
131+
console.log(e);
132+
}
133+
};
134+
135+
export const addAddressToTransferManager = (
136+
delegate: Address,
137+
details: string
138+
) => async (dispatch: Function, getState: GetState) => {
139+
const st: SecurityToken = getState().token.token.contract;
140+
const permissionManager = await st.getPermissionManager();
141+
const titles = ['Adding New Whitelist Manager', 'Setting Permissions'];
142+
const isDelegate = await permissionManager.checkDelegate(delegate);
143+
if (isDelegate) {
144+
titles.shift();
145+
}
146+
dispatch(
147+
ui.tx(
148+
titles,
149+
async () => {
150+
if (permissionManager) {
151+
const transferManager = await st.getTransferManager();
152+
if (transferManager) {
153+
if (!isDelegate) {
154+
await permissionManager.addDelegate(delegate, details);
155+
}
156+
await permissionManager.changePermission(
157+
delegate,
158+
transferManager.address,
159+
PERM_TYPES.ADMIN,
160+
true
161+
);
162+
}
163+
}
164+
},
165+
'New Whistlist Manager Added',
166+
() => {
167+
dispatch(addManager({ address: delegate, details: details }));
168+
},
169+
undefined,
170+
undefined,
171+
undefined,
172+
true
173+
)
174+
);
175+
};
176+
177+
// TODO: Add confirm dialog box
178+
export const removeAddressFromTransferManager = (delegate: Address) => async (
179+
dispatch: Function,
180+
getState: GetState
181+
) => {
182+
dispatch(
183+
ui.confirm(
184+
<div>
185+
<p>
186+
Once removed, the whitelist manager will no longer have permission to
187+
update the whitelist. Consult your legal team before removing a wallet
188+
from the list.
189+
</p>
190+
</div>,
191+
async () => {
192+
dispatch(
193+
ui.tx(
194+
['Removing Whitelist Manager'],
195+
async () => {
196+
const st: SecurityToken = getState().token.token.contract;
197+
const permissionManager = await st.getPermissionManager();
198+
if (permissionManager) {
199+
const transferManager = await st.getTransferManager();
200+
if (transferManager) {
201+
await permissionManager.changePermission(
202+
delegate,
203+
transferManager.address,
204+
PERM_TYPES.ADMIN,
205+
false
206+
);
207+
}
208+
}
209+
},
210+
'Whitelist Manager Removed',
211+
() => {
212+
dispatch(removeManager(delegate));
213+
},
214+
undefined,
215+
undefined,
216+
undefined,
217+
true
218+
)
219+
);
220+
},
221+
`Remove the Whitelist Manager from the Whitelist Managers List?`,
222+
undefined,
223+
'pui-large-confirm-modal'
224+
)
225+
);
226+
};
227+
228+
export const archiveGeneralPermissionModule = () => async (
229+
dispatch: Function,
230+
getState: GetState
231+
) => {
232+
const st: SecurityToken = getState().token.token.contract;
233+
dispatch(
234+
ui.tx(
235+
['Disabling General Permissions Manager'],
236+
async () => {
237+
const permissionManager = await st.getPermissionManager();
238+
await st.archiveModule(permissionManager.address);
239+
},
240+
'General Permissions Manager Disabled',
241+
() => {
242+
dispatch(toggleWhitelistManagement(false));
243+
dispatch(loadManagers([]));
244+
},
245+
undefined,
246+
undefined,
247+
undefined,
248+
true
249+
)
250+
);
251+
};
252+
253+
export const addGeneralPermissionModule = () => async (
254+
dispatch: Function,
255+
getState: GetState
256+
) => {
257+
const st: SecurityToken = getState().token.token.contract;
258+
const permissionManager = await st.getPermissionManager();
259+
const transferManager = await st.getTransferManager();
260+
let moduleMetadata = {};
261+
let delegateDetails = [];
262+
263+
if (permissionManager)
264+
moduleMetadata = await st.getModule(permissionManager.address);
265+
266+
dispatch(
267+
ui.tx(
268+
['Enabling General Permissions Manager for General Transfer Manager'],
269+
async () => {
270+
if (moduleMetadata.isArchived) {
271+
await st.unarchiveModule(permissionManager.address);
272+
delegateDetails = await getDelegateDetails(
273+
permissionManager,
274+
transferManager
275+
);
276+
} else {
277+
await st.setPermissionManager();
278+
}
279+
},
280+
'General Permissions Manager for General Transfer Manager Enabled',
281+
() => {
282+
dispatch(loadManagers(delegateDetails));
283+
dispatch(toggleWhitelistManagement(true));
284+
},
285+
undefined,
286+
undefined,
287+
undefined,
288+
true
289+
)
290+
);
291+
};
292+
62293
export const fetchWhitelist = () => async (
63294
dispatch: Function,
64295
getState: GetState

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,

0 commit comments

Comments
 (0)