Description:
Multi-signature wallet contract requiring multiple confirmations for transaction execution.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"src/AddressesRegistry.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
import "./Dependencies/Ownable.sol";
import {MIN_LIQUIDATION_PENALTY_SP, MAX_LIQUIDATION_PENALTY_REDISTRIBUTION} from "./Dependencies/Constants.sol";
import "./Interfaces/IAddressesRegistry.sol";
import "./Interfaces/IEbisuBranchManager.sol";
contract AddressesRegistry is Ownable, IAddressesRegistry {
IERC20Metadata public collToken;
IBorrowerOperations public borrowerOperations;
ITroveManager public troveManager;
ITroveNFT public troveNFT;
IMetadataNFT public metadataNFT;
IStabilityPool public stabilityPool;
IPriceFeed public priceFeed;
IActivePool public activePool;
IDefaultPool public defaultPool;
address public gasPoolAddress;
ICollSurplusPool public collSurplusPool;
ISortedTroves public sortedTroves;
IInterestRouter public interestRouter;
IHintHelpers public hintHelpers;
IMultiTroveGetter public multiTroveGetter;
ICollateralRegistry public collateralRegistry;
IBoldToken public boldToken;
IWETH public WETH;
address public borrowerOperationsHelper;
IEbisuBranchManager public branchManager;
// Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, some borrowing operation restrictions are applied
uint256 public immutable CCR;
// Shutdown system collateral ratio. If the system's total collateral ratio (TCR) for a given collateral falls below the SCR,
// the protocol triggers the shutdown of the borrow market and permanently disables all borrowing operations except for closing Troves.
uint256 public immutable SCR;
// Minimum collateral ratio for individual troves
uint256 public immutable MCR;
// Extra buffer of collateral ratio to join a batch or adjust a trove inside a batch (on top of MCR)
uint256 public immutable BCR;
// Liquidation penalty for troves offset to the SP
uint256 public immutable LIQUIDATION_PENALTY_SP;
// Liquidation penalty for troves redistributed
uint256 public immutable LIQUIDATION_PENALTY_REDISTRIBUTION;
// Maximum gas compensation for collateral operations per branch
uint256 public immutable branchCollGasCompensationCap;
error InvalidCCR();
error InvalidMCR();
error InvalidBCR();
error InvalidSCR();
error SPPenaltyTooLow();
error SPPenaltyGtRedist();
error RedistPenaltyTooHigh();
error InvalidGasCompensationCap();
event CollTokenAddressChanged(address _collTokenAddress);
event BorrowerOperationsAddressChanged(address _borrowerOperationsAddress);
event TroveManagerAddressChanged(address _troveManagerAddress);
event TroveNFTAddressChanged(address _troveNFTAddress);
event MetadataNFTAddressChanged(address _metadataNFTAddress);
event StabilityPoolAddressChanged(address _stabilityPoolAddress);
event PriceFeedAddressChanged(address _priceFeedAddress);
event ActivePoolAddressChanged(address _activePoolAddress);
event DefaultPoolAddressChanged(address _defaultPoolAddress);
event GasPoolAddressChanged(address _gasPoolAddress);
event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress);
event SortedTrovesAddressChanged(address _sortedTrovesAddress);
event InterestRouterAddressChanged(address _interestRouterAddress);
event HintHelpersAddressChanged(address _hintHelpersAddress);
event MultiTroveGetterAddressChanged(address _multiTroveGetterAddress);
event CollateralRegistryAddressChanged(address _collateralRegistryAddress);
event BoldTokenAddressChanged(address _boldTokenAddress);
event WETHAddressChanged(address _wethAddress);
constructor(
address _owner,
uint256 _ccr,
uint256 _mcr,
uint256 _bcr,
uint256 _scr,
uint256 _liquidationPenaltySP,
uint256 _liquidationPenaltyRedistribution,
uint256 _branchCollGasCompensationCap
) Ownable(_owner) {
if (_ccr <= 1e18 || _ccr >= 2e18) revert InvalidCCR();
if (_mcr <= 1e18 || _mcr >= 2e18) revert InvalidMCR();
if (_bcr < 5e16 || _bcr >= 50e16) revert InvalidBCR();
if (_scr <= 1e18 || _scr >= 2e18) revert InvalidSCR();
if (_liquidationPenaltySP < MIN_LIQUIDATION_PENALTY_SP) revert SPPenaltyTooLow();
if (_liquidationPenaltySP > _liquidationPenaltyRedistribution) revert SPPenaltyGtRedist();
if (_liquidationPenaltyRedistribution > MAX_LIQUIDATION_PENALTY_REDISTRIBUTION) revert RedistPenaltyTooHigh();
if (_branchCollGasCompensationCap == 0) revert InvalidGasCompensationCap();
CCR = _ccr;
SCR = _scr;
MCR = _mcr;
BCR = _bcr;
LIQUIDATION_PENALTY_SP = _liquidationPenaltySP;
LIQUIDATION_PENALTY_REDISTRIBUTION = _liquidationPenaltyRedistribution;
branchCollGasCompensationCap = _branchCollGasCompensationCap;
}
function setAddresses(AddressVars memory _vars) external onlyOwner {
collToken = _vars.collToken;
borrowerOperations = _vars.borrowerOperations;
troveManager = _vars.troveManager;
troveNFT = _vars.troveNFT;
metadataNFT = _vars.metadataNFT;
stabilityPool = _vars.stabilityPool;
priceFeed = _vars.priceFeed;
activePool = _vars.activePool;
defaultPool = _vars.defaultPool;
gasPoolAddress = _vars.gasPoolAddress;
collSurplusPool = _vars.collSurplusPool;
sortedTroves = _vars.sortedTroves;
interestRouter = _vars.interestRouter;
hintHelpers = _vars.hintHelpers;
multiTroveGetter = _vars.multiTroveGetter;
collateralRegistry = _vars.collateralRegistry;
boldToken = _vars.boldToken;
WETH = _vars.WETH;
borrowerOperationsHelper = _vars.borrowerOperationsHelper;
branchManager = _vars.branchManager;
emit CollTokenAddressChanged(address(_vars.collToken));
emit BorrowerOperationsAddressChanged(address(_vars.borrowerOperations));
emit TroveManagerAddressChanged(address(_vars.troveManager));
emit TroveNFTAddressChanged(address(_vars.troveNFT));
emit MetadataNFTAddressChanged(address(_vars.metadataNFT));
emit StabilityPoolAddressChanged(address(_vars.stabilityPool));
emit PriceFeedAddressChanged(address(_vars.priceFeed));
emit ActivePoolAddressChanged(address(_vars.activePool));
emit DefaultPoolAddressChanged(address(_vars.defaultPool));
emit GasPoolAddressChanged(_vars.gasPoolAddress);
emit CollSurplusPoolAddressChanged(address(_vars.collSurplusPool));
emit SortedTrovesAddressChanged(address(_vars.sortedTroves));
emit InterestRouterAddressChanged(address(_vars.interestRouter));
emit HintHelpersAddressChanged(address(_vars.hintHelpers));
emit MultiTroveGetterAddressChanged(address(_vars.multiTroveGetter));
emit CollateralRegistryAddressChanged(address(_vars.collateralRegistry));
emit BoldTokenAddressChanged(address(_vars.boldToken));
emit WETHAddressChanged(address(_vars.WETH));
_renounceOwnership();
}
}
"
},
"src/Dependencies/Ownable.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
/**
* Based on OpenZeppelin's Ownable contract:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
*
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting `initialOwner` as the initial owner.
*/
constructor(address initialOwner) {
_owner = initialOwner;
emit OwnershipTransferred(address(0), initialOwner);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Returns true if the caller is the current owner.
*/
function isOwner() public view returns (bool) {
return msg.sender == _owner;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*
* NOTE: This function is not safe, as it doesn’t check owner is calling it.
* Make sure you check it before calling it.
*/
function _renounceOwnership() internal {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
}
"
},
"src/Dependencies/Constants.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
address constant ZERO_ADDRESS = address(0);
uint256 constant MAX_UINT256 = type(uint256).max;
uint256 constant DECIMAL_PRECISION = 1e18;
uint256 constant _100pct = DECIMAL_PRECISION;
uint256 constant _1pct = DECIMAL_PRECISION / 100;
// Amount of ETH to be locked in gas pool on opening troves
uint256 constant ETH_GAS_COMPENSATION = 0.0375 ether;
// Liquidation
uint256 constant MIN_LIQUIDATION_PENALTY_SP = 5e16; // 5%
uint256 constant MAX_LIQUIDATION_PENALTY_REDISTRIBUTION = 20e16; // 20%
// Collateral branch parameters (SETH = staked ETH, i.e. wstETH / rETH)
uint256 constant CCR_WETH = 150 * _1pct;
uint256 constant CCR_SETH = 160 * _1pct;
uint256 constant MCR_WETH = 110 * _1pct;
uint256 constant MCR_SETH = 120 * _1pct;
uint256 constant SCR_WETH = 110 * _1pct;
uint256 constant SCR_SETH = 120 * _1pct;
// Batch CR buffer (same for all branches for now)
// On top of MCR to join a batch, or adjust inside a batch
uint256 constant BCR_ALL = 5 * _1pct;
uint256 constant LIQUIDATION_PENALTY_SP_WETH = 5 * _1pct;
uint256 constant LIQUIDATION_PENALTY_SP_SETH = 5 * _1pct;
uint256 constant LIQUIDATION_PENALTY_REDISTRIBUTION_WETH = 10 * _1pct;
uint256 constant LIQUIDATION_PENALTY_REDISTRIBUTION_SETH = 20 * _1pct;
// Fraction of collateral awarded to liquidator
uint256 constant COLL_GAS_COMPENSATION_DIVISOR = 200; // dividing by 200 yields 0.5%
uint256 constant COLL_GAS_COMPENSATION_CAP = 2 ether; // Max coll gas compensation capped at 2 ETH
// Minimum amount of net Bold debt a trove must have
uint256 constant MIN_DEBT = 2000e18;
uint256 constant MIN_ANNUAL_INTEREST_RATE = _1pct / 2; // 0.5%
uint256 constant MAX_ANNUAL_INTEREST_RATE = 250 * _1pct;
// Batch management params
uint128 constant MAX_ANNUAL_BATCH_MANAGEMENT_FEE = uint128(_100pct / 10); // 10%
uint128 constant MIN_INTEREST_RATE_CHANGE_PERIOD = 1 hours; // only applies to batch managers / batched Troves
uint256 constant REDEMPTION_FEE_FLOOR = _1pct / 2; // 0.5%
// For the debt / shares ratio to increase by a factor 1e9
// at a average annual debt increase (compounded interest + fees) of 10%, it would take more than 217 years (log(1e9)/log(1.1))
// at a average annual debt increase (compounded interest + fees) of 50%, it would take more than 51 years (log(1e9)/log(1.5))
// The increase pace could be forced to be higher through an inflation attack,
// but precisely the fact that we have this max value now prevents the attack
uint256 constant MAX_BATCH_SHARES_RATIO = 1e9;
// Half-life of 6h. 6h = 360 min
// (1/2) = d^360 => d = (1/2)^(1/360)
uint256 constant REDEMPTION_MINUTE_DECAY_FACTOR = 998076443575628800;
// BETA: 18 digit decimal. Parameter by which to divide the redeemed fraction, in order to calc the new base rate from a redemption.
// Corresponds to (1 / ALPHA) in the white paper.
uint256 constant REDEMPTION_BETA = 1;
// To prevent redemptions unless Bold depegs below 0.95 and allow the system to take off
uint256 constant INITIAL_BASE_RATE = _100pct; // 100% initial redemption rate
// Discount to be used once the shutdown thas been triggered
uint256 constant URGENT_REDEMPTION_BONUS = 2e16; // 2%
uint256 constant ONE_MINUTE = 1 minutes;
uint256 constant ONE_YEAR = 365 days;
uint256 constant UPFRONT_INTEREST_PERIOD = 7 days;
uint256 constant INTEREST_RATE_ADJ_COOLDOWN = 7 days;
uint256 constant SP_YIELD_SPLIT = 75 * _1pct; // 75%
uint256 constant MIN_BOLD_IN_SP = 1e18;
// Maximum number of collaterals allowed in the system
// Capped at 40 to ensure redemptions stay within gas limits
uint256 constant MAX_COLLATERALS = 40;
// Dummy contract that lets legacy Hardhat tests query some of the constants
contract Constants {
uint256 public constant _ETH_GAS_COMPENSATION = ETH_GAS_COMPENSATION;
uint256 public constant _MIN_DEBT = MIN_DEBT;
}
"
},
"src/Interfaces/IAddressesRegistry.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IActivePool.sol";
import "./IBoldToken.sol";
import "./IBorrowerOperations.sol";
import "./ICollSurplusPool.sol";
import "./IDefaultPool.sol";
import "./IHintHelpers.sol";
import "./IMultiTroveGetter.sol";
import "./ISortedTroves.sol";
import "./IStabilityPool.sol";
import "./ITroveManager.sol";
import "./ITroveNFT.sol";
import {IMetadataNFT} from "../NFTMetadata/MetadataNFT.sol";
import {ICollateralRegistry} from "./ICollateralRegistry.sol";
import "./IInterestRouter.sol";
import "./IPriceFeed.sol";
import "./IWETH.sol";
import "./IEbisuBranchManager.sol";
interface IAddressesRegistry {
struct AddressVars {
IERC20Metadata collToken;
IBorrowerOperations borrowerOperations;
ITroveManager troveManager;
ITroveNFT troveNFT;
IMetadataNFT metadataNFT;
IStabilityPool stabilityPool;
IPriceFeed priceFeed;
IActivePool activePool;
IDefaultPool defaultPool;
address gasPoolAddress;
ICollSurplusPool collSurplusPool;
ISortedTroves sortedTroves;
IInterestRouter interestRouter;
IHintHelpers hintHelpers;
IMultiTroveGetter multiTroveGetter;
ICollateralRegistry collateralRegistry;
IBoldToken boldToken;
IWETH WETH;
address borrowerOperationsHelper;
IEbisuBranchManager branchManager;
}
function CCR() external view returns (uint256);
function SCR() external view returns (uint256);
function MCR() external view returns (uint256);
function BCR() external view returns (uint256);
function LIQUIDATION_PENALTY_SP() external view returns (uint256);
function LIQUIDATION_PENALTY_REDISTRIBUTION() external view returns (uint256);
function branchCollGasCompensationCap() external view returns (uint256);
function collToken() external view returns (IERC20Metadata);
function borrowerOperations() external view returns (IBorrowerOperations);
function troveManager() external view returns (ITroveManager);
function troveNFT() external view returns (ITroveNFT);
function metadataNFT() external view returns (IMetadataNFT);
function stabilityPool() external view returns (IStabilityPool);
function priceFeed() external view returns (IPriceFeed);
function activePool() external view returns (IActivePool);
function defaultPool() external view returns (IDefaultPool);
function gasPoolAddress() external view returns (address);
function collSurplusPool() external view returns (ICollSurplusPool);
function sortedTroves() external view returns (ISortedTroves);
function interestRouter() external view returns (IInterestRouter);
function hintHelpers() external view returns (IHintHelpers);
function multiTroveGetter() external view returns (IMultiTroveGetter);
function collateralRegistry() external view returns (ICollateralRegistry);
function boldToken() external view returns (IBoldToken);
function WETH() external returns (IWETH);
function borrowerOperationsHelper() external view returns (address);
function branchManager() external view returns (IEbisuBranchManager);
function setAddresses(AddressVars memory _vars) external;
}
"
},
"src/Interfaces/IEbisuBranchManager.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
import "../Types/LatestTroveData.sol";
import "../Types/LatestBatchData.sol";
import "./ILiquityBase.sol";
enum Parameter {
MCR,
MIN_ANNUAL_INTEREST_RATE,
SP_YIELD_SPLIT,
DEBT_CAP,
PAUSE_MINTING,
UNPAUSE_MINTING,
FINALIZE_PARAMETER,
REDEMPTION_FEE_FLOOR,
CCR,
MIN_DEBT,
BRANCH_COLL_GAS_COMPENSATION_CAP
}
interface IEbisuBranchManager is ILiquityBase {
struct SingleRedemptionValues {
uint256 troveId;
address batchAddress;
uint256 boldLot;
uint256 collLot;
uint256 collFee;
uint256 appliedRedistBoldDebtGain;
uint256 oldWeightedRecordedDebt;
uint256 newWeightedRecordedDebt;
uint256 newStake;
bool isZombieTrove;
LatestTroveData trove;
LatestBatchData batch;
}
function initialize(address _addressesRegistryAddress) external;
function MCR() external view returns (uint256);
function CCR() external view returns (uint256);
function SCR() external view returns (uint256);
function liquidationPenaltySp() external view returns (uint256);
function liquidationPenaltyRedistribution() external view returns (uint256);
function mintingDebtAllowed() external view returns (bool);
function spYieldSplit() external view returns (uint256);
function debtCap() external view returns (uint256);
function minDebt() external view returns (uint256);
function branchCollGasCompensationCap() external view returns (uint256);
function requireValidAnnualInterestRate(uint256 _annualInterestRate) external view;
function getOffsetAndRedistributionVals(
uint256 _entireTroveDebt,
uint256 _collToLiquidate, // gas compensation is already subtracted
uint256 _boldInStabPool,
uint256 _price
)
external
view
returns (
uint256 debtToOffset,
uint256 collToSendToSP,
uint256 collGasCompensation,
uint256 debtToRedistribute,
uint256 collToRedistribute,
uint256 collSurplus
);
function pauseMintingDebt() external;
function unpauseMintingDebt() external;
function setParameterController(Parameter parameter, address controller, bool isAuthorized) external;
function isAuthorizedAddress(Parameter parameter, address controller) external view returns (bool);
function setSpYieldSplit(uint256 _spYieldSplit) external;
function finalizeParameterChange(Parameter parameter) external;
function setMCR(uint256 _MCR) external;
function setCCR(uint256 _CCR) external;
function setDebtCap(uint256 _debtCap) external;
function setBranchRedemptionFeeFloor(uint256 _redemptionFeeFloor) external;
function setDebtCapAndRedemptionFeeFloor(uint256 _debtCap, uint256 _redemptionFeeFloor) external;
function getTroveMinAnnualInterestRate() external view returns (uint256);
function setInterestRouter(address _interestRouter) external;
function cancelParameterProposal(Parameter parameter) external;
function setMinDebt(uint256 _minDebt) external;
function setBranchCollGasCompensationCap(uint256 _branchCollGasCompensationCap) external;
function redeemCollateral(
address _redeemer,
uint256 _boldamount,
uint256 _price,
uint256 _redemptionRate,
uint256 _maxIterations
) external returns (uint256 _redemeedAmount);
function urgentRedemption(uint256 _boldamount, uint256[] memory _troveIds, uint256 _totalCollRedeemed) external;
function getUnbackedPortionPriceAndRedeemability() external returns (uint256, uint256, bool);
function shutdown() external;
function shutdownTime() external view returns (uint256);
function totalDebtTaken() external view returns (uint256);
}
"
},
"src/Interfaces/IActivePool.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IInterestRouter.sol";
import "./IBoldRewardsReceiver.sol";
import "../Types/TroveChange.sol";
interface IActivePool {
function initialize(address _addressesRegistryAddress) external;
function defaultPoolAddress() external view returns (address);
function borrowerOperationsAddress() external view returns (address);
function troveManagerAddress() external view returns (address);
function interestRouter() external view returns (IInterestRouter);
// We avoid IStabilityPool here in order to prevent creating a dependency cycle that would break flattening
function stabilityPool() external view returns (IBoldRewardsReceiver);
function getCollBalance() external view returns (uint256);
function getBoldDebt() external view returns (uint256);
function lastAggUpdateTime() external view returns (uint256);
function aggRecordedDebt() external view returns (uint256);
function aggWeightedDebtSum() external view returns (uint256);
function aggBatchManagementFees() external view returns (uint256);
function aggWeightedBatchManagementFeeSum() external view returns (uint256);
function calcPendingAggInterest() external view returns (uint256);
function calcPendingSPYield() external view returns (uint256);
function calcPendingAggBatchManagementFee() external view returns (uint256);
function getNewApproxAvgInterestRateFromTroveChange(TroveChange calldata _troveChange)
external
view
returns (uint256);
function mintAggInterest() external;
function mintAggInterestAndAccountForTroveChange(TroveChange calldata _troveChange, address _batchManager)
external;
function mintBatchManagementFeeAndAccountForChange(TroveChange calldata _troveChange, address _batchAddress)
external;
function setShutdownFlag() external;
function hasBeenShutDown() external view returns (bool);
function shutdownTime() external view returns (uint256);
function sendColl(address _account, uint256 _amount) external;
function sendCollToDefaultPool(uint256 _amount) external;
function receiveColl(uint256 _amount) external;
function accountForReceivedColl(uint256 _amount) external;
function totalDebtTaken() external view returns (uint256);
function setInterestRouter(address _newInterestRouter) external;
}
"
},
"src/Interfaces/IBoldToken.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol";
interface IBoldToken is IERC20MetadataUpgradeable, IERC20PermitUpgradeable {
function setCollateralRegistry(address _collateralRegistryAddress) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
function sendToPool(address _sender, address poolAddress, uint256 _amount) external;
function returnFromPool(address poolAddress, address user, uint256 _amount) external;
}
"
},
"src/Interfaces/IBorrowerOperations.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ILiquityBase.sol";
import "./IAddRemoveManagers.sol";
import "./IBoldToken.sol";
import "./IPriceFeed.sol";
import "./ISortedTroves.sol";
import "./ITroveManager.sol";
import "./IWETH.sol";
import "../Dependencies/BoStructs.sol";
import "./IEbisuBorrowerOperationsHelper.sol";
// Common interface for the Borrower Operations.
interface IBorrowerOperations is ILiquityBase, IAddRemoveManagers {
function initialize(address _addressesRegistryAddress) external;
function openTrove(
address _owner,
uint256 _ownerIndex,
uint256 _ETHAmount,
uint256 _boldAmount,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _annualInterestRate,
uint256 _maxUpfrontFee,
address _addManager,
address _removeManager,
address _receiver
) external returns (uint256);
struct OpenTroveAndJoinInterestBatchManagerParams {
address owner;
uint256 ownerIndex;
uint256 collAmount;
uint256 boldAmount;
uint256 upperHint;
uint256 lowerHint;
address interestBatchManager;
uint256 maxUpfrontFee;
address addManager;
address removeManager;
address receiver;
}
function openTroveAndJoinInterestBatchManager(OpenTroveAndJoinInterestBatchManagerParams calldata _params)
external
returns (uint256);
function addColl(uint256 _troveId, uint256 _ETHAmount) external;
function withdrawColl(uint256 _troveId, uint256 _amount) external;
function withdrawBold(uint256 _troveId, uint256 _amount, uint256 _maxUpfrontFee) external;
function repayBold(uint256 _troveId, uint256 _amount) external;
function closeTrove(uint256 _troveId) external;
function adjustTrove(
uint256 _troveId,
uint256 _collChange,
bool _isCollIncrease,
uint256 _debtChange,
bool isDebtIncrease,
uint256 _maxUpfrontFee
) external;
function adjustZombieTrove(
uint256 _troveId,
uint256 _collChange,
bool _isCollIncrease,
uint256 _boldChange,
bool _isDebtIncrease,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) external;
function adjustTroveInterestRate(
uint256 _troveId,
uint256 _newAnnualInterestRate,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) external;
function applyPendingDebt(uint256 _troveId, uint256 _lowerHint, uint256 _upperHint) external;
function onLiquidateTrove(uint256 _troveId) external;
function claimCollateral() external;
function hasBeenShutDown() external view returns (bool);
function shutdown() external;
function shutdownFromOracleFailure() external;
// -- individual delegation --
function setInterestIndividualDelegate(
uint256 _troveId,
address _delegate,
uint128 _minInterestRate,
uint128 _maxInterestRate,
// only needed if trove was previously in a batch:
uint256 _newAnnualInterestRate,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee,
uint256 _minInterestRateChangePeriod
) external;
// -- batches --
function lowerBatchManagementFee(uint256 _newAnnualFee) external;
function interestBatchManagerOf(uint256 _troveId) external view returns (address);
function kickFromBatch(uint256 _troveId, uint256 _upperHint, uint256 _lowerHint) external;
function removeFromBatch(
uint256 _troveId,
uint256 _newAnnualInterestRate,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) external;
function switchBatchManager(
uint256 _troveId,
uint256 _removeUpperHint,
uint256 _removeLowerHint,
address _newBatchManager,
uint256 _addUpperHint,
uint256 _addLowerHint,
uint256 _maxUpfrontFee
) external;
function setInterestBatchManagerOf(uint256 _troveId, address _batchManager) external;
function boHelper() external view returns (IEbisuBorrowerOperationsHelper);
function setMinDebt(uint256 _minDebt) external;
}
"
},
"src/Interfaces/ICollSurplusPool.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ICollSurplusPool {
function initialize(address _addressesRegistryAddress) external;
function getCollBalance() external view returns (uint256);
function getCollateral(address _account) external view returns (uint256);
function accountSurplus(address _account, uint256 _amount) external;
function claimColl(address _account) external;
}
"
},
"src/Interfaces/IDefaultPool.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IDefaultPool {
function initialize(address _addressesRegistryAddress) external;
function troveManagerAddress() external view returns (address);
function activePoolAddress() external view returns (address);
// --- Functions ---
function getCollBalance() external view returns (uint256);
function getBoldDebt() external view returns (uint256);
function sendCollToActivePool(uint256 _amount) external;
function receiveColl(uint256 _amount) external;
function increaseBoldDebt(uint256 _amount) external;
function decreaseBoldDebt(uint256 _amount) external;
}
"
},
"src/Interfaces/IHintHelpers.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IHintHelpers {
function getApproxHint(uint256 _collIndex, uint256 _interestRate, uint256 _numTrials, uint256 _inputRandomSeed)
external
view
returns (uint256 hintId, uint256 diff, uint256 latestRandomSeed);
function predictOpenTroveUpfrontFee(uint256 _collIndex, uint256 _borrowedAmount, uint256 _interestRate)
external
view
returns (uint256);
function predictAdjustInterestRateUpfrontFee(uint256 _collIndex, uint256 _troveId, uint256 _newInterestRate)
external
view
returns (uint256);
function forcePredictAdjustInterestRateUpfrontFee(uint256 _collIndex, uint256 _troveId, uint256 _newInterestRate)
external
view
returns (uint256);
function predictAdjustTroveUpfrontFee(uint256 _collIndex, uint256 _troveId, uint256 _debtIncrease)
external
view
returns (uint256);
function predictAdjustBatchInterestRateUpfrontFee(
uint256 _collIndex,
address _batchAddress,
uint256 _newInterestRate
) external view returns (uint256);
function predictJoinBatchInterestRateUpfrontFee(uint256 _collIndex, uint256 _troveId, address _batchAddress)
external
view
returns (uint256);
}
"
},
"src/Interfaces/IMultiTroveGetter.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IMultiTroveGetter {
struct CombinedTroveData {
uint256 id;
uint256 entireDebt;
uint256 entireColl;
uint256 redistBoldDebtGain;
uint256 redistCollGain;
uint256 accruedInterest;
uint256 recordedDebt;
uint256 annualInterestRate;
uint256 accruedBatchManagementFee;
uint256 lastInterestRateAdjTime;
uint256 stake;
uint256 lastDebtUpdateTime;
address interestBatchManager;
uint256 batchDebtShares;
uint256 snapshotETH;
uint256 snapshotBoldDebt;
}
struct DebtPerInterestRate {
address interestBatchManager;
uint256 interestRate;
uint256 debt;
}
function getMultipleSortedTroves(uint256 _collIndex, int256 _startIdx, uint256 _count)
external
view
returns (CombinedTroveData[] memory _troves);
function getDebtPerInterestRateAscending(uint256 _collIndex, uint256 _startId, uint256 _maxIterations)
external
view
returns (DebtPerInterestRate[] memory, uint256 currId);
}
"
},
"src/Interfaces/ISortedTroves.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ITroveManager.sol";
import {BatchId, BATCH_ID_ZERO} from "../Types/BatchId.sol";
interface ISortedTroves {
// Initialize function
function initialize(address _addressesRegistryAddress) external;
// -- Mutating functions (permissioned) --
function insert(uint256 _id, uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId) external;
function insertIntoBatch(
uint256 _troveId,
BatchId _batchId,
uint256 _annualInterestRate,
uint256 _prevId,
uint256 _nextId
) external;
function remove(uint256 _id) external;
function removeFromBatch(uint256 _id) external;
function reInsert(uint256 _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) external;
function reInsertBatch(BatchId _id, uint256 _newAnnualInterestRate, uint256 _prevId, uint256 _nextId) external;
// -- View functions --
function contains(uint256 _id) external view returns (bool);
function isBatchedNode(uint256 _id) external view returns (bool);
function isEmptyBatch(BatchId _id) external view returns (bool);
function isEmpty() external view returns (bool);
function getSize() external view returns (uint256);
function getFirst() external view returns (uint256);
function getLast() external view returns (uint256);
function getNext(uint256 _id) external view returns (uint256);
function getPrev(uint256 _id) external view returns (uint256);
function validInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId)
external
view
returns (bool);
function findInsertPosition(uint256 _annualInterestRate, uint256 _prevId, uint256 _nextId)
external
view
returns (uint256, uint256);
// Public state variable getters
function borrowerOperationsAddress() external view returns (address);
function troveManager() external view returns (ITroveManager);
function size() external view returns (uint256);
function nodes(uint256 _id) external view returns (uint256 nextId, uint256 prevId, BatchId batchId, bool exists);
function batches(BatchId _id) external view returns (uint256 head, uint256 tail);
}
"
},
"src/Interfaces/IStabilityPool.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ILiquityBase.sol";
import "./IBoldToken.sol";
import "./ITroveManager.sol";
import "./IBoldRewardsReceiver.sol";
/*
* The Stability Pool holds Bold tokens deposited by Stability Pool depositors.
*
* When a trove is liquidated, then depending on system conditions, some of its Bold debt gets offset with
* Bold in the Stability Pool: that is, the offset debt evaporates, and an equal amount of Bold tokens in the Stability Pool is burned.
*
* Thus, a liquidation causes each depositor to receive a Bold loss, in proportion to their deposit as a share of total deposits.
* They also receive an Coll gain, as the collateral of the liquidated trove is distributed among Stability depositors,
* in the same proportion.
*
* When a liquidation occurs, it depletes every deposit by the same fraction: for example, a liquidation that depletes 40%
* of the total Bold in the Stability Pool, depletes 40% of each deposit.
*
* A deposit that has experienced a series of liquidations is termed a "compounded deposit": each liquidation depletes the deposit,
* multiplying it by some factor in range ]0,1[
*
* Please see the implementation spec in the proof document, which closely follows on from the compounded deposit / Coll gain derivations:
* https://github.com/liquity/liquity/blob/master/papers/Scalable_Reward_Distribution_with_Compounding_Stakes.pdf
*
*/
interface IStabilityPool is ILiquityBase, IBoldRewardsReceiver {
function initialize(address _addressesRegistryAddress) external;
function boldToken() external view returns (IBoldToken);
function troveManager() external view returns (ITroveManager);
/* provideToSP():
* - Calculates depositor's Coll gain
* - Calculates the compounded deposit
* - Increases deposit, and takes new snapshots of accumulators P and S
* - Sends depositor's accumulated Coll gains to depositor
*/
function provideToSP(uint256 _amount, bool _doClaim) external;
/* withdrawFromSP():
* - Calculates depositor's Coll gain
* - Calculates the compounded deposit
* - Sends the requested BOLD withdrawal to depositor
* - (If _amount > userDeposit, the user withdraws all of their compounded deposit)
* - Decreases deposit by withdrawn amount and takes new snapshots of accumulators P and S
*/
function withdrawFromSP(uint256 _amount, bool doClaim) external;
function claimAllCollGains() external;
/*
* Initial checks:
* - Caller is TroveManager
* ---
* Cancels out the specified debt against the Bold contained in the Stability Pool (as far as possible)
* and transfers the Trove's collateral from ActivePool to StabilityPool.
* Only called by liquidation functions in the TroveManager.
*/
function offset(uint256 _debt, uint256 _coll) external;
function deposits(address _depositor) external view returns (uint256 initialValue);
function stashedColl(address _depositor) external view returns (uint256);
/*
* Returns the total amount of Coll held by the pool, accounted in an internal variable instead of `balance`,
* to exclude edge cases like Coll received from a self-destruct.
*/
function getCollBalance() external view returns (uint256);
/*
* Returns Bold held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset.
*/
function getTotalBoldDeposits() external view returns (uint256);
function getYieldGainsOwed() external view returns (uint256);
function getYieldGainsPending() external view returns (uint256);
/*
* Calculates the Coll gain earned by the deposit since its last snapshots were taken.
*/
function getDepositorCollGain(address _depositor) external view returns (uint256);
/*
* Calculates the BOLD yield gain earned by the deposit since its last snapshots were taken.
*/
function getDepositorYieldGain(address _depositor) external view returns (uint256);
/*
* Calculates what `getDepositorYieldGain` will be if interest is minted now.
*/
function getDepositorYieldGainWithPending(address _depositor) external view returns (uint256);
/*
* Return the user's compounded deposit.
*/
function getCompoundedBoldDeposit(address _depositor) external view returns (uint256);
function scaleToS(uint256 _scale) external view returns (uint256);
function scaleToB(uint256 _scale) external view returns (uint256);
function P() external view returns (uint256);
function currentScale() external view returns (uint256);
function P_PRECISION() external view returns (uint256);
}
"
},
"src/Interfaces/ITroveManager.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ILiquityBase.sol";
import "./ITroveNFT.sol";
import "./IBorrowerOperations.sol";
import "./IStabilityPool.sol";
import "./IBoldToken.sol";
import "./ISortedTroves.sol";
import "../Types/LatestTroveData.sol";
import "../Types/LatestBatchData.sol";
import "./IEbisuBranchManager.sol";
import "../Dependencies/TMStructs.sol";
// Common interface for the Trove Manager.
interface ITroveManager is ILiquityBase {
enum Status {
nonExistent,
active,
closedByOwner,
closedByLiquidation,
zombie
}
function initialize(address _addressesRegistryAddress) external;
function troveNFT() external view returns (ITroveNFT);
function stabilityPool() external view returns (IStabilityPool);
function sortedTroves() external view returns (ISortedTroves);
function borrowerOperations() external view returns (IBorrowerOperations);
function Troves(uint256 _id)
external
view
returns (
uint256 debt,
uint256 coll,
uint256 stake,
Status status,
uint64 arrayIndex,
uint64 lastDebtUpdateTime,
uint64 lastInterestRateAdjTime,
uint256 annualInterestRate,
address interestBatchManager,
uint256 batchDebtShares
);
function rewardSnapshots(uint256 _id) external view returns (uint256 coll, uint256 boldDebt);
function getTroveIdsCount() external view returns (uint256);
function getTroveFromTroveIdsArray(uint256 _index) external view returns (uint256);
function getCurrentICR(uint256 _troveId, uint256 _price) external view returns (uint256);
function lastZombieTroveId() external view returns (uint256);
function batchLiquidateTroves(uint256[] calldata _troveArray) external;
function shutdown() external;
function getLatestTroveData(uint256 _troveId) external view returns (LatestTroveData memory);
function getTroveAnnualInterestRate(uint256 _troveId) external view returns (uint256);
function getTroveStatus(uint256 _troveId) external view returns (Status);
function getLatestBatchData(address _batchAddress) external view returns (LatestBatchData memory);
// -- permissioned functions called by BorrowerOperations
function onOpenTrove(address _owner, uint256 _troveId, TroveChange memory _troveChange, uint256 _annualInterestRate)
external;
function onOpenTroveAndJoinBatch(
address _owner,
uint256 _troveId,
TroveChange memory _troveChange,
address _batchAddress,
uint256 _batchColl,
uint256 _batchDebt
) external;
// Called from `adjustZombieTrove()`
function setTroveStatusToActive(uint256 _troveId) external;
function onAdjustTroveInterestRate(
uint256 _troveId,
uint256 _newColl,
uint256 _newDebt,
uint256 _newAnnualInterestRate,
TroveChange calldata _troveChange
) external;
function onAdjustTrove(uint256 _troveId, uint256 _newColl, uint256 _newDebt, TroveChange calldata _troveChange)
external;
function onAdjustTroveInsideBatch(
uint256 _troveId,
uint256 _newTroveColl,
uint256 _newTroveDebt,
TroveChange memory _troveChange,
address _batchAddress,
uint256 _newBatchColl,
uint256 _newBatchDebt
) external;
function onApplyTroveInterest(
uint256 _troveId,
uint256 _newTroveColl,
uint256 _newTroveDebt,
address _batchAddress,
uint256 _newBatchColl,
uint256 _newBatchDebt,
TroveChange calldata _troveChange
) external;
function onCloseTrove(
uint256 _troveId,
TroveChange memory _troveChange, // decrease vars: entire, with interest, batch fee and redistribution
address _batchAddress,
uint256 _newBatchColl,
uint256 _newBatchDebt // entire, with interest and batch fee
) external;
// -- batches --
function onRegisterBatchManager(address _batchAddress, uint256 _annualInterestRate, uint256 _annualFee) external;
function onLowerBatchManagerAnnualFee(
address _batchAddress,
uint256 _newColl,
uint256 _newDebt,
uint256 _newAnnualManagementFee
) external;
function onSetBatchManagerAnnualInterestRate(
address _batchAddress,
uint256 _newColl,
uint256 _newDebt,
uint256 _newAnnualInterestRate,
uint256 _upfrontFee // needed by BatchUpdated event
) external;
struct OnSetInterestBatchManagerParams {
uint256 troveId;
uint256 troveColl; // entire, with redistribution
uint256 troveDebt; // entire, with interest, batch fee and redistribution
TroveChange troveChange;
address newBatchAddress;
uint256 newBatchColl; // updated collateral for new batch manager
uint256 newBatchDebt; // updated debt for new batch manager
}
function onSetInterestBatchManager(OnSetInterestBatchManagerParams calldata _params) external;
function onRemoveFromBatch(
uint256 _troveId,
uint256 _newTroveColl, // entire, with redistribution
uint256 _newTroveDebt, // entire, with interest, batch fee and redistribution
TroveChange memory _troveChange,
address _batchAddress,
uint256 _newBatchColl,
uint256 _newBatchDebt, // entire, with interest and batch fee
uint256 _newAnnualInterestRate
) external;
function setLastZombieTroveId(uint256 _lastZombieTroveId) external;
function updateBatchSharesAndTroveColl(
uint256 _troveId,
uint256 _newColl,
address _batchAddress,
TroveChange memory _troveChange,
uint256 _newTroveDebt,
uint256 _batchColl,
uint256 _batchDebt,
bool _checkBatchSharesRatio
) external;
function updateTroveState(uint256 _troveId, uint256 _newColl, uint256 _redistBoldDebtGain, uint256 _redistCollGain)
external
returns (uint256 newStake);
function setTroveCollDebtAndLastDebtUpdateTime(uint256 _troveId, uint256 _newColl, uint256 _newDebt) external;
function setTroveStatusToZombie(uint256 _troveId) external;
// -- end of permissioned functions --
function L_coll() external view returns (uint256);
function L_boldDebt() external view returns (uint256);
function getBatchData(address _batchAddress) external view returns (Batch memory);
function getBatchManager(uint256 _troveId) external view returns (address);
function updateBatchInterestPriorToRedemption(address _batchAddress) external;
}
"
},
"src/Interfaces/ITroveNFT.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol";
import "./ITroveManager.sol";
interface ITroveNFT is IERC721MetadataUpgradeable {
function mint(address _owner, uint256 _troveId) external;
function burn(uint256 _troveId) external;
}
"
},
"src/NFTMetadata/MetadataNFT.sol": {
"content": "//SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import "Solady/utils/SSTORE2.sol";
import "./utils/JSON.sol";
import "./utils/baseSVG.sol";
import "./utils/ebisu.sol";
import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {ITroveManager} from "../Interfaces/ITroveManager.sol";
interface IMetadataNFT {
struct TroveData {
uint256 _tokenId;
address _owner;
address _collToken;
address _boldToken;
uint256 _collAmount;
uint256 _debtAmount;
uint256 _interestRate;
ITroveManager.Status _status;
}
function uri(TroveData memory _troveData) external view returns (string memory);
}
contract MetadataNFT is IMetadataNFT {
FixedAssetReader public immutable mainAssetReader;
FixedAssetReader public immutable heroAssetReader;
constructor(FixedAssetReader _mainAssetReader, FixedAssetReader _heroAssetReader) {
mainAssetReader = _mainAssetReader;
heroAssetReader = _heroAssetReader;
}
function uri(TroveData memory _troveData) public view returns (string memory) {
string memory attr = attributes(_troveData);
return json.formattedMetadata(
string.concat("Ebisu Money - ", IERC20Metadata(_troveData._collToken).name()),
string.concat(
"Ebisu Money is a collateralized debt platform. Users can lock up ",
IERC20Metadata(_troveData._collToken).symbol(),
" to issue stablecoin tokens (ebUSD) to their own Ethereum address. The individual collateralized debt positions are called Troves, and are represented as NFTs."
),
renderSVGImage(_troveData),
attr
);
}
function renderSVGImage(TroveData memory _troveData) internal view returns (string memory) {
return svg._svg(
baseSVG._svgProps(),
string.concat(
baseSVG._baseElements(mainAssetReader),
ebisuSVG._hero(_troveData._tokenId, heroAssetReader),
dynamicTextComponents(_troveData)
)
);
}
function attributes(TroveData memory _troveData) public pure returns (string memory) {
//include: collateral token address, collateral amount, debt token address, debt amount, interest rate, status
return string.concat(
'[{"trait_type": "Collateral Token", "value": "',
LibString.toHexString(_troveData._collToken),
'"}, {"trait_type": "Collateral Amount", "value": "',
LibString.toString(_troveData._collAmount),
'"}, {"trait_type": "Debt Token", "value": "',
LibString.toHexString(_troveData._boldToken),
'"}, {"trait_type": "Debt Amount", "value": "',
LibString.toString(_troveData._debtAmount),
'"}, {"trait_type": "Interest Rate", "value": "',
LibString.toString(_troveData._interestRate),
'"}, {"trait_type": "Status", "value": "',
_status2Str(_troveData._status),
'"} ]'
);
}
function dynamicTextComponents(TroveData memory _troveData) public view returns (string memory) {
string memory id = LibString.toHexString(_troveData._tokenId);
id = string.concat(LibString.slice(id, 0, 6), "...", LibString.slice(id, 38, 42));
uint8 collDecimals = IERC20Metadata(_troveData._collToken).decimals();
return string.concat(
baseSVG._formattedIdEl(id),
baseSVG._formattedAddressEl(_troveData._owner),
baseSVG._collLogo("COLLATERAL", mainAssetReader),
baseSVG._statusEl(_status2Str(_troveData._status)),
baseSVG._dynamicTextEls(_troveData._debtAmount, _troveData._collAmount, _troveData._interestRate, collDecimals)
);
}
function _status2Str(ITroveManager.Status status) internal pure returns (string memory) {
if (status == ITroveManager.Status.active) return "Active";
if (status == ITroveManager.Status.closedByOwner) return "Closed";
if (status == ITroveManager.Status.closedByLiquidation) return "Liquidated";
if (status == ITroveManager.Status.zombie) return "Below Min Debt";
return "";
}
}
"
},
"src/Interfaces/ICollateralRegistry.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IBoldToken.sol";
import {ITroveManager} from "./ITroveManager.sol";
import "./IEbisuAdminRegistry.sol";
import "./IEbisuBranchManager.sol";
import "openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
interface ICollateralRegistry is IEbisuAdminRegistry {
function baseRate() external view returns (uint256);
function lastFeeOperationTime() external view returns (uint256);
function redeemCollateral(uint256 _boldamount, uint256 _maxIterations, uint256 _maxFeePercentage) external;
// getters
function totalCollaterals() external view returns (uint256);
function getToken(uint256 _index) external view returns (IERC20Metadata);
function getTroveManager(uint256 _index) external view returns (ITroveManager);
function boldToken() external view returns (IBoldToken);
function branchFactoryAddress() external view returns (address);
function troveManagerAddresses(address _address) external view returns (bool);
function branchManagerAddresses(address _address) external view returns (bool);
function stabilityPoolAddresses(address _address) external view returns (bool);
function borrowerOperationsAddresses(address _address) external view returns (bool);
function activePoolAddresses(address _address) external view returns (bool);
function getRedemptionRate() external view returns (uint256);
function getRedemptionRateWithDecay() external view returns (uint256);
function getBranchRedemptionRate(uint256 _index) external view returns (uint256);
function getBranchRedemptionRateWithDecay(uint256 _index) external view returns (uint256);
function getRedemptionRateForRedeemedAmount(uint256 _redeemAmount) external view returns (uint256);
function getRedemptionFeeWithDecay(uint256 _ETHDrawn) external view returns (uint256);
function getEffectiveRedemptionFeeInBold(uint256 _redeemAmount) external view returns (uint256);
function getTokenIndex(address _token) external view returns (uint256);
function redemptionFeeFloors(uint256 _index) external view returns (uint256);
// add branches
function addNewBranch(
address _token,
ITroveManager _troveManager,
address _stabilityPoolAddress,
address _borrowerOperationsAddress,
address _activePoolAddress,
IEbisuBranchManager _branchManager
) external;
function setBranchRedemptionFeeFloor(address _token, uint256 _redemptionFeeFloor) external;
function getHighestRedemptionRateWithDecay() external view returns (uint256);
function setBranchFactory(address _branchFactory) external;
}
"
},
"src/Interfaces/IInterestRouter.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IInterestRouter {
// Currently the Interest Router doesn’t need any specific function
}
"
},
"src/Interfaces/IPriceFeed.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IPriceFeed {
function fetchPrice() external returns (uint256, bool);
function fetchRedemptionPrice() external returns (uint256, bool);
function lastGoodPrice() external view returns (uint256);
}
"
},
"src/Interfaces/IWETH.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol";
interface IWETH is IERC20Metadata {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
"
},
"src/Types/LatestTroveData.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
struct LatestTroveData {
uint256 entireDebt;
uint256 entireColl;
uint256 redistBoldDebtGain;
uint256 redistCollGain;
uint256 accruedInterest;
uint256 recordedDebt;
uint256 annualInterestRate;
uint256 weightedRecordedDebt;
uint256 accruedBatchManagementFee;
uint256 lastInterestRateAdjTime;
}
"
},
"src/Types/LatestBatchData.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
struct LatestBatchData {
uint256 totalDebtShares;
uint256 entireDebtWithoutRedistribution;
uint256 entireCollWithoutRedistribution;
uint256 accruedInterest;
uint256 recordedDebt;
uint256 annualInterestRate;
uint256 weightedRecordedDebt;
uint256 annualManagementFee;
uint256 accruedManagementFee;
uint256 weightedRecordedBatchManagementFee;
uint256 lastDebtUpdateTime;
uint256 lastInterestRateAdjTime;
}
"
},
"src/Interfaces/ILiquityBase.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IActivePool.sol";
import "./IDefaultPool.sol";
import "./IPriceFeed.sol";
interface ILiquityBase {
function activePool() external view returns (IActivePool);
function getEntireBranchDebt() external view returns (uint256);
function getEntireBranchColl() external view returns (uint256);
}
"
},
"src/Interfaces/IBoldRewardsReceiver.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IBoldRewardsReceiver {
function triggerBoldRewards(uint256 _boldYield) external;
}
"
},
"src/Types/TroveChange.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
struct TroveChange {
uint256 appliedRedistBoldDebtGain;
uint256 appliedRedistCollGain;
uint256 collIncrease;
uint256 collDecrease;
uint256 debtIncrease;
uint256 debtDecrease;
uint256 newWeightedRecordedDebt;
uint256 oldWeightedRecordedDebt;
uint256 upfrontFee;
uint256 batchAccruedManagementFee;
uint256 newWeightedRecordedBatchManagementFee;
uint256 oldWeightedRecordedBatchManagementFee;
}
"
},
"lib/oz-contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20Upgradeable.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20MetadataUpgradeable is IERC20Upgradeable {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
"
},
"lib/oz-contracts-upgradeable/token/ERC20/extensions/IERC20PermitUpgradeable.sol": {
"content": "// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*
* ==== Security Considerations
*
* There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
* expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
* considered as an intention to spend the allowance in any specific way. The second is that because permits have
* built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
* take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
* generally recommended is:
*
* ```solidity
* function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
* try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
* doThing(..., value);
* }
*
* function doThing(..., uint256 value) public {
* token.safeTransferFrom(msg.sender, address(this), value);
* ...
* }
* ```
*
* Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
* `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
* {SafeERC20-safeTransferFrom}).
*
* Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
* contracts should have entry points that don't rely on permit.
*/
interface IERC20PermitUpgradeable {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*
* CAUTION: See Security Considerations above.
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
"
},
"src/Interfaces/IAddRemoveManagers.sol": {
"content": "// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IAddRemoveManagers {
function setAddManager(uint256 _troveId, address _manager) external;
function setRemoveManager(uint256 _troveId, address _manager) external;
function setRemoveManagerWithReceiver(uint256 _troveId, address _manager, address _receiver) external;
function addManagerOf(uint256 _troveId) external view returns (address);
function removeManagerReceiverOf(uint256 _troveId) external view returns (address, address);
}
"
},
"src/Dependencies/BoStructs.sol": {
"content": "// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
import "../Interfaces/ITroveManager.sol";
import "../Interfaces/IActivePool.sol";
import "../Interfaces/IBoldToken.sol";
import "../Types/LatestTroveData.sol";
import "../Types/LatestBatchData.sol";
import "../Interfaces/ISortedTroves.sol";
// -- individual delegation --
struct InterestIndividualDelegate {
address account;
uint128 minInterestRate;
uint128 maxInterestRate;
uint256 minInterestRateChangePeriod;
}
struct InterestBatchManager {
uint128 minInterestRate;
uint128 maxInterestRate;
uint256 minInterestRateChangePeriod;
}
struct LocalVariables_openTrove {
ITroveManager troveManager;
IActivePool activePool;
IBoldToken boldToken;
uint256 troveId;
uint256 price;
uint256 avgInterestRate;
uint256 entireDebt;
uint256 ICR;
uint256 newTCR;
bool newOracleFailureDetected;
}
struct LocalVariables_adjustTrove {
IActivePool activePool;
IBoldToken boldToken;
LatestTroveData trove;
uint256 price;
bool isBelowCriticalThreshold;
uint256 newICR;
uint256 newDebt;
uint256 newColl;
bool newOracleFailureDetected;
}
struct LocalVariables_setInterestBatchManager {
ITroveManager troveManager;
IActivePool activePool;
ISortedTroves sortedTroves;
address oldBatchManager;
LatestTroveData trove;
LatestBatchData oldBatch;
LatestBatchData newBatch;
}
"
},
"src/Interfaces/IEbisuBorrowerOperationsHelper.sol": {
"content": "// SPDX-License-Identifier: MIT\
Submitted on: 2025-10-28 17:31:02
Comments
Log in to comment.
No comments yet.