ETH Price: $2,084.43 (-0.23%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Set Owner146847322024-05-19 22:46:51664 days ago1716158811IN
0x9a4b2F36...5dfd64E16
0 ETH0.000000630.02314963

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BorrowController

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.22;

contract BorrowController {

    uint constant MANTISSA = 1e18;
    address public owner;
    address public guardian;
    uint public dailyBorrowLimitUsd = 100000e18; // $100,000
    bool public forbidContracts = true;
    mapping(address => uint) public dailyBorrowLimitLastUpdate;
    mapping(address => uint) public lastDailyBorrowLimitRemainingUsd;
    mapping(address => bool) public isPoolBorrowPaused;
    mapping(address => bool) public isPoolBorrowSuspended;
    mapping(address => bool) public isContractAllowed;

    constructor() {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner, "onlyOwner");
        _;
    }

    modifier onlyGuardian {
        require(msg.sender == guardian, "onlyGuardian");
        _;
    }

    function setOwner(address _owner) external onlyOwner { owner = _owner; }
    function setGuardian(address _guardian) external onlyOwner { guardian = _guardian; }
    function setPoolBorrowPaused(address pool, bool paused) external onlyGuardian {
        require(!isPoolBorrowSuspended[pool], "borrowSuspended");
        isPoolBorrowPaused[pool] = paused;
    }
    function setForbidContracts(bool forbid) external onlyOwner { forbidContracts = forbid; }
    function setContractAllowed(address contractAddress, bool allowed) external onlyOwner { isContractAllowed[contractAddress] = allowed; }
    function setPoolBorrowSuspended(address pool, bool suspended) external onlyOwner {
        isPoolBorrowSuspended[pool] = suspended;
        if(suspended) isPoolBorrowPaused[pool] = true;
    }
    function setDailyBorrowLimitUsd(uint _dailyBorrowLimitUsd) public onlyOwner {
        dailyBorrowLimitUsd = _dailyBorrowLimitUsd;
    }

    function updateDailyBorrowLimit() internal {
        uint timeElapsed = block.timestamp - dailyBorrowLimitLastUpdate[msg.sender];
        if(timeElapsed == 0) return;
        // add daily limit capacity linearly based on time elapsed
        uint addedCapacity = timeElapsed * dailyBorrowLimitUsd / 1 days;
        uint newLimit = lastDailyBorrowLimitRemainingUsd[msg.sender] + addedCapacity;
        // cap the limit to the maximum daily limit
        if(newLimit > dailyBorrowLimitUsd) newLimit = dailyBorrowLimitUsd;
        lastDailyBorrowLimitRemainingUsd[msg.sender] = newLimit;
        dailyBorrowLimitLastUpdate[msg.sender] = block.timestamp;
    }

    function onBorrow(address pool, address borrower, uint amount, uint price) external {
        require(!isPoolBorrowPaused[pool], "borrowPaused");
        if(forbidContracts) {
            require(tx.origin == borrower || isContractAllowed[borrower], "contractNotAllowed");
        }
        updateDailyBorrowLimit();
        uint extraDebtUsd = amount * price / MANTISSA;
        lastDailyBorrowLimitRemainingUsd[msg.sender] -= extraDebtUsd;
    }

    function onRepay(address /*pool*/, address /*borrower*/, uint amount, uint price) external {
        updateDailyBorrowLimit();
        uint repaidDebtUsd = amount * price / MANTISSA;
        // free up the repaid debt capacity up to the daily limit
        if(lastDailyBorrowLimitRemainingUsd[msg.sender] + repaidDebtUsd > dailyBorrowLimitUsd) {
            lastDailyBorrowLimitRemainingUsd[msg.sender] = dailyBorrowLimitUsd;
        } else {
            lastDailyBorrowLimitRemainingUsd[msg.sender] += repaidDebtUsd;
        }
    }

}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyBorrowLimitLastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dailyBorrowLimitUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forbidContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isContractAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPoolBorrowPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPoolBorrowSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDailyBorrowLimitRemainingUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"onBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"onRepay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setContractAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dailyBorrowLimitUsd","type":"uint256"}],"name":"setDailyBorrowLimitUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"forbid","type":"bool"}],"name":"setForbidContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_guardian","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPoolBorrowPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"suspended","type":"bool"}],"name":"setPoolBorrowSuspended","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405269152d02c7e14af68000006002556003805460ff1916600117905534801561002b57600080fd5b50600080546001600160a01b031916331790556109b18061004d6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80637965d76b116100a25780639b166ae1116100715780639b166ae11461026f578063bde255b314610282578063d1547576146102a2578063d74a8511146102b5578063df69d3f1146102c857600080fd5b80637965d76b146102135780637eab92c7146102265780638a0dac4a146102495780638da5cb5b1461025c57600080fd5b806347cb5300116100e957806347cb53001461018a578063517d7735146101a757806351cf1a94146101ba57806360b5a6fb146101cd5780636f2ddb5f146101f057600080fd5b806313af40351461011b5780631a6c0bb414610130578063370b44eb14610143578063452a93201461015f575b600080fd5b61012e610129366004610802565b6102e8565b005b61012e61013e366004610824565b61033d565b61014c60025481565b6040519081526020015b60405180910390f35b600154610172906001600160a01b031681565b6040516001600160a01b039091168152602001610156565b6003546101979060ff1681565b6040519015158152602001610156565b61012e6101b5366004610876565b610467565b61012e6101c8366004610891565b6104a4565b6101976101db366004610802565b60066020526000908152604090205460ff1681565b6101976101fe366004610802565b60086020526000908152604090205460ff1681565b61012e610221366004610891565b610573565b610197610234366004610802565b60076020526000908152604090205460ff1681565b61012e610257366004610802565b6105c8565b600054610172906001600160a01b031681565b61012e61027d3660046108c4565b610614565b61014c610290366004610802565b60056020526000908152604090205481565b61012e6102b0366004610891565b610643565b61012e6102c3366004610824565b6106c2565b61014c6102d6366004610802565b60046020526000908152604090205481565b6000546001600160a01b0316331461031b5760405162461bcd60e51b8152600401610312906108dd565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03841660009081526006602052604090205460ff16156103955760405162461bcd60e51b815260206004820152600c60248201526b189bdc9c9bddd4185d5cd95960a21b6044820152606401610312565b60035460ff161561041057326001600160a01b03841614806103cf57506001600160a01b03831660009081526008602052604090205460ff165b6104105760405162461bcd60e51b815260206004820152601260248201527118dbdb9d1c9858dd139bdd105b1b1bddd95960721b6044820152606401610312565b61041861074f565b6000670de0b6b3a764000061042d8385610916565b6104379190610933565b3360009081526005602052604081208054929350839290919061045b908490610955565b90915550505050505050565b6000546001600160a01b031633146104915760405162461bcd60e51b8152600401610312906108dd565b6003805460ff1916911515919091179055565b6001546001600160a01b031633146104ed5760405162461bcd60e51b815260206004820152600c60248201526b37b7363ca3bab0b93234b0b760a11b6044820152606401610312565b6001600160a01b03821660009081526007602052604090205460ff16156105485760405162461bcd60e51b815260206004820152600f60248201526e189bdc9c9bddd4dd5cdc195b991959608a1b6044820152606401610312565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461059d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146105f25760405162461bcd60e51b8152600401610312906108dd565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461063e5760405162461bcd60e51b8152600401610312906108dd565b600255565b6000546001600160a01b0316331461066d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556106be576001600160a01b0382166000908152600660205260409020805460ff191660011790555b5050565b6106ca61074f565b6000670de0b6b3a76400006106df8385610916565b6106e99190610933565b600254336000908152600560205260409020549192509061070b908390610968565b11156107295760025433600090815260056020526040902055610748565b336000908152600560205260408120805483929061045b908490610968565b5050505050565b336000908152600460205260408120546107699042610955565b9050806000036107765750565b6000620151806002548361078a9190610916565b6107949190610933565b33600090815260056020526040812054919250906107b3908390610968565b90506002548111156107c457506002545b3360009081526005602090815260408083209390935560049052204290555050565b80356001600160a01b03811681146107fd57600080fd5b919050565b60006020828403121561081457600080fd5b61081d826107e6565b9392505050565b6000806000806080858703121561083a57600080fd5b610843856107e6565b9350610851602086016107e6565b93969395505050506040820135916060013590565b803580151581146107fd57600080fd5b60006020828403121561088857600080fd5b61081d82610866565b600080604083850312156108a457600080fd5b6108ad836107e6565b91506108bb60208401610866565b90509250929050565b6000602082840312156108d657600080fd5b5035919050565b60208082526009908201526837b7363ca7bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761092d5761092d610900565b92915050565b60008261095057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561092d5761092d610900565b8082018082111561092d5761092d61090056fea2646970667358221220a2fd09591606c1562310907b3fbf34ba2631ab8f34284b467fbcd0704877b77164736f6c63430008160033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c80637965d76b116100a25780639b166ae1116100715780639b166ae11461026f578063bde255b314610282578063d1547576146102a2578063d74a8511146102b5578063df69d3f1146102c857600080fd5b80637965d76b146102135780637eab92c7146102265780638a0dac4a146102495780638da5cb5b1461025c57600080fd5b806347cb5300116100e957806347cb53001461018a578063517d7735146101a757806351cf1a94146101ba57806360b5a6fb146101cd5780636f2ddb5f146101f057600080fd5b806313af40351461011b5780631a6c0bb414610130578063370b44eb14610143578063452a93201461015f575b600080fd5b61012e610129366004610802565b6102e8565b005b61012e61013e366004610824565b61033d565b61014c60025481565b6040519081526020015b60405180910390f35b600154610172906001600160a01b031681565b6040516001600160a01b039091168152602001610156565b6003546101979060ff1681565b6040519015158152602001610156565b61012e6101b5366004610876565b610467565b61012e6101c8366004610891565b6104a4565b6101976101db366004610802565b60066020526000908152604090205460ff1681565b6101976101fe366004610802565b60086020526000908152604090205460ff1681565b61012e610221366004610891565b610573565b610197610234366004610802565b60076020526000908152604090205460ff1681565b61012e610257366004610802565b6105c8565b600054610172906001600160a01b031681565b61012e61027d3660046108c4565b610614565b61014c610290366004610802565b60056020526000908152604090205481565b61012e6102b0366004610891565b610643565b61012e6102c3366004610824565b6106c2565b61014c6102d6366004610802565b60046020526000908152604090205481565b6000546001600160a01b0316331461031b5760405162461bcd60e51b8152600401610312906108dd565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03841660009081526006602052604090205460ff16156103955760405162461bcd60e51b815260206004820152600c60248201526b189bdc9c9bddd4185d5cd95960a21b6044820152606401610312565b60035460ff161561041057326001600160a01b03841614806103cf57506001600160a01b03831660009081526008602052604090205460ff165b6104105760405162461bcd60e51b815260206004820152601260248201527118dbdb9d1c9858dd139bdd105b1b1bddd95960721b6044820152606401610312565b61041861074f565b6000670de0b6b3a764000061042d8385610916565b6104379190610933565b3360009081526005602052604081208054929350839290919061045b908490610955565b90915550505050505050565b6000546001600160a01b031633146104915760405162461bcd60e51b8152600401610312906108dd565b6003805460ff1916911515919091179055565b6001546001600160a01b031633146104ed5760405162461bcd60e51b815260206004820152600c60248201526b37b7363ca3bab0b93234b0b760a11b6044820152606401610312565b6001600160a01b03821660009081526007602052604090205460ff16156105485760405162461bcd60e51b815260206004820152600f60248201526e189bdc9c9bddd4dd5cdc195b991959608a1b6044820152606401610312565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461059d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146105f25760405162461bcd60e51b8152600401610312906108dd565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461063e5760405162461bcd60e51b8152600401610312906108dd565b600255565b6000546001600160a01b0316331461066d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556106be576001600160a01b0382166000908152600660205260409020805460ff191660011790555b5050565b6106ca61074f565b6000670de0b6b3a76400006106df8385610916565b6106e99190610933565b600254336000908152600560205260409020549192509061070b908390610968565b11156107295760025433600090815260056020526040902055610748565b336000908152600560205260408120805483929061045b908490610968565b5050505050565b336000908152600460205260408120546107699042610955565b9050806000036107765750565b6000620151806002548361078a9190610916565b6107949190610933565b33600090815260056020526040812054919250906107b3908390610968565b90506002548111156107c457506002545b3360009081526005602090815260408083209390935560049052204290555050565b80356001600160a01b03811681146107fd57600080fd5b919050565b60006020828403121561081457600080fd5b61081d826107e6565b9392505050565b6000806000806080858703121561083a57600080fd5b610843856107e6565b9350610851602086016107e6565b93969395505050506040820135916060013590565b803580151581146107fd57600080fd5b60006020828403121561088857600080fd5b61081d82610866565b600080604083850312156108a457600080fd5b6108ad836107e6565b91506108bb60208401610866565b90509250929050565b6000602082840312156108d657600080fd5b5035919050565b60208082526009908201526837b7363ca7bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761092d5761092d610900565b92915050565b60008261095057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561092d5761092d610900565b8082018082111561092d5761092d61090056fea2646970667358221220a2fd09591606c1562310907b3fbf34ba2631ab8f34284b467fbcd0704877b77164736f6c63430008160033

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.