Description:
Decentralized Finance (DeFi) protocol contract providing Mintable, Pausable, Swap, Liquidity, Factory functionality.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"src/adapters/CompoundV3AdapterFactory.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
// The implementation of this contract was inspired by Morpho Vault V2, developed by the Morpho Association in 2025.
pragma solidity 0.8.28;
import {CompoundV3Adapter} from "./CompoundV3Adapter.sol";
import {ICompoundV3AdapterFactory} from "./interfaces/ICompoundV3AdapterFactory.sol";
contract CompoundV3AdapterFactory is ICompoundV3AdapterFactory {
/* STORAGE */
mapping(address => mapping(address => mapping(address => address))) public compoundV3Adapter;
mapping(address => bool) public isCompoundV3Adapter;
/* FUNCTIONS */
/// @dev Returns the address of the deployed CompoundV3Adapter.
function createCompoundV3Adapter(address parentVault, address comet, address cometRewards)
external
returns (address)
{
address _compoundV3Adapter = address(new CompoundV3Adapter{salt: bytes32(0)}(parentVault, comet, cometRewards));
compoundV3Adapter[parentVault][comet][cometRewards] = _compoundV3Adapter;
isCompoundV3Adapter[_compoundV3Adapter] = true;
emit CreateCompoundV3Adapter(parentVault, comet, cometRewards, _compoundV3Adapter);
return _compoundV3Adapter;
}
}
"
},
"src/adapters/CompoundV3Adapter.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
// The implementation of this contract was inspired by Morpho Vault V2, developed by the Morpho Association in 2025.
pragma solidity 0.8.28;
import {CometInterface} from "../interfaces/CometInterface.sol";
import {CometRewardsInterface} from "../interfaces/CometRewardsInterface.sol";
import {IVaultV2} from "../interfaces/IVaultV2.sol";
import {IERC20} from "../interfaces/IERC20.sol";
import {ICompoundV3Adapter} from "./interfaces/ICompoundV3Adapter.sol";
import {SafeERC20Lib} from "../libraries/SafeERC20Lib.sol";
contract CompoundV3Adapter is ICompoundV3Adapter {
/* IMMUTABLES */
address public immutable factory;
address public immutable parentVault;
address public immutable asset;
address public immutable comet;
address public immutable cometRewards;
bytes32 public immutable adapterId;
/* STORAGE */
address public skimRecipient;
address public claimer;
/* FUNCTIONS */
constructor(address _parentVault, address _comet, address _cometRewards) {
factory = msg.sender;
parentVault = _parentVault;
comet = _comet;
cometRewards = _cometRewards;
adapterId = keccak256(abi.encode("this", address(this)));
asset = IVaultV2(_parentVault).asset();
SafeERC20Lib.safeApprove(asset, _comet, type(uint256).max);
SafeERC20Lib.safeApprove(asset, _parentVault, type(uint256).max);
}
function setClaimer(address newClaimer) external {
if (msg.sender != IVaultV2(parentVault).curator()) revert NotAuthorized();
claimer = newClaimer;
emit SetClaimer(newClaimer);
}
function setSkimRecipient(address newSkimRecipient) external {
if (msg.sender != IVaultV2(parentVault).owner()) revert NotAuthorized();
skimRecipient = newSkimRecipient;
emit SetSkimRecipient(newSkimRecipient);
}
/// @dev Skims the adapter's balance of `token` and sends it to `skimRecipient`.
/// @dev This is useful to handle rewards that the adapter has earned.
function skim(address token) external {
if (msg.sender != skimRecipient) revert NotAuthorized();
if (token == comet) revert CannotSkimCompoundToken();
uint256 balance = IERC20(token).balanceOf(address(this));
SafeERC20Lib.safeTransfer(token, skimRecipient, balance);
emit Skim(token, balance);
}
/// @dev Does not log anything because the ids (logged in the parent vault) are enough.
/// @dev Returns the ids of the allocation and the change in allocation.
function allocate(bytes memory data, uint256 assets, bytes4, address) external returns (bytes32[] memory, int256) {
if (data.length != 0) revert InvalidData();
if (msg.sender != parentVault) revert NotAuthorized();
if (assets > 0) CometInterface(comet).supply(asset, assets);
uint256 oldAllocation = allocation();
uint256 newAllocation = CometInterface(comet).balanceOf(address(this));
return (ids(), int256(newAllocation) - int256(oldAllocation));
}
/// @dev Does not log anything because the ids (logged in the parent vault) are enough.
/// @dev Returns the ids of the deallocation and the change in allocation.
function deallocate(bytes memory data, uint256 assets, bytes4, address)
external
returns (bytes32[] memory, int256)
{
if (data.length != 0) revert InvalidData();
if (msg.sender != parentVault) revert NotAuthorized();
if (assets > 0) CometInterface(comet).withdraw(asset, assets);
uint256 oldAllocation = allocation();
uint256 newAllocation = CometInterface(comet).balanceOf(address(this));
return (ids(), int256(newAllocation) - int256(oldAllocation));
}
/// @dev Claims COMP rewards accumulated by the adapter and swap it to parent vault's asset
/// @dev Only the claimer can call this function
/// @param data Encoded SwapParams struct containing swapper and swap data
function claim(bytes calldata data) external {
if (msg.sender != claimer) revert NotAuthorized();
// Decode the data
(address swapper, uint256 minAmountOut, bytes memory swapData) = abi.decode(data, (address, uint256, bytes));
// Verify the swapping data
if (swapper == comet || swapper == parentVault || swapper == cometRewards) revert SwapperCannotBeTiedContract();
if (minAmountOut == 0) revert InvalidData();
// Get assets
IERC20 rewardToken = IERC20(CometRewardsInterface(cometRewards).rewardConfig(comet).token);
IERC20 parentVaultAsset = IERC20(IVaultV2(parentVault).asset());
// Claim the rewards
uint256 balanceBefore = rewardToken.balanceOf(address(this));
CometRewardsInterface(cometRewards).claim(comet, address(this), true);
uint256 balanceAfter = rewardToken.balanceOf(address(this));
uint256 claimedAmount = balanceAfter - balanceBefore;
// Snapshot for sanity check
balanceBefore = parentVaultAsset.balanceOf(parentVault);
// Swap the rewards
SafeERC20Lib.safeApprove(address(rewardToken), swapper, balanceAfter);
(bool success,) = swapper.call(swapData);
require(success, SwapReverted());
SafeERC20Lib.safeApprove(address(rewardToken), swapper, 0);
uint256 swappedAmount = balanceAfter - rewardToken.balanceOf(address(this));
// Check if the parent vault received them
balanceAfter = parentVaultAsset.balanceOf(parentVault);
require(balanceAfter >= balanceBefore + minAmountOut, SlippageTooHigh());
emit ClaimRewards(address(rewardToken), claimedAmount);
emit SwapRewards(swapper, address(rewardToken), swappedAmount, swapData);
}
/// @dev Returns adapter's ids.
function ids() public view returns (bytes32[] memory) {
bytes32[] memory ids_ = new bytes32[](1);
ids_[0] = adapterId;
return ids_;
}
function allocation() public view returns (uint256) {
return IVaultV2(parentVault).allocation(adapterId);
}
function realAssets() external view returns (uint256) {
return allocation() != 0 ? CometInterface(comet).balanceOf(address(this)) : 0;
}
}
"
},
"src/adapters/interfaces/ICompoundV3AdapterFactory.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
// The implementation of this contract was inspired by Morpho Vault V2, developed by the Morpho Association in 2025.
pragma solidity >=0.5.0;
interface ICompoundV3AdapterFactory {
/* EVENTS */
event CreateCompoundV3Adapter(
address indexed parentVault, address indexed comet, address cometRewards, address indexed compoundV3Adapter
);
/* FUNCTIONS */
function compoundV3Adapter(address parentVault, address comet, address cometRewards)
external
view
returns (address);
function isCompoundV3Adapter(address account) external view returns (bool);
function createCompoundV3Adapter(address parentVault, address comet, address cometRewards)
external
returns (address compoundV3Adapter);
}
"
},
"src/interfaces/CometInterface.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
pragma solidity >=0.5.0;
import "./CometMainInterface.sol";
import "./CometExtInterface.sol";
/**
* @title Compound's Comet Interface
* @notice An efficient monolithic money market protocol
* @author Compound
*/
abstract contract CometInterface is CometMainInterface, CometExtInterface {
struct UserBasic {
int104 principal;
uint64 baseTrackingIndex;
uint64 baseTrackingAccrued;
uint16 assetsIn;
uint8 _reserved;
}
function userBasic(address account) external view virtual returns (UserBasic memory);
struct TotalsCollateral {
uint128 totalSupplyAsset;
uint128 _reserved;
}
function totalsCollateral(address) external virtual returns (TotalsCollateral memory);
}
"
},
"src/interfaces/CometRewardsInterface.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
pragma solidity >=0.5.0;
/**
* @title Compound's Comet Rewards Interface
* @notice A contract to claim Compound rewards / incentives
*/
interface CometRewardsInterface {
struct RewardConfig {
address token;
uint64 rescaleFactor;
bool shouldUpscale;
}
struct RewardOwed {
address token;
uint256 owed;
}
function rewardConfig(address) external view returns (RewardConfig memory);
function getRewardOwed(address comet, address account) external returns (RewardOwed memory);
function rewardsClaimed(address comet, address account) external view returns (uint256);
function claim(address comet, address src, bool shouldAccrue) external;
function claimTo(address comet, address src, address to, bool shouldAccrue) external;
}
"
},
"src/interfaces/IVaultV2.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;
import {IERC20} from "./IERC20.sol";
import {IERC4626} from "./IERC4626.sol";
import {IERC2612} from "./IERC2612.sol";
struct Caps {
uint256 allocation;
uint128 absoluteCap;
uint128 relativeCap;
}
interface IVaultV2 is IERC4626, IERC2612 {
// State variables
function virtualShares() external view returns (uint256);
function owner() external view returns (address);
function curator() external view returns (address);
function receiveSharesGate() external view returns (address);
function sendSharesGate() external view returns (address);
function receiveAssetsGate() external view returns (address);
function sendAssetsGate() external view returns (address);
function adapterRegistry() external view returns (address);
function isSentinel(address account) external view returns (bool);
function isAllocator(address account) external view returns (bool);
function firstTotalAssets() external view returns (uint256);
function _totalAssets() external view returns (uint128);
function lastUpdate() external view returns (uint64);
function maxRate() external view returns (uint64);
function adapters(uint256 index) external view returns (address);
function adaptersLength() external view returns (uint256);
function isAdapter(address account) external view returns (bool);
function allocation(bytes32 id) external view returns (uint256);
function absoluteCap(bytes32 id) external view returns (uint256);
function relativeCap(bytes32 id) external view returns (uint256);
function forceDeallocatePenalty(address adapter) external view returns (uint256);
function liquidityAdapter() external view returns (address);
function liquidityData() external view returns (bytes memory);
function timelock(bytes4 selector) external view returns (uint256);
function abdicated(bytes4 selector) external view returns (bool);
function executableAt(bytes memory data) external view returns (uint256);
function performanceFee() external view returns (uint96);
function performanceFeeRecipient() external view returns (address);
function managementFee() external view returns (uint96);
function managementFeeRecipient() external view returns (address);
// Gating
function canSendShares(address account) external view returns (bool);
function canReceiveShares(address account) external view returns (bool);
function canSendAssets(address account) external view returns (bool);
function canReceiveAssets(address account) external view returns (bool);
// Multicall
function multicall(bytes[] memory data) external;
// Owner functions
function setOwner(address newOwner) external;
function setCurator(address newCurator) external;
function setIsSentinel(address account, bool isSentinel) external;
function setName(string memory newName) external;
function setSymbol(string memory newSymbol) external;
// Timelocks for curator functions
function submit(bytes memory data) external;
function revoke(bytes memory data) external;
// Curator functions
function setIsAllocator(address account, bool newIsAllocator) external;
function setReceiveSharesGate(address newReceiveSharesGate) external;
function setSendSharesGate(address newSendSharesGate) external;
function setReceiveAssetsGate(address newReceiveAssetsGate) external;
function setSendAssetsGate(address newSendAssetsGate) external;
function setAdapterRegistry(address newAdapterRegistry) external;
function addAdapter(address account) external;
function removeAdapter(address account) external;
function increaseTimelock(bytes4 selector, uint256 newDuration) external;
function decreaseTimelock(bytes4 selector, uint256 newDuration) external;
function abdicate(bytes4 selector) external;
function setPerformanceFee(uint256 newPerformanceFee) external;
function setManagementFee(uint256 newManagementFee) external;
function setPerformanceFeeRecipient(address newPerformanceFeeRecipient) external;
function setManagementFeeRecipient(address newManagementFeeRecipient) external;
function increaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;
function decreaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;
function increaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;
function decreaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;
function setMaxRate(uint256 newMaxRate) external;
function setForceDeallocatePenalty(address adapter, uint256 newForceDeallocatePenalty) external;
// Allocator functions
function allocate(address adapter, bytes memory data, uint256 assets) external;
function deallocate(address adapter, bytes memory data, uint256 assets) external;
function setLiquidityAdapterAndData(address newLiquidityAdapter, bytes memory newLiquidityData) external;
// Exchange rate
function accrueInterest() external;
function accrueInterestView()
external
view
returns (uint256 newTotalAssets, uint256 performanceFeeShares, uint256 managementFeeShares);
// Force deallocate
function forceDeallocate(address adapter, bytes memory data, uint256 assets, address onBehalf)
external
returns (uint256 penaltyShares);
}
"
},
"src/interfaces/IERC20.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;
interface IERC20 {
function decimals() external view returns (uint8);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 shares) external returns (bool success);
function transferFrom(address from, address to, uint256 shares) external returns (bool success);
function approve(address spender, uint256 shares) external returns (bool success);
function allowance(address owner, address spender) external view returns (uint256);
}
"
},
"src/adapters/interfaces/ICompoundV3Adapter.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
// The implementation of this contract was inspired by Morpho Vault V2, developed by the Morpho Association in 2025.
pragma solidity >= 0.5.0;
import {IAdapter} from "../../interfaces/IAdapter.sol";
interface ICompoundV3Adapter is IAdapter {
/* EVENTS */
event SetClaimer(address indexed newClaimer);
event ClaimRewards(address indexed token, uint256 amount);
event SetSkimRecipient(address indexed newSkimRecipient);
event Skim(address indexed token, uint256 assets);
event SwapRewards(address indexed swapper, address indexed token, uint256 amount, bytes data);
/* ERRORS */
error InvalidData();
error NotAuthorized();
error CannotSkimCompoundToken();
error SwapReverted();
error SwapperCannotBeTiedContract();
error SlippageTooHigh();
/* FUNCTIONS */
function factory() external view returns (address);
function parentVault() external view returns (address);
function asset() external view returns (address);
function comet() external view returns (address);
function cometRewards() external view returns (address);
function adapterId() external view returns (bytes32);
function claimer() external view returns (address);
function skimRecipient() external view returns (address);
function allocation() external view returns (uint256);
function ids() external view returns (bytes32[] memory);
function setClaimer(address newClaimer) external;
function claim(bytes memory data) external;
function setSkimRecipient(address newSkimRecipient) external;
function skim(address token) external;
}
"
},
"src/libraries/SafeERC20Lib.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity ^0.8.0;
import {IERC20} from "../interfaces/IERC20.sol";
import {ErrorsLib} from "./ErrorsLib.sol";
library SafeERC20Lib {
function safeTransfer(address token, address to, uint256 value) internal {
require(token.code.length > 0, ErrorsLib.NoCode());
(bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transfer, (to, value)));
require(success, ErrorsLib.TransferReverted());
require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferReturnedFalse());
}
function safeTransferFrom(address token, address from, address to, uint256 value) internal {
require(token.code.length > 0, ErrorsLib.NoCode());
(bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transferFrom, (from, to, value)));
require(success, ErrorsLib.TransferFromReverted());
require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferFromReturnedFalse());
}
function safeApprove(address token, address spender, uint256 value) internal {
require(token.code.length > 0, ErrorsLib.NoCode());
(bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.approve, (spender, value)));
require(success, ErrorsLib.ApproveReverted());
require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.ApproveReturnedFalse());
}
}
"
},
"src/interfaces/CometMainInterface.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
pragma solidity >=0.5.0;
struct AssetInfo {
uint8 offset;
address asset;
address priceFeed;
uint64 scale;
uint64 borrowCollateralFactor;
uint64 liquidateCollateralFactor;
uint64 liquidationFactor;
uint128 supplyCap;
}
/**
* @title Compound's Comet Main Interface (without Ext)
* @notice An efficient monolithic money market protocol
* @author Compound
*/
abstract contract CometMainInterface {
error Absurd();
error AlreadyInitialized();
error BadAsset();
error BadDecimals();
error BadDiscount();
error BadMinimum();
error BadPrice();
error BorrowTooSmall();
error BorrowCFTooLarge();
error InsufficientReserves();
error LiquidateCFTooLarge();
error NoSelfTransfer();
error NotCollateralized();
error NotForSale();
error NotLiquidatable();
error Paused();
error SupplyCapExceeded();
error TimestampTooLarge();
error TooManyAssets();
error TooMuchSlippage();
error TransferInFailed();
error TransferOutFailed();
error Unauthorized();
event Supply(address indexed from, address indexed dst, uint256 amount);
event Transfer(address indexed from, address indexed to, uint256 amount);
event Withdraw(address indexed src, address indexed to, uint256 amount);
event SupplyCollateral(address indexed from, address indexed dst, address indexed asset, uint256 amount);
event TransferCollateral(address indexed from, address indexed to, address indexed asset, uint256 amount);
event WithdrawCollateral(address indexed src, address indexed to, address indexed asset, uint256 amount);
/// @notice Event emitted when a borrow position is absorbed by the protocol
event AbsorbDebt(address indexed absorber, address indexed borrower, uint256 basePaidOut, uint256 usdValue);
/// @notice Event emitted when a user's collateral is absorbed by the protocol
event AbsorbCollateral(
address indexed absorber,
address indexed borrower,
address indexed asset,
uint256 collateralAbsorbed,
uint256 usdValue
);
/// @notice Event emitted when a collateral asset is purchased from the protocol
event BuyCollateral(address indexed buyer, address indexed asset, uint256 baseAmount, uint256 collateralAmount);
/// @notice Event emitted when an action is paused/unpaused
event PauseAction(bool supplyPaused, bool transferPaused, bool withdrawPaused, bool absorbPaused, bool buyPaused);
/// @notice Event emitted when reserves are withdrawn by the governor
event WithdrawReserves(address indexed to, uint256 amount);
function supply(address asset, uint256 amount) external virtual;
function supplyTo(address dst, address asset, uint256 amount) external virtual;
function supplyFrom(address from, address dst, address asset, uint256 amount) external virtual;
function transfer(address dst, uint256 amount) external virtual returns (bool);
function transferFrom(address src, address dst, uint256 amount) external virtual returns (bool);
function transferAsset(address dst, address asset, uint256 amount) external virtual;
function transferAssetFrom(address src, address dst, address asset, uint256 amount) external virtual;
function withdraw(address asset, uint256 amount) external virtual;
function withdrawTo(address to, address asset, uint256 amount) external virtual;
function withdrawFrom(address src, address to, address asset, uint256 amount) external virtual;
function approveThis(address manager, address asset, uint256 amount) external virtual;
function withdrawReserves(address to, uint256 amount) external virtual;
function absorb(address absorber, address[] calldata accounts) external virtual;
function buyCollateral(address asset, uint256 minAmount, uint256 baseAmount, address recipient) external virtual;
function quoteCollateral(address asset, uint256 baseAmount) public view virtual returns (uint256);
function getAssetInfo(uint8 i) public view virtual returns (AssetInfo memory);
function getAssetInfoByAddress(address asset) public view virtual returns (AssetInfo memory);
function getReserves() public view virtual returns (int256);
function getPrice(address priceFeed) public view virtual returns (uint256);
function isBorrowCollateralized(address account) public view virtual returns (bool);
function isLiquidatable(address account) public view virtual returns (bool);
function totalSupply() external view virtual returns (uint256);
function totalBorrow() external view virtual returns (uint256);
function balanceOf(address owner) public view virtual returns (uint256);
function borrowBalanceOf(address account) public view virtual returns (uint256);
function pause(bool supplyPaused, bool transferPaused, bool withdrawPaused, bool absorbPaused, bool buyPaused)
external
virtual;
function isSupplyPaused() public view virtual returns (bool);
function isTransferPaused() public view virtual returns (bool);
function isWithdrawPaused() public view virtual returns (bool);
function isAbsorbPaused() public view virtual returns (bool);
function isBuyPaused() public view virtual returns (bool);
function accrueAccount(address account) external virtual;
function getSupplyRate(uint256 utilization) public view virtual returns (uint64);
function getBorrowRate(uint256 utilization) public view virtual returns (uint64);
function getUtilization() public view virtual returns (uint256);
function governor() external view virtual returns (address);
function pauseGuardian() external view virtual returns (address);
function baseToken() external view virtual returns (address);
function baseTokenPriceFeed() external view virtual returns (address);
function extensionDelegate() external view virtual returns (address);
/// @dev uint64
function supplyKink() external view virtual returns (uint256);
/// @dev uint64
function supplyPerSecondInterestRateSlopeLow() external view virtual returns (uint256);
/// @dev uint64
function supplyPerSecondInterestRateSlopeHigh() external view virtual returns (uint256);
/// @dev uint64
function supplyPerSecondInterestRateBase() external view virtual returns (uint256);
/// @dev uint64
function borrowKink() external view virtual returns (uint256);
/// @dev uint64
function borrowPerSecondInterestRateSlopeLow() external view virtual returns (uint256);
/// @dev uint64
function borrowPerSecondInterestRateSlopeHigh() external view virtual returns (uint256);
/// @dev uint64
function borrowPerSecondInterestRateBase() external view virtual returns (uint256);
/// @dev uint64
function storeFrontPriceFactor() external view virtual returns (uint256);
/// @dev uint64
function baseScale() external view virtual returns (uint256);
/// @dev uint64
function trackingIndexScale() external view virtual returns (uint256);
/// @dev uint64
function baseTrackingSupplySpeed() external view virtual returns (uint256);
/// @dev uint64
function baseTrackingBorrowSpeed() external view virtual returns (uint256);
/// @dev uint104
function baseMinForRewards() external view virtual returns (uint256);
/// @dev uint104
function baseBorrowMin() external view virtual returns (uint256);
/// @dev uint104
function targetReserves() external view virtual returns (uint256);
function numAssets() external view virtual returns (uint8);
function decimals() external view virtual returns (uint8);
function initializeStorage() external virtual;
}
"
},
"src/interfaces/CometExtInterface.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 [Byzantine Finance]
pragma solidity >=0.5.0;
struct TotalsBasic {
uint64 baseSupplyIndex;
uint64 baseBorrowIndex;
uint64 trackingSupplyIndex;
uint64 trackingBorrowIndex;
uint104 totalSupplyBase;
uint104 totalBorrowBase;
uint40 lastAccrualTime;
uint8 pauseFlags;
}
/**
* @title Compound's Comet Ext Interface
* @notice An efficient monolithic money market protocol
* @author Compound
*/
abstract contract CometExtInterface {
error BadAmount();
error BadNonce();
error BadSignatory();
error InvalidValueS();
error InvalidValueV();
error SignatureExpired();
function allow(address manager, bool isAllowed) external virtual;
function allowBySig(
address owner,
address manager,
bool isAllowed,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external virtual;
function collateralBalanceOf(address account, address asset) external view virtual returns (uint128);
function baseTrackingAccrued(address account) external view virtual returns (uint64);
function baseAccrualScale() external view virtual returns (uint64);
function baseIndexScale() external view virtual returns (uint64);
function factorScale() external view virtual returns (uint64);
function priceScale() external view virtual returns (uint64);
function maxAssets() external view virtual returns (uint8);
function totalsBasic() external view virtual returns (TotalsBasic memory);
function version() external view virtual returns (string memory);
/**
* ===== ERC20 interfaces =====
* Does not include the following functions/events, which are defined in `CometMainInterface` instead:
* - function decimals() virtual external view returns (uint8)
* - function totalSupply() virtual external view returns (uint256)
* - function transfer(address dst, uint amount) virtual external returns (bool)
* - function transferFrom(address src, address dst, uint amount) virtual external returns (bool)
* - function balanceOf(address owner) virtual external view returns (uint256)
* - event Transfer(address indexed from, address indexed to, uint256 amount)
*/
function name() external view virtual returns (string memory);
function symbol() external view virtual returns (string memory);
/**
* @notice Approve `spender` to transfer up to `amount` from `src`
* @dev This will overwrite the approval amount for `spender`
* and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
* @param spender The address of the account which may transfer tokens
* @param amount The number of tokens that are approved (-1 means infinite)
* @return Whether or not the approval succeeded
*/
function approve(address spender, uint256 amount) external virtual returns (bool);
/**
* @notice Get the current allowance from `owner` for `spender`
* @param owner The address of the account which owns the tokens to be spent
* @param spender The address of the account which may transfer tokens
* @return The number of tokens allowed to be spent (-1 means infinite)
*/
function allowance(address owner, address spender) external view virtual returns (uint256);
event Approval(address indexed owner, address indexed spender, uint256 amount);
}
"
},
"src/interfaces/IERC4626.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;
import {IERC20} from "./IERC20.sol";
interface IERC4626 is IERC20 {
function asset() external view returns (address);
function totalAssets() external view returns (uint256);
function convertToAssets(uint256 shares) external view returns (uint256 assets);
function convertToShares(uint256 assets) external view returns (uint256 shares);
function deposit(uint256 assets, address onBehalf) external returns (uint256 shares);
function mint(uint256 shares, address onBehalf) external returns (uint256 assets);
function withdraw(uint256 assets, address onBehalf, address receiver) external returns (uint256 shares);
function redeem(uint256 shares, address onBehalf, address receiver) external returns (uint256 assets);
function previewDeposit(uint256 assets) external view returns (uint256 shares);
function previewMint(uint256 shares) external view returns (uint256 assets);
function previewWithdraw(uint256 assets) external view returns (uint256 shares);
function previewRedeem(uint256 shares) external view returns (uint256 assets);
function maxDeposit(address onBehalf) external view returns (uint256 assets);
function maxMint(address onBehalf) external view returns (uint256 shares);
function maxWithdraw(address onBehalf) external view returns (uint256 assets);
function maxRedeem(address onBehalf) external view returns (uint256 shares);
}
"
},
"src/interfaces/IERC2612.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;
interface IERC2612 {
function permit(address owner, address spender, uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
"
},
"src/interfaces/IAdapter.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;
/// @dev See VaultV2 NatSpec comments for more details on adapter's spec.
interface IAdapter {
/// @dev Returns the market' ids and the change in assets on this market.
function allocate(bytes memory data, uint256 assets, bytes4 selector, address sender)
external
returns (bytes32[] memory ids, int256 change);
/// @dev Returns the market' ids and the change in assets on this market.
function deallocate(bytes memory data, uint256 assets, bytes4 selector, address sender)
external
returns (bytes32[] memory ids, int256 change);
/// @dev Returns the current value of the investments of the adapter (in underlying asset).
function realAssets() external view returns (uint256 assets);
}
"
},
"src/libraries/ErrorsLib.sol": {
"content": "// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity ^0.8.0;
library ErrorsLib {
error Abdicated();
error AbsoluteCapExceeded();
error AbsoluteCapNotDecreasing();
error AbsoluteCapNotIncreasing();
error ApproveReturnedFalse();
error ApproveReverted();
error CannotReceiveShares();
error CannotReceiveAssets();
error CannotSendShares();
error CannotSendAssets();
error CapExceeded();
error CastOverflow();
error DataAlreadyPending();
error DataNotTimelocked();
error FeeInvariantBroken();
error FeeTooHigh();
error InvalidSigner();
error MaxRateTooHigh();
error NoCode();
error NotAdapter();
error NotInAdapterRegistry();
error PenaltyTooHigh();
error PermitDeadlineExpired();
error RelativeCapAboveOne();
error RelativeCapExceeded();
error RelativeCapNotDecreasing();
error RelativeCapNotIncreasing();
error AutomaticallyTimelocked();
error TimelockNotDecreasing();
error TimelockNotExpired();
error TimelockNotIncreasing();
error TransferFromReturnedFalse();
error TransferFromReverted();
error TransferReturnedFalse();
error TransferReverted();
error Unauthorized();
error ZeroAbsoluteCap();
error ZeroAddress();
error ZeroAllocation();
}
"
}
},
"settings": {
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"ds-test/=lib/morpho-blue/lib/forge-std/lib/ds-test/src/",
"erc4626-tests/=lib/metamorpho/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/morpho-blue/lib/halmos-cheatcodes/src/",
"metamorpho-v1.1/=lib/metamorpho-v1.1/",
"metamorpho/=lib/metamorpho/",
"morpho-blue-irm/=lib/metamorpho/lib/morpho-blue-irm/src/",
"morpho-blue/=lib/morpho-blue/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"solmate/=lib/metamorpho/lib/morpho-blue-irm/lib/solmate/src/"
],
"optimizer": {
"enabled": true,
"runs": 100000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true
}
}}
Submitted on: 2025-10-08 11:56:03
Comments
Log in to comment.
No comments yet.