Source Code
Latest 25 from a total of 107 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Exit | 14786222 | 1361 days ago | IN | 0 ETH | 0.00250398 | ||||
| Exit | 14785132 | 1361 days ago | IN | 0 ETH | 0.00128298 | ||||
| Exit | 14785124 | 1361 days ago | IN | 0 ETH | 0.00215229 | ||||
| Exit | 14774944 | 1363 days ago | IN | 0 ETH | 0.0031436 | ||||
| Exit | 14774467 | 1363 days ago | IN | 0 ETH | 0.00501595 | ||||
| Exit_Eth | 14769118 | 1364 days ago | IN | 0 ETH | 0.01247548 | ||||
| Exit | 14768130 | 1364 days ago | IN | 0 ETH | 0.06499466 | ||||
| Trigger Liquidat... | 14766115 | 1364 days ago | IN | 0 ETH | 0.01241099 | ||||
| Trigger Liquidat... | 14762595 | 1365 days ago | IN | 0 ETH | 0.05888348 | ||||
| Trigger Liquidat... | 14762595 | 1365 days ago | IN | 0 ETH | 0.07506593 | ||||
| Trigger Liquidat... | 14762595 | 1365 days ago | IN | 0 ETH | 0.07506593 | ||||
| Trigger Liquidat... | 14762161 | 1365 days ago | IN | 0 ETH | 0.08654889 | ||||
| Join | 14760338 | 1365 days ago | IN | 0 ETH | 0.01431039 | ||||
| Join | 14760178 | 1365 days ago | IN | 0 ETH | 0.02334113 | ||||
| Join | 14759259 | 1365 days ago | IN | 0 ETH | 0.03408302 | ||||
| Join | 14759105 | 1365 days ago | IN | 0 ETH | 0.02616454 | ||||
| Join | 14759088 | 1365 days ago | IN | 0 ETH | 0.02468571 | ||||
| Exit | 14758015 | 1365 days ago | IN | 0 ETH | 0.05867769 | ||||
| Exit | 14758002 | 1365 days ago | IN | 0 ETH | 0.07890468 | ||||
| Exit | 14757961 | 1365 days ago | IN | 0 ETH | 0.06335227 | ||||
| Exit | 14757878 | 1365 days ago | IN | 0 ETH | 0.05775987 | ||||
| Exit | 14757873 | 1365 days ago | IN | 0 ETH | 0.01050864 | ||||
| Exit | 14757781 | 1366 days ago | IN | 0 ETH | 0.0140597 | ||||
| Join | 14757336 | 1366 days ago | IN | 0 ETH | 0.01649267 | ||||
| Join | 14757335 | 1366 days ago | IN | 0 ETH | 0.01715663 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CDPManager01
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity 0.7.6; import './BaseCDPManager.sol'; import '../interfaces/IOracleRegistry.sol'; import '../interfaces/IOracleUsd.sol'; import '../interfaces/IWETH.sol'; import '../interfaces/IVault.sol'; import '../interfaces/ICDPRegistry.sol'; import '../interfaces/vault-managers/parameters/IVaultManagerParameters.sol'; import '../interfaces/IVaultParameters.sol'; import '../interfaces/IToken.sol'; import "../interfaces/wrapped-assets/IWrappedAsset.sol"; import '../helpers/ReentrancyGuard.sol'; import '../helpers/SafeMath.sol'; /** * @title CDPManager01 **/ contract CDPManager01 is BaseCDPManager { using SafeMath for uint; address payable public immutable WETH; /** * @param _vaultManagerParameters The address of the contract with Vault manager parameters * @param _oracleRegistry The address of the oracle registry * @param _cdpRegistry The address of the CDP registry * @param _vaultManagerBorrowFeeParameters The address of the vault manager borrow fee parameters **/ constructor(address _vaultManagerParameters, address _oracleRegistry, address _cdpRegistry, address _vaultManagerBorrowFeeParameters) BaseCDPManager(_vaultManagerParameters, _oracleRegistry, _cdpRegistry, _vaultManagerBorrowFeeParameters) { WETH = IVault(IVaultParameters(IVaultManagerParameters(_vaultManagerParameters).vaultParameters()).vault()).weth(); } // only accept ETH via fallback from the WETH contract receive() external payable { require(msg.sender == WETH, "Unit Protocol: RESTRICTED"); } /** * @notice Depositing tokens must be pre-approved to Vault address * @notice Borrow fee in USDP tokens must be pre-approved to CDP manager address * @notice position actually considered as spawned only when debt > 0 * @dev Deposits collateral and/or borrows USDP * @param asset The address of the collateral * @param assetAmount The amount of the collateral to deposit * @param usdpAmount The amount of USDP token to borrow **/ function join(address asset, uint assetAmount, uint usdpAmount) public nonReentrant checkpoint(asset, msg.sender) { require(usdpAmount != 0 || assetAmount != 0, "Unit Protocol: USELESS_TX"); require(IToken(asset).decimals() <= 18, "Unit Protocol: NOT_SUPPORTED_DECIMALS"); if (usdpAmount == 0) { vault.depositMain(asset, msg.sender, assetAmount); } else { _ensureOracle(asset); bool spawned = vault.debts(asset, msg.sender) != 0; if (!spawned) { // spawn a position vault.spawn(asset, msg.sender, oracleRegistry.oracleTypeByAsset(asset)); } if (assetAmount != 0) { vault.depositMain(asset, msg.sender, assetAmount); } // mint USDP to owner vault.borrow(asset, msg.sender, usdpAmount); _chargeBorrowFee(asset, msg.sender, usdpAmount); // check collateralization _ensurePositionCollateralization(asset, msg.sender); } // fire an event emit Join(asset, msg.sender, assetAmount, usdpAmount); } /** * @dev Deposits ETH and/or borrows USDP * @param usdpAmount The amount of USDP token to borrow **/ function join_Eth(uint usdpAmount) external payable { if (msg.value != 0) { IWETH(WETH).deposit{value: msg.value}(); require(IWETH(WETH).transfer(msg.sender, msg.value), "Unit Protocol: WETH_TRANSFER_FAILED"); } join(WETH, msg.value, usdpAmount); } /** * @notice Deposit asset, stake it if supported, mint wrapped asset and lock it, borrow USDP * @notice User must: * @notice - preapprove token to wrappedAsset: to deposit asset to wrapped asset for wrapping * @notice - preapprove wrapped token to vault: to deposit wrapped asset to vault * @notice - preapprove USDP to CDPManager: to charge borrow (issuance) fee * @param wrappedAsset Address of wrapped asset * @param assetAmount The amount of the collateral to deposit * @param usdpAmount The amount of USDP token to borrow **/ function wrapAndJoin(IWrappedAsset wrappedAsset, uint assetAmount, uint usdpAmount) external { if (assetAmount != 0) { wrappedAsset.deposit(msg.sender, assetAmount); } join(address(wrappedAsset), assetAmount, usdpAmount); } /** * @notice Tx sender must have a sufficient USDP balance to pay the debt * @dev Withdraws collateral and repays specified amount of debt * @param asset The address of the collateral * @param assetAmount The amount of the collateral to withdraw * @param usdpAmount The amount of USDP to repay **/ function exit(address asset, uint assetAmount, uint usdpAmount) public nonReentrant checkpoint(asset, msg.sender) returns (uint) { // check usefulness of tx require(assetAmount != 0 || usdpAmount != 0, "Unit Protocol: USELESS_TX"); uint debt = vault.debts(asset, msg.sender); // catch full repayment if (usdpAmount > debt) { usdpAmount = debt; } if (assetAmount == 0) { _repay(asset, msg.sender, usdpAmount); } else { if (debt == usdpAmount) { vault.withdrawMain(asset, msg.sender, assetAmount); if (usdpAmount != 0) { _repay(asset, msg.sender, usdpAmount); } } else { _ensureOracle(asset); // withdraw collateral to the owner address vault.withdrawMain(asset, msg.sender, assetAmount); if (usdpAmount != 0) { _repay(asset, msg.sender, usdpAmount); } vault.update(asset, msg.sender); _ensurePositionCollateralization(asset, msg.sender); } } // fire an event emit Exit(asset, msg.sender, assetAmount, usdpAmount); return usdpAmount; } /** * @notice Repayment is the sum of the principal and interest * @dev Withdraws collateral and repays specified amount of debt * @param asset The address of the collateral * @param assetAmount The amount of the collateral to withdraw * @param repayment The target repayment amount **/ function exit_targetRepayment(address asset, uint assetAmount, uint repayment) external returns (uint) { uint usdpAmount = _calcPrincipal(asset, msg.sender, repayment); return exit(asset, assetAmount, usdpAmount); } /** * @notice Withdraws WETH and converts to ETH * @param ethAmount ETH amount to withdraw * @param usdpAmount The amount of USDP token to repay **/ function exit_Eth(uint ethAmount, uint usdpAmount) public returns (uint) { usdpAmount = exit(WETH, ethAmount, usdpAmount); require(IWETH(WETH).transferFrom(msg.sender, address(this), ethAmount), "Unit Protocol: WETH_TRANSFER_FROM_FAILED"); IWETH(WETH).withdraw(ethAmount); (bool success, ) = msg.sender.call{value:ethAmount}(""); require(success, "Unit Protocol: ETH_TRANSFER_FAILED"); return usdpAmount; } /** * @notice Repayment is the sum of the principal and interest * @notice Withdraws WETH and converts to ETH * @param ethAmount ETH amount to withdraw * @param repayment The target repayment amount **/ function exit_Eth_targetRepayment(uint ethAmount, uint repayment) external returns (uint) { uint usdpAmount = _calcPrincipal(WETH, msg.sender, repayment); return exit_Eth(ethAmount, usdpAmount); } /** * @notice Withdraws wrapped asset and unwrap it, repays specified amount of debt * @param wrappedAsset Address of wrapped asset * @param assetAmount The amount of the collateral to withdrae * @param usdpAmount The amount of USDP token to repay **/ function unwrapAndExit(IWrappedAsset wrappedAsset, uint assetAmount, uint usdpAmount) public returns (uint) { usdpAmount = exit(address(wrappedAsset), assetAmount, usdpAmount); if (assetAmount > 0) { wrappedAsset.withdraw(msg.sender, assetAmount); } return usdpAmount; } /** * @notice Withdraws wrapped asset and unwrap it, repays specified amount of debt * @notice Repayment is the sum of the principal and interest * @param wrappedAsset Address of wrapped asset * @param assetAmount The amount of the collateral to withdrae * @param repayment The amount of USDP token to repay **/ function unwrapAndExitTargetRepayment(IWrappedAsset wrappedAsset, uint assetAmount, uint repayment) public returns (uint) { uint usdpAmount = _calcPrincipal(address(wrappedAsset), msg.sender, repayment); return unwrapAndExit(wrappedAsset, assetAmount, usdpAmount); } function _ensurePositionCollateralization(address asset, address owner) internal view { // collateral value of the position in USD uint usdValue_q112 = getCollateralUsdValue_q112(asset, owner); // USD limit of the position uint usdLimit = usdValue_q112 * vaultManagerParameters.initialCollateralRatio(asset) / Q112 / 100; // revert if collateralization is not enough require(vault.getTotalDebt(asset, owner) <= usdLimit, "Unit Protocol: UNDERCOLLATERALIZED"); } // Liquidation Trigger /** * @dev Triggers liquidation of a position * @param asset The address of the collateral token of a position * @param owner The owner of the position **/ function triggerLiquidation(address asset, address owner) external nonReentrant { _ensureOracle(asset); // USD value of the collateral uint usdValue_q112 = getCollateralUsdValue_q112(asset, owner); // reverts if a position is not liquidatable require(_isLiquidatablePosition(asset, owner, usdValue_q112), "Unit Protocol: SAFE_POSITION"); uint liquidationDiscount_q112 = usdValue_q112.mul( vaultManagerParameters.liquidationDiscount(asset) ).div(DENOMINATOR_1E5); uint initialLiquidationPrice = usdValue_q112.sub(liquidationDiscount_q112).div(Q112); // sends liquidation command to the Vault vault.triggerLiquidation(asset, owner, initialLiquidationPrice); // fire an liquidation event emit LiquidationTriggered(asset, owner); } function getCollateralUsdValue_q112(address asset, address owner) public view returns (uint) { return IOracleUsd(oracleRegistry.oracleByAsset(asset)).assetToUsd(asset, vault.collaterals(asset, owner)); } function _ensureOracle(address asset) internal view { uint oracleType = oracleRegistry.oracleTypeByAsset(asset); require(oracleType != 0, "Unit Protocol: INVALID_ORACLE_TYPE"); address oracle = oracleRegistry.oracleByType(oracleType); require(oracle != address(0), "Unit Protocol: DISABLED_ORACLE"); } /** * @dev Determines whether a position is liquidatable * @param asset The address of the collateral * @param owner The owner of the position * @return boolean value, whether a position is liquidatable **/ function isLiquidatablePosition( address asset, address owner ) public view returns (bool) { uint usdValue_q112 = getCollateralUsdValue_q112(asset, owner); return _isLiquidatablePosition(asset, owner, usdValue_q112); } /** * @dev Calculates current utilization ratio * @param asset The address of the collateral * @param owner The owner of the position * @return utilization ratio **/ function utilizationRatio( address asset, address owner ) public view returns (uint) { uint debt = vault.getTotalDebt(asset, owner); if (debt == 0) return 0; uint usdValue_q112 = getCollateralUsdValue_q112(asset, owner); return debt.mul(100).mul(Q112).div(usdValue_q112); } }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2021 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity 0.7.6; import "../interfaces/IVault.sol"; import '../interfaces/IVaultParameters.sol'; import "../interfaces/IOracleRegistry.sol"; import "../interfaces/ICDPRegistry.sol"; import '../interfaces/IToken.sol'; import "../interfaces/vault-managers/parameters/IVaultManagerParameters.sol"; import "../interfaces/vault-managers/parameters/IVaultManagerBorrowFeeParameters.sol"; import "../helpers/ReentrancyGuard.sol"; import '../helpers/TransferHelper.sol'; import "../helpers/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /** * @title BaseCDPManager * @dev all common logic should be moved here in future **/ abstract contract BaseCDPManager is ReentrancyGuard { using SafeMath for uint; IVault public immutable vault; IVaultManagerParameters public immutable vaultManagerParameters; IOracleRegistry public immutable oracleRegistry; ICDPRegistry public immutable cdpRegistry; IVaultManagerBorrowFeeParameters public immutable vaultManagerBorrowFeeParameters; IERC20 public immutable usdp; uint public constant Q112 = 2 ** 112; uint public constant DENOMINATOR_1E5 = 1e5; /** * @dev Trigger when joins are happened **/ event Join(address indexed asset, address indexed owner, uint main, uint usdp); /** * @dev Trigger when exits are happened **/ event Exit(address indexed asset, address indexed owner, uint main, uint usdp); /** * @dev Trigger when liquidations are initiated **/ event LiquidationTriggered(address indexed asset, address indexed owner); modifier checkpoint(address asset, address owner) { _; cdpRegistry.checkpoint(asset, owner); } /** * @param _vaultManagerParameters The address of the contract with Vault manager parameters * @param _oracleRegistry The address of the oracle registry * @param _cdpRegistry The address of the CDP registry * @param _vaultManagerBorrowFeeParameters The address of the vault manager borrow fee parameters **/ constructor(address _vaultManagerParameters, address _oracleRegistry, address _cdpRegistry, address _vaultManagerBorrowFeeParameters) { require( _vaultManagerParameters != address(0) && _oracleRegistry != address(0) && _cdpRegistry != address(0) && _vaultManagerBorrowFeeParameters != address(0), "Unit Protocol: INVALID_ARGS" ); vaultManagerParameters = IVaultManagerParameters(_vaultManagerParameters); IVault vaultLocal = IVault(IVaultParameters(IVaultManagerParameters(_vaultManagerParameters).vaultParameters()).vault()); vault = vaultLocal; oracleRegistry = IOracleRegistry(_oracleRegistry); cdpRegistry = ICDPRegistry(_cdpRegistry); vaultManagerBorrowFeeParameters = IVaultManagerBorrowFeeParameters(_vaultManagerBorrowFeeParameters); usdp = IERC20(vaultLocal.usdp()); } /** * @notice Charge borrow fee if needed */ function _chargeBorrowFee(address asset, address user, uint usdpAmount) internal { uint borrowFee = vaultManagerBorrowFeeParameters.calcBorrowFeeAmount(asset, usdpAmount); if (borrowFee == 0) { // very small amount case return; } // to fail with concrete reason, not with TRANSFER_FROM_FAILED from safeTransferFrom require(usdp.allowance(user, address(this)) >= borrowFee, "Unit Protocol: BORROW_FEE_NOT_APPROVED"); TransferHelper.safeTransferFrom( address(usdp), user, vaultManagerBorrowFeeParameters.feeReceiver(), borrowFee ); } // decreases debt function _repay(address asset, address owner, uint usdpAmount) internal { uint fee = vault.calculateFee(asset, owner, usdpAmount); vault.chargeFee(vault.usdp(), owner, fee); // burn USDP from the owner's balance uint debtAfter = vault.repay(asset, owner, usdpAmount); if (debtAfter == 0) { // clear unused storage vault.destroy(asset, owner); } } /** * @dev Calculates liquidation price * @param asset The address of the collateral * @param owner The owner of the position * @return Q112-encoded liquidation price **/ function liquidationPrice_q112( address asset, address owner ) external view returns (uint) { uint debt = vault.getTotalDebt(asset, owner); if (debt == 0) return uint(-1); uint collateralLiqPrice = debt.mul(100).mul(Q112).div(vaultManagerParameters.liquidationRatio(asset)); require(IToken(asset).decimals() <= 18, "Unit Protocol: NOT_SUPPORTED_DECIMALS"); return collateralLiqPrice / vault.collaterals(asset, owner) / 10 ** (18 - IToken(asset).decimals()); } function _calcPrincipal(address asset, address owner, uint repayment) internal view returns (uint) { uint fee = vault.stabilityFee(asset, owner) * (block.timestamp - vault.lastUpdate(asset, owner)) / 365 days; return repayment * DENOMINATOR_1E5 / (DENOMINATOR_1E5 + fee); } /** * @dev Determines whether a position is liquidatable * @param asset The address of the collateral * @param owner The owner of the position * @param usdValue_q112 Q112-encoded USD value of the collateral * @return boolean value, whether a position is liquidatable **/ function _isLiquidatablePosition( address asset, address owner, uint usdValue_q112 ) internal view returns (bool) { uint debt = vault.getTotalDebt(asset, owner); // position is collateralized if there is no debt if (debt == 0) return false; return debt.mul(100).mul(Q112).div(usdValue_q112) >= vaultManagerParameters.liquidationRatio(asset); } }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; pragma abicoder v2; interface IOracleRegistry { struct Oracle { uint oracleType; address oracleAddress; } function WETH ( ) external view returns ( address ); function getKeydonixOracleTypes ( ) external view returns ( uint256[] memory ); function getOracles ( ) external view returns ( Oracle[] memory foundOracles ); function keydonixOracleTypes ( uint256 ) external view returns ( uint256 ); function maxOracleType ( ) external view returns ( uint256 ); function oracleByAsset ( address asset ) external view returns ( address ); function oracleByType ( uint256 ) external view returns ( address ); function oracleTypeByAsset ( address ) external view returns ( uint256 ); function oracleTypeByOracle ( address ) external view returns ( uint256 ); function setKeydonixOracleTypes ( uint256[] memory _keydonixOracleTypes ) external; function setOracle ( uint256 oracleType, address oracle ) external; function setOracleTypeForAsset ( address asset, uint256 oracleType ) external; function setOracleTypeForAssets ( address[] memory assets, uint256 oracleType ) external; function unsetOracle ( uint256 oracleType ) external; function unsetOracleForAsset ( address asset ) external; function unsetOracleForAssets ( address[] memory assets ) external; function vaultParameters ( ) external view returns ( address ); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IOracleUsd { // returns Q112-encoded value // returned value 10**18 * 2**112 is $1 function assetToUsd(address asset, uint amount) external view returns (uint); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IVault { function DENOMINATOR_1E2 ( ) external view returns ( uint256 ); function DENOMINATOR_1E5 ( ) external view returns ( uint256 ); function borrow ( address asset, address user, uint256 amount ) external returns ( uint256 ); function calculateFee ( address asset, address user, uint256 amount ) external view returns ( uint256 ); function changeOracleType ( address asset, address user, uint256 newOracleType ) external; function chargeFee ( address asset, address user, uint256 amount ) external; function col ( ) external view returns ( address ); function colToken ( address, address ) external view returns ( uint256 ); function collaterals ( address, address ) external view returns ( uint256 ); function debts ( address, address ) external view returns ( uint256 ); function depositCol ( address asset, address user, uint256 amount ) external; function depositEth ( address user ) external payable; function depositMain ( address asset, address user, uint256 amount ) external; function destroy ( address asset, address user ) external; function getTotalDebt ( address asset, address user ) external view returns ( uint256 ); function lastUpdate ( address, address ) external view returns ( uint256 ); function liquidate ( address asset, address positionOwner, uint256 mainAssetToLiquidator, uint256 colToLiquidator, uint256 mainAssetToPositionOwner, uint256 colToPositionOwner, uint256 repayment, uint256 penalty, address liquidator ) external; function liquidationBlock ( address, address ) external view returns ( uint256 ); function liquidationFee ( address, address ) external view returns ( uint256 ); function liquidationPrice ( address, address ) external view returns ( uint256 ); function oracleType ( address, address ) external view returns ( uint256 ); function repay ( address asset, address user, uint256 amount ) external returns ( uint256 ); function spawn ( address asset, address user, uint256 _oracleType ) external; function stabilityFee ( address, address ) external view returns ( uint256 ); function tokenDebts ( address ) external view returns ( uint256 ); function triggerLiquidation ( address asset, address positionOwner, uint256 initialPrice ) external; function update ( address asset, address user ) external; function usdp ( ) external view returns ( address ); function vaultParameters ( ) external view returns ( address ); function weth ( ) external view returns ( address payable ); function withdrawCol ( address asset, address user, uint256 amount ) external; function withdrawEth ( address user, uint256 amount ) external; function withdrawMain ( address asset, address user, uint256 amount ) external; }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; pragma experimental ABIEncoderV2; interface ICDPRegistry { struct CDP { address asset; address owner; } function batchCheckpoint ( address[] calldata assets, address[] calldata owners ) external; function batchCheckpointForAsset ( address asset, address[] calldata owners ) external; function checkpoint ( address asset, address owner ) external; function cr ( ) external view returns ( address ); function getAllCdps ( ) external view returns ( CDP[] memory r ); function getCdpsByCollateral ( address asset ) external view returns ( CDP[] memory cdps ); function getCdpsByOwner ( address owner ) external view returns ( CDP[] memory r ); function getCdpsCount ( ) external view returns ( uint256 totalCdpCount ); function getCdpsCountForCollateral ( address asset ) external view returns ( uint256 ); function isAlive ( address asset, address owner ) external view returns ( bool ); function isListed ( address asset, address owner ) external view returns ( bool ); function vault ( ) external view returns ( address ); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IVaultManagerParameters { function devaluationPeriod ( address ) external view returns ( uint256 ); function initialCollateralRatio ( address ) external view returns ( uint256 ); function liquidationDiscount ( address ) external view returns ( uint256 ); function liquidationRatio ( address ) external view returns ( uint256 ); function maxColPercent ( address ) external view returns ( uint256 ); function minColPercent ( address ) external view returns ( uint256 ); function setColPartRange ( address asset, uint256 min, uint256 max ) external; function setCollateral ( address asset, uint256 stabilityFeeValue, uint256 liquidationFeeValue, uint256 initialCollateralRatioValue, uint256 liquidationRatioValue, uint256 liquidationDiscountValue, uint256 devaluationPeriodValue, uint256 usdpLimit, uint256[] calldata oracles, uint256 minColP, uint256 maxColP ) external; function setDevaluationPeriod ( address asset, uint256 newValue ) external; function setInitialCollateralRatio ( address asset, uint256 newValue ) external; function setLiquidationDiscount ( address asset, uint256 newValue ) external; function setLiquidationRatio ( address asset, uint256 newValue ) external; function vaultParameters ( ) external view returns ( address ); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IVaultParameters { function canModifyVault ( address ) external view returns ( bool ); function foundation ( ) external view returns ( address ); function isManager ( address ) external view returns ( bool ); function isOracleTypeEnabled ( uint256, address ) external view returns ( bool ); function liquidationFee ( address ) external view returns ( uint256 ); function setCollateral ( address asset, uint256 stabilityFeeValue, uint256 liquidationFeeValue, uint256 usdpLimit, uint256[] calldata oracles ) external; function setFoundation ( address newFoundation ) external; function setLiquidationFee ( address asset, uint256 newValue ) external; function setManager ( address who, bool permit ) external; function setOracleType ( uint256 _type, address asset, bool enabled ) external; function setStabilityFee ( address asset, uint256 newValue ) external; function setTokenDebtLimit ( address asset, uint256 limit ) external; function setVaultAccess ( address who, bool permit ) external; function stabilityFee ( address ) external view returns ( uint256 ); function tokenDebtLimit ( address ) external view returns ( uint256 ); function vault ( ) external view returns ( address ); function vaultParameters ( ) external view returns ( address ); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IToken { function decimals() external view returns (uint8); }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2021 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity 0.7.6; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IWrappedAsset is IERC20 /* IERC20WithOptional */ { event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event PositionMoved(address indexed userFrom, address indexed userTo, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event TokenWithdraw(address indexed user, address token, uint256 amount); event FeeChanged(uint256 newFeePercent); event FeeReceiverChanged(address newFeeReceiver); event AllowedBoneLockerSelectorAdded(address boneLocker, bytes4 selector); event AllowedBoneLockerSelectorRemoved(address boneLocker, bytes4 selector); /** * @notice Get underlying token */ function getUnderlyingToken() external view returns (IERC20); /** * @notice deposit underlying token and send wrapped token to user * @dev Important! Only user or trusted contracts must be able to call this method */ function deposit(address _userAddr, uint256 _amount) external; /** * @notice get wrapped token and return underlying * @dev Important! Only user or trusted contracts must be able to call this method */ function withdraw(address _userAddr, uint256 _amount) external; /** * @notice get pending reward amount for user if reward is supported */ function pendingReward(address _userAddr) external view returns (uint256); /** * @notice claim pending reward for user if reward is supported */ function claimReward(address _userAddr) external; /** * @notice Manually move position (or its part) to another user (for example in case of liquidation) * @dev Important! Only trusted contracts must be able to call this method */ function movePosition(address _userAddrFrom, address _userAddrTo, uint256 _amount) external; /** * @dev function for checks that asset is unitprotocol wrapped asset. * @dev For wrapped assets must return keccak256("UnitProtocolWrappedAsset") */ function isUnitProtocolWrappedAsset() external view returns (bytes32); }
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: bsl-1.1 /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity 0.7.6; /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: division by zero"); return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } }
// SPDX-License-Identifier: bsl-1.1 /* Copyright 2021 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity ^0.7.6; interface IVaultManagerBorrowFeeParameters { /** * @notice 1 = 100% = 10000 basis points **/ function BASIS_POINTS_IN_1() external view returns (uint); /** * @notice Borrow fee receiver **/ function feeReceiver() external view returns (address); /** * @notice Sets the borrow fee receiver. Only manager is able to call this function * @param newFeeReceiver The address of fee receiver **/ function setFeeReceiver(address newFeeReceiver) external; /** * @notice Sets the base borrow fee in basis points (1bp = 0.01% = 0.0001). Only manager is able to call this function * @param newBaseBorrowFeeBasisPoints The borrow fee in basis points **/ function setBaseBorrowFee(uint16 newBaseBorrowFeeBasisPoints) external; /** * @notice Sets the borrow fee for a particular collateral in basis points (1bp = 0.01% = 0.0001). Only manager is able to call this function * @param asset The address of the main collateral token * @param newEnabled Is custom fee enabled for asset * @param newFeeBasisPoints The borrow fee in basis points **/ function setAssetBorrowFee(address asset, bool newEnabled, uint16 newFeeBasisPoints) external; /** * @notice Returns borrow fee for particular collateral in basis points (1bp = 0.01% = 0.0001) * @param asset The address of the main collateral token * @return feeBasisPoints The borrow fee in basis points **/ function getBorrowFee(address asset) external view returns (uint16 feeBasisPoints); /** * @notice Returns borrow fee for usdp amount for particular collateral * @param asset The address of the main collateral token * @return The borrow fee **/ function calcBorrowFeeAmount(address asset, uint usdpAmount) external view returns (uint); }
// SPDX-License-Identifier: GPL-3.0-or-later /* Copyright 2020 Unit Protocol: Artem Zakharov ([email protected]). */ pragma solidity 0.7.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } }
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vaultManagerParameters","type":"address"},{"internalType":"address","name":"_oracleRegistry","type":"address"},{"internalType":"address","name":"_cdpRegistry","type":"address"},{"internalType":"address","name":"_vaultManagerBorrowFeeParameters","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"main","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdp","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"main","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdp","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"LiquidationTriggered","type":"event"},{"inputs":[],"name":"DENOMINATOR_1E5","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Q112","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cdpRegistry","outputs":[{"internalType":"contract ICDPRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"exit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"exit_Eth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"repayment","type":"uint256"}],"name":"exit_Eth_targetRepayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"repayment","type":"uint256"}],"name":"exit_targetRepayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"getCollateralUsdValue_q112","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"isLiquidatablePosition","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"join","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"join_Eth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"liquidationPrice_q112","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleRegistry","outputs":[{"internalType":"contract IOracleRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"triggerLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWrappedAsset","name":"wrappedAsset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"unwrapAndExit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWrappedAsset","name":"wrappedAsset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"repayment","type":"uint256"}],"name":"unwrapAndExitTargetRepayment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdp","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"utilizationRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultManagerBorrowFeeParameters","outputs":[{"internalType":"contract IVaultManagerBorrowFeeParameters","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultManagerParameters","outputs":[{"internalType":"contract IVaultManagerParameters","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IWrappedAsset","name":"wrappedAsset","type":"address"},{"internalType":"uint256","name":"assetAmount","type":"uint256"},{"internalType":"uint256","name":"usdpAmount","type":"uint256"}],"name":"wrapAndJoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6101606040523480156200001257600080fd5b50604051620033bb380380620033bb833981810160405260808110156200003857600080fd5b50805160208201516040830151606090930151600160005591929091838383836001600160a01b038416158015906200007957506001600160a01b03831615155b80156200008e57506001600160a01b03821615155b8015620000a357506001600160a01b03811615155b620000f5576040805162461bcd60e51b815260206004820152601b60248201527f556e69742050726f746f636f6c3a20494e56414c49445f415247530000000000604482015290519081900360640190fd5b836001600160a01b031660a0816001600160a01b031660601b815250506000846001600160a01b031663aca345ee6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200014e57600080fd5b505afa15801562000163573d6000803e3d6000fd5b505050506040513d60208110156200017a57600080fd5b50516040805163fbfa77cf60e01b815290516001600160a01b039092169163fbfa77cf91600480820192602092909190829003018186803b158015620001bf57600080fd5b505afa158015620001d4573d6000803e3d6000fd5b505050506040513d6020811015620001eb57600080fd5b50516001600160601b0319606082811b821660805286811b821660c05285811b821660e05284901b166101005260408051631d3981db60e21b815290519192506001600160a01b038316916374e6076c91600480820192602092909190829003018186803b1580156200025d57600080fd5b505afa15801562000272573d6000803e3d6000fd5b505050506040513d60208110156200028957600080fd5b505160601b6001600160601b03191661012052505060408051635651a2f760e11b815290516001600160a01b038916945063aca345ee935060048083019350602092829003018186803b158015620002e057600080fd5b505afa158015620002f5573d6000803e3d6000fd5b505050506040513d60208110156200030c57600080fd5b50516040805163fbfa77cf60e01b815290516001600160a01b039092169163fbfa77cf91600480820192602092909190829003018186803b1580156200035157600080fd5b505afa15801562000366573d6000803e3d6000fd5b505050506040513d60208110156200037d57600080fd5b505160408051633fc8cef360e01b815290516001600160a01b0390921691633fc8cef391600480820192602092909190829003018186803b158015620003c257600080fd5b505afa158015620003d7573d6000803e3d6000fd5b505050506040513d6020811015620003ee57600080fd5b50516001600160601b031960609190911b16610140525050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160601c6101405160601c612e6e6200054d600039806101545280610bd65280610c6b5280610d205280610f655280610fb35280611d3b5280611d915280611e43525080610e7e5280612a625280612b165250806109c4528061298c5280612b38525080610f4152806113c75280611c92525080610a0c5280610e5a52806119d0528061260052806126d95250806107365280610f89528061154a52806120bc52806127dd52508061067552806109315280610ad95280610d7a52806110cb528061116a528061122652806112d95280611602528061184b5280611922528061199f5280611add5280611b7e5280611f505280612001528061217f5280612257528061232852806123b752806124a3528061255e528061288b5250612e6e6000f3fe6080604052600436106101445760003560e01c8063971182c6116100b6578063ba96208a1161006f578063ba96208a146104bc578063bbdc9531146104ec578063d4796d121461052b578063ea36380a14610566578063eb70d358146105a5578063fbfa77cf146105d5576101c8565b8063971182c6146103ea578063993f2e0b146103ff578063a3d84b5b1461043e578063ab2a2a821461047d578063ad5c464814610492578063b7ebdc0c146104a7576101c8565b806325df90581161010857806325df9058146103145780632b97e7d6146103315780633bf7a83e146103705780634265607c146103855780634bb93ab1146103c057806374e6076c146103d5576101c8565b806306c0aa32146101cd57806312dc1dcc1461021e57806313084e1514610259578063134a02dd1461028a578063252d040e146102d9576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c6576040805162461bcd60e51b815260206004820152601960248201527f556e69742050726f746f636f6c3a205245535452494354454400000000000000604482015290519081900360640190fd5b005b600080fd5b3480156101d957600080fd5b5061020c600480360360608110156101f057600080fd5b506001600160a01b0381351690602081013590604001356105ea565b60408051918252519081900360200190f35b34801561022a57600080fd5b5061020c6004803603604081101561024157600080fd5b506001600160a01b0381358116916020013516610670565b34801561026557600080fd5b5061026e6109c2565b604080516001600160a01b039092168252519081900360200190f35b34801561029657600080fd5b506102c5600480360360408110156102ad57600080fd5b506001600160a01b03813581169160200135166109e6565b604080519115158252519081900360200190f35b3480156102e557600080fd5b5061020c600480360360408110156102fc57600080fd5b506001600160a01b0381358116916020013516610a08565b6101c66004803603602081101561032a57600080fd5b5035610bce565b34801561033d57600080fd5b5061020c6004803603606081101561035457600080fd5b506001600160a01b038135169060208101359060400135610d49565b34801561037c57600080fd5b5061020c610d6d565b34801561039157600080fd5b5061020c600480360360408110156103a857600080fd5b506001600160a01b0381358116916020013516610d75565b3480156103cc57600080fd5b5061026e610e58565b3480156103e157600080fd5b5061026e610e7c565b3480156103f657600080fd5b5061020c610ea0565b34801561040b57600080fd5b506101c66004803603606081101561042257600080fd5b506001600160a01b038135169060208101359060400135610ea7565b34801561044a57600080fd5b5061020c6004803603606081101561046157600080fd5b506001600160a01b038135169060208101359060400135610f24565b34801561048957600080fd5b5061026e610f3f565b34801561049e57600080fd5b5061026e610f63565b3480156104b357600080fd5b5061026e610f87565b3480156104c857600080fd5b5061020c600480360360408110156104df57600080fd5b5080359060200135610fab565b3480156104f857600080fd5b5061020c6004803603606081101561050f57600080fd5b506001600160a01b038135169060208101359060400135610fe5565b34801561053757600080fd5b506101c66004803603604081101561054e57600080fd5b506001600160a01b038135811691602001351661146c565b34801561057257600080fd5b506101c66004803603606081101561058957600080fd5b506001600160a01b0381351690602081013590604001356116e4565b3480156105b157600080fd5b5061020c600480360360408110156105c857600080fd5b5080359060200135611d34565b3480156105e157600080fd5b5061026e611f4e565b60006105f7848484610fe5565b91508215610666576040805163f3fef3a360e01b81523360048201526024810185905290516001600160a01b0386169163f3fef3a391604480830192600092919082900301818387803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b505050505b50805b9392505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d6446d4385856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156106f157600080fd5b505afa158015610705573d6000803e3d6000fd5b505050506040513d602081101561071b57600080fd5b505190508061072f576000199150506109bc565b60006107ec7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633bffbbe2876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156107a157600080fd5b505afa1580156107b5573d6000803e3d6000fd5b505050506040513d60208110156107cb57600080fd5b50516107e6600160701b6107e0866064611f72565b90611f72565b90611f97565b90506012856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b505160ff1611156108955760405162461bcd60e51b8152600401808060200182810382526025815260200180612e146025913960400191505060405180910390fd5b846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ce57600080fd5b505afa1580156108e2573d6000803e3d6000fd5b505050506040513d60208110156108f857600080fd5b50516040805163728f08cf60e11b81526001600160a01b0388811660048301528781166024830152915160129390930360ff16600a0a927f00000000000000000000000000000000000000000000000000000000000000009092169163e51e119e91604480820192602092909190829003018186803b15801561097a57600080fd5b505afa15801561098e573d6000803e3d6000fd5b505050506040513d60208110156109a457600080fd5b505182816109ae57fe5b04816109b657fe5b04925050505b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109f38484610a08565b9050610a00848483611ffc565b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166338163032846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d6020811015610aa157600080fd5b50516040805163728f08cf60e11b81526001600160a01b03868116600483015285811660248301529151928216926310e556989287927f00000000000000000000000000000000000000000000000000000000000000009091169163e51e119e91604480820192602092909190829003018186803b158015610b2257600080fd5b505afa158015610b36573d6000803e3d6000fd5b505050506040513d6020811015610b4c57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0390931660048401526024830191909152516044808301926020929190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b50519392505050565b3415610d1b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b50506040805163a9059cbb60e01b815233600482015234602482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016945063a9059cbb9350604480830193506020928290030181600087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b5051610d1b5760405162461bcd60e51b8152600401808060200182810382526023815260200180612d416023913960400191505060405180910390fd5b610d467f000000000000000000000000000000000000000000000000000000000000000034836116e4565b50565b600080610d57853385612175565b9050610d648585836105ea565b95945050505050565b600160701b81565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d6446d4385856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015610df657600080fd5b505afa158015610e0a573d6000803e3d6000fd5b505050506040513d6020811015610e2057600080fd5b5051905080610e335760009150506109bc565b6000610e3f8585610a08565b9050610d64816107e6600160701b6107e0866064611f72565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b620186a081565b8115610f1457604080516311f9fbc960e21b81523360048201526024810184905290516001600160a01b038516916347e7ef2491604480830192600092919082900301818387803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050505b610f1f8383836116e4565b505050565b600080610f32853385612175565b9050610d64858583610fe5565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610fd97f00000000000000000000000000000000000000000000000000000000000000003385612175565b9050610a008482611d34565b60006002600054141561103f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005583338415158061105357508315155b6110a0576040805162461bcd60e51b81526020600482015260196024820152780aadcd2e840a0e4dee8dec6ded87440aaa68a988aa6a6bea8b603b1b604482015290519081900360640190fd5b60408051634ac1c33d60e01b81526001600160a01b03888116600483015233602483015291516000927f00000000000000000000000000000000000000000000000000000000000000001691634ac1c33d916044808301926020929190829003018186803b15801561111157600080fd5b505afa158015611125573d6000803e3d6000fd5b505050506040513d602081101561113b57600080fd5b505190508085111561114b578094505b856111605761115b8733876122f4565b611379565b8481141561121b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638d7cad888833896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508460001461115b5761115b8733876122f4565b611224876125fc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638d7cad888833896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b50505050846000146112d7576112d78733876122f4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c640752d88336040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561135757600080fd5b505af115801561136b573d6000803e3d6000fd5b5050505061137987336127c4565b6040805187815260208101879052815133926001600160a01b038b16927fa702ae6024e8b4c2b0eb162b1453dacb93cf6922f5a2d7236faed898c21148f8929081900390910190a3849350507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb55b7fc83836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b5050600160005550929695505050505050565b600260005414156114c4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556114d2826125fc565b60006114de8383610a08565b90506114eb838383611ffc565b61153c576040805162461bcd60e51b815260206004820152601c60248201527f556e69742050726f746f636f6c3a20534146455f504f534954494f4e00000000604482015290519081900360640190fd5b60006115e8620186a06107e67f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166315a04ea2886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d60208110156115df57600080fd5b50518590611f72565b905060006115fe600160701b6107e68585612976565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663742a326e8686846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561168857600080fd5b505af115801561169c573d6000803e3d6000fd5b50506040516001600160a01b038088169350881691507f5b79a897d30813a62a1f95ba180d3320d3701d96605708b81105e00719a069e490600090a350506001600055505050565b6002600054141561173c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005582338215158061175057508315155b61179d576040805162461bcd60e51b81526020600482015260196024820152780aadcd2e840a0e4dee8dec6ded87440aaa68a988aa6a6bea8b603b1b604482015290519081900360640190fd5b6012856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d602081101561180257600080fd5b505160ff1611156118445760405162461bcd60e51b8152600401808060200182810382526025815260200180612e146025913960400191505060405180910390fd5b826118ee577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee18359e8633876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050611c48565b6118f7856125fc565b60408051634ac1c33d60e01b81526001600160a01b03878116600483015233602483015291516000927f00000000000000000000000000000000000000000000000000000000000000001691634ac1c33d916044808301926020929190829003018186803b15801561196857600080fd5b505afa15801561197c573d6000803e3d6000fd5b505050506040513d602081101561199257600080fd5b50511515905080611ad5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c6d894f087337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbcd55318b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a3b57600080fd5b505afa158015611a4f573d6000803e3d6000fd5b505050506040513d6020811015611a6557600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015292909316602483015260448201529051606480830192600092919082900301818387803b158015611abc57600080fd5b505af1158015611ad0573d6000803e3d6000fd5b505050505b8415611b7c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ee18359e8733886040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b6357600080fd5b505af1158015611b77573d6000803e3d6000fd5b505050505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316635224372c8733876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b505050506040513d6020811015611c2e57600080fd5b50611c3c9050863386612988565b611c4686336127c4565b505b6040805185815260208101859052815133926001600160a01b038916927f6423b6056e64b3b29cb2d342362b47c26fa8d6877da27ea152354060df19b9bc929081900390910190a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb55b7fc83836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b5050600160005550505050505050565b6000611d617f00000000000000000000000000000000000000000000000000000000000000008484610fe5565b604080516323b872dd60e01b81523360048201523060248201526044810186905290519193506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd916064808201926020929091908290030181600087803b158015611dda57600080fd5b505af1158015611dee573d6000803e3d6000fd5b505050506040513d6020811015611e0457600080fd5b5051611e415760405162461bcd60e51b8152600401808060200182810382526028815260200180612d196028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b50506040516000925033915085908381818185875af1925050503d8060008114611f01576040519150601f19603f3d011682016040523d82523d6000602084013e611f06565b606091505b5050905080611f465760405162461bcd60e51b8152600401808060200182810382526022815260200180612dac6022913960400191505060405180910390fd5b509092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600082611f81575060006109bc565b5081810281838281611f8f57fe5b04146109bc57fe5b600081611feb576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611ff457fe5b049392505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d6446d4386866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561207d57600080fd5b505afa158015612091573d6000803e3d6000fd5b505050506040513d60208110156120a757600080fd5b50519050806120ba576000915050610669565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633bffbbe2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d602081101561215157600080fd5b505161216a846107e6600160701b6107e0866064611f72565b101595945050505050565b6000806301e133807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166388ad7a6187876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156121fb57600080fd5b505afa15801561220f573d6000803e3d6000fd5b505050506040513d602081101561222557600080fd5b505160408051636a5c9edf60e11b81526001600160a01b038981166004830152888116602483015291514293909303927f00000000000000000000000000000000000000000000000000000000000000009092169163d4b93dbe91604480820192602092909190829003018186803b1580156122a057600080fd5b505afa1580156122b4573d6000803e3d6000fd5b505050506040513d60208110156122ca57600080fd5b505102816122d457fe5b04905080620186a001620186a08402816122ea57fe5b0495945050505050565b60408051633e543e5b60e11b81526001600160a01b03858116600483015284811660248301526044820184905291516000927f00000000000000000000000000000000000000000000000000000000000000001691637ca87cb6916064808301926020929190829003018186803b15801561236e57600080fd5b505afa158015612382573d6000803e3d6000fd5b505050506040513d602081101561239857600080fd5b505160408051631d3981db60e21b815290519192506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691633d1aa9639183916374e6076c91600480820192602092909190829003018186803b15801561240657600080fd5b505afa15801561241a573d6000803e3d6000fd5b505050506040513d602081101561243057600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291871660248301526044820185905251606480830192600092919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b5050505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631da649cf8686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561252957600080fd5b505af115801561253d573d6000803e3d6000fd5b505050506040513d602081101561255357600080fd5b50519050806125f5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166362b40f9f86866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b1580156125dc57600080fd5b505af11580156125f0573d6000803e3d6000fd5b505050505b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbcd5531836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561266b57600080fd5b505afa15801561267f573d6000803e3d6000fd5b505050506040513d602081101561269557600080fd5b50519050806126d55760405162461bcd60e51b8152600401808060200182810382526022815260200180612d8a6022913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c5807dc6836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b505190506001600160a01b038116610f1f576040805162461bcd60e51b815260206004820152601e60248201527f556e69742050726f746f636f6c3a2044495341424c45445f4f5241434c450000604482015290519081900360640190fd5b60006127d08383610a08565b905060006064600160701b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b85c4496876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561284857600080fd5b505afa15801561285c573d6000803e3d6000fd5b505050506040513d602081101561287257600080fd5b505184028161287d57fe5b048161288557fe5b049050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d6446d4386866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561290757600080fd5b505afa15801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505111156129705760405162461bcd60e51b8152600401808060200182810382526022815260200180612df26022913960400191505060405180910390fd5b50505050565b60008282111561298257fe5b50900390565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbbac96285846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156129ff57600080fd5b505afa158015612a13573d6000803e3d6000fd5b505050506040513d6020811015612a2957600080fd5b5051905080612a385750610f1f565b60408051636eb1769f60e11b81526001600160a01b038581166004830152306024830152915183927f0000000000000000000000000000000000000000000000000000000000000000169163dd62ed3e916044808301926020929190829003018186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d6020811015612ad257600080fd5b50511015612b115760405162461bcd60e51b8152600401808060200182810382526026815260200180612d646026913960400191505060405180910390fd5b6129707f0000000000000000000000000000000000000000000000000000000000000000847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b3f006746040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8f57600080fd5b505afa158015612ba3573d6000803e3d6000fd5b505050506040513d6020811015612bb957600080fd5b505184604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310612c405780518252601f199092019160209182019101612c21565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ca2576040519150601f19603f3d011682016040523d82523d6000602084013e612ca7565b606091505b5091509150818015612cd5575080511580612cd55750808060200190516020811015612cd257600080fd5b50515b612d105760405162461bcd60e51b8152600401808060200182810382526024815260200180612dce6024913960400191505060405180910390fd5b50505050505056fe556e69742050726f746f636f6c3a20574554485f5452414e534645525f46524f4d5f4641494c4544556e69742050726f746f636f6c3a20574554485f5452414e534645525f4641494c4544556e69742050726f746f636f6c3a20424f52524f575f4645455f4e4f545f415050524f564544556e69742050726f746f636f6c3a20494e56414c49445f4f5241434c455f54595045556e69742050726f746f636f6c3a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e69742050726f746f636f6c3a20554e444552434f4c4c41544552414c495a4544556e69742050726f746f636f6c3a204e4f545f535550504f525445445f444543494d414c53a2646970667358221220eef9408baadd85a776f853f1c5f165076041f60bcea5ae21a2575755006894da64736f6c63430007060033000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb4894
Deployed Bytecode
0x6080604052600436106101445760003560e01c8063971182c6116100b6578063ba96208a1161006f578063ba96208a146104bc578063bbdc9531146104ec578063d4796d121461052b578063ea36380a14610566578063eb70d358146105a5578063fbfa77cf146105d5576101c8565b8063971182c6146103ea578063993f2e0b146103ff578063a3d84b5b1461043e578063ab2a2a821461047d578063ad5c464814610492578063b7ebdc0c146104a7576101c8565b806325df90581161010857806325df9058146103145780632b97e7d6146103315780633bf7a83e146103705780634265607c146103855780634bb93ab1146103c057806374e6076c146103d5576101c8565b806306c0aa32146101cd57806312dc1dcc1461021e57806313084e1514610259578063134a02dd1461028a578063252d040e146102d9576101c8565b366101c857336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101c6576040805162461bcd60e51b815260206004820152601960248201527f556e69742050726f746f636f6c3a205245535452494354454400000000000000604482015290519081900360640190fd5b005b600080fd5b3480156101d957600080fd5b5061020c600480360360608110156101f057600080fd5b506001600160a01b0381351690602081013590604001356105ea565b60408051918252519081900360200190f35b34801561022a57600080fd5b5061020c6004803603604081101561024157600080fd5b506001600160a01b0381358116916020013516610670565b34801561026557600080fd5b5061026e6109c2565b604080516001600160a01b039092168252519081900360200190f35b34801561029657600080fd5b506102c5600480360360408110156102ad57600080fd5b506001600160a01b03813581169160200135166109e6565b604080519115158252519081900360200190f35b3480156102e557600080fd5b5061020c600480360360408110156102fc57600080fd5b506001600160a01b0381358116916020013516610a08565b6101c66004803603602081101561032a57600080fd5b5035610bce565b34801561033d57600080fd5b5061020c6004803603606081101561035457600080fd5b506001600160a01b038135169060208101359060400135610d49565b34801561037c57600080fd5b5061020c610d6d565b34801561039157600080fd5b5061020c600480360360408110156103a857600080fd5b506001600160a01b0381358116916020013516610d75565b3480156103cc57600080fd5b5061026e610e58565b3480156103e157600080fd5b5061026e610e7c565b3480156103f657600080fd5b5061020c610ea0565b34801561040b57600080fd5b506101c66004803603606081101561042257600080fd5b506001600160a01b038135169060208101359060400135610ea7565b34801561044a57600080fd5b5061020c6004803603606081101561046157600080fd5b506001600160a01b038135169060208101359060400135610f24565b34801561048957600080fd5b5061026e610f3f565b34801561049e57600080fd5b5061026e610f63565b3480156104b357600080fd5b5061026e610f87565b3480156104c857600080fd5b5061020c600480360360408110156104df57600080fd5b5080359060200135610fab565b3480156104f857600080fd5b5061020c6004803603606081101561050f57600080fd5b506001600160a01b038135169060208101359060400135610fe5565b34801561053757600080fd5b506101c66004803603604081101561054e57600080fd5b506001600160a01b038135811691602001351661146c565b34801561057257600080fd5b506101c66004803603606081101561058957600080fd5b506001600160a01b0381351690602081013590604001356116e4565b3480156105b157600080fd5b5061020c600480360360408110156105c857600080fd5b5080359060200135611d34565b3480156105e157600080fd5b5061026e611f4e565b60006105f7848484610fe5565b91508215610666576040805163f3fef3a360e01b81523360048201526024810185905290516001600160a01b0386169163f3fef3a391604480830192600092919082900301818387803b15801561064d57600080fd5b505af1158015610661573d6000803e3d6000fd5b505050505b50805b9392505050565b6000807f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663d6446d4385856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156106f157600080fd5b505afa158015610705573d6000803e3d6000fd5b505050506040513d602081101561071b57600080fd5b505190508061072f576000199150506109bc565b60006107ec7f000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e6001600160a01b0316633bffbbe2876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156107a157600080fd5b505afa1580156107b5573d6000803e3d6000fd5b505050506040513d60208110156107cb57600080fd5b50516107e6600160701b6107e0866064611f72565b90611f72565b90611f97565b90506012856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561082957600080fd5b505afa15801561083d573d6000803e3d6000fd5b505050506040513d602081101561085357600080fd5b505160ff1611156108955760405162461bcd60e51b8152600401808060200182810382526025815260200180612e146025913960400191505060405180910390fd5b846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ce57600080fd5b505afa1580156108e2573d6000803e3d6000fd5b505050506040513d60208110156108f857600080fd5b50516040805163728f08cf60e11b81526001600160a01b0388811660048301528781166024830152915160129390930360ff16600a0a927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf199092169163e51e119e91604480820192602092909190829003018186803b15801561097a57600080fd5b505afa15801561098e573d6000803e3d6000fd5b505050506040513d60208110156109a457600080fd5b505182816109ae57fe5b04816109b657fe5b04925050505b92915050565b7f000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb489481565b6000806109f38484610a08565b9050610a00848483611ffc565b949350505050565b60007f00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f6001600160a01b03166338163032846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a7757600080fd5b505afa158015610a8b573d6000803e3d6000fd5b505050506040513d6020811015610aa157600080fd5b50516040805163728f08cf60e11b81526001600160a01b03868116600483015285811660248301529151928216926310e556989287927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf199091169163e51e119e91604480820192602092909190829003018186803b158015610b2257600080fd5b505afa158015610b36573d6000803e3d6000fd5b505050506040513d6020811015610b4c57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0390931660048401526024830191909152516044808301926020929190829003018186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d6020811015610bc557600080fd5b50519392505050565b3415610d1b577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b50506040805163a9059cbb60e01b815233600482015234602482015290516001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216945063a9059cbb9350604480830193506020928290030181600087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b5051610d1b5760405162461bcd60e51b8152600401808060200182810382526023815260200180612d416023913960400191505060405180910390fd5b610d467f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc234836116e4565b50565b600080610d57853385612175565b9050610d648585836105ea565b95945050505050565b600160701b81565b6000807f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663d6446d4385856040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015610df657600080fd5b505afa158015610e0a573d6000803e3d6000fd5b505050506040513d6020811015610e2057600080fd5b5051905080610e335760009150506109bc565b6000610e3f8585610a08565b9050610d64816107e6600160701b6107e0866064611f72565b7f00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f81565b7f0000000000000000000000001456688345527be1f37e9e627da0837d6f08c92581565b620186a081565b8115610f1457604080516311f9fbc960e21b81523360048201526024810184905290516001600160a01b038516916347e7ef2491604480830192600092919082900301818387803b158015610efb57600080fd5b505af1158015610f0f573d6000803e3d6000fd5b505050505b610f1f8383836116e4565b505050565b600080610f32853385612175565b9050610d64858583610fe5565b7f0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c81565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b7f000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e81565b600080610fd97f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc23385612175565b9050610a008482611d34565b60006002600054141561103f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005583338415158061105357508315155b6110a0576040805162461bcd60e51b81526020600482015260196024820152780aadcd2e840a0e4dee8dec6ded87440aaa68a988aa6a6bea8b603b1b604482015290519081900360640190fd5b60408051634ac1c33d60e01b81526001600160a01b03888116600483015233602483015291516000927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf191691634ac1c33d916044808301926020929190829003018186803b15801561111157600080fd5b505afa158015611125573d6000803e3d6000fd5b505050506040513d602081101561113b57600080fd5b505190508085111561114b578094505b856111605761115b8733876122f4565b611379565b8481141561121b577f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b0316638d7cad888833896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156111f057600080fd5b505af1158015611204573d6000803e3d6000fd5b505050508460001461115b5761115b8733876122f4565b611224876125fc565b7f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b0316638d7cad888833896040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156112ac57600080fd5b505af11580156112c0573d6000803e3d6000fd5b50505050846000146112d7576112d78733876122f4565b7f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663c640752d88336040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561135757600080fd5b505af115801561136b573d6000803e3d6000fd5b5050505061137987336127c4565b6040805187815260208101879052815133926001600160a01b038b16927fa702ae6024e8b4c2b0eb162b1453dacb93cf6922f5a2d7236faed898c21148f8929081900390910190a3849350507f0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c6001600160a01b031663bb55b7fc83836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b5050600160005550929695505050505050565b600260005414156114c4576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556114d2826125fc565b60006114de8383610a08565b90506114eb838383611ffc565b61153c576040805162461bcd60e51b815260206004820152601c60248201527f556e69742050726f746f636f6c3a20534146455f504f534954494f4e00000000604482015290519081900360640190fd5b60006115e8620186a06107e67f000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e6001600160a01b03166315a04ea2886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d60208110156115df57600080fd5b50518590611f72565b905060006115fe600160701b6107e68585612976565b90507f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663742a326e8686846040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b15801561168857600080fd5b505af115801561169c573d6000803e3d6000fd5b50506040516001600160a01b038088169350881691507f5b79a897d30813a62a1f95ba180d3320d3701d96605708b81105e00719a069e490600090a350506001600055505050565b6002600054141561173c576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005582338215158061175057508315155b61179d576040805162461bcd60e51b81526020600482015260196024820152780aadcd2e840a0e4dee8dec6ded87440aaa68a988aa6a6bea8b603b1b604482015290519081900360640190fd5b6012856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156117d857600080fd5b505afa1580156117ec573d6000803e3d6000fd5b505050506040513d602081101561180257600080fd5b505160ff1611156118445760405162461bcd60e51b8152600401808060200182810382526025815260200180612e146025913960400191505060405180910390fd5b826118ee577f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663ee18359e8633876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050611c48565b6118f7856125fc565b60408051634ac1c33d60e01b81526001600160a01b03878116600483015233602483015291516000927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf191691634ac1c33d916044808301926020929190829003018186803b15801561196857600080fd5b505afa15801561197c573d6000803e3d6000fd5b505050506040513d602081101561199257600080fd5b50511515905080611ad5577f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663c6d894f087337f00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f6001600160a01b031663fbcd55318b6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611a3b57600080fd5b505afa158015611a4f573d6000803e3d6000fd5b505050506040513d6020811015611a6557600080fd5b5051604080516001600160e01b031960e087901b1681526001600160a01b03948516600482015292909316602483015260448201529051606480830192600092919082900301818387803b158015611abc57600080fd5b505af1158015611ad0573d6000803e3d6000fd5b505050505b8415611b7c577f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663ee18359e8733886040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b6357600080fd5b505af1158015611b77573d6000803e3d6000fd5b505050505b7f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b0316635224372c8733876040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b505050506040513d6020811015611c2e57600080fd5b50611c3c9050863386612988565b611c4686336127c4565b505b6040805185815260208101859052815133926001600160a01b038916927f6423b6056e64b3b29cb2d342362b47c26fa8d6877da27ea152354060df19b9bc929081900390910190a37f0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c6001600160a01b031663bb55b7fc83836040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b158015611d1057600080fd5b505af1158015611d24573d6000803e3d6000fd5b5050600160005550505050505050565b6000611d617f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28484610fe5565b604080516323b872dd60e01b81523360048201523060248201526044810186905290519193506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916323b872dd916064808201926020929091908290030181600087803b158015611dda57600080fd5b505af1158015611dee573d6000803e3d6000fd5b505050506040513d6020811015611e0457600080fd5b5051611e415760405162461bcd60e51b8152600401808060200182810382526028815260200180612d196028913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611ea757600080fd5b505af1158015611ebb573d6000803e3d6000fd5b50506040516000925033915085908381818185875af1925050503d8060008114611f01576040519150601f19603f3d011682016040523d82523d6000602084013e611f06565b606091505b5050905080611f465760405162461bcd60e51b8152600401808060200182810382526022815260200180612dac6022913960400191505060405180910390fd5b509092915050565b7f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf1981565b600082611f81575060006109bc565b5081810281838281611f8f57fe5b04146109bc57fe5b600081611feb576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611ff457fe5b049392505050565b6000807f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663d6446d4386866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561207d57600080fd5b505afa158015612091573d6000803e3d6000fd5b505050506040513d60208110156120a757600080fd5b50519050806120ba576000915050610669565b7f000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e6001600160a01b0316633bffbbe2866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561212757600080fd5b505afa15801561213b573d6000803e3d6000fd5b505050506040513d602081101561215157600080fd5b505161216a846107e6600160701b6107e0866064611f72565b101595945050505050565b6000806301e133807f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b03166388ad7a6187876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156121fb57600080fd5b505afa15801561220f573d6000803e3d6000fd5b505050506040513d602081101561222557600080fd5b505160408051636a5c9edf60e11b81526001600160a01b038981166004830152888116602483015291514293909303927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf199092169163d4b93dbe91604480820192602092909190829003018186803b1580156122a057600080fd5b505afa1580156122b4573d6000803e3d6000fd5b505050506040513d60208110156122ca57600080fd5b505102816122d457fe5b04905080620186a001620186a08402816122ea57fe5b0495945050505050565b60408051633e543e5b60e11b81526001600160a01b03858116600483015284811660248301526044820184905291516000927f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf191691637ca87cb6916064808301926020929190829003018186803b15801561236e57600080fd5b505afa158015612382573d6000803e3d6000fd5b505050506040513d602081101561239857600080fd5b505160408051631d3981db60e21b815290519192506001600160a01b037f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf191691633d1aa9639183916374e6076c91600480820192602092909190829003018186803b15801561240657600080fd5b505afa15801561241a573d6000803e3d6000fd5b505050506040513d602081101561243057600080fd5b5051604080516001600160e01b031960e085901b1681526001600160a01b03928316600482015291871660248301526044820185905251606480830192600092919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b5050505060007f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b0316631da649cf8686866040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b15801561252957600080fd5b505af115801561253d573d6000803e3d6000fd5b505050506040513d602081101561255357600080fd5b50519050806125f5577f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b03166362b40f9f86866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050600060405180830381600087803b1580156125dc57600080fd5b505af11580156125f0573d6000803e3d6000fd5b505050505b5050505050565b60007f00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f6001600160a01b031663fbcd5531836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561266b57600080fd5b505afa15801561267f573d6000803e3d6000fd5b505050506040513d602081101561269557600080fd5b50519050806126d55760405162461bcd60e51b8152600401808060200182810382526022815260200180612d8a6022913960400191505060405180910390fd5b60007f00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f6001600160a01b031663c5807dc6836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d602081101561276557600080fd5b505190506001600160a01b038116610f1f576040805162461bcd60e51b815260206004820152601e60248201527f556e69742050726f746f636f6c3a2044495341424c45445f4f5241434c450000604482015290519081900360640190fd5b60006127d08383610a08565b905060006064600160701b7f000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e6001600160a01b031663b85c4496876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561284857600080fd5b505afa15801561285c573d6000803e3d6000fd5b505050506040513d602081101561287257600080fd5b505184028161287d57fe5b048161288557fe5b049050807f000000000000000000000000b1cff81b9305166ff1efc49a129ad2afcd7bcf196001600160a01b031663d6446d4386866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561290757600080fd5b505afa15801561291b573d6000803e3d6000fd5b505050506040513d602081101561293157600080fd5b505111156129705760405162461bcd60e51b8152600401808060200182810382526022815260200180612df26022913960400191505060405180910390fd5b50505050565b60008282111561298257fe5b50900390565b60007f000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb48946001600160a01b031663fbbac96285846040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156129ff57600080fd5b505afa158015612a13573d6000803e3d6000fd5b505050506040513d6020811015612a2957600080fd5b5051905080612a385750610f1f565b60408051636eb1769f60e11b81526001600160a01b038581166004830152306024830152915183927f0000000000000000000000001456688345527be1f37e9e627da0837d6f08c925169163dd62ed3e916044808301926020929190829003018186803b158015612aa857600080fd5b505afa158015612abc573d6000803e3d6000fd5b505050506040513d6020811015612ad257600080fd5b50511015612b115760405162461bcd60e51b8152600401808060200182810382526026815260200180612d646026913960400191505060405180910390fd5b6129707f0000000000000000000000001456688345527be1f37e9e627da0837d6f08c925847f000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb48946001600160a01b031663b3f006746040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8f57600080fd5b505afa158015612ba3573d6000803e3d6000fd5b505050506040513d6020811015612bb957600080fd5b505184604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b60208310612c405780518252601f199092019160209182019101612c21565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612ca2576040519150601f19603f3d011682016040523d82523d6000602084013e612ca7565b606091505b5091509150818015612cd5575080511580612cd55750808060200190516020811015612cd257600080fd5b50515b612d105760405162461bcd60e51b8152600401808060200182810382526024815260200180612dce6024913960400191505060405180910390fd5b50505050505056fe556e69742050726f746f636f6c3a20574554485f5452414e534645525f46524f4d5f4641494c4544556e69742050726f746f636f6c3a20574554485f5452414e534645525f4641494c4544556e69742050726f746f636f6c3a20424f52524f575f4645455f4e4f545f415050524f564544556e69742050726f746f636f6c3a20494e56414c49445f4f5241434c455f54595045556e69742050726f746f636f6c3a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e69742050726f746f636f6c3a20554e444552434f4c4c41544552414c495a4544556e69742050726f746f636f6c3a204e4f545f535550504f525445445f444543494d414c53a2646970667358221220eef9408baadd85a776f853f1c5f165076041f60bcea5ae21a2575755006894da64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb4894
-----Decoded View---------------
Arg [0] : _vaultManagerParameters (address): 0x203153522B9EAef4aE17c6e99851EE7b2F7D312E
Arg [1] : _oracleRegistry (address): 0x75fBFe26B21fd3EA008af0C764949f8214150C8f
Arg [2] : _cdpRegistry (address): 0x1a5Ff58BC3246Eb233fEA20D32b79B5F01eC650c
Arg [3] : _vaultManagerBorrowFeeParameters (address): 0xCbA7154bfBF898d9AB0cf0e259ABAB6CcbfB4894
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000203153522b9eaef4ae17c6e99851ee7b2f7d312e
Arg [1] : 00000000000000000000000075fbfe26b21fd3ea008af0c764949f8214150c8f
Arg [2] : 0000000000000000000000001a5ff58bc3246eb233fea20d32b79b5f01ec650c
Arg [3] : 000000000000000000000000cba7154bfbf898d9ab0cf0e259abab6ccbfb4894
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 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.