1+ var readlineSync = require ( 'readline-sync' ) ;
2+ var chalk = require ( 'chalk' ) ;
3+ var common = require ( './common/common_functions' ) ;
4+ var global = require ( './common/global' ) ;
5+ var contracts = require ( './helpers/contract_addresses' ) ;
6+ var abis = require ( './helpers/contract_abis' ) ;
7+
8+ // App flow
9+ let tokenSymbol ;
10+ let securityTokenRegistry ;
11+ let securityToken ;
12+ let generalPermissionManager ;
13+
14+ const MODULES_TYPES = {
15+ PERMISSION : 1 ,
16+ TRANSFER : 2 ,
17+ STO : 3 ,
18+ DIVIDEND : 4 ,
19+ BURN : 5
20+ }
21+
22+ async function executeApp ( remoteNetwork ) {
23+ await global . initialize ( remoteNetwork ) ;
24+
25+ common . logAsciiBull ( ) ;
26+ console . log ( "***********************************************" ) ;
27+ console . log ( "Welcome to the Command-Line Permission Manager." ) ;
28+ console . log ( "***********************************************" ) ;
29+ console . log ( "Issuer Account: " + Issuer . address + "\n" ) ;
30+
31+ await setup ( ) ;
32+ try {
33+ await selectST ( ) ;
34+ await addPermissionModule ( ) ;
35+ await changePermissionStep ( ) ;
36+ } catch ( err ) {
37+ console . log ( err ) ;
38+ return ;
39+ }
40+ } ;
41+
42+ async function setup ( ) {
43+ try {
44+ let securityTokenRegistryAddress = await contracts . securityTokenRegistry ( ) ;
45+ let securityTokenRegistryABI = abis . securityTokenRegistry ( ) ;
46+ securityTokenRegistry = new web3 . eth . Contract ( securityTokenRegistryABI , securityTokenRegistryAddress ) ;
47+ securityTokenRegistry . setProvider ( web3 . currentProvider ) ;
48+ } catch ( err ) {
49+ console . log ( err )
50+ console . log ( '\x1b[31m%s\x1b[0m' , "There was a problem getting the contracts. Make sure they are deployed to the selected network." ) ;
51+ process . exit ( 0 ) ;
52+ }
53+ }
54+
55+ async function selectST ( ) {
56+ if ( ! tokenSymbol )
57+ tokenSymbol = readlineSync . question ( 'Enter the token symbol: ' ) ;
58+
59+ let result = await securityTokenRegistry . methods . getSecurityTokenAddress ( tokenSymbol ) . call ( ) ;
60+ if ( result == "0x0000000000000000000000000000000000000000" ) {
61+ tokenSymbol = undefined ;
62+ console . log ( chalk . red ( `Token symbol provided is not a registered Security Token.` ) ) ;
63+ await selectST ( ) ;
64+ } else {
65+ let securityTokenABI = abis . securityToken ( ) ;
66+ securityToken = new web3 . eth . Contract ( securityTokenABI , result ) ;
67+ }
68+ }
69+
70+ async function addPermissionModule ( ) {
71+ let generalPermissionManagerAddress ;
72+ let result = await securityToken . methods . getModulesByName ( web3 . utils . toHex ( 'GeneralPermissionManager' ) ) . call ( ) ;
73+ if ( result . length == 0 ) {
74+ console . log ( chalk . red ( `General Permission Manager is not attached.` ) ) ;
75+ if ( readlineSync . keyInYNStrict ( 'Do you want to add General Permission Manager Module to your Security Token?' ) ) {
76+ let permissionManagerFactoryAddress = await contracts . getModuleFactoryAddressByName ( securityToken . options . address , MODULES_TYPES . PERMISSION , 'GeneralPermissionManager' ) ;
77+ let addModuleAction = securityToken . methods . addModule ( permissionManagerFactoryAddress , web3 . utils . fromAscii ( '' , 16 ) , 0 , 0 ) ;
78+ let receipt = await common . sendTransaction ( Issuer , addModuleAction , defaultGasPrice ) ;
79+ let event = common . getEventFromLogs ( securityToken . _jsonInterface , receipt . logs , 'ModuleAdded' ) ;
80+ console . log ( `Module deployed at address: ${ event . _module } ` ) ;
81+ generalPermissionManagerAddress = event . _module ;
82+ } else {
83+ process . exit ( 0 ) ;
84+ }
85+ } else {
86+ generalPermissionManagerAddress = result [ 0 ] ;
87+ }
88+
89+ let generalPermissionManagerABI = abis . generalPermissionManager ( ) ;
90+ generalPermissionManager = new web3 . eth . Contract ( generalPermissionManagerABI , generalPermissionManagerAddress ) ;
91+ generalPermissionManager . setProvider ( web3 . currentProvider ) ;
92+ }
93+
94+ async function changePermissionStep ( ) {
95+ console . log ( '\n\x1b[34m%s\x1b[0m' , "Permission Manager - Change Permission" ) ;
96+ let selectedDelegate = await selectDelegate ( ) ;
97+ let selectedModule = await selectModule ( ) ;
98+ let selectedPermission = await selectPermission ( selectedModule . permissions ) ;
99+ let isValid = isPermissionValid ( ) ;
100+ await changePermission ( selectedDelegate , selectedModule . address , selectedPermission , isValid ) ;
101+ }
102+
103+ // Helper functions
104+ async function selectDelegate ( ) {
105+ let result ;
106+ let delegates = await getDelegates ( ) ;
107+
108+ let options = [ 'Add new delegate' ] ;
109+ options = options . concat ( delegates . map ( function ( d ) {
110+ return `Account: ${ d . address }
111+ Details: ${ d . details } `
112+ } ) ) ;
113+
114+ let index = readlineSync . keyInSelect ( options , 'Select a delegate:' , { cancel : false } ) ;
115+ if ( index == 0 ) {
116+ let newDelegate = await addNewDelegate ( ) ;
117+ result = newDelegate ;
118+ } else {
119+ result = delegates [ index - 1 ] . address ;
120+ }
121+
122+ return result ;
123+ }
124+
125+ async function selectModule ( ) {
126+ let modules = await getModulesWithPermissions ( ) ;
127+ let options = modules . map ( function ( m ) {
128+ return m . name ;
129+ } ) ;
130+ let index = readlineSync . keyInSelect ( options , 'Select a module:' , { cancel : false } ) ;
131+ return modules [ index ] ;
132+ }
133+
134+ async function selectPermission ( permissions ) {
135+ let options = permissions . map ( function ( p ) {
136+ return p
137+ } ) ;
138+ let index = readlineSync . keyInSelect ( options , 'Select a permission:' , { cancel : false } ) ;
139+ return permissions [ index ] ;
140+ }
141+
142+ function isPermissionValid ( ) {
143+ let options = [ 'Grant permission' , 'Revoke permission' ] ;
144+ let index = readlineSync . keyInSelect ( options , 'What do you want to do?' , { cancel : false } ) ;
145+ return index == 0 ;
146+ }
147+
148+ async function changePermission ( delegate , moduleAddress , permission , isValid ) {
149+ let changePermissionAction = generalPermissionManager . methods . changePermission ( delegate , moduleAddress , web3 . utils . asciiToHex ( permission ) , isValid ) ;
150+ let receipt = await common . sendTransaction ( Issuer , changePermissionAction , defaultGasPrice , 0 , 1.5 ) ;
151+ common . getEventFromLogs ( generalPermissionManager . _jsonInterface , receipt . logs , 'ChangePermission' ) ;
152+ console . log ( `Permission changed succesfully,` ) ;
153+ }
154+
155+ async function getDelegates ( ) {
156+ let result = [ ] ;
157+ /*
158+ let events = await generalPermissionManager.getPastEvents('LogAddPermission', { fromBlock: 0});
159+ for (let event of events) {
160+ let delegate = {};
161+ delegate.address = event.returnValues._delegate;
162+ delegate.details = web3.utils.hexToAscii(event.returnValues._details);
163+ result.push(delegate);
164+ }
165+ */
166+ let delegates = await generalPermissionManager . methods . getAllDelegates ( ) . call ( ) ;
167+ for ( let d of delegates ) {
168+ let delegate = { } ;
169+ delegate . address = d ;
170+ delegate . details = web3 . utils . hexToAscii ( await generalPermissionManager . methods . delegateDetails ( d ) . call ( ) ) ;
171+ result . push ( delegate ) ;
172+ }
173+ return result ;
174+ }
175+
176+ async function addNewDelegate ( ) {
177+ let newDelegate = readlineSync . question ( 'Enter the delegate address: ' , {
178+ limit : function ( input ) {
179+ return web3 . utils . isAddress ( input ) ;
180+ } ,
181+ limitMessage : "Must be a valid address"
182+ } ) ;
183+ let details = readlineSync . question ( 'Enter the delegate details (i.e `Belongs to financial firm`): ' , {
184+ limit : function ( input ) {
185+ return input . length > 0 ;
186+ } ,
187+ limitMessage : "Must be a valid string"
188+ } ) ;
189+ let addPermissionAction = generalPermissionManager . methods . addDelegate ( newDelegate , web3 . utils . asciiToHex ( details ) ) ;
190+ let receipt = await common . sendTransaction ( Issuer , addPermissionAction , defaultGasPrice ) ;
191+ let event = common . getEventFromLogs ( generalPermissionManager . _jsonInterface , receipt . logs , 'AddDelegate' ) ;
192+ console . log ( `Delegate added succesfully: ${ event . _delegate } - ${ event . _details } ` ) ;
193+ return event . _delegate ;
194+ }
195+
196+ async function getModulesWithPermissions ( ) {
197+ let modules = [ ] ;
198+ let moduleABI = abis . moduleInterface ( ) ;
199+
200+ for ( const type in MODULES_TYPES ) {
201+ let modulesAttached = await securityToken . methods . getModulesByType ( MODULES_TYPES [ type ] ) . call ( ) ;
202+ for ( const m of modulesAttached ) {
203+ let contractTemp = new web3 . eth . Contract ( moduleABI , m ) ;
204+ let permissions = await contractTemp . methods . getPermissions ( ) . call ( ) ;
205+ if ( permissions . length > 0 ) {
206+ modules . push ( {
207+ name : web3 . utils . hexToAscii ( ( await securityToken . methods . getModule ( m ) . call ( ) ) [ 0 ] ) ,
208+ address : m ,
209+ permissions : permissions . map ( function ( p ) { return web3 . utils . hexToAscii ( p ) } )
210+ } )
211+ }
212+ }
213+ }
214+
215+ return modules ;
216+ }
217+
218+ module . exports = {
219+ executeApp : async function ( remoteNetwork ) {
220+ return executeApp ( remoteNetwork ) ;
221+ }
222+ }
0 commit comments