Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MultiTroveGetter
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; import "./Interfaces/ICollateralRegistry.sol"; import "./Interfaces/IMultiTroveGetter.sol"; import "./Types/BatchId.sol"; /* Helper contract for grabbing Trove data for the front end. Not part of the core Liquity system. */ contract MultiTroveGetter is IMultiTroveGetter { ICollateralRegistry public immutable collateralRegistry; constructor(ICollateralRegistry _collateralRegistry) { collateralRegistry = _collateralRegistry; } function getMultipleSortedTroves(uint256 _collIndex, int256 _startIdx, uint256 _count) external view returns (CombinedTroveData[] memory _troves) { ITroveManager troveManager = collateralRegistry.getTroveManager(_collIndex); require(address(troveManager) != address(0), "Invalid collateral index"); ISortedTroves sortedTroves = troveManager.sortedTroves(); assert(address(sortedTroves) != address(0)); uint256 startIdx; bool descend; if (_startIdx >= 0) { startIdx = uint256(_startIdx); descend = true; } else { startIdx = uint256(-(_startIdx + 1)); descend = false; } uint256 sortedTrovesSize = sortedTroves.getSize(); if (startIdx >= sortedTrovesSize) { _troves = new CombinedTroveData[](0); } else { uint256 maxCount = sortedTrovesSize - startIdx; if (_count > maxCount) { _count = maxCount; } if (descend) { _troves = _getMultipleSortedTrovesFromHead(troveManager, sortedTroves, startIdx, _count); } else { _troves = _getMultipleSortedTrovesFromTail(troveManager, sortedTroves, startIdx, _count); } } } function _getOneTrove(ITroveManager _troveManager, uint256 _id, CombinedTroveData memory _out) internal view { _out.id = _id; ( _out.debt, _out.coll, _out.stake, , // status , // arrayIndex _out.annualInterestRate, _out.lastDebtUpdateTime, _out.lastInterestRateAdjTime, _out.interestBatchManager, //_out.batchDebtShares, ) = _troveManager.Troves(_id); (_out.snapshotETH, _out.snapshotBoldDebt) = _troveManager.rewardSnapshots(_id); } function _getMultipleSortedTrovesFromHead( ITroveManager _troveManager, ISortedTroves _sortedTroves, uint256 _startIdx, uint256 _count ) internal view returns (CombinedTroveData[] memory _troves) { uint256 currentTroveId = _sortedTroves.getFirst(); for (uint256 idx = 0; idx < _startIdx; ++idx) { currentTroveId = _sortedTroves.getNext(currentTroveId); } _troves = new CombinedTroveData[](_count); for (uint256 idx = 0; idx < _count; ++idx) { _getOneTrove(_troveManager, currentTroveId, _troves[idx]); currentTroveId = _sortedTroves.getNext(currentTroveId); } } function _getMultipleSortedTrovesFromTail( ITroveManager _troveManager, ISortedTroves _sortedTroves, uint256 _startIdx, uint256 _count ) internal view returns (CombinedTroveData[] memory _troves) { uint256 currentTroveId = _sortedTroves.getLast(); for (uint256 idx = 0; idx < _startIdx; ++idx) { currentTroveId = _sortedTroves.getPrev(currentTroveId); } _troves = new CombinedTroveData[](_count); for (uint256 idx = 0; idx < _count; ++idx) { _getOneTrove(_troveManager, currentTroveId, _troves[idx]); currentTroveId = _sortedTroves.getPrev(currentTroveId); } } function getDebtPerInterestRateAscending(uint256 _collIndex, uint256 _startId, uint256 _maxIterations) external view returns (DebtPerInterestRate[] memory data, uint256 currId) { ITroveManager troveManager = collateralRegistry.getTroveManager(_collIndex); require(address(troveManager) != address(0), "Invalid collateral index"); ISortedTroves sortedTroves = troveManager.sortedTroves(); assert(address(sortedTroves) != address(0)); data = new DebtPerInterestRate[](_maxIterations); currId = sortedTroves.getPrev(_startId); for (uint256 i = 0; i < _maxIterations; ++i) { if (currId == 0) break; (, uint256 prevId, BatchId interestBatchManager,) = sortedTroves.nodes(currId); LatestTroveData memory trove = troveManager.getLatestTroveData(currId); data[i].interestBatchManager = BatchId.unwrap(interestBatchManager); data[i].interestRate = trove.annualInterestRate; data[i].debt = trove.entireDebt; currId = prevId; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import "./IBoldToken.sol"; import "./ITroveManager.sol"; interface ICollateralRegistry { 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 getRedemptionRate() external view returns (uint256); function getRedemptionRateWithDecay() 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMultiTroveGetter { struct CombinedTroveData { uint256 id; uint256 debt; uint256 coll; uint256 stake; uint256 annualInterestRate; uint256 lastDebtUpdateTime; uint256 lastInterestRateAdjTime; address interestBatchManager; uint256 batchDebtShares; uint256 batchCollShares; 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); }
// 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));
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; import {IERC20} from "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IERC20Metadata} from "openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {IERC5267} from "openzeppelin-contracts/contracts/interfaces/IERC5267.sol"; interface IBoldToken is IERC20Metadata, 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; }
// 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 -- }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol) pragma solidity ^0.8.20; 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 ); }
// 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); }
// 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; }
// 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; }
// 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); }
// 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); }
// 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; }
// 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; }
// 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; }
// 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; }
// 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; import {IERC721} from "../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); }
// 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); }
// 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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IBoldRewardsReceiver { function triggerBoldRewards(uint256 _boldYield) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IInterestRouter { // Currently the Interest Router doesn’t need any specific function }
// 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC-721 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 ERC-721 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 ERC-721 * 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 address zero. * * 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC 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); }
{ "remappings": [ "@chimera/=lib/V2-gov/lib/chimera/src/", "@ensdomains/=lib/V2-gov/lib/v4-core/node_modules/@ensdomains/", "@openzeppelin/=lib/V2-gov/lib/v4-core/lib/openzeppelin-contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "Solady/=lib/Solady/src/", "V2-gov/=lib/V2-gov/", "chimera/=lib/V2-gov/lib/chimera/src/", "ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/", "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/", "forge-gas-snapshot/=lib/V2-gov/lib/v4-core/lib/forge-gas-snapshot/src/", "forge-std/=lib/forge-std/src/", "halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/", "hardhat/=lib/V2-gov/lib/v4-core/node_modules/hardhat/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin/=lib/V2-gov/lib/openzeppelin-contracts/", "solmate/=lib/V2-gov/lib/v4-core/lib/solmate/src/", "v4-core/=lib/V2-gov/lib/v4-core/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
[{"inputs":[{"internalType":"contract ICollateralRegistry","name":"_collateralRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"collateralRegistry","outputs":[{"internalType":"contract ICollateralRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collIndex","type":"uint256"},{"internalType":"uint256","name":"_startId","type":"uint256"},{"internalType":"uint256","name":"_maxIterations","type":"uint256"}],"name":"getDebtPerInterestRateAscending","outputs":[{"components":[{"internalType":"address","name":"interestBatchManager","type":"address"},{"internalType":"uint256","name":"interestRate","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"}],"internalType":"struct IMultiTroveGetter.DebtPerInterestRate[]","name":"data","type":"tuple[]"},{"internalType":"uint256","name":"currId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collIndex","type":"uint256"},{"internalType":"int256","name":"_startIdx","type":"int256"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"getMultipleSortedTroves","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"coll","type":"uint256"},{"internalType":"uint256","name":"stake","type":"uint256"},{"internalType":"uint256","name":"annualInterestRate","type":"uint256"},{"internalType":"uint256","name":"lastDebtUpdateTime","type":"uint256"},{"internalType":"uint256","name":"lastInterestRateAdjTime","type":"uint256"},{"internalType":"address","name":"interestBatchManager","type":"address"},{"internalType":"uint256","name":"batchDebtShares","type":"uint256"},{"internalType":"uint256","name":"batchCollShares","type":"uint256"},{"internalType":"uint256","name":"snapshotETH","type":"uint256"},{"internalType":"uint256","name":"snapshotBoldDebt","type":"uint256"}],"internalType":"struct IMultiTroveGetter.CombinedTroveData[]","name":"_troves","type":"tuple[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561000f575f80fd5b5060405161112238038061112283398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f80fd5b81516001600160a01b0381168114610065575f80fd5b9392505050565b6080516110926100905f395f818160920152818160ef015261034e01526110925ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c806327addfca14610043578063d1a4629c1461006c578063d330fadd1461008d575b5f80fd5b610056610051366004610c2e565b6100cc565b6040516100639190610c57565b60405180910390f35b61007f61007a366004610c2e565b610348565b604051610063929190610d18565b6100b47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610063565b604051630bc17feb60e01b8152600481018490526060905f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630bc17feb90602401602060405180830381865afa158015610134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101589190610d9a565b90506001600160a01b0381166101b05760405162461bcd60e51b8152602060048201526018602482015277092dcecc2d8d2c840c6ded8d8c2e8cae4c2d840d2dcc8caf60431b60448201526064015b60405180910390fd5b5f816001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102119190610d9a565b90506001600160a01b03811661022957610229610dbc565b5f805f871261023d57508590506001610257565b610248876001610de4565b61025190610e0b565b91505f90505b5f836001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610294573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b89190610e25565b90508083106102f957604080515f80825260208201909252906102f1565b6102de610bd0565b8152602001906001900390816102d65790505b50955061033c565b5f6103048483610e50565b905080881115610312578097505b821561032b576103248686868b610704565b965061033a565b6103378686868b6108e3565b96505b505b50505050509392505050565b60605f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630bc17feb876040518263ffffffff1660e01b815260040161039a91815260200190565b602060405180830381865afa1580156103b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d99190610d9a565b90506001600160a01b03811661042c5760405162461bcd60e51b8152602060048201526018602482015277092dcecc2d8d2c840c6ded8d8c2e8cae4c2d840d2dcc8caf60431b60448201526064016101a7565b5f816001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa158015610469573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048d9190610d9a565b90506001600160a01b0381166104a5576104a5610dbc565b8467ffffffffffffffff8111156104be576104be610e3c565b60405190808252806020026020018201604052801561051957816020015b61050660405180606001604052805f6001600160a01b031681526020015f81526020015f81525090565b8152602001906001900390816104dc5790505b5060405163040de97d60e21b8152600481018890529094506001600160a01b03821690631037a5f490602401602060405180830381865afa158015610560573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105849190610e25565b92505f5b858110156106f95783156106f9576040516238a78560e71b8152600481018590525f9081906001600160a01b03851690631c53c28090602401608060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190610e69565b50604051632ab4fd0160e21b8152600481018a905291945092505f91506001600160a01b0387169063aad3f4049060240161014060405180830381865afa15801561064d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106719190610eeb565b90508188858151811061068657610686610f70565b60209081029190910101516001600160a01b03909116905260c081015188518990869081106106b7576106b7610f70565b60200260200101516020018181525050805f01518885815181106106dd576106dd610f70565b6020908102919091010151604001525090945050600101610588565b505050935093915050565b60605f846001600160a01b0316631e2231436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107679190610e25565b90505f5b848110156107e4576040516307aba33d60e01b8152600481018390526001600160a01b038716906307aba33d90602401602060405180830381865afa1580156107b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107da9190610e25565b915060010161076b565b508267ffffffffffffffff8111156107fe576107fe610e3c565b60405190808252806020026020018201604052801561083757816020015b610824610bd0565b81526020019060019003908161081c5790505b5091505f5b838110156108d957610868878385848151811061085b5761085b610f70565b6020026020010151610aab565b6040516307aba33d60e01b8152600481018390526001600160a01b038716906307aba33d90602401602060405180830381865afa1580156108ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cf9190610e25565b915060010161083c565b5050949350505050565b60605f846001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610922573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109469190610e25565b90505f5b848110156109c35760405163040de97d60e21b8152600481018390526001600160a01b03871690631037a5f490602401602060405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190610e25565b915060010161094a565b508267ffffffffffffffff8111156109dd576109dd610e3c565b604051908082528060200260200182016040528015610a1657816020015b610a03610bd0565b8152602001906001900390816109fb5790505b5091505f5b838110156108d957610a3a878385848151811061085b5761085b610f70565b60405163040de97d60e21b8152600481018390526001600160a01b03871690631037a5f490602401602060405180830381865afa158015610a7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa19190610e25565b9150600101610a1b565b818152604051632904486760e21b8152600481018390526001600160a01b0384169063a411219c9060240161014060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b169190610fa0565b506001600160a01b0390811660e08b015260c08a019190915267ffffffffffffffff91821660a08a01529116608088015260608701939093525050604080850192909252602084019290925251630bac90b160e31b81526004810184905290841690635d648588906024016040805180830381865afa158015610b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbf919061103a565b610160830152610140909101525050565b6040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81525090565b5f805f60608486031215610c40575f80fd5b505081359360208301359350604090920135919050565b602080825282518282018190525f919060409081850190868401855b82811015610d0b5781518051855286810151878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e0808201516001600160a01b03169086015261010080820151908601526101208082015190860152610140808201519086015261016090810151908501526101809093019290850190600101610c73565b5091979650505050505050565b604080825283518282018190525f9190606090818501906020808901865b83811015610d6c57815180516001600160a01b031686528381015184870152870151878601529385019390820190600101610d36565b505050508093505050508260208301529392505050565b6001600160a01b0381168114610d97575f80fd5b50565b5f60208284031215610daa575f80fd5b8151610db581610d83565b9392505050565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715610e0357610e03610dd0565b505092915050565b5f600160ff1b8201610e1f57610e1f610dd0565b505f0390565b5f60208284031215610e35575f80fd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b81810381811115610e6357610e63610dd0565b92915050565b5f805f8060808587031215610e7c575f80fd5b84519350602085015192506040850151610e9581610d83565b60608601519092508015158114610eaa575f80fd5b939692955090935050565b604051610140810167ffffffffffffffff81118282101715610ee557634e487b7160e01b5f52604160045260245ffd5b60405290565b5f6101408284031215610efc575f80fd5b610f04610eb5565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152508091505092915050565b634e487b7160e01b5f52603260045260245ffd5b805167ffffffffffffffff81168114610f9b575f80fd5b919050565b5f805f805f805f805f806101408b8d031215610fba575f80fd5b8a51995060208b0151985060408b0151975060608b015160058110610fdd575f80fd5b9650610feb60808c01610f84565b9550610ff960a08c01610f84565b945061100760c08c01610f84565b935060e08b015192506101008b015161101f81610d83565b809250506101208b015190509295989b9194979a5092959850565b5f806040838503121561104b575f80fd5b50508051602090910151909290915056fea264697066735822122082083ff3ebf86bb67514f8acd67058ddc2c63b4250b5f2cade94d0c436bb5cae64736f6c634300081800330000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf
Deployed Bytecode
0x608060405234801561000f575f80fd5b506004361061003f575f3560e01c806327addfca14610043578063d1a4629c1461006c578063d330fadd1461008d575b5f80fd5b610056610051366004610c2e565b6100cc565b6040516100639190610c57565b60405180910390f35b61007f61007a366004610c2e565b610348565b604051610063929190610d18565b6100b47f0000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf81565b6040516001600160a01b039091168152602001610063565b604051630bc17feb60e01b8152600481018490526060905f906001600160a01b037f0000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf1690630bc17feb90602401602060405180830381865afa158015610134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101589190610d9a565b90506001600160a01b0381166101b05760405162461bcd60e51b8152602060048201526018602482015277092dcecc2d8d2c840c6ded8d8c2e8cae4c2d840d2dcc8caf60431b60448201526064015b60405180910390fd5b5f816001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102119190610d9a565b90506001600160a01b03811661022957610229610dbc565b5f805f871261023d57508590506001610257565b610248876001610de4565b61025190610e0b565b91505f90505b5f836001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610294573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102b89190610e25565b90508083106102f957604080515f80825260208201909252906102f1565b6102de610bd0565b8152602001906001900390816102d65790505b50955061033c565b5f6103048483610e50565b905080881115610312578097505b821561032b576103248686868b610704565b965061033a565b6103378686868b6108e3565b96505b505b50505050509392505050565b60605f807f0000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf6001600160a01b0316630bc17feb876040518263ffffffff1660e01b815260040161039a91815260200190565b602060405180830381865afa1580156103b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d99190610d9a565b90506001600160a01b03811661042c5760405162461bcd60e51b8152602060048201526018602482015277092dcecc2d8d2c840c6ded8d8c2e8cae4c2d840d2dcc8caf60431b60448201526064016101a7565b5f816001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa158015610469573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048d9190610d9a565b90506001600160a01b0381166104a5576104a5610dbc565b8467ffffffffffffffff8111156104be576104be610e3c565b60405190808252806020026020018201604052801561051957816020015b61050660405180606001604052805f6001600160a01b031681526020015f81526020015f81525090565b8152602001906001900390816104dc5790505b5060405163040de97d60e21b8152600481018890529094506001600160a01b03821690631037a5f490602401602060405180830381865afa158015610560573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105849190610e25565b92505f5b858110156106f95783156106f9576040516238a78560e71b8152600481018590525f9081906001600160a01b03851690631c53c28090602401608060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190610e69565b50604051632ab4fd0160e21b8152600481018a905291945092505f91506001600160a01b0387169063aad3f4049060240161014060405180830381865afa15801561064d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106719190610eeb565b90508188858151811061068657610686610f70565b60209081029190910101516001600160a01b03909116905260c081015188518990869081106106b7576106b7610f70565b60200260200101516020018181525050805f01518885815181106106dd576106dd610f70565b6020908102919091010151604001525090945050600101610588565b505050935093915050565b60605f846001600160a01b0316631e2231436040518163ffffffff1660e01b8152600401602060405180830381865afa158015610743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107679190610e25565b90505f5b848110156107e4576040516307aba33d60e01b8152600481018390526001600160a01b038716906307aba33d90602401602060405180830381865afa1580156107b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107da9190610e25565b915060010161076b565b508267ffffffffffffffff8111156107fe576107fe610e3c565b60405190808252806020026020018201604052801561083757816020015b610824610bd0565b81526020019060019003908161081c5790505b5091505f5b838110156108d957610868878385848151811061085b5761085b610f70565b6020026020010151610aab565b6040516307aba33d60e01b8152600481018390526001600160a01b038716906307aba33d90602401602060405180830381865afa1580156108ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108cf9190610e25565b915060010161083c565b5050949350505050565b60605f846001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610922573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109469190610e25565b90505f5b848110156109c35760405163040de97d60e21b8152600481018390526001600160a01b03871690631037a5f490602401602060405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190610e25565b915060010161094a565b508267ffffffffffffffff8111156109dd576109dd610e3c565b604051908082528060200260200182016040528015610a1657816020015b610a03610bd0565b8152602001906001900390816109fb5790505b5091505f5b838110156108d957610a3a878385848151811061085b5761085b610f70565b60405163040de97d60e21b8152600481018390526001600160a01b03871690631037a5f490602401602060405180830381865afa158015610a7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa19190610e25565b9150600101610a1b565b818152604051632904486760e21b8152600481018390526001600160a01b0384169063a411219c9060240161014060405180830381865afa158015610af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b169190610fa0565b506001600160a01b0390811660e08b015260c08a019190915267ffffffffffffffff91821660a08a01529116608088015260608701939093525050604080850192909252602084019290925251630bac90b160e31b81526004810184905290841690635d648588906024016040805180830381865afa158015610b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbf919061103a565b610160830152610140909101525050565b6040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81525090565b5f805f60608486031215610c40575f80fd5b505081359360208301359350604090920135919050565b602080825282518282018190525f919060409081850190868401855b82811015610d0b5781518051855286810151878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e0808201516001600160a01b03169086015261010080820151908601526101208082015190860152610140808201519086015261016090810151908501526101809093019290850190600101610c73565b5091979650505050505050565b604080825283518282018190525f9190606090818501906020808901865b83811015610d6c57815180516001600160a01b031686528381015184870152870151878601529385019390820190600101610d36565b505050508093505050508260208301529392505050565b6001600160a01b0381168114610d97575f80fd5b50565b5f60208284031215610daa575f80fd5b8151610db581610d83565b9392505050565b634e487b7160e01b5f52600160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018281125f831280158216821582161715610e0357610e03610dd0565b505092915050565b5f600160ff1b8201610e1f57610e1f610dd0565b505f0390565b5f60208284031215610e35575f80fd5b5051919050565b634e487b7160e01b5f52604160045260245ffd5b81810381811115610e6357610e63610dd0565b92915050565b5f805f8060808587031215610e7c575f80fd5b84519350602085015192506040850151610e9581610d83565b60608601519092508015158114610eaa575f80fd5b939692955090935050565b604051610140810167ffffffffffffffff81118282101715610ee557634e487b7160e01b5f52604160045260245ffd5b60405290565b5f6101408284031215610efc575f80fd5b610f04610eb5565b825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152508091505092915050565b634e487b7160e01b5f52603260045260245ffd5b805167ffffffffffffffff81168114610f9b575f80fd5b919050565b5f805f805f805f805f806101408b8d031215610fba575f80fd5b8a51995060208b0151985060408b0151975060608b015160058110610fdd575f80fd5b9650610feb60808c01610f84565b9550610ff960a08c01610f84565b945061100760c08c01610f84565b935060e08b015192506101008b015161101f81610d83565b809250506101208b015190509295989b9194979a5092959850565b5f806040838503121561104b575f80fd5b50508051602090910151909290915056fea264697066735822122082083ff3ebf86bb67514f8acd67058ddc2c63b4250b5f2cade94d0c436bb5cae64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf
-----Decoded View---------------
Arg [0] : _collateralRegistry (address): 0x2bd758d77d0cfD4060C751D9Bc2ae575595a21Bf
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002bd758d77d0cfd4060c751d9bc2ae575595a21bf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.