{"file_path":"contracts/Factory.vy","creation_status":"success","source_code":"# @version 0.4.3\n\"\"\"\n@title Factory\n@notice Factory for Yield Basis\n@author Scientia Spectra AG\n@license Copyright (c) 2025\n\"\"\"\nfrom ethereum.ercs import IERC20\nfrom ethereum.ercs import IERC20Detailed\n\n\ninterface LT:\n    def set_amm(amm: address): nonpayable\n    def set_rate(rate: uint256): nonpayable\n    def set_staker(staker: address): nonpayable\n    def allocate_stablecoins(limit: uint256): nonpayable\n\ninterface CurveCryptoPool:\n    def coins(i: uint256) -> address: view\n    def decimals() -> uint8: view\n\ninterface LPOracle:\n    def AGG() -> address: view\n\ninterface Agg:\n    def price() -> uint256: view\n\ninterface VirtualPool:\n    def IMPL() -> address: view\n\n\nstruct Market:\n    asset_token: IERC20\n    cryptopool: CurveCryptoPool\n    amm: address\n    lt: address\n    price_oracle: address\n    virtual_pool: address\n    staker: address\n\nevent SetImplementations:\n    amm: address\n    lt: address\n    virtual_pool: address\n    price_oracle: address\n    staker: address\n\nevent SetAllocator:\n    allocator: address\n    amount: uint256\n\nevent SetFeeReceiver:\n    fee_receiver: address\n\nevent SetAgg:\n    agg: address\n\nevent SetFlash:\n    flash: address\n\nevent SetAdmin:\n    admin: address\n    emergency_admin: address\n    old_admin: address\n    old_emergency_admin: address\n\nevent SetMinAdminFee:\n    admin_fee: uint256\n\nevent SetGaugeController:\n    gc: address\n\nevent MarketParameters:\n    idx: indexed(uint256)\n    asset_token: indexed(address)\n    cryptopool: indexed(address)\n    amm: address\n    lt: address\n    price_oracle: address\n    virtual_pool: address\n    staker: address\n    agg: address\n\n\nMAX_MARKETS: public(constant(uint256)) = 50000\nLEVERAGE: public(constant(uint256)) = 2 * 10**18\ngauge_controller: public(address)\n\namm_impl: public(address)\nlt_impl: public(address)\nvirtual_pool_impl: public(address)\nprice_oracle_impl: public(address)\nstaker_impl: public(address)\nagg: public(address)\nflash: public(address)\n\nSTABLECOIN: public(immutable(IERC20))\nfee_receiver: public(address)\nadmin: public(address)\nemergency_admin: public(address)\nmin_admin_fee: public(uint256)\n\nmarkets: public(Market[MAX_MARKETS])\nmarket_count: public(uint256)\nallocators: public(HashMap[address, uint256])\nmint_factory: public(address)\n\n\n@deploy\ndef __init__(\n    stablecoin: IERC20,\n    amm_impl: address,\n    lt_impl: address,\n    virtual_pool_impl: address,\n    price_oracle_impl: address,\n    staker_impl: address,\n    agg: address,\n    flash: address,\n    fee_receiver: address,\n    gauge_controller: address,\n    admin: address,\n    emergency_admin: address\n):\n    assert admin != empty(address)\n    assert stablecoin.address != empty(address)\n    assert agg != empty(address)\n    assert price_oracle_impl != empty(address)\n    assert amm_impl != empty(address)\n    assert lt_impl != empty(address)\n\n    assert staticcall IERC20Detailed(stablecoin.address).decimals() == 18\n\n    STABLECOIN = stablecoin\n    self.gauge_controller = gauge_controller\n    self.amm_impl = amm_impl\n    self.lt_impl = lt_impl\n    self.virtual_pool_impl = virtual_pool_impl\n    self.price_oracle_impl = price_oracle_impl\n    self.staker_impl = staker_impl\n    self.agg = agg\n    self.flash = flash\n    self.fee_receiver = fee_receiver\n    self.admin = admin\n    self.emergency_admin = emergency_admin\n    self.min_admin_fee = 10**17\n\n    self._validate_agg()\n\n    log SetImplementations(amm=amm_impl, lt=lt_impl, virtual_pool=virtual_pool_impl, price_oracle=price_oracle_impl,\n                           staker=staker_impl)\n\n\n@internal\n@view\ndef _validate_agg():\n    p: uint256 = staticcall Agg(self.agg).price()\n    assert p > 9 * 10**17 and p < 11 * 10**17, \"Bad aggregator\"\n\n\n@external\n@nonreentrant\ndef add_market(\n    pool: CurveCryptoPool,\n    fee: uint256,\n    rate: uint256,\n    debt_ceiling: uint256\n) -> Market:\n    \"\"\"\n    @notice Create a new market/pool\n    @param pool Curve cryptopool which supports \"refueling\"\n    @param fee Fee of the releverage AMM (1e18-based)\n    @param rate Initial borrow/refueling rate in 1e18-based fraction per second\n    @param debt_ceiling Debt ceiling of the market. Factory to have enough stablecoins\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert staticcall pool.coins(0) == STABLECOIN.address, \"Wrong stablecoin\"\n    assert staticcall pool.decimals() == 18\n\n    market: Market = empty(Market)\n    agg: address = self.agg\n\n    market.asset_token = IERC20(staticcall pool.coins(1))\n    market.cryptopool = pool\n    market.price_oracle = create_from_blueprint(self.price_oracle_impl, pool.address, agg)\n    market.lt = create_from_blueprint(\n        self.lt_impl,\n        market.asset_token.address,\n        STABLECOIN,\n        pool.address,\n        self\n    )\n    market.amm = create_from_blueprint(\n        self.amm_impl,\n        market.lt,\n        STABLECOIN.address,\n        pool.address,\n        LEVERAGE,\n        fee,\n        market.price_oracle\n    )\n    extcall LT(market.lt).set_amm(market.amm)\n    extcall LT(market.lt).set_rate(rate)\n    assert extcall STABLECOIN.approve(market.lt, max_value(uint256), default_return_value=True)\n    extcall LT(market.lt).allocate_stablecoins(debt_ceiling)\n\n    if self.virtual_pool_impl != empty(address) and self.flash != empty(address):\n        market.virtual_pool = create_from_blueprint(\n            self.virtual_pool_impl,\n            market.amm\n        )\n    if self.staker_impl != empty(address):\n        market.staker = create_from_blueprint(\n            self.staker_impl,\n            market.lt)\n        extcall LT(market.lt).set_staker(market.staker)\n\n    i: uint256 = self.market_count\n    assert i < MAX_MARKETS, \"Too many markets\"\n    self.market_count = i + 1\n    self.markets[i] = market\n\n    log MarketParameters(\n        idx=i,\n        asset_token=market.asset_token.address,\n        cryptopool=market.cryptopool.address,\n        amm=market.amm,\n        lt=market.lt,\n        price_oracle=market.price_oracle,\n        virtual_pool=market.virtual_pool,\n        staker=market.staker,\n        agg=agg\n    )\n\n    return market\n\n\n@external\ndef fill_staker_vpool(i: uint256):\n    \"\"\"\n    @notice Set staker and vpool for market i in case they were set or changed in the implementations\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert i < self.market_count, \"Nonexistent market\"\n\n    market: Market = self.markets[i]\n    assert market.lt != empty(address)\n    assert market.amm != empty(address)\n\n    new_virtual_pool: bool = False\n    if market.virtual_pool == empty(address):\n        new_virtual_pool = self.virtual_pool_impl != empty(address) and self.flash != empty(address)\n    else:\n        new_virtual_pool = (staticcall VirtualPool(market.virtual_pool).IMPL()) != self.virtual_pool_impl\n\n    if new_virtual_pool:\n        market.virtual_pool = create_from_blueprint(\n            self.virtual_pool_impl,\n            market.amm\n        )\n\n    if market.staker == empty(address) and self.staker_impl != empty(address):\n        market.staker = create_from_blueprint(\n            self.staker_impl,\n            market.lt)\n        extcall LT(market.lt).set_staker(market.staker)\n\n    self.markets[i] = market\n\n    log MarketParameters(\n        idx=i,\n        asset_token=market.asset_token.address,\n        cryptopool=market.cryptopool.address,\n        amm=market.amm,\n        lt=market.lt,\n        price_oracle=market.price_oracle,\n        virtual_pool=market.virtual_pool,\n        staker=market.staker,\n        agg=(staticcall LPOracle(market.price_oracle).AGG())\n    )\n\n\n@external\n@nonreentrant\ndef set_mint_factory(mint_factory: address):\n    \"\"\"\n    @notice Set factory to mint stablecoins (like crvUSD). This can only ever be done once. Permission to get coins back is given\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert self.mint_factory == empty(address), \"Only set once\"\n    assert mint_factory != empty(address)\n    self.mint_factory = mint_factory\n    # crvUSD factory can take back as much as it wants. Very important function - this is why it can be called only once\n    assert extcall STABLECOIN.approve(mint_factory, max_value(uint256), default_return_value=True)\n\n    log SetAllocator(allocator=mint_factory, amount=max_value(uint256))\n\n\n@external\n@nonreentrant\ndef set_allocator(allocator: address, amount: uint256):\n    \"\"\"\n    @notice Add allocator of stablecoins and take coins from it\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert allocator != self.mint_factory, \"Minter\"\n    assert allocator != empty(address)\n\n    old_allocation: uint256 = self.allocators[allocator]\n    if amount > old_allocation:\n        # Use transferFrom\n        assert extcall STABLECOIN.transferFrom(allocator, self, amount - old_allocation, default_return_value=True)\n        self.allocators[allocator] = amount\n\n    elif amount < old_allocation:\n        # Allow to take back the allocation via transferFrom, but not more than the allocation reduction\n        assert extcall STABLECOIN.approve(allocator, (staticcall STABLECOIN.allowance(self, allocator)) + old_allocation - amount, default_return_value=True)\n        self.allocators[allocator] = amount\n\n    log SetAllocator(allocator=allocator, amount=amount)\n\n\n@external\ndef set_agg(agg: address):\n    \"\"\"\n    @notice Set or change stablecoin price aggregator\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert agg != empty(address)\n    self.agg = agg\n    self._validate_agg()\n    log SetAgg(agg=agg)\n\n\n@external\ndef set_flash(flash: address):\n    \"\"\"\n    @notice Set or change stablecoin flash lender implementation\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    self.flash = flash\n    log SetFlash(flash=flash)\n\n\n@external\ndef set_admin(new_admin: address, new_emergency_admin: address):\n    \"\"\"\n    @notice Set new admins of the factory. It is important to set it to the DAO\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert new_admin != empty(address)\n    assert new_emergency_admin != empty(address)\n    log SetAdmin(admin=new_admin, emergency_admin=new_emergency_admin, old_admin=self.admin, old_emergency_admin=self.emergency_admin)\n    self.admin = new_admin\n    self.emergency_admin = new_emergency_admin\n\n\n@external\ndef set_fee_receiver(new_fee_receiver: address):\n    \"\"\"\n    @notice Set new fee receiver. All pools give admin fee to it\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    self.fee_receiver = new_fee_receiver\n    log SetFeeReceiver(fee_receiver=new_fee_receiver)\n\n\n@external\ndef set_gauge_controller(gc: address):\n    \"\"\"\n    @notice Set Gauge Controller. This can only be done once\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert self.gauge_controller == empty(address), \"Already set\"\n    self.gauge_controller = gc\n    log SetGaugeController(gc=gc)\n\n\n@external\ndef set_min_admin_fee(new_min_admin_fee: uint256):\n    \"\"\"\n    @notice Set minimal admin fee (admin fee when nothing is staked)\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    assert new_min_admin_fee <= 10**18, \"Admin fee too high\"\n    self.min_admin_fee = new_min_admin_fee\n    log SetMinAdminFee(admin_fee=new_min_admin_fee)\n\n\n@external\ndef set_implementations(amm: address, lt: address, virtual_pool: address, price_oracle: address, staker: address):\n    \"\"\"\n    @notice Set implementations for all factory contracts needed for creating markets\n    @param amm AMM implementation\n    @param lt LT implementation\n    @param virtual_pool VirtualPool implementation\n    @param price_oracle LPPriceOracle implementation (price oracle showing the price of LP token in stablecoins)\n    @param staker Staker (gauge) implementation\n    \"\"\"\n    assert msg.sender == self.admin, \"Access\"\n    if amm != empty(address):\n        self.amm_impl = amm\n    if lt != empty(address):\n        self.lt_impl = lt\n    if virtual_pool != empty(address):\n        self.virtual_pool_impl = virtual_pool\n    if price_oracle != empty(address):\n        self.price_oracle_impl = price_oracle\n    if staker != empty(address):\n        self.staker_impl = staker\n    log SetImplementations(amm=amm, lt=lt, virtual_pool=virtual_pool, price_oracle=price_oracle, staker=staker)\n","deployed_bytecode":"0x5f3560e01c6002601a820660011b611b4401601e395f51565b6384f514bf811861074657608436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d6009543318156100c35760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6020611b785f395f5160405163c66106576060525f608052602060606024607c845afa6100f2573d5f5f3e3d5ffd5b3d602081183d602010021880606001608011611b40576060518060a01c611b405760a0525060a090505118156101975760208061012052601060c0527f57726f6e6720737461626c65636f696e0000000000000000000000000000000060e05260c08161012001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b601260405163313ce567606052602060606004607c845afa6101bb573d5f5f3e3d5ffd5b3d602081183d602010021880606001608011611b40576060518060081c611b405760a0525060a090505118611b405760e0366060376006546101405260405163c6610657610160526001610180526020610160602461017c845afa610222573d5f5f3e3d5ffd5b3d602081183d6020100218806101600161018011611b4057610160518060a01c611b40576101a052506101a090505160605260405160805260045460405161016052610160516101a0526101405161018052610180516101c05260406003823b035960018212611b405781600382863c818101836101a0825e50828201815ff0806102af573d5f5f3e3d5ffd5b905090509050905060e05260025460605161016052610160516101e0526020611b786101803961018051610200526040516101a0526101a05161022052306101c0526101c0516102405260806003823b035960018212611b405781600382863c818101836101e0825e50828201815ff08061032c573d5f5f3e3d5ffd5b905090509050905060c05260015460c0516101605261016051610220526020611b786101803961018051610240526040516101a0526101a05161026052671bc16d674ec800006101c0526101c051610280526024356101e0526101e0516102a05260e05161020052610200516102c05260c06003823b035960018212611b405781600382863c81810183610220825e50828201815ff0806103cf573d5f5f3e3d5ffd5b905090509050905060a05260c051636831c45b6101605260a05161018052803b15611b40575f610160602461017c5f855af161040d573d5f5f3e3d5ffd5b5060c05163d4387a996101605260443561018052803b15611b40575f610160602461017c5f855af1610441573d5f5f3e3d5ffd5b506020611b785f395f5163095ea7b36101605260c051610180527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0526020610160604461017c5f855af161049a573d5f5f3e3d5ffd5b3d6104b157803b15611b405760016101c0526104db565b3d602081183d6020100218806101600161018011611b4057610160518060011c611b40576101c052505b6101c090505115611b405760c05163e5ef2aae6101605260643561018052803b15611b40575f610160602461017c5f855af1610519573d5f5f3e3d5ffd5b506003541561052c57600754151561052e565b5f5b156105855760035460a05161016052610160516101805260206003823b035960018212611b405781600382863c81810161018051815250828201815ff080610578573d5f5f3e3d5ffd5b9050905090509050610100525b600554156106145760055460c05161016052610160516101805260206003823b035960018212611b405781600382863c81810161018051815250828201815ff0806105d2573d5f5f3e3d5ffd5b90509050905090506101205260c05163464d700b610160526101205161018052803b15611b40575f610160602461017c5f855af1610612573d5f5f3e3d5ffd5b505b6205573c546101605261c34f6101605111156106a2576020806101e0526010610180527f546f6f206d616e79206d61726b657473000000000000000000000000000000006101a052610180816101e001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101c052806004016101dcfd5b6101605160018101818110611b405790506205573c5560076101605161c350811015611b405702600c016060518155608051600182015560a051600282015560c051600382015560e051600482015561010051600582015561012051600682015550608051606051610160517f0a2f141c803b7bf5e04b3d7b621d659110855c736b446179264d6a61232d3f0b60c060a06101805e60c0610180a460e060605f5f5df35b63680c77838118611a6c5734611b4057600a5460405260206040f35b6374729f3e8118611a6c57602436103417611b40576009543318156107f25760208060a05260066040527f416363657373000000000000000000000000000000000000000000000000000060605260408160a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b6205573c54600435106108705760208060a05260126040527f4e6f6e6578697374656e74206d61726b6574000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b600760043561c350811015611b405702600c01805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e0526006810154610100525060a05115611b405760805115611b40575f6101205260e0516108f357600354156108e85760075415156108ea565b5f5b61012052610951565b60035460e0516356973ee5610140526020610140600461015c845afa61091b573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611b4057610140518060a01c611b405761018052506101809050511415610120525b61012051156109ab5760035460805161014052610140516101605260206003823b035960018212611b405781600382863c81810161016051815250828201815ff08061099f573d5f5f3e3d5ffd5b905090509050905060e0525b610100516109bd5760055415156109bf565b5f5b15610a4b5760055460a05161014052610140516101605260206003823b035960018212611b405781600382863c81810161016051815250828201815ff080610a09573d5f5f3e3d5ffd5b90509050905090506101005260a05163464d700b610140526101005161016052803b15611b40575f610140602461015c5f855af1610a49573d5f5f3e3d5ffd5b505b600760043561c350811015611b405702600c0160405181556060516001820155608051600282015560a051600382015560c051600482015560e0516005820155610100516006820155506060516040516004357f0a2f141c803b7bf5e04b3d7b621d659110855c736b446179264d6a61232d3f0b60a060806101a05e60c05163858051e2610140526020610140600461015c845afa610aec573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611b4057610140518060a01c611b405761018052506101809050516102405260c06101a0a4005b63dcce86ff8118610d4b57602436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d600954331815610bd25760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6205573e5415610c4d5760208060c052600d6060527f4f6e6c7920736574206f6e63650000000000000000000000000000000000000060805260608160c001602d82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60405115611b40576040516205573e556020611b785f395f5163095ea7b36060526040516080527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60a052602060606044607c5f855af1610cb0573d5f5f3e3d5ffd5b3d610cc657803b15611b4057600160c052610cec565b3d602081183d602010021880606001608011611b40576060518060011c611b405760c052505b60c090505115611b40577f6e671c52e5bc0aa133fe59c69dcbdde3ebec4145c563664428a70731ff91ae0f6040516060527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805260406060a15f5f5d005b63041622b58118611a6c5734611b405760015460405260206040f35b63eb060c148118611a6c57604436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d600954331815610e125760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6205573e5460405118610e905760208060c05260066060527f4d696e746572000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60405115611b40576205573d6040516020525f5260405f205460605260605160243511610fbb576060516024351015611063576020611b785f395f5163095ea7b360e052604051610100526020611b785f395f5163dd62ed3e6080523060a05260405160c052602060806044609c845afa610f0d573d5f5f3e3d5ffd5b60203d10611b40576080905051606051808201828110611b405790509050602435808203828111611b40579050905061012052602060e0604460fc5f855af1610f58573d5f5f3e3d5ffd5b3d610f6f57803b15611b4057600161014052610f97565b3d602081183d60201002188060e00161010011611b405760e0518060011c611b405761014052505b61014090505115611b40576024356205573d6040516020525f5260405f2055611063565b6020611b785f395f516323b872dd60805260405160a0523060c052602435606051808203828111611b40579050905060e052602060806064609c5f855af1611005573d5f5f3e3d5ffd5b3d61101c57803b15611b4057600161010052611043565b3d602081183d60201002188060800160a011611b40576080518060011c611b405761010052505b61010090505115611b40576024356205573d6040516020525f5260405f20555b7f6e671c52e5bc0aa133fe59c69dcbdde3ebec4145c563664428a70731ff91ae0f60405160805260243560a05260406080a15f5f5d005b63ec15c030811861118957602436103417611b40576004358060a01c611b405761012052600954331815611140576020806101a0526006610140527f416363657373000000000000000000000000000000000000000000000000000061016052610140816101a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6101205115611b405761012051600655611158611a70565b7f843c0fd5d15daa8bb099274f122c91630f39df53ebf3c5f8e843c979fb660bca61012051610140526020610140a1005b63410e36008114600336111615611a6c5734611b405761c35060405260206040f35b63bafa0630811861127d57602436103417611b40576004358060a01c611b40576040526009543318156112495760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516007557feaa8d04d33cdb2fd361c560c793d8cbaee16fbba34b3747921ab2a76191f912d60405160605260206060a1005b63fd775c788118611a6c5734611b40576205573c5460405260206040f35b6373e80cba811861139e57604436103417611b40576004358060a01c611b40576040526024358060a01c611b40576060526009543318156113475760208060e05260066080527f416363657373000000000000000000000000000000000000000000000000000060a05260808160e001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060c0528060040160dcfd5b60405115611b405760605115611b40577f9a45e4c3baa33ef1c484b02fb5837d58d3ffb1b7cf7a11ea3b8d0546064ab3bb6040604060805e60095460c052600a5460e05260806080a1604051600955606051600a55005b632cb2af128118611a6c5760a436103417611b40576004358060a01c611b40576040526024358060a01c611b40576060526044358060a01c611b40576080526064358060a01c611b405760a0526084358060a01c611b405760c0526009543318156114795760208061014052600660e0527f41636365737300000000000000000000000000000000000000000000000000006101005260e08161014001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60405115611488576040516001555b60605115611497576060516002555b608051156114a6576080516003555b60a051156114b55760a0516004555b60c051156114c45760c0516005555b7fe0816edf10a269aa4a7dd0728c02244458ca712361bfc23d84a4ea830b7c44ef60a0604060e05e60a060e0a1005b63e41ab77181186115c557602436103417611b40576004358060a01c611b40576040526009543318156115915760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516008557fffb40bfdfd246e95f543d08d9713c339f1d90fa9265e39b4f562f9011d7c919f60405160605260206060a1005b63b1283e778118611a6c57602436103417611b4057600760043561c350811015611b405702600c01805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e0526006810154610100525060e06040f35b63783a1cf7811861177357602436103417611b40576004358060a01c611b40576040526009543318156116c85760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b5f54156117405760208060c052600b6060527f416c72656164792073657400000000000000000000000000000000000000000060805260608160c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040515f557f613940253cf21d005743a34a04b5c9c39fb1700b83758166647e87af9b826ac760405160605260206060a1005b63cab4d3db8118611a6c5734611b405760085460405260206040f35b630d58902a81186118d657602436103417611b405760095433181561181f5760208060a05260066040527f416363657373000000000000000000000000000000000000000000000000000060605260408160a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b670de0b6b3a764000060043511156118a25760208060a05260126040527f41646d696e2066656520746f6f2068696768000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b600435600b557f1d944867b41f8cfe3aa0b5ba9ff5c481e37c5c4dd403801d32000a939ba5fcc060043560405260206040a1005b63f8adac9e81186118f25734611b405760025460405260206040f35b63f851a4408118611a6c5734611b405760095460405260206040f35b638d01f0ba81186119305734611b4057671bc16d674ec8000060405260206040f35b6393a397768118611a6c5734611b40576020611b7860403960206040f35b63d8b9a01881186119695734611b40575f5460405260206040f35b63d7d43f1881186119855734611b405760035460405260206040f35b63084ea36e8118611a6c57602436103417611b40576004358060a01c611b40576040526205573d6040516020525f5260405f205460605260206060f35b63eefc088b8118611a6c5734611b405760045460405260206040f35b63b7d5440e81186119fa5734611b405760055460405260206040f35b63f5e34bfa8118611a6c5734611b405760065460405260206040f35b63d336c82d8118611a6c5734611b405760075460405260206040f35b638c5710c98118611a6c5734611b4057600b5460405260206040f35b6343c26bd18118611a6c5734611b40576205573e5460405260206040f35b5f5ffd5b60065463a035b1fe606052602060606004607c845afa611a92573d5f5f3e3d5ffd5b60203d10611b40576060905051604052670c7d713b49da00016040511015611aba575f611ac9565b670f43fc2c04edffff60405111155b611b3e5760208060c052600e6060527f4261642061676772656761746f7200000000000000000000000000000000000060805260608160c001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b565b5f80fd129b1a4e1a6c00180d671a321a6c1a6c109a19c21a6c0b27194e162a07621a6c178f1a6c19de1a6c190e1a161a6c1a6c11ab14f3000000000000000000000000f939e0a03fb07f59a73314e73794be0e57ac1b4e","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"outputSelection":{"contracts/Factory.vy":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]},"search_paths":["."]},"optimization_runs":null,"sourcify_repo_url":null,"decoded_constructor_args":[["0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E",{"name":"stablecoin","type":"address"}],["0x258F7E1EE13ee4d3a62d79Db715fA95C4620d9c3",{"name":"amm_impl","type":"address"}],["0x27845Fbb7bA58b152681558E44c4ed4c64E37016",{"name":"lt_impl","type":"address"}],["0x62b792654eAffFBBC483D69fA05f8Ca4d0914af2",{"name":"virtual_pool_impl","type":"address"}],["0xDE61d94f71A44cB28CE94A34b1b560fC55128C80",{"name":"price_oracle_impl","type":"address"}],["0xdA67786a87BeD11081c1D85B26fe75A33E1C2710",{"name":"staker_impl","type":"address"}],["0x18672b1b0c623a30089A280Ed9256379fb0E4E62",{"name":"agg","type":"address"}],["0x26dE7861e213A5351F6ED767d00e0839930e9eE1",{"name":"flash","type":"address"}],["0x0000000000000000000000000000000000000000",{"name":"fee_receiver","type":"address"}],["0x1Be14811A3a06F6aF4fA64310a636e1Df04c1c21",{"name":"gauge_controller","type":"address"}],["0xa39E4d6bb25A8E55552D6D9ab1f5f8889DDdC80d",{"name":"admin","type":"address"}],["0x467947EE34aF926cF1DCac093870f613C96B1E0c",{"name":"emergency_admin","type":"address"}]],"compiler_version":"v0.4.3+commit.bff19ea2","is_verified_via_verifier_alliance":false,"verified_at":"2025-12-21T05:51:17.871949Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x611b78515034610311576020611ec55f395f518060a01c61031157610120526020611ee55f395f518060a01c61031157610140526020611f055f395f518060a01c61031157610160526020611f255f395f518060a01c61031157610180526020611f455f395f518060a01c610311576101a0526020611f655f395f518060a01c610311576101c0526020611f855f395f518060a01c610311576101e0526020611fa55f395f518060a01c61031157610200526020611fc55f395f518060a01c61031157610220526020611fe55f395f518060a01c610311576102405260206120055f395f518060a01c610311576102605260206120255f395f518060a01c61031157610280526102605115610311576101205115610311576101e05115610311576101a051156103115761014051156103115761016051156103115760126101205163313ce5676102a05260206102a060046102bc845afa610163573d5f5f3e3d5ffd5b3d602081183d6020100218806102a0016102c011610311576102a0518060081c610311576102e052506102e0905051186103115761012051611b7852610240515f556101405160015561016051600255610180516003556101a0516004556101c0516005556101e05160065561020051600755610220516008556102605160095561028051600a5567016345785d8a0000600b556101ff610241565b7fe0816edf10a269aa4a7dd0728c02244458ca712361bfc23d84a4ea830b7c44ef60a06101406102a05e60a06102a0a1611b7861031561000039611b98610000f35b60065463a035b1fe606052602060606004607c845afa610263573d5f5f3e3d5ffd5b60203d10610311576060905051604052670c7d713b49da0001604051101561028b575f61029a565b670f43fc2c04edffff60405111155b61030f5760208060c052600e6060527f4261642061676772656761746f7200000000000000000000000000000000000060805260608160c001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b565b5f80fd5f3560e01c6002601a820660011b611b4401601e395f51565b6384f514bf811861074657608436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d6009543318156100c35760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6020611b785f395f5160405163c66106576060525f608052602060606024607c845afa6100f2573d5f5f3e3d5ffd5b3d602081183d602010021880606001608011611b40576060518060a01c611b405760a0525060a090505118156101975760208061012052601060c0527f57726f6e6720737461626c65636f696e0000000000000000000000000000000060e05260c08161012001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610100528060040161011cfd5b601260405163313ce567606052602060606004607c845afa6101bb573d5f5f3e3d5ffd5b3d602081183d602010021880606001608011611b40576060518060081c611b405760a0525060a090505118611b405760e0366060376006546101405260405163c6610657610160526001610180526020610160602461017c845afa610222573d5f5f3e3d5ffd5b3d602081183d6020100218806101600161018011611b4057610160518060a01c611b40576101a052506101a090505160605260405160805260045460405161016052610160516101a0526101405161018052610180516101c05260406003823b035960018212611b405781600382863c818101836101a0825e50828201815ff0806102af573d5f5f3e3d5ffd5b905090509050905060e05260025460605161016052610160516101e0526020611b786101803961018051610200526040516101a0526101a05161022052306101c0526101c0516102405260806003823b035960018212611b405781600382863c818101836101e0825e50828201815ff08061032c573d5f5f3e3d5ffd5b905090509050905060c05260015460c0516101605261016051610220526020611b786101803961018051610240526040516101a0526101a05161026052671bc16d674ec800006101c0526101c051610280526024356101e0526101e0516102a05260e05161020052610200516102c05260c06003823b035960018212611b405781600382863c81810183610220825e50828201815ff0806103cf573d5f5f3e3d5ffd5b905090509050905060a05260c051636831c45b6101605260a05161018052803b15611b40575f610160602461017c5f855af161040d573d5f5f3e3d5ffd5b5060c05163d4387a996101605260443561018052803b15611b40575f610160602461017c5f855af1610441573d5f5f3e3d5ffd5b506020611b785f395f5163095ea7b36101605260c051610180527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101a0526020610160604461017c5f855af161049a573d5f5f3e3d5ffd5b3d6104b157803b15611b405760016101c0526104db565b3d602081183d6020100218806101600161018011611b4057610160518060011c611b40576101c052505b6101c090505115611b405760c05163e5ef2aae6101605260643561018052803b15611b40575f610160602461017c5f855af1610519573d5f5f3e3d5ffd5b506003541561052c57600754151561052e565b5f5b156105855760035460a05161016052610160516101805260206003823b035960018212611b405781600382863c81810161018051815250828201815ff080610578573d5f5f3e3d5ffd5b9050905090509050610100525b600554156106145760055460c05161016052610160516101805260206003823b035960018212611b405781600382863c81810161018051815250828201815ff0806105d2573d5f5f3e3d5ffd5b90509050905090506101205260c05163464d700b610160526101205161018052803b15611b40575f610160602461017c5f855af1610612573d5f5f3e3d5ffd5b505b6205573c546101605261c34f6101605111156106a2576020806101e0526010610180527f546f6f206d616e79206d61726b657473000000000000000000000000000000006101a052610180816101e001603082825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a06101c052806004016101dcfd5b6101605160018101818110611b405790506205573c5560076101605161c350811015611b405702600c016060518155608051600182015560a051600282015560c051600382015560e051600482015561010051600582015561012051600682015550608051606051610160517f0a2f141c803b7bf5e04b3d7b621d659110855c736b446179264d6a61232d3f0b60c060a06101805e60c0610180a460e060605f5f5df35b63680c77838118611a6c5734611b4057600a5460405260206040f35b6374729f3e8118611a6c57602436103417611b40576009543318156107f25760208060a05260066040527f416363657373000000000000000000000000000000000000000000000000000060605260408160a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b6205573c54600435106108705760208060a05260126040527f4e6f6e6578697374656e74206d61726b6574000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b600760043561c350811015611b405702600c01805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e0526006810154610100525060a05115611b405760805115611b40575f6101205260e0516108f357600354156108e85760075415156108ea565b5f5b61012052610951565b60035460e0516356973ee5610140526020610140600461015c845afa61091b573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611b4057610140518060a01c611b405761018052506101809050511415610120525b61012051156109ab5760035460805161014052610140516101605260206003823b035960018212611b405781600382863c81810161016051815250828201815ff08061099f573d5f5f3e3d5ffd5b905090509050905060e0525b610100516109bd5760055415156109bf565b5f5b15610a4b5760055460a05161014052610140516101605260206003823b035960018212611b405781600382863c81810161016051815250828201815ff080610a09573d5f5f3e3d5ffd5b90509050905090506101005260a05163464d700b610140526101005161016052803b15611b40575f610140602461015c5f855af1610a49573d5f5f3e3d5ffd5b505b600760043561c350811015611b405702600c0160405181556060516001820155608051600282015560a051600382015560c051600482015560e0516005820155610100516006820155506060516040516004357f0a2f141c803b7bf5e04b3d7b621d659110855c736b446179264d6a61232d3f0b60a060806101a05e60c05163858051e2610140526020610140600461015c845afa610aec573d5f5f3e3d5ffd5b3d602081183d6020100218806101400161016011611b4057610140518060a01c611b405761018052506101809050516102405260c06101a0a4005b63dcce86ff8118610d4b57602436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d600954331815610bd25760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6205573e5415610c4d5760208060c052600d6060527f4f6e6c7920736574206f6e63650000000000000000000000000000000000000060805260608160c001602d82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60405115611b40576040516205573e556020611b785f395f5163095ea7b36060526040516080527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60a052602060606044607c5f855af1610cb0573d5f5f3e3d5ffd5b3d610cc657803b15611b4057600160c052610cec565b3d602081183d602010021880606001608011611b40576060518060011c611b405760c052505b60c090505115611b40577f6e671c52e5bc0aa133fe59c69dcbdde3ebec4145c563664428a70731ff91ae0f6040516060527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60805260406060a15f5f5d005b63041622b58118611a6c5734611b405760015460405260206040f35b63eb060c148118611a6c57604436103417611b40576004358060a01c611b40576040525f5c600114611b405760015f5d600954331815610e125760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6205573e5460405118610e905760208060c05260066060527f4d696e746572000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b60405115611b40576205573d6040516020525f5260405f205460605260605160243511610fbb576060516024351015611063576020611b785f395f5163095ea7b360e052604051610100526020611b785f395f5163dd62ed3e6080523060a05260405160c052602060806044609c845afa610f0d573d5f5f3e3d5ffd5b60203d10611b40576080905051606051808201828110611b405790509050602435808203828111611b40579050905061012052602060e0604460fc5f855af1610f58573d5f5f3e3d5ffd5b3d610f6f57803b15611b4057600161014052610f97565b3d602081183d60201002188060e00161010011611b405760e0518060011c611b405761014052505b61014090505115611b40576024356205573d6040516020525f5260405f2055611063565b6020611b785f395f516323b872dd60805260405160a0523060c052602435606051808203828111611b40579050905060e052602060806064609c5f855af1611005573d5f5f3e3d5ffd5b3d61101c57803b15611b4057600161010052611043565b3d602081183d60201002188060800160a011611b40576080518060011c611b405761010052505b61010090505115611b40576024356205573d6040516020525f5260405f20555b7f6e671c52e5bc0aa133fe59c69dcbdde3ebec4145c563664428a70731ff91ae0f60405160805260243560a05260406080a15f5f5d005b63ec15c030811861118957602436103417611b40576004358060a01c611b405761012052600954331815611140576020806101a0526006610140527f416363657373000000000000000000000000000000000000000000000000000061016052610140816101a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610180528060040161019cfd5b6101205115611b405761012051600655611158611a70565b7f843c0fd5d15daa8bb099274f122c91630f39df53ebf3c5f8e843c979fb660bca61012051610140526020610140a1005b63410e36008114600336111615611a6c5734611b405761c35060405260206040f35b63bafa0630811861127d57602436103417611b40576004358060a01c611b40576040526009543318156112495760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516007557feaa8d04d33cdb2fd361c560c793d8cbaee16fbba34b3747921ab2a76191f912d60405160605260206060a1005b63fd775c788118611a6c5734611b40576205573c5460405260206040f35b6373e80cba811861139e57604436103417611b40576004358060a01c611b40576040526024358060a01c611b40576060526009543318156113475760208060e05260066080527f416363657373000000000000000000000000000000000000000000000000000060a05260808160e001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060c0528060040160dcfd5b60405115611b405760605115611b40577f9a45e4c3baa33ef1c484b02fb5837d58d3ffb1b7cf7a11ea3b8d0546064ab3bb6040604060805e60095460c052600a5460e05260806080a1604051600955606051600a55005b632cb2af128118611a6c5760a436103417611b40576004358060a01c611b40576040526024358060a01c611b40576060526044358060a01c611b40576080526064358060a01c611b405760a0526084358060a01c611b405760c0526009543318156114795760208061014052600660e0527f41636365737300000000000000000000000000000000000000000000000000006101005260e08161014001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a0610120528060040161013cfd5b60405115611488576040516001555b60605115611497576060516002555b608051156114a6576080516003555b60a051156114b55760a0516004555b60c051156114c45760c0516005555b7fe0816edf10a269aa4a7dd0728c02244458ca712361bfc23d84a4ea830b7c44ef60a0604060e05e60a060e0a1005b63e41ab77181186115c557602436103417611b40576004358060a01c611b40576040526009543318156115915760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040516008557fffb40bfdfd246e95f543d08d9713c339f1d90fa9265e39b4f562f9011d7c919f60405160605260206060a1005b63b1283e778118611a6c57602436103417611b4057600760043561c350811015611b405702600c01805460405260018101546060526002810154608052600381015460a052600481015460c052600581015460e0526006810154610100525060e06040f35b63783a1cf7811861177357602436103417611b40576004358060a01c611b40576040526009543318156116c85760208060c05260066060527f416363657373000000000000000000000000000000000000000000000000000060805260608160c001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b5f54156117405760208060c052600b6060527f416c72656164792073657400000000000000000000000000000000000000000060805260608160c001602b82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b6040515f557f613940253cf21d005743a34a04b5c9c39fb1700b83758166647e87af9b826ac760405160605260206060a1005b63cab4d3db8118611a6c5734611b405760085460405260206040f35b630d58902a81186118d657602436103417611b405760095433181561181f5760208060a05260066040527f416363657373000000000000000000000000000000000000000000000000000060605260408160a001602682825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b670de0b6b3a764000060043511156118a25760208060a05260126040527f41646d696e2066656520746f6f2068696768000000000000000000000000000060605260408160a001603282825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060805280600401609cfd5b600435600b557f1d944867b41f8cfe3aa0b5ba9ff5c481e37c5c4dd403801d32000a939ba5fcc060043560405260206040a1005b63f8adac9e81186118f25734611b405760025460405260206040f35b63f851a4408118611a6c5734611b405760095460405260206040f35b638d01f0ba81186119305734611b4057671bc16d674ec8000060405260206040f35b6393a397768118611a6c5734611b40576020611b7860403960206040f35b63d8b9a01881186119695734611b40575f5460405260206040f35b63d7d43f1881186119855734611b405760035460405260206040f35b63084ea36e8118611a6c57602436103417611b40576004358060a01c611b40576040526205573d6040516020525f5260405f205460605260206060f35b63eefc088b8118611a6c5734611b405760045460405260206040f35b63b7d5440e81186119fa5734611b405760055460405260206040f35b63f5e34bfa8118611a6c5734611b405760065460405260206040f35b63d336c82d8118611a6c5734611b405760075460405260206040f35b638c5710c98118611a6c5734611b4057600b5460405260206040f35b6343c26bd18118611a6c5734611b40576205573e5460405260206040f35b5f5ffd5b60065463a035b1fe606052602060606004607c845afa611a92573d5f5f3e3d5ffd5b60203d10611b40576060905051604052670c7d713b49da00016040511015611aba575f611ac9565b670f43fc2c04edffff60405111155b611b3e5760208060c052600e6060527f4261642061676772656761746f7200000000000000000000000000000000000060805260608160c001602e82825e8051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506308c379a060a0528060040160bcfd5b565b5f80fd129b1a4e1a6c00180d671a321a6c1a6c109a19c21a6c0b27194e162a07621a6c178f1a6c19de1a6c190e1a161a6c1a6c11ab14f385582036d01d275fa949cd87c2f3c12f5900a5e5a3f4e7332b279c5196ece946a039f0191b788118341820a1657679706572830004030038000000000000000000000000f939e0a03fb07f59a73314e73794be0e57ac1b4e000000000000000000000000258f7e1ee13ee4d3a62d79db715fa95c4620d9c300000000000000000000000027845fbb7ba58b152681558e44c4ed4c64e3701600000000000000000000000062b792654eafffbbc483d69fa05f8ca4d0914af2000000000000000000000000de61d94f71a44cb28ce94a34b1b560fc55128c80000000000000000000000000da67786a87bed11081c1d85b26fe75a33e1c271000000000000000000000000018672b1b0c623a30089a280ed9256379fb0e4e6200000000000000000000000026de7861e213a5351f6ed767d00e0839930e9ee100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001be14811a3a06f6af4fa64310a636e1df04c1c21000000000000000000000000a39e4d6bb25a8e55552d6d9ab1f5f8889dddc80d000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c","name":"Factory","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":[{"anonymous":false,"inputs":[{"indexed":false,"name":"amm","type":"address"},{"indexed":false,"name":"lt","type":"address"},{"indexed":false,"name":"virtual_pool","type":"address"},{"indexed":false,"name":"price_oracle","type":"address"},{"indexed":false,"name":"staker","type":"address"}],"name":"SetImplementations","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"allocator","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"SetAllocator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fee_receiver","type":"address"}],"name":"SetFeeReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"agg","type":"address"}],"name":"SetAgg","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"flash","type":"address"}],"name":"SetFlash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"admin","type":"address"},{"indexed":false,"name":"emergency_admin","type":"address"},{"indexed":false,"name":"old_admin","type":"address"},{"indexed":false,"name":"old_emergency_admin","type":"address"}],"name":"SetAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"admin_fee","type":"uint256"}],"name":"SetMinAdminFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gc","type":"address"}],"name":"SetGaugeController","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"idx","type":"uint256"},{"indexed":true,"name":"asset_token","type":"address"},{"indexed":true,"name":"cryptopool","type":"address"},{"indexed":false,"name":"amm","type":"address"},{"indexed":false,"name":"lt","type":"address"},{"indexed":false,"name":"price_oracle","type":"address"},{"indexed":false,"name":"virtual_pool","type":"address"},{"indexed":false,"name":"staker","type":"address"},{"indexed":false,"name":"agg","type":"address"}],"name":"MarketParameters","type":"event"},{"inputs":[{"name":"pool","type":"address"},{"name":"fee","type":"uint256"},{"name":"rate","type":"uint256"},{"name":"debt_ceiling","type":"uint256"}],"name":"add_market","outputs":[{"components":[{"name":"asset_token","type":"address"},{"name":"cryptopool","type":"address"},{"name":"amm","type":"address"},{"name":"lt","type":"address"},{"name":"price_oracle","type":"address"},{"name":"virtual_pool","type":"address"},{"name":"staker","type":"address"}],"name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"i","type":"uint256"}],"name":"fill_staker_vpool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"mint_factory","type":"address"}],"name":"set_mint_factory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"allocator","type":"address"},{"name":"amount","type":"uint256"}],"name":"set_allocator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"agg","type":"address"}],"name":"set_agg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"flash","type":"address"}],"name":"set_flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"new_admin","type":"address"},{"name":"new_emergency_admin","type":"address"}],"name":"set_admin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"new_fee_receiver","type":"address"}],"name":"set_fee_receiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"gc","type":"address"}],"name":"set_gauge_controller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"new_min_admin_fee","type":"uint256"}],"name":"set_min_admin_fee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"amm","type":"address"},{"name":"lt","type":"address"},{"name":"virtual_pool","type":"address"},{"name":"price_oracle","type":"address"},{"name":"staker","type":"address"}],"name":"set_implementations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_MARKETS","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEVERAGE","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge_controller","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amm_impl","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lt_impl","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"virtual_pool_impl","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price_oracle_impl","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staker_impl","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"agg","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flash","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLECOIN","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee_receiver","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergency_admin","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"min_admin_fee","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"uint256"}],"name":"markets","outputs":[{"components":[{"name":"asset_token","type":"address"},{"name":"cryptopool","type":"address"},{"name":"amm","type":"address"},{"name":"lt","type":"address"},{"name":"price_oracle","type":"address"},{"name":"virtual_pool","type":"address"},{"name":"staker","type":"address"}],"name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"market_count","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"arg0","type":"address"}],"name":"allocators","outputs":[{"name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint_factory","outputs":[{"name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"stablecoin","type":"address"},{"name":"amm_impl","type":"address"},{"name":"lt_impl","type":"address"},{"name":"virtual_pool_impl","type":"address"},{"name":"price_oracle_impl","type":"address"},{"name":"staker_impl","type":"address"},{"name":"agg","type":"address"},{"name":"flash","type":"address"},{"name":"fee_receiver","type":"address"},{"name":"gauge_controller","type":"address"},{"name":"admin","type":"address"},{"name":"emergency_admin","type":"address"}],"outputs":[],"stateMutability":"nonpayable","type":"constructor"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000f939e0a03fb07f59a73314e73794be0e57ac1b4e000000000000000000000000258f7e1ee13ee4d3a62d79db715fa95c4620d9c300000000000000000000000027845fbb7ba58b152681558e44c4ed4c64e3701600000000000000000000000062b792654eafffbbc483d69fa05f8ca4d0914af2000000000000000000000000de61d94f71a44cb28ce94a34b1b560fc55128c80000000000000000000000000da67786a87bed11081c1d85b26fe75a33e1c271000000000000000000000000018672b1b0c623a30089a280ed9256379fb0e4e6200000000000000000000000026de7861e213a5351f6ed767d00e0839930e9ee100000000000000000000000000000000000000000000000000000000000000000000000000000000000000001be14811a3a06f6af4fa64310a636e1df04c1c21000000000000000000000000a39e4d6bb25a8e55552d6d9ab1f5f8889dddc80d000000000000000000000000467947ee34af926cf1dcac093870f613c96b1e0c"}