Common smart contract errors that silently drain liquidity and how to detect them