@@ -60,12 +60,25 @@ contract ERC1410Standard is IERC1410, ERC1410Operator, Ownable {
6060 require (_validPartition (_partition, _from), "Invalid partition " );
6161 uint256 index = partitionToIndex[_from][_partition] - 1 ;
6262 require (partitions[_from][index].amount >= _value, "Insufficient value " );
63- partitions[_from][index].amount = partitions[_from][index].amount.sub (_value);
63+ if (partitions[_from][index].amount == _value) {
64+ _deletePartitionForHolder (_from, _partition, index);
65+ } else {
66+ partitions[_from][index].amount = partitions[_from][index].amount.sub (_value);
67+ }
6468 balances[_from] = balances[_from].sub (_value);
6569 _totalSupply = _totalSupply.sub (_value);
6670 emit RedeemedByPartition (_partition, _operator, _from, _value, _data, _operatorData);
6771 }
6872
73+ function _deletePartitionForHolder (address _holder , bytes32 _partition , uint256 index ) internal {
74+ if (index != partitions[_holder].length - 1 ) {
75+ partitions[_holder][index] = partitions[_holder][partitions[_holder].length - 1 ];
76+ partitionToIndex[_holder][partitions[_holder][index].partition] = index + 1 ;
77+ }
78+ delete partitionToIndex[_holder][_partition];
79+ partitions[_holder].length -- ;
80+ }
81+
6982 function _validateParams (bytes32 _partition , uint256 _value ) internal pure {
7083 require (_value != uint256 (0 ), "Zero value not allowed " );
7184 require (_partition != bytes32 (0 ), "Invalid partition " );
0 commit comments