Documentation Index
Fetch the complete documentation index at: https://docs.monolith.market/llms.txt
Use this file to discover all available pages before exploring further.
The Factory contract is responsible for deploying all components of a Monolith instance and managing the global fee.
Contract implementation
Constructor
constructor(address _operator, uint256 _minDebtFloor)
Deploys the Factory and a shared InterestModel (accessible via interestModel()). Sets the initial operator and the global minDebtFloor that applies to every instance’s minDebt parameter.
User-Facing Functions
deploy
function deploy(DeployParams memory params) external returns (address lender, address coin, address vault)
Deploys a complete Monolith lending system consisting of a lender, stablecoin, and vault contracts.
Parameters:
params: DeployParams struct containing deployment configuration
DeployParams Structure:
struct DeployParams {
string name; // Token name (e.g., "USD Coin")
string symbol; // Token symbol (e.g., "USDC")
address collateral; // Collateral token address
address psmAsset; // PSM asset token address (address(0) disables PSM)
address psmVault; // PSM ERC4626 vault (address(0) if unused)
address feed; // Chainlink-style price feed address
uint256 collateralFactor; // Max LTV numerator in bps (≤8500 = 85%)
uint256 minDebt; // Minimum debt per position (≥ factory.minDebtFloor())
uint256 timeUntilImmutability; // Seconds until operator params lock (max 1460 days)
address operator; // Instance operator (address(0) for none)
address manager; // Instance manager (address(0) for none)
uint64 halfLife; // Interest rate half-life (12 hours to 30 days)
uint16 targetFreeDebtRatioStartBps; // Target free-debt ratio lower bound (≥500, ≤ end)
uint16 targetFreeDebtRatioEndBps; // Target free-debt ratio upper bound (≤9500)
uint16 redeemFeeBps; // Redemption fee (≤500 = 5%)
uint32 stalenessThreshold; // Oracle max staleness in seconds
uint16 maxBorrowDeltaBps; // Share-accounting rounding tolerance (50–200)
uint128 psmVaultMinTotalSupply; // PSM vault minimum supply (required if psmVault set)
}
Returns:
lender: Address of the deployed Lender contract
coin: Address of the deployed Coin (ERC‑20) contract
vault: Address of the deployed Vault (ERC‑4626) contract
Requirements:
- All bounds listed above are enforced by
Lender’s constructor and revert on violation.
params.collateral decimals must be ≤ 30.
params.psmAsset must differ from the deployed coin.
- If
params.psmVault is set, its underlying asset() must equal params.psmAsset and psmVaultMinTotalSupply must be > 0.
Deployment Process:
- Calculates deterministic addresses using CREATE3
- Deploys contracts in order: Lender → Coin → Vault
- Initializes contracts with proper cross-references
- Records deployment in factory registry
Events Emitted:
Deployed(lender, coin, vault)
deploymentsLength
function deploymentsLength() external view returns (uint256)
Returns the total number of deployments created by this factory.
Returns:
uint256: Number of deployments
deployments
function deployments(uint256 index) external view returns (address lender)
Array accessor returning the Lender address at a given deployment index. Use together with deploymentsLength() to enumerate all instances.
interestModel
function interestModel() external view returns (address)
Returns the address of the shared InterestModel deployed by this Factory’s constructor. All Lenders deployed by this Factory use this same InterestModel instance.
minDebtFloor
function minDebtFloor() external view returns (uint256)
Returns the global immutable minimum debt floor. Every Lender’s minDebt must be ≥ this value at deployment.
pendingOperator
function pendingOperator() external view returns (address)
Returns the address currently queued to accept the operator role via acceptOperator().
operator
function operator() external view returns (address)
Returns the current operator address authorized to manage the factory.
Returns:
address: Current operator address
feeRecipient
function feeRecipient() external view returns (address)
Returns the address that receives protocol fees.
Returns:
address: Fee recipient address
feeBps
function feeBps() external view returns (uint256)
Returns the default fee rate in basis points (bps).
Returns:
uint256: Default fee in bps (e.g., 100 = 1%)
getFeeOf
function getFeeOf(address _lender) external view returns (uint256)
Returns the fee rate for a specific lender deployment, using custom fee if set, otherwise default fee.
Parameters:
_lender: Address of the lender deployment
Returns:
isDeployed
function isDeployed(address deployment) external view returns (bool)
Checks if an address was deployed by this factory.
Parameters:
deployment: Address to check
Returns:
bool: True if address was deployed by this factory
customFeeBps
function customFeeBps(address lender) external view returns (uint256)
Returns the custom fee rate for a specific lender deployment.
Parameters:
lender: Address of the lender deployment
Returns:
uint256: Custom fee in bps, 0 if using default fee
Operator Functions
setPendingOperator
function setPendingOperator(address _pendingOperator) external
Sets a new pending operator address. Can only be called by current operator.
Parameters:
_pendingOperator: Address to set as pending operator
Requirements:
msg.sender must be current operator
acceptOperator
function acceptOperator() external
Accepts operator role for the pending operator address.
Requirements:
msg.sender must be pending operator
setFeeRecipient
function setFeeRecipient(address _feeRecipient) external
Sets the address that receives protocol fees.
Parameters:
_feeRecipient: New fee recipient address
Requirements:
msg.sender must be current operator
setFeeBps
function setFeeBps(uint256 _feeBps) external
Sets the default fee rate in basis points.
Parameters:
_feeBps: New fee rate in bps (max 1000 = 10%)
Requirements:
msg.sender must be current operator
_feeBps must be ≤ 1000
setCustomFeeBps
function setCustomFeeBps(address _address, uint256 _feeBps) external
Sets a custom fee rate for a specific lender deployment.
Parameters:
_address: Lender deployment address
_feeBps: Custom fee rate in bps (max 1000 = 10%)
Requirements:
msg.sender must be current operator
_feeBps must be ≤ 1000
pullReserves
function pullReserves(address _deployment) external
Pulls accumulated reserves from a lender deployment to the fee recipient.
Parameters:
_deployment: Lender deployment address
Requirements:
msg.sender must be fee recipient
_deployment must be a valid deployment
Events
Deployed(address indexed lender, address indexed coin, address indexed vault) — emitted by deploy() with the new instance addresses.
CustomFeeBpsSet(address indexed lender, uint256 feeBps) — emitted by setCustomFeeBps().
FeeBpsUpdated(uint256 feeBps) — emitted by setFeeBps().
FeeRecipientUpdated(address indexed feeRecipient) — emitted by setFeeRecipient().
PendingOperatorUpdated(address indexed pendingOperator) — emitted by setPendingOperator().
OperatorUpdated(address indexed operator) — emitted by acceptOperator().
ReservesPulled(address indexed lender, address indexed recipient, uint256 amount) — emitted by pullReserves().