Address Contract Verified
Address
0x2f3dc38A6F58DBF2428A8A9a43a66FCF638c299c
Balance
0 ETH
Nonce
1
Code Size
2749 bytes
Creator
Create2 Deployer at tx 0x6c4d6195...dd6cdf
Indexed Transactions
0
Contract Bytecode
2749 bytes
0x608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806388b1410c11610088578063a551ca5f11610063578063a551ca5f146101d4578063ca69583b146101e7578063f6888d1d146101f9578063fc14ac701461021a575f80fd5b806388b1410c1461019b5780638a1d85ac146101ae5780639c85dc62146101c1575f80fd5b80630bc17feb146100cf5780631d416165146100ff5780632150cd561461011457806324c1173b146101275780635c670a5814610161578063630afce514610174575b5f80fd5b6100e26100dd36600461092f565b61022d565b6040516001600160a01b0390911681526020015b60405180910390f35b61011261010d366004610956565b610286565b005b610112610122366004610978565b610457565b61013a61013536600461092f565b6104cc565b604080516001600160a01b0390931683526001600160801b039091166020830152016100f6565b6100e261016f36600461092f565b61050b565b6100e27f000000000000000000000000b01dd87b29d187f3e3a4bf6cdaebfb97f3d9ab9881565b6100e26101a936600461092f565b610533565b6101126101bc36600461099e565b610542565b6100e26101cf36600461092f565b610629565b6001546100e2906001600160a01b031681565b5f546100e2906001600160a01b031681565b61020c610207366004610956565b61067d565b6040519081526020016100f6565b610112610228366004610978565b61073c565b6003545f9082908110610253576040516301f7dc7360e51b815260040160405180910390fd5b60028381548110610266576102666109ed565b5f9182526020909120600290910201546001600160a01b03169392505050565b6001546001600160a01b031633146102b15760405163ea12d63760e01b815260040160405180910390fd5b8015610357575f5b6003548110156103555761034d600382815481106102d9576102d96109ed565b5f91825260209091200154600480546001600160a01b039092169184908110610304576103046109ed565b5f91825260209091200154600280546001600160a01b03909216918590811061032f5761032f6109ed565b5f9182526020909120600290910201546001600160a01b03166107b2565b6001016102b9565b505b6040516370a0823160e01b81523060048201527f000000000000000000000000b01dd87b29d187f3e3a4bf6cdaebfb97f3d9ab986001600160a01b03169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156103c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e79190610a01565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af115801561042f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104539190610a18565b5050565b6001546001600160a01b031633146104825760405163ea12d63760e01b815260040160405180910390fd5b806001600160a01b0381166104aa5760405163e6c4247b60e01b815260040160405180910390fd5b505f80546001600160a01b0319166001600160a01b0392909216919091179055565b600281815481106104db575f80fd5b5f918252602090912060029091020180546001909101546001600160a01b0390911691506001600160801b031682565b6003818154811061051a575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004818154811061051a575f80fd5b5f546001600160a01b0316331461056c57604051637bdb7e1760e01b815260040160405180910390fd5b60035485908110610590576040516301f7dc7360e51b815260040160405180910390fd5b600386815481106105a3576105a36109ed565b5f91825260209091200154604051630570fb7560e41b81526001600160801b03871660048201526024810186905260448101859052606481018490526001600160a01b039091169063570fb750906084015f604051808303815f87803b15801561060b575f80fd5b505af115801561061d573d5f803e3d5ffd5b50505050505050505050565b6003545f908290811061064f576040516301f7dc7360e51b815260040160405180910390fd5b60038381548110610662576106626109ed565b5f918252602090912001546001600160a01b03169392505050565b5f81156106b0575f5b6003548110156106ae576106a6600382815481106102d9576102d96109ed565b600101610686565b505b6040516370a0823160e01b81523060048201527f000000000000000000000000b01dd87b29d187f3e3a4bf6cdaebfb97f3d9ab986001600160a01b0316906370a0823190602401602060405180830381865afa158015610712573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107369190610a01565b92915050565b6001546001600160a01b031633146107675760405163ea12d63760e01b815260040160405180910390fd5b806001600160a01b03811661078f5760405163e6c4247b60e01b815260040160405180910390fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146107dd5760405163ea12d63760e01b815260040160405180910390fd5b604051631c5d44cb60e31b81523060048201525f906001600160a01b0384169063e2ea2658906024016040805180830381865afa158015610820573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108449190610a33565b509050600160405163e47bfaf160e01b8152600481018390526001600160a01b0384169063e47bfaf190602401602060405180830381865afa15801561088c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b09190610a69565b60048111156108c1576108c1610a55565b0361092957604051635d2fa3d360e11b8152600481018290525f6024820181905260448201526001600160a01b0385169063ba5f47a6906064015f604051808303815f87803b158015610912575f80fd5b505af1158015610924573d5f803e3d5ffd5b505050505b50505050565b5f6020828403121561093f575f80fd5b5035919050565b8015158114610953575f80fd5b50565b5f60208284031215610966575f80fd5b813561097181610946565b9392505050565b5f60208284031215610988575f80fd5b81356001600160a01b0381168114610971575f80fd5b5f805f805f60a086880312156109b2575f80fd5b8535945060208601356001600160801b03811681146109cf575f80fd5b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610a11575f80fd5b5051919050565b5f60208284031215610a28575f80fd5b815161097181610946565b5f8060408385031215610a44575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610a79575f80fd5b815160058110610971575f80fdfea264697066735822122064d70730e1136fd33b6a3fe5ed7b6c2b2a3b6e78dd93b191f9f0d08251dc630164736f6c63430008180033
Verified Source Code Full Match
Compiler: v0.8.24+commit.e11b9ed9
EVM: cancun
Optimization: Yes (200 runs)
BatchManagerProxy.sol 191 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import {IBorrowerOperations} from "src/Interfaces/IBorrowerOperations.sol";
import "src/Interfaces/IBoldToken.sol";
import "src/Interfaces/ISortedTroves.sol";
contract BatchManagerProxy {
// Only allowed to update the interest rate.
address public rateAdmin;
// Can claim fees and change admin addresses.
address public generalAdmin;
IBoldToken public immutable boldToken;
struct CollateralConfig {
ITroveManager troveManager;
uint128 currentInterestRate;
}
CollateralConfig[] public collaterals;
IBorrowerOperations[] public borrowerOperations;
ISortedTroves[] public sortedTroves;
error NotGeneralAdmin();
error NotRateAdmin();
error InvalidCollateralIndex();
error InvalidAddress();
struct Fees {
uint128 minInterestRate;
uint128 maxInterestRate;
uint128 annualManagementFee;
uint128 minInterestRateChangePeriod;
}
/**
* @notice Initializes the BatchManager contract and registers it with BorrowerOperations for each collateral type.
* @param _generalAdmin Address of the account that can collect fees and change admin addresses.
* @param _rateAdmin Address of the account that can set interest rates.
* @param _boldToken Address of the BOLD token contract.
* @param _collaterals Array of collateral configurations (TroveManager + interest rate).
* @param _fees Fees to register with the batch managers.
*/
constructor(
address _generalAdmin,
address _rateAdmin,
IBoldToken _boldToken,
CollateralConfig[] memory _collaterals,
Fees memory _fees
) validAddress(_generalAdmin) validAddress(_rateAdmin) {
rateAdmin = _rateAdmin;
generalAdmin = _generalAdmin;
boldToken = _boldToken;
for (uint256 i = 0; i < _collaterals.length; i++) {
collaterals.push(_collaterals[i]);
borrowerOperations.push(_collaterals[i].troveManager.borrowerOperations());
sortedTroves.push(_collaterals[i].troveManager.sortedTroves());
borrowerOperations[i].registerBatchManager(
_fees.minInterestRate,
_fees.maxInterestRate,
_collaterals[i].currentInterestRate,
_fees.annualManagementFee,
_fees.minInterestRateChangePeriod
);
}
}
modifier validAddress(address _address) {
if (_address == address(0)) revert InvalidAddress();
_;
}
modifier onlyRateAdmin() {
if (msg.sender != rateAdmin) revert NotRateAdmin();
_;
}
modifier onlyGeneralAdmin() {
if (msg.sender != generalAdmin) revert NotGeneralAdmin();
_;
}
modifier validCollateralIndex(uint256 colIndex) {
if (colIndex >= borrowerOperations.length) revert InvalidCollateralIndex();
_;
}
/**
* @notice Get the registered TroveManager for a given collateral type.
* @param _colIndex Index of the collateral type.
*/
function getTroveManager(uint256 _colIndex) external view validCollateralIndex(_colIndex) returns (ITroveManager) {
return collaterals[_colIndex].troveManager;
}
/**
* @notice Get the registered BorrowerOperations for a given collateral type.
* @param _colIndex Index of the collateral type.
*/
function getBorrowerOperations(uint256 _colIndex)
external
view
validCollateralIndex(_colIndex)
returns (IBorrowerOperations)
{
return borrowerOperations[_colIndex];
}
/**
* @notice Updates the annual interest rate for the specified collateral batch manager.
* @param _colIndex Index of the collateral type.
* @param _newAnnualInterestRate New interest rate (e18).
* @param _upperHint Upper hint for batch placement.
* @param _lowerHint Lower hint for batch placement.
* @param _maxUpfrontFee Maximum fee allowed for upfront operations.
*/
function setRate(
uint256 _colIndex,
uint128 _newAnnualInterestRate,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) external onlyRateAdmin validCollateralIndex(_colIndex) {
borrowerOperations[_colIndex].setBatchManagerAnnualInterestRate(
_newAnnualInterestRate, _upperHint, _lowerHint, _maxUpfrontFee
);
}
/**
* @notice Claims BOLD fees. Can optionally collect pending revenue.
* @param _collectPending Decide between claiming only settled or settled and pending fees.
*/
function claimFees(bool _collectPending) external onlyGeneralAdmin {
if (_collectPending) {
for (uint256 i = 0; i < borrowerOperations.length; i++) {
applyPendingDebt(borrowerOperations[i], sortedTroves[i], collaterals[i].troveManager);
}
}
boldToken.transfer(msg.sender, boldToken.balanceOf(address(this)));
}
/**
* @notice Read the BOLD balance either with or without pending fees.
* @param _collectPending Decide between reading only settled or settled and pending fees.
*/
function getBalance(bool _collectPending) external returns (uint256) {
if (_collectPending) {
for (uint256 i = 0; i < borrowerOperations.length; i++) {
applyPendingDebt(borrowerOperations[i], sortedTroves[i], collaterals[i].troveManager);
}
}
return boldToken.balanceOf(address(this));
}
/**
* @notice Update the rate admin address.
* @param _newRateAdmin The new address for the rate admin.
*/
function setRateAdmin(address _newRateAdmin) external onlyGeneralAdmin validAddress(_newRateAdmin) {
rateAdmin = _newRateAdmin;
}
/**
* @notice Update the fee admin address.
* @param _newGeneralAdmin The new address for the general admin.
*/
function setGeneralAdmin(address _newGeneralAdmin) external onlyGeneralAdmin validAddress(_newGeneralAdmin) {
generalAdmin = _newGeneralAdmin;
}
/**
* @notice Applies pending debt for a given borrower operations contract.
* @param _borrowerOperations BorrowerOperations contract for the given collateral.
* @param _sortedTroves SortedTroves contract for the given collateral.
* @param _troveManager TroveManager contract for the given collateral.
*/
function applyPendingDebt(
IBorrowerOperations _borrowerOperations,
ISortedTroves _sortedTroves,
ITroveManager _troveManager
) internal onlyGeneralAdmin {
(uint256 head,) = _sortedTroves.batches(BatchId.wrap(address(this)));
if (_troveManager.getTroveStatus(head) == ITroveManager.Status.active) {
_borrowerOperations.applyPendingDebt(head, 0, 0);
}
}
}
IBorrowerOperations.sol 173 lines
// 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";
// Common interface for the Borrower Operations.
interface IBorrowerOperations is ILiquityBase, IAddRemoveManagers {
function CCR() external view returns (uint256);
function MCR() external view returns (uint256);
function SCR() external view returns (uint256);
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;
function checkBatchManagerExists(address _batchMananger) external view returns (bool);
// -- individual delegation --
struct InterestIndividualDelegate {
address account;
uint128 minInterestRate;
uint128 maxInterestRate;
uint256 minInterestRateChangePeriod;
}
function getInterestIndividualDelegateOf(uint256 _troveId)
external
view
returns (InterestIndividualDelegate memory);
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;
function removeInterestIndividualDelegate(uint256 _troveId) external;
// -- batches --
struct InterestBatchManager {
uint128 minInterestRate;
uint128 maxInterestRate;
uint256 minInterestRateChangePeriod;
}
function registerBatchManager(
uint128 minInterestRate,
uint128 maxInterestRate,
uint128 currentInterestRate,
uint128 fee,
uint128 minInterestRateChangePeriod
) external;
function lowerBatchManagementFee(uint256 _newAnnualFee) external;
function setBatchManagerAnnualInterestRate(
uint128 _newAnnualInterestRate,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) external;
function interestBatchManagerOf(uint256 _troveId) external view returns (address);
function getInterestBatchManager(address _account) external view returns (InterestBatchManager memory);
function setInterestBatchManager(
uint256 _troveId,
address _newBatchManager,
uint256 _upperHint,
uint256 _lowerHint,
uint256 _maxUpfrontFee
) 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;
}
IBoldToken.sol 26 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sol";
import "openzeppelin-contracts/contracts/interfaces/IERC5267.sol";
interface IBoldToken is IERC20Metadata, IERC20Permit, IERC5267 {
function setBranchAddresses(
address _troveManagerAddress,
address _stabilityPoolAddress,
address _borrowerOperationsAddress,
address _activePoolAddress
) external;
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;
}
ISortedTroves.sol 54 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./ITroveManager.sol";
import {BatchId, BATCH_ID_ZERO} from "../Types/BatchId.sol";
interface ISortedTroves {
// -- 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);
}
ILiquityBase.sol 13 lines
// 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 getEntireSystemDebt() external view returns (uint256);
function getEntireSystemColl() external view returns (uint256);
}
IAddRemoveManagers.sol 11 lines
// 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);
}
IPriceFeed.sol 10 lines
// 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);
function setAddresses(address _borrowerOperationsAddress) external;
}
ITroveManager.sol 174 lines
// 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";
// Common interface for the Trove Manager.
interface ITroveManager is ILiquityBase {
enum Status {
nonExistent,
active,
closedByOwner,
closedByLiquidation,
zombie
}
function shutdownTime() external view returns (uint256);
function troveNFT() external view returns (ITroveNFT);
function stabilityPool() external view returns (IStabilityPool);
//function boldToken() external view returns (IBoldToken);
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 redeemCollateral(
address _sender,
uint256 _boldAmount,
uint256 _price,
uint256 _redemptionRate,
uint256 _maxIterations
) external returns (uint256 _redemeedAmount);
function shutdown() external;
function urgentRedemption(uint256 _boldAmount, uint256[] calldata _troveIds, uint256 _minCollateral) external;
function getUnbackedPortionPriceAndRedeemability() external returns (uint256, uint256, bool);
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;
// -- end of permissioned functions --
}
IWETH.sol 10 lines
// 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;
}
IERC20Metadata.sol 28 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @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);
}
IERC20Permit.sol 90 lines
// 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 IERC20Permit {
/**
* @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);
}
IERC5267.sol 28 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)
pragma solidity ^0.8.0;
interface IERC5267 {
/**
* @dev MAY be emitted to signal that the domain could have changed.
*/
event EIP712DomainChanged();
/**
* @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
* signature.
*/
function eip712Domain()
external
view
returns (
bytes1 fields,
string memory name,
string memory version,
uint256 chainId,
address verifyingContract,
bytes32 salt,
uint256[] memory extensions
);
}
BatchId.sol 25 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
type BatchId is address;
using {equals as ==, notEquals as !=, isZero, isNotZero} for BatchId global;
function equals(BatchId a, BatchId b) pure returns (bool) {
return BatchId.unwrap(a) == BatchId.unwrap(b);
}
function notEquals(BatchId a, BatchId b) pure returns (bool) {
return !(a == b);
}
function isZero(BatchId x) pure returns (bool) {
return x == BATCH_ID_ZERO;
}
function isNotZero(BatchId x) pure returns (bool) {
return !x.isZero();
}
BatchId constant BATCH_ID_ZERO = BatchId.wrap(address(0));
IActivePool.sol 46 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IInterestRouter.sol";
import "./IBoldRewardsReceiver.sol";
import "../Types/TroveChange.sol";
interface IActivePool {
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;
}
IDefaultPool.sol 16 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IDefaultPool {
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;
}
ITroveNFT.sol 12 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "./ITroveManager.sol";
interface ITroveNFT is IERC721Metadata {
function mint(address _owner, uint256 _troveId) external;
function burn(uint256 _troveId) external;
}
IStabilityPool.sol 108 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IActivePool.sol";
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 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 epochToScaleToS(uint128 _epoch, uint128 _scale) external view returns (uint256);
function epochToScaleToB(uint128 _epoch, uint128 _scale) external view returns (uint256);
function P() external view returns (uint256);
function currentScale() external view returns (uint128);
function currentEpoch() external view returns (uint128);
}
LatestTroveData.sol 16 lines
// 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;
}
LatestBatchData.sol 17 lines
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
struct LatestBatchData {
uint256 entireDebtWithoutRedistribution;
uint256 entireCollWithoutRedistribution;
uint256 accruedInterest;
uint256 recordedDebt;
uint256 annualInterestRate;
uint256 weightedRecordedDebt;
uint256 annualManagementFee;
uint256 accruedManagementFee;
uint256 weightedRecordedBatchManagementFee;
uint256 lastDebtUpdateTime;
uint256 lastInterestRateAdjTime;
}
IERC20.sol 78 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
IInterestRouter.sol 7 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IInterestRouter {
// Currently the Interest Router doesn’t need any specific function
}
IBoldRewardsReceiver.sol 7 lines
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IBoldRewardsReceiver {
function triggerBoldRewards(uint256 _boldYield) external;
}
TroveChange.sol 18 lines
// 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;
}
IERC721Metadata.sol 27 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
IERC721.sol 132 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 tokenId) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
IERC165.sol 25 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
Read Contract
boldToken 0x630afce5 → address
borrowerOperations 0x5c670a58 → address
collaterals 0x24c1173b → address, uint128
generalAdmin 0xa551ca5f → address
getBorrowerOperations 0x9c85dc62 → address
getTroveManager 0x0bc17feb → address
rateAdmin 0xca69583b → address
sortedTroves 0x88b1410c → address
Write Contract 5 functions
These functions modify contract state and require a wallet transaction to execute.
claimFees 0x1d416165
bool _collectPending
getBalance 0xf6888d1d
bool _collectPending
returns: uint256
setGeneralAdmin 0xfc14ac70
address _newGeneralAdmin
setRate 0x8a1d85ac
uint256 _colIndex
uint128 _newAnnualInterestRate
uint256 _upperHint
uint256 _lowerHint
uint256 _maxUpfrontFee
setRateAdmin 0x2150cd56
address _newRateAdmin
Recent Transactions
No transactions found for this address