@@ -15,12 +15,26 @@ import {
15
15
ModuleType ,
16
16
BigNumber ,
17
17
isERC20DividendCheckpoint ,
18
+ BlacklistTransferManager ,
19
+ LockUpTransferManager ,
20
+ VestingEscrowWallet ,
21
+ RestrictedPartialSaleTransferManager ,
22
+ Perm ,
18
23
} from '@polymathnetwork/contract-wrappers' ;
19
24
import { range , flatten , includes } from 'lodash' ;
20
25
import P from 'bluebird' ;
21
26
import semver from 'semver' ;
22
27
import { PolymathError } from './PolymathError' ;
23
- import { ErrorCode , DividendType } from './types' ;
28
+ import { ErrorCode , DividendType , Module , Role , SecurityTokenRole } from './types' ;
29
+
30
+ interface GetModuleAddressesByNameParams {
31
+ symbol : string ;
32
+ moduleName : ModuleName ;
33
+ }
34
+
35
+ interface GetModuleAddressesByNameOpts {
36
+ unarchived : boolean ;
37
+ }
24
38
25
39
interface GetAttachedModulesParams {
26
40
symbol : string ;
@@ -55,6 +69,18 @@ interface GetAttachedVolumeRestrictionTransferManagersParams extends GetAttached
55
69
moduleName : ModuleName . VolumeRestrictionTM ;
56
70
}
57
71
72
+ interface GetAttachedBlacklistTransferManagersParams extends GetAttachedModulesParams {
73
+ moduleName : ModuleName . BlacklistTransferManager ;
74
+ }
75
+
76
+ interface GetAttachedLockUpTransferManagersParams extends GetAttachedModulesParams {
77
+ moduleName : ModuleName . LockUpTransferManager ;
78
+ }
79
+
80
+ interface GetAttachedRestrictedPartialSaleTransferManagersParams extends GetAttachedModulesParams {
81
+ moduleName : ModuleName . RestrictedPartialSaleTM ;
82
+ }
83
+
58
84
interface GetAttachedCappedStosParams extends GetAttachedModulesParams {
59
85
moduleName : ModuleName . CappedSTO ;
60
86
}
@@ -71,6 +97,10 @@ interface GetAttachedEtherDividendCheckpointsParams extends GetAttachedModulesPa
71
97
moduleName : ModuleName . EtherDividendCheckpoint ;
72
98
}
73
99
100
+ interface GetAttachedVestingEscrowWalletsParams extends GetAttachedModulesParams {
101
+ moduleName : ModuleName . VestingEscrowWallet ;
102
+ }
103
+
74
104
interface GetAttachedModules {
75
105
( params : GetAttachedGeneralPermissionManagersParams , opts ?: GetAttachedModulesOpts ) : Promise <
76
106
GeneralPermissionManager [ ]
@@ -91,6 +121,16 @@ interface GetAttachedModules {
91
121
params : GetAttachedVolumeRestrictionTransferManagersParams ,
92
122
opts ?: GetAttachedModulesOpts
93
123
) : Promise < VolumeRestrictionTransferManager [ ] > ;
124
+ ( params : GetAttachedBlacklistTransferManagersParams , opts ?: GetAttachedModulesOpts ) : Promise <
125
+ BlacklistTransferManager [ ]
126
+ > ;
127
+ ( params : GetAttachedLockUpTransferManagersParams , opts ?: GetAttachedModulesOpts ) : Promise <
128
+ LockUpTransferManager [ ]
129
+ > ;
130
+ (
131
+ params : GetAttachedRestrictedPartialSaleTransferManagersParams ,
132
+ opts ?: GetAttachedModulesOpts
133
+ ) : Promise < RestrictedPartialSaleTransferManager [ ] > ;
94
134
( params : GetAttachedCappedStosParams , opts ?: GetAttachedModulesOpts ) : Promise < CappedSTO [ ] > ;
95
135
( params : GetAttachedUSDTieredStosParams , opts ?: GetAttachedModulesOpts ) : Promise < USDTieredSTO [ ] > ;
96
136
( params : GetAttachedErc20DividendCheckpointsParams , opts ?: GetAttachedModulesOpts ) : Promise <
@@ -99,6 +139,10 @@ interface GetAttachedModules {
99
139
( params : GetAttachedEtherDividendCheckpointsParams , opts ?: GetAttachedModulesOpts ) : Promise <
100
140
EtherDividendCheckpoint [ ]
101
141
> ;
142
+ ( params : GetAttachedVestingEscrowWalletsParams , opts ?: GetAttachedModulesOpts ) : Promise <
143
+ VestingEscrowWallet [ ]
144
+ > ;
145
+ ( params : GetAttachedModulesParams , opts ?: GetAttachedModulesOpts ) : Promise < Module [ ] > ;
102
146
}
103
147
104
148
interface GetModuleFactoryAddressArgs {
@@ -160,12 +204,11 @@ export class PolymathBase extends PolymathAPI {
160
204
[ ModuleName . BlacklistTransferManager ] : ModuleType . TransferManager ,
161
205
[ ModuleName . LockUpTransferManager ] : ModuleType . TransferManager ,
162
206
[ ModuleName . VolumeRestrictionTM ] : ModuleType . TransferManager ,
207
+ [ ModuleName . RestrictedPartialSaleTM ] : ModuleType . TransferManager ,
163
208
[ ModuleName . ERC20DividendCheckpoint ] : ModuleType . Dividends ,
164
209
[ ModuleName . EtherDividendCheckpoint ] : ModuleType . Dividends ,
165
210
[ ModuleName . GeneralPermissionManager ] : ModuleType . PermissionManager ,
166
211
[ ModuleName . VestingEscrowWallet ] : ModuleType . Wallet ,
167
- [ ModuleName . BlacklistTransferManager ] : ModuleType . TransferManager ,
168
- [ ModuleName . RestrictedPartialSaleTM ] : ModuleType . TransferManager ,
169
212
} ;
170
213
171
214
const availableModules = await this . moduleRegistry . getModulesByTypeAndToken ( {
@@ -200,11 +243,11 @@ export class PolymathBase extends PolymathAPI {
200
243
} ) ;
201
244
} ;
202
245
203
- public getAttachedModules : GetAttachedModules = async (
204
- { symbol, moduleName } : GetAttachedModulesParams ,
205
- opts ?: GetAttachedModulesOpts
206
- ) : Promise < any [ ] > => {
207
- const { tokenFactory, moduleFactory } = this ;
246
+ public getModuleAddressesByName = async (
247
+ { symbol, moduleName } : GetModuleAddressesByNameParams ,
248
+ opts ?: GetModuleAddressesByNameOpts
249
+ ) => {
250
+ const { tokenFactory } = this ;
208
251
209
252
const securityToken = await tokenFactory . getSecurityTokenInstanceFromTicker ( symbol ) ;
210
253
@@ -223,13 +266,24 @@ export class PolymathBase extends PolymathAPI {
223
266
filteredModuleAddresses = moduleAddresses ;
224
267
}
225
268
269
+ return filteredModuleAddresses ;
270
+ } ;
271
+
272
+ public getAttachedModules : GetAttachedModules = async (
273
+ { symbol, moduleName } : GetAttachedModulesParams ,
274
+ opts ?: GetAttachedModulesOpts
275
+ ) : Promise < any [ ] > => {
276
+ const { moduleFactory } = this ;
277
+
278
+ const moduleAddresses = await this . getModuleAddressesByName ( { moduleName, symbol } ) ;
279
+
226
280
const { getModuleInstance } = moduleFactory ;
227
281
228
282
// This has to be done this way because of typescript limitations
229
283
let wrappedModules ;
230
284
switch ( moduleName ) {
231
285
case ModuleName . GeneralPermissionManager : {
232
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
286
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
233
287
getModuleInstance ( {
234
288
address : moduleAddress ,
235
289
name : moduleName ,
@@ -239,7 +293,7 @@ export class PolymathBase extends PolymathAPI {
239
293
return wrappedModules ;
240
294
}
241
295
case ModuleName . CountTransferManager : {
242
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
296
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
243
297
getModuleInstance ( {
244
298
address : moduleAddress ,
245
299
name : moduleName ,
@@ -249,7 +303,7 @@ export class PolymathBase extends PolymathAPI {
249
303
return wrappedModules ;
250
304
}
251
305
case ModuleName . GeneralTransferManager : {
252
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
306
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
253
307
getModuleInstance ( {
254
308
address : moduleAddress ,
255
309
name : moduleName ,
@@ -259,7 +313,7 @@ export class PolymathBase extends PolymathAPI {
259
313
return wrappedModules ;
260
314
}
261
315
case ModuleName . ManualApprovalTransferManager : {
262
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
316
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
263
317
getModuleInstance ( {
264
318
address : moduleAddress ,
265
319
name : moduleName ,
@@ -269,7 +323,7 @@ export class PolymathBase extends PolymathAPI {
269
323
return wrappedModules ;
270
324
}
271
325
case ModuleName . PercentageTransferManager : {
272
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
326
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
273
327
getModuleInstance ( {
274
328
address : moduleAddress ,
275
329
name : moduleName ,
@@ -279,7 +333,37 @@ export class PolymathBase extends PolymathAPI {
279
333
return wrappedModules ;
280
334
}
281
335
case ModuleName . VolumeRestrictionTM : {
282
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
336
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
337
+ getModuleInstance ( {
338
+ address : moduleAddress ,
339
+ name : moduleName ,
340
+ } )
341
+ ) ;
342
+
343
+ return wrappedModules ;
344
+ }
345
+ case ModuleName . BlacklistTransferManager : {
346
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
347
+ getModuleInstance ( {
348
+ address : moduleAddress ,
349
+ name : moduleName ,
350
+ } )
351
+ ) ;
352
+
353
+ return wrappedModules ;
354
+ }
355
+ case ModuleName . LockUpTransferManager : {
356
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
357
+ getModuleInstance ( {
358
+ address : moduleAddress ,
359
+ name : moduleName ,
360
+ } )
361
+ ) ;
362
+
363
+ return wrappedModules ;
364
+ }
365
+ case ModuleName . RestrictedPartialSaleTM : {
366
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
283
367
getModuleInstance ( {
284
368
address : moduleAddress ,
285
369
name : moduleName ,
@@ -289,7 +373,7 @@ export class PolymathBase extends PolymathAPI {
289
373
return wrappedModules ;
290
374
}
291
375
case ModuleName . CappedSTO : {
292
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
376
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
293
377
getModuleInstance ( {
294
378
address : moduleAddress ,
295
379
name : moduleName ,
@@ -299,7 +383,7 @@ export class PolymathBase extends PolymathAPI {
299
383
return wrappedModules ;
300
384
}
301
385
case ModuleName . UsdTieredSTO : {
302
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
386
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
303
387
getModuleInstance ( {
304
388
address : moduleAddress ,
305
389
name : moduleName ,
@@ -309,7 +393,7 @@ export class PolymathBase extends PolymathAPI {
309
393
return wrappedModules ;
310
394
}
311
395
case ModuleName . ERC20DividendCheckpoint : {
312
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
396
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
313
397
getModuleInstance ( {
314
398
address : moduleAddress ,
315
399
name : moduleName ,
@@ -319,7 +403,17 @@ export class PolymathBase extends PolymathAPI {
319
403
return wrappedModules ;
320
404
}
321
405
case ModuleName . EtherDividendCheckpoint : {
322
- wrappedModules = await P . map ( filteredModuleAddresses , moduleAddress =>
406
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
407
+ getModuleInstance ( {
408
+ address : moduleAddress ,
409
+ name : moduleName ,
410
+ } )
411
+ ) ;
412
+
413
+ return wrappedModules ;
414
+ }
415
+ case ModuleName . VestingEscrowWallet : {
416
+ wrappedModules = await P . map ( moduleAddresses , moduleAddress =>
323
417
getModuleInstance ( {
324
418
address : moduleAddress ,
325
419
name : moduleName ,
@@ -560,4 +654,45 @@ export class PolymathBase extends PolymathAPI {
560
654
561
655
return dividends ;
562
656
} ;
657
+
658
+ public roleToPermission = async ( { role } : { role : SecurityTokenRole } ) => {
659
+ let moduleName : ModuleName ;
660
+ let permission : Perm ;
661
+
662
+ if ( role === SecurityTokenRole . ShareholdersAdministrator ) {
663
+ moduleName = ModuleName . GeneralTransferManager ;
664
+ permission = Perm . Admin ;
665
+ } else if ( role === SecurityTokenRole . PermissionsAdministrator ) {
666
+ moduleName = ModuleName . GeneralPermissionManager ;
667
+ permission = Perm . Admin ;
668
+ } else if (
669
+ [
670
+ SecurityTokenRole . Erc20DividendsAdministrator ,
671
+ SecurityTokenRole . Erc20DividendsOperator ,
672
+ ] . includes ( role )
673
+ ) {
674
+ moduleName = ModuleName . GeneralTransferManager ;
675
+ permission =
676
+ role === SecurityTokenRole . Erc20DividendsAdministrator ? Perm . Admin : Perm . Operator ;
677
+ } else if (
678
+ [
679
+ SecurityTokenRole . EtherDividendsAdministrator ,
680
+ SecurityTokenRole . EtherDividendsOperator ,
681
+ ] . includes ( role )
682
+ ) {
683
+ moduleName = ModuleName . ERC20DividendCheckpoint ;
684
+ permission =
685
+ role === SecurityTokenRole . EtherDividendsAdministrator ? Perm . Admin : Perm . Operator ;
686
+ } else {
687
+ throw new PolymathError ( {
688
+ code : ErrorCode . FatalError ,
689
+ message : `Role ${ role } not supported` ,
690
+ } ) ;
691
+ }
692
+
693
+ return {
694
+ permission,
695
+ moduleName,
696
+ } ;
697
+ } ;
563
698
}
0 commit comments