Skip to content

Commit

Permalink
🚧
Browse files Browse the repository at this point in the history
  • Loading branch information
itofarina committed Nov 12, 2024
1 parent 54d845f commit 2b568e0
Show file tree
Hide file tree
Showing 8 changed files with 156 additions and 90 deletions.
134 changes: 67 additions & 67 deletions contracts/.gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,69 +1,69 @@
ExaAccountFactoryTest:testFuzz_createAccount_EOAOwners(uint256,address[63]) (runs: 256, μ: 3147710, ~: 3056311)
ExaPluginTest:test_collectCredit_collects() (gas: 883631)
ExaPluginTest:test_collectCredit_collects_whenHealthFactorHigherThanMinCreditFactor() (gas: 764407)
ExaPluginTest:test_collectCredit_collects_withEnoughSlippage() (gas: 762957)
ExaPluginTest:test_collectCredit_passes_whenProposalLeavesEnoughLiquidity() (gas: 961597)
ExaPluginTest:test_collectCredit_reverts_asNotKeeper() (gas: 337324)
ExaPluginTest:test_collectCredit_reverts_whenDisagreement() (gas: 520838)
ExaPluginTest:test_collectCredit_reverts_whenExpired() (gas: 332878)
ExaPluginTest:test_collectCredit_reverts_whenHealthFactorLowerThanMinCreditFactor() (gas: 794506)
ExaPluginTest:test_collectCredit_reverts_whenPrposalCausesInsufficientLiquidity() (gas: 961797)
ExaPluginTest:test_collectCredit_reverts_whenReplay() (gas: 805494)
ExaPluginTest:test_collectCredit_reverts_whenTimelocked() (gas: 329457)
ExaPluginTest:test_collectCredit_toleratesTimeDrift() (gas: 766405)
ExaPluginTest:test_collectDebit_collects() (gas: 614954)
ExaPluginTest:test_collectDebit_collects_whenProposalLeavesEnoughLiquidity() (gas: 807264)
ExaPluginTest:test_collectDebit_reverts_asNotKeeper() (gas: 337112)
ExaPluginTest:test_collectDebit_reverts_whenExpired() (gas: 332607)
ExaPluginTest:test_collectDebit_reverts_whenProposalCausesInsufficientLiquidity() (gas: 804267)
ExaPluginTest:test_collectDebit_reverts_whenReplay() (gas: 653974)
ExaPluginTest:test_collectDebit_reverts_whenTimelocked() (gas: 329232)
ExaPluginTest:test_collectDebit_toleratesTimeDrift() (gas: 615072)
ExaPluginTest:test_collectInstallments_collects() (gas: 1292766)
ExaPluginTest:test_collectInstallments_revertsWhenNoSlippage() (gas: 1161120)
ExaPluginTest:test_collectInstallments_reverts_asNotKeeper() (gas: 338153)
ExaPluginTest:test_collectInstallments_reverts_whenExpired() (gas: 334920)
ExaPluginTest:test_collectInstallments_reverts_whenReplay() (gas: 1024575)
ExaPluginTest:test_collectInstallments_reverts_whenTimelocked() (gas: 331542)
ExaPluginTest:test_collectInstallments_toleratesTimeDrift() (gas: 1149580)
ExaPluginTest:test_crossRepay_lifi() (gas: 16089290)
ExaPluginTest:test_onUninstall_uninstalls() (gas: 215117)
ExaPluginTest:test_poke() (gas: 290926)
ExaPluginTest:test_pokeETH_deposits() (gas: 361396)
ExaPluginTest:test_propose_emitsProposed() (gas: 207533)
ExaPluginTest:test_refund_refunds() (gas: 360624)
ExaPluginTest:test_repay_partiallyRepays() (gas: 1660850)
ExaPluginTest:test_repay_repays() (gas: 1093103)
ExaPluginTest:test_setCollector_emitsCollectorSet() (gas: 40414)
ExaAccountFactoryTest:testFuzz_createAccount_EOAOwners(uint256,address[63]) (runs: 256, μ: 3117695, ~: 3015904)
ExaPluginTest:test_collectCredit_collects() (gas: 884612)
ExaPluginTest:test_collectCredit_collects_whenHealthFactorHigherThanMinCreditFactor() (gas: 765385)
ExaPluginTest:test_collectCredit_collects_withEnoughSlippage() (gas: 763944)
ExaPluginTest:test_collectCredit_passes_whenProposalLeavesEnoughLiquidity() (gas: 962639)
ExaPluginTest:test_collectCredit_reverts_asNotKeeper() (gas: 337951)
ExaPluginTest:test_collectCredit_reverts_whenDisagreement() (gas: 521732)
ExaPluginTest:test_collectCredit_reverts_whenExpired() (gas: 333494)
ExaPluginTest:test_collectCredit_reverts_whenHealthFactorLowerThanMinCreditFactor() (gas: 795501)
ExaPluginTest:test_collectCredit_reverts_whenPrposalCausesInsufficientLiquidity() (gas: 962868)
ExaPluginTest:test_collectCredit_reverts_whenReplay() (gas: 806450)
ExaPluginTest:test_collectCredit_reverts_whenTimelocked() (gas: 330136)
ExaPluginTest:test_collectCredit_toleratesTimeDrift() (gas: 767389)
ExaPluginTest:test_collectDebit_collects() (gas: 615881)
ExaPluginTest:test_collectDebit_collects_whenProposalLeavesEnoughLiquidity() (gas: 808318)
ExaPluginTest:test_collectDebit_reverts_asNotKeeper() (gas: 337739)
ExaPluginTest:test_collectDebit_reverts_whenExpired() (gas: 333224)
ExaPluginTest:test_collectDebit_reverts_whenProposalCausesInsufficientLiquidity() (gas: 805320)
ExaPluginTest:test_collectDebit_reverts_whenReplay() (gas: 654930)
ExaPluginTest:test_collectDebit_reverts_whenTimelocked() (gas: 329889)
ExaPluginTest:test_collectDebit_toleratesTimeDrift() (gas: 616056)
ExaPluginTest:test_collectInstallments_collects() (gas: 1294151)
ExaPluginTest:test_collectInstallments_revertsWhenNoSlippage() (gas: 1162419)
ExaPluginTest:test_collectInstallments_reverts_asNotKeeper() (gas: 338789)
ExaPluginTest:test_collectInstallments_reverts_whenExpired() (gas: 335598)
ExaPluginTest:test_collectInstallments_reverts_whenReplay() (gas: 1025822)
ExaPluginTest:test_collectInstallments_reverts_whenTimelocked() (gas: 332248)
ExaPluginTest:test_collectInstallments_toleratesTimeDrift() (gas: 1150862)
ExaPluginTest:test_crossRepay_lifi() (gas: 16794521)
ExaPluginTest:test_onUninstall_uninstalls() (gas: 215645)
ExaPluginTest:test_poke() (gas: 291557)
ExaPluginTest:test_pokeETH_deposits() (gas: 362191)
ExaPluginTest:test_propose_emitsProposed() (gas: 207613)
ExaPluginTest:test_refund_refunds() (gas: 360745)
ExaPluginTest:test_repay_partiallyRepays() (gas: 1663158)
ExaPluginTest:test_repay_repays() (gas: 1094594)
ExaPluginTest:test_setCollector_emitsCollectorSet() (gas: 40448)
ExaPluginTest:test_setCollector_reverts_whenAddressZero() (gas: 32104)
ExaPluginTest:test_setCollector_reverts_whenNotAdmin() (gas: 33688)
ExaPluginTest:test_setCollector_sets_whenAdmin() (gas: 39776)
ExaPluginTest:test_setKeeperFeeModel_emitsKeeperFeeModelSet() (gas: 40371)
ExaPluginTest:test_setCollector_reverts_whenNotAdmin() (gas: 33694)
ExaPluginTest:test_setCollector_sets_whenAdmin() (gas: 39772)
ExaPluginTest:test_setKeeperFeeModel_emitsKeeperFeeModelSet() (gas: 40360)
ExaPluginTest:test_setKeeperFeeModel_reverts_whenAddressZero() (gas: 32062)
ExaPluginTest:test_setKeeperFeeModel_reverts_whenNotAdmin() (gas: 33680)
ExaPluginTest:test_setKeeperFeeModel_sets_whenAdmin() (gas: 39678)
ExaPluginTest:test_setMinCreditFactor_reverts_whenLowerThanWad() (gas: 32061)
ExaPluginTest:test_setMinCreditFactor_reverts_whenNotAdmin() (gas: 33629)
ExaPluginTest:test_setMinCreditFactor_sets_whenAdmin() (gas: 39384)
ExaPluginTest:test_withdrawWETH_transfersETH() (gas: 811285)
ExaPluginTest:test_withdraw_reverts_whenNoProposal() (gas: 381155)
ExaPluginTest:test_withdraw_reverts_whenNoProposalKeeper() (gas: 332487)
ExaPluginTest:test_withdraw_reverts_whenNotKeeper() (gas: 329643)
ExaPluginTest:test_withdraw_reverts_whenReceiverIsContractAndMarketNotWETH() (gas: 575889)
ExaPluginTest:test_withdraw_reverts_whenTimelocked() (gas: 287314)
ExaPluginTest:test_withdraw_reverts_whenTimelockedKeeper() (gas: 288793)
ExaPluginTest:test_withdraw_reverts_whenWrongAmount() (gas: 288357)
ExaPluginTest:test_withdraw_reverts_whenWrongMarket() (gas: 288987)
ExaPluginTest:test_withdraw_reverts_whenWrongReceiver() (gas: 287923)
ExaPluginTest:test_withdraw_transfersAsset_asKeeper() (gas: 772380)
ExaPluginTest:test_withdraw_transfersAsset_asOwner() (gas: 771376)
InstallmentsPreviewerTest:test_preview_returns() (gas: 134951)
KeeperFeeModelTest:test_fuzz_refFee(uint256,uint256[],uint256) (runs: 256, μ: 3350586, ~: 3349086)
KeeperFeeModelTest:test_invalidRangeDeploy_reverts() (gas: 3626531)
RefunderTest:test_refund_refunds() (gas: 241944)
RefunderTest:test_refund_reverts_whenExpired() (gas: 68882)
RefunderTest:test_refund_reverts_whenNotKeeper() (gas: 56634)
RefunderTest:test_refund_reverts_whenReplay() (gas: 278639)
RefunderTest:test_refund_reverts_whenTimelocked() (gas: 63029)
RefunderTest:test_refund_reverts_whenWrongSignature() (gas: 68726)
RefunderTest:test_refund_toleratesTimeDrift() (gas: 242063)
ExaPluginTest:test_setKeeperFeeModel_reverts_whenNotAdmin() (gas: 33686)
ExaPluginTest:test_setKeeperFeeModel_sets_whenAdmin() (gas: 39674)
ExaPluginTest:test_setMinCreditFactor_reverts_whenLowerThanWad() (gas: 32118)
ExaPluginTest:test_setMinCreditFactor_reverts_whenNotAdmin() (gas: 33635)
ExaPluginTest:test_setMinCreditFactor_sets_whenAdmin() (gas: 39435)
ExaPluginTest:test_withdrawWETH_transfersETH() (gas: 812453)
ExaPluginTest:test_withdraw_reverts_whenNoProposal() (gas: 381805)
ExaPluginTest:test_withdraw_reverts_whenNoProposalKeeper() (gas: 333169)
ExaPluginTest:test_withdraw_reverts_whenNotKeeper() (gas: 330279)
ExaPluginTest:test_withdraw_reverts_whenReceiverIsContractAndMarketNotWETH() (gas: 576683)
ExaPluginTest:test_withdraw_reverts_whenTimelocked() (gas: 287452)
ExaPluginTest:test_withdraw_reverts_whenTimelockedKeeper() (gas: 289023)
ExaPluginTest:test_withdraw_reverts_whenWrongAmount() (gas: 288512)
ExaPluginTest:test_withdraw_reverts_whenWrongMarket() (gas: 289164)
ExaPluginTest:test_withdraw_reverts_whenWrongReceiver() (gas: 288124)
ExaPluginTest:test_withdraw_transfersAsset_asKeeper() (gas: 773408)
ExaPluginTest:test_withdraw_transfersAsset_asOwner() (gas: 772347)
InstallmentsPreviewerTest:test_preview_returns() (gas: 134970)
KeeperFeeModelTest:test_fuzz_refFee(uint256,uint256[],uint256) (runs: 256, μ: 3270662, ~: 3269489)
KeeperFeeModelTest:test_invalidRangeDeploy_reverts() (gas: 3545321)
RefunderTest:test_refund_refunds() (gas: 242045)
RefunderTest:test_refund_reverts_whenExpired() (gas: 68937)
RefunderTest:test_refund_reverts_whenNotKeeper() (gas: 56689)
RefunderTest:test_refund_reverts_whenReplay() (gas: 278716)
RefunderTest:test_refund_reverts_whenTimelocked() (gas: 63114)
RefunderTest:test_refund_reverts_whenWrongSignature() (gas: 68742)
RefunderTest:test_refund_toleratesTimeDrift() (gas: 242143)
2 changes: 1 addition & 1 deletion contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
solc_version = "0.8.28"
evm_version = "cancun"
optimizer = true
optimizer_runs = 1_000
optimizer_runs = 500
deny_warnings = true
verbosity = 3
isolate = true
Expand Down
14 changes: 12 additions & 2 deletions contracts/script/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { ACCOUNT_IMPL, ENTRYPOINT } from "webauthn-owner-plugin/../script/Factor
import { WebauthnOwnerPlugin } from "webauthn-owner-plugin/WebauthnOwnerPlugin.sol";

import { ExaAccountFactory } from "../src/ExaAccountFactory.sol";
import { ExaPlugin, IAuditor, IBalancerVault, IInstallmentsRouter, IMarket } from "../src/ExaPlugin.sol";
import { ExaPlugin, IAuditor, IBalancerVault, IDebtManager, IInstallmentsRouter, IMarket } from "../src/ExaPlugin.sol";
import { IssuerChecker } from "../src/IssuerChecker.sol";
import { KeeperFeeModel } from "../src/KeeperFeeModel.sol";
import { Refunder } from "../src/Refunder.sol";
Expand All @@ -26,6 +26,7 @@ contract DeployScript is BaseScript {
IAuditor public auditor;
IMarket public exaUSDC;
IMarket public exaWETH;
IDebtManager public debtManager;
IInstallmentsRouter public installmentsRouter;
Refunder public refunder;
IBalancerVault public balancerVault;
Expand All @@ -40,6 +41,7 @@ contract DeployScript is BaseScript {
auditor = IAuditor(protocol("Auditor"));
exaUSDC = IMarket(protocol("MarketUSDC"));
exaWETH = IMarket(protocol("MarketWETH"));
debtManager = IDebtManager(protocol("DebtManager"));
installmentsRouter = IInstallmentsRouter(protocol("InstallmentsRouter"));
refunder = Refunder(broadcast("Refunder"));
keeperFeeModel = KeeperFeeModel(broadcast("KeeperFeeModel"));
Expand All @@ -55,7 +57,15 @@ contract DeployScript is BaseScript {
vm.startBroadcast(deployer);

exaPlugin = new ExaPlugin(
auditor, exaUSDC, exaWETH, balancerVault, installmentsRouter, issuerChecker, collector, keeperFeeModel
auditor,
exaUSDC,
exaWETH,
balancerVault,
debtManager,
installmentsRouter,
issuerChecker,
collector,
keeperFeeModel
);
factory = new ExaAccountFactory(deployer, ownerPlugin, exaPlugin, ACCOUNT_IMPL, ENTRYPOINT);

Expand Down
63 changes: 46 additions & 17 deletions contracts/src/ExaPlugin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
IMarket public immutable EXA_USDC;
IMarket public immutable EXA_WETH;
IBalancerVault public immutable BALANCER_VAULT;
IDebtManager public immutable DEBT_MANAGER;
IInstallmentsRouter public immutable INSTALLMENTS_ROUTER;
IssuerChecker public immutable ISSUER_CHECKER;

Expand All @@ -88,6 +89,7 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
IMarket exaUSDC,
IMarket exaWETH,
IBalancerVault balancerVault,
IDebtManager debtManager,
IInstallmentsRouter installmentsRouter,
IssuerChecker issuerChecker,
address collector_,
Expand All @@ -97,6 +99,7 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
EXA_USDC = exaUSDC;
EXA_WETH = exaWETH;
BALANCER_VAULT = balancerVault;
DEBT_MANAGER = debtManager;
INSTALLMENTS_ROUTER = installmentsRouter;
ISSUER_CHECKER = issuerChecker;

Expand Down Expand Up @@ -163,6 +166,16 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
);
}

function rollDebt(
uint256 repayMaturity,
uint256 borrowMaturity,
uint256 maxRepayAssets,
uint256 maxBorrowAssets,
uint256 percentage
) external {
DEBT_MANAGER.rollFixed(EXA_USDC, repayMaturity, borrowMaturity, maxRepayAssets, maxBorrowAssets, percentage);
}

function collectCredit(uint256 maturity, uint256 amount, uint256 timestamp, bytes calldata signature) external {
collectCredit(maturity, amount, type(uint256).max, timestamp, signature);
}
Expand Down Expand Up @@ -365,18 +378,19 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {

/// @inheritdoc BasePlugin
function pluginManifest() external pure override returns (PluginManifest memory manifest) {
manifest.executionFunctions = new bytes4[](11);
manifest.executionFunctions = new bytes4[](12);
manifest.executionFunctions[0] = this.propose.selector;
manifest.executionFunctions[1] = this.repay.selector;
manifest.executionFunctions[2] = this.crossRepay.selector;
manifest.executionFunctions[3] = bytes4(keccak256("collectCredit(uint256,uint256,uint256,bytes)"));
manifest.executionFunctions[4] = bytes4(keccak256("collectCredit(uint256,uint256,uint256,uint256,bytes)"));
manifest.executionFunctions[5] = this.collectDebit.selector;
manifest.executionFunctions[6] = this.collectInstallments.selector;
manifest.executionFunctions[7] = this.poke.selector;
manifest.executionFunctions[8] = this.pokeETH.selector;
manifest.executionFunctions[9] = this.withdraw.selector;
manifest.executionFunctions[10] = this.receiveFlashLoan.selector;
manifest.executionFunctions[3] = this.rollDebt.selector;
manifest.executionFunctions[4] = bytes4(keccak256("collectCredit(uint256,uint256,uint256,bytes)"));
manifest.executionFunctions[5] = bytes4(keccak256("collectCredit(uint256,uint256,uint256,uint256,bytes)"));
manifest.executionFunctions[6] = this.collectDebit.selector;
manifest.executionFunctions[7] = this.collectInstallments.selector;
manifest.executionFunctions[8] = this.poke.selector;
manifest.executionFunctions[9] = this.pokeETH.selector;
manifest.executionFunctions[10] = this.withdraw.selector;
manifest.executionFunctions[11] = this.receiveFlashLoan.selector;

ManifestFunction memory selfRuntimeValidationFunction = ManifestFunction({
functionType: ManifestAssociatedFunctionType.SELF,
Expand All @@ -393,7 +407,7 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
functionId: uint8(FunctionId.RUNTIME_VALIDATION_BALANCER),
dependencyIndex: 0
});
manifest.runtimeValidationFunctions = new ManifestAssociatedFunction[](11);
manifest.runtimeValidationFunctions = new ManifestAssociatedFunction[](12);
manifest.runtimeValidationFunctions[0] = ManifestAssociatedFunction({
executionSelector: IExaAccount.propose.selector,
associatedFunction: selfRuntimeValidationFunction
Expand All @@ -407,34 +421,38 @@ contract ExaPlugin is AccessControl, BasePlugin, IExaAccount {
associatedFunction: selfRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[3] = ManifestAssociatedFunction({
executionSelector: IExaAccount.rollDebt.selector,
associatedFunction: selfRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[4] = ManifestAssociatedFunction({
executionSelector: bytes4(bytes4(keccak256("collectCredit(uint256,uint256,uint256,bytes)"))),
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[4] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[5] = ManifestAssociatedFunction({
executionSelector: bytes4(bytes4(keccak256("collectCredit(uint256,uint256,uint256,uint256,bytes)"))),
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[5] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[6] = ManifestAssociatedFunction({
executionSelector: IExaAccount.collectDebit.selector,
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[6] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[7] = ManifestAssociatedFunction({
executionSelector: IExaAccount.collectInstallments.selector,
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[7] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[8] = ManifestAssociatedFunction({
executionSelector: IExaAccount.poke.selector,
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[8] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[9] = ManifestAssociatedFunction({
executionSelector: IExaAccount.pokeETH.selector,
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[9] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[10] = ManifestAssociatedFunction({
executionSelector: IExaAccount.withdraw.selector,
associatedFunction: keeperRuntimeValidationFunction
});
manifest.runtimeValidationFunctions[10] = ManifestAssociatedFunction({
manifest.runtimeValidationFunctions[11] = ManifestAssociatedFunction({
executionSelector: this.receiveFlashLoan.selector,
associatedFunction: balancerRuntimeValidationFunction
});
Expand Down Expand Up @@ -609,6 +627,17 @@ interface IBalancerVault {
function flashLoan(address recipient, IERC20[] memory tokens, uint256[] memory amounts, bytes memory data) external;
}

interface IDebtManager {
function rollFixed(
IMarket market,
uint256 repayMaturity,
uint256 borrowMaturity,
uint256 maxRepayAssets,
uint256 maxBorrowAssets,
uint256 percentage
) external;
}

interface IInstallmentsRouter {
function borrow(IMarket market, uint256 firstMaturity, uint256[] calldata amounts, uint256 maxRepay, address receiver)
external
Expand Down
7 changes: 7 additions & 0 deletions contracts/src/IExaAccount.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@ interface IExaAccount {
uint256 amountIn,
bytes calldata route
) external;
function rollDebt(
uint256 repayMaturity,
uint256 borrowMaturity,
uint256 maxRepayAssets,
uint256 maxBorrowAssets,
uint256 percentage
) external;
function collectCredit(uint256 maturity, uint256 amount, uint256 timestamp, bytes calldata signature) external;
function collectCredit(
uint256 maturity,
Expand Down
3 changes: 2 additions & 1 deletion contracts/test/ExaAccountFactory.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { OwnersLib } from "webauthn-owner-plugin/OwnersLib.sol";
import { WebauthnOwnerPlugin } from "webauthn-owner-plugin/WebauthnOwnerPlugin.sol";

import { ExaAccountFactory, ExaAccountInitialized } from "../src/ExaAccountFactory.sol";
import { ExaPlugin, IBalancerVault, IInstallmentsRouter } from "../src/ExaPlugin.sol";
import { ExaPlugin, IBalancerVault, IDebtManager, IInstallmentsRouter } from "../src/ExaPlugin.sol";
import { IAuditor, IMarket } from "../src/IExaAccount.sol";
import { IssuerChecker } from "../src/IssuerChecker.sol";
import { KeeperFeeModel } from "../src/KeeperFeeModel.sol";
Expand All @@ -38,6 +38,7 @@ contract ExaAccountFactoryTest is Test {
IMarket(address(new MockERC4626(new MockERC20()))),
IMarket(address(new MockERC4626(new MockERC20()))),
IBalancerVault(address(this)),
IDebtManager(address(this)),
IInstallmentsRouter(address(this)),
IssuerChecker(address(this)),
address(this),
Expand Down
Loading

0 comments on commit 2b568e0

Please sign in to comment.