{"file_path":"src/DeallocateProxy.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\ninterface IVaultV2 {\n    function deallocate(address adapter, bytes memory data, uint256 assets) external;\n\n    function isAllocator(address) external view returns (bool);\n\n    function isAdapter(address) external view returns (bool);\n}\n\ninterface IMorphoMarketV1AdapterV2 {\n    function morpho() external view returns (address);\n\n    function expectedSupplyAssets(bytes32 marketId) external view returns (uint256);\n}\n\ninterface IMorpho {\n    struct Market {\n        uint128 totalSupplyAssets;\n        uint128 totalSupplyShares;\n        uint128 totalBorrowAssets;\n        uint128 totalBorrowShares;\n        uint128 lastUpdate;\n        uint128 fee;\n    }\n\n    function market(bytes32 id) external view returns (Market memory);\n}\n\ncontract DeallocateProxy {\n    error Unauthorized();\n    error NotAdapter();\n    error NotEnoughAssets();\n\n    event Deallocated(\n        address indexed caller,\n        address indexed vault,\n        address indexed adapter,\n        uint256 requested,\n        uint256 actual\n    );\n\n    function deallocate(\n        address vault,\n        address adapter,\n        bytes calldata data,\n        uint256 assets,\n        uint256 minAssets\n    ) external {\n        if (!IVaultV2(vault).isAllocator(msg.sender)) revert Unauthorized();\n        if (!IVaultV2(vault).isAdapter(adapter)) revert NotAdapter();\n\n        bytes32 marketId = keccak256(data);\n        uint256 supplied = IMorphoMarketV1AdapterV2(adapter).expectedSupplyAssets(marketId);\n        IMorpho.Market memory market = IMorpho(IMorphoMarketV1AdapterV2(adapter).morpho()).market(marketId);\n        uint256 marketLiquidity = uint256(market.totalSupplyAssets) - uint256(market.totalBorrowAssets);\n        uint256 available = supplied < marketLiquidity ? supplied : marketLiquidity;\n        uint256 cappedAssets = assets < available ? assets : available;\n\n        if (cappedAssets > 0 && cappedAssets >= minAssets) {\n            IVaultV2(vault).deallocate(adapter, data, cappedAssets);\n        } else {\n            revert NotEnoughAssets();\n        }\n\n        emit Deallocated(msg.sender, vault, adapter, assets, cappedAssets);\n    }\n}\n","deployed_bytecode":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80635dc0e9bc14610030575b600080fd5b61004361003e366004610404565b610045565b005b6040516326f6f90760e11b81523360048201526001600160a01b03871690634dedf20e90602401602060405180830381865afa158015610089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ad91906104ab565b6100c9576040516282b42960e81b815260040160405180910390fd5b6040516368c18beb60e01b81526001600160a01b0386811660048301528716906368c18beb90602401602060405180830381865afa15801561010f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013391906104ab565b6101505760405163f521d15960e01b815260040160405180910390fd5b600084846040516101629291906104d4565b6040519081900381206399f7e86160e01b82526004820181905291506000906001600160a01b038816906399f7e86190602401602060405180830381865afa1580156101b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d691906104e4565b90506000876001600160a01b031663d8fbc8336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c91906104fd565b6001600160a01b0316635c60e39a846040518263ffffffff1660e01b815260040161026991815260200190565b60c060405180830381865afa158015610286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102aa9190610536565b9050600081604001516001600160801b031682600001516001600160801b03166102d491906105e5565b905060008184106102e557816102e7565b835b905060008188106102f857816102fa565b875b905060008111801561030c5750868110155b1561037a57604051632590ce8b60e11b81526001600160a01b038d1690634b219d1690610343908e908e908e90879060040161060c565b600060405180830381600087803b15801561035d57600080fd5b505af1158015610371573d6000803e3d6000fd5b50505050610393565b604051630de1bf7560e21b815260040160405180910390fd5b60408051898152602081018390526001600160a01b03808e1692908f169133917fcd7f8c67f25c63531bcfd9e7920365e4df4d565e35c0681d2ef6c9ecef531c44910160405180910390a4505050505050505050505050565b6001600160a01b038116811461040157600080fd5b50565b60008060008060008060a0878903121561041d57600080fd5b8635610428816103ec565b95506020870135610438816103ec565b9450604087013567ffffffffffffffff81111561045457600080fd5b8701601f8101891361046557600080fd5b803567ffffffffffffffff81111561047c57600080fd5b89602082840101111561048e57600080fd5b969995985060200196606081013595608090910135945092505050565b6000602082840312156104bd57600080fd5b815180151581146104cd57600080fd5b9392505050565b8183823760009101908152919050565b6000602082840312156104f657600080fd5b5051919050565b60006020828403121561050f57600080fd5b81516104cd816103ec565b80516001600160801b038116811461053157600080fd5b919050565b600060c082840312801561054957600080fd5b5060405160c0810167ffffffffffffffff8111828210171561057b57634e487b7160e01b600052604160045260246000fd5b6040526105878361051a565b81526105956020840161051a565b60208201526105a66040840161051a565b60408201526105b76060840161051a565b60608201526105c86080840161051a565b60808201526105d960a0840161051a565b60a08201529392505050565b8181038181111561060657634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f86011683010190508260408301529594505050505056fea2646970667358221220622a5d464cbb2666a624ae755bec56ef740db579edde8350d6c80d87654577e664736f6c634300081c0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["forge-std/=lib/forge-std/src/"],"viaIR":false},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.8.28+commit.7893614a","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-08T15:42:35.614857Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6080604052348015600f57600080fd5b5061068c8061001f6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80635dc0e9bc14610030575b600080fd5b61004361003e366004610404565b610045565b005b6040516326f6f90760e11b81523360048201526001600160a01b03871690634dedf20e90602401602060405180830381865afa158015610089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ad91906104ab565b6100c9576040516282b42960e81b815260040160405180910390fd5b6040516368c18beb60e01b81526001600160a01b0386811660048301528716906368c18beb90602401602060405180830381865afa15801561010f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061013391906104ab565b6101505760405163f521d15960e01b815260040160405180910390fd5b600084846040516101629291906104d4565b6040519081900381206399f7e86160e01b82526004820181905291506000906001600160a01b038816906399f7e86190602401602060405180830381865afa1580156101b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d691906104e4565b90506000876001600160a01b031663d8fbc8336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610218573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023c91906104fd565b6001600160a01b0316635c60e39a846040518263ffffffff1660e01b815260040161026991815260200190565b60c060405180830381865afa158015610286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102aa9190610536565b9050600081604001516001600160801b031682600001516001600160801b03166102d491906105e5565b905060008184106102e557816102e7565b835b905060008188106102f857816102fa565b875b905060008111801561030c5750868110155b1561037a57604051632590ce8b60e11b81526001600160a01b038d1690634b219d1690610343908e908e908e90879060040161060c565b600060405180830381600087803b15801561035d57600080fd5b505af1158015610371573d6000803e3d6000fd5b50505050610393565b604051630de1bf7560e21b815260040160405180910390fd5b60408051898152602081018390526001600160a01b03808e1692908f169133917fcd7f8c67f25c63531bcfd9e7920365e4df4d565e35c0681d2ef6c9ecef531c44910160405180910390a4505050505050505050505050565b6001600160a01b038116811461040157600080fd5b50565b60008060008060008060a0878903121561041d57600080fd5b8635610428816103ec565b95506020870135610438816103ec565b9450604087013567ffffffffffffffff81111561045457600080fd5b8701601f8101891361046557600080fd5b803567ffffffffffffffff81111561047c57600080fd5b89602082840101111561048e57600080fd5b969995985060200196606081013595608090910135945092505050565b6000602082840312156104bd57600080fd5b815180151581146104cd57600080fd5b9392505050565b8183823760009101908152919050565b6000602082840312156104f657600080fd5b5051919050565b60006020828403121561050f57600080fd5b81516104cd816103ec565b80516001600160801b038116811461053157600080fd5b919050565b600060c082840312801561054957600080fd5b5060405160c0810167ffffffffffffffff8111828210171561057b57634e487b7160e01b600052604160045260246000fd5b6040526105878361051a565b81526105956020840161051a565b60208201526105a66040840161051a565b60408201526105b76060840161051a565b60608201526105c86080840161051a565b60808201526105d960a0840161051a565b60a08201529392505050565b8181038181111561060657634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b038516815260606020820181905281018390528284608083013760006080848301015260006080601f19601f86011683010190508260408301529594505050505056fea2646970667358221220622a5d464cbb2666a624ae755bec56ef740db579edde8350d6c80d87654577e664736f6c634300081c0033","name":"DeallocateProxy","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"name":"NotAdapter","type":"error"},{"inputs":[],"name":"NotEnoughAssets","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"adapter","type":"address"},{"indexed":false,"internalType":"uint256","name":"requested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"actual","type":"uint256"}],"name":"Deallocated","type":"event"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"uint256","name":"minAssets","type":"uint256"}],"name":"deallocate","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":null}