ETH Price: $2,265.23 (-6.79%)

Contract

0x39ED999819ADB989f860dBD4b5E60DC9e045b9C8

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Mint1791697282024-02-10 1:13:34723 days ago1707527614IN
0x39ED9998...9e045b9C8
0 ETH0.000065790.1
Burn1790827902024-02-09 18:45:04723 days ago1707504304IN
0x39ED9998...9e045b9C8
0 ETH0.00016460.1
Mint1788512552024-02-09 1:38:53724 days ago1707442733IN
0x39ED9998...9e045b9C8
0 ETH0.00011510.1
File1653746402023-12-30 18:35:04764 days ago1703961304IN
0x39ED9998...9e045b9C8
0 ETH0.000053430.1
Mint1653744052023-12-30 18:34:03764 days ago1703961243IN
0x39ED9998...9e045b9C8
0 ETH0.000065870.1

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Pool

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
london EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import {Util} from "./Util.sol";
import {ERC20} from "./ERC20.sol";
import {IERC20} from "./interfaces/IERC20.sol";
import {IOracle} from "./interfaces/IOracle.sol";
import {IRateModel} from "./interfaces/IRateModel.sol";

contract Pool is Util, ERC20 {
    error CapReached();
    error BorrowTooSmall();
    error NotInEmergency();
    error UtilizationTooHigh();

    IERC20 public immutable asset;
    IRateModel public rateModel;
    IOracle public oracle;
    bool public emergencyActive;
    uint256 public borrowMin;
    uint256 public liquidationFactor;
    uint256 public amountCap;
    uint256 public lastUpdate;
    uint256 public index = 1e18;
    uint256 public totalBorrow;

    event FileInt(bytes32 indexed what, uint256 data);
    event FileAddress(bytes32 indexed what, address data);
    event Deposit(address indexed who, address indexed usr, uint256 amt, uint256 sha);
    event Withdraw(address indexed who, address indexed usr, uint256 amt, uint256 sha);
    event Borrow(address indexed who, uint256 amt, uint256 bor);
    event Repay(address indexed who, uint256 amt, uint256 bor);
    event Loss(address indexed who, uint256 amt, uint256 amttre, uint256 amtava);

    constructor(
        address _asset,
        address _rateModel,
        address _oracle,
        uint256 _borrowMin,
        uint256 _liquidationFactor,
        uint256 _amountCap
    )
        ERC20(
            string(abi.encodePacked("Rodeo Interest Bearing ", IERC20(_asset).name())),
            string(abi.encodePacked("rib", IERC20(_asset).symbol())),
            IERC20(_asset).decimals()
        )
    {
        asset = IERC20(_asset);
        rateModel = IRateModel(_rateModel);
        oracle = IOracle(_oracle);
        borrowMin = _borrowMin;
        liquidationFactor = _liquidationFactor;
        amountCap = _amountCap;
        lastUpdate = block.timestamp;
        exec[msg.sender] = true;
    }

    function file(bytes32 what, uint256 data) external auth {
        if (what == "paused") paused = data == 1;
        if (what == "emergency") emergencyActive = data == 1;
        if (what == "borrowMin") borrowMin = data;
        if (what == "liquidationFactor") liquidationFactor = data;
        if (what == "amountCap") amountCap = data;
        emit FileInt(what, data);
    }

    function file(bytes32 what, address data) external auth {
        if (what == "exec") exec[data] = !exec[data];
        if (what == "rateModel") rateModel = IRateModel(data);
        if (what == "oracle") oracle = IOracle(data);
        emit FileAddress(what, data);
    }

    // Supply asset for lending
    function mint(uint256 amt, address usr) external loop live {
        update();
        uint256 totalLiquidity = getTotalLiquidity();
        if (totalLiquidity + amt > amountCap) revert CapReached();
        uint256 sha = amt;
        if (totalLiquidity > 0) {
            sha = amt * totalSupply / totalLiquidity;
        } else {
            sha -= 1e6;
            _mint(0x000000000000000000000000000000000000dEaD, 1e6);
        }
        pull(asset, msg.sender, amt);
        _mint(usr, sha);
        emit Deposit(msg.sender, usr, amt, sha);
    }

    // Withdraw supplied asset
    function burn(uint256 sha, address usr) external loop live {
        update();
        uint256 amt = sha * getTotalLiquidity() / totalSupply;
        if (balanceOf[msg.sender] < sha) revert InsufficientBalance();
        if (asset.balanceOf(address(this)) < amt) revert UtilizationTooHigh();
        _burn(msg.sender, sha);
        push(asset, usr, amt);
        emit Withdraw(msg.sender, usr, amt, sha);
    }

    // Borrow from pool (called by Investor)
    function borrow(uint256 amt) external live auth returns (uint256) {
        update();
        if (amt < borrowMin) revert BorrowTooSmall();
        if (asset.balanceOf(address(this)) < amt) revert UtilizationTooHigh();
        uint256 bor = amt * 1e18 / index;
        totalBorrow += bor;
        push(asset, msg.sender, amt);
        emit Borrow(msg.sender, amt, bor);
        return bor;
    }

    // Repay pool (called by Investor)
    function repay(uint256 bor) external live auth returns (uint256) {
        update();
        uint256 amt = bor * index / 1e18;
        totalBorrow -= bor;
        pull(asset, msg.sender, amt);
        emit Repay(msg.sender, amt, bor);
        return amt;
    }

    // Levy allows an admin to collect some of the protocol reserves
    function levy(uint256 sha) external live auth {
        update();
        uint256 amt = sha * getTotalLiquidity() / totalSupply;
        _burn(address(0), sha);
        push(asset, msg.sender, amt);
        emit Withdraw(msg.sender, address(0), amt, sha);
    }

    // A minimal `burn()` to be used by users in case of emergency / frontend not working
    function emergency() external loop {
        if (!emergencyActive) revert NotInEmergency();
        uint256 sha = balanceOf[msg.sender];
        uint256 amt = sha * getTotalLiquidity() / totalSupply;
        if (asset.balanceOf(address(this)) < amt) revert UtilizationTooHigh();
        _burn(msg.sender, sha);
        push(asset, msg.sender, amt);
        emit Withdraw(msg.sender, msg.sender, amt, sha);
    }

    // Accrue interest to index
    function update() public {
        uint256 time = block.timestamp - lastUpdate;
        if (time > 0) {
            uint256 utilization = getUtilization();
            index += (index * rateModel.rate(utilization) * time) / 1e18;
            lastUpdate = block.timestamp;
        }
    }

    function getUtilization() public view returns (uint256) {
        uint256 totalLiquidity = getTotalLiquidity();
        if (totalLiquidity == 0) return 0;
        return getTotalBorrow() * 1e18 / totalLiquidity;
    }

    function getTotalLiquidity() public view returns (uint256) {
        return asset.balanceOf(address(this)) + getTotalBorrow();
    }

    function getTotalBorrow() public view returns (uint256) {
        return totalBorrow * index / 1e18;
    }

    function getUpdatedIndex() public view returns (uint256) {
        uint256 time = block.timestamp - lastUpdate;
        uint256 utilization = getUtilization();
        return index + ((index * rateModel.rate(utilization) * time) / 1e18);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

import {IERC20} from "./interfaces/IERC20.sol";

contract Util {
    error Paused();
    error NoReentering();
    error Unauthorized();
    error TransferFailed();

    bool internal entered;
    bool public paused;
    mapping(address => bool) public exec;

    modifier loop() {
        if (entered) revert NoReentering();
        entered = true;
        _;
        entered = false;
    }

    modifier live() {
        if (paused) revert Paused();
        _;
    }

    modifier auth() {
        if (!exec[msg.sender]) revert Unauthorized();
        _;
    }

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    // from OZ SignedMath
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            return uint256(n >= 0 ? n : -n);
        }
    }

    // from OZ Math
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 result = 1 << (log2(a) >> 1);
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) result += 1;
        }
        return result;
    }

    function pow(uint256 x, uint256 y) internal pure returns (uint256) {
        if (y == 0) return 1e18;
        if (x == 0) return 0;
        require(x >> 255 == 0, "xoob");
        int256 x_int256 = int256(x);
        require(y < uint256(2 ** 254) / 1e20, "yoob");
        int256 y_int256 = int256(y);
        int256 logx_times_y = _ln(x_int256) * y_int256 / 1e18;
        require(-41e18 <= logx_times_y && logx_times_y <= 130e18, "poob");
        return uint256(_exp(logx_times_y));
    }

    int256 constant x0 = 128000000000000000000; // 2ˆ7
    int256 constant a0 = 38877084059945950922200000000000000000000000000000000000; // eˆ(x0) (no decimals)
    int256 constant x1 = 64000000000000000000; // 2ˆ6
    int256 constant a1 = 6235149080811616882910000000; // eˆ(x1) (no decimals)
    int256 constant x2 = 3200000000000000000000; // 2ˆ5
    int256 constant a2 = 7896296018268069516100000000000000; // eˆ(x2)
    int256 constant x3 = 1600000000000000000000; // 2ˆ4
    int256 constant a3 = 888611052050787263676000000; // eˆ(x3)
    int256 constant x4 = 800000000000000000000; // 2ˆ3
    int256 constant a4 = 298095798704172827474000; // eˆ(x4)
    int256 constant x5 = 400000000000000000000; // 2ˆ2
    int256 constant a5 = 5459815003314423907810; // eˆ(x5)
    int256 constant x6 = 200000000000000000000; // 2ˆ1
    int256 constant a6 = 738905609893065022723; // eˆ(x6)
    int256 constant x7 = 100000000000000000000; // 2ˆ0
    int256 constant a7 = 271828182845904523536; // eˆ(x7)
    int256 constant x8 = 50000000000000000000; // 2ˆ-1
    int256 constant a8 = 164872127070012814685; // eˆ(x8)
    int256 constant x9 = 25000000000000000000; // 2ˆ-2
    int256 constant a9 = 128402541668774148407; // eˆ(x9)
    int256 constant x10 = 12500000000000000000; // 2ˆ-3
    int256 constant a10 = 113314845306682631683; // eˆ(x10)
    int256 constant x11 = 6250000000000000000; // 2ˆ-4
    int256 constant a11 = 106449445891785942956; // eˆ(x11)

    function _ln(int256 a) private pure returns (int256) {
        if (a < 1e18) return -_ln((1e18 * 1e18) / a);
        int256 sum = 0;
        if (a >= a0 * 1e18) {
            a /= a0;
            sum += x0;
        }
        if (a >= a1 * 1e18) {
            a /= a1;
            sum += x1;
        }
        sum *= 100;
        a *= 100;
        if (a >= a2) {
            a = (a * 1e20) / a2;
            sum += x2;
        }
        if (a >= a3) {
            a = (a * 1e20) / a3;
            sum += x3;
        }
        if (a >= a4) {
            a = (a * 1e20) / a4;
            sum += x4;
        }
        if (a >= a5) {
            a = (a * 1e20) / a5;
            sum += x5;
        }
        if (a >= a6) {
            a = (a * 1e20) / a6;
            sum += x6;
        }
        if (a >= a7) {
            a = (a * 1e20) / a7;
            sum += x7;
        }
        if (a >= a8) {
            a = (a * 1e20) / a8;
            sum += x8;
        }
        if (a >= a9) {
            a = (a * 1e20) / a9;
            sum += x9;
        }
        if (a >= a10) {
            a = (a * 1e20) / a10;
            sum += x10;
        }
        if (a >= a11) {
            a = (a * 1e20) / a11;
            sum += x11;
        }
        int256 z = ((a - 1e20) * 1e20) / (a + 1e20);
        int256 z_squared = (z * z) / 1e20;
        int256 num = z;
        int256 seriesSum = num;
        num = (num * z_squared) / 1e20;
        seriesSum += num / 3;
        num = (num * z_squared) / 1e20;
        seriesSum += num / 5;
        num = (num * z_squared) / 1e20;
        seriesSum += num / 7;
        num = (num * z_squared) / 1e20;
        seriesSum += num / 9;
        num = (num * z_squared) / 1e20;
        seriesSum += num / 11;
        seriesSum *= 2;
        return (sum + seriesSum) / 100;
    }

    function _exp(int256 x) internal pure returns (int256) {
        require(x >= -41e18 && x <= 130e18, "ie");
        if (x < 0) return ((1e18 * 1e18) / _exp(-x));
        int256 firstAN;
        if (x >= x0) {
            x -= x0;
            firstAN = a0;
        } else if (x >= x1) {
            x -= x1;
            firstAN = a1;
        } else {
            firstAN = 1;
        }
        x *= 100;
        int256 product = 1e20;
        if (x >= x2) {
            x -= x2;
            product = (product * a2) / 1e20;
        }
        if (x >= x3) {
            x -= x3;
            product = (product * a3) / 1e20;
        }
        if (x >= x4) {
            x -= x4;
            product = (product * a4) / 1e20;
        }
        if (x >= x5) {
            x -= x5;
            product = (product * a5) / 1e20;
        }
        if (x >= x6) {
            x -= x6;
            product = (product * a6) / 1e20;
        }
        if (x >= x7) {
            x -= x7;
            product = (product * a7) / 1e20;
        }
        if (x >= x8) {
            x -= x8;
            product = (product * a8) / 1e20;
        }
        if (x >= x9) {
            x -= x9;
            product = (product * a9) / 1e20;
        }
        int256 seriesSum = 1e20;
        int256 term;
        term = x;
        seriesSum += term;
        term = ((term * x) / 1e20) / 2;
        seriesSum += term;
        term = ((term * x) / 1e20) / 3;
        seriesSum += term;
        term = ((term * x) / 1e20) / 4;
        seriesSum += term;
        term = ((term * x) / 1e20) / 5;
        seriesSum += term;
        term = ((term * x) / 1e20) / 6;
        seriesSum += term;
        term = ((term * x) / 1e20) / 7;
        seriesSum += term;
        term = ((term * x) / 1e20) / 8;
        seriesSum += term;
        term = ((term * x) / 1e20) / 9;
        seriesSum += term;
        term = ((term * x) / 1e20) / 10;
        seriesSum += term;
        term = ((term * x) / 1e20) / 11;
        seriesSum += term;
        term = ((term * x) / 1e20) / 12;
        seriesSum += term;
        return (((product * seriesSum) / 1e20) * firstAN) / 100;
    }

    function pull(IERC20 asset, address usr, uint256 amt) internal {
        if (amt == 0) return;
        if (!asset.transferFrom(usr, address(this), amt)) revert TransferFailed();
    }

    function pullTo(IERC20 asset, address usr, address to, uint256 amt) internal {
        if (amt == 0) return;
        if (!asset.transferFrom(usr, to, amt)) revert TransferFailed();
    }

    function push(IERC20 asset, address usr, uint256 amt) internal {
        if (amt == 0) return;
        if (!asset.transfer(usr, amt)) revert TransferFailed();
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

contract ERC20 {
    error InsufficientBalance();
    error InsufficientAllowance();

    string public name;
    string public symbol;
    uint8 public immutable decimals;
    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    event Approval(address indexed src, address indexed guy, uint256 amt);
    event Transfer(address indexed src, address indexed dst, uint256 amt);

    constructor(string memory _name, string memory _symbol, uint8 _decimals) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
    }

    function transfer(address dst, uint256 amt) external returns (bool) {
        return transferFrom(msg.sender, dst, amt);
    }

    function transferFrom(address src, address dst, uint256 amt) public returns (bool) {
        uint256 bal = balanceOf[src];
        uint256 all = allowance[src][msg.sender];
        if (bal < amt) revert InsufficientBalance();
        if (src != msg.sender && all != type(uint256).max) {
            if (all < amt) revert InsufficientAllowance();
            allowance[src][msg.sender] = all - amt;
        }
        balanceOf[src] = bal - amt;
        balanceOf[dst] = balanceOf[dst] + amt;
        emit Transfer(src, dst, amt);
        return true;
    }

    function approve(address usr, uint256 amt) external returns (bool) {
        allowance[msg.sender][usr] = amt;
        emit Approval(msg.sender, usr, amt);
        return true;
    }

    function _mint(address usr, uint256 amt) internal {
        balanceOf[usr] = balanceOf[usr] + amt;
        totalSupply = totalSupply + amt;
        emit Transfer(address(0), usr, amt);
    }

    function _burn(address usr, uint256 amt) internal {
        uint256 bal = balanceOf[usr];
        if (bal < amt) revert InsufficientBalance();
        balanceOf[usr] = bal - amt;
        totalSupply = totalSupply - amt;
        emit Transfer(usr, address(0), amt);
    }
}

contract Domain {
    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH =
        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";

    bytes32 private immutable _DOMAIN_SEPARATOR;
    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;

    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
        return keccak256(abi.encode(DOMAIN_SEPARATOR_SIGNATURE_HASH, "Rodeo", "1", chainId, address(this)));
    }

    constructor() {
        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = block.chainid);
    }

    function _domainSeparator() internal view returns (bytes32) {
        return block.chainid == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(block.chainid);
    }

    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {
        digest = keccak256(abi.encodePacked(EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA, _domainSeparator(), dataHash));
    }
}

contract ERC20Permit is ERC20, Domain {
    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint256) public nonces;

    constructor(string memory _name, string memory _symbol, uint8 _decimals) ERC20(_name, _symbol, _decimals) {}

    function DOMAIN_SEPARATOR() external view returns (bytes32) {
        return _domainSeparator();
    }

    function permit(address owr, address usr, uint256 val, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(owr != address(0), "ERC20: Owner cannot be 0");
        require(block.timestamp < deadline, "ERC20: Expired");
        require(
            ecrecover(
                _getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owr, usr, val, nonces[owr]++, deadline))),
                v,
                r,
                s
            ) == owr,
            "ERC20: Invalid Signature"
        );
        allowance[owr][usr] = val;
        emit Approval(owr, usr, val);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function allowance(address, address) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IOracle {
    function latestAnswer() external view returns (int256);
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;

interface IRateModel {
    function rate(uint256) external view returns (uint256);
    function kink() external view returns (uint256);
    function base() external view returns (uint256);
    function low() external view returns (uint256);
    function high() external view returns (uint256);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_rateModel","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_borrowMin","type":"uint256"},{"internalType":"uint256","name":"_liquidationFactor","type":"uint256"},{"internalType":"uint256","name":"_amountCap","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BorrowTooSmall","type":"error"},{"inputs":[],"name":"CapReached","type":"error"},{"inputs":[],"name":"InsufficientAllowance","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NoReentering","type":"error"},{"inputs":[],"name":"NotInEmergency","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UtilizationTooHigh","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bor","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sha","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"FileAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"FileInt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amttre","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amtava","type":"uint256"}],"name":"Loss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bor","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sha","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"borrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sha","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exec","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTotalBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUpdatedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUtilization","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sha","type":"uint256"}],"name":"levy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidationFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"address","name":"usr","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateModel","outputs":[{"internalType":"contract IRateModel","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bor","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBorrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052670de0b6b3a7640000600d553480156200001d57600080fd5b5060405162001fb938038062001fb9833981016040819052620000409162000268565b856001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200007f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000a991908101906200030a565b604051602001620000bb9190620003c2565b604051602081830303815290604052866001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000109573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200013391908101906200030a565b60405160200162000145919062000409565b604051602081830303815290604052876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000193573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b9919062000436565b6002620001c78482620004f1565b506003620001d68382620004f1565b5060ff1660805250506001600160a01b0395861660a052600780546001600160a01b0319908116968816969096179055600880549095169390951692909217909255600991909155600a55600b5542600c55336000908152600160208190526040909120805460ff19169091179055620005bd565b80516001600160a01b03811681146200026357600080fd5b919050565b60008060008060008060c087890312156200028257600080fd5b6200028d876200024b565b95506200029d602088016200024b565b9450620002ad604088016200024b565b9350606087015192506080870151915060a087015190509295509295509295565b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000301578181015183820152602001620002e7565b50506000910152565b6000602082840312156200031d57600080fd5b81516001600160401b03808211156200033557600080fd5b818401915084601f8301126200034a57600080fd5b8151818111156200035f576200035f620002ce565b604051601f8201601f19908116603f011681019083821181831017156200038a576200038a620002ce565b81604052828152876020848701011115620003a457600080fd5b620003b7836020830160208801620002e4565b979650505050505050565b7f526f64656f20496e7465726573742042656172696e6720000000000000000000815260008251620003fc816017850160208701620002e4565b9190910160170192915050565b623934b160e91b81526000825162000429816003850160208701620002e4565b9190910160030192915050565b6000602082840312156200044957600080fd5b815160ff811681146200045b57600080fd5b9392505050565b600181811c908216806200047757607f821691505b6020821081036200049857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620004ec57600081815260208120601f850160051c81016020861015620004c75750805b601f850160051c820191505b81811015620004e857828155600101620004d3565b5050505b505050565b81516001600160401b038111156200050d576200050d620002ce565b62000525816200051e845462000462565b846200049e565b602080601f8311600181146200055d5760008415620005445750858301515b600019600386901b1c1916600185901b178555620004e8565b600085815260208120601f198616915b828110156200058e578886015182559484019460019091019084016200056d565b5085821015620005ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05161199062000629600039600081816102f60152818161083a0152818161095f01528181610bc101528181610ce701528181610edb01528181610fae015281816110bb01528181611154015281816113b201526114530152600061029901526119906000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80637eb711311161011a578063a9059cbb116100ad578063d4e8be831161007c578063d4e8be8314610443578063dd62ed3e14610456578063e37f8a7e14610481578063eddaa3ab14610489578063fcd3533c1461049d57600080fd5b8063a9059cbb1461040c578063c04637111461041f578063c5ebeaec14610428578063caa6fea41461043b57600080fd5b806399a773cc116100e957806399a773cc146103d557806399ba3136146103de578063a1088459146103f1578063a2e620451461040457600080fd5b80637eb71131146103a95780638285ef40146103b157806394bf804d146103ba57806395d89b41146103cd57600080fd5b806335c7e9251161019d5780634bb700961161016c5780634bb70096146103395780635c975abb146103415780636bb6126e1461035357806370a08231146103765780637dc0d1d01461039657600080fd5b806335c7e925146102d6578063371fd8e6146102de57806338d52e0f146102f157806343528dda1461033057600080fd5b80632986c0e5116101d95780632986c0e51461027657806329ae81141461027f578063313ce56714610294578063352ade55146102cd57600080fd5b806306fdde031461020b578063095ea7b31461022957806318160ddd1461024c57806323b872dd14610263575b600080fd5b6102136104b0565b60405161022091906116f9565b60405180910390f35b61023c61023736600461175e565b61053e565b6040519015158152602001610220565b61025560045481565b604051908152602001610220565b61023c610271366004611788565b6105ab565b610255600d5481565b61029261028d3660046117c4565b61070a565b005b6102bb7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610220565b610255600a5481565b61025561081b565b6102556102ec3660046117e6565b6108bc565b6103187f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610220565b610255600b5481565b6102556109c9565b60005461023c90610100900460ff1681565b61023c6103613660046117ff565b60016020526000908152604090205460ff1681565b6102556103843660046117ff565b60056020526000908152604090205481565b600854610318906001600160a01b031681565b610255610a95565b610255600e5481565b6102926103c836600461181a565b610add565b610213610c47565b61025560095481565b6102926103ec3660046117e6565b610c54565b600754610318906001600160a01b031681565b610292610d50565b61023c61041a36600461175e565b610e2c565b610255600c5481565b6102556104363660046117e6565b610e40565b61029261100c565b61029261045136600461181a565b6111c5565b610255610464366004611846565b600660209081526000928352604080842090915290825290205481565b6102556112c1565b60085461023c90600160a01b900460ff1681565b6102926104ab36600461181a565b6112e6565b600280546104bd90611870565b80601f01602080910402602001604051908101604052809291908181526020018280546104e990611870565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b505050505081565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105999086815260200190565b60405180910390a35060015b92915050565b6001600160a01b03831660009081526005602090815260408083205460068352818420338552909252822054838210156105f857604051631e9acf1760e31b815260040160405180910390fd5b6001600160a01b038616331480159061061357506000198114155b156106685783811015610639576040516313be252b60e01b815260040160405180910390fd5b61064384826118c0565b6001600160a01b03871660009081526006602090815260408083203384529091529020555b61067284836118c0565b6001600160a01b0380881660009081526005602052604080822093909355908716815220546106a29085906118d3565b6001600160a01b0380871660008181526005602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106f69088815260200190565b60405180910390a350600195945050505050565b3360009081526001602052604090205460ff16610739576040516282b42960e81b815260040160405180910390fd5b81651c185d5cd95960d21b0361075e576000805461ff00191660018314610100021790555b8168656d657267656e637960b81b0361078a576008805460ff60a01b191660018314600160a01b021790555b81683137b93937bba6b4b760b91b036107a35760098190555b81703634b8bab4b230ba34b7b72330b1ba37b960791b036107c457600a8190555b81680616d6f756e744361760bc1b036107dd57600b8190555b817f75b666bb5982c26146549f340e3f4c827469b18602d2bf483f21ed8a43f67e988260405161080f91815260200190565b60405180910390a25050565b60006108256112c1565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ad91906118e6565b6108b791906118d3565b905090565b60008054610100900460ff16156108e6576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610915576040516282b42960e81b815260040160405180910390fd5b61091d610d50565b6000670de0b6b3a7640000600d548461093691906118ff565b6109409190611916565b905082600e600082825461095491906118c0565b9091555061098590507f000000000000000000000000000000000000000000000000000000000000000033836114ce565b604080518281526020810185905233917f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d091015b60405180910390a290505b919050565b600080600c54426109da91906118c0565b905060006109e6610a95565b6007546040516373f7356b60e11b815260048101839052919250670de0b6b3a76400009184916001600160a01b03169063e7ee6ad690602401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6091906118e6565b600d54610a6d91906118ff565b610a7791906118ff565b610a819190611916565b600d54610a8e91906118d3565b9250505090565b600080610aa061081b565b905080600003610ab257600091505090565b80610abb6112c1565b610acd90670de0b6b3a76400006118ff565b610ad79190611916565b91505090565b60005460ff1615610b015760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff191660011790819055610100900460ff1615610b36576040516313d0ff5960e31b815260040160405180910390fd5b610b3e610d50565b6000610b4861081b565b600b54909150610b5884836118d3565b1115610b7757604051636bf4c8e960e11b815260040160405180910390fd5b828115610b9e578160045485610b8d91906118ff565b610b979190611916565b9050610bbc565b610bab620f4240826118c0565b9050610bbc61dead620f4240611577565b610be77f000000000000000000000000000000000000000000000000000000000000000033866114ce565b610bf18382611577565b60408051858152602081018390526001600160a01b0385169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350506000805460ff191690555050565b600380546104bd90611870565b600054610100900460ff1615610c7d576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610cac576040516282b42960e81b815260040160405180910390fd5b610cb4610d50565b6000600454610cc161081b565b610ccb90846118ff565b610cd59190611916565b9050610ce2600083611603565b610d0d7f000000000000000000000000000000000000000000000000000000000000000033836116b7565b604080518281526020810184905260009133917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56791015b60405180910390a35050565b6000600c5442610d6091906118c0565b90508015610e29576000610d72610a95565b6007546040516373f7356b60e11b815260048101839052919250670de0b6b3a76400009184916001600160a01b03169063e7ee6ad690602401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906118e6565b600d54610df991906118ff565b610e0391906118ff565b610e0d9190611916565b600d6000828254610e1e91906118d3565b909155505042600c55505b50565b6000610e393384846105ab565b9392505050565b60008054610100900460ff1615610e6a576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610e99576040516282b42960e81b815260040160405180910390fd5b610ea1610d50565b600954821015610ec457604051637139da2360e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e91906118e6565b1015610f6d57604051633ae100b760e11b815260040160405180910390fd5b600d54600090610f8584670de0b6b3a76400006118ff565b610f8f9190611916565b905080600e6000828254610fa391906118d3565b90915550610fd490507f000000000000000000000000000000000000000000000000000000000000000033856116b7565b604080518481526020810183905233917fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af91016109b9565b60005460ff16156110305760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff19166001179055600854600160a01b900460ff1661106757604051633b1cf39760e21b815260040160405180910390fd5b3360009081526005602052604081205460045490919061108561081b565b61108f90846118ff565b6110999190611916565b6040516370a0823160e01b815230600482015290915081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112691906118e6565b101561114557604051633ae100b760e11b815260040160405180910390fd5b61114f3383611603565b61117a7f000000000000000000000000000000000000000000000000000000000000000033836116b7565b6040805182815260208101849052339182917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567910160405180910390a350506000805460ff19169055565b3360009081526001602052604090205460ff166111f4576040516282b42960e81b815260040160405180910390fd5b81636578656360e01b0361122b576001600160a01b0381166000908152600160205260409020805460ff19811660ff909116151790555b81681c985d19535bd9195b60ba1b0361125a57600780546001600160a01b0319166001600160a01b0383161790555b81656f7261636c6560d01b0361128657600880546001600160a01b0319166001600160a01b0383161790555b6040516001600160a01b038216815282907f41a50316b758972a692a69178de3d99c3138a652f5213364ee8eff829f22048a9060200161080f565b6000670de0b6b3a7640000600d54600e546112dc91906118ff565b6108b79190611916565b60005460ff161561130a5760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff191660011790819055610100900460ff161561133f576040516313d0ff5960e31b815260040160405180910390fd5b611347610d50565b600060045461135461081b565b61135e90856118ff565b6113689190611916565b3360009081526005602052604090205490915083111561139b57604051631e9acf1760e31b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142591906118e6565b101561144457604051633ae100b760e11b815260040160405180910390fd5b61144e3384611603565b6114797f000000000000000000000000000000000000000000000000000000000000000083836116b7565b60408051828152602081018590526001600160a01b0384169133917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567910160405180910390a350506000805460ff1916905550565b806000036114db57505050565b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115559190611938565b611572576040516312171d8360e31b815260040160405180910390fd5b505050565b6001600160a01b03821660009081526005602052604090205461159b9082906118d3565b6001600160a01b0383166000908152600560205260409020556004546115c29082906118d3565b6004556040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d44565b6001600160a01b0382166000908152600560205260409020548181101561163d57604051631e9acf1760e31b815260040160405180910390fd5b61164782826118c0565b6001600160a01b03841660009081526005602052604090205560045461166e9083906118c0565b6004556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b806000036116c457505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611512565b600060208083528351808285015260005b818110156117265785810183015185820160400152820161170a565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109c457600080fd5b6000806040838503121561177157600080fd5b61177a83611747565b946020939093013593505050565b60008060006060848603121561179d57600080fd5b6117a684611747565b92506117b460208501611747565b9150604084013590509250925092565b600080604083850312156117d757600080fd5b50508035926020909101359150565b6000602082840312156117f857600080fd5b5035919050565b60006020828403121561181157600080fd5b610e3982611747565b6000806040838503121561182d57600080fd5b8235915061183d60208401611747565b90509250929050565b6000806040838503121561185957600080fd5b61186283611747565b915061183d60208401611747565b600181811c9082168061188457607f821691505b6020821081036118a457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105a5576105a56118aa565b808201808211156105a5576105a56118aa565b6000602082840312156118f857600080fd5b5051919050565b80820281158282048414176105a5576105a56118aa565b60008261193357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561194a57600080fd5b81518015158114610e3957600080fdfea264697066735822122074e2e8d1decb517cdd816b284b15b2fba5e87449d25862e707592e157db4a04464736f6c63430008110033000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8000000000000000000000000627ea8812ef561d6ad9308d2a63e36901f51e3e500000000000000000000000050834f3163758fcc1df9973b6e91f0f0f0434ad300000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000d2f13f7789f000000000000000000000000000000000000000000000000000000000002540be400

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80637eb711311161011a578063a9059cbb116100ad578063d4e8be831161007c578063d4e8be8314610443578063dd62ed3e14610456578063e37f8a7e14610481578063eddaa3ab14610489578063fcd3533c1461049d57600080fd5b8063a9059cbb1461040c578063c04637111461041f578063c5ebeaec14610428578063caa6fea41461043b57600080fd5b806399a773cc116100e957806399a773cc146103d557806399ba3136146103de578063a1088459146103f1578063a2e620451461040457600080fd5b80637eb71131146103a95780638285ef40146103b157806394bf804d146103ba57806395d89b41146103cd57600080fd5b806335c7e9251161019d5780634bb700961161016c5780634bb70096146103395780635c975abb146103415780636bb6126e1461035357806370a08231146103765780637dc0d1d01461039657600080fd5b806335c7e925146102d6578063371fd8e6146102de57806338d52e0f146102f157806343528dda1461033057600080fd5b80632986c0e5116101d95780632986c0e51461027657806329ae81141461027f578063313ce56714610294578063352ade55146102cd57600080fd5b806306fdde031461020b578063095ea7b31461022957806318160ddd1461024c57806323b872dd14610263575b600080fd5b6102136104b0565b60405161022091906116f9565b60405180910390f35b61023c61023736600461175e565b61053e565b6040519015158152602001610220565b61025560045481565b604051908152602001610220565b61023c610271366004611788565b6105ab565b610255600d5481565b61029261028d3660046117c4565b61070a565b005b6102bb7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff9091168152602001610220565b610255600a5481565b61025561081b565b6102556102ec3660046117e6565b6108bc565b6103187f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc881565b6040516001600160a01b039091168152602001610220565b610255600b5481565b6102556109c9565b60005461023c90610100900460ff1681565b61023c6103613660046117ff565b60016020526000908152604090205460ff1681565b6102556103843660046117ff565b60056020526000908152604090205481565b600854610318906001600160a01b031681565b610255610a95565b610255600e5481565b6102926103c836600461181a565b610add565b610213610c47565b61025560095481565b6102926103ec3660046117e6565b610c54565b600754610318906001600160a01b031681565b610292610d50565b61023c61041a36600461175e565b610e2c565b610255600c5481565b6102556104363660046117e6565b610e40565b61029261100c565b61029261045136600461181a565b6111c5565b610255610464366004611846565b600660209081526000928352604080842090915290825290205481565b6102556112c1565b60085461023c90600160a01b900460ff1681565b6102926104ab36600461181a565b6112e6565b600280546104bd90611870565b80601f01602080910402602001604051908101604052809291908181526020018280546104e990611870565b80156105365780601f1061050b57610100808354040283529160200191610536565b820191906000526020600020905b81548152906001019060200180831161051957829003601f168201915b505050505081565b3360008181526006602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906105999086815260200190565b60405180910390a35060015b92915050565b6001600160a01b03831660009081526005602090815260408083205460068352818420338552909252822054838210156105f857604051631e9acf1760e31b815260040160405180910390fd5b6001600160a01b038616331480159061061357506000198114155b156106685783811015610639576040516313be252b60e01b815260040160405180910390fd5b61064384826118c0565b6001600160a01b03871660009081526006602090815260408083203384529091529020555b61067284836118c0565b6001600160a01b0380881660009081526005602052604080822093909355908716815220546106a29085906118d3565b6001600160a01b0380871660008181526005602052604090819020939093559151908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106f69088815260200190565b60405180910390a350600195945050505050565b3360009081526001602052604090205460ff16610739576040516282b42960e81b815260040160405180910390fd5b81651c185d5cd95960d21b0361075e576000805461ff00191660018314610100021790555b8168656d657267656e637960b81b0361078a576008805460ff60a01b191660018314600160a01b021790555b81683137b93937bba6b4b760b91b036107a35760098190555b81703634b8bab4b230ba34b7b72330b1ba37b960791b036107c457600a8190555b81680616d6f756e744361760bc1b036107dd57600b8190555b817f75b666bb5982c26146549f340e3f4c827469b18602d2bf483f21ed8a43f67e988260405161080f91815260200190565b60405180910390a25050565b60006108256112c1565b6040516370a0823160e01b81523060048201527f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc86001600160a01b0316906370a0823190602401602060405180830381865afa158015610889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ad91906118e6565b6108b791906118d3565b905090565b60008054610100900460ff16156108e6576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610915576040516282b42960e81b815260040160405180910390fd5b61091d610d50565b6000670de0b6b3a7640000600d548461093691906118ff565b6109409190611916565b905082600e600082825461095491906118c0565b9091555061098590507f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc833836114ce565b604080518281526020810185905233917f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d091015b60405180910390a290505b919050565b600080600c54426109da91906118c0565b905060006109e6610a95565b6007546040516373f7356b60e11b815260048101839052919250670de0b6b3a76400009184916001600160a01b03169063e7ee6ad690602401602060405180830381865afa158015610a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6091906118e6565b600d54610a6d91906118ff565b610a7791906118ff565b610a819190611916565b600d54610a8e91906118d3565b9250505090565b600080610aa061081b565b905080600003610ab257600091505090565b80610abb6112c1565b610acd90670de0b6b3a76400006118ff565b610ad79190611916565b91505090565b60005460ff1615610b015760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff191660011790819055610100900460ff1615610b36576040516313d0ff5960e31b815260040160405180910390fd5b610b3e610d50565b6000610b4861081b565b600b54909150610b5884836118d3565b1115610b7757604051636bf4c8e960e11b815260040160405180910390fd5b828115610b9e578160045485610b8d91906118ff565b610b979190611916565b9050610bbc565b610bab620f4240826118c0565b9050610bbc61dead620f4240611577565b610be77f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc833866114ce565b610bf18382611577565b60408051858152602081018390526001600160a01b0385169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350506000805460ff191690555050565b600380546104bd90611870565b600054610100900460ff1615610c7d576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610cac576040516282b42960e81b815260040160405180910390fd5b610cb4610d50565b6000600454610cc161081b565b610ccb90846118ff565b610cd59190611916565b9050610ce2600083611603565b610d0d7f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc833836116b7565b604080518281526020810184905260009133917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb56791015b60405180910390a35050565b6000600c5442610d6091906118c0565b90508015610e29576000610d72610a95565b6007546040516373f7356b60e11b815260048101839052919250670de0b6b3a76400009184916001600160a01b03169063e7ee6ad690602401602060405180830381865afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906118e6565b600d54610df991906118ff565b610e0391906118ff565b610e0d9190611916565b600d6000828254610e1e91906118d3565b909155505042600c55505b50565b6000610e393384846105ab565b9392505050565b60008054610100900460ff1615610e6a576040516313d0ff5960e31b815260040160405180910390fd5b3360009081526001602052604090205460ff16610e99576040516282b42960e81b815260040160405180910390fd5b610ea1610d50565b600954821015610ec457604051637139da2360e11b815260040160405180910390fd5b6040516370a0823160e01b815230600482015282907f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc86001600160a01b0316906370a0823190602401602060405180830381865afa158015610f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4e91906118e6565b1015610f6d57604051633ae100b760e11b815260040160405180910390fd5b600d54600090610f8584670de0b6b3a76400006118ff565b610f8f9190611916565b905080600e6000828254610fa391906118d3565b90915550610fd490507f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc833856116b7565b604080518481526020810183905233917fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af91016109b9565b60005460ff16156110305760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff19166001179055600854600160a01b900460ff1661106757604051633b1cf39760e21b815260040160405180910390fd5b3360009081526005602052604081205460045490919061108561081b565b61108f90846118ff565b6110999190611916565b6040516370a0823160e01b815230600482015290915081906001600160a01b037f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc816906370a0823190602401602060405180830381865afa158015611102573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112691906118e6565b101561114557604051633ae100b760e11b815260040160405180910390fd5b61114f3383611603565b61117a7f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc833836116b7565b6040805182815260208101849052339182917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567910160405180910390a350506000805460ff19169055565b3360009081526001602052604090205460ff166111f4576040516282b42960e81b815260040160405180910390fd5b81636578656360e01b0361122b576001600160a01b0381166000908152600160205260409020805460ff19811660ff909116151790555b81681c985d19535bd9195b60ba1b0361125a57600780546001600160a01b0319166001600160a01b0383161790555b81656f7261636c6560d01b0361128657600880546001600160a01b0319166001600160a01b0383161790555b6040516001600160a01b038216815282907f41a50316b758972a692a69178de3d99c3138a652f5213364ee8eff829f22048a9060200161080f565b6000670de0b6b3a7640000600d54600e546112dc91906118ff565b6108b79190611916565b60005460ff161561130a5760405163cbece43f60e01b815260040160405180910390fd5b6000805460ff191660011790819055610100900460ff161561133f576040516313d0ff5960e31b815260040160405180910390fd5b611347610d50565b600060045461135461081b565b61135e90856118ff565b6113689190611916565b3360009081526005602052604090205490915083111561139b57604051631e9acf1760e31b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281907f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc86001600160a01b0316906370a0823190602401602060405180830381865afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142591906118e6565b101561144457604051633ae100b760e11b815260040160405180910390fd5b61144e3384611603565b6114797f000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc883836116b7565b60408051828152602081018590526001600160a01b0384169133917ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567910160405180910390a350506000805460ff1916905550565b806000036114db57505050565b6040516323b872dd60e01b81526001600160a01b038381166004830152306024830152604482018390528416906323b872dd906064015b6020604051808303816000875af1158015611531573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115559190611938565b611572576040516312171d8360e31b815260040160405180910390fd5b505050565b6001600160a01b03821660009081526005602052604090205461159b9082906118d3565b6001600160a01b0383166000908152600560205260409020556004546115c29082906118d3565b6004556040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d44565b6001600160a01b0382166000908152600560205260409020548181101561163d57604051631e9acf1760e31b815260040160405180910390fd5b61164782826118c0565b6001600160a01b03841660009081526005602052604090205560045461166e9083906118c0565b6004556040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b806000036116c457505050565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401611512565b600060208083528351808285015260005b818110156117265785810183015185820160400152820161170a565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146109c457600080fd5b6000806040838503121561177157600080fd5b61177a83611747565b946020939093013593505050565b60008060006060848603121561179d57600080fd5b6117a684611747565b92506117b460208501611747565b9150604084013590509250925092565b600080604083850312156117d757600080fd5b50508035926020909101359150565b6000602082840312156117f857600080fd5b5035919050565b60006020828403121561181157600080fd5b610e3982611747565b6000806040838503121561182d57600080fd5b8235915061183d60208401611747565b90509250929050565b6000806040838503121561185957600080fd5b61186283611747565b915061183d60208401611747565b600181811c9082168061188457607f821691505b6020821081036118a457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105a5576105a56118aa565b808201808211156105a5576105a56118aa565b6000602082840312156118f857600080fd5b5051919050565b80820281158282048414176105a5576105a56118aa565b60008261193357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561194a57600080fd5b81518015158114610e3957600080fdfea264697066735822122074e2e8d1decb517cdd816b284b15b2fba5e87449d25862e707592e157db4a04464736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8000000000000000000000000627ea8812ef561d6ad9308d2a63e36901f51e3e500000000000000000000000050834f3163758fcc1df9973b6e91f0f0f0434ad300000000000000000000000000000000000000000000000000000000000f42400000000000000000000000000000000000000000000000000d2f13f7789f000000000000000000000000000000000000000000000000000000000002540be400

-----Decoded View---------------
Arg [0] : _asset (address): 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8
Arg [1] : _rateModel (address): 0x627ea8812ef561D6ad9308D2A63e36901f51E3E5
Arg [2] : _oracle (address): 0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3
Arg [3] : _borrowMin (uint256): 1000000
Arg [4] : _liquidationFactor (uint256): 950000000000000000
Arg [5] : _amountCap (uint256): 10000000000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8
Arg [1] : 000000000000000000000000627ea8812ef561d6ad9308d2a63e36901f51e3e5
Arg [2] : 00000000000000000000000050834f3163758fcc1df9973b6e91f0f0f0434ad3
Arg [3] : 00000000000000000000000000000000000000000000000000000000000f4240
Arg [4] : 0000000000000000000000000000000000000000000000000d2f13f7789f0000
Arg [5] : 00000000000000000000000000000000000000000000000000000002540be400


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.