Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BorrowController
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 10000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {DolaBorrowingRights} from "src/DBR.sol";
interface IChainlinkFeed {
function decimals() external view returns (uint8);
function latestRoundData() external view returns (uint80, int256, uint256, uint256, uint80);
}
interface IOracle {
function feeds(address token) external view returns(IChainlinkFeed, uint8);
}
interface IMarket {
function collateral() external view returns(address);
function oracle() external view returns(IOracle);
function debts(address) external view returns(uint);
}
/**
* @title Borrow Controller
* @notice Contract for limiting the contracts that are allowed to interact with markets
*/
contract BorrowController {
address public operator;
DolaBorrowingRights public immutable DBR;
mapping(address => uint) public minDebts;
mapping(address => bool) public contractAllowlist;
mapping(address => uint) public dailyLimits;
mapping(address => uint) public stalenessThreshold;
mapping(address => uint) public remainingDailyBorrowLimit;
mapping(address => uint) public lastDailyBorrowLimitUpdate;
constructor(address _operator, address _DBR) {
operator = _operator;
DBR = DolaBorrowingRights(_DBR);
}
modifier onlyOperator {
require(msg.sender == operator, "Only operator");
_;
}
event DenyContract(address);
event AllowContract(address);
/**
* @notice Sets the operator of the borrow controller. Only callable by the operator.
* @param _operator The address of the new operator.
*/
function setOperator(address _operator) public onlyOperator { operator = _operator; }
/**
* @notice Allows a contract to use the associated market.
* @param allowedContract The address of the allowed contract
*/
function allow(address allowedContract) public onlyOperator {
contractAllowlist[allowedContract] = true;
emit AllowContract(allowedContract);
}
/**
* @notice Denies a contract to use the associated market
* @param deniedContract The address of the denied contract
*/
function deny(address deniedContract) public onlyOperator {
contractAllowlist[deniedContract] = false;
emit DenyContract(deniedContract);
}
/**
* @notice Sets the daily borrow limit for a specific market
* @param market The address of the market contract
* @param limit The daily borrow limit amount
*/
function setDailyLimit(address market, uint limit) public onlyOperator { dailyLimits[market] = limit; }
/**
* @notice Sets the staleness threshold for Chainlink feeds
* @param newStalenessThreshold The new staleness threshold denominated in seconds
* @dev Only callable by operator
*/
function setStalenessThreshold(address market, uint newStalenessThreshold) public onlyOperator { stalenessThreshold[market] = newStalenessThreshold; }
/**
* @notice sets the market specific minimum amount a debt a borrower needs to take on.
* @param market The market to set the minimum debt for.
* @param newMinDebt The new minimum amount of debt.
* @dev This is to mitigate the creation of positions which are uneconomical to liquidate. Only callable by operator.
*/
function setMinDebt(address market, uint newMinDebt) public onlyOperator {minDebts[market] = newMinDebt; }
/**
* @notice Checks if a borrow is allowed
* @dev Currently the borrowController checks if contracts are part of an allow list and enforces a daily limit
* @param msgSender The message sender trying to borrow
* @param borrower The address being borrowed on behalf of
* @param amount The amount to be borrowed
* @return A boolean that is true if borrowing is allowed and false if not.
*/
function borrowAllowed(address msgSender, address borrower, uint amount) public returns (bool) {
uint availableBorrow = availableBorrowLimit(msg.sender);
if(availableBorrow < amount) return false;
unchecked{
remainingDailyBorrowLimit[msg.sender] = availableBorrow - amount;
lastDailyBorrowLimitUpdate[msg.sender] = block.timestamp;
}
uint lastUpdated = DBR.lastUpdated(borrower);
uint debts = DBR.debts(borrower);
//Check to prevent effects of edge case bug
if(lastUpdated > 0 && debts == 0 && lastUpdated != block.timestamp){
//Important check, otherwise a user could repeatedly mint themsevles DBR
require(DBR.markets(msg.sender), "Message sender is not a market");
uint deficit = (block.timestamp - lastUpdated) * amount / 365 days;
//If the contract is not a DBR minter, it should disallow borrowing for edgecase users
if(!DBR.minters(address(this))) return false;
//Mint user deficit caused by edge case bug
DBR.mint(borrower, deficit);
}
//If the debt is below the minimum debt threshold, deny borrow
if(isBelowMinDebt(msg.sender, borrower, amount)) return false;
//If the chainlink oracle price feed is stale, deny borrow
if(isPriceStale(msg.sender)) return false;
//If the message sender is not a contract, then there's no need check allowlist
if(msgSender == tx.origin) return true;
return contractAllowlist[msgSender];
}
/**
* @notice Reduces the daily limit used, when a user repays debt
* @dev This is necessary to prevent a DOS attack, where a user borrows the daily limit and immediately repays it again.
* @param amount Amount repaid in the market
*/
function onRepay(uint amount) public {
unchecked{
uint newLimit = availableBorrowLimit(msg.sender) + amount;
uint dailyLimit = dailyLimits[msg.sender];
remainingDailyBorrowLimit[msg.sender] = newLimit < dailyLimit ? newLimit : dailyLimit;
lastDailyBorrowLimitUpdate[msg.sender] = block.timestamp;
}
}
/**
* @notice Returns the available borrow limit of a market
* @param market The address of the market to return the available borrow limt
*/
function availableBorrowLimit(address market) public view returns(uint) {
uint timeElapsed = block.timestamp - lastDailyBorrowLimitUpdate[market];
uint dailyLimit = dailyLimits[market];
uint newLimit = remainingDailyBorrowLimit[market] + timeElapsed * dailyLimit / 1 days;
return newLimit < dailyLimit ? newLimit : dailyLimit;
}
/**
* @notice Returns the daily borrows.
* @dev Ensures backwards compability with interface of previous borrow controller
* @param market The market to get the dailyBorrows for.
*/
function dailyBorrows(address market, uint) external view returns(uint) {
return dailyLimits[market] - availableBorrowLimit(market);
}
/**
* @notice Checks if the price for the given market is stale.
* @param market The address of the market for which the price staleness is to be checked.
* @return bool Returns true if the price is stale, false otherwise.
*/
function isPriceStale(address market) public view returns(bool){
uint marketStalenessThreshold = stalenessThreshold[market];
if(marketStalenessThreshold == 0) return false;
IOracle oracle = IMarket(market).oracle();
(IChainlinkFeed feed,) = oracle.feeds(IMarket(market).collateral());
(,,,uint updatedAt,) = feed.latestRoundData();
return block.timestamp - updatedAt > marketStalenessThreshold;
}
/**
* @notice Checks if the borrower's debt in the given market is below the minimum debt after adding the specified amount.
* @param market The address of the market for which the borrower's debt is to be checked.
* @param borrower The address of the borrower whose debt is to be checked.
* @param amount The amount to be added to the borrower's current debt before checking against the minimum debt.
* @return bool Returns true if the borrower's debt after adding the amount is below the minimum debt, false otherwise.
*/
function isBelowMinDebt(address market, address borrower, uint amount) public view returns(bool){
uint minDebt = minDebts[market];
if(amount >= minDebt) return false;
return IMarket(market).debts(borrower) + amount < minDebt;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
/**
@title Dola Borrow Rights
@notice The DolaBorrowRights contract is a non-standard ERC20 token, that gives the right of holders to borrow DOLA at 0% interest.
As a borrower takes on DOLA debt, their DBR balance will be exhausted at 1 DBR per 1 DOLA borrowed per year.
*/
contract DolaBorrowingRights {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public _totalSupply;
address public operator;
address public pendingOperator;
uint public totalDueTokensAccrued;
uint public replenishmentPriceBps;
mapping(address => uint256) public balances;
mapping(address => mapping(address => uint256)) public allowance;
uint256 internal immutable INITIAL_CHAIN_ID;
bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
mapping(address => uint256) public nonces;
mapping (address => bool) public minters;
mapping (address => bool) public markets;
mapping (address => uint) public debts; // user => debt across all tracked markets
mapping (address => uint) public dueTokensAccrued; // user => amount of due tokens accrued
mapping (address => uint) public lastUpdated; // user => last update timestamp
constructor(
uint _replenishmentPriceBps,
string memory _name,
string memory _symbol,
address _operator
) {
replenishmentPriceBps = _replenishmentPriceBps;
name = _name;
symbol = _symbol;
operator = _operator;
INITIAL_CHAIN_ID = block.chainid;
INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
}
modifier onlyOperator {
require(msg.sender == operator, "ONLY OPERATOR");
_;
}
/**
@notice Sets pending operator of the contract. Operator role must be claimed by the new oprator. Only callable by Operator.
@param newOperator_ The address of the newOperator
*/
function setPendingOperator(address newOperator_) public onlyOperator {
pendingOperator = newOperator_;
}
/**
@notice Sets the replenishment price in basis points. Replenishment price denotes the increase in DOLA debt upon forced replenishments.
At 10000, the cost of replenishing 1 DBR is 1 DOLA in debt. Only callable by Operator.
@param newReplenishmentPriceBps_ The new replen
*/
function setReplenishmentPriceBps(uint newReplenishmentPriceBps_) public onlyOperator {
require(newReplenishmentPriceBps_ > 0, "replenishment price must be over 0");
require(newReplenishmentPriceBps_ <= 1_000_000, "Replenishment price cannot exceed 100 DOLA per DBR");
replenishmentPriceBps = newReplenishmentPriceBps_;
}
/**
@notice claims the Operator role if set as pending operator.
*/
function claimOperator() public {
require(msg.sender == pendingOperator, "ONLY PENDING OPERATOR");
operator = pendingOperator;
pendingOperator = address(0);
emit ChangeOperator(operator);
}
/**
@notice Add a minter to the set of addresses allowed to mint DBR tokens. Only callable by Operator.
@param minter_ The address of the new minter.
*/
function addMinter(address minter_) public onlyOperator {
minters[minter_] = true;
emit AddMinter(minter_);
}
/**
@notice Removes a minter from the set of addresses allowe to mint DBR tokens. Only callable by Operator.
@param minter_ The address to be removed from the minter set.
*/
function removeMinter(address minter_) public onlyOperator {
minters[minter_] = false;
emit RemoveMinter(minter_);
}
/**
@notice Adds a market to the set of active markets. Only callable by Operator.
@dev markets can be added but cannot be removed. A removed market would result in unrepayable debt for some users.
@param market_ The address of the new market contract to be added.
*/
function addMarket(address market_) public onlyOperator {
markets[market_] = true;
emit AddMarket(market_);
}
/**
@notice Get the total supply of DBR tokens.
@dev The total supply is calculated as the difference between total DBR minted and total DBR accrued.
@return uint representing the total supply of DBR.
*/
function totalSupply() public view returns (uint) {
if(totalDueTokensAccrued > _totalSupply) return 0;
return _totalSupply - totalDueTokensAccrued;
}
/**
@notice Get the DBR balance of an address. Will return 0 if the user has zero DBR or a deficit.
@dev The balance of a user is calculated as the difference between the user's balance and the user's accrued DBR debt + due DBR debt.
@param user Address of the user.
@return uint representing the balance of the user.
*/
function balanceOf(address user) public view returns (uint) {
uint debt = debts[user];
uint accrued = (block.timestamp - lastUpdated[user]) * debt / 365 days;
if(dueTokensAccrued[user] + accrued > balances[user]) return 0;
return balances[user] - dueTokensAccrued[user] - accrued;
}
/**
@notice Get the DBR deficit of an address. Will return 0 if th user has zero DBR or more.
@dev The deficit of a user is calculated as the difference between the user's accrued DBR deb + due DBR debt and their balance.
@param user Address of the user.
@return uint representing the deficit of the user.
*/
function deficitOf(address user) public view returns (uint) {
uint debt = debts[user];
uint accrued = (block.timestamp - lastUpdated[user]) * debt / 365 days;
if(dueTokensAccrued[user] + accrued < balances[user]) return 0;
return dueTokensAccrued[user] + accrued - balances[user];
}
/**
@notice Get the signed DBR balance of an address.
@dev This function will revert if a user has a balance of more than 2^255-1 DBR
@param user Address of the user.
@return Returns a signed int of the user's balance
*/
function signedBalanceOf(address user) public view returns (int) {
uint debt = debts[user];
uint accrued = (block.timestamp - lastUpdated[user]) * debt / 365 days;
return int(balances[user]) - int(dueTokensAccrued[user]) - int(accrued);
}
/**
@notice Approves spender to spend amount of DBR on behalf of the message sender.
@param spender Address of the spender to be approved
@param amount Amount to be approved to spend
@return Always returns true, will revert if not successful.
*/
function approve(address spender, uint256 amount) public virtual returns (bool) {
allowance[msg.sender][spender] = amount;
emit Approval(msg.sender, spender, amount);
return true;
}
/**
@notice Transfers amount to address to from message sender.
@param to The address to transfer to
@param amount The amount of DBR to transfer
@return Always returns true, will revert if not successful.
*/
function transfer(address to, uint256 amount) public virtual returns (bool) {
require(balanceOf(msg.sender) >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
unchecked {
balances[to] += amount;
}
emit Transfer(msg.sender, to, amount);
return true;
}
/**
@notice Transfer amount of DBR on behalf of address from to address to. Message sender must have a sufficient allowance from the from address.
@dev Allowance is reduced by the amount transferred.
@param from Address to transfer from.
@param to Address to transfer to.
@param amount Amount of DBR to transfer.
@return Always returns true, will revert if not successful.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
require(balanceOf(from) >= amount, "Insufficient balance");
balances[from] -= amount;
unchecked {
balances[to] += amount;
}
emit Transfer(from, to, amount);
return true;
}
/**
@notice Permits an address to spend on behalf of another address via a signed message.
@dev Can be bundled with a transferFrom call, to reduce transaction load on users.
@param owner Address of the owner permitting the spending
@param spender Address allowed to spend on behalf of owner.
@param value Amount to be allowed to spend.
@param deadline Timestamp after which the signed message is no longer valid.
@param v The v param of the ECDSA signature
@param r The r param of the ECDSA signature
@param s The s param of the ECDSA signature
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual {
require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");
unchecked {
address recoveredAddress = ecrecover(
keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR(),
keccak256(
abi.encode(
keccak256(
"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
),
owner,
spender,
value,
nonces[owner]++,
deadline
)
)
)
),
v,
r,
s
);
require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");
allowance[recoveredAddress][spender] = value;
}
emit Approval(owner, spender, value);
}
/**
@notice Function for invalidating the nonce of a signed message.
*/
function invalidateNonce() public {
nonces[msg.sender]++;
}
function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
}
function computeDomainSeparator() internal view virtual returns (bytes32) {
return
keccak256(
abi.encode(
keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
keccak256(bytes(name)),
keccak256("1"),
block.chainid,
address(this)
)
);
}
/**
@notice Accrue due DBR debt of user
@dev DBR debt is accrued at a rate of 1 DBR per 1 DOLA of debt per year.
@param user The address of the user to accrue DBR debt to.
*/
function accrueDueTokens(address user) public {
uint debt = debts[user];
if(lastUpdated[user] == block.timestamp) return;
uint accrued = (block.timestamp - lastUpdated[user]) * debt / 365 days;
if(accrued > 0 || lastUpdated[user] == 0){
dueTokensAccrued[user] += accrued;
totalDueTokensAccrued += accrued;
lastUpdated[user] = block.timestamp;
emit Transfer(user, address(0), accrued);
}
}
/**
@notice Function to be called by markets when a borrow occurs.
@dev Accrues due tokens on behalf of the user, before increasing their debt.
@param user The address of the borrower
@param additionalDebt The additional amount of DOLA the user is borrowing
*/
function onBorrow(address user, uint additionalDebt) public {
require(markets[msg.sender], "Only markets can call onBorrow");
accrueDueTokens(user);
require(deficitOf(user) == 0, "DBR Deficit");
debts[user] += additionalDebt;
}
/**
@notice Function to be called by markets when a repayment occurs.
@dev Accrues due tokens on behalf of the user, before reducing their debt.
@param user The address of the borrower having their debt repaid
@param repaidDebt The amount of DOLA repaid
*/
function onRepay(address user, uint repaidDebt) public {
require(markets[msg.sender], "Only markets can call onRepay");
accrueDueTokens(user);
debts[user] -= repaidDebt;
}
/**
@notice Function to be called by markets when a force replenish occurs. This function can only be called if the user has a DBR deficit.
@dev Accrues due tokens on behalf of the user, before increasing their debt by the replenishment price and minting them new DBR.
@param user The user to be force replenished.
@param amount The amount of DBR the user will be force replenished.
*/
function onForceReplenish(address user, address replenisher, uint amount, uint replenisherReward) public {
require(markets[msg.sender], "Only markets can call onForceReplenish");
uint deficit = deficitOf(user);
require(deficit > 0, "No deficit");
require(deficit >= amount, "Amount > deficit");
uint replenishmentCost = amount * replenishmentPriceBps / 10000;
accrueDueTokens(user);
debts[user] += replenishmentCost;
_mint(user, amount);
emit ForceReplenish(user, replenisher, msg.sender, amount, replenishmentCost, replenisherReward);
}
/**
@notice Function for burning DBR from message sender, reducing supply.
@param amount Amount to be burned
*/
function burn(uint amount) public {
_burn(msg.sender, amount);
}
/**
@notice Function for minting new DBR, increasing supply. Only callable by minters and the operator.
@param to Address to mint DBR to.
@param amount Amount of DBR to mint.
*/
function mint(address to, uint amount) public {
require(minters[msg.sender] == true || msg.sender == operator, "ONLY MINTERS OR OPERATOR");
_mint(to, amount);
}
/**
@notice Internal function for minting DBR.
@param to Address to mint DBR to.
@param amount Amount of DBR to mint.
*/
function _mint(address to, uint256 amount) internal virtual {
_totalSupply += amount;
unchecked {
balances[to] += amount;
}
emit Transfer(address(0), to, amount);
}
/**
@notice Internal function for burning DBR.
@param from Address to burn DBR from.
@param amount Amount of DBR to be burned.
*/
function _burn(address from, uint256 amount) internal virtual {
require(balanceOf(from) >= amount, "Insufficient balance");
balances[from] -= amount;
unchecked {
_totalSupply -= amount;
}
emit Transfer(from, address(0), amount);
}
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
event AddMinter(address indexed minter);
event RemoveMinter(address indexed minter);
event AddMarket(address indexed market);
event ChangeOperator(address indexed newOperator);
event ForceReplenish(address indexed account, address indexed replenisher, address indexed market, uint deficit, uint replenishmentCost, uint replenisherReward);
}{
"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/",
"solmate/=lib/solmate/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/"
],
"optimizer": {
"enabled": true,
"runs": 10000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_DBR","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"AllowContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"DenyContract","type":"event"},{"inputs":[],"name":"DBR","outputs":[{"internalType":"contract DolaBorrowingRights","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"allowedContract","type":"address"}],"name":"allow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"availableBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrowAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"dailyBorrows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyLimits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deniedContract","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isBelowMinDebt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"}],"name":"isPriceStale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDailyBorrowLimitUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minDebts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onRepay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"remainingDailyBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"newMinDebt","type":"uint256"}],"name":"setMinDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"newStalenessThreshold","type":"uint256"}],"name":"setStalenessThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stalenessThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a060405234801561000f575f80fd5b5060405161151938038061151983398101604081905261002e9161006d565b5f80546001600160a01b0319166001600160a01b039384161790551660805261009e565b80516001600160a01b0381168114610068575f80fd5b919050565b5f806040838503121561007e575f80fd5b61008783610052565b915061009560208401610052565b90509250929050565b6080516114406100d95f395f818161023401528181610b7101528181610c2401528181610cdb01528181610e150152610eef01526114405ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063907fa146116100c7578063d7bffc921161007d578063ec656f2c11610063578063ec656f2c14610353578063f232fe9e14610366578063ff9913e814610385575f80fd5b8063d7bffc9214610321578063da3d454c14610340575f80fd5b8063aa81a2b5116100ad578063aa81a2b5146102d9578063b3ab15fb146102fb578063caf11af81461030e575f80fd5b8063907fa146146102a75780639c52a7f1146102c6575f80fd5b8063570ca7351161011c5780637026edad116101025780637026edad146102565780637b18ffc4146102755780638c43111514610294575f80fd5b8063570ca735146101eb5780636d1247151461022f575f80fd5b8063268951e61161014c578063268951e6146101a45780632803212f146101c5578063292ff969146101d8575f80fd5b8063081e66411461016757806317fdb62f1461017c575b5f80fd5b61017a6101753660046111b2565b610398565b005b61018f61018a3660046111ed565b6103e7565b60405190151581526020015b60405180910390f35b6101b76101b2366004611208565b61062e565b60405190815260200161019b565b61017a6101d3366004611208565b610670565b6101b76101e63660046111ed565b61071d565b5f5461020a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b61020a7f000000000000000000000000000000000000000000000000000000000000000081565b6101b76102643660046111ed565b60016020525f908152604090205481565b6101b76102833660046111ed565b60066020525f908152604090205481565b61017a6102a2366004611208565b6107d7565b6101b76102b53660046111ed565b60046020525f908152604090205481565b61017a6102d43660046111ed565b61087f565b61018f6102e73660046111ed565b60026020525f908152604090205460ff1681565b61017a6103093660046111ed565b610981565b61017a61031c366004611208565b610a47565b6101b761032f3660046111ed565b60036020525f908152604090205481565b61018f61034e366004611232565b610aef565b61018f610361366004611232565b610fd9565b6101b76103743660046111ed565b60056020525f908152604090205481565b61017a6103933660046111ed565b6110b4565b5f816103a33361071d565b335f90815260036020526040902054910191508082106103c357806103c5565b815b335f908152600560209081526040808320939093556006905220429055505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526004602052604081205480820361041b57505f92915050565b5f8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190611270565b90505f8173ffffffffffffffffffffffffffffffffffffffff16632fba4aa98673ffffffffffffffffffffffffffffffffffffffff1663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105159190611270565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa15801561057b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059f919061128b565b5090505f8173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156105ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061091906112e6565b509350505050838142610623919061135f565b119695505050505050565b5f6106388361071d565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020526040902054610667919061135f565b90505b92915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260036020526040902055565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260066020526040812054819061074e904261135f565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020526040812054919250620151806107848385611372565b61078e9190611389565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600560205260409020546107bd91906113c1565b90508181106107cc57816107ce565b805b95945050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260046020526040902055565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f2b35b0a030b4f4cef0a9e8d01828235bb82a11ec4e37c11bd6d8770d9aafb17c91015b60405180910390a150565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260016020526040902055565b5f80610afa3361071d565b905082811015610b0d575f915050610fd2565b335f90815260056020908152604080832086850390556006909152808220429055517f0a6f93e600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f00000000000000000000000000000000000000000000000000000000000000001690630a6f93e690602401602060405180830381865afa158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda91906113d4565b6040517f2ecd4e7d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f917f00000000000000000000000000000000000000000000000000000000000000001690632ecd4e7d90602401602060405180830381865afa158015610c69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8d91906113d4565b90505f82118015610c9c575080155b8015610ca85750428214155b15610f48576040517f8e8f294b0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690638e8f294b90602401602060405180830381865afa158015610d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5991906113eb565b610dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d6573736167652073656e646572206973206e6f742061206d61726b6574000060448201526064016106ec565b5f6301e1338086610dd0854261135f565b610dda9190611372565b610de49190611389565b6040517ff46eccc40000000000000000000000000000000000000000000000000000000081523060048201529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063f46eccc490602401602060405180830381865afa158015610e6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9391906113eb565b610ea3575f945050505050610fd2565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015f604051808303815f87803b158015610f30575f80fd5b505af1158015610f42573d5f803e3d5ffd5b50505050505b610f53338787610fd9565b15610f63575f9350505050610fd2565b610f6c336103e7565b15610f7c575f9350505050610fd2565b3273ffffffffffffffffffffffffffffffffffffffff881603610fa55760019350505050610fd2565b5050505073ffffffffffffffffffffffffffffffffffffffff83165f9081526002602052604090205460ff165b9392505050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604081205480831061100e575f915050610fd2565b6040517f2ecd4e7d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015282918591881690632ecd4e7d90602401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a091906113d4565b6110aa91906113c1565b1095945050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f41381bb4d1ccb35b9067dddf46e4efd3b8e40877892d5729463eb224511585fe9101610976565b5f602082840312156111c2575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ea575f80fd5b50565b5f602082840312156111fd575f80fd5b8135610fd2816111c9565b5f8060408385031215611219575f80fd5b8235611224816111c9565b946020939093013593505050565b5f805f60608486031215611244575f80fd5b833561124f816111c9565b9250602084013561125f816111c9565b929592945050506040919091013590565b5f60208284031215611280575f80fd5b8151610fd2816111c9565b5f806040838503121561129c575f80fd5b82516112a7816111c9565b602084015190925060ff811681146112bd575f80fd5b809150509250929050565b805169ffffffffffffffffffff811681146112e1575f80fd5b919050565b5f805f805f60a086880312156112fa575f80fd5b611303866112c8565b9450602086015193506040860151925060608601519150611326608087016112c8565b90509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561066a5761066a611332565b808202811582820484141761066a5761066a611332565b5f826113bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8082018082111561066a5761066a611332565b5f602082840312156113e4575f80fd5b5051919050565b5f602082840312156113fb575f80fd5b81518015158114610fd2575f80fdfea2646970667358221220c731c55c83947dccac0d1f3a51204c1889e83ba14e626dcaf9e3bb5eed9d2e8f64736f6c63430008140033000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063907fa146116100c7578063d7bffc921161007d578063ec656f2c11610063578063ec656f2c14610353578063f232fe9e14610366578063ff9913e814610385575f80fd5b8063d7bffc9214610321578063da3d454c14610340575f80fd5b8063aa81a2b5116100ad578063aa81a2b5146102d9578063b3ab15fb146102fb578063caf11af81461030e575f80fd5b8063907fa146146102a75780639c52a7f1146102c6575f80fd5b8063570ca7351161011c5780637026edad116101025780637026edad146102565780637b18ffc4146102755780638c43111514610294575f80fd5b8063570ca735146101eb5780636d1247151461022f575f80fd5b8063268951e61161014c578063268951e6146101a45780632803212f146101c5578063292ff969146101d8575f80fd5b8063081e66411461016757806317fdb62f1461017c575b5f80fd5b61017a6101753660046111b2565b610398565b005b61018f61018a3660046111ed565b6103e7565b60405190151581526020015b60405180910390f35b6101b76101b2366004611208565b61062e565b60405190815260200161019b565b61017a6101d3366004611208565b610670565b6101b76101e63660046111ed565b61071d565b5f5461020a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019b565b61020a7f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71081565b6101b76102643660046111ed565b60016020525f908152604090205481565b6101b76102833660046111ed565b60066020525f908152604090205481565b61017a6102a2366004611208565b6107d7565b6101b76102b53660046111ed565b60046020525f908152604090205481565b61017a6102d43660046111ed565b61087f565b61018f6102e73660046111ed565b60026020525f908152604090205460ff1681565b61017a6103093660046111ed565b610981565b61017a61031c366004611208565b610a47565b6101b761032f3660046111ed565b60036020525f908152604090205481565b61018f61034e366004611232565b610aef565b61018f610361366004611232565b610fd9565b6101b76103743660046111ed565b60056020525f908152604090205481565b61017a6103933660046111ed565b6110b4565b5f816103a33361071d565b335f90815260036020526040902054910191508082106103c357806103c5565b815b335f908152600560209081526040808320939093556006905220429055505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526004602052604081205480820361041b57505f92915050565b5f8373ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190611270565b90505f8173ffffffffffffffffffffffffffffffffffffffff16632fba4aa98673ffffffffffffffffffffffffffffffffffffffff1663d8dfeb456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105159190611270565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016040805180830381865afa15801561057b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059f919061128b565b5090505f8173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156105ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061091906112e6565b509350505050838142610623919061135f565b119695505050505050565b5f6106388361071d565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020526040902054610667919061135f565b90505b92915050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146106f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260036020526040902055565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260066020526040812054819061074e904261135f565b73ffffffffffffffffffffffffffffffffffffffff84165f90815260036020526040812054919250620151806107848385611372565b61078e9190611389565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600560205260409020546107bd91906113c1565b90508181106107cc57816107ce565b805b95945050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610857576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260046020526040902055565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f2b35b0a030b4f4cef0a9e8d01828235bb82a11ec4e37c11bd6d8770d9aafb17c91015b60405180910390a150565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610a01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b5f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610ac7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff9091165f90815260016020526040902055565b5f80610afa3361071d565b905082811015610b0d575f915050610fd2565b335f90815260056020908152604080832086850390556006909152808220429055517f0a6f93e600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301527f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d7101690630a6f93e690602401602060405180830381865afa158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda91906113d4565b6040517f2ecd4e7d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301529192505f917f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d7101690632ecd4e7d90602401602060405180830381865afa158015610c69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8d91906113d4565b90505f82118015610c9c575080155b8015610ca85750428214155b15610f48576040517f8e8f294b0000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71073ffffffffffffffffffffffffffffffffffffffff1690638e8f294b90602401602060405180830381865afa158015610d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5991906113eb565b610dbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d6573736167652073656e646572206973206e6f742061206d61726b6574000060448201526064016106ec565b5f6301e1338086610dd0854261135f565b610dda9190611372565b610de49190611389565b6040517ff46eccc40000000000000000000000000000000000000000000000000000000081523060048201529091507f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71073ffffffffffffffffffffffffffffffffffffffff169063f46eccc490602401602060405180830381865afa158015610e6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9391906113eb565b610ea3575f945050505050610fd2565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018390527f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71016906340c10f19906044015f604051808303815f87803b158015610f30575f80fd5b505af1158015610f42573d5f803e3d5ffd5b50505050505b610f53338787610fd9565b15610f63575f9350505050610fd2565b610f6c336103e7565b15610f7c575f9350505050610fd2565b3273ffffffffffffffffffffffffffffffffffffffff881603610fa55760019350505050610fd2565b5050505073ffffffffffffffffffffffffffffffffffffffff83165f9081526002602052604090205460ff165b9392505050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526001602052604081205480831061100e575f915050610fd2565b6040517f2ecd4e7d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015282918591881690632ecd4e7d90602401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a091906113d4565b6110aa91906113c1565b1095945050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f6e6c79206f70657261746f720000000000000000000000000000000000000060448201526064016106ec565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f41381bb4d1ccb35b9067dddf46e4efd3b8e40877892d5729463eb224511585fe9101610976565b5f602082840312156111c2575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff811681146111ea575f80fd5b50565b5f602082840312156111fd575f80fd5b8135610fd2816111c9565b5f8060408385031215611219575f80fd5b8235611224816111c9565b946020939093013593505050565b5f805f60608486031215611244575f80fd5b833561124f816111c9565b9250602084013561125f816111c9565b929592945050506040919091013590565b5f60208284031215611280575f80fd5b8151610fd2816111c9565b5f806040838503121561129c575f80fd5b82516112a7816111c9565b602084015190925060ff811681146112bd575f80fd5b809150509250929050565b805169ffffffffffffffffffff811681146112e1575f80fd5b919050565b5f805f805f60a086880312156112fa575f80fd5b611303866112c8565b9450602086015193506040860151925060608601519150611326608087016112c8565b90509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561066a5761066a611332565b808202811582820484141761066a5761066a611332565b5f826113bc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8082018082111561066a5761066a611332565b5f602082840312156113e4575f80fd5b5051919050565b5f602082840312156113fb575f80fd5b81518015158114610fd2575f80fdfea2646970667358221220c731c55c83947dccac0d1f3a51204c1889e83ba14e626dcaf9e3bb5eed9d2e8f64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710
-----Decoded View---------------
Arg [0] : _operator (address): 0x926dF14a23BE491164dCF93f4c468A50ef659D5B
Arg [1] : _DBR (address): 0xAD038Eb671c44b853887A7E32528FaB35dC5D710
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b
Arg [1] : 000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710
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
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.