Contract
0x111111111111ed1D73f860F57b2798b683f2d325
11
Contract Overview
[ Download CSV Export ]
Contract Name:
YUSDToken
Compiler Version
v0.6.11+commit.5ef660b1
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.11; import "../Interfaces/IYUSDToken.sol"; import "../Dependencies/SafeMath.sol"; // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& ,.@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@&&&.,, ,,**.&&&&&@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@, ..,,,,,,,,,&@@@@@@@@@@ // @@@@@@,,,,,,&@@@@@@@@& ,,,,,&@@@@@@@@@ // @@@&,,,,,,,,@@@@@@@@@ ,,,,,*@@@/@@@@@ // @@,*,*,*,*#,,*,&@@@@@ $$ $$ *,,, ***&@@@@@ // @&***********(@@@@@@& $$ $$ ,,,%&. & %@@@@@ // @(*****&** &@@@@# *,,% ,#%@*&@@@ // @... & & **,,*&,(@*,*,&@ // @&,,. & *,* **,,@ // @@@,,,. * ** ,*,, // @@@@@,,,... .,,,,& .,% *,* // @@@@@@@&/,,,,,,,,,,,,&,,,,,. .,,,,,,,,. *, // @@@@@@@@@@@@&&@(,,,,,(@&&@@&&&&&%&&&&&%%%&,,,& .( // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,,,,,,,,,,,,,,& & // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/,,,,,,,,,,,,& & // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/ & & // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& & & // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@& ,,,@@@& & && .&( &#% // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&&&&&%#**@@@&*&*******,,,,,** // // $$\ $$\ $$\ $$\ $$$$$$$$\ $$\ // \$$\ $$ | $$ | \__| $$ _____|\__| // \$$\ $$ /$$$$$$\ $$$$$$\ $$\ $$ | $$\ $$$$$$$\ $$$$$$\ $$$$$$$\ $$$$$$$\ $$$$$$\ // \$$$$ /$$ __$$\\_$$ _| $$ | $$$$$\ $$ |$$ __$$\ \____$$\ $$ __$$\ $$ _____|$$ __$$\ // \$$ / $$$$$$$$ | $$ | $$ | $$ __| $$ |$$ | $$ | $$$$$$$ |$$ | $$ |$$ / $$$$$$$$ | // $$ | $$ ____| $$ |$$\ $$ | $$ | $$ |$$ | $$ |$$ __$$ |$$ | $$ |$$ | $$ ____| // $$ | \$$$$$$$\ \$$$$ |$$ | $$ | $$ |$$ | $$ |\$$$$$$$ |$$ | $$ |\$$$$$$$\ \$$$$$$$\ // \__| \_______| \____/ \__| \__| \__|\__| \__| \_______|\__| \__| \_______| \_______| /* * * Based upon OpenZeppelin's ERC20 contract: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol * * and their EIP2612 (ERC20Permit / ERC712) functionality: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/53516bc555a454862470e7860a9b5254db4d00f5/contracts/token/ERC20/ERC20Permit.sol * * * --- Functionality added specific to the YUSDToken --- * * 1) Transfer protection: blacklist of addresses that are invalid recipients (i.e. core Yeti contracts) in external * transfer() and transferFrom() calls. The purpose is to protect users from losing tokens by mistakenly sending YUSD directly to a Yeti * core contract, when they should rather call the right function. * * 2) sendToPool() and returnFromPool(): functions callable only Yeti core contracts, which move YUSD tokens between Yeti <-> user. */ contract YUSDToken is IYUSDToken { using SafeMath for uint256; uint256 private _totalSupply; string internal constant _NAME = "YUSD Stablecoin"; string internal constant _SYMBOL = "YUSD"; string internal constant _VERSION = "1"; uint8 internal constant _DECIMALS = 18; bool canMint = true; // --- Data for EIP2612 --- // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); bytes32 private constant _TYPE_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f; // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; mapping(address => uint256) private _nonces; // User data for YUSD token mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; // --- Addresses --- address internal immutable troveManagerAddress; address internal immutable troveManagerLiquidationsAddress; address internal immutable troveManagerRedemptionsAddress; address internal immutable stabilityPoolAddress; address internal immutable borrowerOperationsAddress; address internal immutable controllerAddress; mapping(address => bool) validMinters; modifier onlyController() { require(msg.sender == controllerAddress, "YUSDToken: Caller is not YetiController"); _; } constructor( address _troveManagerAddress, address _troveManagerLiquidationsAddress, address _troveManagerRedemptionsAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress, address _controllerAddress ) public { troveManagerAddress = _troveManagerAddress; troveManagerLiquidationsAddress = _troveManagerLiquidationsAddress; troveManagerRedemptionsAddress = _troveManagerRedemptionsAddress; stabilityPoolAddress = _stabilityPoolAddress; borrowerOperationsAddress = _borrowerOperationsAddress; controllerAddress = _controllerAddress; validMinters[_borrowerOperationsAddress] = true; bytes32 hashedName = keccak256(bytes(_NAME)); bytes32 hashedVersion = keccak256(bytes(_VERSION)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = _chainID(); _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, hashedName, hashedVersion); } // --- Functions for intra-Yeti calls --- function mint(address _account, uint256 _amount) external override { _requireCanMint(); _requireValidMinter(); _mint(_account, _amount); } function burn(address _account, uint256 _amount) external override { _requireCallerIsBOorTroveMorSP(); _burn(_account, _amount); } /** * Function special to Yeti which sends YUSD directly to SP without approve */ function sendToPool( address _sender, address _poolAddress, uint256 _amount ) external override { _requireCallerIsStabilityPool(); _transfer(_sender, _poolAddress, _amount); } /** * Function special to Yeti which sends YUSD directly from pool back to a user */ function returnFromPool( address _poolAddress, address _receiver, uint256 _amount ) external override { _requireCallerIsTMLorSP(); _transfer(_poolAddress, _receiver, _amount); } // --- External functions --- function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) external override returns (bool) { _requireValidRecipient(recipient); _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) external view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) external override returns (bool) { _requireValidRecipient(recipient); _transfer(sender, recipient, amount); _approve( sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance") ); return true; } function increaseAllowance(address spender, uint256 addedValue) external override returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external override returns (bool) { _approve( msg.sender, spender, _allowances[msg.sender][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } // --- EIP 2612 Functionality --- function domainSeparator() public view override returns (bytes32) { if (_chainID() == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external override { require(deadline >= block.timestamp, "YUSD: expired deadline"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator(), keccak256( abi.encode(_PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner]++, deadline) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress == owner, "YUSD: invalid signature"); _approve(owner, spender, amount); } function nonces(address owner) external view override returns (uint256) { // FOR EIP 2612 return _nonces[owner]; } // --- Internal operations --- function _chainID() private pure returns (uint256 chainID) { assembly { chainID := chainid() } } function _buildDomainSeparator( bytes32 typeHash, bytes32 name, bytes32 version ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, name, version, _chainID(), address(this))); } // --- Internal operations --- // Warning: sanity checks (for sender and recipient) should have been done before calling these internal functions function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), "_transfer: sender is address(0)"); require(recipient != address(0), "_transfer: recipient is 0address"); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount > balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal { require(account != address(0), "_mint: account is address(0)"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account] + amount; emit Transfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal { require(account != address(0), "_burn: account is address(0)"); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount > balance"); _totalSupply = _totalSupply - amount; // can't underflow since indiv balance didn't emit Transfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal { require(owner != address(0), "_approve: owner is address(0)"); require(spender != address(0), "_approve: spender is address(0)"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function addValidMinter(address _newMinter) external override onlyController { validMinters[_newMinter] = true; } function removeValidMinter(address _minter) external override onlyController { validMinters[_minter] = false; } function updateMinting(bool _canMint) external override onlyController { canMint = _canMint; } function _requireCanMint() internal view { require(canMint); } // --- 'require' functions --- function _requireValidRecipient(address _recipient) internal view { require( _recipient != address(this), "YUSD: Cannot transfer tokens directly to the YUSD token contract" ); } function _requireValidMinter() internal view { require(validMinters[msg.sender], "YUSDToken: Caller is not Valid Minter"); } function _requireCallerIsBOorTroveMorSP() internal view { require( msg.sender == borrowerOperationsAddress || msg.sender == troveManagerAddress || msg.sender == stabilityPoolAddress || msg.sender == troveManagerRedemptionsAddress, "YUSD: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool" ); } function _requireCallerIsStabilityPool() internal view { require(msg.sender == stabilityPoolAddress, "YUSD: Caller is not the StabilityPool"); } function _requireCallerIsTMLorSP() internal view { require( msg.sender == stabilityPoolAddress || msg.sender == troveManagerLiquidationsAddress, "YUSD: Caller is neither TroveManagerLiquidator nor StabilityPool" ); } // --- Optional functions --- function name() external view override returns (string memory) { return _NAME; } function symbol() external view override returns (string memory) { return _SYMBOL; } function decimals() external view override returns (uint8) { return _DECIMALS; } function version() external view override returns (string memory) { return _VERSION; } function permitTypeHash() external view override returns (bytes32) { return _PERMIT_TYPEHASH; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.11; import "../Interfaces/IERC20.sol"; import "../Interfaces/IERC2612.sol"; interface IYUSDToken is IERC20, IERC2612 { // --- Events --- event YUSDTokenBalanceUpdated(address _user, uint _amount); // --- Functions --- function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; function sendToPool(address _sender, address poolAddress, uint256 _amount) external; function returnFromPool(address poolAddress, address user, uint256 _amount ) external; function updateMinting(bool _canMint) external; function addValidMinter(address _newMinter) external; function removeValidMinter(address _minter) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.11; /** * Based on OpenZeppelin's SafeMath: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol * * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "add overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "sub overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "mul overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "div by 0"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b != 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "mod by 0"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.11; /** * Based on the OpenZeppelin IER20 interface: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol * * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.11; /** * @dev Interface of the ERC2612 standard as defined in the EIP. * * Adds the {permit} method, which can be used to change one's * {IERC20-allowance} without having to send a transaction, by signing a * message. This allows users to spend tokens without having to hold Ether. * * See https://eips.ethereum.org/EIPS/eip-2612. * * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ */ interface IERC2612 { /** * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens, * given `owner`'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current ERC2612 nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases `owner`'s nonce by one. This * prevents a signature from being used multiple times. * * `owner` can limit the time a Permit is valid for by setting `deadline` to * a value in the near future. The deadline argument can be set to uint(-1) to * create Permits that effectively never expire. */ function nonces(address owner) external view returns (uint256); function version() external view returns (string memory); function permitTypeHash() external view returns (bytes32); function domainSeparator() external view returns (bytes32); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_troveManagerAddress","type":"address"},{"internalType":"address","name":"_troveManagerLiquidationsAddress","type":"address"},{"internalType":"address","name":"_troveManagerRedemptionsAddress","type":"address"},{"internalType":"address","name":"_stabilityPoolAddress","type":"address"},{"internalType":"address","name":"_borrowerOperationsAddress","type":"address"},{"internalType":"address","name":"_controllerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"YUSDTokenBalanceUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"_newMinter","type":"address"}],"name":"addValidMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"permitTypeHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeValidMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"returnFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canMint","type":"bool"}],"name":"updateMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101c06040526001805460ff1916811790553480156200001e57600080fd5b5060405162001e7338038062001e73833981810160405260c08110156200004457600080fd5b508051602080830151604080850151606080870151608088015160a0909801516001600160601b031988841b81166101005286841b81166101205284841b81166101405282841b81166101605289841b8116610180529281901b9092166101a0526001600160a01b038816600090815260058752849020805460ff1916600190811790915584518086018652600f81526e2caaa9a21029ba30b13632b1b7b4b760891b9088015284518086019095528452603160f81b93909501929092527f7bb87027487d36efcfb8a78c750a0c5fa1328814710c6d4fdd4ebf1e40f26b4f60c08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660e08190529596939591949392916200016a6001600160e01b03620001b516565b60a052620001a37f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f83836001600160e01b03620001b916565b608052506200021a9650505050505050565b4690565b6000838383620001d16001600160e01b03620001b516565b6040805160208082019690965280820194909452606084019290925260808301523060a0808401919091528151808403909101815260c090920190528051910120949350505050565b60805160a05160c05160e0516101005160601c6101205160601c6101405160601c6101605160601c6101805160601c6101a05160601c611bc1620002b2600039806109015280610c965280610d7052508061168752508061108a528061170652806119305250806117465250806110c95250806116c6525080610ed4525080610eb3525080610e39525080610e695250611bc16000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637ecebe00116100e3578063bb997bac1161008c578063e4d2156111610066578063e4d21561146105b2578063e66ff880146105e5578063f698da25146106185761018d565b8063bb997bac146104d6578063d505accf14610519578063dd62ed3e146105775761018d565b8063a457c2d7116100bd578063a457c2d714610445578063a9059cbb1461047e578063b22b7840146104b75761018d565b80637ecebe00146103d157806395d89b41146104045780639dc29fac1461040c5761018d565b806323b872dd1161014557806340c10f191161011f57806340c10f191461035d57806354fd4d501461039657806370a082311461039e5761018d565b806323b872dd146102c3578063313ce5671461030657806339509351146103245761018d565b806310ce43bd1161017657806310ce43bd1461025c57806318160ddd1461027657806320c582be1461027e5761018d565b806306fdde0314610192578063095ea7b31461020f575b600080fd5b61019a610620565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d45781810151838201526020016101bc565b50505050905090810190601f1680156102015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102486004803603604081101561022557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610658565b604080519115158252519081900360200190f35b61026461066e565b60408051918252519081900360200190f35b610264610692565b6102c16004803603606081101561029457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610698565b005b610248600480360360608110156102d957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356106b0565b61030e610735565b6040805160ff9092168252519081900360200190f35b6102486004803603604081101561033a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561073a565b6102c16004803603604081101561037357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610783565b61019a6107a1565b610264600480360360208110156103b457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166107d8565b610264600480360360208110156103e757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610800565b61019a610828565b6102c16004803603604081101561042257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561085f565b6102486004803603604081101561045b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610871565b6102486004803603604081101561049457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108d3565b6102c1600480360360208110156104cd57600080fd5b503515156108e9565b6102c1600480360360608110156104ec57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356109a8565b6102c1600480360360e081101561052f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356109b0565b6102646004803603604081101561058d57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c46565b6102c1600480360360208110156105c857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c7e565b6102c1600480360360208110156105fb57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610d58565b610264610e35565b60408051808201909152600f81527f5955534420537461626c65636f696e000000000000000000000000000000000060208201525b90565b6000610665338484610eff565b50600192915050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990565b60005490565b6106a0611072565b6106ab838383611142565b505050565b60006106bb8361135b565b6106c6848484611142565b61072b843361072685604051806060016040528060288152602001611aff6028913973ffffffffffffffffffffffffffffffffffffffff8a166000908152600460209081526040808320338452909152902054919063ffffffff6113cd16565b610eff565b5060019392505050565b601290565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610665918590610726908663ffffffff61147e16565b61078b6114f9565b610793611508565b61079d8282611570565b5050565b60408051808201909152600181527f3100000000000000000000000000000000000000000000000000000000000000602082015290565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b60408051808201909152600481527f5955534400000000000000000000000000000000000000000000000000000000602082015290565b61086761166f565b61079d82826117bd565b6000610665338461072685604051806060016040528060258152602001611b676025913933600090815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168452909152902054919063ffffffff6113cd16565b60006108de8361135b565b610665338484611142565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610977576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611a4e6027913960400191505060405180910390fd5b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6106a0611918565b42841015610a1f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f595553443a206578706972656420646561646c696e6500000000000000000000604482015290519081900360640190fd5b6000610a29610e35565b73ffffffffffffffffffffffffffffffffffffffff808a1660008181526002602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958e166060860152608085018d905260a085019590955260c08085018c90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff8a166101828501526101a284018990526101c284018890525194955090936101e2808401937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08301929081900390910190855afa158015610b8a573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f595553443a20696e76616c6964207369676e6174757265000000000000000000604482015290519081900360640190fd5b610c3b898989610eff565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260046020908152604080832093909416825291909152205490565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611a4e6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180611a4e6027913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60007f0000000000000000000000000000000000000000000000000000000000000000610e606119a6565b1415610e8d57507f0000000000000000000000000000000000000000000000000000000000000000610655565b610ef87f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006119aa565b9050610655565b73ffffffffffffffffffffffffffffffffffffffff8316610f8157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5f617070726f76653a206f776e65722069732061646472657373283029000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661100357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5f617070726f76653a207370656e646572206973206164647265737328302900604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806110eb57503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b611140576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526040815260200180611b276040913960400191505060405180910390fd5b565b73ffffffffffffffffffffffffffffffffffffffff83166111c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5f7472616e736665723a2073656e646572206973206164647265737328302900604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661124657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f5f7472616e736665723a20726563697069656e74206973203061646472657373604482015290519081900360640190fd5b60408051808201825260208082527f45524332303a207472616e7366657220616d6f756e74203e2062616c616e63658183015273ffffffffffffffffffffffffffffffffffffffff86166000908152600390915291909120546112b091839063ffffffff6113cd16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526003602052604080822093909355908416815220546112f2908263ffffffff61147e16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b73ffffffffffffffffffffffffffffffffffffffff81163014156113ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526040815260200180611abf6040913960400191505060405180910390fd5b50565b60008184841115611476576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561143b578181015183820152602001611423565b50505050905090810190601f1680156114685780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156114f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f616464206f766572666c6f770000000000000000000000000000000000000000604482015290519081900360640190fd5b9392505050565b60015460ff1661114057600080fd5b3360009081526005602052604090205460ff16611140576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611a756025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166115f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5f6d696e743a206163636f756e74206973206164647265737328302900000000604482015290519081900360640190fd5b600054611605908263ffffffff61147e16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316808252600360209081526040808420805486019055805185815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614806116e857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b8061172857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b8061176857503373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016145b611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604d815260200180611a01604d913960600191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661183f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5f6275726e3a206163636f756e74206973206164647265737328302900000000604482015290519081900360640190fd5b604080518082018252601c81527f45524332303a206275726e20616d6f756e74203e2062616c616e63650000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff85166000908152600390915291909120546118ad91839063ffffffff6113cd16565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260036020908152604080832094909455815485900382558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611140576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611a9a6025913960400191505060405180910390fd5b4690565b60008383836119b76119a6565b6040805160208082019690965280820194909452606084019290925260808301523060a0808401919091528151808403909101815260c09092019052805191012094935050505056fe595553443a2043616c6c6572206973206e65697468657220426f72726f7765724f7065726174696f6e73206e6f722054726f76654d616e61676572206e6f722053746162696c697479506f6f6c59555344546f6b656e3a2043616c6c6572206973206e6f742059657469436f6e74726f6c6c657259555344546f6b656e3a2043616c6c6572206973206e6f742056616c6964204d696e746572595553443a2043616c6c6572206973206e6f74207468652053746162696c697479506f6f6c595553443a2043616e6e6f74207472616e7366657220746f6b656e73206469726563746c7920746f20746865205955534420746f6b656e20636f6e747261637445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365595553443a2043616c6c6572206973206e6569746865722054726f76654d616e616765724c697175696461746f72206e6f722053746162696c697479506f6f6c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122094f9318437ad2594860689c9f179ea533474799bc9c96f8861ea763246799e9264736f6c634300060b0033000000000000000000000000000000000000614c27530d24b5f039ec15a61d8d0000000000000000000000000000000000adcd24b833604068cbbbb2eeb3a2a300000000000000000000000000000000000d9c2f60d8e82f2d1c2bed5008dd7d000000000000000000000000fffffffffff5d3627294fec5081ce5c5d7fa6451000000000000000000000000bbbbbbbbbbbec8bf32635374c0717c44b5c535ef000000000000000000000000cccccccccccc053fd8d1ff275da4183c2954dbe3
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000614c27530d24b5f039ec15a61d8d0000000000000000000000000000000000adcd24b833604068cbbbb2eeb3a2a300000000000000000000000000000000000d9c2f60d8e82f2d1c2bed5008dd7d000000000000000000000000fffffffffff5d3627294fec5081ce5c5d7fa6451000000000000000000000000bbbbbbbbbbbec8bf32635374c0717c44b5c535ef000000000000000000000000cccccccccccc053fd8d1ff275da4183c2954dbe3
-----Decoded View---------------
Arg [0] : _troveManagerAddress (address): 0x000000000000614c27530d24b5f039ec15a61d8d
Arg [1] : _troveManagerLiquidationsAddress (address): 0x0000000000adcd24b833604068cbbbb2eeb3a2a3
Arg [2] : _troveManagerRedemptionsAddress (address): 0x00000000000d9c2f60d8e82f2d1c2bed5008dd7d
Arg [3] : _stabilityPoolAddress (address): 0xfffffffffff5d3627294fec5081ce5c5d7fa6451
Arg [4] : _borrowerOperationsAddress (address): 0xbbbbbbbbbbbec8bf32635374c0717c44b5c535ef
Arg [5] : _controllerAddress (address): 0xcccccccccccc053fd8d1ff275da4183c2954dbe3
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000614c27530d24b5f039ec15a61d8d
Arg [1] : 0000000000000000000000000000000000adcd24b833604068cbbbb2eeb3a2a3
Arg [2] : 00000000000000000000000000000000000d9c2f60d8e82f2d1c2bed5008dd7d
Arg [3] : 000000000000000000000000fffffffffff5d3627294fec5081ce5c5d7fa6451
Arg [4] : 000000000000000000000000bbbbbbbbbbbec8bf32635374c0717c44b5c535ef
Arg [5] : 000000000000000000000000cccccccccccc053fd8d1ff275da4183c2954dbe3
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.