Skip to content

Commit

Permalink
feat: code dump
Browse files Browse the repository at this point in the history
  • Loading branch information
lekhovitsky committed Jan 5, 2025
1 parent 7654517 commit 9d53869
Show file tree
Hide file tree
Showing 24 changed files with 285 additions and 718 deletions.
6 changes: 3 additions & 3 deletions contracts/factories/AbstractMarketFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ abstract contract AbstractMarketFactory is AbstractFactory, IMarketFactory {

function onUpdateRateKeeper(address, address, address) external virtual override returns (Call[] memory) {}

function onUpdateLossLiquidator(address, address, address) external virtual override returns (Call[] memory) {}
function onUpdateLossPolicy(address, address, address) external virtual override returns (Call[] memory) {}

function onAddToken(address, address, address) external virtual override returns (Call[] memory) {}

Expand Down Expand Up @@ -79,8 +79,8 @@ abstract contract AbstractMarketFactory is AbstractFactory, IMarketFactory {
return IContractsRegister(_contractsRegister(pool)).getPriceOracle(pool);
}

function _lossLiquidator(address pool) internal view returns (address) {
return IContractsRegister(_contractsRegister(pool)).getLossLiquidator(pool);
function _lossPolicy(address pool) internal view returns (address) {
return IContractsRegister(_contractsRegister(pool)).getLossPolicy(pool);
}

function _rateKeeper(address quotaKeeper) internal view returns (address) {
Expand Down
42 changes: 19 additions & 23 deletions contracts/factories/CreditFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,10 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
onlyMarketConfigurators
returns (DeployResult memory)
{
address contractsRegister = IMarketConfigurator(msg.sender).contractsRegister();
address priceOracle = IContractsRegister(contractsRegister).getPriceOracle(pool);
address lossLiquidator = IContractsRegister(contractsRegister).getLossLiquidator(pool);

(CreditManagerParams memory params, CreditFacadeParams memory facadeParams) =
abi.decode(encodedParams, (CreditManagerParams, CreditFacadeParams));

address creditManager = _deployCreditManager(msg.sender, pool, priceOracle, params);
address creditManager = _deployCreditManager(msg.sender, pool, params);
address creditConfigurator = _deployCreditConfigurator(msg.sender, creditManager);
address creditFacade = _deployCreditFacade(msg.sender, creditManager, facadeParams);

Expand All @@ -124,7 +120,6 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
_authorizeFactory(msg.sender, creditManager, creditConfigurator),
_authorizeFactory(msg.sender, creditManager, creditFacade),
_setCreditFacade(creditConfigurator, creditFacade, false),
_setLossLiquidator(creditConfigurator, lossLiquidator),
_setDebtLimits(creditConfigurator, params.minDebt, params.maxDebt)
)
});
Expand All @@ -143,13 +138,13 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
return CallBuilder.build(_setPriceOracle(_creditConfigurator(creditManager), newPriceOracle));
}

function onUpdateLossLiquidator(address creditManager, address newLossLiquidator, address)
function onUpdateLossPolicy(address creditManager, address newLossPolicy, address)
external
view
override
returns (Call[] memory)
{
return CallBuilder.build(_setLossLiquidator(_creditConfigurator(creditManager), newLossLiquidator));
return CallBuilder.build(_setLossPolicy(_creditConfigurator(creditManager), newLossPolicy));
}

// ------------- //
Expand Down Expand Up @@ -238,12 +233,13 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
// INTERNALS //
// --------- //

function _deployCreditManager(
address marketConfigurator,
address pool,
address priceOracle,
CreditManagerParams memory params
) internal returns (address) {
function _deployCreditManager(address marketConfigurator, address pool, CreditManagerParams memory params)
internal
returns (address)
{
address contractsRegister = IMarketConfigurator(marketConfigurator).contractsRegister();
address priceOracle = IContractsRegister(contractsRegister).getPriceOracle(pool);

bytes32 postfix = _getTokenSpecificPostfix(IPoolV3(pool).asset());

// TODO: ensure that account factory is registered, add manager to it
Expand All @@ -269,7 +265,8 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
}

function _deployCreditConfigurator(address marketConfigurator, address creditManager) internal returns (address) {
bytes memory constructorParams = abi.encode(creditManager);
address acl = IMarketConfigurator(marketConfigurator).acl();
bytes memory constructorParams = abi.encode(acl, creditManager);

return _deployLatestPatch({
contractType: AP_CREDIT_CONFIGURATOR,
Expand All @@ -284,10 +281,13 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
returns (address)
{
address acl = IMarketConfigurator(marketConfigurator).acl();
address contractsRegister = IMarketConfigurator(marketConfigurator).contractsRegister();
address lossPolicy = IContractsRegister(contractsRegister).getLossPolicy(ICreditManagerV3(creditManager).pool());

// TODO: ensure that botList is registered, coincides with the previous one, add manager to it
// TODO: ensure that degenNFT is registered, add facade to it
bytes memory constructorParams =
abi.encode(acl, creditManager, params.botList, weth, params.degenNFT, params.expirable);
abi.encode(acl, creditManager, lossPolicy, params.botList, weth, params.degenNFT, params.expirable);

return _deployLatestPatch({
contractType: AP_CREDIT_FACADE,
Expand All @@ -304,7 +304,7 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
address decodedCreditManager = address(bytes20(bytes32(params.constructorParams)));
if (decodedCreditManager != creditManager) revert InvalidConstructorParamsException();

// NOTE: unlike other contracts, this might be deployed multiple times, so using the same salt
// FIXME: unlike other contracts, this might be deployed multiple times, so using the same salt
// can be an issue. Same thing can happen to rate keepers, IRMs, etc.
return _deployLatestPatch({
contractType: _getContractType(DOMAIN_ADAPTER, params.postfix),
Expand Down Expand Up @@ -346,12 +346,8 @@ contract CreditFactory is AbstractFactory, ICreditFactory {
return Call(creditConfigurator, abi.encodeCall(ICreditConfiguratorV3.setPriceOracle, priceOracle));
}

function _setLossLiquidator(address creditConfigurator, address lossLiquidator)
internal
pure
returns (Call memory)
{
return Call(creditConfigurator, abi.encodeCall(ICreditConfiguratorV3.setLossLiquidator, lossLiquidator));
function _setLossPolicy(address creditConfigurator, address lossPolicy) internal pure returns (Call memory) {
return Call(creditConfigurator, abi.encodeCall(ICreditConfiguratorV3.setLossPolicy, lossPolicy));
}

function _allowAdapter(address creditConfigurator, address adapter) internal pure returns (Call memory) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,25 @@
// (c) Gearbox Foundation, 2024.
pragma solidity ^0.8.23;

import {ILossPolicy} from "@gearbox-protocol/core-v3/contracts/interfaces/base/ILossPolicy.sol";

import {IFactory} from "../interfaces/factories/IFactory.sol";
import {IMarketFactory} from "../interfaces/factories/IMarketFactory.sol";
import {ILossLiquidatorFactory} from "../interfaces/factories/ILossLiquidatorFactory.sol";
import {ILossPolicyFactory} from "../interfaces/factories/ILossPolicyFactory.sol";
import {Call, DeployParams, DeployResult} from "../interfaces/Types.sol";

import {CallBuilder} from "../libraries/CallBuilder.sol";
import {AP_LOSS_LIQUIDATOR_FACTORY, DOMAIN_LOSS_LIQUIDATOR} from "../libraries/ContractLiterals.sol";
import {AP_LOSS_POLICY_FACTORY, DOMAIN_LOSS_POLICY} from "../libraries/ContractLiterals.sol";

import {AbstractFactory} from "./AbstractFactory.sol";
import {AbstractMarketFactory} from "./AbstractMarketFactory.sol";

contract LossLiquidatorFactory is AbstractMarketFactory, ILossLiquidatorFactory {
contract LossPolicyFactory is AbstractMarketFactory, ILossPolicyFactory {
/// @notice Contract version
uint256 public constant override version = 3_10;

/// @notice Contract type
bytes32 public constant override contractType = AP_LOSS_LIQUIDATOR_FACTORY;
bytes32 public constant override contractType = AP_LOSS_POLICY_FACTORY;

/// @notice Constructor
/// @param addressProvider_ Address provider contract address
Expand All @@ -29,43 +31,43 @@ contract LossLiquidatorFactory is AbstractMarketFactory, ILossLiquidatorFactory
// DEPLOYMENT //
// ---------- //

function deployLossLiquidator(address pool, DeployParams calldata params)
function deployLossPolicy(address pool, DeployParams calldata params)
external
override
onlyMarketConfigurators
returns (DeployResult memory)
{
if (params.postfix == "ALIASED") {
address decodedACL = abi.decode(params.constructorParams, (address));
if (decodedACL != _acl(pool)) revert InvalidConstructorParamsException();
address decodedPool = abi.decode(params.constructorParams, (address));
if (decodedPool != pool) revert InvalidConstructorParamsException();
} else {
_validateDefaultConstructorParams(pool, params.constructorParams);
}

address lossLiquidator = _deployLatestPatch({
contractType: _getContractType(DOMAIN_LOSS_LIQUIDATOR, params.postfix),
address lossPolicy = _deployLatestPatch({
contractType: _getContractType(DOMAIN_LOSS_POLICY, params.postfix),
minorVersion: version,
constructorParams: params.constructorParams,
salt: bytes32(bytes20(msg.sender))
});

return DeployResult({
newContract: lossLiquidator,
onInstallOps: CallBuilder.build(_authorizeFactory(msg.sender, pool, lossLiquidator))
newContract: lossPolicy,
onInstallOps: CallBuilder.build(_authorizeFactory(msg.sender, pool, lossPolicy))
});
}

// ------------ //
// MARKET HOOKS //
// ------------ //

function onUpdateLossLiquidator(address pool, address, address oldLossLiquidator)
function onUpdateLossPolicy(address pool, address, address oldLossPolicy)
external
view
override(AbstractMarketFactory, IMarketFactory)
returns (Call[] memory calls)
{
calls = CallBuilder.build(_unauthorizeFactory(msg.sender, pool, oldLossLiquidator));
calls = CallBuilder.build(_unauthorizeFactory(msg.sender, pool, oldLossPolicy));
}

// ------------- //
Expand All @@ -78,7 +80,7 @@ contract LossLiquidatorFactory is AbstractMarketFactory, ILossLiquidatorFactory
override(AbstractFactory, IFactory)
returns (Call[] memory)
{
return CallBuilder.build(Call(_lossLiquidator(pool), callData));
return CallBuilder.build(Call(_lossPolicy(pool), callData));
}

function emergencyConfigure(address pool, bytes calldata callData)
Expand All @@ -87,7 +89,10 @@ contract LossLiquidatorFactory is AbstractMarketFactory, ILossLiquidatorFactory
override(AbstractFactory, IFactory)
returns (Call[] memory)
{
// TODO: only allow to disable and pause
return CallBuilder.build(Call(_lossLiquidator(pool), callData));
bytes4 selector = bytes4(callData);
if (selector != ILossPolicy.enable.selector && selector != ILossPolicy.disable.selector) {
revert ForbiddenEmergencyConfigurationCallException(selector);
}
return CallBuilder.build(Call(_lossPolicy(pool), callData));
}
}
10 changes: 4 additions & 6 deletions contracts/factories/PoolFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import {IPoolQuotaKeeperV3} from "@gearbox-protocol/core-v3/contracts/interfaces
import {IPoolV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPoolV3.sol";
import {IPriceOracleV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPriceOracleV3.sol";

import {DefaultIRM} from "../helpers/DefaultIRM.sol";

import {IFactory} from "../interfaces/factories/IFactory.sol";
import {IMarketFactory} from "../interfaces/factories/IMarketFactory.sol";
import {IPoolFactory} from "../interfaces/factories/IPoolFactory.sol";
Expand All @@ -20,11 +22,7 @@ import {Call, DeployResult} from "../interfaces/Types.sol";

import {CallBuilder} from "../libraries/CallBuilder.sol";
import {
AP_DEFAULT_IRM,
AP_POOL_FACTORY,
AP_POOL_QUOTA_KEEPER,
DOMAIN_POOL,
NO_VERSION_CONTROL
AP_POOL_FACTORY, AP_POOL_QUOTA_KEEPER, DOMAIN_POOL, NO_VERSION_CONTROL
} from "../libraries/ContractLiterals.sol";

import {AbstractFactory} from "./AbstractFactory.sol";
Expand Down Expand Up @@ -73,7 +71,7 @@ contract PoolFactory is AbstractMarketFactory, IPoolFactory {
/// @notice Constructor
/// @param addressProvider_ Address provider contract address
constructor(address addressProvider_) AbstractFactory(addressProvider_) {
defaultInterestRateModel = _getAddressOrRevert(AP_DEFAULT_IRM, NO_VERSION_CONTROL);
defaultInterestRateModel = address(new DefaultIRM());
}

// ---------- //
Expand Down
2 changes: 1 addition & 1 deletion contracts/factories/PriceOracleFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ contract PriceOracleFactory is AbstractMarketFactory, IPriceOracleFactory {
contractType: AP_PRICE_ORACLE,
minorVersion: version,
constructorParams: abi.encode(_acl(pool)),
salt: bytes32(bytes20(msg.sender))
salt: bytes32(bytes20(pool))
});

return DeployResult({
Expand Down
13 changes: 6 additions & 7 deletions contracts/global/MarketConfiguratorFactory.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import {
import {MarketConfiguratorLegacy} from "../market/legacy/MarketConfiguratorLegacy.sol";
import {MarketConfigurator} from "../market/MarketConfigurator.sol";

// TODO: somehow need to add MC Legacy to MC Factory. maybe we can deploy it from here?

contract MarketConfiguratorFactory is Ownable2Step, AbstractDeployer, IMarketConfiguratorFactory {
using Address for address;
using EnumerableSet for EnumerableSet.AddressSet;
Expand Down Expand Up @@ -88,9 +90,9 @@ contract MarketConfiguratorFactory is Ownable2Step, AbstractDeployer, IMarketCon

function createMarketConfigurator(string calldata name) external override returns (address marketConfigurator) {
// TODO: deploy timelocks
marketConfigurator = _deploy({
marketConfigurator = _deployLatestPatch({
contractType: AP_MARKET_CONFIGURATOR,
version: version,
minorVersion: version,
constructorParams: abi.encode(name, msg.sender, msg.sender, addressProvider),
salt: bytes32(bytes20(msg.sender))
});
Expand All @@ -113,23 +115,20 @@ contract MarketConfiguratorFactory is Ownable2Step, AbstractDeployer, IMarketCon
emit ShutdownMarketConfigurator(marketConfigurator);
}

// TODO: probably move these two to the instance manager, don't forget to change it in the MC

function setVotingContractStatus(address votingContract, VotingContractStatus status)
external
override
onlyMarketConfigurators
{
// QUESTION: do we need to check that votingContract's voter is indeed the GEAR staking contract?
_configureGearStaking(abi.encodeCall(IGearStakingV3.setVotingContractStatus, (votingContract, status)));
}

function configureGearStaking(bytes calldata data) external override onlyOwner {
_configureGearStaking(data);
}

// --------- //
// INTERNALS //
// --------- //

function _configureGearStaking(bytes memory data) internal {
address gearStaking = _getAddressOrRevert(AP_GEAR_STAKING, NO_VERSION_CONTROL);
if (IGearStakingV3(gearStaking).version() < 3_10) {
Expand Down
1 change: 1 addition & 0 deletions contracts/helpers/AbstractDeployer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ abstract contract AbstractDeployer {
bytes memory constructorParams,
bytes32 salt
) internal returns (address) {
// NOTE: it's best to add a check that deployed contract's version matches the expected one in the governor
return _deploy(
contractType,
IBytecodeRepository(bytecodeRepository).getLatestPatchVersion(contractType, minorVersion),
Expand Down
19 changes: 19 additions & 0 deletions contracts/helpers/DefaultIRM.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: BUSL-1.1
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2024.
pragma solidity ^0.8.23;

import {IInterestRateModel} from "@gearbox-protocol/core-v3/contracts/interfaces/base/IInterestRateModel.sol";

contract DefaultIRM is IInterestRateModel {
uint256 public constant override version = 3_10;
bytes32 public constant override contractType = "IRM_DEFAULT";

function calcBorrowRate(uint256, uint256, bool) external pure override returns (uint256) {
return 0;
}

function availableToBorrow(uint256, uint256) external pure override returns (uint256) {
return 0;
}
}
27 changes: 27 additions & 0 deletions contracts/helpers/DefaultLossPolicy.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// SPDX-License-Identifier: BUSL-1.1
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2024.
pragma solidity ^0.8.23;

import {ACLTrait} from "@gearbox-protocol/core-v3/contracts/traits/ACLTrait.sol";

contract DefaultLossPolicy is ACLTrait {
uint256 public constant version = 3_10;
bytes32 public constant contractType = "LOSS_POLICY_DEFAULT";

bool public enabled;

constructor(address acl_) ACLTrait(acl_) {}

function isLiquidatable(address, address, bytes calldata) external view returns (bool) {
return enabled;
}

function enable() external configuratorOnly {
enabled = true;
}

function disable() external configuratorOnly {
enabled = false;
}
}
Loading

0 comments on commit 9d53869

Please sign in to comment.