Skip to content

Commit 5464ebf

Browse files
authored
Merge pull request #17 from Gearbox-protocol/market-generation
feat: factory-driven architecture
2 parents 683377c + 5ce3165 commit 5464ebf

File tree

69 files changed

+4571
-4318
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+4571
-4318
lines changed

.gitmodules

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
[submodule "lib/@gearbox-protocol/oracles-v3"]
2-
path = lib/@gearbox-protocol/oracles-v3
3-
url = https://github.com/Gearbox-protocol/oracles-v3
4-
branch = next
51
[submodule "lib/forge-std"]
62
path = lib/forge-std
73
url = https://github.com/foundry-rs/forge-std
@@ -11,12 +7,10 @@
117
[submodule "lib/@openzeppelin"]
128
path = lib/@openzeppelin
139
url = https://github.com/OpenZeppelin/openzeppelin-contracts
14-
[submodule "lib/@gearbox-protocol/integrations-v3"]
15-
path = lib/@gearbox-protocol/integrations-v3
16-
url = https://github.com/Gearbox-protocol/integrations-v3
1710
[submodule "lib/@gearbox-protocol/core-v3"]
1811
path = lib/@gearbox-protocol/core-v3
1912
url = https://github.com/Gearbox-protocol/core-v3
13+
branch = next
2014
[submodule "lib/@solady"]
2115
path = lib/@solady
2216
url = https://github.com/Vectorized/solady

.vscode/settings.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"solidity.packageDefaultDependenciesContractsDirectory": "contracts",
3-
"solidity.packageDefaultDependenciesDirectory": "node_modules",
4-
"solidity.compileUsingRemoteVersion": "v0.8.22",
3+
"solidity.packageDefaultDependenciesDirectory": "lib",
4+
"solidity.compileUsingRemoteVersion": "v0.8.23",
55
"solidity.formatter": "forge",
66
"[solidity]": {
77
"editor.defaultFormatter": "JuanBlanco.solidity",
Lines changed: 83 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,95 @@
11
// SPDX-License-Identifier: BUSL-1.1
22
// Gearbox Protocol. Generalized leverage for DeFi protocols
33
// (c) Gearbox Foundation, 2024.
4-
pragma solidity ^0.8.17;
4+
pragma solidity ^0.8.23;
55

6-
import {APOwnerTrait} from "../traits/APOwnerTrait.sol";
7-
import {IAddressProviderV3_1} from "../interfaces/IAddressProviderV3_1.sol";
8-
import {AP_BYTECODE_REPOSITORY, NO_VERSION_CONTROL} from "../libraries/ContractLiterals.sol";
6+
import {IVotingContract} from "@gearbox-protocol/core-v3/contracts/interfaces/base/IVotingContract.sol";
7+
import {VotingContractStatus} from "@gearbox-protocol/core-v3/contracts/interfaces/IGearStakingV3.sol";
98

10-
abstract contract AbstractFactory is APOwnerTrait {
11-
address immutable bytecodeRepository;
9+
import {AbstractDeployer} from "../helpers/AbstractDeployer.sol";
1210

13-
error CallerIsNotMarketConfiguratorException();
11+
import {IFactory} from "../interfaces/factories/IFactory.sol";
12+
import {IMarketConfigurator} from "../interfaces/IMarketConfigurator.sol";
13+
import {IMarketConfiguratorFactory} from "../interfaces/IMarketConfiguratorFactory.sol";
14+
import {Call} from "../interfaces/Types.sol";
1415

15-
modifier marketConfiguratorOnly() {
16-
if (IAddressProviderV3_1(addressProvider).isMarketConfigurator(msg.sender)) {
17-
revert CallerIsNotMarketConfiguratorException();
18-
}
16+
import {AP_MARKET_CONFIGURATOR_FACTORY, NO_VERSION_CONTROL} from "../libraries/ContractLiterals.sol";
17+
18+
abstract contract AbstractFactory is AbstractDeployer, IFactory {
19+
// --------------- //
20+
// STATE VARIABLES //
21+
// --------------- //
22+
23+
address public immutable override marketConfiguratorFactory;
24+
25+
// --------- //
26+
// MODIFIERS //
27+
// --------- //
28+
29+
modifier onlyMarketConfigurators() {
30+
_ensureCallerIsMarketConfigurator();
1931
_;
2032
}
2133

22-
constructor(address _addressProvider) APOwnerTrait(_addressProvider) {
23-
bytecodeRepository =
24-
IAddressProviderV3_1(_addressProvider).getAddressOrRevert(AP_BYTECODE_REPOSITORY, NO_VERSION_CONTROL);
34+
// ----------- //
35+
// CONSTRUCTOR //
36+
// ----------- //
37+
38+
constructor(address addressProvider_) AbstractDeployer(addressProvider_) {
39+
marketConfiguratorFactory = _getContract(AP_MARKET_CONFIGURATOR_FACTORY, NO_VERSION_CONTROL);
40+
}
41+
42+
// ------------- //
43+
// CONFIGURATION //
44+
// ------------- //
45+
46+
function configure(address, bytes calldata callData) external virtual override returns (Call[] memory) {
47+
revert ForbiddenConfigurationCallException(bytes4(callData));
48+
}
49+
50+
function emergencyConfigure(address, bytes calldata callData) external virtual override returns (Call[] memory) {
51+
revert ForbiddenEmergencyConfigurationCallException(bytes4(callData));
52+
}
53+
54+
// --------- //
55+
// INTERNALS //
56+
// --------- //
57+
58+
function _ensureCallerIsMarketConfigurator() internal view {
59+
if (IMarketConfiguratorFactory(marketConfiguratorFactory).isMarketConfigurator(msg.sender)) {
60+
revert CallerIsNotMarketConfiguratorException(msg.sender);
61+
}
62+
}
63+
64+
function _isVotingContract(address votingContract) internal view returns (bool) {
65+
try IVotingContract(votingContract).voter() returns (address) {
66+
return true;
67+
} catch {
68+
return false;
69+
}
70+
}
71+
72+
function _setVotingContractStatus(address votingContract, bool allowed) internal view returns (Call memory) {
73+
return Call({
74+
target: marketConfiguratorFactory,
75+
callData: abi.encodeCall(
76+
IMarketConfiguratorFactory.setVotingContractStatus,
77+
(votingContract, allowed ? VotingContractStatus.ALLOWED : VotingContractStatus.UNVOTE_ONLY)
78+
)
79+
});
80+
}
81+
82+
function _addToAccessList(address marketConfigurator, address target) internal view returns (Call memory) {
83+
return Call({
84+
target: marketConfigurator,
85+
callData: abi.encodeCall(IMarketConfigurator.addToAccessList, (target, address(this)))
86+
});
87+
}
88+
89+
function _removeFromAccessList(address marketConfigurator, address target) internal view returns (Call memory) {
90+
return Call({
91+
target: marketConfigurator,
92+
callData: abi.encodeCall(IMarketConfigurator.removeFromAccessList, (target, address(this)))
93+
});
2594
}
2695
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
// SPDX-License-Identifier: BUSL-1.1
2+
// Gearbox Protocol. Generalized leverage for DeFi protocols
3+
// (c) Gearbox Foundation, 2024.
4+
pragma solidity ^0.8.23;
5+
6+
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
7+
import {IPoolQuotaKeeperV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPoolQuotaKeeperV3.sol";
8+
import {IPoolV3} from "@gearbox-protocol/core-v3/contracts/interfaces/IPoolV3.sol";
9+
import {IContractsRegister} from "../interfaces/extensions/IContractsRegister.sol";
10+
import {IMarketFactory} from "../interfaces/factories/IMarketFactory.sol";
11+
import {IMarketConfigurator} from "../interfaces/IMarketConfigurator.sol";
12+
import {Call} from "../interfaces/Types.sol";
13+
import {AbstractFactory} from "./AbstractFactory.sol";
14+
15+
abstract contract AbstractMarketFactory is AbstractFactory, IMarketFactory {
16+
// ------------ //
17+
// MARKET HOOKS //
18+
// ------------ //
19+
20+
function onCreateMarket(address, address, address, address, address, address)
21+
external
22+
virtual
23+
override
24+
returns (Call[] memory)
25+
{}
26+
27+
function onShutdownMarket(address) external virtual override returns (Call[] memory) {}
28+
29+
function onCreateCreditSuite(address) external virtual override returns (Call[] memory) {}
30+
31+
function onShutdownCreditSuite(address) external virtual override returns (Call[] memory) {}
32+
33+
function onUpdatePriceOracle(address, address, address) external virtual override returns (Call[] memory) {}
34+
35+
function onUpdateInterestRateModel(address, address, address) external virtual override returns (Call[] memory) {}
36+
37+
function onUpdateRateKeeper(address, address, address) external virtual override returns (Call[] memory) {}
38+
39+
function onUpdateLossLiquidator(address, address, address) external virtual override returns (Call[] memory) {}
40+
41+
function onAddToken(address, address, address) external virtual override returns (Call[] memory) {}
42+
43+
// --------- //
44+
// INTERNALS //
45+
// --------- //
46+
47+
function _validateDefaultConstructorParams(address pool, bytes calldata constructorParams) internal view {
48+
(address decodedPool, address decodedAddressProvider) = abi.decode(constructorParams[:64], (address, address));
49+
if (decodedPool != pool || decodedAddressProvider != addressProvider) {
50+
revert InvalidConstructorParamsException();
51+
}
52+
}
53+
54+
function _acl(address pool) internal view returns (address) {
55+
return IPoolV3(pool).acl();
56+
}
57+
58+
function _marketConfigurator(address pool) internal view returns (address) {
59+
return Ownable(_acl(pool)).owner();
60+
}
61+
62+
function _contractsRegister(address pool) internal view returns (address) {
63+
return IMarketConfigurator(_marketConfigurator(pool)).contractsRegister();
64+
}
65+
66+
function _underlying(address pool) internal view returns (address) {
67+
return IPoolV3(pool).asset();
68+
}
69+
70+
function _quotaKeeper(address pool) internal view returns (address) {
71+
return IPoolV3(pool).poolQuotaKeeper();
72+
}
73+
74+
function _interestRateModel(address pool) internal view returns (address) {
75+
return IPoolV3(pool).interestRateModel();
76+
}
77+
78+
function _priceOracle(address pool) internal view returns (address) {
79+
return IContractsRegister(_contractsRegister(pool)).getPriceOracle(pool);
80+
}
81+
82+
function _lossLiquidator(address pool) internal view returns (address) {
83+
return IContractsRegister(_contractsRegister(pool)).getLossLiquidator(pool);
84+
}
85+
86+
function _rateKeeper(address quotaKeeper) internal view returns (address) {
87+
return IPoolQuotaKeeperV3(quotaKeeper).gauge();
88+
}
89+
90+
function _isQuotedToken(address quotaKeeper, address token) internal view returns (bool) {
91+
return IPoolQuotaKeeperV3(quotaKeeper).isQuotedToken(token);
92+
}
93+
94+
function _quota(address quotaKeeper, address token) internal view returns (uint96 quota) {
95+
(,,, quota,,) = IPoolQuotaKeeperV3(quotaKeeper).getTokenQuotaParams(token);
96+
}
97+
}

contracts/factories/AdapterFactoryV3.sol

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)