{"file_path":"Vyper_contract.vy","creation_status":"success","source_code":"# pragma version 0.4.3\n\ndao: public(address)\nemergency: public(address)\n\ninterface IController:\n    def set_callback(_cb: address): nonpayable\n    def set_amm_fee(_fee: uint256): nonpayable\n    def set_amm_admin_fee(_fee: uint256): nonpayable\n    def set_monetary_policy(_monetary_policy: address): nonpayable\n    def set_borrowing_discounts(_loan_discount: uint256, _liquidation_discount: uint256): nonpayable\n\n\ninterface IFactory:\n    def set_admin(admin: address): nonpayable\n    def set_debt_ceiling(_to: address, debt_ceiling: uint256): nonpayable\n    def debt_ceiling(_to: address) -> uint256: view\n\n\nMAX_CALLDATA_SIZE: constant(uint256) = 1024\nMAX_OUTSIZE: constant(uint256) = 1024\n\n\n@deploy\ndef __init__(_dao: address, _emergency: address):\n    self.dao = _dao\n    self.emergency = _emergency\n\n\n@internal\ndef _check_authorized():\n    assert msg.sender in [self.dao, self.emergency], \"Unauthorized\"\n\n\n@internal\ndef _check_dao():\n    assert msg.sender == self.dao, \"Only DAO\"\n\n\n@external\ndef set_callback(_controller: IController, _cb: address):\n    self._check_authorized()\n    extcall _controller.set_callback(_cb)\n\n\n@external\ndef set_amm_fee(_controller: IController, _fee: uint256):\n    self._check_authorized()\n    extcall _controller.set_amm_fee(_fee)\n\n\n@external\ndef set_monetary_policy(_controller: IController, _monetary_policy: address):\n    self._check_authorized()\n    extcall _controller.set_monetary_policy(_monetary_policy)\n\n\n@external\ndef set_borrowing_discounts(_controller: IController, _loan_discount: uint256, _liquidation_discount: uint256):\n    self._check_authorized()\n    extcall _controller.set_borrowing_discounts(_loan_discount, _liquidation_discount)\n\n\n@external\ndef set_admin_fee(_controller: IController, _fee: uint256):\n    self._check_authorized()\n    extcall _controller.set_amm_admin_fee(_fee)\n\n\n@external\ndef reduce_debt_ceiling(_factory: IFactory, _to: address, _amount: uint256):\n    # In practice there's only one factory where this matters\n    # Did this for convenience on the caller side\n    self._check_authorized()\n\n    current_debt_ceiling: uint256 = staticcall _factory.debt_ceiling(_to)\n    assert _amount <= current_debt_ceiling, \"Can only reduce debt ceiling\"\n\n    extcall _factory.set_debt_ceiling(_to, _amount)\n\n\n@external\n@payable\ndef execute(_target: address, _calldata: Bytes[MAX_CALLDATA_SIZE]) -> Bytes[MAX_OUTSIZE]:\n    self._check_dao()\n\n    return raw_call(\n        _target,\n        _calldata,\n        value=msg.value,\n        max_outsize=MAX_OUTSIZE\n    )\n\n\n@external\ndef transfer_ownership(_factory: IFactory, _owner: address):\n    self._check_dao()\n    extcall _factory.set_admin(_owner)\n\n\n@external\ndef set_emergency(_emergency: address):\n    self._check_dao()\n    self.emergency = _emergency\n\n\n@external\ndef remove_emergency():\n    \"\"\"\n    Useful in case of compromise of the emergency address\n    \"\"\"\n    self._check_authorized()\n    self.emergency = empty(address)","deployed_bytecode":"0x5f3560e01c6002600c820660011b61064201601e395f51565b63f0579235811861008b5760443610341761063e576004358060a01c61063e57610120526024358060a01c61063e5761014052610053610532565b6101205163cc1891c7610160526101405161018052803b1561063e575f610160602461017c5f855af1610088573d5f5f3e3d5ffd5b50005b632c2ca161811861052e5760643610341761063e576004358060a01c61063e57610120526024358060a01c61063e57610140526100c6610532565b6101205163602b62d461018052610140516101a0526020610180602461019c845afa6100f4573d5f5f3e3d5ffd5b60203d1061063e576101809050516101605261016051604435111561018b576020806101e052601c610180527f43616e206f6e6c79207265647563652064656274206365696c696e67000000006101a052610180816101e001603c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101c052806004016101dcfd5b6101205163b933c50a61018052610140516101a0526044356101c052803b1561063e575f610180604461019c5f855af16101c7573d5f5f3e3d5ffd5b50005b63a90e562b811861022d5760443610341761063e576004358060a01c61063e57610120526101f6610532565b61012051634189617d6101405260243561016052803b1561063e575f610140602461015c5f855af161022a573d5f5f3e3d5ffd5b50005b6371248623811861052e5760243610341761063e576004358060a01c61063e57610100526102596105c2565b61010051600155005b63bd5bd55881186102d55760443610341761063e576004358060a01c61063e57610120526024358060a01c61063e576101405261029d610532565b610120516381d2f1b7610160526101405161018052803b1561063e575f610160602461017c5f855af16102d2573d5f5f3e3d5ffd5b50005b634e8cef1c811861052e5760443610341761063e576004358060a01c61063e57610100526024358060a01c61063e57610120526103106105c2565b6101005163e9333fab610140526101205161016052803b1561063e575f610140602461015c5f855af1610345573d5f5f3e3d5ffd5b50005b6325d7c640811861052e5760643610341761063e576004358060a01c61063e5761012052610374610532565b61012051632a0c3586610140526040602461016037803b1561063e575f610140604461015c5f855af16103a9573d5f5f3e3d5ffd5b50005b63251c5b16811861052e5760443610341761063e576004358060a01c61063e57610120526103d8610532565b6101205163a5b4804a6101405260243561016052803b1561063e575f610140602461015c5f855af161040c573d5f5f3e3d5ffd5b50005b631cff79cd811861052e57604336111561063e576004358060a01c61063e57610100526024356004018035610400811161063e5750602081350180826101203750506104596105c2565b60208061096052610100515a6101205061040061056061012051610140348686f19050905061048a573d5f5f3e3d5ffd5b3d61040081183d61040010021861054052610540816109600160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081019050610960f35b63744c1c9f811861052e573461063e576104f1610532565b5f600155005b634162169f811861052e573461063e575f5460405260206040f35b63caa6fea4811861052e573461063e5760015460405260206040f35b5f5ffd5b335f548118610542576001610549565b6001548118155b90506105c05760208060c052600c6060527f556e617574686f72697a6564000000000000000000000000000000000000000060805260608160c001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b565b5f5433181561063c5760208060a05260086040527f4f6e6c792044414f00000000000000000000000000000000000000000000000060605260408160a001602882825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f80fd05120018052e01ca0348052e052e04d90262040f03ac04f7","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"outputSelection":{"Vyper_contract.vy":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]},"search_paths":["."]},"optimization_runs":null,"sourcify_repo_url":null,"decoded_constructor_args":[["0x40907540d8a6C65c637785e8f8B742ae6b0b9968",{"name":"_dao","type":"address"}],["0x467947EE34aF926cF1DCac093870f613C96B1E0c",{"name":"_emergency","type":"address"}]],"compiler_version":"v0.4.3+commit.bff19ea2","is_verified_via_verifier_alliance":false,"verified_at":"2026-02-09T12:15:47.977940Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x346100495760206106de5f395f518060a01c6100495760405260206106fe5f395f518060a01c610049576060526040515f5560605160015561065a61004d6100003961065a610000f35b5f80fd5f3560e01c6002600c820660011b61064201601e395f51565b63f0579235811861008b5760443610341761063e576004358060a01c61063e57610120526024358060a01c61063e5761014052610053610532565b6101205163cc1891c7610160526101405161018052803b1561063e575f610160602461017c5f855af1610088573d5f5f3e3d5ffd5b50005b632c2ca161811861052e5760643610341761063e576004358060a01c61063e57610120526024358060a01c61063e57610140526100c6610532565b6101205163602b62d461018052610140516101a0526020610180602461019c845afa6100f4573d5f5f3e3d5ffd5b60203d1061063e576101809050516101605261016051604435111561018b576020806101e052601c610180527f43616e206f6e6c79207265647563652064656274206365696c696e67000000006101a052610180816101e001603c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101c052806004016101dcfd5b6101205163b933c50a61018052610140516101a0526044356101c052803b1561063e575f610180604461019c5f855af16101c7573d5f5f3e3d5ffd5b50005b63a90e562b811861022d5760443610341761063e576004358060a01c61063e57610120526101f6610532565b61012051634189617d6101405260243561016052803b1561063e575f610140602461015c5f855af161022a573d5f5f3e3d5ffd5b50005b6371248623811861052e5760243610341761063e576004358060a01c61063e57610100526102596105c2565b61010051600155005b63bd5bd55881186102d55760443610341761063e576004358060a01c61063e57610120526024358060a01c61063e576101405261029d610532565b610120516381d2f1b7610160526101405161018052803b1561063e575f610160602461017c5f855af16102d2573d5f5f3e3d5ffd5b50005b634e8cef1c811861052e5760443610341761063e576004358060a01c61063e57610100526024358060a01c61063e57610120526103106105c2565b6101005163e9333fab610140526101205161016052803b1561063e575f610140602461015c5f855af1610345573d5f5f3e3d5ffd5b50005b6325d7c640811861052e5760643610341761063e576004358060a01c61063e5761012052610374610532565b61012051632a0c3586610140526040602461016037803b1561063e575f610140604461015c5f855af16103a9573d5f5f3e3d5ffd5b50005b63251c5b16811861052e5760443610341761063e576004358060a01c61063e57610120526103d8610532565b6101205163a5b4804a6101405260243561016052803b1561063e575f610140602461015c5f855af161040c573d5f5f3e3d5ffd5b50005b631cff79cd811861052e57604336111561063e576004358060a01c61063e57610100526024356004018035610400811161063e5750602081350180826101203750506104596105c2565b60208061096052610100515a6101205061040061056061012051610140348686f19050905061048a573d5f5f3e3d5ffd5b3d61040081183d61040010021861054052610540816109600160208251018083835e508051806020830101601f825f03163682375050601f19601f825160200101169050905081019050610960f35b63744c1c9f811861052e573461063e576104f1610532565b5f600155005b634162169f811861052e573461063e575f5460405260206040f35b63caa6fea4811861052e573461063e5760015460405260206040f35b5f5ffd5b335f548118610542576001610549565b6001548118155b90506105c05760208060c052600c6060527f556e617574686f72697a6564000000000000000000000000000000000000000060805260608160c001602c82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b565b5f5433181561063c5760208060a05260086040527f4f6e6c792044414f00000000000000000000000000000000000000000000000060605260408160a001602882825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b565b5f80fd05120018052e01ca0348052e052e04d90262040f03ac04f7855820994441b0a51efa1782f4af1fafc35f97eac9bafe4e5a62d7fd250ce05cd8356e19065a81181800a165767970657283000403003700000000000000000000000040907540d8a6c65c637785e8f8b742ae6b0b9968000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c","name":"Vyper_contract","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"vyper","evm_version":null,"can_be_visualized_via_sol2uml":false,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"name":"_controller","type":"address"},{"name":"_cb","type":"address"}],"name":"set_callback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_controller","type":"address"},{"name":"_fee","type":"uint256"}],"name":"set_amm_fee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_controller","type":"address"},{"name":"_monetary_policy","type":"address"}],"name":"set_monetary_policy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_controller","type":"address"},{"name":"_loan_discount","type":"uint256"},{"name":"_liquidation_discount","type":"uint256"}],"name":"set_borrowing_discounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_controller","type":"address"},{"name":"_fee","type":"uint256"}],"name":"set_admin_fee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_factory","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"reduce_debt_ceiling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_target","type":"address"},{"name":"_calldata","type":"bytes"}],"name":"execute","outputs":[{"name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"name":"_factory","type":"address"},{"name":"_owner","type":"address"}],"name":"transfer_ownership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_emergency","type":"address"}],"name":"set_emergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"remove_emergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dao","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergency","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"_dao","type":"address"},{"name":"_emergency","type":"address"}],"outputs":[],"stateMutability":"nonpayable","type":"constructor"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x00000000000000000000000040907540d8a6c65c637785e8f8b742ae6b0b9968000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c"}