self.status == "active") @icontract.require(lambda self, amount: amount > 0) @icontract.require(lambda self, amount: amount <= self.balance) @icontract.snapshot(lambda self: self.balance, name="bal") @icontract.ensure(lambda self, amount, result, OLD: result == self.balance and OLD.bal - self.balance == amount) def withdraw(self, amount: int) -> int: self.balance -= amount return self.balance