From f0883f2273eda7c0097e6f5bf3272e4ca68f5468 Mon Sep 17 00:00:00 2001 From: satyam Date: Fri, 24 May 2019 17:42:26 +0530 Subject: [PATCH 1/3] fix balance of partition function --- contracts/tokens/SecurityToken.sol | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 65ab132d9..688c7b66a 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -487,14 +487,19 @@ contract SecurityToken is ERC20, ReentrancyGuard, SecurityTokenStorage, IERC1594 return _balanceOfByPartition(_partition, _tokenHolder, 0); } - function _balanceOfByPartition(bytes32 _partition, address _tokenHolder, uint256 _additionalBalance) internal view returns(uint256 max) { + function _balanceOfByPartition(bytes32 _partition, address _tokenHolder, uint256 _additionalBalance) internal view returns(uint256 balance) { address[] memory tms = modules[TRANSFER_KEY]; uint256 amount; for (uint256 i = 0; i < tms.length; i++) { - amount = ITransferManager(tms[i]).getTokensByPartition(_partition, _tokenHolder, _additionalBalance); - if (max < amount) { - max = amount; + amount = ITransferManager(tms[i]).getTokensByPartition("LOCKED", _tokenHolder, _additionalBalance); + // In locked partition we are returning the maximum of all the Locked balances + if (balance < amount) { + balance = amount; } + if (_partition == "UNLOCKED") + // For the Unlocked partition it should be totalBalance - locked partition balance + balance = balanceOf(_tokenHolder).sub(balance); + return balance; } } From 8fa30e9182c2e87a56fc0a10d769e293d70ddda4 Mon Sep 17 00:00:00 2001 From: satyam Date: Sat, 25 May 2019 06:12:24 +0530 Subject: [PATCH 2/3] fix balance of Partition function --- contracts/tokens/SecurityToken.sol | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/tokens/SecurityToken.sol b/contracts/tokens/SecurityToken.sol index 688c7b66a..707a5e050 100644 --- a/contracts/tokens/SecurityToken.sol +++ b/contracts/tokens/SecurityToken.sol @@ -487,19 +487,21 @@ contract SecurityToken is ERC20, ReentrancyGuard, SecurityTokenStorage, IERC1594 return _balanceOfByPartition(_partition, _tokenHolder, 0); } - function _balanceOfByPartition(bytes32 _partition, address _tokenHolder, uint256 _additionalBalance) internal view returns(uint256 balance) { + function _balanceOfByPartition(bytes32 _partition, address _tokenHolder, uint256 _additionalBalance) internal view returns(uint256 partitionBalance) { address[] memory tms = modules[TRANSFER_KEY]; uint256 amount; for (uint256 i = 0; i < tms.length; i++) { - amount = ITransferManager(tms[i]).getTokensByPartition("LOCKED", _tokenHolder, _additionalBalance); + amount = ITransferManager(tms[i]).getTokensByPartition(_partition, _tokenHolder, _additionalBalance); + // In UNLOCKED partition we are returning the minimum of all the unlocked balances + if (_partition == UNLOCKED) { + if (amount < partitionBalance || i == 0) + partitionBalance = amount; + } // In locked partition we are returning the maximum of all the Locked balances - if (balance < amount) { - balance = amount; + else { + if (partitionBalance < amount) + partitionBalance = amount; } - if (_partition == "UNLOCKED") - // For the Unlocked partition it should be totalBalance - locked partition balance - balance = balanceOf(_tokenHolder).sub(balance); - return balance; } } From ef06a10a622780cc16fe4d4ae6f946a090c756df Mon Sep 17 00:00:00 2001 From: satyam Date: Wed, 12 Jun 2019 09:08:14 +0530 Subject: [PATCH 3/3] return balance in the parent implementation of the getTokensByPartition() --- contracts/modules/TransferManager/TransferManager.sol | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contracts/modules/TransferManager/TransferManager.sol b/contracts/modules/TransferManager/TransferManager.sol index 45a34a2ad..e861be78a 100644 --- a/contracts/modules/TransferManager/TransferManager.sol +++ b/contracts/modules/TransferManager/TransferManager.sol @@ -30,9 +30,14 @@ contract TransferManager is ITransferManager, Module { /** * @notice return the amount of tokens for a given user as per the partition + * @dev returning the balance of token holder against the UNLOCKED partition. + * This condition is valid only when the base contract doesn't implement the + * `getTokensByPartition()` function. */ - function getTokensByPartition(bytes32 /*_partition*/, address /*_tokenHolder*/, uint256 /*_additionalBalance*/) external view returns(uint256) { - return 0; + function getTokensByPartition(bytes32 _partition, address _tokenHolder, uint256 /*_additionalBalance*/) external view returns(uint256) { + if (_partition == UNLOCKED) + return ISecurityToken(securityToken).balanceOf(_tokenHolder); + return uint256(0); } /**