Overview
ETH Balance
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 10,637 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Delegate App... | 22022448 | 11 days ago | IN | 0 ETH | 0.00003662 | ||||
Adjust Trove | 21672465 | 60 days ago | IN | 0 ETH | 0.00857907 | ||||
Adjust Trove | 21672324 | 60 days ago | IN | 0 ETH | 0.01069288 | ||||
Close Trove | 21615645 | 68 days ago | IN | 0 ETH | 0.01341332 | ||||
Set Delegate App... | 21587978 | 72 days ago | IN | 0 ETH | 0.00088095 | ||||
Close Trove | 21587366 | 72 days ago | IN | 0 ETH | 0.01072947 | ||||
Adjust Trove | 21587347 | 72 days ago | IN | 0 ETH | 0.01010425 | ||||
Adjust Trove | 21587337 | 72 days ago | IN | 0 ETH | 0.01102143 | ||||
Adjust Trove | 21573050 | 74 days ago | IN | 0 ETH | 0.01055647 | ||||
Set Delegate App... | 21570576 | 74 days ago | IN | 0 ETH | 0.00030882 | ||||
Set Delegate App... | 21567748 | 75 days ago | IN | 0 ETH | 0.00088592 | ||||
Set Delegate App... | 21567502 | 75 days ago | IN | 0 ETH | 0.00122517 | ||||
Set Delegate App... | 21565536 | 75 days ago | IN | 0 ETH | 0.00052052 | ||||
Adjust Trove | 21562587 | 75 days ago | IN | 0 ETH | 0.00533249 | ||||
Set Delegate App... | 21562574 | 75 days ago | IN | 0 ETH | 0.00037522 | ||||
Adjust Trove | 21562562 | 75 days ago | IN | 0 ETH | 0.00450444 | ||||
Adjust Trove | 21562558 | 75 days ago | IN | 0 ETH | 0.00439933 | ||||
Set Delegate App... | 21562382 | 75 days ago | IN | 0 ETH | 0.00030803 | ||||
Set Delegate App... | 21561328 | 76 days ago | IN | 0 ETH | 0.0004713 | ||||
Adjust Trove | 21554165 | 77 days ago | IN | 0 ETH | 0.00465996 | ||||
Adjust Trove | 21554047 | 77 days ago | IN | 0 ETH | 0.00530623 | ||||
Close Trove | 21553996 | 77 days ago | IN | 0 ETH | 0.00522069 | ||||
Adjust Trove | 21553982 | 77 days ago | IN | 0 ETH | 0.00576809 | ||||
Adjust Trove | 21553959 | 77 days ago | IN | 0 ETH | 0.00540561 | ||||
Adjust Trove | 21553955 | 77 days ago | IN | 0 ETH | 0.00542976 |
View more zero value Internal Transactions in Advanced View mode
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import "SafeERC20.sol"; import "IERC20.sol"; import "ITroveManager.sol"; import "IDebtToken.sol"; import "PrismaBase.sol"; import "PrismaMath.sol"; import "PrismaOwnable.sol"; import "DelegatedOps.sol"; /** @title Prisma Borrower Operations @notice Based on Liquity's `BorrowerOperations` https://github.com/liquity/dev/blob/main/packages/contracts/contracts/BorrowerOperations.sol Prisma's implementation is modified to support multiple collaterals. There is a 1:n relationship between `BorrowerOperations` and each `TroveManager` / `SortedTroves` pair. */ contract BorrowerOperations is PrismaBase, PrismaOwnable, DelegatedOps { using SafeERC20 for IERC20; IDebtToken public immutable debtToken; address public immutable factory; uint256 public minNetDebt; mapping(ITroveManager => TroveManagerData) public troveManagersData; ITroveManager[] internal _troveManagers; struct TroveManagerData { IERC20 collateralToken; uint16 index; } struct SystemBalances { uint256[] collaterals; uint256[] debts; uint256[] prices; } struct LocalVariables_adjustTrove { uint256 price; uint256 totalPricedCollateral; uint256 totalDebt; uint256 collChange; uint256 netDebtChange; bool isCollIncrease; uint256 debt; uint256 coll; uint256 newDebt; uint256 newColl; uint256 stake; uint256 debtChange; address account; uint256 MCR; } struct LocalVariables_openTrove { uint256 price; uint256 totalPricedCollateral; uint256 totalDebt; uint256 netDebt; uint256 compositeDebt; uint256 ICR; uint256 NICR; uint256 stake; uint256 arrayIndex; } enum BorrowerOperation { openTrove, closeTrove, adjustTrove } event TroveUpdated( address indexed _borrower, uint256 _debt, uint256 _coll, uint256 stake, BorrowerOperation operation ); event TroveCreated(address indexed _borrower, uint256 arrayIndex); event TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 stake, uint8 operation); event BorrowingFeePaid(address indexed borrower, uint256 amount); event CollateralConfigured(ITroveManager troveManager, IERC20 collateralToken); event TroveManagerRemoved(ITroveManager troveManager); constructor( address _prismaCore, address _debtTokenAddress, address _factory, uint256 _minNetDebt, uint256 _gasCompensation ) PrismaOwnable(_prismaCore) PrismaBase(_gasCompensation) { debtToken = IDebtToken(_debtTokenAddress); factory = _factory; _setMinNetDebt(_minNetDebt); } function setMinNetDebt(uint256 _minNetDebt) public onlyOwner { _setMinNetDebt(_minNetDebt); } function _setMinNetDebt(uint256 _minNetDebt) internal { require(_minNetDebt > 0); minNetDebt = _minNetDebt; } function configureCollateral(ITroveManager troveManager, IERC20 collateralToken) external { require(msg.sender == factory, "!factory"); troveManagersData[troveManager] = TroveManagerData(collateralToken, uint16(_troveManagers.length)); _troveManagers.push(troveManager); emit CollateralConfigured(troveManager, collateralToken); } function removeTroveManager(ITroveManager troveManager) external { TroveManagerData memory tmData = troveManagersData[troveManager]; require( address(tmData.collateralToken) != address(0) && troveManager.sunsetting() && troveManager.getEntireSystemDebt() == 0, "Trove Manager cannot be removed" ); delete troveManagersData[troveManager]; uint256 lastIndex = _troveManagers.length - 1; if (tmData.index < lastIndex) { ITroveManager lastTm = _troveManagers[lastIndex]; _troveManagers[tmData.index] = lastTm; troveManagersData[lastTm].index = tmData.index; } _troveManagers.pop(); emit TroveManagerRemoved(troveManager); } /** @notice Get the global total collateral ratio @dev Not a view because fetching from the oracle is state changing. Can still be accessed as a view from within the UX. */ function getTCR() external returns (uint256 globalTotalCollateralRatio) { SystemBalances memory balances = fetchBalances(); (globalTotalCollateralRatio, , ) = _getTCRData(balances); return globalTotalCollateralRatio; } /** @notice Get total collateral and debt balances for all active collaterals, as well as the current collateral prices @dev Not a view because fetching from the oracle is state changing. Can still be accessed as a view from within the UX. */ function fetchBalances() public returns (SystemBalances memory balances) { uint256 loopEnd = _troveManagers.length; balances = SystemBalances({ collaterals: new uint256[](loopEnd), debts: new uint256[](loopEnd), prices: new uint256[](loopEnd) }); for (uint256 i; i < loopEnd; ) { ITroveManager troveManager = _troveManagers[i]; (uint256 collateral, uint256 debt, uint256 price) = troveManager.getEntireSystemBalances(); balances.collaterals[i] = collateral; balances.debts[i] = debt; balances.prices[i] = price; unchecked { ++i; } } } function checkRecoveryMode(uint256 TCR) public pure returns (bool) { return TCR < CCR; } function getCompositeDebt(uint256 _debt) external view returns (uint256) { return _getCompositeDebt(_debt); } // --- Borrower Trove Operations --- function openTrove( ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _collateralAmount, uint256 _debtAmount, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { require(!PRISMA_CORE.paused(), "Deposits are paused"); IERC20 collateralToken; LocalVariables_openTrove memory vars; bool isRecoveryMode; ( collateralToken, vars.price, vars.totalPricedCollateral, vars.totalDebt, isRecoveryMode ) = _getCollateralAndTCRData(troveManager); _requireValidMaxFeePercentage(_maxFeePercentage); vars.netDebt = _debtAmount; if (!isRecoveryMode) { vars.netDebt = vars.netDebt + _triggerBorrowingFee(troveManager, account, _maxFeePercentage, _debtAmount); } _requireAtLeastMinNetDebt(vars.netDebt); // ICR is based on the composite debt, i.e. the requested Debt amount + Debt borrowing fee + Debt gas comp. vars.compositeDebt = _getCompositeDebt(vars.netDebt); vars.ICR = PrismaMath._computeCR(_collateralAmount, vars.compositeDebt, vars.price); vars.NICR = PrismaMath._computeNominalCR(_collateralAmount, vars.compositeDebt); if (isRecoveryMode) { _requireICRisAboveCCR(vars.ICR); } else { _requireICRisAboveMCR(vars.ICR, troveManager.MCR()); uint256 newTCR = _getNewTCRFromTroveChange( vars.totalPricedCollateral, vars.totalDebt, _collateralAmount * vars.price, true, vars.compositeDebt, true ); // bools: coll increase, debt increase _requireNewTCRisAboveCCR(newTCR); } // Create the trove (vars.stake, vars.arrayIndex) = troveManager.openTrove( account, _collateralAmount, vars.compositeDebt, vars.NICR, _upperHint, _lowerHint, isRecoveryMode ); emit TroveCreated(account, vars.arrayIndex); // Move the collateral to the Trove Manager collateralToken.safeTransferFrom(msg.sender, address(troveManager), _collateralAmount); // and mint the DebtAmount to the caller and gas compensation for Gas Pool debtToken.mintWithGasCompensation(msg.sender, _debtAmount); emit TroveUpdated(account, vars.compositeDebt, _collateralAmount, vars.stake, BorrowerOperation.openTrove); } // Send collateral to a trove function addColl( ITroveManager troveManager, address account, uint256 _collateralAmount, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { require(!PRISMA_CORE.paused(), "Trove adjustments are paused"); _adjustTrove(troveManager, account, 0, _collateralAmount, 0, 0, false, _upperHint, _lowerHint); } // Withdraw collateral from a trove function withdrawColl( ITroveManager troveManager, address account, uint256 _collWithdrawal, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { _adjustTrove(troveManager, account, 0, 0, _collWithdrawal, 0, false, _upperHint, _lowerHint); } // Withdraw Debt tokens from a trove: mint new Debt tokens to the owner, and increase the trove's debt accordingly function withdrawDebt( ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _debtAmount, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { require(!PRISMA_CORE.paused(), "Withdrawals are paused"); _adjustTrove(troveManager, account, _maxFeePercentage, 0, 0, _debtAmount, true, _upperHint, _lowerHint); } // Repay Debt tokens to a Trove: Burn the repaid Debt tokens, and reduce the trove's debt accordingly function repayDebt( ITroveManager troveManager, address account, uint256 _debtAmount, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { _adjustTrove(troveManager, account, 0, 0, 0, _debtAmount, false, _upperHint, _lowerHint); } function adjustTrove( ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _collDeposit, uint256 _collWithdrawal, uint256 _debtChange, bool _isDebtIncrease, address _upperHint, address _lowerHint ) external callerOrDelegated(account) { require((_collDeposit == 0 && !_isDebtIncrease) || !PRISMA_CORE.paused(), "Trove adjustments are paused"); require(_collDeposit == 0 || _collWithdrawal == 0, "BorrowerOperations: Cannot withdraw and add coll"); _adjustTrove( troveManager, account, _maxFeePercentage, _collDeposit, _collWithdrawal, _debtChange, _isDebtIncrease, _upperHint, _lowerHint ); } function _adjustTrove( ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _collDeposit, uint256 _collWithdrawal, uint256 _debtChange, bool _isDebtIncrease, address _upperHint, address _lowerHint ) internal { require( _collDeposit != 0 || _collWithdrawal != 0 || _debtChange != 0, "BorrowerOps: There must be either a collateral change or a debt change" ); IERC20 collateralToken; LocalVariables_adjustTrove memory vars; bool isRecoveryMode; ( collateralToken, vars.price, vars.totalPricedCollateral, vars.totalDebt, isRecoveryMode ) = _getCollateralAndTCRData(troveManager); (vars.coll, vars.debt) = troveManager.applyPendingRewards(account); // Get the collChange based on whether or not collateral was sent in the transaction (vars.collChange, vars.isCollIncrease) = _getCollChange(_collDeposit, _collWithdrawal); vars.netDebtChange = _debtChange; vars.debtChange = _debtChange; vars.account = account; vars.MCR = troveManager.MCR(); if (_isDebtIncrease) { require(_debtChange > 0, "BorrowerOps: Debt increase requires non-zero debtChange"); _requireValidMaxFeePercentage(_maxFeePercentage); if (!isRecoveryMode) { // If the adjustment incorporates a debt increase and system is in Normal Mode, trigger a borrowing fee vars.netDebtChange += _triggerBorrowingFee(troveManager, msg.sender, _maxFeePercentage, _debtChange); } } // Calculate old and new ICRs and check if adjustment satisfies all conditions for the current system mode _requireValidAdjustmentInCurrentMode( vars.totalPricedCollateral, vars.totalDebt, isRecoveryMode, _collWithdrawal, _isDebtIncrease, vars ); // When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough Debt if (!_isDebtIncrease && _debtChange > 0) { _requireAtLeastMinNetDebt(_getNetDebt(vars.debt) - vars.netDebtChange); } // If we are incrasing collateral, send tokens to the trove manager prior to adjusting the trove if (vars.isCollIncrease) collateralToken.safeTransferFrom(msg.sender, address(troveManager), vars.collChange); (vars.newColl, vars.newDebt, vars.stake) = troveManager.updateTroveFromAdjustment( isRecoveryMode, _isDebtIncrease, vars.debtChange, vars.netDebtChange, vars.isCollIncrease, vars.collChange, _upperHint, _lowerHint, vars.account, msg.sender ); emit TroveUpdated(vars.account, vars.newDebt, vars.newColl, vars.stake, BorrowerOperation.adjustTrove); } function closeTrove(ITroveManager troveManager, address account) external callerOrDelegated(account) { IERC20 collateralToken; uint256 price; bool isRecoveryMode; uint256 totalPricedCollateral; uint256 totalDebt; (collateralToken, price, totalPricedCollateral, totalDebt, isRecoveryMode) = _getCollateralAndTCRData( troveManager ); require(!isRecoveryMode, "BorrowerOps: Operation not permitted during Recovery Mode"); (uint256 coll, uint256 debt) = troveManager.applyPendingRewards(account); uint256 newTCR = _getNewTCRFromTroveChange(totalPricedCollateral, totalDebt, coll * price, false, debt, false); _requireNewTCRisAboveCCR(newTCR); troveManager.closeTrove(account, msg.sender, coll, debt); emit TroveUpdated(account, 0, 0, 0, BorrowerOperation.closeTrove); // Burn the repaid Debt from the user's balance and the gas compensation from the Gas Pool debtToken.burnWithGasCompensation(msg.sender, debt - DEBT_GAS_COMPENSATION); } // --- Helper functions --- function _triggerBorrowingFee( ITroveManager _troveManager, address _caller, uint256 _maxFeePercentage, uint256 _debtAmount ) internal returns (uint256) { uint256 debtFee = _troveManager.decayBaseRateAndGetBorrowingFee(_debtAmount); _requireUserAcceptsFee(debtFee, _debtAmount, _maxFeePercentage); debtToken.mint(PRISMA_CORE.feeReceiver(), debtFee); emit BorrowingFeePaid(_caller, debtFee); return debtFee; } function _getCollChange( uint256 _collReceived, uint256 _requestedCollWithdrawal ) internal pure returns (uint256 collChange, bool isCollIncrease) { if (_collReceived != 0) { collChange = _collReceived; isCollIncrease = true; } else { collChange = _requestedCollWithdrawal; } } function _requireValidAdjustmentInCurrentMode( uint256 totalPricedCollateral, uint256 totalDebt, bool _isRecoveryMode, uint256 _collWithdrawal, bool _isDebtIncrease, LocalVariables_adjustTrove memory _vars ) internal pure { /* *In Recovery Mode, only allow: * * - Pure collateral top-up * - Pure debt repayment * - Collateral top-up with debt repayment * - A debt increase combined with a collateral top-up which makes the ICR >= 150% and improves the ICR (and by extension improves the TCR). * * In Normal Mode, ensure: * * - The new ICR is above MCR * - The adjustment won't pull the TCR below CCR */ // Get the trove's old ICR before the adjustment uint256 oldICR = PrismaMath._computeCR(_vars.coll, _vars.debt, _vars.price); // Get the trove's new ICR after the adjustment uint256 newICR = _getNewICRFromTroveChange( _vars.coll, _vars.debt, _vars.collChange, _vars.isCollIncrease, _vars.netDebtChange, _isDebtIncrease, _vars.price ); if (_isRecoveryMode) { require(_collWithdrawal == 0, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode"); if (_isDebtIncrease) { _requireICRisAboveCCR(newICR); _requireNewICRisAboveOldICR(newICR, oldICR); } } else { // if Normal Mode _requireICRisAboveMCR(newICR, _vars.MCR); uint256 newTCR = _getNewTCRFromTroveChange( totalPricedCollateral, totalDebt, _vars.collChange * _vars.price, _vars.isCollIncrease, _vars.netDebtChange, _isDebtIncrease ); _requireNewTCRisAboveCCR(newTCR); } } function _requireICRisAboveMCR(uint256 _newICR, uint256 MCR) internal pure { require(_newICR >= MCR, "BorrowerOps: An operation that would result in ICR < MCR is not permitted"); } function _requireICRisAboveCCR(uint256 _newICR) internal pure { require(_newICR >= CCR, "BorrowerOps: Operation must leave trove with ICR >= CCR"); } function _requireNewICRisAboveOldICR(uint256 _newICR, uint256 _oldICR) internal pure { require(_newICR >= _oldICR, "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode"); } function _requireNewTCRisAboveCCR(uint256 _newTCR) internal pure { require(_newTCR >= CCR, "BorrowerOps: An operation that would result in TCR < CCR is not permitted"); } function _requireAtLeastMinNetDebt(uint256 _netDebt) internal view { require(_netDebt >= minNetDebt, "BorrowerOps: Trove's net debt must be greater than minimum"); } function _requireValidMaxFeePercentage(uint256 _maxFeePercentage) internal pure { require(_maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must less than or equal to 100%"); } // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewICRFromTroveChange( uint256 _coll, uint256 _debt, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease, uint256 _price ) internal pure returns (uint256) { (uint256 newColl, uint256 newDebt) = _getNewTroveAmounts( _coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease ); uint256 newICR = PrismaMath._computeCR(newColl, newDebt, _price); return newICR; } function _getNewTroveAmounts( uint256 _coll, uint256 _debt, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease ) internal pure returns (uint256, uint256) { uint256 newColl = _coll; uint256 newDebt = _debt; newColl = _isCollIncrease ? _coll + _collChange : _coll - _collChange; newDebt = _isDebtIncrease ? _debt + _debtChange : _debt - _debtChange; return (newColl, newDebt); } function _getNewTCRFromTroveChange( uint256 totalColl, uint256 totalDebt, uint256 _collChange, bool _isCollIncrease, uint256 _debtChange, bool _isDebtIncrease ) internal pure returns (uint256) { totalDebt = _isDebtIncrease ? totalDebt + _debtChange : totalDebt - _debtChange; totalColl = _isCollIncrease ? totalColl + _collChange : totalColl - _collChange; uint256 newTCR = PrismaMath._computeCR(totalColl, totalDebt); return newTCR; } function _getTCRData( SystemBalances memory balances ) internal pure returns (uint256 amount, uint256 totalPricedCollateral, uint256 totalDebt) { uint256 loopEnd = balances.collaterals.length; for (uint256 i; i < loopEnd; ) { totalPricedCollateral += (balances.collaterals[i] * balances.prices[i]); totalDebt += balances.debts[i]; unchecked { ++i; } } amount = PrismaMath._computeCR(totalPricedCollateral, totalDebt); return (amount, totalPricedCollateral, totalDebt); } function _getCollateralAndTCRData( ITroveManager troveManager ) internal returns ( IERC20 collateralToken, uint256 price, uint256 totalPricedCollateral, uint256 totalDebt, bool isRecoveryMode ) { TroveManagerData storage t = troveManagersData[troveManager]; uint256 index; (collateralToken, index) = (t.collateralToken, t.index); require(address(collateralToken) != address(0), "Collateral not enabled"); uint256 amount; SystemBalances memory balances = fetchBalances(); (amount, totalPricedCollateral, totalDebt) = _getTCRData(balances); isRecoveryMode = checkRecoveryMode(amount); return (collateralToken, balances.prices[index], totalPricedCollateral, totalDebt, isRecoveryMode); } function getGlobalSystemBalances() external returns (uint256 totalPricedCollateral, uint256 totalDebt) { SystemBalances memory balances = fetchBalances(); (, totalPricedCollateral, totalDebt) = _getTCRData(balances); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "IERC20.sol"; import "draft-IERC20Permit.sol"; import "Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-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. */ 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]. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ITroveManager { event BaseRateUpdated(uint256 _baseRate); event CollateralSent(address _to, uint256 _amount); event LTermsUpdated(uint256 _L_collateral, uint256 _L_debt); event LastFeeOpTimeUpdated(uint256 _lastFeeOpTime); event Redemption( uint256 _attemptedDebtAmount, uint256 _actualDebtAmount, uint256 _collateralSent, uint256 _collateralFee ); event RewardClaimed(address indexed account, address indexed recipient, uint256 claimed); event SystemSnapshotsUpdated(uint256 _totalStakesSnapshot, uint256 _totalCollateralSnapshot); event TotalStakesUpdated(uint256 _newTotalStakes); event TroveIndexUpdated(address _borrower, uint256 _newIndex); event TroveSnapshotsUpdated(uint256 _L_collateral, uint256 _L_debt); event TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 _stake, uint8 _operation); function addCollateralSurplus(address borrower, uint256 collSurplus) external; function applyPendingRewards(address _borrower) external returns (uint256 coll, uint256 debt); function claimCollateral(address _receiver) external; function claimReward(address receiver) external returns (uint256); function closeTrove(address _borrower, address _receiver, uint256 collAmount, uint256 debtAmount) external; function closeTroveByLiquidation(address _borrower) external; function collectInterests() external; function decayBaseRateAndGetBorrowingFee(uint256 _debt) external returns (uint256); function decreaseDebtAndSendCollateral(address account, uint256 debt, uint256 coll) external; function fetchPrice() external returns (uint256); function finalizeLiquidation( address _liquidator, uint256 _debt, uint256 _coll, uint256 _collSurplus, uint256 _debtGasComp, uint256 _collGasComp ) external; function getEntireSystemBalances() external returns (uint256, uint256, uint256); function movePendingTroveRewardsToActiveBalances(uint256 _debt, uint256 _collateral) external; function notifyRegisteredId(uint256[] calldata _assignedIds) external returns (bool); function openTrove( address _borrower, uint256 _collateralAmount, uint256 _compositeDebt, uint256 NICR, address _upperHint, address _lowerHint, bool _isRecoveryMode ) external returns (uint256 stake, uint256 arrayIndex); function redeemCollateral( uint256 _debtAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint256 _partialRedemptionHintNICR, uint256 _maxIterations, uint256 _maxFeePercentage ) external; function setAddresses(address _priceFeedAddress, address _sortedTrovesAddress, address _collateralToken) external; function setParameters( uint256 _minuteDecayFactor, uint256 _redemptionFeeFloor, uint256 _maxRedemptionFee, uint256 _borrowingFeeFloor, uint256 _maxBorrowingFee, uint256 _interestRateInBPS, uint256 _maxSystemDebt, uint256 _MCR ) external; function setPaused(bool _paused) external; function setPriceFeed(address _priceFeedAddress) external; function startSunset() external; function updateBalances() external; function updateTroveFromAdjustment( bool _isRecoveryMode, bool _isDebtIncrease, uint256 _debtChange, uint256 _netDebtChange, bool _isCollIncrease, uint256 _collChange, address _upperHint, address _lowerHint, address _borrower, address _receiver ) external returns (uint256, uint256, uint256); function vaultClaimReward(address claimant, address) external returns (uint256); function BOOTSTRAP_PERIOD() external view returns (uint256); function CCR() external view returns (uint256); function DEBT_GAS_COMPENSATION() external view returns (uint256); function DECIMAL_PRECISION() external view returns (uint256); function L_collateral() external view returns (uint256); function L_debt() external view returns (uint256); function MAX_INTEREST_RATE_IN_BPS() external view returns (uint256); function MCR() external view returns (uint256); function PERCENT_DIVISOR() external view returns (uint256); function PRISMA_CORE() external view returns (address); function SUNSETTING_INTEREST_RATE() external view returns (uint256); function Troves( address ) external view returns ( uint256 debt, uint256 coll, uint256 stake, uint8 status, uint128 arrayIndex, uint256 activeInterestIndex ); function accountLatestMint(address) external view returns (uint32 amount, uint32 week, uint32 day); function activeInterestIndex() external view returns (uint256); function baseRate() external view returns (uint256); function borrowerOperationsAddress() external view returns (address); function borrowingFeeFloor() external view returns (uint256); function claimableReward(address account) external view returns (uint256); function collateralToken() external view returns (address); function dailyMintReward(uint256) external view returns (uint256); function debtToken() external view returns (address); function defaultedCollateral() external view returns (uint256); function defaultedDebt() external view returns (uint256); function emissionId() external view returns (uint16 debt, uint16 minting); function getBorrowingFee(uint256 _debt) external view returns (uint256); function getBorrowingFeeWithDecay(uint256 _debt) external view returns (uint256); function getBorrowingRate() external view returns (uint256); function getBorrowingRateWithDecay() external view returns (uint256); function getCurrentICR(address _borrower, uint256 _price) external view returns (uint256); function getEntireDebtAndColl( address _borrower ) external view returns (uint256 debt, uint256 coll, uint256 pendingDebtReward, uint256 pendingCollateralReward); function getEntireSystemColl() external view returns (uint256); function getEntireSystemDebt() external view returns (uint256); function getNominalICR(address _borrower) external view returns (uint256); function getPendingCollAndDebtRewards(address _borrower) external view returns (uint256, uint256); function getRedemptionFeeWithDecay(uint256 _collateralDrawn) external view returns (uint256); function getRedemptionRate() external view returns (uint256); function getRedemptionRateWithDecay() external view returns (uint256); function getTotalActiveCollateral() external view returns (uint256); function getTotalActiveDebt() external view returns (uint256); function getTotalMints(uint256 week) external view returns (uint32[7] memory); function getTroveCollAndDebt(address _borrower) external view returns (uint256 coll, uint256 debt); function getTroveFromTroveOwnersArray(uint256 _index) external view returns (address); function getTroveOwnersCount() external view returns (uint256); function getTroveStake(address _borrower) external view returns (uint256); function getTroveStatus(address _borrower) external view returns (uint256); function getWeek() external view returns (uint256 week); function getWeekAndDay() external view returns (uint256, uint256); function guardian() external view returns (address); function hasPendingRewards(address _borrower) external view returns (bool); function interestPayable() external view returns (uint256); function interestRate() external view returns (uint256); function lastActiveIndexUpdate() external view returns (uint256); function lastCollateralError_Redistribution() external view returns (uint256); function lastDebtError_Redistribution() external view returns (uint256); function lastFeeOperationTime() external view returns (uint256); function lastUpdate() external view returns (uint32); function liquidationManager() external view returns (address); function maxBorrowingFee() external view returns (uint256); function maxRedemptionFee() external view returns (uint256); function maxSystemDebt() external view returns (uint256); function minuteDecayFactor() external view returns (uint256); function owner() external view returns (address); function paused() external view returns (bool); function periodFinish() external view returns (uint32); function priceFeed() external view returns (address); function redemptionFeeFloor() external view returns (uint256); function rewardIntegral() external view returns (uint256); function rewardIntegralFor(address) external view returns (uint256); function rewardRate() external view returns (uint128); function rewardSnapshots(address) external view returns (uint256 collateral, uint256 debt); function sortedTroves() external view returns (address); function sunsetting() external view returns (bool); function surplusBalances(address) external view returns (uint256); function systemDeploymentTime() external view returns (uint256); function totalCollateralSnapshot() external view returns (uint256); function totalStakes() external view returns (uint256); function totalStakesSnapshot() external view returns (uint256); function vault() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IDebtToken { event Approval(address indexed owner, address indexed spender, uint256 value); event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint256 _amount); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint256 _amount); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint256 _minDstGas); event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); event Transfer(address indexed from, address indexed to, uint256 value); function approve(address spender, uint256 amount) external returns (bool); function burn(address _account, uint256 _amount) external; function burnWithGasCompensation(address _account, uint256 _amount) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); function enableTroveManager(address _troveManager) external; function flashLoan(address receiver, address token, uint256 amount, bytes calldata data) external returns (bool); function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; function mint(address _account, uint256 _amount) external; function mintWithGasCompensation(address _account, uint256 _amount) external returns (bool); function nonblockingLzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function renounceOwnership() external; function returnFromPool(address _poolAddress, address _receiver, uint256 _amount) external; function sendToSP(address _sender, uint256 _amount) external; function setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config) external; function setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint256 _minGas) external; function setPayloadSizeLimit(uint16 _dstChainId, uint256 _size) external; function setPrecrime(address _precrime) external; function setReceiveVersion(uint16 _version) external; function setSendVersion(uint16 _version) external; function setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external; function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external; function setUseCustomAdapterParams(bool _useCustomAdapterParams) external; function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function transferOwnership(address newOwner) external; function retryMessage( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external payable; function sendFrom( address _from, uint16 _dstChainId, bytes calldata _toAddress, uint256 _amount, address _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; function DEBT_GAS_COMPENSATION() external view returns (uint256); function DEFAULT_PAYLOAD_SIZE_LIMIT() external view returns (uint256); function FLASH_LOAN_FEE() external view returns (uint256); function NO_EXTRA_GAS() external view returns (uint256); function PT_SEND() external view returns (uint16); function allowance(address owner, address spender) external view returns (uint256); function balanceOf(address account) external view returns (uint256); function borrowerOperationsAddress() external view returns (address); function circulatingSupply() external view returns (uint256); function decimals() external view returns (uint8); function domainSeparator() external view returns (bytes32); function estimateSendFee( uint16 _dstChainId, bytes calldata _toAddress, uint256 _amount, bool _useZro, bytes calldata _adapterParams ) external view returns (uint256 nativeFee, uint256 zroFee); function factory() external view returns (address); function failedMessages(uint16, bytes calldata, uint64) external view returns (bytes32); function flashFee(address token, uint256 amount) external view returns (uint256); function gasPool() external view returns (address); function getConfig( uint16 _version, uint16 _chainId, address, uint256 _configType ) external view returns (bytes memory); function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory); function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); function lzEndpoint() external view returns (address); function maxFlashLoan(address token) external view returns (uint256); function minDstGasLookup(uint16, uint16) external view returns (uint256); function name() external view returns (string memory); function nonces(address owner) external view returns (uint256); function owner() external view returns (address); function payloadSizeLimitLookup(uint16) external view returns (uint256); function permitTypeHash() external view returns (bytes32); function precrime() external view returns (address); function stabilityPoolAddress() external view returns (address); function supportsInterface(bytes4 interfaceId) external view returns (bool); function symbol() external view returns (string memory); function token() external view returns (address); function totalSupply() external view returns (uint256); function troveManager(address) external view returns (bool); function trustedRemoteLookup(uint16) external view returns (bytes memory); function useCustomAdapterParams() external view returns (bool); function version() external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; /* * Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and * common functions. */ contract PrismaBase { uint256 public constant DECIMAL_PRECISION = 1e18; // Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered. uint256 public constant CCR = 1500000000000000000; // 150% // Amount of debt to be locked in gas pool on opening troves uint256 public immutable DEBT_GAS_COMPENSATION; uint256 public constant PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% constructor(uint256 _gasCompensation) { DEBT_GAS_COMPENSATION = _gasCompensation; } // --- Gas compensation functions --- // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation function _getCompositeDebt(uint256 _debt) internal view returns (uint256) { return _debt + DEBT_GAS_COMPENSATION; } function _getNetDebt(uint256 _debt) internal view returns (uint256) { return _debt - DEBT_GAS_COMPENSATION; } // Return the amount of collateral to be drawn from a trove's collateral and sent as gas compensation. function _getCollGasCompensation(uint256 _entireColl) internal pure returns (uint256) { return _entireColl / PERCENT_DIVISOR; } function _requireUserAcceptsFee(uint256 _fee, uint256 _amount, uint256 _maxFeePercentage) internal pure { uint256 feePercentage = (_fee * DECIMAL_PRECISION) / _amount; require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum"); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; library PrismaMath { uint256 internal constant DECIMAL_PRECISION = 1e18; /* Precision for Nominal ICR (independent of price). Rationale for the value: * * - Making it “too high” could lead to overflows. * - Making it “too low” could lead to an ICR equal to zero, due to truncation from Solidity floor division. * * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39, * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator. * */ uint256 internal constant NICR_PRECISION = 1e20; function _min(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a < _b) ? _a : _b; } function _max(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a >= _b) ? _a : _b; } /* * Multiply two decimal numbers and use normal rounding rules: * -round product up if 19'th mantissa digit >= 5 * -round product down if 19'th mantissa digit < 5 * * Used only inside the exponentiation, _decPow(). */ function decMul(uint256 x, uint256 y) internal pure returns (uint256 decProd) { uint256 prod_xy = x * y; decProd = (prod_xy + (DECIMAL_PRECISION / 2)) / DECIMAL_PRECISION; } /* * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n. * * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. * * Called by two functions that represent time in units of minutes: * 1) TroveManager._calcDecayedBaseRate * 2) CommunityIssuance._getCumulativeIssuanceFraction * * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals * "minutes in 1000 years": 60 * 24 * 365 * 1000 * * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be * negligibly different from just passing the cap, since: * * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible */ function _decPow(uint256 _base, uint256 _minutes) internal pure returns (uint256) { if (_minutes > 525600000) { _minutes = 525600000; } // cap to avoid overflow if (_minutes == 0) { return DECIMAL_PRECISION; } uint256 y = DECIMAL_PRECISION; uint256 x = _base; uint256 n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n / 2; } else { // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n - 1) / 2; } } return decMul(x, y); } function _getAbsoluteDifference(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a >= _b) ? _a - _b : _b - _a; } function _computeNominalCR(uint256 _coll, uint256 _debt) internal pure returns (uint256) { if (_debt > 0) { return (_coll * NICR_PRECISION) / _debt; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2 ** 256 - 1; } } function _computeCR(uint256 _coll, uint256 _debt, uint256 _price) internal pure returns (uint256) { if (_debt > 0) { uint256 newCollRatio = (_coll * _price) / _debt; return newCollRatio; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2 ** 256 - 1; } } function _computeCR(uint256 _coll, uint256 _debt) internal pure returns (uint256) { if (_debt > 0) { uint256 newCollRatio = (_coll) / _debt; return newCollRatio; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2 ** 256 - 1; } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; import "IPrismaCore.sol"; /** @title Prisma Ownable @notice Contracts inheriting `PrismaOwnable` have the same owner as `PrismaCore`. The ownership cannot be independently modified or renounced. */ contract PrismaOwnable { IPrismaCore public immutable PRISMA_CORE; constructor(address _prismaCore) { PRISMA_CORE = IPrismaCore(_prismaCore); } modifier onlyOwner() { require(msg.sender == PRISMA_CORE.owner(), "Only owner"); _; } function owner() public view returns (address) { return PRISMA_CORE.owner(); } function guardian() public view returns (address) { return PRISMA_CORE.guardian(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IPrismaCore { event FeeReceiverSet(address feeReceiver); event GuardianSet(address guardian); event NewOwnerAccepted(address oldOwner, address owner); event NewOwnerCommitted(address owner, address pendingOwner, uint256 deadline); event NewOwnerRevoked(address owner, address revokedOwner); event Paused(); event PriceFeedSet(address priceFeed); event Unpaused(); function acceptTransferOwnership() external; function commitTransferOwnership(address newOwner) external; function revokeTransferOwnership() external; function setFeeReceiver(address _feeReceiver) external; function setGuardian(address _guardian) external; function setPaused(bool _paused) external; function setPriceFeed(address _priceFeed) external; function OWNERSHIP_TRANSFER_DELAY() external view returns (uint256); function feeReceiver() external view returns (address); function guardian() external view returns (address); function owner() external view returns (address); function ownershipTransferDeadline() external view returns (uint256); function paused() external view returns (bool); function pendingOwner() external view returns (address); function priceFeed() external view returns (address); function startTime() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.19; /** @title Prisma Delegated Operations @notice Allows delegation to specific contract functionality. Useful for creating wrapper contracts to bundle multiple interactions into a single call. Functions that supports delegation should include an `account` input allowing the delegated caller to indicate who they are calling on behalf of. In executing the call, all internal state updates should be applied for `account` and all value transfers should occur to or from the caller. For example: a delegated call to `openTrove` should transfer collateral from the caller, create the debt position for `account`, and send newly minted tokens to the caller. */ contract DelegatedOps { mapping(address owner => mapping(address caller => bool isApproved)) public isApprovedDelegate; modifier callerOrDelegated(address _account) { require(msg.sender == _account || isApprovedDelegate[_account][msg.sender], "Delegate not approved"); _; } function setDelegateApproval(address _delegate, bool _isApproved) external { isApprovedDelegate[msg.sender][_delegate] = _isApproved; } }
{ "evmVersion": "paris", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "BorrowerOperations.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_prismaCore","type":"address"},{"internalType":"address","name":"_debtTokenAddress","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint256","name":"_minNetDebt","type":"uint256"},{"internalType":"uint256","name":"_gasCompensation","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BorrowingFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"collateralToken","type":"address"}],"name":"CollateralConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"arrayIndex","type":"uint256"}],"name":"TroveCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ITroveManager","name":"troveManager","type":"address"}],"name":"TroveManagerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"_debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_coll","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"enum BorrowerOperations.BorrowerOperation","name":"operation","type":"uint8"}],"name":"TroveUpdated","type":"event"},{"inputs":[],"name":"CCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEBT_GAS_COMPENSATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMAL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRISMA_CORE","outputs":[{"internalType":"contract IPrismaCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_collateralAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"addColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collDeposit","type":"uint256"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"uint256","name":"_debtChange","type":"uint256"},{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"adjustTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"TCR","type":"uint256"}],"name":"checkRecoveryMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"closeTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"contract IERC20","name":"collateralToken","type":"address"}],"name":"configureCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"debtToken","outputs":[{"internalType":"contract IDebtToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchBalances","outputs":[{"components":[{"internalType":"uint256[]","name":"collaterals","type":"uint256[]"},{"internalType":"uint256[]","name":"debts","type":"uint256[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"}],"internalType":"struct BorrowerOperations.SystemBalances","name":"balances","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debt","type":"uint256"}],"name":"getCompositeDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalSystemBalances","outputs":[{"internalType":"uint256","name":"totalPricedCollateral","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTCR","outputs":[{"internalType":"uint256","name":"globalTotalCollateralRatio","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"isApprovedDelegate","outputs":[{"internalType":"bool","name":"isApproved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minNetDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collateralAmount","type":"uint256"},{"internalType":"uint256","name":"_debtAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"openTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"}],"name":"removeTroveManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_debtAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"repayDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"},{"internalType":"bool","name":"_isApproved","type":"bool"}],"name":"setDelegateApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minNetDebt","type":"uint256"}],"name":"setMinNetDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"name":"troveManagersData","outputs":[{"internalType":"contract IERC20","name":"collateralToken","type":"address"},{"internalType":"uint16","name":"index","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ITroveManager","name":"troveManager","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_debtAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawDebt","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620032c4380380620032c4833981016040819052620000359162000099565b60808190526001600160a01b0380861660a05284811660c052831660e0526200005e8262000069565b5050505050620000f6565b600081116200007757600080fd5b600155565b80516001600160a01b03811681146200009457600080fd5b919050565b600080600080600060a08688031215620000b257600080fd5b620000bd866200007c565b9450620000cd602087016200007c565b9350620000dd604087016200007c565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e05161312b62000199600039600081816104250152610e51015260008181610499015281816108c801528181610d560152611bd901526000818161045f0152818161052e0152818161099d01528181610a7a01528181610f8801528181611369015281816114b40152818161192f0152611c0801526000818161026c01528181610d8101528181611db501526128c2015261312b6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063969c2452116100f9578063c3c854b611610097578063cc9641a811610071578063cc9641a81461045a578063e19c80c214610481578063f8d8989814610494578063fded3d35146104bb57600080fd5b8063c3c854b6146103dc578063c45a015514610420578063c5a62a991461044757600080fd5b8063a6b6c8ee116100d3578063a6b6c8ee14610399578063b51237a9146103ac578063b620115d146103c1578063c2af1eca146103c957600080fd5b8063969c24521461036e578063a20baee614610377578063a2e8dc0a1461038657600080fd5b80634ff81443116101665780635f548614116101405780635f54861414610323578063716c53c214610336578063778c5c64146103535780638da5cb5b1461036657600080fd5b80634ff81443146102a9578063568d6fe5146102bc5780635733d58f1461031457600080fd5b8063452a9320116101a2578063452a9320146102315780634870dd9a146102515780634ba4a28b146102675780634e443d9e1461028e57600080fd5b806311c61ad3146101c95780631930e825146101de578063438d641a1461021e575b600080fd5b6101dc6101d7366004612b81565b6104ce565b005b6102096101ec366004612bfc565b600060208181529281526040808220909352908152205460ff1681565b60405190151581526020015b60405180910390f35b6101dc61022c366004612c35565b61099b565b610239610a76565b6040516001600160a01b039091168152602001610215565b61025960c881565b604051908152602001610215565b6102597f000000000000000000000000000000000000000000000000000000000000000081565b61020961029c366004612c35565b6714d1120d7b1600001190565b6102596102b7366004612c35565b610aff565b6102f26102ca366004612c4e565b6002602052600090815260409020546001600160a01b03811690600160a01b900461ffff1682565b604080516001600160a01b03909316835261ffff909116602083015201610215565b6102596714d1120d7b16000081565b6101dc610331366004612bfc565b610b10565b61033e610e23565b60408051928352602083019190915201610215565b6101dc610361366004612bfc565b610e46565b610239610f84565b61025960015481565b610259670de0b6b3a764000081565b6101dc610394366004612c6b565b610fe4565b6101dc6103a7366004612c6b565b611055565b6103b46110bd565b6040516102159190612d0e565b6102596112f3565b6101dc6103d7366004612d6f565b611312565b6101dc6103ea366004612ded565b336000908152602081815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101dc610455366004612e1b565b61144b565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101dc61048f366004612c4e565b61160f565b6102397f000000000000000000000000000000000000000000000000000000000000000081565b6101dc6104c9366004612c6b565b6118d8565b85336001600160a01b038216148061050757506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b61052c5760405162461bcd60e51b815260040161052390612eb3565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190612ee2565b156105f15760405162461bcd60e51b815260206004820152601360248201527211195c1bdcda5d1cc8185c99481c185d5cd959606a1b6044820152606401610523565b60006106426040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600061064d8b611a10565b60408701919091526020860191909152908452909350905061066e89611ae7565b606082018790528061069b576106868b8b8b8a611b5a565b82606001516106959190612f15565b60608301525b6106a88260600151611d36565b6106b58260600151611dae565b6080830181905282516106c9918a91611dda565b60a083015260808201516106de908990611e0e565b60c083015280156106fb576106f68260a00151611e45565b6107a4565b61076a8260a001518c6001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107659190612f28565b611ec3565b60006107978360200151846040015185600001518c6107899190612f41565b600187608001516001611f4f565b90506107a281611fa9565b505b608082015160c0830151604051634cb653b760e01b81526001600160a01b038d81166004830152602482018c905260448201939093526064810191909152878216608482015286821660a482015282151560c4820152908c1690634cb653b79060e40160408051808303816000875af1158015610825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108499190612f58565b610100840181905260e08401919091526040519081526001600160a01b038b16907f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab9060200160405180910390a26108ac6001600160a01b038416338d8b612039565b60405163467fafdf60e11b8152336004820152602481018890527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638cff5fbe906044016020604051808303816000875af1158015610919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093d9190612ee2565b50896001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b83608001518a8560e0015160006040516109869493929190612f9e565b60405180910390a25050505050505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190612fc0565b6001600160a01b0316336001600160a01b031614610a6a5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401610523565b610a7381612099565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190612fc0565b905090565b6000610b0a82611dae565b92915050565b80336001600160a01b0382161480610b4957506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b610b655760405162461bcd60e51b815260040161052390612eb3565b6000806000806000610b7688611a10565b93985091965091945090925090508215610bf85760405162461bcd60e51b815260206004820152603960248201527f426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d6960448201527f7474656420647572696e67205265636f76657279204d6f6465000000000000006064820152608401610523565b604051630b07655760e01b81526001600160a01b03888116600483015260009182918b1690630b0765579060240160408051808303816000875af1158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190612f58565b90925090506000610c888585610c7e8a87612f41565b6000866000611f4f565b9050610c9381611fa9565b60405163c9a4cbf160e01b81526001600160a01b038b8116600483015233602483015260448201859052606482018490528c169063c9a4cbf190608401600060405180830381600087803b158015610cea57600080fd5b505af1158015610cfe573d6000803e3d6000fd5b50505050896001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b60008060006001604051610d449493929190612f9e565b60405180910390a26001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016638517750933610da67f000000000000000000000000000000000000000000000000000000000000000086612fdd565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e159190612ee2565b505050505050505050505050565b6000806000610e306110bd565b9050610e3b816120ab565b909590945092505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ea95760405162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b6044820152606401610523565b6040805180820182526001600160a01b038381168083526003805461ffff9081166020808701918252898616600081815260028352898120985189549451909516600160a01b026001600160b01b03199094169490971693909317919091179095558154600181018355919093527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916831790558351918252918101919091527ff6e0528dc0c0ef50525339faff44940d57e7897bee18b67dd0aa23bba1749ad2910160405180910390a15050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b83336001600160a01b038216148061101d57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6110395760405162461bcd60e51b815260040161052390612eb3565b61104d868660008060008960008a8a612159565b505050505050565b83336001600160a01b038216148061108e57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6110aa5760405162461bcd60e51b815260040161052390612eb3565b61104d8686600080886000808a8a612159565b6110e160405180606001604052806060815260200160608152602001606081525090565b6003546040805160608101909152808267ffffffffffffffff81111561110957611109612ff0565b604051908082528060200260200182016040528015611132578160200160208202803683370190505b5081526020018267ffffffffffffffff81111561115157611151612ff0565b60405190808252806020026020018201604052801561117a578160200160208202803683370190505b5081526020018267ffffffffffffffff81111561119957611199612ff0565b6040519080825280602002602001820160405280156111c2578160200160208202803683370190505b509052915060005b818110156112ee576000600382815481106111e7576111e7613006565b9060005260206000200160009054906101000a90046001600160a01b031690506000806000836001600160a01b03166301c799fc6040518163ffffffff1660e01b81526004016060604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611270919061301c565b925092509250828760000151868151811061128d5761128d613006565b60200260200101818152505081876020015186815181106112b0576112b0613006565b60200260200101818152505080876040015186815181106112d3576112d3613006565b602002602001018181525050846001019450505050506111ca565b505090565b6000806112fe6110bd565b9050611309816120ab565b50909392505050565b84336001600160a01b038216148061134b57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6113675760405162461bcd60e51b815260040161052390612eb3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612ee2565b1561142f5760405162461bcd60e51b815260206004820152601660248201527515da5d1a191c985dd85b1cc8185c99481c185d5cd95960521b6044820152606401610523565b6114428787876000808960018a8a612159565b50505050505050565b87336001600160a01b038216148061148457506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6114a05760405162461bcd60e51b815260040161052390612eb3565b861580156114ac575083155b8061153657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115349190612ee2565b155b6115825760405162461bcd60e51b815260206004820152601c60248201527f54726f76652061646a7573746d656e74732061726520706175736564000000006044820152606401610523565b86158061158d575085155b6115f25760405162461bcd60e51b815260206004820152603060248201527f426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686460448201526f1c985dc8185b99081859190818dbdb1b60821b6064820152608401610523565b6116038a8a8a8a8a8a8a8a8a612159565b50505050505050505050565b6001600160a01b03818116600090815260026020908152604091829020825180840190935254928316808352600160a01b90930461ffff169082015290158015906116b75750816001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b79190612ee2565b80156117225750816001600160a01b031663795d26c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117209190612f28565b155b61176e5760405162461bcd60e51b815260206004820152601f60248201527f54726f7665204d616e616765722063616e6e6f742062652072656d6f766564006044820152606401610523565b6001600160a01b038216600090815260026020526040812080546001600160b01b03191690556003546117a390600190612fdd565b905080826020015161ffff161015611861576000600382815481106117ca576117ca613006565b9060005260206000200160009054906101000a90046001600160a01b03169050806003846020015161ffff168154811061180657611806613006565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905585810151939092168152600290915260409020805461ffff909216600160a01b0261ffff60a01b199092169190911790555b60038054806118725761187261304a565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03851681527fe44bbef3bc872937d7daf489db0badffc044d1813a027aea391838c546514303910160405180910390a1505050565b83336001600160a01b038216148061191157506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b61192d5760405162461bcd60e51b815260040161052390612eb3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612ee2565b156119fc5760405162461bcd60e51b815260206004820152601c60248201527f54726f76652061646a7573746d656e74732061726520706175736564000000006044820152606401610523565b61104d868660008760008060008a8a612159565b6001600160a01b03818116600090815260026020526040812080549283169282918291829190600160a01b900461ffff1686611a875760405162461bcd60e51b815260206004820152601660248201527510dbdb1b185d195c985b081b9bdd08195b98589b195960521b6044820152606401610523565b600080611a926110bd565b9050611a9d816120ab565b90985096509150611ab5826714d1120d7b1600001190565b94508881604001518481518110611ace57611ace613006565b6020026020010151985098505050505091939590929450565b670de0b6b3a7640000811115610a735760405162461bcd60e51b815260206004820152603260248201527f4d6178206665652070657263656e74616765206d757374206c657373207468616044820152716e206f7220657175616c20746f203130302560701b6064820152608401610523565b60405163b2f29d7b60e01b81526004810182905260009081906001600160a01b0387169063b2f29d7b906024016020604051808303816000875af1158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca9190612f28565b9050611bd7818486612608565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340c10f197f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c889190612fc0565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b50505050846001600160a01b03167f5d032cf8244d18503d44f7171954f352ff41fa2df69660eb897f4db36efe808e82604051611d2391815260200190565b60405180910390a290505b949350505050565b600154811015610a735760405162461bcd60e51b815260206004820152603a60248201527f426f72726f7765724f70733a2054726f76652773206e65742064656274206d7560448201527f73742062652067726561746572207468616e206d696e696d756d0000000000006064820152608401610523565b6000610b0a7f000000000000000000000000000000000000000000000000000000000000000083612f15565b60008215611e0257600083611def8487612f41565b611df99190613060565b9150611e079050565b506000195b9392505050565b60008115611e3b5781611e2a68056bc75e2d6310000085612f41565b611e349190613060565b9050610b0a565b5060001992915050565b6714d1120d7b160000811015610a735760405162461bcd60e51b815260206004820152603760248201527f426f72726f7765724f70733a204f7065726174696f6e206d757374206c65617660448201527f652074726f7665207769746820494352203e3d204343520000000000000000006064820152608401610523565b80821015611f4b5760405162461bcd60e51b815260206004820152604960248201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760448201527f6f756c6420726573756c7420696e20494352203c204d4352206973206e6f74206064820152681c195c9b5a5d1d195960ba1b608482015260a401610523565b5050565b600081611f6557611f608387612fdd565b611f6f565b611f6f8387612f15565b955083611f8557611f808588612fdd565b611f8f565b611f8f8588612f15565b96506000611f9d8888612679565b98975050505050505050565b6714d1120d7b160000811015610a735760405162461bcd60e51b815260206004820152604960248201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760448201527f6f756c6420726573756c7420696e20544352203c20434352206973206e6f74206064820152681c195c9b5a5d1d195960ba1b608482015260a401610523565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612093908590612696565b50505050565b600081116120a657600080fd5b600155565b80515160009081908190815b8181101561214457856040015181815181106120d5576120d5613006565b6020026020010151866000015182815181106120f3576120f3613006565b60200260200101516121059190612f41565b61210f9085612f15565b93508560200151818151811061212757612127613006565b60200260200101518361213a9190612f15565b92506001016120b7565b5061214f8383612679565b9350509193909250565b8515158061216657508415155b8061217057508315155b6121f15760405162461bcd60e51b815260206004820152604660248201527f426f72726f7765724f70733a205468657265206d75737420626520656974686560448201527f72206120636f6c6c61746572616c206368616e6765206f7220612064656274206064820152656368616e676560d01b608482015260a401610523565b6000612270604051806101c00160405280600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600081525090565b600061227b8c611a10565b60408781019290925260208701929092529185529051630b07655760e01b81526001600160a01b038e81166004830152929550909250908d1690630b0765579060240160408051808303816000875af11580156122dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123009190612f58565b60c084015260e0830152612314898961276d565b151560a084015260608301526080820187905261016082018790526001600160a01b03808c1661018084015260408051631e5395c960e21b81529051918e169163794e5724916004808201926020929091908290030181865afa15801561237f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a39190612f28565b6101a0830152851561245457600087116124255760405162461bcd60e51b815260206004820152603760248201527f426f72726f7765724f70733a204465627420696e63726561736520726571756960448201527f726573206e6f6e2d7a65726f20646562744368616e67650000000000000000006064820152608401610523565b61242e8a611ae7565b806124545761243f8c338c8a611b5a565b826080018181516124509190612f15565b9052505b61246a82602001518360400151838b8a8761278c565b851580156124785750600087115b156124a1576124a182608001516124928460c001516128bb565b61249c9190612fdd565b611d36565b8160a00151156124c85760608201516124c8906001600160a01b0385169033908f90612039565b610160820151608083015160a084015160608501516101808601516040516311c82bd560e31b815286151560048201528b1515602482015260448101959095526064850193909352901515608484015260a48301526001600160a01b0387811660c484015286811660e4840152908116610104830152336101248301528d1690638e415ea890610144016060604051808303816000875af1158015612571573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612595919061301c565b6101408501819052610100850182905261012085018390526101808501516040516001600160a01b03909116937fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b936125f2939092600290612f9e565b60405180910390a2505050505050505050505050565b60008261261d670de0b6b3a764000086612f41565b6126279190613060565b9050818111156120935760405162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d0000006044820152606401610523565b60008115611e3b57600061268d8385613060565b9150610b0a9050565b60006126eb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128e79092919063ffffffff16565b80519091501561276857808060200190518101906127099190612ee2565b6127685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610523565b505050565b600080831561278157508290506001612785565b8291505b9250929050565b60006127a58260e001518360c001518460000151611dda565b905060006127d08360e001518460c0015185606001518660a0015187608001518989600001516128f6565b9050851561286a57841561284c5760405162461bcd60e51b815260206004820152603e60248201527f426f72726f7765724f70733a20436f6c6c61746572616c20776974686472617760448201527f616c206e6f74207065726d6974746564205265636f76657279204d6f646500006064820152608401610523565b83156128655761285b81611e45565b6128658183612929565b6128b1565b61287981846101a00151611ec3565b60006128a48989866000015187606001516128949190612f41565b8760a0015188608001518a611f4f565b90506128af81611fa9565b505b5050505050505050565b6000610b0a7f000000000000000000000000000000000000000000000000000000000000000083612fdd565b6060611d2e848460008561299f565b60008060006129098a8a8a8a8a8a612a7a565b91509150600061291a838387611dda565b9b9a5050505050505050505050565b80821015611f4b5760405162461bcd60e51b815260206004820152603e60248201527f426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f7560448201527f722054726f766527732049435220696e205265636f76657279204d6f646500006064820152608401610523565b606082471015612a005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610523565b600080866001600160a01b03168587604051612a1c91906130a6565b60006040518083038185875af1925050503d8060008114612a59576040519150601f19603f3d011682016040523d82523d6000602084013e612a5e565b606091505b5091509150612a6f87838387612ace565b979650505050505050565b600080878786612a9357612a8e888b612fdd565b612a9d565b612a9d888b612f15565b915084612ab357612aae868a612fdd565b612abd565b612abd868a612f15565b919a91995090975050505050505050565b60608315612b3d578251600003612b36576001600160a01b0385163b612b365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610523565b5081611d2e565b611d2e8383815115612b525781518083602001fd5b8060405162461bcd60e51b815260040161052391906130c2565b6001600160a01b0381168114610a7357600080fd5b600080600080600080600060e0888a031215612b9c57600080fd5b8735612ba781612b6c565b96506020880135612bb781612b6c565b955060408801359450606088013593506080880135925060a0880135612bdc81612b6c565b915060c0880135612bec81612b6c565b8091505092959891949750929550565b60008060408385031215612c0f57600080fd5b8235612c1a81612b6c565b91506020830135612c2a81612b6c565b809150509250929050565b600060208284031215612c4757600080fd5b5035919050565b600060208284031215612c6057600080fd5b8135611e0781612b6c565b600080600080600060a08688031215612c8357600080fd5b8535612c8e81612b6c565b94506020860135612c9e81612b6c565b9350604086013592506060860135612cb581612b6c565b91506080860135612cc581612b6c565b809150509295509295909350565b600081518084526020808501945080840160005b83811015612d0357815187529582019590820190600101612ce7565b509495945050505050565b602081526000825160606020840152612d2a6080840182612cd3565b90506020840151601f1980858403016040860152612d488383612cd3565b9250604086015191508085840301606086015250612d668282612cd3565b95945050505050565b60008060008060008060c08789031215612d8857600080fd5b8635612d9381612b6c565b95506020870135612da381612b6c565b945060408701359350606087013592506080870135612dc181612b6c565b915060a0870135612dd181612b6c565b809150509295509295509295565b8015158114610a7357600080fd5b60008060408385031215612e0057600080fd5b8235612e0b81612b6c565b91506020830135612c2a81612ddf565b60008060008060008060008060006101208a8c031215612e3a57600080fd5b8935612e4581612b6c565b985060208a0135612e5581612b6c565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135612e8181612ddf565b925060e08a0135612e9181612b6c565b91506101008a0135612ea281612b6c565b809150509295985092959850929598565b60208082526015908201527411195b1959d85d19481b9bdd08185c1c1c9bdd9959605a1b604082015260600190565b600060208284031215612ef457600080fd5b8151611e0781612ddf565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b0a57610b0a612eff565b600060208284031215612f3a57600080fd5b5051919050565b8082028115828204841417610b0a57610b0a612eff565b60008060408385031215612f6b57600080fd5b505080516020909101519092909150565b60038110612f9a57634e487b7160e01b600052602160045260246000fd5b9052565b848152602081018490526040810183905260808101612d666060830184612f7c565b600060208284031215612fd257600080fd5b8151611e0781612b6c565b81810381811115610b0a57610b0a612eff565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008060006060848603121561303157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b60008261307d57634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561309d578181015183820152602001613085565b50506000910152565b600082516130b8818460208701613082565b9190910192915050565b60208152600082518060208401526130e1816040850160208701613082565b601f01601f1916919091016040019291505056fea26469706673582212200d13a5d62e24e91897289eefe856b838275e4042dd031b812613ed1eb34af02864736f6c634300081300330000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf80000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb2800000000000000000000000070b66e20766b775b2e9ce5b718bbd285af59b7e100000000000000000000000000000000000000000000006194049f30f720000000000000000000000000000000000000000000000000000ad78ebc5ac6200000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063969c2452116100f9578063c3c854b611610097578063cc9641a811610071578063cc9641a81461045a578063e19c80c214610481578063f8d8989814610494578063fded3d35146104bb57600080fd5b8063c3c854b6146103dc578063c45a015514610420578063c5a62a991461044757600080fd5b8063a6b6c8ee116100d3578063a6b6c8ee14610399578063b51237a9146103ac578063b620115d146103c1578063c2af1eca146103c957600080fd5b8063969c24521461036e578063a20baee614610377578063a2e8dc0a1461038657600080fd5b80634ff81443116101665780635f548614116101405780635f54861414610323578063716c53c214610336578063778c5c64146103535780638da5cb5b1461036657600080fd5b80634ff81443146102a9578063568d6fe5146102bc5780635733d58f1461031457600080fd5b8063452a9320116101a2578063452a9320146102315780634870dd9a146102515780634ba4a28b146102675780634e443d9e1461028e57600080fd5b806311c61ad3146101c95780631930e825146101de578063438d641a1461021e575b600080fd5b6101dc6101d7366004612b81565b6104ce565b005b6102096101ec366004612bfc565b600060208181529281526040808220909352908152205460ff1681565b60405190151581526020015b60405180910390f35b6101dc61022c366004612c35565b61099b565b610239610a76565b6040516001600160a01b039091168152602001610215565b61025960c881565b604051908152602001610215565b6102597f00000000000000000000000000000000000000000000000ad78ebc5ac620000081565b61020961029c366004612c35565b6714d1120d7b1600001190565b6102596102b7366004612c35565b610aff565b6102f26102ca366004612c4e565b6002602052600090815260409020546001600160a01b03811690600160a01b900461ffff1682565b604080516001600160a01b03909316835261ffff909116602083015201610215565b6102596714d1120d7b16000081565b6101dc610331366004612bfc565b610b10565b61033e610e23565b60408051928352602083019190915201610215565b6101dc610361366004612bfc565b610e46565b610239610f84565b61025960015481565b610259670de0b6b3a764000081565b6101dc610394366004612c6b565b610fe4565b6101dc6103a7366004612c6b565b611055565b6103b46110bd565b6040516102159190612d0e565b6102596112f3565b6101dc6103d7366004612d6f565b611312565b6101dc6103ea366004612ded565b336000908152602081815260408083206001600160a01b0395909516835293905291909120805460ff1916911515919091179055565b6102397f00000000000000000000000070b66e20766b775b2e9ce5b718bbd285af59b7e181565b6101dc610455366004612e1b565b61144b565b6102397f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf881565b6101dc61048f366004612c4e565b61160f565b6102397f0000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb2881565b6101dc6104c9366004612c6b565b6118d8565b85336001600160a01b038216148061050757506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b61052c5760405162461bcd60e51b815260040161052390612eb3565b60405180910390fd5b7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561058a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ae9190612ee2565b156105f15760405162461bcd60e51b815260206004820152601360248201527211195c1bdcda5d1cc8185c99481c185d5cd959606a1b6044820152606401610523565b60006106426040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600061064d8b611a10565b60408701919091526020860191909152908452909350905061066e89611ae7565b606082018790528061069b576106868b8b8b8a611b5a565b82606001516106959190612f15565b60608301525b6106a88260600151611d36565b6106b58260600151611dae565b6080830181905282516106c9918a91611dda565b60a083015260808201516106de908990611e0e565b60c083015280156106fb576106f68260a00151611e45565b6107a4565b61076a8260a001518c6001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107659190612f28565b611ec3565b60006107978360200151846040015185600001518c6107899190612f41565b600187608001516001611f4f565b90506107a281611fa9565b505b608082015160c0830151604051634cb653b760e01b81526001600160a01b038d81166004830152602482018c905260448201939093526064810191909152878216608482015286821660a482015282151560c4820152908c1690634cb653b79060e40160408051808303816000875af1158015610825573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108499190612f58565b610100840181905260e08401919091526040519081526001600160a01b038b16907f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab9060200160405180910390a26108ac6001600160a01b038416338d8b612039565b60405163467fafdf60e11b8152336004820152602481018890527f0000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb286001600160a01b031690638cff5fbe906044016020604051808303816000875af1158015610919573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093d9190612ee2565b50896001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b83608001518a8560e0015160006040516109869493929190612f9e565b60405180910390a25050505050505050505050565b7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1d9190612fc0565b6001600160a01b0316336001600160a01b031614610a6a5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401610523565b610a7381612099565b50565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afa9190612fc0565b905090565b6000610b0a82611dae565b92915050565b80336001600160a01b0382161480610b4957506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b610b655760405162461bcd60e51b815260040161052390612eb3565b6000806000806000610b7688611a10565b93985091965091945090925090508215610bf85760405162461bcd60e51b815260206004820152603960248201527f426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d6960448201527f7474656420647572696e67205265636f76657279204d6f6465000000000000006064820152608401610523565b604051630b07655760e01b81526001600160a01b03888116600483015260009182918b1690630b0765579060240160408051808303816000875af1158015610c44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c689190612f58565b90925090506000610c888585610c7e8a87612f41565b6000866000611f4f565b9050610c9381611fa9565b60405163c9a4cbf160e01b81526001600160a01b038b8116600483015233602483015260448201859052606482018490528c169063c9a4cbf190608401600060405180830381600087803b158015610cea57600080fd5b505af1158015610cfe573d6000803e3d6000fd5b50505050896001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b60008060006001604051610d449493929190612f9e565b60405180910390a26001600160a01b037f0000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb2816638517750933610da67f00000000000000000000000000000000000000000000000ad78ebc5ac620000086612fdd565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610df1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e159190612ee2565b505050505050505050505050565b6000806000610e306110bd565b9050610e3b816120ab565b909590945092505050565b336001600160a01b037f00000000000000000000000070b66e20766b775b2e9ce5b718bbd285af59b7e11614610ea95760405162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b6044820152606401610523565b6040805180820182526001600160a01b038381168083526003805461ffff9081166020808701918252898616600081815260028352898120985189549451909516600160a01b026001600160b01b03199094169490971693909317919091179095558154600181018355919093527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916831790558351918252918101919091527ff6e0528dc0c0ef50525339faff44940d57e7897bee18b67dd0aa23bba1749ad2910160405180910390a15050565b60007f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad6573d6000803e3d6000fd5b83336001600160a01b038216148061101d57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6110395760405162461bcd60e51b815260040161052390612eb3565b61104d868660008060008960008a8a612159565b505050505050565b83336001600160a01b038216148061108e57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6110aa5760405162461bcd60e51b815260040161052390612eb3565b61104d8686600080886000808a8a612159565b6110e160405180606001604052806060815260200160608152602001606081525090565b6003546040805160608101909152808267ffffffffffffffff81111561110957611109612ff0565b604051908082528060200260200182016040528015611132578160200160208202803683370190505b5081526020018267ffffffffffffffff81111561115157611151612ff0565b60405190808252806020026020018201604052801561117a578160200160208202803683370190505b5081526020018267ffffffffffffffff81111561119957611199612ff0565b6040519080825280602002602001820160405280156111c2578160200160208202803683370190505b509052915060005b818110156112ee576000600382815481106111e7576111e7613006565b9060005260206000200160009054906101000a90046001600160a01b031690506000806000836001600160a01b03166301c799fc6040518163ffffffff1660e01b81526004016060604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611270919061301c565b925092509250828760000151868151811061128d5761128d613006565b60200260200101818152505081876020015186815181106112b0576112b0613006565b60200260200101818152505080876040015186815181106112d3576112d3613006565b602002602001018181525050846001019450505050506111ca565b505090565b6000806112fe6110bd565b9050611309816120ab565b50909392505050565b84336001600160a01b038216148061134b57506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6113675760405162461bcd60e51b815260040161052390612eb3565b7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612ee2565b1561142f5760405162461bcd60e51b815260206004820152601660248201527515da5d1a191c985dd85b1cc8185c99481c185d5cd95960521b6044820152606401610523565b6114428787876000808960018a8a612159565b50505050505050565b87336001600160a01b038216148061148457506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b6114a05760405162461bcd60e51b815260040161052390612eb3565b861580156114ac575083155b8061153657507f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611510573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115349190612ee2565b155b6115825760405162461bcd60e51b815260206004820152601c60248201527f54726f76652061646a7573746d656e74732061726520706175736564000000006044820152606401610523565b86158061158d575085155b6115f25760405162461bcd60e51b815260206004820152603060248201527f426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686460448201526f1c985dc8185b99081859190818dbdb1b60821b6064820152608401610523565b6116038a8a8a8a8a8a8a8a8a612159565b50505050505050505050565b6001600160a01b03818116600090815260026020908152604091829020825180840190935254928316808352600160a01b90930461ffff169082015290158015906116b75750816001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611693573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b79190612ee2565b80156117225750816001600160a01b031663795d26c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117209190612f28565b155b61176e5760405162461bcd60e51b815260206004820152601f60248201527f54726f7665204d616e616765722063616e6e6f742062652072656d6f766564006044820152606401610523565b6001600160a01b038216600090815260026020526040812080546001600160b01b03191690556003546117a390600190612fdd565b905080826020015161ffff161015611861576000600382815481106117ca576117ca613006565b9060005260206000200160009054906101000a90046001600160a01b03169050806003846020015161ffff168154811061180657611806613006565b6000918252602080832090910180546001600160a01b039485166001600160a01b031990911617905585810151939092168152600290915260409020805461ffff909216600160a01b0261ffff60a01b199092169190911790555b60038054806118725761187261304a565b6000828152602090819020600019908301810180546001600160a01b03191690559091019091556040516001600160a01b03851681527fe44bbef3bc872937d7daf489db0badffc044d1813a027aea391838c546514303910160405180910390a1505050565b83336001600160a01b038216148061191157506001600160a01b03811660009081526020818152604080832033845290915290205460ff165b61192d5760405162461bcd60e51b815260040161052390612eb3565b7f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b0316635c975abb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561198b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119af9190612ee2565b156119fc5760405162461bcd60e51b815260206004820152601c60248201527f54726f76652061646a7573746d656e74732061726520706175736564000000006044820152606401610523565b61104d868660008760008060008a8a612159565b6001600160a01b03818116600090815260026020526040812080549283169282918291829190600160a01b900461ffff1686611a875760405162461bcd60e51b815260206004820152601660248201527510dbdb1b185d195c985b081b9bdd08195b98589b195960521b6044820152606401610523565b600080611a926110bd565b9050611a9d816120ab565b90985096509150611ab5826714d1120d7b1600001190565b94508881604001518481518110611ace57611ace613006565b6020026020010151985098505050505091939590929450565b670de0b6b3a7640000811115610a735760405162461bcd60e51b815260206004820152603260248201527f4d6178206665652070657263656e74616765206d757374206c657373207468616044820152716e206f7220657175616c20746f203130302560701b6064820152608401610523565b60405163b2f29d7b60e01b81526004810182905260009081906001600160a01b0387169063b2f29d7b906024016020604051808303816000875af1158015611ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bca9190612f28565b9050611bd7818486612608565b7f0000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb286001600160a01b03166340c10f197f0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf86001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c889190612fc0565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b158015611cd057600080fd5b505af1158015611ce4573d6000803e3d6000fd5b50505050846001600160a01b03167f5d032cf8244d18503d44f7171954f352ff41fa2df69660eb897f4db36efe808e82604051611d2391815260200190565b60405180910390a290505b949350505050565b600154811015610a735760405162461bcd60e51b815260206004820152603a60248201527f426f72726f7765724f70733a2054726f76652773206e65742064656274206d7560448201527f73742062652067726561746572207468616e206d696e696d756d0000000000006064820152608401610523565b6000610b0a7f00000000000000000000000000000000000000000000000ad78ebc5ac620000083612f15565b60008215611e0257600083611def8487612f41565b611df99190613060565b9150611e079050565b506000195b9392505050565b60008115611e3b5781611e2a68056bc75e2d6310000085612f41565b611e349190613060565b9050610b0a565b5060001992915050565b6714d1120d7b160000811015610a735760405162461bcd60e51b815260206004820152603760248201527f426f72726f7765724f70733a204f7065726174696f6e206d757374206c65617660448201527f652074726f7665207769746820494352203e3d204343520000000000000000006064820152608401610523565b80821015611f4b5760405162461bcd60e51b815260206004820152604960248201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760448201527f6f756c6420726573756c7420696e20494352203c204d4352206973206e6f74206064820152681c195c9b5a5d1d195960ba1b608482015260a401610523565b5050565b600081611f6557611f608387612fdd565b611f6f565b611f6f8387612f15565b955083611f8557611f808588612fdd565b611f8f565b611f8f8588612f15565b96506000611f9d8888612679565b98975050505050505050565b6714d1120d7b160000811015610a735760405162461bcd60e51b815260206004820152604960248201527f426f72726f7765724f70733a20416e206f7065726174696f6e2074686174207760448201527f6f756c6420726573756c7420696e20544352203c20434352206973206e6f74206064820152681c195c9b5a5d1d195960ba1b608482015260a401610523565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612093908590612696565b50505050565b600081116120a657600080fd5b600155565b80515160009081908190815b8181101561214457856040015181815181106120d5576120d5613006565b6020026020010151866000015182815181106120f3576120f3613006565b60200260200101516121059190612f41565b61210f9085612f15565b93508560200151818151811061212757612127613006565b60200260200101518361213a9190612f15565b92506001016120b7565b5061214f8383612679565b9350509193909250565b8515158061216657508415155b8061217057508315155b6121f15760405162461bcd60e51b815260206004820152604660248201527f426f72726f7765724f70733a205468657265206d75737420626520656974686560448201527f72206120636f6c6c61746572616c206368616e6765206f7220612064656274206064820152656368616e676560d01b608482015260a401610523565b6000612270604051806101c00160405280600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600081525090565b600061227b8c611a10565b60408781019290925260208701929092529185529051630b07655760e01b81526001600160a01b038e81166004830152929550909250908d1690630b0765579060240160408051808303816000875af11580156122dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123009190612f58565b60c084015260e0830152612314898961276d565b151560a084015260608301526080820187905261016082018790526001600160a01b03808c1661018084015260408051631e5395c960e21b81529051918e169163794e5724916004808201926020929091908290030181865afa15801561237f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a39190612f28565b6101a0830152851561245457600087116124255760405162461bcd60e51b815260206004820152603760248201527f426f72726f7765724f70733a204465627420696e63726561736520726571756960448201527f726573206e6f6e2d7a65726f20646562744368616e67650000000000000000006064820152608401610523565b61242e8a611ae7565b806124545761243f8c338c8a611b5a565b826080018181516124509190612f15565b9052505b61246a82602001518360400151838b8a8761278c565b851580156124785750600087115b156124a1576124a182608001516124928460c001516128bb565b61249c9190612fdd565b611d36565b8160a00151156124c85760608201516124c8906001600160a01b0385169033908f90612039565b610160820151608083015160a084015160608501516101808601516040516311c82bd560e31b815286151560048201528b1515602482015260448101959095526064850193909352901515608484015260a48301526001600160a01b0387811660c484015286811660e4840152908116610104830152336101248301528d1690638e415ea890610144016060604051808303816000875af1158015612571573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612595919061301c565b6101408501819052610100850182905261012085018390526101808501516040516001600160a01b03909116937fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b936125f2939092600290612f9e565b60405180910390a2505050505050505050505050565b60008261261d670de0b6b3a764000086612f41565b6126279190613060565b9050818111156120935760405162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d0000006044820152606401610523565b60008115611e3b57600061268d8385613060565b9150610b0a9050565b60006126eb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128e79092919063ffffffff16565b80519091501561276857808060200190518101906127099190612ee2565b6127685760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610523565b505050565b600080831561278157508290506001612785565b8291505b9250929050565b60006127a58260e001518360c001518460000151611dda565b905060006127d08360e001518460c0015185606001518660a0015187608001518989600001516128f6565b9050851561286a57841561284c5760405162461bcd60e51b815260206004820152603e60248201527f426f72726f7765724f70733a20436f6c6c61746572616c20776974686472617760448201527f616c206e6f74207065726d6974746564205265636f76657279204d6f646500006064820152608401610523565b83156128655761285b81611e45565b6128658183612929565b6128b1565b61287981846101a00151611ec3565b60006128a48989866000015187606001516128949190612f41565b8760a0015188608001518a611f4f565b90506128af81611fa9565b505b5050505050505050565b6000610b0a7f00000000000000000000000000000000000000000000000ad78ebc5ac620000083612fdd565b6060611d2e848460008561299f565b60008060006129098a8a8a8a8a8a612a7a565b91509150600061291a838387611dda565b9b9a5050505050505050505050565b80821015611f4b5760405162461bcd60e51b815260206004820152603e60248201527f426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f7560448201527f722054726f766527732049435220696e205265636f76657279204d6f646500006064820152608401610523565b606082471015612a005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610523565b600080866001600160a01b03168587604051612a1c91906130a6565b60006040518083038185875af1925050503d8060008114612a59576040519150601f19603f3d011682016040523d82523d6000602084013e612a5e565b606091505b5091509150612a6f87838387612ace565b979650505050505050565b600080878786612a9357612a8e888b612fdd565b612a9d565b612a9d888b612f15565b915084612ab357612aae868a612fdd565b612abd565b612abd868a612f15565b919a91995090975050505050505050565b60608315612b3d578251600003612b36576001600160a01b0385163b612b365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610523565b5081611d2e565b611d2e8383815115612b525781518083602001fd5b8060405162461bcd60e51b815260040161052391906130c2565b6001600160a01b0381168114610a7357600080fd5b600080600080600080600060e0888a031215612b9c57600080fd5b8735612ba781612b6c565b96506020880135612bb781612b6c565b955060408801359450606088013593506080880135925060a0880135612bdc81612b6c565b915060c0880135612bec81612b6c565b8091505092959891949750929550565b60008060408385031215612c0f57600080fd5b8235612c1a81612b6c565b91506020830135612c2a81612b6c565b809150509250929050565b600060208284031215612c4757600080fd5b5035919050565b600060208284031215612c6057600080fd5b8135611e0781612b6c565b600080600080600060a08688031215612c8357600080fd5b8535612c8e81612b6c565b94506020860135612c9e81612b6c565b9350604086013592506060860135612cb581612b6c565b91506080860135612cc581612b6c565b809150509295509295909350565b600081518084526020808501945080840160005b83811015612d0357815187529582019590820190600101612ce7565b509495945050505050565b602081526000825160606020840152612d2a6080840182612cd3565b90506020840151601f1980858403016040860152612d488383612cd3565b9250604086015191508085840301606086015250612d668282612cd3565b95945050505050565b60008060008060008060c08789031215612d8857600080fd5b8635612d9381612b6c565b95506020870135612da381612b6c565b945060408701359350606087013592506080870135612dc181612b6c565b915060a0870135612dd181612b6c565b809150509295509295509295565b8015158114610a7357600080fd5b60008060408385031215612e0057600080fd5b8235612e0b81612b6c565b91506020830135612c2a81612ddf565b60008060008060008060008060006101208a8c031215612e3a57600080fd5b8935612e4581612b6c565b985060208a0135612e5581612b6c565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135612e8181612ddf565b925060e08a0135612e9181612b6c565b91506101008a0135612ea281612b6c565b809150509295985092959850929598565b60208082526015908201527411195b1959d85d19481b9bdd08185c1c1c9bdd9959605a1b604082015260600190565b600060208284031215612ef457600080fd5b8151611e0781612ddf565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b0a57610b0a612eff565b600060208284031215612f3a57600080fd5b5051919050565b8082028115828204841417610b0a57610b0a612eff565b60008060408385031215612f6b57600080fd5b505080516020909101519092909150565b60038110612f9a57634e487b7160e01b600052602160045260246000fd5b9052565b848152602081018490526040810183905260808101612d666060830184612f7c565b600060208284031215612fd257600080fd5b8151611e0781612b6c565b81810381811115610b0a57610b0a612eff565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008060006060848603121561303157600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fd5b60008261307d57634e487b7160e01b600052601260045260246000fd5b500490565b60005b8381101561309d578181015183820152602001613085565b50506000910152565b600082516130b8818460208701613082565b9190910192915050565b60208152600082518060208401526130e1816040850160208701613082565b601f01601f1916919091016040019291505056fea26469706673582212200d13a5d62e24e91897289eefe856b838275e4042dd031b812613ed1eb34af02864736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf80000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb2800000000000000000000000070b66e20766b775b2e9ce5b718bbd285af59b7e100000000000000000000000000000000000000000000006194049f30f720000000000000000000000000000000000000000000000000000ad78ebc5ac6200000
-----Decoded View---------------
Arg [0] : _prismaCore (address): 0x5d17eA085F2FF5da3e6979D5d26F1dBaB664ccf8
Arg [1] : _debtTokenAddress (address): 0x4591DBfF62656E7859Afe5e45f6f47D3669fBB28
Arg [2] : _factory (address): 0x70b66E20766b775B2E9cE5B718bbD285Af59b7E1
Arg [3] : _minNetDebt (uint256): 1800000000000000000000
Arg [4] : _gasCompensation (uint256): 200000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005d17ea085f2ff5da3e6979d5d26f1dbab664ccf8
Arg [1] : 0000000000000000000000004591dbff62656e7859afe5e45f6f47d3669fbb28
Arg [2] : 00000000000000000000000070b66e20766b775b2e9ce5b718bbd285af59b7e1
Arg [3] : 00000000000000000000000000000000000000000000006194049f30f7200000
Arg [4] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Multichain Portfolio | 35 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.