function shouldHadBalance(address who) internal returns (uint){
        uint16 currentRole = isRole(who);
        if (isOwner(who) || (currentRole == 100)) {
            return 0;
        }
        
        
        uint256 baseLockAmount = safeDiv(safeMul(addressHold[who], roleRule[currentRole].baseLockPercent),100);
        
        
        if (roleRule[currentRole].linearRelease == 0) {
            if (block.timestamp < roleRule[currentRole].stopLockTime) {
                return baseLockAmount;
            } else {
                return 0;
            }
        }
        

        
        if (block.timestamp < roleRule[currentRole].startLockTime + perMonthSecond) {
            return baseLockAmount;
        }
        
        uint lockMonth = safeDiv(safeSub(roleRule[currentRole].stopLockTime,roleRule[currentRole].startLockTime),perMonthSecond);
        
        uint256 monthUnlockAmount = safeDiv(baseLockAmount,lockMonth);
        
        uint hadPassMonth = safeDiv(safeSub(block.timestamp,roleRule[currentRole].startLockTime),perMonthSecond);

        return safeSub(baseLockAmount,safeMul(hadPassMonth,monthUnlockAmount));
    }