Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 36 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim Remaining ... | 19368220 | 749 days ago | IN | 0 ETH | 0.00612451 | ||||
| Claim Remaining ... | 19157685 | 779 days ago | IN | 0 ETH | 0.00143693 | ||||
| Claim Remaining ... | 18754765 | 835 days ago | IN | 0 ETH | 0.00240727 | ||||
| Claim Remaining ... | 18216291 | 911 days ago | IN | 0 ETH | 0.00116413 | ||||
| Borrow LUSD Liqu... | 17672219 | 987 days ago | IN | 0 ETH | 0.01568624 | ||||
| Borrow LUSD Liqu... | 17536829 | 1006 days ago | IN | 0 ETH | 0.00781702 | ||||
| Borrow LUSD Liqu... | 17244471 | 1047 days ago | IN | 0 ETH | 0.02888248 | ||||
| Add Collateral L... | 17244449 | 1047 days ago | IN | 6.5 ETH | 0.02350887 | ||||
| Add Collateral L... | 16924601 | 1092 days ago | IN | 9 ETH | 0.01080819 | ||||
| Borrow LUSD Liqu... | 16924553 | 1092 days ago | IN | 0 ETH | 0.01327527 | ||||
| Borrow LUSD Liqu... | 16924507 | 1092 days ago | IN | 0 ETH | 0.01176773 | ||||
| Borrow LUSD Liqu... | 16812962 | 1108 days ago | IN | 0 ETH | 0.01014443 | ||||
| Borrow LUSD Liqu... | 16741276 | 1118 days ago | IN | 0 ETH | 0.01188802 | ||||
| Borrow LUSD Liqu... | 16741058 | 1118 days ago | IN | 0 ETH | 0.01387699 | ||||
| Borrow LUSD Liqu... | 16585925 | 1140 days ago | IN | 0 ETH | 0.01610571 | ||||
| Open Credit Line... | 16140252 | 1202 days ago | IN | 42 ETH | 0.0247599 | ||||
| Add Collateral L... | 15989213 | 1223 days ago | IN | 1 ETH | 0.00596201 | ||||
| Close Credit Lin... | 15984452 | 1224 days ago | IN | 0 ETH | 0.00900958 | ||||
| Withdraw Collate... | 15984176 | 1224 days ago | IN | 0 ETH | 0.00967964 | ||||
| Repay LUSD Liqui... | 15984164 | 1224 days ago | IN | 0 ETH | 0.01009439 | ||||
| Repay LUSD Liqui... | 15984141 | 1224 days ago | IN | 0 ETH | 0.00906185 | ||||
| Withdraw Collate... | 15984075 | 1224 days ago | IN | 0 ETH | 0.00924785 | ||||
| Repay LUSD Liqui... | 15982684 | 1224 days ago | IN | 0 ETH | 0.006216 | ||||
| Withdraw Collate... | 15981894 | 1224 days ago | IN | 0 ETH | 0.00612804 | ||||
| Borrow LUSD Liqu... | 15717256 | 1261 days ago | IN | 0 ETH | 0.01829933 |
Latest 13 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Execute | 17244449 | 1047 days ago | 6.5 ETH | ||||
| Execute | 16924601 | 1092 days ago | 9 ETH | ||||
| Execute | 16140252 | 1202 days ago | 42 ETH | ||||
| Execute | 15989213 | 1223 days ago | 1 ETH | ||||
| Execute | 15674109 | 1267 days ago | 4.95 ETH | ||||
| Execute | 15200891 | 1340 days ago | 0.6 ETH | ||||
| Execute | 15200819 | 1340 days ago | 2.45 ETH | ||||
| Execute | 15093820 | 1356 days ago | 2.7 ETH | ||||
| Execute | 15064971 | 1361 days ago | 17 ETH | ||||
| - | 14956061 | 1380 days ago | 29 ETH | ||||
| - | 14937942 | 1383 days ago | 4 ETH | ||||
| - | 14860756 | 1396 days ago | 3.9 ETH | ||||
| - | 14860628 | 1396 days ago | 4 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Stargate
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0
pragma solidity =0.8.10;
import "./Registry.sol";
import "./dapphub/DSProxyFactory.sol";
import "./dapphub/DSProxy.sol";
import "./Config.sol";
import "./CentralLogger.sol";
import "./CommunityAcknowledgement.sol";
import "./LiquityMath.sol";
import "./SqrtMath.sol";
import "./interfaces/ITroveManager.sol";
import "./interfaces/IHintHelpers.sol";
import "./interfaces/ISortedTroves.sol";
import "./interfaces/ICollSurplusPool.sol";
/// @title Stargate contract serves as a gateway and a gatekeeper into the APUS protocol ecosystem
/// @notice The main motivation of Stargate is to give user understandable transaction to sign (i.e. no bytecode giberish)
/// and to chain common sequence of transactions thus saving gas.
/// @dev It encodes all arguments and calls given user's Smart Account proxy with any additional arguments
contract Stargate is LiquityMath, SqrtMath {
/* solhint-disable var-name-mixedcase */
/// @notice Registry's contracts IDs
bytes32 private constant EXECUTOR_ID = keccak256("Executor");
bytes32 private constant CONFIG_ID = keccak256("Config");
bytes32 private constant AUTHORITY_ID = keccak256("Authority");
bytes32 private constant COMMUNITY_ACKNOWLEDGEMENT_ID = keccak256("CommunityAcknowledgement");
bytes32 private constant CENTRAL_LOGGER_ID = keccak256("CentralLogger");
/// @notice APUS registry address
address public immutable registry;
// MakerDAO's deployed contracts - Proxy Factory
// see https://changelog.makerdao.com/
DSProxyFactory public immutable ProxyFactory;
// L1 Liquity deployed contracts addresses
// see https://docs.liquity.org/documentation/resources#contract-addresses
ITroveManager public immutable TroveManager;
IHintHelpers public immutable HintHelpers;
ISortedTroves public immutable SortedTroves;
ICollSurplusPool public immutable CollSurplusPool;
/// @notice Event raised on Stargate when a new Smart Account is created.
/// Corresponding event is also raised on the Central Logger
event SmartAccountCreated(
address indexed owner,
address indexed smartAccountAddress
);
/// @notice Modifier will fail if message sender is not the proxy owner
/// @param _proxy Proxy address that must be owned
modifier onlyProxyOwner(address payable _proxy) {
require(DSProxy(_proxy).owner() == msg.sender, "Sender has to be proxy owner");
_;
}
/* solhint-disable-next-line func-visibility */
constructor(
address _registry,
address _troveManager,
address _hintHelpers,
address _sortedTroves,
address _collSurplusPool,
address _proxyFactory
) {
registry = _registry;
TroveManager = ITroveManager(_troveManager);
HintHelpers = IHintHelpers(_hintHelpers);
SortedTroves = ISortedTroves(_sortedTroves);
CollSurplusPool = ICollSurplusPool(_collSurplusPool);
ProxyFactory = DSProxyFactory(_proxyFactory);
}
/// @notice Execute proxy call with encoded transaction data and eth value
/// @dev Proxy delegates call to executor address which is obtained from registry contract
/// @param _proxy Proxy address to execute encoded transaction
/// @param _value Value of eth to transfer with function call
/// @param _data Transaction data to execute
function _execute(address payable _proxy, uint256 _value, bytes memory _data) internal onlyProxyOwner(_proxy) {
DSProxy(_proxy).execute{ value: _value }(Registry(registry).getAddress(EXECUTOR_ID), _data);
}
/// @notice Execute proxy call with encoded transaction data and eth value by anyone
/**
* @dev Proxy delegates call to executor address which is obtained from registry contract
*
* This is the DANGEROUS version as it enables the proxy call to be performed by anyone!
*
* However suitable for cases when user wants to provide ETH from other (proxy non-owning) accounts.
*/
/// @param _proxy Proxy address to execute encoded transaction
/// @param _value Value of eth to transfer with function call
/// @param _data Transaction data to execute
function _executeByAnyone(address payable _proxy, uint256 _value, bytes memory _data) internal {
DSProxy(_proxy).execute{ value: _value }(Registry(registry).getAddress(EXECUTOR_ID), _data);
}
// Stargate MUST NOT be able to receive ETH from sender to itself
// in 0.8.x function() is split to receive() and fallback(); if both are undefined -> tx reverts
// ------------------------------------------ User functions ------------------------------------------
/// @notice Creates the Smart Account directly. Its new address is emitted to the event.
/// It is cheaper to open Smart Account while opening Credit Line wihin 1 transaction.
function openSmartAccount() external {
_openSmartAccount();
}
/// @notice Builds the new MakerDAO's proxy aka Smart Account with enabled calls from this Stargate
function _openSmartAccount() internal returns (address payable) {
// Deploy a new MakerDAO's proxy onto blockchain
DSProxy smartAccount = ProxyFactory.build();
// Enable Stargate's user functions to call the Smart Account
DSAuthority stargateAuthority = DSAuthority(Registry(registry).getAddress(AUTHORITY_ID));
smartAccount.setAuthority(stargateAuthority);
// Set owner of MakerDAO's proxy aka Smart Account to be the user
smartAccount.setOwner(msg.sender);
// Emit centraly at this contract and the Central Logger
emit SmartAccountCreated(msg.sender, address(smartAccount));
CentralLogger logger = CentralLogger(Registry(registry).getAddress(CENTRAL_LOGGER_ID));
logger.log(
address(this), msg.sender, "openSmartAccount", abi.encode(smartAccount)
);
return payable(smartAccount);
}
/// @notice Get the gasless information on Credit Line (Liquity) status of the given Smart Account
/// @param _smartAccount Smart Account address.
/// @return status Status of the Credit Line within Liquity protocol, where:
/// 0..nonExistent,
/// 1..active,
/// 2..closedByOwner,
/// 3..closedByLiquidation,
/// 4..closedByRedemption
/// @return collateral ETH collateral.
/// @return debtToRepay Total amount of LUSD needed to close the Credit Line (exluding the 200 LUSD liquidation reserve).
/// @return debtComposite Composite debt including the liquidation reserve. Valid for LTV (CR) calculations.
function getCreditLineStatusLiquity(address payable _smartAccount) external view returns (
uint8 status,
uint256 collateral,
uint256 debtToRepay,
uint256 debtComposite
) {
(debtComposite, collateral, , status, ) = TroveManager.Troves(_smartAccount);
debtToRepay = debtComposite > LIQUITY_LUSD_GAS_COMPENSATION ? debtComposite - LIQUITY_LUSD_GAS_COMPENSATION : 0;
}
/// @notice Calculates Liquity sorting hints based on the provided NICR
function getLiquityHints(uint256 NICR) internal view returns (
address upperHint,
address lowerHint
) {
// Get an approximate address hint from the deployed HintHelper contract.
uint256 numTroves = SortedTroves.getSize();
uint256 numTrials = sqrt(numTroves) * 15;
(address approxHint, , ) = HintHelpers.getApproxHint(NICR, numTrials, 0x41505553);
// Use the approximate hint to get the exact upper and lower hints from the deployed SortedTroves contract
(upperHint, lowerHint) = SortedTroves.findInsertPosition(NICR, approxHint, approxHint);
}
/// @notice Calculates LUSD expected debt to repay.
/// Includes _LUSDRequested, Adoption Contribution, Liquity protocol fee.
/// Adoption Contribution reflects the Adoption Contribution Rate and Recognised Community Contributor Acknowledgement Rate if applicable.
function getLiquityExpectedDebtToRepay(uint256 _LUSDRequested) internal view returns (uint256 expectedDebtToRepay) {
uint16 applicableAcr;
uint256 expectedLiquityProtocolRate;
(applicableAcr, expectedLiquityProtocolRate) = getLiquityRates();
uint256 neededLUSDAmount = calcNeededLiquityLUSDAmount(_LUSDRequested, expectedLiquityProtocolRate, applicableAcr);
uint256 expectedLiquityProtocolFee = TroveManager.getBorrowingFeeWithDecay(neededLUSDAmount);
expectedDebtToRepay = neededLUSDAmount + expectedLiquityProtocolFee;
}
/// @notice Calculates the rates related to Liquity for the msg.sender
/// @return applicableAcr Adoption Contribution Rate with applied Recognised Community Contributor Acknowledgement Rate of msg.sender if applicable.
/// @return expectedLiquityProtocolRate Current rate of the Liquity protocol
function getLiquityRates() internal view returns (uint16 applicableAcr, uint256 expectedLiquityProtocolRate) {
// Get and apply Recognised Community Contributor Acknowledgement Rate
CommunityAcknowledgement ca = CommunityAcknowledgement(Registry(registry).getAddress(COMMUNITY_ACKNOWLEDGEMENT_ID));
uint16 rccar = ca.getAcknowledgementRate(keccak256(abi.encodePacked(msg.sender)));
Config config = Config(Registry(registry).getAddress(CONFIG_ID));
applicableAcr = applyRccarOnAcr(rccar, config.adoptionContributionRate());
expectedLiquityProtocolRate = TroveManager.getBorrowingRateWithDecay();
}
/// @notice Calculates the current rate for the msg.sender as related to Liquity and Adoption Contribution incl. RCCAR
function userAdoptionRate() external view returns (uint256) {
uint16 applicableAcr;
uint256 expectedLiquityProtocolRate;
(applicableAcr, expectedLiquityProtocolRate) = getLiquityRates();
// Normalise applicable ACR 1e4 -> 1e18
uint256 r = DECIMAL_PRECISION / ACR_DECIMAL_PRECISION * applicableAcr;
// Apply Liquity protocol rate when applicable ACR is lower
return r < expectedLiquityProtocolRate ? expectedLiquityProtocolRate : r;
}
/// @notice Makes a gasless calculation to get the data for the Credit Line's initial setup on Liquity protocol
/// @param _LUSDRequested Requested LUSD amount to be taken by borrower. In e18 (1 LUSD = 1e18).
/// Adoption Contribution including protocol's fees is applied in the form of additional debt.
/// @param _collateralAmount Amount of ETH to be deposited into the Credit Line. In wei (1 ETH = 1e18).
/// @return expectedDebtToRepay Total amount of LUSD needed to close the Credit Line (exluding the 200 LUSD liquidation reserve).
/// @return liquidationReserve Liquidation gas reserve required by the Liquity protocol.
/// @return expectedCompositeDebtLiquity Total debt of the new Credit Line including the liquidation reserve. Valid for LTV (CR) calculations.
/// @return NICR Nominal Individual Collateral Ratio for this calculation as defined and used by Liquity protocol.
/// @return upperHint Calculated hint for gas optimalization of the Liquity protocol when opening new Credit Line with openCreditLineLiquity.
/// @return lowerHint Calculated hint for gas optimalization of the Liquity protocol when opening new Credit Line with openCreditLineLiquity.
function calculateInitialLiquityParameters(uint256 _LUSDRequested, uint256 _collateralAmount) public view returns (
uint256 expectedDebtToRepay,
uint256 liquidationReserve,
uint256 expectedCompositeDebtLiquity,
uint256 NICR,
address upperHint,
address lowerHint
) {
liquidationReserve = LIQUITY_LUSD_GAS_COMPENSATION;
expectedDebtToRepay = getLiquityExpectedDebtToRepay(_LUSDRequested);
expectedCompositeDebtLiquity = expectedDebtToRepay + LIQUITY_LUSD_GAS_COMPENSATION;
// Get the nominal NICR of the new Liquity's trove
NICR = _collateralAmount * 1e20 / expectedCompositeDebtLiquity;
(upperHint, lowerHint) = getLiquityHints(NICR);
}
/// @notice Makes a gasless calculation to get the data for the Credit Line's adjustement on Liquity protocol
/// @param _isDebtIncrease Indication whether _LUSDRequestedChange increases debt (true), decreases debt(false) or does not impact debt (false).
/// @param _LUSDRequestedChange Amount of LUSD to be returned or further borrowed. The increase or decrease is indicated by _isDebtIncrease.
/// Adoption Contribution including protocol's fees is applied in the form of additional debt in case of requested debt increase.
/// @param _isCollateralIncrease Indication whether _LUSDRequestedChange increases debt (true), decreases debt(false) or does not impact debt (false).
/// @param _collateralChange Amount of ETH collateral to be withdrawn or added. The increase or decrease is indicated by _isCollateralIncrease.
/// @return newCollateral Calculated future collateral.
/// @return expectedDebtToRepay Total future amount of LUSD needed to close the Credit Line (exluding the 200 LUSD liquidation reserve).
/// @return liquidationReserve Liquidation gas reserve required by the Liquity protocol.
/// @return expectedCompositeDebtLiquity Total future debt of the new Credit Line including the liquidation reserve. Valid for LTV (CR) calculations.
/// @return NICR Nominal Individual Collateral Ratio for this calculation as defined and used by Liquity protocol.
/// @return upperHint Calculated hint for gas optimalization of the Liquity protocol when opening new Credit Line with openCreditLineLiquity.
/// @return lowerHint Calculated hint for gas optimalization of the Liquity protocol when opening new Credit Line with openCreditLineLiquity.
/// @dev bools and uints are used to avoid typecasting and overflow issues and to explicitely signal the direction
function calculateChangedLiquityParameters(
bool _isDebtIncrease,
uint256 _LUSDRequestedChange,
bool _isCollateralIncrease,
uint256 _collateralChange,
address payable _smartAccount
) public view returns (
uint256 newCollateral,
uint256 expectedDebtToRepay,
uint256 liquidationReserve,
uint256 expectedCompositeDebtLiquity,
uint256 NICR,
address upperHint,
address lowerHint
) {
liquidationReserve = LIQUITY_LUSD_GAS_COMPENSATION;
// Get the current LUSD debt and ETH collateral
(uint256 currentCompositeDebt, uint256 currentCollateral, , ) = TroveManager.getEntireDebtAndColl(_smartAccount);
uint256 currentDebtToRepay = currentCompositeDebt - LIQUITY_LUSD_GAS_COMPENSATION;
if (_isCollateralIncrease) {
newCollateral = currentCollateral + _collateralChange;
} else {
newCollateral = currentCollateral - _collateralChange;
}
if (_isDebtIncrease) {
uint256 additionalDebtToRepay = getLiquityExpectedDebtToRepay(_LUSDRequestedChange);
expectedDebtToRepay = currentDebtToRepay + additionalDebtToRepay;
} else {
expectedDebtToRepay = currentDebtToRepay - _LUSDRequestedChange;
}
expectedCompositeDebtLiquity = expectedDebtToRepay + LIQUITY_LUSD_GAS_COMPENSATION;
// Get the nominal NICR of the new Liquity's trove
NICR = newCollateral * 1e20 / expectedCompositeDebtLiquity;
(upperHint, lowerHint) = getLiquityHints(NICR);
}
/// @notice Opens a new Credit Line using Liquity protocol by depositing ETH collateral and borrowing LUSD.
/// Creates the new Smart Account (MakerDAO's proxy) if requested.
/// Use calculateInitialLiquityParameters for gasless calculation of proper Hints for _LUSDRequested.
/// @param _LUSDRequested Amount of LUSD caller wants to borrow and withdraw. In e18 (1 LUSD = 1e18).
/// @param _LUSDTo Address that will receive the generated LUSD. Can be different to save gas on transfer.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateInitialLiquityParameters for gasless calculation of proper Hints for _LUSDRequested.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateInitialLiquityParameters for gasless calculation of proper Hints for _LUSDRequested.
/// @param _smartAccount Smart Account address. When 0x0000...00 sender requests to open a new Smart Account.
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
/// @dev Value is amount of ETH to deposit into Liquity protocol.
function openCreditLineLiquity(uint256 _LUSDRequested, address _LUSDTo, address _upperHint, address _lowerHint, address payable _smartAccount) external payable {
// By submitting 0x00..0 as the smartAccount address the caller wants to open a new Smart Account during this 1 transaction and thus saving gas.
_smartAccount = (_smartAccount == address(0)) ? _openSmartAccount() : _smartAccount;
_execute(_smartAccount, msg.value, abi.encodeWithSignature(
"openCreditLineLiquity(uint256,address,address,address,address)",
_LUSDRequested, _LUSDTo, _upperHint, _lowerHint, msg.sender
));
}
/// @notice Allows a borrower to repay all LUSD debt, withdraw all their ETH collateral, and close their Credit Line on Liquity protocol.
/// @param _LUSDFrom Address where the LUSD is being pulled from to repay debt.
/// @param _collateralTo Address that will receive the withdrawn ETH.
/// @param _smartAccount Smart Account address
function closeCreditLineLiquity(address _LUSDFrom, address payable _collateralTo, address payable _smartAccount) public {
_execute(_smartAccount, 0,
abi.encodeWithSignature(
"closeCreditLineLiquity(address,address,address)",
_LUSDFrom,
_collateralTo,
msg.sender
));
}
/// @notice Allows a borrower to repay all LUSD debt, withdraw all their ETH collateral, and close their Credit Line on Liquity protocol using EIP2612 Permit.
/// @param _LUSDFrom Address where the LUSD is being pulled from to repay debt.
/// @param _collateralTo Address that will receive the withdrawn ETH.
/// @param v EIP2612 secp256k1 permit signature part
/// @param r EIP2612 secp256k1 permit signature part
/// @param s EIP2612 secp256k1 permit signature part
/// @param _smartAccount Smart Account address
function closeCreditLineLiquityWithPermit(address _LUSDFrom, address payable _collateralTo, uint8 v, bytes32 r, bytes32 s, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"closeCreditLineLiquityWithPermit(address,address,uint8,bytes32,bytes32,address)",
_LUSDFrom, _collateralTo, v, r, s, msg.sender
));
}
/// @notice Enables a borrower to simultaneously change both their collateral and debt.
/// Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _isDebtIncrease Indication whether _LUSDRequestedChange increases debt (true), decreases debt(false) or does not impact debt (false).
/// @param _LUSDRequestedChange Amount of LUSD to be returned or further borrowed.
/// The increase or decrease is indicated by _isDebtIncrease.
/// Adoption Contribution and protocol's fees are applied in the form of additional debt in case of requested debt increase.
/// @param _LUSDAddress Address where the LUSD is being pulled from in case of to repaying debt.
/// Or address that will receive the generated LUSD in case of increasing debt.
/// Approval of LUSD transfers for given Smart Account is required in case of repaying debt.
/// @param _collWithdrawal Amount of ETH collateral to withdraw. MUST be 0 if ETH is provided to increase collateral.
/// @param _collateralTo Address that will receive the withdrawn collateral ETH.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _smartAccount Smart Account address
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
/// @dev Hints should reflect calculated neededLUSDAmount instead of _LUSDRequestedChange
/// @dev Value is amount of ETH to deposit into Liquity protocol
function adjustCreditLineLiquity(
bool _isDebtIncrease,
uint256 _LUSDRequestedChange,
address _LUSDAddress,
uint256 _collWithdrawal,
address payable _collateralTo,
address _upperHint, address _lowerHint,
address payable _smartAccount) external payable {
_execute(_smartAccount, msg.value, abi.encodeWithSignature(
"adjustCreditLineLiquity(bool,uint256,address,uint256,address,address,address,address)",
_isDebtIncrease, _LUSDRequestedChange, _LUSDAddress, _collWithdrawal, _collateralTo, _upperHint, _lowerHint, msg.sender
));
}
/// @notice Enables a borrower to simultaneously change both their collateral and decrease debt providing LUSD from ANY ADDRESS using EIP2612 Permit.
/// Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// It is useful only when the debt decrease is requested while working with collateral.
/// In all other cases [adjustCreditLineLiquity()] MUST be used. It is cheaper on gas.
/// @param _LUSDRequestedChange Amount of LUSD to be returned.
/// @param _LUSDFrom Address where the LUSD is being pulled from. Can be ANY ADDRESS with enough LUSD.
/// Approval of LUSD transfers for given Smart Account is ensured by the offchain signature from that address.
/// @param _collWithdrawal Amount of ETH collateral to withdraw. MUST be 0 if ETH is provided to increase collateral.
/// @param _collateralTo Address that will receive the withdrawn collateral ETH.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param v EIP2612 secp256k1 permit signature part
/// @param r EIP2612 secp256k1 permit signature part
/// @param s EIP2612 secp256k1 permit signature part
/// @param _smartAccount Smart Account address
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
/// @dev Value is amount of ETH to deposit into Liquity protocol
function adjustCreditLineLiquityWithPermit(
uint256 _LUSDRequestedChange,
address _LUSDFrom,
uint256 _collWithdrawal,
address payable _collateralTo,
address _upperHint, address _lowerHint,
uint8 v, bytes32 r, bytes32 s,
address payable _smartAccount) external payable {
_execute(_smartAccount, msg.value, abi.encodeWithSignature(
"adjustCreditLineLiquityWithPermit(uint256,address,uint256,address,address,address,uint8,bytes32,bytes32,address)",
_LUSDRequestedChange, _LUSDFrom, _collWithdrawal, _collateralTo, _upperHint, _lowerHint, v, r, s, msg.sender
));
}
/// @notice Gasless check if there is anything to be claimed after the forced closure of the Liquity Credit Line
function checkClaimableCollateralLiquity(address _smartAccount) external view returns (uint256) {
return CollSurplusPool.getCollateral(_smartAccount);
}
/// @notice Claims remaining collateral from the user's closed Credit Line (Liquity protocol) due to a redemption or a liquidation.
/// @param _collateralTo Address that will receive the claimed collateral ETH.
/// @param _smartAccount Smart Account address
function claimRemainingCollateralLiquity(address payable _collateralTo, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"claimRemainingCollateralLiquity(address,address)",
_collateralTo,
msg.sender
));
}
/// @notice Allows ANY ADDRESS (calling and paying) to add ETH collateral to borrower's Credit Line (Liquity protocol) and thus increase CR (decrease LTV ratio).
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints.
/// @param _smartAccount Smart Account address
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
function addCollateralLiquity(address _upperHint, address _lowerHint, address payable _smartAccount) external payable {
// Must be executable by anyone in order to be able to provide ETH by addresses, which do not own smart account proxy
_executeByAnyone(_smartAccount, msg.value, abi.encodeWithSignature(
"addCollateralLiquity(address,address,address)",
_upperHint, _lowerHint, msg.sender
));
}
/// @notice Withdraws amount of ETH collateral from the Credit Line and transfer to _collateralTo address.
/// @param _collWithdrawal Amount of ETH collateral to withdraw
/// @param _collateralTo Address that will receive the withdrawn collateral ETH
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints.
/// @param _smartAccount Smart Account address
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
function withdrawCollateralLiquity(uint256 _collWithdrawal, address payable _collateralTo, address _upperHint, address _lowerHint, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"withdrawCollateralLiquity(uint256,address,address,address,address)",
_collWithdrawal, _collateralTo, _upperHint, _lowerHint, msg.sender
));
}
/// @notice Issues amount of LUSD from the liquity's protocol to the provided address.
/// This increases the debt on the Credit Line, decreases CR (increases LTV).
/// @param _LUSDRequestedChange Amount of LUSD to further borrow.
/// @param _LUSDTo Address that will receive the generated LUSD. When 0 msg.sender is used.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _smartAccount Smart Account address
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
/// @dev Hints should reflect calculated new debt instead of _LUSDRequestedChange
/// @dev This is facade to adjustCreditLineLiquity
function borrowLUSDLiquity(uint256 _LUSDRequestedChange, address _LUSDTo, address _upperHint, address _lowerHint, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"adjustCreditLineLiquity(bool,uint256,address,uint256,address,address,address,address)",
true, _LUSDRequestedChange, _LUSDTo, 0, msg.sender, _upperHint, _lowerHint, msg.sender
// _isDebtIncrease, _LUSDRequestedChange, _LUSDAddress, _collWithdrawal, _collateralTo, _upperHint, _lowerHint, msg.sender
));
}
/// @notice Enables credit line owner to partially repay the debt from ANY ADDRESS by the given amount of LUSD.
/// Approval of LUSD transfers for given Smart Account is required.
/// Cannot repay below 2000 LUSD composite debt. Use closeCreditLineLiquity to repay whole debt instead.
/// @param _LUSDRequestedChange Amount of LUSD to be repaid in e18 (1 LUSD = 1e18). Repaying is subject to leaving 2000 LUSD min. debt in the Liquity protocol.
/// @param _LUSDFrom Address where the LUSD is being pulled from to repay debt.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _smartAccount Smart Account address.
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
function repayLUSDLiquity(uint256 _LUSDRequestedChange, address _LUSDFrom, address _upperHint, address _lowerHint, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"repayLUSDLiquity(uint256,address,address,address,address)",
_LUSDRequestedChange, _LUSDFrom, _upperHint, _lowerHint, msg.sender
));
}
/// @notice Enables credit line owner to partially repay the debt from ANY ADDRESS by the given amount of LUSD using EIP2612 Permit.
/// Approval of LUSD transfers for given Smart Account is ensured by the offchain signature.
/// Cannot repay below 2000 LUSD composite debt. Use closeCreditLineLiquity to repay whole debt instead.
/// @param _LUSDRequestedChange Amount of LUSD to be repaid in e18 (1 LUSD = 1e18). Repaying is subject to leaving 2000 LUSD min. debt in the Liquity protocol.
/// @param _LUSDFrom Address where the LUSD is being pulled from to repay debt.
/// @param _upperHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param _lowerHint For gas optimalisation when using Liquity protocol. Use calculateChangedLiquityParameters for gasless calculation of proper Hints for _LUSDRequestedChange.
/// @param v EIP2612 secp256k1 permit signature part
/// @param r EIP2612 secp256k1 permit signature part
/// @param s EIP2612 secp256k1 permit signature part
/// @param _smartAccount Smart Account address.
/// @dev Hints explained: https://github.com/liquity/dev#supplying-hints-to-trove-operations
function repayLUSDLiquityWithPermit(uint256 _LUSDRequestedChange, address _LUSDFrom, address _upperHint, address _lowerHint, uint8 v, bytes32 r, bytes32 s, address payable _smartAccount) external {
_execute(_smartAccount, 0, abi.encodeWithSignature(
"repayLUSDLiquityWithPermit(uint256,address,address,address,uint8,bytes32,bytes32,address)",
_LUSDRequestedChange, _LUSDFrom, _upperHint, _lowerHint, v, r, s, msg.sender
));
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
contract BaseMath {
/// @notice Constant for the fractional arithmetics. Similar to 1 ETH = 1e18 wei.
uint256 constant internal DECIMAL_PRECISION = 1e18;
/// @notice Constant for the fractional arithmetics with ACR.
uint256 constant internal ACR_DECIMAL_PRECISION = 1e4;
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
/// @title Central logger contract
/// @notice Log collector with only 1 purpose - to emit the event. Can be called from any contract
/** @dev Use like this:
*
* bytes32 internal constant CENTRAL_LOGGER_ID = keccak256("CentralLogger");
* CentralLogger logger = CentralLogger(Registry(registry).getAddress(CENTRAL_LOGGER_ID));
*
* Or directly:
* CentralLogger logger = CentralLogger(0xDEPLOYEDADDRESS);
*
* logger.log(
* address(this),
* msg.sender,
* "myGreatFunction",
* abi.encode(msg.value, param1, param2)
* );
*
* DO NOT USE delegateCall as it defies the centralisation purpose of this logger.
*/
contract CentralLogger {
event LogEvent(
address indexed contractAddress,
address indexed caller,
string indexed logName,
bytes data
);
/* solhint-disable no-empty-blocks */
constructor() {
}
/// @notice Log the event centrally
/// @dev For gas impact see https://www.evm.codes/#a3
/// @param _logName length must be less than 32 bytes
function log(
address _contract,
address _caller,
string memory _logName,
bytes memory _data
) public {
emit LogEvent(_contract, _caller, _logName, _data);
}
}// SPDX-License-Identifier: LGPL-3.0
pragma solidity =0.8.10;
import "./Ownable.sol";
contract CommunityAcknowledgement is Ownable {
/// @notice Recognised Community Contributor Acknowledgement Rate
/// @dev Id is keccak256 hash of contributor address
mapping (bytes32 => uint16) public rccar;
/// @notice Emit when owner recognises contributor
/// @param contributor Keccak256 hash of recognised contributor address
/// @param previousAcknowledgementRate Previous contributor acknowledgement rate
/// @param newAcknowledgementRate New contributor acknowledgement rate
event ContributorRecognised(bytes32 indexed contributor, uint16 indexed previousAcknowledgementRate, uint16 indexed newAcknowledgementRate);
/* solhint-disable-next-line no-empty-blocks */
constructor(address _adoptionDAOAddress) Ownable(_adoptionDAOAddress) {
}
/// @notice Getter for Recognised Community Contributor Acknowledgement Rate
/// @param _contributor Keccak256 hash of contributor address
/// @return Acknowledgement Rate
function getAcknowledgementRate(bytes32 _contributor) external view returns (uint16) {
return rccar[_contributor];
}
/// @notice Getter for Recognised Community Contributor Acknowledgement Rate for msg.sender
/// @return Acknowledgement Rate
function senderAcknowledgementRate() external view returns (uint16) {
return rccar[keccak256(abi.encodePacked(msg.sender))];
}
/// @notice Recognise community contributor and set its acknowledgement rate
/// @dev Only owner can recognise contributor
/// @dev Emits `ContributorRecognised` event
/// @param _contributor Keccak256 hash of recognised contributor address
/// @param _acknowledgementRate Contributor new acknowledgement rate
function recogniseContributor(bytes32 _contributor, uint16 _acknowledgementRate) public onlyOwner {
uint16 _previousAcknowledgementRate = rccar[_contributor];
rccar[_contributor] = _acknowledgementRate;
emit ContributorRecognised(_contributor, _previousAcknowledgementRate, _acknowledgementRate);
}
/// @notice Recognise list of contributors
/// @dev Only owner can recognise contributors
/// @dev Emits `ContributorRecognised` event for every contributor
/// @param _contributors List of keccak256 hash of recognised contributor addresses
/// @param _acknowledgementRates List of contributors new acknowledgement rates
function batchRecogniseContributor(bytes32[] calldata _contributors, uint16[] calldata _acknowledgementRates) external onlyOwner {
require(_contributors.length == _acknowledgementRates.length, "Lists do not match in length");
for (uint256 i = 0; i < _contributors.length; i++) {
recogniseContributor(_contributors[i], _acknowledgementRates[i]);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
import "./Ownable.sol";
/// @title APUS config contract
/// @notice Holds global variables for the rest of APUS ecosystem
contract Config is Ownable {
/// @notice Adoption Contribution Rate, where 100% = 10000 = ACR_DECIMAL_PRECISION.
/// @dev Percent value where 0 -> 0%, 10 -> 0.1%, 100 -> 1%, 250 -> 2.5%, 550 -> 5.5%, 1000 -> 10%, 0xffff -> 655.35%
/// @dev Example: x * adoptionContributionRate / ACR_DECIMAL_PRECISION
uint16 public adoptionContributionRate;
/// @notice Adoption DAO multisig address
address payable public adoptionDAOAddress;
/// @notice Emit when owner changes Adoption Contribution Rate
/// @param caller Who changed the Adoption Contribution Rate (i.e. who was owner at that moment)
/// @param previousACR Previous Adoption Contribution Rate
/// @param newACR New Adoption Contribution Rate
event ACRChanged(address indexed caller, uint16 previousACR, uint16 newACR);
/// @notice Emit when owner changes Adoption DAO address
/// @param caller Who changed the Adoption DAO address (i.e. who was owner at that moment)
/// @param previousAdoptionDAOAddress Previous Adoption DAO address
/// @param newAdoptionDAOAddress New Adoption DAO address
event AdoptionDAOAddressChanged(address indexed caller, address previousAdoptionDAOAddress, address newAdoptionDAOAddress);
/* solhint-disable-next-line func-visibility */
constructor(address payable _adoptionDAOAddress, uint16 _initialACR) Ownable(_adoptionDAOAddress) {
adoptionContributionRate = _initialACR;
adoptionDAOAddress = _adoptionDAOAddress;
}
/// @notice Change Adoption Contribution Rate
/// @dev Only owner can change Adoption Contribution Rate
/// @dev Emits `ACRChanged` event
/// @param _newACR Adoption Contribution Rate
function setAdoptionContributionRate(uint16 _newACR) external onlyOwner {
uint16 _previousACR = adoptionContributionRate;
adoptionContributionRate = _newACR;
emit ACRChanged(msg.sender, _previousACR, _newACR);
}
/// @notice Change Adoption DAO address
/// @dev Only owner can change Adoption DAO address
/// @dev Emits `AdoptionDAOAddressChanged` event
function setAdoptionDAOAddress(address payable _newAdoptionDAOAddress) external onlyOwner {
address payable _previousAdoptionDAOAddress = adoptionDAOAddress;
adoptionDAOAddress = _newAdoptionDAOAddress;
emit AdoptionDAOAddressChanged(msg.sender, _previousAdoptionDAOAddress, _newAdoptionDAOAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import "./BaseMath.sol";
/// @title Business calculation logic related to the Liquity protocol
/// @dev To be inherited only
contract LiquityMath is BaseMath {
// Maximum protocol fee as defined in the Liquity contracts
// https://github.com/liquity/dev/blob/cb583ddf5e7de6010e196cfe706bd0ca816ea40e/packages/contracts/contracts/TroveManager.sol#L48
uint256 internal constant LIQUITY_PROTOCOL_MAX_BORROWING_FEE = DECIMAL_PRECISION / 100 * 5; // 5%
// Amount of LUSD to be locked in Liquity's gas pool on opening troves
// https://github.com/liquity/dev/blob/cb583ddf5e7de6010e196cfe706bd0ca816ea40e/packages/contracts/contracts/TroveManager.sol#L334
uint256 internal constant LIQUITY_LUSD_GAS_COMPENSATION = 200e18;
/// @notice Calculates the needed amount of LUSD parameter for Liquity protocol when borrowing LUSD
/// @param _LUSDRequestedAmount Amount the user wants to withdraw
/// @param _expectedLiquityProtocolRate Current / expected borrowing rate of the Liquity protocol
/// @param _adoptionContributionRate Adoption Contribution Rate in uint16 form (xxyy defines xx.yy %). LPR is applied when ACR < LPR. Thus LPR is always used When AR is set to 0.
/* solhint-disable-next-line var-name-mixedcase */
function calcNeededLiquityLUSDAmount(uint256 _LUSDRequestedAmount, uint256 _expectedLiquityProtocolRate, uint16 _adoptionContributionRate) internal pure returns (
uint256 neededLiquityLUSDAmount
) {
// Normalise ACR 1e4 -> 1e18
uint256 acr = DECIMAL_PRECISION / ACR_DECIMAL_PRECISION * _adoptionContributionRate;
// Apply Liquity protocol rate when ACR is lower
acr = acr < _expectedLiquityProtocolRate ? _expectedLiquityProtocolRate : acr;
// Includes requested debt and adoption contribution which covers also liquity protocol fee
uint256 expectedDebtToRepay = _LUSDRequestedAmount * acr / DECIMAL_PRECISION + _LUSDRequestedAmount;
// = x / ( 1 + fee rate<0.005 - 0.05> )
neededLiquityLUSDAmount = DECIMAL_PRECISION * expectedDebtToRepay / ( DECIMAL_PRECISION + _expectedLiquityProtocolRate );
require(neededLiquityLUSDAmount >= _LUSDRequestedAmount, "Cannot mint less than requested.");
}
/// @notice Calculates adjusted Adoption Contribution Rate decreased by RCCAR down to min 0.
/// @param _rccar Recognised Community Contributor Acknowledgement Rate in uint16 form (xxyy defines xx.yy % points).
/// @param _adoptionContributionRate Adoption Contribution Rate in uint16 form (xxyy defines xx.yy %).
function applyRccarOnAcr(uint16 _rccar, uint16 _adoptionContributionRate) internal pure returns (
uint16 adjustedAcr
) {
return (_adoptionContributionRate > _rccar ? _adoptionContributionRate - _rccar : 0);
}
}// SPDX-License-Identifier: MIT
// Adapted from OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)
// Using less gas and initiating the first owner to the provided multisig address
pragma solidity ^0.8.10;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one provided during the deployment of the contract.
* This can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable {
/**
* @dev Address of the current owner.
*/
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @param _firstOwner Initial owner
* @dev Initializes the contract setting the initial owner.
*/
constructor(address _firstOwner) {
_transferOwnership(_firstOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner == msg.sender, "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address _newOwner) public virtual onlyOwner {
require(_newOwner != address(0), "Ownable: cannot be zero address");
_transferOwnership(_newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address _newOwner) internal virtual {
address oldOwner = owner;
owner = _newOwner;
emit OwnershipTransferred(oldOwner, _newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
import "./Ownable.sol";
/// @title Registry contract for whole Apus ecosystem
/// @notice Holds addresses of all essential Apus contracts
contract Registry is Ownable {
/// @notice Stores address under its id
/// @dev Id is keccak256 hash of its string representation
mapping (bytes32 => address) public addresses;
/// @notice Emit when owner registers address
/// @param id Keccak256 hash of its string id representation
/// @param previousAddress Previous address value under given id
/// @param newAddress New address under given id
event AddressRegistered(bytes32 indexed id, address indexed previousAddress, address indexed newAddress);
/* solhint-disable-next-line no-empty-blocks */
constructor(address _initialOwner) Ownable(_initialOwner) {
}
/// @notice Getter for registered addresses
/// @dev Returns zero address if address have not been registered before
/// @param _id Registered address identifier
function getAddress(bytes32 _id) external view returns(address) {
return addresses[_id];
}
/// @notice Register address under given id
/// @dev Only owner can register addresses
/// @dev Emits `AddressRegistered` event
/// @param _id Keccak256 hash of its string id representation
/// @param _address Registering address
function registerAddress(bytes32 _id, address _address) public onlyOwner {
require(_address != address(0), "Can't register 0x0 address");
address _previousAddress = addresses[_id];
addresses[_id] = _address;
emit AddressRegistered(_id, _previousAddress, _address);
}
/// @notice Register list of addresses under given list of ids
/// @dev Only owner can register addresses
/// @dev Emits `AddressRegistered` event for every address
/// @param _ids List of keccak256 hashes of its string id representation
/// @param _addresses List of registering addresses
function batchRegisterAddresses(bytes32[] calldata _ids, address[] calldata _addresses) external onlyOwner {
require(_ids.length == _addresses.length, "Lists do not match in length");
for (uint256 i = 0; i < _ids.length; i++) {
registerAddress(_ids[i], _addresses[i]);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
contract SqrtMath {
/// @notice Calculates the square root of x, rounding down.
/// @dev Uses the Babylonian method https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method.
///
/// Caveats:
/// - This function does not work with fixed-point numbers.
///
/// @param x The uint256 number for which to calculate the square root.
/// @return result The result as an uint256.
// source: https://github.com/paulrberg/prb-math/blob/86c068e21f9ba229025a77b951bd3c4c4cf103da/contracts/PRBMath.sol#L591
function sqrt(uint256 x) internal pure returns (uint256 result) {
if (x == 0) {
return 0;
}
// Set the initial guess to the least power of two that is greater than or equal to sqrt(x).
uint256 xAux = uint256(x);
result = 1;
if (xAux >= 0x100000000000000000000000000000000) {
xAux >>= 128;
result <<= 64;
}
if (xAux >= 0x10000000000000000) {
xAux >>= 64;
result <<= 32;
}
if (xAux >= 0x100000000) {
xAux >>= 32;
result <<= 16;
}
if (xAux >= 0x10000) {
xAux >>= 16;
result <<= 8;
}
if (xAux >= 0x100) {
xAux >>= 8;
result <<= 4;
}
if (xAux >= 0x10) {
xAux >>= 4;
result <<= 2;
}
if (xAux >= 0x8) {
result <<= 1;
}
// The operations can never overflow because the result is max 2^127 when it enters this block.
unchecked {
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1;
result = (result + x / result) >> 1; // Seven iterations should be enough
uint256 roundedDownResult = x / result;
return result >= roundedDownResult ? roundedDownResult : result;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
import "./DSAuthority.sol";
contract DSAuthEvents {
event LogSetAuthority(address indexed authority);
event LogSetOwner(address indexed owner);
}
abstract contract DSAuth is DSAuthEvents {
DSAuthority public authority;
address public owner;
constructor() {
owner = msg.sender;
emit LogSetOwner(msg.sender);
}
function setOwner(address owner_) public virtual;
function setAuthority(DSAuthority authority_) public virtual;
function isAuthorized(address src, bytes4 sig) internal view virtual returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
abstract contract DSAuthority {
function canCall(
address src,
address dst,
bytes4 sig
) public view virtual returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
import "./DSAuth.sol";
abstract contract DSProxy is DSAuth {
DSProxyCache public cache; // global cache for contracts
constructor(address _cacheAddr) {
require(setCache(_cacheAddr), "Cache not set");
}
// solhint-disable-next-line no-empty-blocks
receive() external payable {}
// use the proxy to execute calldata _data on contract _code
function execute(bytes memory _code, bytes memory _data)
public
payable
virtual
returns (address target, bytes32 response);
function execute(address _target, bytes memory _data)
public
payable
virtual
returns (bytes32 response);
//set new cache
function setCache(address _cacheAddr) public payable virtual returns (bool);
}
abstract contract DSProxyCache {
mapping(bytes32 => address) cache;
function read(bytes memory _code) public view virtual returns (address);
function write(bytes memory _code) public virtual returns (address target);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
import "./DSProxy.sol";
abstract contract DSProxyFactory {
function build(address owner) public virtual returns (DSProxy proxy);
function build() public virtual returns (DSProxy proxy);
function isProxy(address proxy) public virtual view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
interface ICollSurplusPool {
// --- Events ---
event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
event TroveManagerAddressChanged(address _newTroveManagerAddress);
event ActivePoolAddressChanged(address _newActivePoolAddress);
event CollBalanceUpdated(address indexed _account, uint _newBalance);
event EtherSent(address _to, uint _amount);
// --- Contract setters ---
function setAddresses(
address _borrowerOperationsAddress,
address _troveManagerAddress,
address _activePoolAddress
) external;
function getETH() external view returns (uint);
function getCollateral(address _account) external view returns (uint);
function accountSurplus(address _account, uint _amount) external;
function claimColl(address _account) external;
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
interface IHintHelpers {
function getRedemptionHints(
uint _LUSDamount,
uint _price,
uint _maxIterations
)
external
view
returns (
address firstRedemptionHint,
uint partialRedemptionHintNICR,
uint truncatedLUSDamount
);
function getApproxHint(uint _CR, uint _numTrials, uint _inputRandomSeed)
external
view
returns (address hintAddress, uint diff, uint latestRandomSeed);
function computeNominalCR(uint _coll, uint _debt) external pure returns (uint);
function computeCR(uint _coll, uint _debt, uint _price) external pure returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
// Common interface for the SortedTroves Doubly Linked List.
interface ISortedTroves {
// --- Events ---
event SortedTrovesAddressChanged(address _sortedDoublyLLAddress);
event BorrowerOperationsAddressChanged(address _borrowerOperationsAddress);
event NodeAdded(address _id, uint _NICR);
event NodeRemoved(address _id);
// --- Functions ---
function setParams(uint256 _size, address _TroveManagerAddress, address _borrowerOperationsAddress) external;
function insert(address _id, uint256 _ICR, address _prevId, address _nextId) external;
function remove(address _id) external;
function reInsert(address _id, uint256 _newICR, address _prevId, address _nextId) external;
function contains(address _id) external view returns (bool);
function isFull() external view returns (bool);
function isEmpty() external view returns (bool);
function getSize() external view returns (uint256);
function getMaxSize() external view returns (uint256);
function getFirst() external view returns (address);
function getLast() external view returns (address);
function getNext(address _id) external view returns (address);
function getPrev(address _id) external view returns (address);
function validInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (bool);
function findInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (address, address);
}// SPDX-License-Identifier: MIT
pragma solidity =0.8.10;
// Common interface for the Trove Manager.
interface ITroveManager {
// --- Events ---
event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
event PriceFeedAddressChanged(address _newPriceFeedAddress);
event LUSDTokenAddressChanged(address _newLUSDTokenAddress);
event ActivePoolAddressChanged(address _activePoolAddress);
event DefaultPoolAddressChanged(address _defaultPoolAddress);
event StabilityPoolAddressChanged(address _stabilityPoolAddress);
event GasPoolAddressChanged(address _gasPoolAddress);
event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress);
event SortedTrovesAddressChanged(address _sortedTrovesAddress);
event LQTYTokenAddressChanged(address _lqtyTokenAddress);
event LQTYStakingAddressChanged(address _lqtyStakingAddress);
event Liquidation(uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _LUSDGasCompensation);
event Redemption(uint _attemptedLUSDAmount, uint _actualLUSDAmount, uint _ETHSent, uint _ETHFee);
event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, uint8 operation);
event TroveLiquidated(address indexed _borrower, uint _debt, uint _coll, uint8 operation);
event BaseRateUpdated(uint _baseRate);
event LastFeeOpTimeUpdated(uint _lastFeeOpTime);
event TotalStakesUpdated(uint _newTotalStakes);
event SystemSnapshotsUpdated(uint _totalStakesSnapshot, uint _totalCollateralSnapshot);
event LTermsUpdated(uint _L_ETH, uint _L_LUSDDebt);
event TroveSnapshotsUpdated(uint _L_ETH, uint _L_LUSDDebt);
event TroveIndexUpdated(address _borrower, uint _newIndex);
function getTroveOwnersCount() external view returns (uint);
function getTroveFromTroveOwnersArray(uint _index) external view returns (address);
function getNominalICR(address _borrower) external view returns (uint);
function getCurrentICR(address _borrower, uint _price) external view returns (uint);
function liquidate(address _borrower) external;
function liquidateTroves(uint _n) external;
function batchLiquidateTroves(address[] calldata _troveArray) external;
function redeemCollateral(
uint _LUSDAmount,
address _firstRedemptionHint,
address _upperPartialRedemptionHint,
address _lowerPartialRedemptionHint,
uint _partialRedemptionHintNICR,
uint _maxIterations,
uint _maxFee
) external;
function updateStakeAndTotalStakes(address _borrower) external returns (uint);
function updateTroveRewardSnapshots(address _borrower) external;
function addTroveOwnerToArray(address _borrower) external returns (uint index);
function applyPendingRewards(address _borrower) external;
function getPendingETHReward(address _borrower) external view returns (uint);
function getPendingLUSDDebtReward(address _borrower) external view returns (uint);
function hasPendingRewards(address _borrower) external view returns (bool);
function getEntireDebtAndColl(address _borrower) external view returns (
uint debt,
uint coll,
uint pendingLUSDDebtReward,
uint pendingETHReward
);
function closeTrove(address _borrower) external;
function removeStake(address _borrower) external;
function getRedemptionRate() external view returns (uint);
function getRedemptionRateWithDecay() external view returns (uint);
function getRedemptionFeeWithDecay(uint _ETHDrawn) external view returns (uint);
function getBorrowingRate() external view returns (uint);
function getBorrowingRateWithDecay() external view returns (uint);
function getBorrowingFee(uint LUSDDebt) external view returns (uint);
function getBorrowingFeeWithDecay(uint _LUSDDebt) external view returns (uint);
function decayBaseRateFromBorrowing() external;
function getTroveStatus(address _borrower) external view returns (uint);
function getTroveStake(address _borrower) external view returns (uint);
function getTroveDebt(address _borrower) external view returns (uint);
function getTroveColl(address _borrower) external view returns (uint);
function setTroveStatus(address _borrower, uint num) external;
function increaseTroveColl(address _borrower, uint _collIncrease) external returns (uint);
function decreaseTroveColl(address _borrower, uint _collDecrease) external returns (uint);
function increaseTroveDebt(address _borrower, uint _debtIncrease) external returns (uint);
function decreaseTroveDebt(address _borrower, uint _collDecrease) external returns (uint);
function getTCR(uint _price) external view returns (uint);
function checkRecoveryMode(uint _price) external view returns (bool);
function Troves(address) external view returns (uint256, uint256, uint256, uint8, uint128);
}{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"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":"_registry","type":"address"},{"internalType":"address","name":"_troveManager","type":"address"},{"internalType":"address","name":"_hintHelpers","type":"address"},{"internalType":"address","name":"_sortedTroves","type":"address"},{"internalType":"address","name":"_collSurplusPool","type":"address"},{"internalType":"address","name":"_proxyFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"smartAccountAddress","type":"address"}],"name":"SmartAccountCreated","type":"event"},{"inputs":[],"name":"CollSurplusPool","outputs":[{"internalType":"contract ICollSurplusPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HintHelpers","outputs":[{"internalType":"contract IHintHelpers","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ProxyFactory","outputs":[{"internalType":"contract DSProxyFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SortedTroves","outputs":[{"internalType":"contract ISortedTroves","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TroveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"addCollateralLiquity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"address","name":"_LUSDAddress","type":"address"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"adjustCreditLineLiquity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"address","name":"_LUSDFrom","type":"address"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"adjustCreditLineLiquityWithPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"address","name":"_LUSDTo","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"borrowLUSDLiquity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"bool","name":"_isCollateralIncrease","type":"bool"},{"internalType":"uint256","name":"_collateralChange","type":"uint256"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"calculateChangedLiquityParameters","outputs":[{"internalType":"uint256","name":"newCollateral","type":"uint256"},{"internalType":"uint256","name":"expectedDebtToRepay","type":"uint256"},{"internalType":"uint256","name":"liquidationReserve","type":"uint256"},{"internalType":"uint256","name":"expectedCompositeDebtLiquity","type":"uint256"},{"internalType":"uint256","name":"NICR","type":"uint256"},{"internalType":"address","name":"upperHint","type":"address"},{"internalType":"address","name":"lowerHint","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequested","type":"uint256"},{"internalType":"uint256","name":"_collateralAmount","type":"uint256"}],"name":"calculateInitialLiquityParameters","outputs":[{"internalType":"uint256","name":"expectedDebtToRepay","type":"uint256"},{"internalType":"uint256","name":"liquidationReserve","type":"uint256"},{"internalType":"uint256","name":"expectedCompositeDebtLiquity","type":"uint256"},{"internalType":"uint256","name":"NICR","type":"uint256"},{"internalType":"address","name":"upperHint","type":"address"},{"internalType":"address","name":"lowerHint","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_smartAccount","type":"address"}],"name":"checkClaimableCollateralLiquity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"claimRemainingCollateralLiquity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_LUSDFrom","type":"address"},{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"closeCreditLineLiquity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_LUSDFrom","type":"address"},{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"closeCreditLineLiquityWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"getCreditLineStatusLiquity","outputs":[{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"debtToRepay","type":"uint256"},{"internalType":"uint256","name":"debtComposite","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequested","type":"uint256"},{"internalType":"address","name":"_LUSDTo","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"openCreditLineLiquity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"openSmartAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"address","name":"_LUSDFrom","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"repayLUSDLiquity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDRequestedChange","type":"uint256"},{"internalType":"address","name":"_LUSDFrom","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"repayLUSDLiquityWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userAdoptionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address payable","name":"_collateralTo","type":"address"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"},{"internalType":"address payable","name":"_smartAccount","type":"address"}],"name":"withdrawCollateralLiquity","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101406040523480156200001257600080fd5b506040516200250438038062002504833981016040819052620000359162000082565b6001600160a01b0395861660805293851660c05291841660e0528316610100528216610120521660a05262000103565b80516001600160a01b03811681146200007d57600080fd5b919050565b60008060008060008060c087890312156200009c57600080fd5b620000a78762000065565b9550620000b76020880162000065565b9450620000c76040880162000065565b9350620000d76060880162000065565b9250620000e76080880162000065565b9150620000f760a0880162000065565b90509295509295509295565b60805160a05160c05160e0516101005161012051612348620001bc6000396000818161029c015261099a0152600081816103800152818161138801526114f20152600081816102680152611455015260008181610318015281816108d001528181610ad70152818161130001526117e301526000818161016b0152610d7201526000818161034c01528181610e3701528181610fc8015281816111af015281816115af01528181611707015261187e01526123486000f3fe60806040526004361061013f5760003560e01c806369a02818116100b6578063c410654b1161006f578063c410654b14610429578063c892a63014610449578063caa5f62514610469578063e0abde72146104ca578063eb14f505146104dd578063f520b3a4146104fd57600080fd5b806369a02818146103065780637b1039991461033a578063b15c40001461036e578063ba45369c146103a2578063bd64061f146103c5578063c20b24f61461040957600080fd5b8063422c9e9e11610108578063422c9e9e146101fd5780634acd820e146102565780635915b3a41461028a5780635d83dc39146102be5780636239615d146102de5780636559b765146102f157600080fd5b8062b748ee1461014457806301c0489c1461015957806304f14191146101aa5780631751ce63146101ca57806338e6e5e4146101dd575b600080fd5b610157610152366004611c39565b61051d565b005b34801561016557600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101b657600080fd5b506101576101c5366004611cb0565b61058f565b6101576101d8366004611d3e565b61061c565b3480156101e957600080fd5b506101576101f8366004611dea565b6106bb565b34801561020957600080fd5b5061021d610218366004611e23565b610712565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c0016101a1565b34801561026257600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561029657600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102ca57600080fd5b506101576102d9366004611c39565b61077c565b6101576102ec366004611e5a565b6107ca565b3480156102fd57600080fd5b5061015761084d565b34801561031257600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561034657600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561037a57600080fd5b5061018d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103ae57600080fd5b506103b7610858565b6040519081526020016101a1565b3480156103d157600080fd5b506103e56103e0366004611ede565b6108a8565b6040805160ff909516855260208501939093529183015260608201526080016101a1565b34801561041557600080fd5b506103b7610424366004611ede565b610978565b34801561043557600080fd5b50610157610444366004611efb565b610a0d565b34801561045557600080fd5b50610157610464366004611c39565b610a6d565b34801561047557600080fd5b50610489610484366004611f46565b610abb565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b0390811660a08401521660c082015260e0016101a1565b6101576104d8366004611efb565b610c3e565b3480156104e957600080fd5b506101576104f8366004611c39565b610c98565b34801561050957600080fd5b50610157610518366004611f93565b610cf3565b6001600160a01b03811615610532578061053a565b61053a610d6d565b90506105888134878787873360405160240161055a959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316625ba47760e11b1790526110d5565b5050505050565b604051602481018990526001600160a01b03808916604483015280881660648301528616608482015260ff851660a482015260c4810184905260e48101839052336101048201526106129082906000906101240160408051601f198184030181529190526020810180516001600160e01b03166304f1419160e01b1790526110d5565b5050505050505050565b604051602481018b90526001600160a01b03808b166044830152606482018a9052808916608483015280881660a4830152861660c482015260ff851660e482015261010481018490526101248101839052336101448201526106af90829034906101640160408051601f198184030181529190526020810180516001600160e01b0316631751ce6360e01b1790526110d5565b50505050505050505050565b6040516001600160a01b038316602482015233604482015261070e90829060009060640160408051601f198184030181529190526020810180516001600160e01b0316630e39b97960e21b1790526110d5565b5050565b6000680ad78ebc5ac62000008180808061072b886112bd565b9550610740680ad78ebc5ac620000087612047565b9350836107568868056bc75e2d6310000061205f565b6107609190612094565b925061076b83611381565b969995985093965091949293915050565b610588816000878787873360405160240161079b959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316635d83dc3960e01b1790526110d5565b6040518815156024820152604481018890526001600160a01b0380881660648301526084820187905280861660a483015280851660c4830152831660e4820152336101048201526106129082903490610124015b60408051601f198184030181529190526020810180516001600160e01b0316636239615d60e01b1790526110d5565b610855610d6d565b50565b600080600061086561156b565b9092509050600061ffff8316610885612710670de0b6b3a7640000612094565b61088f919061205f565b905081811061089e57806108a0565b815b935050505090565b604051630ddec86760e31b81526001600160a01b0382811660048301526000918291829182917f00000000000000000000000000000000000000000000000000000000000000001690636ef643389060240160a060405180830381865afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093b91906120b6565b50965090945090915050680ad78ebc5ac6200000811161095c57600061096f565b61096f680ad78ebc5ac620000082612114565b91509193509193565b604051639b56d6c960e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690639b56d6c990602401602060405180830381865afa1580156109e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a07919061212b565b92915050565b6040516001600160a01b03808516602483015283166044820152336064820152610a6890829060009060840160408051601f198184030181529190526020810180516001600160e01b031663c410654b60e01b1790526110d5565b505050565b6105888160008787878733604051602401610a8c959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316630c892a6360e41b1790526110d5565b6000806000806000806000680ad78ebc5ac620000094506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b91af97c8b6040518263ffffffff1660e01b8152600401610b3091906001600160a01b0391909116815260200190565b608060405180830381865afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190612144565b5050915091506000680ad78ebc5ac620000083610b8e9190612114565b90508c15610ba757610ba08c83612047565b9950610bb4565b610bb18c83612114565b99505b8e15610bd9576000610bc58f6112bd565b9050610bd18183612047565b995050610be6565b610be38e82612114565b98505b610bf9680ad78ebc5ac62000008a612047565b965086610c0f8b68056bc75e2d6310000061205f565b610c199190612094565b9550610c2486611381565b8095508196505050505050959b949a509550955095509550565b6040516001600160a01b03808516602483015283166044820152336064820152610a68908290349060840160408051601f198184030181529190526020810180516001600160e01b0316637055ef3960e11b17905261186c565b60405160016024820152604481018690526001600160a01b0380861660648301526000608483018190523360a4840181905282871660c485015291851660e4840152610104830191909152610588918391906101240161081e565b6040516001600160a01b0380881660248301528616604482015260ff851660648201526084810184905260a481018390523360c4820152610d6590829060009060e40160408051601f198184030181529190526020810180516001600160e01b0316633d482ce960e21b1790526110d5565b505050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638e1a55fc6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df4919061217a565b6040516321f8a72160e01b81527f8b16b0b80f67879a61157c5541d94886825d45098bee58e37e2d2e87b2fe367b60048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321f8a72190602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea2919061217a565b604051637a9e5e4b60e01b81526001600160a01b03808316600483015291925090831690637a9e5e4b90602401600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b50506040516313af403560e01b81523360048201526001600160a01b03851692506313af40359150602401600060405180830381600087803b158015610f4257600080fd5b505af1158015610f56573d6000803e3d6000fd5b50506040516001600160a01b03851692503391507f11f81d728010658858b98bd3e5ece1f1a7a9caf6fb57f3742794cfc1c1e8aa9090600090a36040516321f8a72160e01b81527fe02f0ae036ce53d23638e7b8f91c7b58ddb5bb2ac782194ca7ae5ff0826a8c6f60048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906321f8a72190602401602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b919061217a565b9050806001600160a01b03166385d3a13230338660405160200161106e91906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161109b939291906121e4565b600060405180830381600087803b1580156110b557600080fd5b505af11580156110c9573d6000803e3d6000fd5b50949695505050505050565b82336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611142919061217a565b6001600160a01b03161461119d5760405162461bcd60e51b815260206004820152601c60248201527f53656e6465722068617320746f2062652070726f7879206f776e65720000000060448201526064015b60405180910390fd5b836001600160a01b0316631cff79cd847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166321f8a7217feb35d5f9843d4076628c4747d195abdd0312e0b8b8f5812a706f3d25ea0b10746040518263ffffffff1660e01b815260040161121b91815260200190565b602060405180830381865afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c919061217a565b856040518463ffffffff1660e01b815260040161127a929190612241565b60206040518083038185885af1158015611298573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610588919061212b565b60008060006112ca61156b565b909250905060006112dc858385611992565b60405163477d66cf60e01b8152600481018290529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063477d66cf90602401602060405180830381865afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b919061212b565b90506113778183612047565b9695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061212b565b9050600061141582611a80565b61142090600f61205f565b604051633da0dedf60e11b81526004810187905260248101829052634150555360448201529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637b41bdbe90606401606060405180830381865afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c09190612265565b505060405163105a603760e21b8152600481018890526001600160a01b038083166024830181905260448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063416980dc906064016040805180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e919061229c565b9097909650945050505050565b6040516321f8a72160e01b81527f4783a7bf568159da8dab9963f361ffb520fa09d911fcf017b1a7273038b176406004820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321f8a72190602401602060405180830381865afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a919061217a565b6040516bffffffffffffffffffffffff193360601b1660208201529091506000906001600160a01b0383169063597211b090603401604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161168391815260200190565b602060405180830381865afa1580156116a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c491906122cb565b6040516321f8a72160e01b81527f48fd0b937c5f6bca9b37c93d4dfaa4c645a0d160ca5949ee15270fd6936c924b60048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906321f8a72190602401602060405180830381865afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611772919061217a565b90506117df82826001600160a01b03166349208e026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da91906122cb565b611bfb565b94507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166366ca4a216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561183f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611863919061212b565b93505050509091565b826001600160a01b0316631cff79cd837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166321f8a7217feb35d5f9843d4076628c4747d195abdd0312e0b8b8f5812a706f3d25ea0b10746040518263ffffffff1660e01b81526004016118ea91815260200190565b602060405180830381865afa158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b919061217a565b846040518463ffffffff1660e01b8152600401611949929190612241565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c919061212b565b50505050565b60008061ffff83166119ae612710670de0b6b3a7640000612094565b6119b8919061205f565b90508381106119c757806119c9565b835b9050600085670de0b6b3a76400006119e1848361205f565b6119eb9190612094565b6119f59190612047565b9050611a0985670de0b6b3a7640000612047565b611a1b82670de0b6b3a764000061205f565b611a259190612094565b925085831015611a775760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74206d696e74206c657373207468616e207265717565737465642e6044820152606401611194565b50509392505050565b600081611a8f57506000919050565b50600181600160801b8110611aa95760409190911b9060801c5b680100000000000000008110611ac45760209190911b9060401c5b6401000000008110611adb5760109190911b9060201c5b620100008110611af05760089190911b9060101c5b6101008110611b045760049190911b9060081c5b60108110611b175760029190911b9060041c5b60088110611b2757600182901b91505b6001828481611b3857611b3861207e565b048301901c91506001828481611b5057611b5061207e565b048301901c91506001828481611b6857611b6861207e565b048301901c91506001828481611b8057611b8061207e565b048301901c91506001828481611b9857611b9861207e565b048301901c91506001828481611bb057611bb061207e565b048301901c91506001828481611bc857611bc861207e565b048301901c91506000828481611be057611be061207e565b04905080831015611bf15782611bf3565b805b949350505050565b60008261ffff168261ffff1611611c13576000611c1d565b611c1d83836122ef565b9392505050565b6001600160a01b038116811461085557600080fd5b600080600080600060a08688031215611c5157600080fd5b853594506020860135611c6381611c24565b93506040860135611c7381611c24565b92506060860135611c8381611c24565b91506080860135611c9381611c24565b809150509295509295909350565b60ff8116811461085557600080fd5b600080600080600080600080610100898b031215611ccd57600080fd5b883597506020890135611cdf81611c24565b96506040890135611cef81611c24565b95506060890135611cff81611c24565b94506080890135611d0f81611ca1565b935060a0890135925060c0890135915060e0890135611d2d81611c24565b809150509295985092959890939650565b6000806000806000806000806000806101408b8d031215611d5e57600080fd5b8a35995060208b0135611d7081611c24565b985060408b0135975060608b0135611d8781611c24565b965060808b0135611d9781611c24565b955060a08b0135611da781611c24565b945060c08b0135611db781611ca1565b935060e08b013592506101008b013591506101208b0135611dd781611c24565b809150509295989b9194979a5092959850565b60008060408385031215611dfd57600080fd5b8235611e0881611c24565b91506020830135611e1881611c24565b809150509250929050565b60008060408385031215611e3657600080fd5b50508035926020909101359150565b80358015158114611e5557600080fd5b919050565b600080600080600080600080610100898b031215611e7757600080fd5b611e8089611e45565b9750602089013596506040890135611e9781611c24565b9550606089013594506080890135611eae81611c24565b935060a0890135611ebe81611c24565b925060c0890135611ece81611c24565b915060e0890135611d2d81611c24565b600060208284031215611ef057600080fd5b8135611c1d81611c24565b600080600060608486031215611f1057600080fd5b8335611f1b81611c24565b92506020840135611f2b81611c24565b91506040840135611f3b81611c24565b809150509250925092565b600080600080600060a08688031215611f5e57600080fd5b611f6786611e45565b945060208601359350611f7c60408701611e45565b9250606086013591506080860135611c9381611c24565b60008060008060008060c08789031215611fac57600080fd5b8635611fb781611c24565b95506020870135611fc781611c24565b94506040870135611fd781611ca1565b9350606087013592506080870135915060a0870135611ff581611c24565b809150509295509295509295565b9485526001600160a01b03938416602086015291831660408501528216606084015216608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561205a5761205a612031565b500190565b600081600019048311821515161561207957612079612031565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826120b157634e487b7160e01b600052601260045260246000fd5b500490565b600080600080600060a086880312156120ce57600080fd5b85519450602086015193506040860151925060608601516120ee81611ca1565b60808701519092506fffffffffffffffffffffffffffffffff81168114611c9357600080fd5b60008282101561212657612126612031565b500390565b60006020828403121561213d57600080fd5b5051919050565b6000806000806080858703121561215a57600080fd5b505082516020840151604085015160609095015191969095509092509050565b60006020828403121561218c57600080fd5b8151611c1d81611c24565b6000815180845260005b818110156121bd576020818501810151868301820152016121a1565b818111156121cf576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b038481168252831660208201526080604082018190526010908201526f1bdc195b94db585c9d1058d8dbdd5b9d60821b60a082015260c06060820181905260009061223890830184612197565b95945050505050565b6001600160a01b0383168152604060208201819052600090611bf390830184612197565b60008060006060848603121561227a57600080fd5b835161228581611c24565b602085015160409095015190969495509392505050565b600080604083850312156122af57600080fd5b82516122ba81611c24565b6020840151909250611e1881611c24565b6000602082840312156122dd57600080fd5b815161ffff81168114611c1d57600080fd5b600061ffff8381169083168181101561230a5761230a612031565b03939250505056fea264697066735822122078bddd6ceaf72b058d267ba845ccbd54b29f21e9ce281a28c452f5ec59b71bed64736f6c634300080a0033000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb2000000000000000000000000e84251b93d9524e0d2e621ba7dc7cb3579f997c00000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a60000000000000000000000003d32e8b97ed5881324241cf03b2da5e2ebce5521000000000000000000000000a26e15c895efc0616177b7c1e7270a4c7d51c997
Deployed Bytecode
0x60806040526004361061013f5760003560e01c806369a02818116100b6578063c410654b1161006f578063c410654b14610429578063c892a63014610449578063caa5f62514610469578063e0abde72146104ca578063eb14f505146104dd578063f520b3a4146104fd57600080fd5b806369a02818146103065780637b1039991461033a578063b15c40001461036e578063ba45369c146103a2578063bd64061f146103c5578063c20b24f61461040957600080fd5b8063422c9e9e11610108578063422c9e9e146101fd5780634acd820e146102565780635915b3a41461028a5780635d83dc39146102be5780636239615d146102de5780636559b765146102f157600080fd5b8062b748ee1461014457806301c0489c1461015957806304f14191146101aa5780631751ce63146101ca57806338e6e5e4146101dd575b600080fd5b610157610152366004611c39565b61051d565b005b34801561016557600080fd5b5061018d7f000000000000000000000000a26e15c895efc0616177b7c1e7270a4c7d51c99781565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156101b657600080fd5b506101576101c5366004611cb0565b61058f565b6101576101d8366004611d3e565b61061c565b3480156101e957600080fd5b506101576101f8366004611dea565b6106bb565b34801561020957600080fd5b5061021d610218366004611e23565b610712565b6040805196875260208701959095529385019290925260608401526001600160a01b0390811660808401521660a082015260c0016101a1565b34801561026257600080fd5b5061018d7f000000000000000000000000e84251b93d9524e0d2e621ba7dc7cb3579f997c081565b34801561029657600080fd5b5061018d7f0000000000000000000000003d32e8b97ed5881324241cf03b2da5e2ebce552181565b3480156102ca57600080fd5b506101576102d9366004611c39565b61077c565b6101576102ec366004611e5a565b6107ca565b3480156102fd57600080fd5b5061015761084d565b34801561031257600080fd5b5061018d7f000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb281565b34801561034657600080fd5b5061018d7f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c81565b34801561037a57600080fd5b5061018d7f0000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a681565b3480156103ae57600080fd5b506103b7610858565b6040519081526020016101a1565b3480156103d157600080fd5b506103e56103e0366004611ede565b6108a8565b6040805160ff909516855260208501939093529183015260608201526080016101a1565b34801561041557600080fd5b506103b7610424366004611ede565b610978565b34801561043557600080fd5b50610157610444366004611efb565b610a0d565b34801561045557600080fd5b50610157610464366004611c39565b610a6d565b34801561047557600080fd5b50610489610484366004611f46565b610abb565b60408051978852602088019690965294860193909352606085019190915260808401526001600160a01b0390811660a08401521660c082015260e0016101a1565b6101576104d8366004611efb565b610c3e565b3480156104e957600080fd5b506101576104f8366004611c39565b610c98565b34801561050957600080fd5b50610157610518366004611f93565b610cf3565b6001600160a01b03811615610532578061053a565b61053a610d6d565b90506105888134878787873360405160240161055a959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316625ba47760e11b1790526110d5565b5050505050565b604051602481018990526001600160a01b03808916604483015280881660648301528616608482015260ff851660a482015260c4810184905260e48101839052336101048201526106129082906000906101240160408051601f198184030181529190526020810180516001600160e01b03166304f1419160e01b1790526110d5565b5050505050505050565b604051602481018b90526001600160a01b03808b166044830152606482018a9052808916608483015280881660a4830152861660c482015260ff851660e482015261010481018490526101248101839052336101448201526106af90829034906101640160408051601f198184030181529190526020810180516001600160e01b0316631751ce6360e01b1790526110d5565b50505050505050505050565b6040516001600160a01b038316602482015233604482015261070e90829060009060640160408051601f198184030181529190526020810180516001600160e01b0316630e39b97960e21b1790526110d5565b5050565b6000680ad78ebc5ac62000008180808061072b886112bd565b9550610740680ad78ebc5ac620000087612047565b9350836107568868056bc75e2d6310000061205f565b6107609190612094565b925061076b83611381565b969995985093965091949293915050565b610588816000878787873360405160240161079b959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316635d83dc3960e01b1790526110d5565b6040518815156024820152604481018890526001600160a01b0380881660648301526084820187905280861660a483015280851660c4830152831660e4820152336101048201526106129082903490610124015b60408051601f198184030181529190526020810180516001600160e01b0316636239615d60e01b1790526110d5565b610855610d6d565b50565b600080600061086561156b565b9092509050600061ffff8316610885612710670de0b6b3a7640000612094565b61088f919061205f565b905081811061089e57806108a0565b815b935050505090565b604051630ddec86760e31b81526001600160a01b0382811660048301526000918291829182917f000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb21690636ef643389060240160a060405180830381865afa158015610917573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093b91906120b6565b50965090945090915050680ad78ebc5ac6200000811161095c57600061096f565b61096f680ad78ebc5ac620000082612114565b91509193509193565b604051639b56d6c960e01b81526001600160a01b0382811660048301526000917f0000000000000000000000003d32e8b97ed5881324241cf03b2da5e2ebce552190911690639b56d6c990602401602060405180830381865afa1580156109e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a07919061212b565b92915050565b6040516001600160a01b03808516602483015283166044820152336064820152610a6890829060009060840160408051601f198184030181529190526020810180516001600160e01b031663c410654b60e01b1790526110d5565b505050565b6105888160008787878733604051602401610a8c959493929190612003565b60408051601f198184030181529190526020810180516001600160e01b0316630c892a6360e41b1790526110d5565b6000806000806000806000680ad78ebc5ac620000094506000807f000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb26001600160a01b031663b91af97c8b6040518263ffffffff1660e01b8152600401610b3091906001600160a01b0391909116815260200190565b608060405180830381865afa158015610b4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b719190612144565b5050915091506000680ad78ebc5ac620000083610b8e9190612114565b90508c15610ba757610ba08c83612047565b9950610bb4565b610bb18c83612114565b99505b8e15610bd9576000610bc58f6112bd565b9050610bd18183612047565b995050610be6565b610be38e82612114565b98505b610bf9680ad78ebc5ac62000008a612047565b965086610c0f8b68056bc75e2d6310000061205f565b610c199190612094565b9550610c2486611381565b8095508196505050505050959b949a509550955095509550565b6040516001600160a01b03808516602483015283166044820152336064820152610a68908290349060840160408051601f198184030181529190526020810180516001600160e01b0316637055ef3960e11b17905261186c565b60405160016024820152604481018690526001600160a01b0380861660648301526000608483018190523360a4840181905282871660c485015291851660e4840152610104830191909152610588918391906101240161081e565b6040516001600160a01b0380881660248301528616604482015260ff851660648201526084810184905260a481018390523360c4820152610d6590829060009060e40160408051601f198184030181529190526020810180516001600160e01b0316633d482ce960e21b1790526110d5565b505050505050565b6000807f000000000000000000000000a26e15c895efc0616177b7c1e7270a4c7d51c9976001600160a01b0316638e1a55fc6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df4919061217a565b6040516321f8a72160e01b81527f8b16b0b80f67879a61157c5541d94886825d45098bee58e37e2d2e87b2fe367b60048201529091506000906001600160a01b037f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c16906321f8a72190602401602060405180830381865afa158015610e7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea2919061217a565b604051637a9e5e4b60e01b81526001600160a01b03808316600483015291925090831690637a9e5e4b90602401600060405180830381600087803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b50506040516313af403560e01b81523360048201526001600160a01b03851692506313af40359150602401600060405180830381600087803b158015610f4257600080fd5b505af1158015610f56573d6000803e3d6000fd5b50506040516001600160a01b03851692503391507f11f81d728010658858b98bd3e5ece1f1a7a9caf6fb57f3742794cfc1c1e8aa9090600090a36040516321f8a72160e01b81527fe02f0ae036ce53d23638e7b8f91c7b58ddb5bb2ac782194ca7ae5ff0826a8c6f60048201526000907f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c6001600160a01b0316906321f8a72190602401602060405180830381865afa158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b919061217a565b9050806001600160a01b03166385d3a13230338660405160200161106e91906001600160a01b0391909116815260200190565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161109b939291906121e4565b600060405180830381600087803b1580156110b557600080fd5b505af11580156110c9573d6000803e3d6000fd5b50949695505050505050565b82336001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611142919061217a565b6001600160a01b03161461119d5760405162461bcd60e51b815260206004820152601c60248201527f53656e6465722068617320746f2062652070726f7879206f776e65720000000060448201526064015b60405180910390fd5b836001600160a01b0316631cff79cd847f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c6001600160a01b03166321f8a7217feb35d5f9843d4076628c4747d195abdd0312e0b8b8f5812a706f3d25ea0b10746040518263ffffffff1660e01b815260040161121b91815260200190565b602060405180830381865afa158015611238573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125c919061217a565b856040518463ffffffff1660e01b815260040161127a929190612241565b60206040518083038185885af1158015611298573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610588919061212b565b60008060006112ca61156b565b909250905060006112dc858385611992565b60405163477d66cf60e01b8152600481018290529091506000906001600160a01b037f000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb2169063477d66cf90602401602060405180830381865afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b919061212b565b90506113778183612047565b9695505050505050565b60008060007f0000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a66001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611408919061212b565b9050600061141582611a80565b61142090600f61205f565b604051633da0dedf60e11b81526004810187905260248101829052634150555360448201529091506000906001600160a01b037f000000000000000000000000e84251b93d9524e0d2e621ba7dc7cb3579f997c01690637b41bdbe90606401606060405180830381865afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c09190612265565b505060405163105a603760e21b8152600481018890526001600160a01b038083166024830181905260448301529192507f0000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a69091169063416980dc906064016040805180830381865afa15801561153a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155e919061229c565b9097909650945050505050565b6040516321f8a72160e01b81527f4783a7bf568159da8dab9963f361ffb520fa09d911fcf017b1a7273038b176406004820152600090819081906001600160a01b037f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c16906321f8a72190602401602060405180830381865afa1580156115f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161a919061217a565b6040516bffffffffffffffffffffffff193360601b1660208201529091506000906001600160a01b0383169063597211b090603401604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161168391815260200190565b602060405180830381865afa1580156116a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c491906122cb565b6040516321f8a72160e01b81527f48fd0b937c5f6bca9b37c93d4dfaa4c645a0d160ca5949ee15270fd6936c924b60048201529091506000906001600160a01b037f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c16906321f8a72190602401602060405180830381865afa15801561174e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611772919061217a565b90506117df82826001600160a01b03166349208e026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da91906122cb565b611bfb565b94507f000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb26001600160a01b03166366ca4a216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561183f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611863919061212b565b93505050509091565b826001600160a01b0316631cff79cd837f000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c6001600160a01b03166321f8a7217feb35d5f9843d4076628c4747d195abdd0312e0b8b8f5812a706f3d25ea0b10746040518263ffffffff1660e01b81526004016118ea91815260200190565b602060405180830381865afa158015611907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192b919061217a565b846040518463ffffffff1660e01b8152600401611949929190612241565b60206040518083038185885af1158015611967573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061198c919061212b565b50505050565b60008061ffff83166119ae612710670de0b6b3a7640000612094565b6119b8919061205f565b90508381106119c757806119c9565b835b9050600085670de0b6b3a76400006119e1848361205f565b6119eb9190612094565b6119f59190612047565b9050611a0985670de0b6b3a7640000612047565b611a1b82670de0b6b3a764000061205f565b611a259190612094565b925085831015611a775760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f74206d696e74206c657373207468616e207265717565737465642e6044820152606401611194565b50509392505050565b600081611a8f57506000919050565b50600181600160801b8110611aa95760409190911b9060801c5b680100000000000000008110611ac45760209190911b9060401c5b6401000000008110611adb5760109190911b9060201c5b620100008110611af05760089190911b9060101c5b6101008110611b045760049190911b9060081c5b60108110611b175760029190911b9060041c5b60088110611b2757600182901b91505b6001828481611b3857611b3861207e565b048301901c91506001828481611b5057611b5061207e565b048301901c91506001828481611b6857611b6861207e565b048301901c91506001828481611b8057611b8061207e565b048301901c91506001828481611b9857611b9861207e565b048301901c91506001828481611bb057611bb061207e565b048301901c91506001828481611bc857611bc861207e565b048301901c91506000828481611be057611be061207e565b04905080831015611bf15782611bf3565b805b949350505050565b60008261ffff168261ffff1611611c13576000611c1d565b611c1d83836122ef565b9392505050565b6001600160a01b038116811461085557600080fd5b600080600080600060a08688031215611c5157600080fd5b853594506020860135611c6381611c24565b93506040860135611c7381611c24565b92506060860135611c8381611c24565b91506080860135611c9381611c24565b809150509295509295909350565b60ff8116811461085557600080fd5b600080600080600080600080610100898b031215611ccd57600080fd5b883597506020890135611cdf81611c24565b96506040890135611cef81611c24565b95506060890135611cff81611c24565b94506080890135611d0f81611ca1565b935060a0890135925060c0890135915060e0890135611d2d81611c24565b809150509295985092959890939650565b6000806000806000806000806000806101408b8d031215611d5e57600080fd5b8a35995060208b0135611d7081611c24565b985060408b0135975060608b0135611d8781611c24565b965060808b0135611d9781611c24565b955060a08b0135611da781611c24565b945060c08b0135611db781611ca1565b935060e08b013592506101008b013591506101208b0135611dd781611c24565b809150509295989b9194979a5092959850565b60008060408385031215611dfd57600080fd5b8235611e0881611c24565b91506020830135611e1881611c24565b809150509250929050565b60008060408385031215611e3657600080fd5b50508035926020909101359150565b80358015158114611e5557600080fd5b919050565b600080600080600080600080610100898b031215611e7757600080fd5b611e8089611e45565b9750602089013596506040890135611e9781611c24565b9550606089013594506080890135611eae81611c24565b935060a0890135611ebe81611c24565b925060c0890135611ece81611c24565b915060e0890135611d2d81611c24565b600060208284031215611ef057600080fd5b8135611c1d81611c24565b600080600060608486031215611f1057600080fd5b8335611f1b81611c24565b92506020840135611f2b81611c24565b91506040840135611f3b81611c24565b809150509250925092565b600080600080600060a08688031215611f5e57600080fd5b611f6786611e45565b945060208601359350611f7c60408701611e45565b9250606086013591506080860135611c9381611c24565b60008060008060008060c08789031215611fac57600080fd5b8635611fb781611c24565b95506020870135611fc781611c24565b94506040870135611fd781611ca1565b9350606087013592506080870135915060a0870135611ff581611c24565b809150509295509295509295565b9485526001600160a01b03938416602086015291831660408501528216606084015216608082015260a00190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561205a5761205a612031565b500190565b600081600019048311821515161561207957612079612031565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826120b157634e487b7160e01b600052601260045260246000fd5b500490565b600080600080600060a086880312156120ce57600080fd5b85519450602086015193506040860151925060608601516120ee81611ca1565b60808701519092506fffffffffffffffffffffffffffffffff81168114611c9357600080fd5b60008282101561212657612126612031565b500390565b60006020828403121561213d57600080fd5b5051919050565b6000806000806080858703121561215a57600080fd5b505082516020840151604085015160609095015191969095509092509050565b60006020828403121561218c57600080fd5b8151611c1d81611c24565b6000815180845260005b818110156121bd576020818501810151868301820152016121a1565b818111156121cf576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b038481168252831660208201526080604082018190526010908201526f1bdc195b94db585c9d1058d8dbdd5b9d60821b60a082015260c06060820181905260009061223890830184612197565b95945050505050565b6001600160a01b0383168152604060208201819052600090611bf390830184612197565b60008060006060848603121561227a57600080fd5b835161228581611c24565b602085015160409095015190969495509392505050565b600080604083850312156122af57600080fd5b82516122ba81611c24565b6020840151909250611e1881611c24565b6000602082840312156122dd57600080fd5b815161ffff81168114611c1d57600080fd5b600061ffff8381169083168181101561230a5761230a612031565b03939250505056fea264697066735822122078bddd6ceaf72b058d267ba845ccbd54b29f21e9ce281a28c452f5ec59b71bed64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb2000000000000000000000000e84251b93d9524e0d2e621ba7dc7cb3579f997c00000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a60000000000000000000000003d32e8b97ed5881324241cf03b2da5e2ebce5521000000000000000000000000a26e15c895efc0616177b7c1e7270a4c7d51c997
-----Decoded View---------------
Arg [0] : _registry (address): 0xe19968D1CDcF71651A6131B26ACC6c23bC12192C
Arg [1] : _troveManager (address): 0xA39739EF8b0231DbFA0DcdA07d7e29faAbCf4bb2
Arg [2] : _hintHelpers (address): 0xE84251b93D9524E0d2e621Ba7dc7cb3579F997C0
Arg [3] : _sortedTroves (address): 0x8FdD3fbFEb32b28fb73555518f8b361bCeA741A6
Arg [4] : _collSurplusPool (address): 0x3D32e8b97Ed5881324241Cf03b2DA5E2EBcE5521
Arg [5] : _proxyFactory (address): 0xA26e15C895EFc0616177B7c1e7270A4C7D51C997
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000e19968d1cdcf71651a6131b26acc6c23bc12192c
Arg [1] : 000000000000000000000000a39739ef8b0231dbfa0dcda07d7e29faabcf4bb2
Arg [2] : 000000000000000000000000e84251b93d9524e0d2e621ba7dc7cb3579f997c0
Arg [3] : 0000000000000000000000008fdd3fbfeb32b28fb73555518f8b361bcea741a6
Arg [4] : 0000000000000000000000003d32e8b97ed5881324241cf03b2da5e2ebce5521
Arg [5] : 000000000000000000000000a26e15c895efc0616177b7c1e7270a4c7d51c997
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.