Inputs and outputs only
A pure function gets everything it needs from its parameters and gives back only a return value. That contract is checkable by reading the signature.
Where side effects belong
Side effects are not wrong, they are a decision. Put the effect in the function that owns the change, and keep the calculation functions pure so they can be tested alone.