Deciding Where Vyper's @nonreentrant Lock Belongs in a Contract That Moves Funds
An architecture note on where Vyper's @nonreentrant lock belongs: which functions need it, why checks-effects-interactions is still required, and how to verify the lock with a hostile receiver contract.