[GAS-01] remove nonReentrant - only wastes gas here because CEI is followed
[GAS-02]emit after the transfer - if the token transfer reverts then we are paying for every operation before the REVERT opcode is hit, so we are paying for emitting an event which should be done after the transfer
[GAS-03] use public getters - saves deployment gas because getters are created for public variables