Contract 0x7b0aF3BA7C89be8e52F6BA815E5DAE79faAcA65f

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xaf77d99d592cdd0bebaba981af5c64cae86bf5c6f369fc6fcddd8d195324e179Set Addresses60673222022-02-14 1:31:29235 days 3 hrs ago0x9e97ae5d91da840eed47a5b07fdabbc2bfad8ada IN 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0 AVAX0.00708462 45
0x75ed6221cea5a824797e237e8f20e109c40f26e68ff8f1927976658e7ee06d670x6080604060664602022-02-14 1:01:53235 days 4 hrs ago0x9e97ae5d91da840eed47a5b07fdabbc2bfad8ada IN  Contract Creation0 AVAX0.09374733 45
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xef70bfaca59bbbbd9e48efd2cd81d45aa97c507b0 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x2e945f4de1586ea62003024829a1e8019e8e00f80 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xc1315eb36397e70330fea4fa7b04c24db16c294c0 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x5085f96fab5a4f4cd6acedf8054b431aacf298f90 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xdd30dff5f83f53789520118fc8ab15f5b2c2c8500 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xac9518d66df4ba4570b3a0213e7df45802d5e7f30 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xc08b06d8246d3d5cb6d7c22b2b098e8f416a1a1afb0bc8ee2e9533cdb9e038f777684552022-03-25 17:59:58195 days 11 hrs ago 0x6387c0e385196fecb43d5fe37ebe9777b790a8820x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xef70bfaca59bbbbd9e48efd2cd81d45aa97c507b0 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x2e945f4de1586ea62003024829a1e8019e8e00f80 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xc1315eb36397e70330fea4fa7b04c24db16c294c0 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x5085f96fab5a4f4cd6acedf8054b431aacf298f90 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xdd30dff5f83f53789520118fc8ab15f5b2c2c8500 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0xac9518d66df4ba4570b3a0213e7df45802d5e7f30 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
0xa82784b45e97a034c38c8ebad836a3e3494b2b92114d9474c34f29771876afd077661832022-03-25 16:43:54195 days 12 hrs ago 0x7b0af3ba7c89be8e52f6ba815e5dae79faaca65f0x1aa108e2392cd316be9255f78a3673e9f6f654470 AVAX
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x8B239653F0f46b0272A72675410Ba90f820ee32a

Contract Name:
CollSurplusPool

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 100 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 17 : CollSurplusPool.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./Interfaces/ICollSurplusPool.sol";
import "./Interfaces/IWhitelist.sol";
import "./Dependencies/SafeMath.sol";
import "./Dependencies/Ownable.sol";
import "./Dependencies/CheckContract.sol";
import "./Dependencies/LiquityBase.sol";


/**
 * The CollSurplusPool holds all the bonus collateral that occurs from liquidations and
 * redemptions, to be claimed by the trove owner.ß
 */
contract CollSurplusPool is Ownable, CheckContract, ICollSurplusPool, LiquityBase {
    using SafeMath for uint256;

    string public constant NAME = "CollSurplusPool";

    address public borrowerOperationsAddress;
    address public troveManagerAddress;
    address public troveManagerRedemptionsAddress;
    address public activePoolAddress;

    // deposited collateral tracker. Colls is always the whitelist list of all collateral tokens. Amounts
    newColls internal poolColl;

    // Collateral surplus claimable by trove owners
    mapping(address => newColls) internal balances;

    // --- Events ---

    event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
    event TroveManagerAddressChanged(address _newTroveManagerAddress);
    event ActivePoolAddressChanged(address _newActivePoolAddress);

    event CollBalanceUpdated(address indexed _account);
    event CollateralSent(address _to);

    // --- Contract setters ---

    function setAddresses(
        address _borrowerOperationsAddress,
        address _troveManagerAddress,
        address _troveManagerRedemptionsAddress,
        address _activePoolAddress,
        address _whitelistAddress
    ) external override onlyOwner {
        checkContract(_borrowerOperationsAddress);
        checkContract(_troveManagerAddress);
        checkContract(_troveManagerRedemptionsAddress);
        checkContract(_activePoolAddress);
        checkContract(_whitelistAddress);

        borrowerOperationsAddress = _borrowerOperationsAddress;
        troveManagerAddress = _troveManagerAddress;
        troveManagerRedemptionsAddress = _troveManagerRedemptionsAddress;
        activePoolAddress = _activePoolAddress;
        whitelist = IWhitelist(_whitelistAddress);

        emit BorrowerOperationsAddressChanged(_borrowerOperationsAddress);
        emit TroveManagerAddressChanged(_troveManagerAddress);
        emit ActivePoolAddressChanged(_activePoolAddress);

        _renounceOwnership();
    }

    /*
     * Returns the VC of the contract
     *
     * Not necessarily equal to the the contract's raw VC balance - Collateral can be forcibly sent to contracts.
     *
     * Computed when called by taking the collateral balances and
     * multiplying them by the corresponding price and ratio and then summing that
     */
    function getCollVC() external view override returns (uint256) {
        return _getVCColls(poolColl);
    }

    /*
     * View function for getting the amount claimable by a particular trove owner.
     */
    function getAmountClaimable(address _account, address _collateral)
        external
        view
        override
        returns (uint256)
    {
        uint256 collateralIndex = whitelist.getIndex(_collateral);
        if (balances[_account].amounts.length > collateralIndex) {
            return balances[_account].amounts[collateralIndex];
        }
        return 0;
    }

    /*
     * Returns the collateralBalance for a given collateral
     *
     * Returns the amount of a given collateral in state. Not necessarily the contract's actual balance.
     */
    function getCollateral(address _collateral) public view override returns (uint256) {
        uint256 collateralIndex = whitelist.getIndex(_collateral);
        return poolColl.amounts[collateralIndex];
    }

    /*
     *
     * Returns all collateral balances in state. Not necessarily the contract's actual balances.
     */
    function getAllCollateral() public view override returns (address[] memory, uint256[] memory) {
        return (poolColl.tokens, poolColl.amounts);
    }

    // --- Pool functionality ---

    // Surplus value is accounted by the trove manager.
    function accountSurplus(
        address _account,
        address[] memory _tokens,
        uint256[] memory _amounts
    ) external override {
        _requireCallerIsTroveManager();
        balances[_account] = _sumColls(balances[_account], _tokens, _amounts);
        emit CollBalanceUpdated(_account);
    }

    // Function called by borrower operations which claims the collateral that is owned by
    // a particular trove user.
    function claimColl(address _account) external override {
        _requireCallerIsBorrowerOperations();

        newColls memory claimableColl = balances[_account];
        require(_CollsIsNonZero(claimableColl), "CollSurplusPool: No collateral available to claim");

        balances[_account].amounts = new uint256[](poolColl.tokens.length); // sets balance of account to 0
        emit CollBalanceUpdated(_account);

        poolColl.amounts = _leftSubColls(poolColl, claimableColl.tokens, claimableColl.amounts);
        emit CollateralSent(_account);

        bool success = _sendColl(_account, claimableColl);
        require(success, "CollSurplusPool: sending Collateral failed");
    }

    // --- 'require' functions ---

    function _requireCallerIsBorrowerOperations() internal view {
        require(
            msg.sender == borrowerOperationsAddress,
            "CollSurplusPool: Caller is not Borrower Operations"
        );
    }

    function _requireCallerIsTroveManager() internal view {
        require(
            msg.sender == troveManagerAddress || msg.sender == troveManagerRedemptionsAddress,
            "CollSurplusPool: Caller is not TroveManager"
        );
    }

    function _requireCallerIsActivePool() internal view {
        require(msg.sender == activePoolAddress, "CollSurplusPool: Caller is not Active Pool");
    }

    function _requireCallerIsWhitelist() internal view {
        require(msg.sender == address(whitelist), "CollSurplusPool: Caller is not Whitelist");
    }

    function receiveCollateral(address[] memory _tokens, uint256[] memory _amounts)
        external
        override
    {
        _requireCallerIsActivePool();
        poolColl.amounts = _leftSumColls(poolColl, _tokens, _amounts);
    }

    // Adds collateral type from the whitelist.
    function addCollateralType(address _collateral) external override {
        _requireCallerIsWhitelist();
        poolColl.tokens.push(_collateral);
        poolColl.amounts.push(0);
    }
}

File 2 of 17 : ICollSurplusPool.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "../Dependencies/YetiCustomBase.sol";
import "./ICollateralReceiver.sol";


interface ICollSurplusPool is ICollateralReceiver {

    // --- Events ---
    
    event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
    event TroveManagerAddressChanged(address _newTroveManagerAddress);
    event ActivePoolAddressChanged(address _newActivePoolAddress);

    event CollBalanceUpdated(address indexed _account);
    event CollateralSent(address _to);

    // --- Contract setters ---

    function setAddresses(
        address _borrowerOperationsAddress,
        address _troveManagerAddress,
        address _troveManagerRedemptionsAddress,
        address _activePoolAddress,
        address _whitelistAddress
    ) external;

    function getCollVC() external view returns (uint);

    function getAmountClaimable(address _account, address _collateral) external view returns (uint);

    function getCollateral(address _collateral) external view returns (uint);

    function getAllCollateral() external view returns (address[] memory, uint256[] memory);

    function accountSurplus(address _account, address[] memory _tokens, uint[] memory _amounts) external;

    function claimColl(address _account) external;

    function addCollateralType(address _collateral) external;
}

File 3 of 17 : IWhitelist.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;


interface IWhitelist {
    function getValidCollateral() view external returns (address[] memory);

    function setAddresses(
        address _activePoolAddress,
        address _defaultPoolAddress,
        address _stabilityPoolAddress,
        address _collSurplusPoolAddress, 
        address _borrowerOperationsAddress
    ) external;

    function isValidRouter(address _router) external view returns (bool);
    function getOracle(address _collateral) view external returns (address);
    function getRatio(address _collateral) view external returns (uint256);
    function getIsActive(address _collateral) view external returns (bool);
    function getPriceCurve(address _collateral) external view returns (address);
    function getDecimals(address _collateral) external view returns (uint256);
    function getFee(address _collateral, uint _collateralVCInput, uint256 _collateralVCBalancePost, uint256 _totalVCBalancePre, uint256 _totalVCBalancePost) external view returns (uint256 fee);
    function getFeeAndUpdate(address _collateral, uint _collateralVCInput, uint256 _collateralVCBalancePost, uint256 _totalVCBalancePre, uint256 _totalVCBalancePost) external returns (uint256 fee);
    function getIndex(address _collateral) external view returns (uint256);
    function isWrapped(address _collateral) external view returns (bool);
    function setDefaultRouter(address _collateral, address _router) external;

    function getValueVC(address _collateral, uint _amount) view external returns (uint);
    function getValueUSD(address _collateral, uint _amount) view external returns (uint256);
    function getDefaultRouterAddress(address _collateral) external view returns (address);
}

File 4 of 17 : SafeMath.sol
// SPDX-License-Identifier: UNLICENSED

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, "SafeMath: addition 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, "SafeMath: subtraction 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, "SafeMath: multiplication 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, "SafeMath: division by zero");
    }

    /**
     * @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, "SafeMath: modulo by zero");
    }

    /**
     * @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;
    }
}

File 5 of 17 : Ownable.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

/**
 * Based on OpenZeppelin's Ownable contract:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
 *
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     *
     * NOTE: This function is not safe, as it doesn’t check owner is calling it.
     * Make sure you check it before calling it.
     */
    function _renounceOwnership() internal {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}

File 6 of 17 : CheckContract.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;


contract CheckContract {
    /**
     * Check that the account is an already deployed non-destroyed contract.
     * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12
     */
    function checkContract(address _account) internal view {
        require(_account != address(0), "Account cannot be zero address");

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(_account) }
        require(size > 0, "Account code size cannot be zero");
    }
}

File 7 of 17 : LiquityBase.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./LiquityMath.sol";
import "../Interfaces/IActivePool.sol";
import "../Interfaces/IDefaultPool.sol";
import "../Interfaces/ILiquityBase.sol";
import "../Interfaces/IWhitelist.sol";
import "./YetiCustomBase.sol";


/* 
* Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and
* common functions. 
*/
contract LiquityBase is ILiquityBase, YetiCustomBase {

    uint constant public _100pct = 1000000000000000000; // 1e18 == 100%

    uint constant public _110pct = 1100000000000000000; // 1.1e18 == 110%

    // Minimum collateral ratio for individual troves
    uint constant public MCR = 1100000000000000000; // 110%

    // Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered.
    uint constant public CCR = 1500000000000000000; // 150%

    // Amount of YUSD to be locked in gas pool on opening troves
    uint constant public YUSD_GAS_COMPENSATION = 200e18;

    // Minimum amount of net YUSD debt a must have
    uint constant public MIN_NET_DEBT = 1800e18;
    // uint constant public MIN_NET_DEBT = 0; 

    uint constant public PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5%

    uint constant public BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5%
    uint constant public REDEMPTION_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 5; // 0.5%

    IActivePool public activePool;

    IDefaultPool public defaultPool;

    // --- Gas compensation functions ---

    // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation
    function _getCompositeDebt(uint _debt) internal pure returns (uint) {
        return _debt.add(YUSD_GAS_COMPENSATION);
    }


    function _getNetDebt(uint _debt) internal pure returns (uint) {
        return _debt.sub(YUSD_GAS_COMPENSATION);
    }


    // Return the amount of collateral to be drawn from a trove's collateral and sent as gas compensation.
    function _getCollGasCompensation(newColls memory _coll) internal pure returns (newColls memory) {
        require(_coll.tokens.length == _coll.amounts.length, "_getCollGasCompensation(): Collateral length mismatch");

        uint[] memory amounts = new uint[](_coll.tokens.length);
        for (uint i = 0; i < _coll.tokens.length; i++) {
            amounts[i] = _coll.amounts[i] / PERCENT_DIVISOR;
        }
        return newColls(_coll.tokens, amounts);
    }

    // Return the system's Total Virtual Coin Balance
    // Virtual Coins are a way to keep track of the system collateralization given
    // the collateral ratios of each collateral type
    function getEntireSystemColl() public view returns (uint entireSystemColl) {
        uint activeColl = activePool.getVC();
        uint liquidatedColl = defaultPool.getVC();

        return activeColl.add(liquidatedColl);
    }


    function getEntireSystemDebt() public override view returns (uint entireSystemDebt) {
        uint activeDebt = activePool.getYUSDDebt();
        uint closedDebt = defaultPool.getYUSDDebt();

        return activeDebt.add(closedDebt);
    }


    function _getICRColls(newColls memory _colls, uint _debt) internal view returns (uint ICR) {
        uint totalVC = _getVCColls(_colls);
        ICR = LiquityMath._computeCR(totalVC, _debt);
        return ICR;
    }


    function _getVC(address[] memory _tokens, uint[] memory _amounts) internal view returns (uint totalVC) {
        require(_tokens.length == _amounts.length, "Not same length");
        for (uint i = 0; i < _tokens.length; i++) {
            uint tokenVC = whitelist.getValueVC(_tokens[i], _amounts[i]);
            totalVC = totalVC.add(tokenVC);
        }
        return totalVC;
    }


    function _getVCColls(newColls memory _colls) internal view returns (uint VC) {
        for (uint i = 0; i < _colls.tokens.length; i++) {
            uint valueVC = whitelist.getValueVC(_colls.tokens[i], _colls.amounts[i]);
            VC = VC.add(valueVC);
        }
        return VC;
    }


    function _getUSDColls(newColls memory _colls) internal view returns (uint USDValue) {
        for (uint i = 0; i < _colls.tokens.length; i++) {
            uint valueUSD = whitelist.getValueUSD(_colls.tokens[i], _colls.amounts[i]);
            USDValue = USDValue.add(valueUSD);
        }
        return USDValue;
    }


    function _getTCR() internal view returns (uint TCR) {
        uint entireSystemColl = getEntireSystemColl();
        uint entireSystemDebt = getEntireSystemDebt();
        
        TCR = LiquityMath._computeCR(entireSystemColl, entireSystemDebt);
        return TCR;
    }


    function _checkRecoveryMode() internal view returns (bool) {
        uint TCR = _getTCR();

        return TCR < CCR;
    }

    // fee and amount are denominated in dollar
    function _requireUserAcceptsFee(uint _fee, uint _amount, uint _maxFeePercentage) internal pure {
        uint feePercentage = _fee.mul(DECIMAL_PRECISION).div(_amount);
        require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum");
    }


    // get Colls struct for the given tokens and amounts
    function _getColls(address[] memory tokens, uint[] memory amounts) internal view returns (newColls memory coll) {
        require(tokens.length == amounts.length);
        coll.tokens = tokens;
        for (uint i = 0; i < tokens.length; i++) {
            coll.amounts[whitelist.getIndex(tokens[i])] = amounts[i];
        }
        return coll;
    }


    // checks coll has a nonzero balance of at least one token in coll.tokens
    function _CollsIsNonZero(newColls memory coll) internal pure returns (bool) {
        for (uint i = 0; i < coll.tokens.length; i++) {
            if (coll.amounts[i] > 0) {
                return true;
            }
        }
        return false;
    }


    function _sendColl(address _to, newColls memory _coll) internal returns (bool) {
        for (uint i = 0; i < _coll.tokens.length; i++) {
            IERC20 token = IERC20(_coll.tokens[i]);
            if (!token.transfer(_to, _coll.amounts[i])) {
                return false;
            }
        }
        return true;
    }


    // Check whether or not the system *would be* in Recovery Mode, given the entire system coll and debt.
    // returns true if the system would be in recovery mode and false if not
    function _checkPotentialRecoveryMode(uint _entireSystemColl, uint _entireSystemDebt)
    internal
    pure
    returns (bool)
    {
        uint TCR = LiquityMath._computeCR(_entireSystemColl, _entireSystemDebt);

        return TCR < CCR;
    }



}

File 8 of 17 : YetiCustomBase.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./BaseMath.sol";
import "./SafeMath.sol";
import "../Interfaces/IERC20.sol";
import "../Interfaces/IWhitelist.sol";


contract YetiCustomBase is BaseMath {
    using SafeMath for uint256;

    IWhitelist whitelist;

    struct newColls {
        // tokens and amounts should be the same length
        address[] tokens;
        uint256[] amounts;
    }

    // Collateral math

    // gets the sum of _coll1 and _coll2
    function _sumColls(newColls memory _coll1, newColls memory _coll2)
        internal
        view
        returns (newColls memory finalColls)
    {
        newColls memory coll3;

        coll3.tokens = whitelist.getValidCollateral();
        coll3.amounts = new uint256[](coll3.tokens.length);

        uint256 n = 0;
        for (uint256 i = 0; i < _coll1.tokens.length; i++) {
            uint256 tokenIndex = whitelist.getIndex(_coll1.tokens[i]);
            if (_coll1.amounts[i] > 0) {
                n++;
                coll3.amounts[tokenIndex] = _coll1.amounts[i];
            }
        }

        for (uint256 i = 0; i < _coll2.tokens.length; i++) {
            uint256 tokenIndex = whitelist.getIndex(_coll2.tokens[i]);
            if (_coll2.amounts[i] > 0) {
                if (coll3.amounts[tokenIndex] == 0) {
                    n++;
                }
                coll3.amounts[tokenIndex] = coll3.amounts[tokenIndex].add(_coll2.amounts[i]);
            }
        }

        address[] memory sumTokens = new address[](n);
        uint256[] memory sumAmounts = new uint256[](n);
        uint256 j = 0;

        // should only find n amounts over 0
        for (uint256 i = 0; i < coll3.tokens.length; i++) {
            if (coll3.amounts[i] > 0) {
                sumTokens[j] = coll3.tokens[i];
                sumAmounts[j] = coll3.amounts[i];
                j++;
            }
        }
        finalColls.tokens = sumTokens;
        finalColls.amounts = sumAmounts;
    }


    // gets the sum of coll1 with tokens and amounts
    function _sumColls(
        newColls memory _coll1,
        address[] memory tokens,
        uint256[] memory amounts
    ) internal view returns (newColls memory) {
        newColls memory coll2 = newColls(tokens, amounts);
        return _sumColls(_coll1, coll2);
    }


    function _sumColls(
        address[] memory tokens1,
        uint256[] memory amounts1,
        address[] memory tokens2,
        uint256[] memory amounts2
    ) internal view returns (newColls memory) {
        newColls memory coll1 = newColls(tokens1, amounts1);
        return _sumColls(coll1, tokens2, amounts2);
    }


    // Function for summing colls when coll1 includes all the tokens in the whitelist
    // Used in active, default, stability, and surplus pools
    // assumes _coll1.tokens = all whitelisted tokens
    function _leftSumColls(
        newColls memory _coll1,
        address[] memory _tokens,
        uint256[] memory _amounts
    ) internal view returns (uint[] memory) {
        uint[] memory sumAmounts = _getArrayCopy(_coll1.amounts);

        // assumes that sumAmounts length = whitelist tokens length.
        for (uint256 i = 0; i < _tokens.length; i++) {
            uint tokenIndex = whitelist.getIndex(_tokens[i]);
            sumAmounts[tokenIndex] = sumAmounts[tokenIndex].add(_amounts[i]);
        }

        return sumAmounts;
    }


    // Function for summing colls when one list is all tokens. Used in active, default, stability, and surplus pools
    function _leftSubColls(newColls memory _coll1, address[] memory _subTokens, uint[] memory _subAmounts)
        internal
        view
        returns (uint[] memory)
    {
        uint[] memory diffAmounts = _getArrayCopy(_coll1.amounts);

        //assumes that coll1.tokens = whitelist tokens. Keeps all of coll1's tokens, and subtracts coll2's amounts
        for (uint256 i = 0; i < _subTokens.length; i++) {
            uint256 tokenIndex = whitelist.getIndex(_subTokens[i]);
            diffAmounts[tokenIndex] = diffAmounts[tokenIndex].sub(_subAmounts[i]);
        }
        return diffAmounts;
    }
    

    // Returns _coll1 minus _tokens and _amounts
    // will error if _tokens include a token not in _coll1.tokens
    function _subColls(newColls memory _coll1, address[] memory _tokens, uint[] memory _amounts)
        internal
        view
        returns (newColls memory finalColls)
    {
        require(_tokens.length == _amounts.length, "Sub Colls invalid input");

        newColls memory coll3;
        coll3.tokens = whitelist.getValidCollateral();
        coll3.amounts = new uint256[](coll3.tokens.length);
        uint256 n = 0;

        for (uint256 i = 0; i < _coll1.tokens.length; i++) {
            if (_coll1.amounts[i] > 0) {
                uint256 tokenIndex = whitelist.getIndex(_coll1.tokens[i]);
                coll3.amounts[tokenIndex] = _coll1.amounts[i];
                n++;
            }
        }

        for (uint256 i = 0; i < _tokens.length; i++) {
            uint256 tokenIndex = whitelist.getIndex(_tokens[i]);
            require(coll3.amounts[tokenIndex] >= _amounts[i], "illegal sub");
            coll3.amounts[tokenIndex] = coll3.amounts[tokenIndex].sub(_amounts[i]);
            if (coll3.amounts[tokenIndex] == 0) {
                n--;
            }
        }

        address[] memory diffTokens = new address[](n);
        uint256[] memory diffAmounts = new uint256[](n);
        uint256 j = 0;

        for (uint256 i = 0; i < coll3.tokens.length; i++) {
            if (coll3.amounts[i] > 0) {
                diffTokens[j] = coll3.tokens[i];
                diffAmounts[j] = coll3.amounts[i];
                j++;
            }
        }
        finalColls.tokens = diffTokens;
        finalColls.amounts = diffAmounts;
    }

    function _getArrayCopy(uint[] memory _arr) internal pure returns (uint[] memory){
        uint[] memory copy = new uint[](_arr.length);
        for (uint i = 0; i < _arr.length; i++) {
            copy[i] = _arr[i];
        }
        return copy;
    }
}

File 9 of 17 : ICollateralReceiver.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

interface ICollateralReceiver {
    function receiveCollateral(address[] memory _tokens, uint[] memory _amounts) external;
}

File 10 of 17 : BaseMath.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.6.11;


contract BaseMath {
    uint constant public DECIMAL_PRECISION = 1e18;
}

File 11 of 17 : IERC20.sol
// SPDX-License-Identifier: UNLICENSED

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);
}

File 12 of 17 : LiquityMath.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./SafeMath.sol";

library LiquityMath {
    using SafeMath for uint;

    uint internal constant DECIMAL_PRECISION = 1e18;

    function _min(uint _a, uint _b) internal pure returns (uint) {
        return (_a < _b) ? _a : _b;
    }

    function _max(uint _a, uint _b) internal pure returns (uint) {
        return (_a >= _b) ? _a : _b;
    }

    /* 
    * Multiply two decimal numbers and use normal rounding rules:
    * -round product up if 19'th mantissa digit >= 5
    * -round product down if 19'th mantissa digit < 5
    *
    * Used only inside the exponentiation, _decPow().
    */
    function decMul(uint x, uint y) internal pure returns (uint decProd) {
        uint prod_xy = x.mul(y);

        decProd = prod_xy.add(DECIMAL_PRECISION / 2).div(DECIMAL_PRECISION);
    }

    /* 
    * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n.
    * 
    * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. 
    * 
    * Called by two functions that represent time in units of minutes:
    * 1) TroveManager._calcDecayedBaseRate
    * 2) CommunityIssuance._getCumulativeIssuanceFraction 
    * 
    * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals
    * "minutes in 1000 years": 60 * 24 * 365 * 1000
    * 
    * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be
    * negligibly different from just passing the cap, since: 
    *
    * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years
    * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible
    */
    function _decPow(uint _base, uint _minutes) internal pure returns (uint) {
       
        if (_minutes > 525600000) {_minutes = 525600000;}  // cap to avoid overflow
    
        if (_minutes == 0) {return DECIMAL_PRECISION;}

        uint y = DECIMAL_PRECISION;
        uint x = _base;
        uint n = _minutes;

        // Exponentiation-by-squaring
        while (n > 1) {
            if (n % 2 == 0) {
                x = decMul(x, x);
                n = n.div(2);
            } else { // if (n % 2 != 0)
                y = decMul(x, y);
                x = decMul(x, x);
                n = (n.sub(1)).div(2);
            }
        }

        return decMul(x, y);
  }

    function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) {
        return (_a >= _b) ? _a.sub(_b) : _b.sub(_a);
    }

    //  _coll should be the amount of VC and _debt is debt of YUSD\
    // new collateral ratio is 10**18 times the collateral ratio. (150% => 1.5e18)
    function _computeCR(uint _coll, uint _debt) internal pure returns (uint) {
        if (_debt > 0) {
            uint newCollRatio = _coll.mul(10**18).div(_debt);
            return newCollRatio;
        }
        // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR.
        else { // if (_debt == 0)
            return 2**256 - 1; 
        }
    }

}

File 13 of 17 : IActivePool.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./IPool.sol";

    
interface IActivePool is IPool {
    // --- Events ---
    event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);
    event TroveManagerAddressChanged(address _newTroveManagerAddress);
    event ActivePoolYUSDDebtUpdated(uint _YUSDDebt);
    event ActivePoolCollateralBalanceUpdated(address _collateral, uint _amount);

    // --- Functions ---
    
    function sendCollaterals(address _to, address[] memory _tokens, uint[] memory _amounts) external returns (bool);
    function sendCollateralsUnwrap(
        address _to,
        address[] memory _tokens,
        uint[] memory _amounts,
        bool _collectRewards) external returns (bool);
    function getCollateralVC(address collateralAddress) external view returns (uint);
    function addCollateralType(address _collateral) external;
}

File 14 of 17 : IDefaultPool.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./IPool.sol";

interface IDefaultPool is IPool {
    // --- Events ---
    event TroveManagerAddressChanged(address _newTroveManagerAddress);
    event DefaultPoolYUSDDebtUpdated(uint _YUSDDebt);
    event DefaultPoolETHBalanceUpdated(uint _ETH);

    // --- Functions ---
    
    function sendCollsToActivePool(address[] memory _collaterals, uint[] memory _amounts, address _borrower) external;
    function addCollateralType(address _collateral) external;
    function getCollateralVC(address collateralAddress) external view returns (uint);
}

File 15 of 17 : ILiquityBase.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./IPriceFeed.sol";


interface ILiquityBase {

    function getEntireSystemDebt() external view returns (uint entireSystemDebt);
}

File 16 of 17 : IPool.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

import "./ICollateralReceiver.sol";

// Common interface for the Pools.
interface IPool is ICollateralReceiver {
    
    // --- Events ---
    
    event ETHBalanceUpdated(uint _newBalance);
    event YUSDBalanceUpdated(uint _newBalance);
    event ActivePoolAddressChanged(address _newActivePoolAddress);
    event DefaultPoolAddressChanged(address _newDefaultPoolAddress);
    event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
    event WhitelistAddressChanged(address _newWhitelistAddress);
    event EtherSent(address _to, uint _amount);
    event CollateralSent(address _collateral, address _to, uint _amount);

    // --- Functions ---

    function getVC() external view returns (uint);

    function getCollateral(address collateralAddress) external view returns (uint);

    function getAllCollateral() external view returns (address[] memory, uint256[] memory);

    function getYUSDDebt() external view returns (uint);

    function increaseYUSDDebt(uint _amount) external;

    function decreaseYUSDDebt(uint _amount) external;

}

File 17 of 17 : IPriceFeed.sol
// SPDX-License-Identifier: UNLICENSED

pragma solidity 0.6.11;

interface IPriceFeed {

    // --- Events ---
    event LastGoodPriceUpdated(uint _lastGoodPrice);

    // --- Function ---
    // function fetchPrice() external returns (uint);

    function fetchPrice_v() view external returns (uint);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newActivePoolAddress","type":"address"}],"name":"ActivePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newBorrowerOperationsAddress","type":"address"}],"name":"BorrowerOperationsAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"}],"name":"CollBalanceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"CollateralSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newTroveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"inputs":[],"name":"BORROWING_FEE_FLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMAL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_NET_DEBT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDEMPTION_FEE_FLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"YUSD_GAS_COMPENSATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_100pct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_110pct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"accountSurplus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activePool","outputs":[{"internalType":"contract IActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"addCollateralType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowerOperationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"claimColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultPool","outputs":[{"internalType":"contract IDefaultPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllCollateral","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_collateral","type":"address"}],"name":"getAmountClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollVC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateral","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemColl","outputs":[{"internalType":"uint256","name":"entireSystemColl","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemDebt","outputs":[{"internalType":"uint256","name":"entireSystemDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"receiveCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrowerOperationsAddress","type":"address"},{"internalType":"address","name":"_troveManagerAddress","type":"address"},{"internalType":"address","name":"_troveManagerRedemptionsAddress","type":"address"},{"internalType":"address","name":"_activePoolAddress","type":"address"},{"internalType":"address","name":"_whitelistAddress","type":"address"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"troveManagerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"troveManagerRedemptionsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36124468061005f6000396000f3fe608060405234801561001057600080fd5b506004361061019a5760003560e01c80638da5cb5b116100e4578063b08bc72211610092578063b08bc722146105c2578063b32beb5b146105ca578063b7f8cf9b146105f0578063c6ba0936146105f8578063dd33cf0314610699578063ec0d5e0c146106a1578063f5f468ed146106c7578063f92d3433146101b95761019a565b80638da5cb5b146102a55780638f32d59b146102ad5780639b56d6c9146102c95780639efc9e20146102ef578063a20baee614610285578063a3f4df7e14610422578063a7a24edd1461049f5761019a565b80635a4d28bb1161014c5780635a4d28bb146102055780635dd68acd1461020d578063617215541461025757806372fe25aa14610285578063794e5724146101c1578063795d26c31461028d5780637f7dde4a14610295578063887105d31461029d5761019a565b80631bf435551461019f57806328d28b5b146101b9578063308e9647146101c15780633cc74225146101c95780634870dd9a146101ed578063499f99d9146101f55780635733d58f146101fd575b600080fd5b6101a76106cf565b60408051918252519081900360200190f35b6101a76106dc565b6101a76106e7565b6101d16106f3565b604080516001600160a01b039092168252519081900360200190f35b6101a7610702565b6101a7610707565b6101a7610714565b6101d1610720565b610255600480360360a081101561022357600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080909101351661072f565b005b6101a76004803603604081101561026d57600080fd5b506001600160a01b03813581169160200135166108c3565b6101a76109aa565b6101a76109b6565b6101d1610ac4565b6101a7610ad3565b6101d1610b9b565b6102b5610baa565b604080519115158252519081900360200190f35b6101a7600480360360208110156102df57600080fd5b50356001600160a01b0316610bbb565b6102556004803603606081101561030557600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561032f57600080fd5b82018360208201111561034157600080fd5b803590602001918460208302840111600160201b8311171561036257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156103b157600080fd5b8201836020820111156103c357600080fd5b803590602001918460208302840111600160201b831117156103e457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610c5c945050505050565b61042a610dc5565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561046457818101518382015260200161044c565b50505050905090810190601f1680156104915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610255600480360360408110156104b557600080fd5b810190602081018135600160201b8111156104cf57600080fd5b8201836020820111156104e157600080fd5b803590602001918460208302840111600160201b8311171561050257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561055157600080fd5b82018360208201111561056357600080fd5b803590602001918460208302840111600160201b8311171561058457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610df0945050505050565b6101d1610ed4565b610255600480360360208110156105e057600080fd5b50356001600160a01b0316610ee3565b6101d161121c565b61060061122b565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561064457818101518382015260200161062c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561068357818101518382015260200161066b565b5050505090500194505050505060405180910390f35b6101a76112ee565b610255600480360360208110156106b757600080fd5b50356001600160a01b03166113bb565b6101d1611445565b686194049f30f720000081565b6611c37937e0800081565b670f43fc2c04ee000081565b6003546001600160a01b031681565b60c881565b680ad78ebc5ac620000081565b6714d1120d7b16000081565b6005546001600160a01b031681565b610737610baa565b610788576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61079185611454565b61079a84611454565b6107a383611454565b6107ac82611454565b6107b581611454565b600480546001600160a01b038088166001600160a01b03199283168117909355600580548883169084161790556006805487831690841617905560078054868316908416179055600180549185169190921617905560408051918252517f3ca631ffcd2a9b5d9ae18543fc82f58eb4ca33af9e6ab01b7a8e95331e6ed9859181900360200190a1604080516001600160a01b038616815290517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a56789181900360200190a1604080516001600160a01b038416815290517f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd8829181900360200190a16108bc611507565b5050505050565b6001546040805163b31610db60e01b81526001600160a01b03848116600483015291516000938493169163b31610db916024808301926020929190829003018186803b15801561091257600080fd5b505afa158015610926573d6000803e3d6000fd5b505050506040513d602081101561093c57600080fd5b50516001600160a01b0385166000908152600a602052604090206001015490915081101561099e576001600160a01b0384166000908152600a6020526040902060010180548290811061098b57fe5b90600052602060002001549150506109a4565b60009150505b92915050565b670de0b6b3a764000081565b600080600260009054906101000a90046001600160a01b03166001600160a01b0316638df709926040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0757600080fd5b505afa158015610a1b573d6000803e3d6000fd5b505050506040513d6020811015610a3157600080fd5b5051600354604080516346fb84c960e11b815290519293506000926001600160a01b0390921691638df7099291600480820192602092909190829003018186803b158015610a7e57600080fd5b505afa158015610a92573d6000803e3d6000fd5b505050506040513d6020811015610aa857600080fd5b50519050610abc828263ffffffff61155116565b925050505b90565b6002546001600160a01b031681565b600080600260009054906101000a90046001600160a01b03166001600160a01b03166301d40b636040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2457600080fd5b505afa158015610b38573d6000803e3d6000fd5b505050506040513d6020811015610b4e57600080fd5b5051600354604080516301d40b6360e01b815290519293506000926001600160a01b03909216916301d40b6391600480820192602092909190829003018186803b158015610a7e57600080fd5b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6001546040805163b31610db60e01b81526001600160a01b03848116600483015291516000938493169163b31610db916024808301926020929190829003018186803b158015610c0a57600080fd5b505afa158015610c1e573d6000803e3d6000fd5b505050506040513d6020811015610c3457600080fd5b5051600980549192509082908110610c4857fe5b90600052602060002001549150505b919050565b610c646115b2565b6001600160a01b0383166000908152600a6020908152604091829020825181546060938102820184018552938101848152610d4094919384928491840182828015610cd857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610cba575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610d3057602002820191906000526020600020905b815481526020019060010190808311610d1c575b5050505050815250508383611612565b6001600160a01b0384166000908152600a60209081526040909120825180519192610d7092849290910190612202565b506020828101518051610d899260018501920190612267565b50506040516001600160a01b03851691507f6b2ad5b68fc200b778014cdb888224cf17eb4dde84391e0664599b723958b84690600090a2505050565b6040518060400160405280600f81526020016e10dbdb1b14dd5c9c1b1d5cd41bdbdb608a1b81525081565b610df861164c565b6040805160088054606060208202840181018552938301818152610ebb9484928491840182828015610e5357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e35575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610eab57602002820191906000526020600020905b815481526020019060010190808311610e97575b5050505050815250508383611695565b8051610ecf91600991602090910190612267565b505050565b6007546001600160a01b031681565b610eeb6117b9565b610ef36122ae565b6001600160a01b0382166000908152600a60209081526040918290208251815460609381028201840185529381018481529093919284928491840182828015610f6557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f47575b5050505050815260200160018201805480602002602001604051908101604052809291908181526020018280548015610fbd57602002820191906000526020600020905b815481526020019060010190808311610fa9575b5050505050815250509050610fd181611802565b61100c5760405162461bcd60e51b81526004018080602001828103825260318152602001806123316031913960400191505060405180910390fd5b60085467ffffffffffffffff8111801561102557600080fd5b5060405190808252806020026020018201604052801561104f578160200160208202803683370190505b506001600160a01b0383166000908152600a602090815260409091208251611081936001909201929190910190612267565b506040516001600160a01b038316907f6b2ad5b68fc200b778014cdb888224cf17eb4dde84391e0664599b723958b84690600090a26040805160088054606060208202840181018552938301818152611181948492849184018282801561111157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110f3575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561116957602002820191906000526020600020905b815481526020019060010190808311611155575b5050505050815250508260000151836020015161184b565b805161119591600991602090910190612267565b50604080516001600160a01b038416815290517f7636482499a16d29b05db7b6a6f35d00f2df69ce1104c82d1f6d288e68ef15eb9181900360200190a160006111de8383611966565b905080610ecf5760405162461bcd60e51b815260040180806020018281038252602a815260200180612307602a913960400191505060405180910390fd5b6004546001600160a01b031681565b606080600860000160086001018180548060200260200160405190810160405280929190818152602001828054801561128d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161126f575b50505050509150808054806020026020016040519081016040528092919081815260200182805480156112df57602002820191906000526020600020905b8154815260200190600101908083116112cb575b50505050509050915091509091565b60408051600880546060602082028401810185529383018181526000946113b694939284929184919084018282801561135057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611332575b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156113a857602002820191906000526020600020905b815481526020019060010190808311611394575b505050505081525050611a55565b905090565b6113c3611b43565b6008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b03939093169290921790915560098054918201815560009081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90910155565b6006546001600160a01b031681565b6001600160a01b0381166114af576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604482015290519081900360640190fd5b803b80611503576040805162461bcd60e51b815260206004820181905260248201527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b5050565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000828201838110156115ab576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6005546001600160a01b03163314806115d557506006546001600160a01b031633145b6116105760405162461bcd60e51b815260040180806020018281038252602b8152602001806123e6602b913960400191505060405180910390fd5b565b61161a6122ae565b6116226122ae565b60405180604001604052808581526020018481525090506116438582611b8c565b95945050505050565b6007546001600160a01b031633146116105760405162461bcd60e51b815260040180806020018281038252602a815260200180612362602a913960400191505060405180910390fd5b6060806116a585602001516120a0565b905060005b84518110156117b05760015485516000916001600160a01b03169063b31610db908890859081106116d757fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561172557600080fd5b505afa158015611739573d6000803e3d6000fd5b505050506040513d602081101561174f57600080fd5b505185519091506117909086908490811061176657fe5b602002602001015184838151811061177a57fe5b602002602001015161155190919063ffffffff16565b83828151811061179c57fe5b6020908102919091010152506001016116aa565b50949350505050565b6004546001600160a01b031633146116105760405162461bcd60e51b81526004018080602001828103825260328152602001806123b46032913960400191505060405180910390fd5b6000805b8251518110156118425760008360200151828151811061182257fe5b6020026020010151111561183a576001915050610c57565b600101611806565b50600092915050565b60608061185b85602001516120a0565b905060005b84518110156117b05760015485516000916001600160a01b03169063b31610db9088908590811061188d57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118db57600080fd5b505afa1580156118ef573d6000803e3d6000fd5b505050506040513d602081101561190557600080fd5b505185519091506119469086908490811061191c57fe5b602002602001015184838151811061193057fe5b602002602001015161212e90919063ffffffff16565b83828151811061195257fe5b602090810291909101015250600101611860565b6000805b825151811015611a4b5760008360000151828151811061198657fe5b60200260200101519050806001600160a01b031663a9059cbb86866020015185815181106119b057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611a0757600080fd5b505af1158015611a1b573d6000803e3d6000fd5b505050506040513d6020811015611a3157600080fd5b5051611a42576000925050506109a4565b5060010161196a565b5060019392505050565b6000805b825151811015611b3d57600154835180516000926001600160a01b031691632e2b1a889185908110611a8757fe5b602002602001015186602001518581518110611a9f57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015611af457600080fd5b505afa158015611b08573d6000803e3d6000fd5b505050506040513d6020811015611b1e57600080fd5b50519050611b32838263ffffffff61155116565b925050600101611a59565b50919050565b6001546001600160a01b031633146116105760405162461bcd60e51b815260040180806020018281038252602881526020018061238c6028913960400191505060405180910390fd5b611b946122ae565b611b9c6122ae565b600160009054906101000a90046001600160a01b03166001600160a01b0316639d6aea0a6040518163ffffffff1660e01b815260040160006040518083038186803b158015611bea57600080fd5b505afa158015611bfe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611c2757600080fd5b8101908080516040519392919084600160201b821115611c4657600080fd5b908301906020820185811115611c5b57600080fd5b82518660208202830111600160201b82111715611c7757600080fd5b82525081516020918201928201910280838360005b83811015611ca4578181015183820152602001611c8c565b5050505091909101604052505050818352505167ffffffffffffffff81118015611ccd57600080fd5b50604051908082528060200260200182016040528015611cf7578160200160208202803683370190505b5060208201526000805b855151811015611e1357600154865180516000926001600160a01b03169163b31610db9185908110611d2f57fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611d7d57600080fd5b505afa158015611d91573d6000803e3d6000fd5b505050506040513d6020811015611da757600080fd5b50516020880151805191925060009184908110611dc057fe5b60200260200101511115611e0a576020870151805160019094019383908110611de557fe5b602002602001015184602001518281518110611dfd57fe5b6020026020010181815250505b50600101611d01565b5060005b845151811015611f5c57600154855180516000926001600160a01b03169163b31610db9185908110611e4557fe5b60200260200101516040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611e9357600080fd5b505afa158015611ea7573d6000803e3d6000fd5b505050506040513d6020811015611ebd57600080fd5b50516020870151805191925060009184908110611ed657fe5b60200260200101511115611f535783602001518181518110611ef457fe5b602002602001015160001415611f0b576001909201915b611f3686602001518381518110611f1e57fe5b60200260200101518560200151838151811061177a57fe5b84602001518281518110611f4657fe5b6020026020010181815250505b50600101611e17565b5060608167ffffffffffffffff81118015611f7657600080fd5b50604051908082528060200260200182016040528015611fa0578160200160208202803683370190505b50905060608267ffffffffffffffff81118015611fbc57600080fd5b50604051908082528060200260200182016040528015611fe6578160200160208202803683370190505b5090506000805b85515181101561208d5760008660200151828151811061200957fe5b6020026020010151111561208557855180518290811061202557fe5b602002602001015184838151811061203957fe5b6001600160a01b0390921660209283029190910182015286015180518290811061205f57fe5b602002602001015183838151811061207357fe5b60209081029190910101526001909101905b600101611fed565b5050908452602084015250909392505050565b606080825167ffffffffffffffff811180156120bb57600080fd5b506040519080825280602002602001820160405280156120e5578160200160208202803683370190505b50905060005b83518110156121275783818151811061210057fe5b602002602001015182828151811061211457fe5b60209081029190910101526001016120eb565b5092915050565b60006115ab83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250600081848411156121fa5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156121bf5781810151838201526020016121a7565b50505050905090810190601f1680156121ec5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b828054828255906000526020600020908101928215612257579160200282015b8281111561225757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612222565b506122639291506122c8565b5090565b8280548282559060005260206000209081019282156122a2579160200282015b828111156122a2578251825591602001919060010190612287565b506122639291506122ec565b604051806040016040528060608152602001606081525090565b610ac191905b808211156122635780546001600160a01b03191681556001016122ce565b610ac191905b8082111561226357600081556001016122f256fe436f6c6c537572706c7573506f6f6c3a2073656e64696e6720436f6c6c61746572616c206661696c6564436f6c6c537572706c7573506f6f6c3a204e6f20636f6c6c61746572616c20617661696c61626c6520746f20636c61696d436f6c6c537572706c7573506f6f6c3a2043616c6c6572206973206e6f742041637469766520506f6f6c436f6c6c537572706c7573506f6f6c3a2043616c6c6572206973206e6f742057686974656c697374436f6c6c537572706c7573506f6f6c3a2043616c6c6572206973206e6f7420426f72726f776572204f7065726174696f6e73436f6c6c537572706c7573506f6f6c3a2043616c6c6572206973206e6f742054726f76654d616e61676572a2646970667358221220e36d1758b898c772470014612ee3dcfcb3743eba8ceaaec5d0ed5b2cfc9575bb64736f6c634300060b0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading