ETH Price: $1,841.21 (-14.12%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Exit147862222022-05-16 12:20:031361 days ago1652703603IN
0x69FB4D4e...81e893a91
0 ETH0.0025039816.86218831
Exit147851322022-05-16 8:14:321361 days ago1652688872IN
0x69FB4D4e...81e893a91
0 ETH0.0012829816.61472387
Exit147851242022-05-16 8:13:141361 days ago1652688794IN
0x69FB4D4e...81e893a91
0 ETH0.0021522917.32385252
Exit147749442022-05-14 17:38:361363 days ago1652549916IN
0x69FB4D4e...81e893a91
0 ETH0.003143634.31769531
Exit147744672022-05-14 15:48:511363 days ago1652543331IN
0x69FB4D4e...81e893a91
0 ETH0.0050159532.87644469
Exit_Eth147691182022-05-13 19:00:071364 days ago1652468407IN
0x69FB4D4e...81e893a91
0 ETH0.0124754869.10097105
Exit147681302022-05-13 15:18:351364 days ago1652455115IN
0x69FB4D4e...81e893a91
0 ETH0.06499466128.15895455
Trigger Liquidat...147661152022-05-13 7:44:121364 days ago1652427852IN
0x69FB4D4e...81e893a91
0 ETH0.0124109980.34776645
Trigger Liquidat...147625952022-05-12 18:17:091365 days ago1652379429IN
0x69FB4D4e...81e893a91
0 ETH0.05888348212.01015287
Trigger Liquidat...147625952022-05-12 18:17:091365 days ago1652379429IN
0x69FB4D4e...81e893a91
0 ETH0.07506593302.98574789
Trigger Liquidat...147625952022-05-12 18:17:091365 days ago1652379429IN
0x69FB4D4e...81e893a91
0 ETH0.07506593302.98574789
Trigger Liquidat...147621612022-05-12 16:34:561365 days ago1652373296IN
0x69FB4D4e...81e893a91
0 ETH0.08654889311.61952434
Join147603382022-05-12 9:35:371365 days ago1652348137IN
0x69FB4D4e...81e893a91
0 ETH0.01431039180.82840975
Join147601782022-05-12 8:59:471365 days ago1652345987IN
0x69FB4D4e...81e893a91
0 ETH0.02334113300.32723524
Join147592592022-05-12 5:26:301365 days ago1652333190IN
0x69FB4D4e...81e893a91
0 ETH0.03408302439.8717455
Join147591052022-05-12 4:46:471365 days ago1652330807IN
0x69FB4D4e...81e893a91
0 ETH0.02616454313.02915938
Join147590882022-05-12 4:41:231365 days ago1652330483IN
0x69FB4D4e...81e893a91
0 ETH0.02468571325.6905124
Exit147580152022-05-12 0:28:201365 days ago1652315300IN
0x69FB4D4e...81e893a91
0 ETH0.05867769115.57438076
Exit147580022022-05-12 0:25:501365 days ago1652315150IN
0x69FB4D4e...81e893a91
0 ETH0.07890468141.29079064
Exit147579612022-05-12 0:15:301365 days ago1652314530IN
0x69FB4D4e...81e893a91
0 ETH0.06335227113.44184413
Exit147578782022-05-11 23:55:431365 days ago1652313343IN
0x69FB4D4e...81e893a91
0 ETH0.05775987113.76258141
Exit147578732022-05-11 23:53:571365 days ago1652313237IN
0x69FB4D4e...81e893a91
0 ETH0.0105086491.54832238
Exit147577812022-05-11 23:33:201366 days ago1652312000IN
0x69FB4D4e...81e893a91
0 ETH0.0140597122.52252313
Join147573362022-05-11 21:52:471366 days ago1652305967IN
0x69FB4D4e...81e893a91
0 ETH0.01649267208.40404536
Join147573352022-05-11 21:52:431366 days ago1652305963IN
0x69FB4D4e...81e893a91
0 ETH0.01715663210.99243682
View all transactions

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
-147691182022-05-13 19:00:071364 days ago1652468407
0x69FB4D4e...81e893a91
31.09519801 ETH
-147691182022-05-13 19:00:071364 days ago1652468407
0x69FB4D4e...81e893a91
31.09519801 ETH
-147069972022-05-03 21:17:371374 days ago1651612657
0x69FB4D4e...81e893a91
5 ETH
-147069972022-05-03 21:17:371374 days ago1651612657
0x69FB4D4e...81e893a91
5 ETH
-147033972022-05-03 7:44:081374 days ago1651563848
0x69FB4D4e...81e893a91
4 ETH
-147033972022-05-03 7:44:081374 days ago1651563848
0x69FB4D4e...81e893a91
4 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CDPManager01

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// 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;
}

File 6 of 16 : IVault.sol
// 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 );
}

File 10 of 16 : IToken.sol
// 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);
}

File 12 of 16 : ReentrancyGuard.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

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"}]

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


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.