diff --git a/CLI/commands/common/permissions_list.js b/CLI/commands/common/permissions_list.js index f5779612b..4d2b58cf7 100644 --- a/CLI/commands/common/permissions_list.js +++ b/CLI/commands/common/permissions_list.js @@ -68,7 +68,7 @@ function getPermissionList() { modifyWhitelist: "WHITELIST", modifyWhitelistMulti: "WHITELIST", setAllowPrimaryIssuance: "ADMIN", - changeHolderPercentage: "ONLY_OWNER" + changeHolderPercentage: "ADMIN" }, LockupVolumeRestrictionTM: { addLockup: "ADMIN", diff --git a/contracts/modules/TransferManager/PercentageTransferManager.sol b/contracts/modules/TransferManager/PercentageTransferManager.sol index 4238cff14..d2f5e7804 100644 --- a/contracts/modules/TransferManager/PercentageTransferManager.sol +++ b/contracts/modules/TransferManager/PercentageTransferManager.sol @@ -92,7 +92,7 @@ contract PercentageTransferManager is ITransferManager { * @notice sets the maximum percentage that an individual token holder can hold * @param _maxHolderPercentage is the new maximum percentage (multiplied by 10**16) */ - function changeHolderPercentage(uint256 _maxHolderPercentage) public onlyOwner { + function changeHolderPercentage(uint256 _maxHolderPercentage) public withPerm(ADMIN) { emit ModifyHolderPercentage(maxHolderPercentage, _maxHolderPercentage); maxHolderPercentage = _maxHolderPercentage; } diff --git a/docs/permissions_list.md b/docs/permissions_list.md index 4592474ea..b49c95a0e 100644 --- a/docs/permissions_list.md +++ b/docs/permissions_list.md @@ -199,11 +199,10 @@ setAllowPrimaryIssuance() - withPerm(ADMIN) + withPerm(ADMIN) changeHolderPercentage() - onlyOwner() LockupVolumeRestrictionTM diff --git a/test/l_percentage_transfer_manager.js b/test/l_percentage_transfer_manager.js index 3a62463ac..488be5820 100644 --- a/test/l_percentage_transfer_manager.js +++ b/test/l_percentage_transfer_manager.js @@ -22,6 +22,7 @@ contract("PercentageTransferManager", accounts => { let account_investor2; let account_investor3; let account_investor4; + let account_delegate; // investor Details let fromTime = latestTime(); @@ -57,6 +58,7 @@ contract("PercentageTransferManager", accounts => { const tokenDetails = "This is equity type of issuance"; const decimals = 18; const contact = "team@polymath.network"; + const delegateDetails = "Hello I am legit delegate"; // Module key const delegateManagerKey = 1; @@ -92,6 +94,7 @@ contract("PercentageTransferManager", accounts => { account_investor1 = accounts[7]; account_investor2 = accounts[8]; account_investor3 = accounts[9]; + account_delegate = accounts[6]; let instances = await setUpPolymathNetwork(account_polymath, token_owner); @@ -166,6 +169,18 @@ contract("PercentageTransferManager", accounts => { let moduleData = (await I_SecurityToken.getModulesByType(2))[0]; I_GeneralTransferManager = GeneralTransferManager.at(moduleData); }); + + it("Should successfully attach the General permission manager factory with the security token", async () => { + const tx = await I_SecurityToken.addModule(I_GeneralPermissionManagerFactory.address, "0x", 0, 0, { from: token_owner }); + assert.equal(tx.logs[2].args._types[0].toNumber(), delegateManagerKey, "General Permission Manager doesn't get deployed"); + assert.equal( + web3.utils.toAscii(tx.logs[2].args._name).replace(/\u0000/g, ""), + "GeneralPermissionManager", + "GeneralPermissionManagerFactory module was not added" + ); + I_GeneralPermissionManager = GeneralPermissionManager.at(tx.logs[2].args._module); + }); + }); describe("Buy tokens using on-chain whitelist", async () => { @@ -333,10 +348,32 @@ contract("PercentageTransferManager", accounts => { ) }); + it("Should not be able to modify holder percentage to 100 - Unauthorized msg.sender", async () => { + await catchRevert( + I_PercentageTransferManager.changeHolderPercentage(100 * 10 ** 16, { from: account_delegate }) + ) + }); + + it("Should successfully add the delegate", async() => { + let tx = await I_GeneralPermissionManager.addDelegate(account_delegate, delegateDetails, { from: token_owner}); + assert.equal(tx.logs[0].args._delegate, account_delegate); + }); + + it("Should provide the permission", async() => { + let tx = await I_GeneralPermissionManager.changePermission( + account_delegate, + I_PercentageTransferManager.address, + "ADMIN", + true, + {from: token_owner} + ); + assert.equal(tx.logs[0].args._delegate, account_delegate); + }); + it("Modify holder percentage to 100", async () => { // Add the Investor in to the whitelist // Mint some tokens - await I_PercentageTransferManager.changeHolderPercentage(100 * 10 ** 16, { from: token_owner }); + await I_PercentageTransferManager.changeHolderPercentage(100 * 10 ** 16, { from: account_delegate }); assert.equal((await I_PercentageTransferManager.maxHolderPercentage()).toNumber(), 100 * 10 ** 16); });