Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Owner | 14684732 | 664 days ago | IN | 0 ETH | 0.00000063 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BorrowController
Compiler Version
v0.8.22+commit.4fc1097e
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}
}
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
608060405269152d02c7e14af68000006002556003805460ff1916600117905534801561002b57600080fd5b50600080546001600160a01b031916331790556109b18061004d6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c80637965d76b116100a25780639b166ae1116100715780639b166ae11461026f578063bde255b314610282578063d1547576146102a2578063d74a8511146102b5578063df69d3f1146102c857600080fd5b80637965d76b146102135780637eab92c7146102265780638a0dac4a146102495780638da5cb5b1461025c57600080fd5b806347cb5300116100e957806347cb53001461018a578063517d7735146101a757806351cf1a94146101ba57806360b5a6fb146101cd5780636f2ddb5f146101f057600080fd5b806313af40351461011b5780631a6c0bb414610130578063370b44eb14610143578063452a93201461015f575b600080fd5b61012e610129366004610802565b6102e8565b005b61012e61013e366004610824565b61033d565b61014c60025481565b6040519081526020015b60405180910390f35b600154610172906001600160a01b031681565b6040516001600160a01b039091168152602001610156565b6003546101979060ff1681565b6040519015158152602001610156565b61012e6101b5366004610876565b610467565b61012e6101c8366004610891565b6104a4565b6101976101db366004610802565b60066020526000908152604090205460ff1681565b6101976101fe366004610802565b60086020526000908152604090205460ff1681565b61012e610221366004610891565b610573565b610197610234366004610802565b60076020526000908152604090205460ff1681565b61012e610257366004610802565b6105c8565b600054610172906001600160a01b031681565b61012e61027d3660046108c4565b610614565b61014c610290366004610802565b60056020526000908152604090205481565b61012e6102b0366004610891565b610643565b61012e6102c3366004610824565b6106c2565b61014c6102d6366004610802565b60046020526000908152604090205481565b6000546001600160a01b0316331461031b5760405162461bcd60e51b8152600401610312906108dd565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03841660009081526006602052604090205460ff16156103955760405162461bcd60e51b815260206004820152600c60248201526b189bdc9c9bddd4185d5cd95960a21b6044820152606401610312565b60035460ff161561041057326001600160a01b03841614806103cf57506001600160a01b03831660009081526008602052604090205460ff165b6104105760405162461bcd60e51b815260206004820152601260248201527118dbdb9d1c9858dd139bdd105b1b1bddd95960721b6044820152606401610312565b61041861074f565b6000670de0b6b3a764000061042d8385610916565b6104379190610933565b3360009081526005602052604081208054929350839290919061045b908490610955565b90915550505050505050565b6000546001600160a01b031633146104915760405162461bcd60e51b8152600401610312906108dd565b6003805460ff1916911515919091179055565b6001546001600160a01b031633146104ed5760405162461bcd60e51b815260206004820152600c60248201526b37b7363ca3bab0b93234b0b760a11b6044820152606401610312565b6001600160a01b03821660009081526007602052604090205460ff16156105485760405162461bcd60e51b815260206004820152600f60248201526e189bdc9c9bddd4dd5cdc195b991959608a1b6044820152606401610312565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461059d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146105f25760405162461bcd60e51b8152600401610312906108dd565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461063e5760405162461bcd60e51b8152600401610312906108dd565b600255565b6000546001600160a01b0316331461066d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556106be576001600160a01b0382166000908152600660205260409020805460ff191660011790555b5050565b6106ca61074f565b6000670de0b6b3a76400006106df8385610916565b6106e99190610933565b600254336000908152600560205260409020549192509061070b908390610968565b11156107295760025433600090815260056020526040902055610748565b336000908152600560205260408120805483929061045b908490610968565b5050505050565b336000908152600460205260408120546107699042610955565b9050806000036107765750565b6000620151806002548361078a9190610916565b6107949190610933565b33600090815260056020526040812054919250906107b3908390610968565b90506002548111156107c457506002545b3360009081526005602090815260408083209390935560049052204290555050565b80356001600160a01b03811681146107fd57600080fd5b919050565b60006020828403121561081457600080fd5b61081d826107e6565b9392505050565b6000806000806080858703121561083a57600080fd5b610843856107e6565b9350610851602086016107e6565b93969395505050506040820135916060013590565b803580151581146107fd57600080fd5b60006020828403121561088857600080fd5b61081d82610866565b600080604083850312156108a457600080fd5b6108ad836107e6565b91506108bb60208401610866565b90509250929050565b6000602082840312156108d657600080fd5b5035919050565b60208082526009908201526837b7363ca7bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761092d5761092d610900565b92915050565b60008261095057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561092d5761092d610900565b8082018082111561092d5761092d61090056fea2646970667358221220a2fd09591606c1562310907b3fbf34ba2631ab8f34284b467fbcd0704877b77164736f6c63430008160033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c80637965d76b116100a25780639b166ae1116100715780639b166ae11461026f578063bde255b314610282578063d1547576146102a2578063d74a8511146102b5578063df69d3f1146102c857600080fd5b80637965d76b146102135780637eab92c7146102265780638a0dac4a146102495780638da5cb5b1461025c57600080fd5b806347cb5300116100e957806347cb53001461018a578063517d7735146101a757806351cf1a94146101ba57806360b5a6fb146101cd5780636f2ddb5f146101f057600080fd5b806313af40351461011b5780631a6c0bb414610130578063370b44eb14610143578063452a93201461015f575b600080fd5b61012e610129366004610802565b6102e8565b005b61012e61013e366004610824565b61033d565b61014c60025481565b6040519081526020015b60405180910390f35b600154610172906001600160a01b031681565b6040516001600160a01b039091168152602001610156565b6003546101979060ff1681565b6040519015158152602001610156565b61012e6101b5366004610876565b610467565b61012e6101c8366004610891565b6104a4565b6101976101db366004610802565b60066020526000908152604090205460ff1681565b6101976101fe366004610802565b60086020526000908152604090205460ff1681565b61012e610221366004610891565b610573565b610197610234366004610802565b60076020526000908152604090205460ff1681565b61012e610257366004610802565b6105c8565b600054610172906001600160a01b031681565b61012e61027d3660046108c4565b610614565b61014c610290366004610802565b60056020526000908152604090205481565b61012e6102b0366004610891565b610643565b61012e6102c3366004610824565b6106c2565b61014c6102d6366004610802565b60046020526000908152604090205481565b6000546001600160a01b0316331461031b5760405162461bcd60e51b8152600401610312906108dd565b60405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03841660009081526006602052604090205460ff16156103955760405162461bcd60e51b815260206004820152600c60248201526b189bdc9c9bddd4185d5cd95960a21b6044820152606401610312565b60035460ff161561041057326001600160a01b03841614806103cf57506001600160a01b03831660009081526008602052604090205460ff165b6104105760405162461bcd60e51b815260206004820152601260248201527118dbdb9d1c9858dd139bdd105b1b1bddd95960721b6044820152606401610312565b61041861074f565b6000670de0b6b3a764000061042d8385610916565b6104379190610933565b3360009081526005602052604081208054929350839290919061045b908490610955565b90915550505050505050565b6000546001600160a01b031633146104915760405162461bcd60e51b8152600401610312906108dd565b6003805460ff1916911515919091179055565b6001546001600160a01b031633146104ed5760405162461bcd60e51b815260206004820152600c60248201526b37b7363ca3bab0b93234b0b760a11b6044820152606401610312565b6001600160a01b03821660009081526007602052604090205460ff16156105485760405162461bcd60e51b815260206004820152600f60248201526e189bdc9c9bddd4dd5cdc195b991959608a1b6044820152606401610312565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461059d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6000546001600160a01b031633146105f25760405162461bcd60e51b8152600401610312906108dd565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461063e5760405162461bcd60e51b8152600401610312906108dd565b600255565b6000546001600160a01b0316331461066d5760405162461bcd60e51b8152600401610312906108dd565b6001600160a01b0382166000908152600760205260409020805460ff191682158015919091179091556106be576001600160a01b0382166000908152600660205260409020805460ff191660011790555b5050565b6106ca61074f565b6000670de0b6b3a76400006106df8385610916565b6106e99190610933565b600254336000908152600560205260409020549192509061070b908390610968565b11156107295760025433600090815260056020526040902055610748565b336000908152600560205260408120805483929061045b908490610968565b5050505050565b336000908152600460205260408120546107699042610955565b9050806000036107765750565b6000620151806002548361078a9190610916565b6107949190610933565b33600090815260056020526040812054919250906107b3908390610968565b90506002548111156107c457506002545b3360009081526005602090815260408083209390935560049052204290555050565b80356001600160a01b03811681146107fd57600080fd5b919050565b60006020828403121561081457600080fd5b61081d826107e6565b9392505050565b6000806000806080858703121561083a57600080fd5b610843856107e6565b9350610851602086016107e6565b93969395505050506040820135916060013590565b803580151581146107fd57600080fd5b60006020828403121561088857600080fd5b61081d82610866565b600080604083850312156108a457600080fd5b6108ad836107e6565b91506108bb60208401610866565b90509250929050565b6000602082840312156108d657600080fd5b5035919050565b60208082526009908201526837b7363ca7bbb732b960b91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761092d5761092d610900565b92915050565b60008261095057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561092d5761092d610900565b8082018082111561092d5761092d61090056fea2646970667358221220a2fd09591606c1562310907b3fbf34ba2631ab8f34284b467fbcd0704877b77164736f6c63430008160033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.