Linear vesting users may not receive vested amount
TokenTransmuter supports two types of transmutations, linear and instant. In linear, allocated amount is released across time until fully vested, while in instant the entire amount is released immediately. transmuteLinear() checks that there is enough output tokens left in the contract before accepting transfer of input tokens.\\n```\\n       require(IERC20(outputTokenAddress).balanceOf(address(this)) >= \\n           (totalAllocatedOutputToken - totalReleasedOutputToken), \\n       "INSUFFICIENT_OUTPUT_TOKEN");\\n            IERC20(inputTokenAddress).transferFrom(msg.sender, address(0), \\n       _inputTokenAmount);\\n```\\n\\nHowever, `transmuteInstant()` lacks any remaining balance checks, and will operate as long as the function has enough output tokens to satisfy the request.\\n```\\n        IERC20(inputTokenAddress).transferFrom(msg.sender, address(0), \\n             _inputTokenAmount);\\n        SafeERC20.safeTransfer(IERC20(outputTokenAddress), msg.sender, \\n             allocation);\\n        emit OutputTokenInstantReleased(msg.sender, allocation, \\n             outputTokenAddress);\\n```\\n\\nAs a result, it is not ensured that tokens that have been reserved for linear distribution will be available when users request to claim them. An attacker may empty the output balance with a large instant transmute and steal future vested tokens of users.
In transmuteInstant, add a check similar to the one in transmuteLinear. It will ensure allocations are kept faithfully.
```\\n       require(IERC20(outputTokenAddress).balanceOf(address(this)) >= \\n           (totalAllocatedOutputToken - totalReleasedOutputToken), \\n       "INSUFFICIENT_OUTPUT_TOKEN");\\n            IERC20(inputTokenAddress).transferFrom(msg.sender, address(0), \\n       _inputTokenAmount);\\n```\\n