What's wrong with my sprinting logic?

it seems like my ‘down’ boolean isn’t updating, any help plz?

Here is my code:

	public void sprintManager()
	{
		if(needsSprint)
		{
			if(down)
			{
				CurrentWeapon.WeaponTransform.animation[CurrentWeapon.sprintLoopAnim].speed = 0.5f;
				CurrentWeapon.WeaponTransform.animation.CrossFade(CurrentWeapon.sprintLoopAnim,0.2f);
			}
			else
				down_to_sprint();
		}
		else
		{
			up_from_sprint();	
		}
	}
	
	void down_to_sprint()
	{
		CurrentWeapon.WeaponTransform.animation[CurrentWeapon.sprintInAnim].speed = 0.5f;
		CurrentWeapon.WeaponTransform.animation.CrossFade(CurrentWeapon.sprintInAnim,0.2f);
		if(animation_finished(CurrentWeapon.WeaponTransform.animation[CurrentWeapon.sprintInAnim].name))
			down = true;
	}
	
	void up_from_sprint()
	{
		if(down)
		{
			CurrentWeapon.WeaponTransform.animation[CurrentWeapon.sprintOutAnim].speed = 0.5f;
			CurrentWeapon.WeaponTransform.animation.CrossFade(CurrentWeapon.sprintOutAnim,0.2f);
			if(animation_finished(CurrentWeapon.WeaponTransform.animation[CurrentWeapon.sprintOutAnim].name))
			{
				down = false;
				force_idle();
			}
		}
	}
	
	public bool animation_finished(string anim)
	{
		if(CurrentWeapon.WeaponTransform.animation.IsPlaying(anim) || CurrentWeapon.WeaponTransform.animation[anim].normalizedTime >= 1 )
			return true;
		else
			return false;
	}

fixed on my own