@@ -14,6 +14,8 @@ import { formName as addInvestorFormName } from '../pages/compliance/components/
1414import { formName as editInvestorsFormName } from '../pages/compliance/components/EditInvestorsForm' ;
1515import { parseWhitelistCsv } from '../utils/parsers' ;
1616import { STAGE_OVERVIEW } from '../reducers/sto' ;
17+ import { PERM_TYPES } from '../constants' ;
18+ import Web3 from 'web3' ;
1719
1820import type { Investor , Address } from '@polymathnetwork/js/types' ;
1921import 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+
4269export const RESET_UPLOADED = 'compliance/RESET_UPLOADED' ;
4370export 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+
62293export const fetchWhitelist = ( ) => async (
63294 dispatch : Function ,
64295 getState : GetState
0 commit comments