Contract 0x490f5da21446e348E8a1209C5a87fb7001260CFf

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0x4fa320af94d7b11a6024eaff57f49d131359165388ee581e88619d7169678f64Initialize321569822022-08-21 15:34:01288 days 4 hrs ago0x94888e209a5b258ddd2e9621c614499fd3f0c195 IN  0x490f5da21446e348e8a1209c5a87fb7001260cff0 MATIC0.01538665004 50.00000013
0x6b68d44e53f7f5dd7d713a1aca53aaa4a017b8da9a99e620dc0a5aff7781e6140x60806040290797452022-06-02 16:01:01368 days 3 hrs agoFurucombo: Deployer IN  Create: ComptrollerImplementation0 MATIC0.140018982089 48.406880067
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x4fa320af94d7b11a6024eaff57f49d131359165388ee581e88619d7169678f64321569822022-08-21 15:34:01288 days 4 hrs ago 0x490f5da21446e348e8a1209c5a87fb7001260cff  Contract Creation0 MATIC
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ComptrollerImplementation

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * 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.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 2 of 16 : IBeacon.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)

pragma solidity ^0.8.0;

/**
 * @dev This is the interface that {BeaconProxy} expects of its beacon.
 */
interface IBeacon {
    /**
     * @dev Must return an address that can be used as a delegate call target.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

File 3 of 16 : UpgradeableBeacon.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol)

pragma solidity ^0.8.0;

import "./IBeacon.sol";
import "../../access/Ownable.sol";
import "../../utils/Address.sol";

/**
 * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their
 * implementation contract, which is where they will delegate all function calls.
 *
 * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon.
 */
contract UpgradeableBeacon is IBeacon, Ownable {
    address private _implementation;

    /**
     * @dev Emitted when the implementation returned by the beacon is changed.
     */
    event Upgraded(address indexed implementation);

    /**
     * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the
     * beacon.
     */
    constructor(address implementation_) {
        _setImplementation(implementation_);
    }

    /**
     * @dev Returns the current implementation address.
     */
    function implementation() public view virtual override returns (address) {
        return _implementation;
    }

    /**
     * @dev Upgrades the beacon to a new implementation.
     *
     * Emits an {Upgraded} event.
     *
     * Requirements:
     *
     * - msg.sender must be the owner of the contract.
     * - `newImplementation` must be a contract.
     */
    function upgradeTo(address newImplementation) public virtual onlyOwner {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Sets the implementation contract address for this beacon
     *
     * Requirements:
     *
     * - `newImplementation` must be a contract.
     */
    function _setImplementation(address newImplementation) private {
        require(Address.isContract(newImplementation), "UpgradeableBeacon: implementation is not a contract");
        _implementation = newImplementation;
    }
}

File 4 of 16 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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);

    /**
     * @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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @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 5 of 16 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 6 of 16 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 7 of 16 : ComptrollerImplementation.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;

import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Whitelist} from "./libraries/Whitelist.sol";
import {IAssetRouter} from "./assets/interfaces/IAssetRouter.sol";
import {IComptroller} from "./interfaces/IComptroller.sol";
import {IMortgageVault} from "./interfaces/IMortgageVault.sol";
import {IDSProxyRegistry} from "./interfaces/IDSProxy.sol";
import {ISetupAction} from "./interfaces/ISetupAction.sol";
import {Errors} from "./utils/Errors.sol";

/// @title The implementation contract of comptroller
/// @notice Set the parameters and the permission controls of fund.
contract ComptrollerImplementation is Ownable, IComptroller {
    using Whitelist for Whitelist.ActionWList;
    using Whitelist for Whitelist.AssetWList;
    using Whitelist for Whitelist.CreatorWList;

    // Struct
    struct DenominationConfig {
        bool isPermitted;
        uint256 dust;
    }

    struct MortgageTierConfig {
        bool isSet;
        uint256 amount;
    }

    // Variable
    bool public fHalt;
    bool public fInitialAssetCheck;
    address public execAction;
    address public execFeeCollector;
    uint256 public execFeePercentage;
    uint256 public execAssetValueToleranceRate;
    address public pendingLiquidator;
    uint256 public pendingExpiration;
    uint256 public pendingPenalty;
    uint256 public assetCapacity;
    IAssetRouter public assetRouter;
    IMortgageVault public mortgageVault;
    UpgradeableBeacon public beacon;
    IDSProxyRegistry public dsProxyRegistry;
    ISetupAction public setupAction;

    // Map
    mapping(address => DenominationConfig) public denomination;
    mapping(address => bool) public bannedFundProxy;
    mapping(uint256 => MortgageTierConfig) public mortgageTier;

    // ACL
    Whitelist.CreatorWList private _creatorACL;
    Whitelist.AssetWList private _assetACL;
    Whitelist.ActionWList private _delegateCallACL;
    Whitelist.ActionWList private _contractCallACL;
    Whitelist.ActionWList private _handlerCallACL;

    // Event
    event Halted();
    event UnHalted();
    event SetMortgageVault(address indexed mortgageVault);
    event SetExecFeeCollector(address indexed collector);
    event SetExecFeePercentage(uint256 indexed percentage);
    event SetPendingLiquidator(address indexed liquidator);
    event SetPendingExpiration(uint256 expiration);
    event SetPendingPenalty(uint256 penalty);
    event SetExecAssetValueToleranceRate(uint256 tolerance);
    event SetInitialAssetCheck(bool indexed check);
    event SetDSProxyRegistry(address indexed registry);
    event SetSetupAction(address indexed action);
    event FundProxyBanned(address indexed fundProxy);
    event FundProxyUnbanned(address indexed fundProxy);
    event PermitDenomination(address indexed denomination, uint256 dust);
    event ForbidDenomination(address indexed denomination);
    event SetMortgageTier(uint256 indexed level, uint256 amount);
    event UnsetMortgageTier(uint256 indexed level);
    event SetAssetCapacity(uint256 indexed assetCapacity);
    event SetAssetRouter(address indexed assetRouter);
    event SetExecAction(address indexed action);
    event PermitCreator(address indexed to);
    event ForbidCreator(address indexed to);
    event PermitAsset(uint256 indexed level, address indexed asset);
    event ForbidAsset(uint256 indexed level, address indexed asset);
    event PermitDelegateCall(uint256 indexed level, address indexed to, bytes4 sig);
    event ForbidDelegateCall(uint256 indexed level, address indexed to, bytes4 sig);
    event PermitContractCall(uint256 indexed level, address indexed to, bytes4 sig);
    event ForbidContractCall(uint256 indexed level, address indexed to, bytes4 sig);
    event PermitHandler(uint256 indexed level, address indexed to, bytes4 sig);
    event ForbidHandler(uint256 indexed level, address indexed to, bytes4 sig);

    // Modifier
    modifier onlyUnHalted() {
        Errors._require(!fHalt, Errors.Code.COMPTROLLER_HALTED);
        _;
    }

    modifier onlyUnbannedFundProxy() {
        Errors._require(!bannedFundProxy[msg.sender], Errors.Code.COMPTROLLER_BANNED);
        _;
    }

    modifier nonZeroAddress(address newSetter_) {
        Errors._require(newSetter_ != address(0), Errors.Code.COMPTROLLER_ZERO_ADDRESS);
        _;
    }

    modifier consistentTosAndSigsLength(address[] calldata tos_, bytes4[] calldata sigs_) {
        Errors._require(tos_.length == sigs_.length, Errors.Code.COMPTROLLER_TOS_AND_SIGS_LENGTH_INCONSISTENT);
        _;
    }

    constructor() {
        // set owner to address(0) in implementation contract
        renounceOwnership();
    }

    /// @notice Initializer.
    /// @param implementation_ The fund implementation address.
    /// @param assetRouter_ The asset router address.
    /// @param execFeeCollector_ The execution fee collector address.
    /// @param execFeePercentage_ The ececute fee percentage on a 1e4 basis.
    /// @param pendingLiquidator_ The pending liquidator address.
    /// @param pendingExpiration_ The pending expiration to be set in second.
    /// @param mortgageVault_ The mortgage vault address.
    /// @param execAssetValueToleranceRate_ The exec asset value tolerance rate.
    /// @param dsProxyRegistry_ The DSProxy registry address.
    /// @param setupAction_ The setup action address.
    function initialize(
        address implementation_,
        IAssetRouter assetRouter_,
        address execFeeCollector_,
        uint256 execFeePercentage_,
        address pendingLiquidator_,
        uint256 pendingExpiration_,
        IMortgageVault mortgageVault_,
        uint256 execAssetValueToleranceRate_,
        IDSProxyRegistry dsProxyRegistry_,
        ISetupAction setupAction_
    ) external {
        Errors._require(address(beacon) == address(0), Errors.Code.COMPTROLLER_BEACON_IS_INITIALIZED);
        // transfer owner for set functions
        _transferOwnership(msg.sender);
        setAssetRouter(assetRouter_);
        setMortgageVault(mortgageVault_);
        setFeeCollector(execFeeCollector_);
        setExecFeePercentage(execFeePercentage_);
        setPendingLiquidator(pendingLiquidator_);
        setPendingExpiration(pendingExpiration_);
        setPendingPenalty(100);
        setAssetCapacity(80);
        setExecAssetValueToleranceRate(execAssetValueToleranceRate_);
        setInitialAssetCheck(true);
        setDSProxyRegistry(dsProxyRegistry_);
        setSetupAction(setupAction_);

        beacon = new UpgradeableBeacon(implementation_);
        beacon.transferOwnership(msg.sender);
    }

    /// @notice Get the implementation address.
    /// @return The implementation address.
    function implementation() external view onlyUnHalted onlyUnbannedFundProxy returns (address) {
        return beacon.implementation();
    }

    /// @inheritdoc IComptroller
    function owner() public view override(Ownable, IComptroller) returns (address) {
        return Ownable.owner();
    }

    /// @notice Halt the fund.
    function halt() external onlyOwner {
        fHalt = true;
        emit Halted();
    }

    /// @notice Unhalt the fund.
    function unHalt() external onlyOwner {
        fHalt = false;
        emit UnHalted();
    }

    /// @notice Set asset router.
    /// @param assetRouter_ The asset router address.
    function setAssetRouter(IAssetRouter assetRouter_) public nonZeroAddress(address(assetRouter_)) onlyOwner {
        assetRouter = assetRouter_;
        emit SetAssetRouter(address(assetRouter_));
    }

    /// @notice Set mortgage vault.
    /// @param mortgageVault_ The mortage vault address.
    function setMortgageVault(IMortgageVault mortgageVault_) public nonZeroAddress(address(mortgageVault_)) onlyOwner {
        mortgageVault = mortgageVault_;
        emit SetMortgageVault(address(mortgageVault_));
    }

    /// @notice Set execution fee collector.
    /// @param collector_ The collector address.
    function setFeeCollector(address collector_) public nonZeroAddress(collector_) onlyOwner {
        execFeeCollector = collector_;
        emit SetExecFeeCollector(collector_);
    }

    /// @notice Set execution fee percentage.
    /// @param percentage_ The fee percentage on a 1e4 basis.
    function setExecFeePercentage(uint256 percentage_) public onlyOwner {
        execFeePercentage = percentage_;
        emit SetExecFeePercentage(percentage_);
    }

    /// @notice Set pending liquidator.
    /// @param liquidator_ The liquidator address.
    function setPendingLiquidator(address liquidator_) public nonZeroAddress(liquidator_) onlyOwner {
        pendingLiquidator = liquidator_;
        emit SetPendingLiquidator(liquidator_);
    }

    /// @notice Set pending expiration.
    /// @param expiration_ The pending expiration to be set in second.
    function setPendingExpiration(uint256 expiration_) public onlyOwner {
        pendingExpiration = expiration_;
        emit SetPendingExpiration(expiration_);
    }

    /// @notice Set pending state redeem penalty.
    /// @param penalty_ The penalty percentage on a 1e4 basis.
    function setPendingPenalty(uint256 penalty_) public onlyOwner {
        pendingPenalty = penalty_;
        emit SetPendingPenalty(penalty_);
    }

    /// @notice Set maximum capacity of assets.
    /// @param assetCapacity_ The number of assets.
    function setAssetCapacity(uint256 assetCapacity_) public onlyOwner {
        assetCapacity = assetCapacity_;
        emit SetAssetCapacity(assetCapacity_);
    }

    /// @notice Set execution asset value tolerance rate.
    /// @param tolerance_ The tolerance rate on a 1e4 basis.
    function setExecAssetValueToleranceRate(uint256 tolerance_) public onlyOwner {
        execAssetValueToleranceRate = tolerance_;
        emit SetExecAssetValueToleranceRate(tolerance_);
    }

    /// @notice Set to check initial asset or not.
    /// @param check_ The boolean of checking initial asset.
    function setInitialAssetCheck(bool check_) public onlyOwner {
        fInitialAssetCheck = check_;
        emit SetInitialAssetCheck(check_);
    }

    /// @notice Set the DSProxy registry.
    /// @param dsProxyRegistry_ The DSProxy Registry address.
    function setDSProxyRegistry(IDSProxyRegistry dsProxyRegistry_)
        public
        nonZeroAddress(address(dsProxyRegistry_))
        onlyOwner
    {
        dsProxyRegistry = dsProxyRegistry_;
        emit SetDSProxyRegistry(address(dsProxyRegistry_));
    }

    /// @notice Set the setup action.
    /// @param setupAction_ The setup action address.
    function setSetupAction(ISetupAction setupAction_) public nonZeroAddress(address(setupAction_)) onlyOwner {
        setupAction = setupAction_;
        emit SetSetupAction(address(setupAction_));
    }

    /// @notice Permit denomination whitelist.
    /// @param denominations_ The denomination address array.
    /// @param dusts_ The denomination dust array.
    function permitDenominations(address[] calldata denominations_, uint256[] calldata dusts_) external onlyOwner {
        Errors._require(
            denominations_.length == dusts_.length,
            Errors.Code.COMPTROLLER_DENOMINATIONS_AND_DUSTS_LENGTH_INCONSISTENT
        );

        for (uint256 i = 0; i < denominations_.length; i++) {
            denomination[denominations_[i]].isPermitted = true;
            denomination[denominations_[i]].dust = dusts_[i];
            emit PermitDenomination(denominations_[i], dusts_[i]);
        }
    }

    /// @notice Remove denominations from whitelist.
    /// @param denominations_ The denominations to be removed.
    function forbidDenominations(address[] calldata denominations_) external onlyOwner {
        for (uint256 i = 0; i < denominations_.length; i++) {
            delete denomination[denominations_[i]];
            emit ForbidDenomination(denominations_[i]);
        }
    }

    /// @notice Check if the denomination is valid.
    /// @param denomination_ The denomination address.
    /// @return True if valid otherwise false.
    function isValidDenomination(address denomination_) external view returns (bool) {
        return denomination[denomination_].isPermitted;
    }

    /// @notice Get the denomination dust.
    /// @param denomination_ The denomination address.
    /// @return The dust of denomination.
    function getDenominationDust(address denomination_) external view returns (uint256) {
        return denomination[denomination_].dust;
    }

    /// @notice Ban the fund proxy.
    /// @param fundProxy_ The fund proxy address.
    function banFundProxy(address fundProxy_) external onlyOwner {
        bannedFundProxy[fundProxy_] = true;
        emit FundProxyBanned(fundProxy_);
    }

    /// @notice Unban the fund proxy.
    /// @param fundProxy_ The fund proxy address.
    function unbanFundProxy(address fundProxy_) external onlyOwner {
        bannedFundProxy[fundProxy_] = false;
        emit FundProxyUnbanned(fundProxy_);
    }

    /// @notice Set mortgage tier.
    /// @param level_ The level of mortgage.
    /// @param amount_ The mortgage amount.
    function setMortgageTier(uint256 level_, uint256 amount_) external onlyOwner {
        mortgageTier[level_].isSet = true;
        mortgageTier[level_].amount = amount_;
        emit SetMortgageTier(level_, amount_);
    }

    /// @notice Unset mortgage tier.
    /// @param level_ The level of mortage.
    function unsetMortgageTier(uint256 level_) external onlyOwner {
        delete mortgageTier[level_];
        emit UnsetMortgageTier(level_);
    }

    /// @notice Set execution action.
    /// @param action_ The action address.
    function setExecAction(address action_) external nonZeroAddress(action_) onlyOwner {
        execAction = action_;
        emit SetExecAction(action_);
    }

    /// @notice Permit creator whitelist.
    /// @param creators_ The permit creator address array.
    function permitCreators(address[] calldata creators_) external onlyOwner {
        for (uint256 i = 0; i < creators_.length; i++) {
            _creatorACL._permit(creators_[i]);
            emit PermitCreator(creators_[i]);
        }
    }

    /// @notice Remove creators from the whitelist.
    /// @param creators_ The creators to be removed.
    function forbidCreators(address[] calldata creators_) external onlyOwner {
        for (uint256 i = 0; i < creators_.length; i++) {
            _creatorACL._forbid(creators_[i]);
            emit ForbidCreator(creators_[i]);
        }
    }

    /// @notice Check if the creator is valid.
    /// @param creator_ The creator address.
    /// @return True if valid otherwise false.
    function isValidCreator(address creator_) external view returns (bool) {
        return _creatorACL._canCall(creator_);
    }

    /// @notice Permit asset whitelist.
    /// @param level_ The permit level.
    /// @param assets_ The permit asset array of level.
    function permitAssets(uint256 level_, address[] calldata assets_) external onlyOwner {
        for (uint256 i = 0; i < assets_.length; i++) {
            _assetACL._permit(level_, assets_[i]);
            emit PermitAsset(level_, assets_[i]);
        }
    }

    /// @notice Remove the assets from whitelist.
    /// @param level_ The level to be configured.
    /// @param assets_ The assets to be removed from the given level.
    function forbidAssets(uint256 level_, address[] calldata assets_) external onlyOwner {
        for (uint256 i = 0; i < assets_.length; i++) {
            _assetACL._forbid(level_, assets_[i]);
            emit ForbidAsset(level_, assets_[i]);
        }
    }

    /// @notice Check if the dealing assets are valid.
    /// @param level_ The level to be checked.
    /// @param assets_ The assets to be checked in the given level.
    /// @return True if valid otherwise false.
    function isValidDealingAssets(uint256 level_, address[] calldata assets_) external view returns (bool) {
        for (uint256 i = 0; i < assets_.length; i++) {
            if (!isValidDealingAsset(level_, assets_[i])) {
                return false;
            }
        }
        return true;
    }

    /// @notice Check if the dealing asset is valid.
    /// @param level_ The level to be checked.
    /// @param asset_ The asset to be checked in the given level.
    /// @return True if valid otherwise false.
    function isValidDealingAsset(uint256 level_, address asset_) public view returns (bool) {
        return _assetACL._canCall(level_, asset_);
    }

    /// @notice Check if the initial assets are valid.
    /// @param level_ The level to be checked.
    /// @param assets_ The assets to be checked in the given level.
    /// @return True if valid otherwise false.
    function isValidInitialAssets(uint256 level_, address[] calldata assets_) external view returns (bool) {
        for (uint256 i = 0; i < assets_.length; i++) {
            if (!isValidInitialAsset(level_, assets_[i])) {
                return false;
            }
        }
        return true;
    }

    /// @notice Check if the initial asset is valid.
    /// @param level_ The level to be checked.
    /// @param asset_ The asset to be checked in the given level.
    /// @return True if valid otherwise false.
    function isValidInitialAsset(uint256 level_, address asset_) public view returns (bool) {
        // check if input check flag is true
        if (fInitialAssetCheck) {
            return _assetACL._canCall(level_, asset_);
        }
        return true;
    }

    /// @notice Permit delegate call function.
    /// @param level_ The permit level.
    /// @param tos_ The permit delegate call address array.
    /// @param sigs_ The permit function signature array.
    function permitDelegateCalls(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _delegateCallACL._permit(level_, tos_[i], sigs_[i]);
            emit PermitDelegateCall(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Remove functions from the delegate call whitelist.
    /// @param level_ The level to be configured.
    /// @param tos_ The delegate call addresses to be removed.
    /// @param sigs_ The function signatures to be removed.
    function forbidDelegateCalls(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _delegateCallACL._forbid(level_, tos_[i], sigs_[i]);
            emit ForbidDelegateCall(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Check if the function can be delegate called.
    /// @param level_ The level to be checked.
    /// @param to_ The delegate call address to be checked.
    /// @param sig_ The function signature to be checked.
    /// @return True if can call otherwise false.
    function canDelegateCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool) {
        return _delegateCallACL._canCall(level_, to_, sig_);
    }

    /// @notice Permit contract call functions.
    /// @param level_ The level to be configured.
    /// @param tos_ The contract call addresses to be permitted.
    /// @param sigs_ The function signatures to be permitted.
    function permitContractCalls(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _contractCallACL._permit(level_, tos_[i], sigs_[i]);
            emit PermitContractCall(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Remove the function from contract call whitelist.
    /// @param level_ The level to be configured.
    /// @param tos_ The contract call addresses to be removed.
    /// @param sigs_ The function signatures to be removed.
    function forbidContractCalls(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _contractCallACL._forbid(level_, tos_[i], sigs_[i]);
            emit ForbidContractCall(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Check if the function can be called.
    /// @param level_ The level to be configured.
    /// @param to_ The contract call address to be removed.
    /// @param sig_ The function signature to be removed.
    /// @return True if can call otherwise false.
    function canContractCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool) {
        return _contractCallACL._canCall(level_, to_, sig_);
    }

    /// @notice Permit the handler functions.
    /// @param level_ The level to be configured.
    /// @param tos_ The handler addresses to be permitted.
    /// @param sigs_ The function signatures to be permitted.
    function permitHandlers(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _handlerCallACL._permit(level_, tos_[i], sigs_[i]);
            emit PermitHandler(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Remove handler functions from whitelist.
    /// @param level_ The level to be configured.
    /// @param tos_ The handler addresses to be removed.
    /// @param sigs_ The function signatures to be removed.
    function forbidHandlers(
        uint256 level_,
        address[] calldata tos_,
        bytes4[] calldata sigs_
    ) external consistentTosAndSigsLength(tos_, sigs_) onlyOwner {
        for (uint256 i = 0; i < tos_.length; i++) {
            _handlerCallACL._forbid(level_, tos_[i], sigs_[i]);
            emit ForbidHandler(level_, tos_[i], sigs_[i]);
        }
    }

    /// @notice Check if the handler function can be called.
    /// @param level_ The level to be checked.
    /// @param to_ The handler address to be checked in the given level.
    /// @param sig_ The function signature to be checked in the given level.
    /// @return True if can call otherwise false.
    function canHandlerCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool) {
        return _handlerCallACL._canCall(level_, to_, sig_);
    }
}

File 8 of 16 : IAssetOracle.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IAssetOracle {
    function calcConversionAmount(
        address base_,
        uint256 baseAmount_,
        address quote_
    ) external view returns (uint256);
}

File 9 of 16 : IAssetRegistry.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IAssetRegistry {
    function bannedResolvers(address) external view returns (bool);

    function register(address asset_, address resolver_) external;

    function unregister(address asset_) external;

    function banResolver(address resolver_) external;

    function unbanResolver(address resolver_) external;

    function resolvers(address asset_) external view returns (address);
}

File 10 of 16 : IAssetRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IAssetRegistry} from "./IAssetRegistry.sol";
import {IAssetOracle} from "./IAssetOracle.sol";

interface IAssetRouter {
    function oracle() external view returns (IAssetOracle);

    function registry() external view returns (IAssetRegistry);

    function setOracle(address oracle_) external;

    function setRegistry(address registry_) external;

    function calcAssetsTotalValue(
        address[] calldata bases_,
        uint256[] calldata amounts_,
        address quote_
    ) external view returns (uint256);

    function calcAssetValue(
        address asset_,
        uint256 amount_,
        address quote_
    ) external view returns (int256);
}

File 11 of 16 : IComptroller.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IAssetRouter} from "../assets/interfaces/IAssetRouter.sol";
import {IMortgageVault} from "./IMortgageVault.sol";
import {IDSProxyRegistry} from "./IDSProxy.sol";
import {ISetupAction} from "./ISetupAction.sol";

interface IComptroller {
    function owner() external view returns (address);

    function canDelegateCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool);

    function canContractCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool);

    function canHandlerCall(
        uint256 level_,
        address to_,
        bytes4 sig_
    ) external view returns (bool);

    function execFeePercentage() external view returns (uint256);

    function execFeeCollector() external view returns (address);

    function pendingLiquidator() external view returns (address);

    function pendingExpiration() external view returns (uint256);

    function execAssetValueToleranceRate() external view returns (uint256);

    function isValidDealingAsset(uint256 level_, address asset_) external view returns (bool);

    function isValidDealingAssets(uint256 level_, address[] calldata assets_) external view returns (bool);

    function isValidInitialAssets(uint256 level_, address[] calldata assets_) external view returns (bool);

    function assetCapacity() external view returns (uint256);

    function assetRouter() external view returns (IAssetRouter);

    function mortgageVault() external view returns (IMortgageVault);

    function pendingPenalty() external view returns (uint256);

    function execAction() external view returns (address);

    function mortgageTier(uint256 tier_) external view returns (bool, uint256);

    function isValidDenomination(address denomination_) external view returns (bool);

    function getDenominationDust(address denomination_) external view returns (uint256);

    function isValidCreator(address creator_) external view returns (bool);

    function dsProxyRegistry() external view returns (IDSProxyRegistry);

    function setupAction() external view returns (ISetupAction);
}

File 12 of 16 : IDSProxy.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IDSProxy {
    function execute(address _target, bytes calldata _data) external payable returns (bytes memory response);

    function owner() external view returns (address);

    function setAuthority(address authority_) external;
}

interface IDSProxyFactory {
    function isProxy(address proxy) external view returns (bool);

    function build() external returns (address);

    function build(address owner) external returns (address);
}

interface IDSProxyRegistry {
    function proxies(address input) external view returns (address);

    function build() external returns (address);

    function build(address owner) external returns (address);
}

File 13 of 16 : IMortgageVault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IMortgageVault {
    function mortgageToken() external view returns (IERC20);

    function totalAmount() external view returns (uint256);

    function fundAmounts(address fund_) external view returns (uint256);

    function mortgage(uint256 amount_) external;

    function claim(address receiver_) external;
}

File 14 of 16 : ISetupAction.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface ISetupAction {
    function maxApprove(IERC20 token_) external;
}

File 15 of 16 : Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Whitelist {
    uint256 internal constant _ANY32 = type(uint256).max;
    address internal constant _ANY20 = 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF;
    bytes4 internal constant _ANY4 = bytes4(type(uint32).max);

    // Action Whitelist
    struct ActionWList {
        mapping(uint256 => mapping(address => mapping(bytes4 => bool))) acl;
    }

    function _canCall(
        ActionWList storage wl_,
        uint256 level_,
        address to_,
        bytes4 sig_
    ) internal view returns (bool) {
        return wl_.acl[level_][to_][sig_] || wl_.acl[level_][to_][_ANY4] || wl_.acl[_ANY32][to_][sig_];
    }

    function _permit(
        ActionWList storage wl_,
        uint256 level_,
        address to_,
        bytes4 sig_
    ) internal {
        wl_.acl[level_][to_][sig_] = true;
    }

    function _forbid(
        ActionWList storage wl_,
        uint256 level_,
        address to_,
        bytes4 sig_
    ) internal {
        wl_.acl[level_][to_][sig_] = false;
    }

    // Asset white list
    struct AssetWList {
        mapping(uint256 => mapping(address => bool)) acl;
    }

    function _permit(
        AssetWList storage wl_,
        uint256 level_,
        address asset_
    ) internal {
        wl_.acl[level_][asset_] = true;
    }

    function _forbid(
        AssetWList storage wl_,
        uint256 level_,
        address asset_
    ) internal {
        wl_.acl[level_][asset_] = false;
    }

    function _canCall(
        AssetWList storage wl_,
        uint256 level_,
        address asset_
    ) internal view returns (bool) {
        return wl_.acl[level_][asset_] || wl_.acl[_ANY32][asset_];
    }

    // Creator white list
    struct CreatorWList {
        mapping(address => bool) acl;
    }

    function _permit(CreatorWList storage wl_, address creator_) internal {
        wl_.acl[creator_] = true;
    }

    function _forbid(CreatorWList storage wl_, address creator_) internal {
        wl_.acl[creator_] = false;
    }

    function _canCall(CreatorWList storage wl_, address creator_) internal view returns (bool) {
        return wl_.acl[creator_] || wl_.acl[_ANY20];
    }
}

File 16 of 16 : Errors.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library Errors {
    error RevertCode(Code errorCode);

    enum Code {
        COMPTROLLER_HALTED, // 0: "Halted"
        COMPTROLLER_BANNED, // 1: "Banned"
        COMPTROLLER_ZERO_ADDRESS, // 2: "Zero address"
        COMPTROLLER_TOS_AND_SIGS_LENGTH_INCONSISTENT, // 3: "tos and sigs length are inconsistent"
        COMPTROLLER_BEACON_IS_INITIALIZED, // 4: "Beacon is initialized"
        COMPTROLLER_DENOMINATIONS_AND_DUSTS_LENGTH_INCONSISTENT, // 5: "denominations and dusts length are inconsistent"
        IMPLEMENTATION_ASSET_LIST_NOT_EMPTY, // 6: "assetList is not empty"
        IMPLEMENTATION_INVALID_DENOMINATION, // 7: "Invalid denomination"
        IMPLEMENTATION_INVALID_MORTGAGE_TIER, // 8: "Mortgage tier not set in comptroller"
        IMPLEMENTATION_PENDING_SHARE_NOT_RESOLVABLE, // 9: "pending share is not resolvable"
        IMPLEMENTATION_PENDING_NOT_START, // 10: "Pending does not start"
        IMPLEMENTATION_PENDING_NOT_EXPIRE, // 11: "Pending does not expire"
        IMPLEMENTATION_INVALID_ASSET, // 12: "Invalid asset"
        IMPLEMENTATION_INSUFFICIENT_TOTAL_VALUE_FOR_EXECUTION, // 13: "Insufficient total value for execution"
        FUND_PROXY_FACTORY_INVALID_CREATOR, // 14: "Invalid creator"
        FUND_PROXY_FACTORY_INVALID_DENOMINATION, // 15: "Invalid denomination"
        FUND_PROXY_FACTORY_INVALID_MORTGAGE_TIER, // 16: "Mortgage tier not set in comptroller"
        FUND_PROXY_STORAGE_UTILS_INVALID_DENOMINATION, // 17: "Invalid denomination"
        FUND_PROXY_STORAGE_UTILS_UNKNOWN_OWNER, // 18: "Unknown owner"
        FUND_PROXY_STORAGE_UTILS_WRONG_ALLOWANCE, // 19: "Wrong allowance"
        FUND_PROXY_STORAGE_UTILS_IS_NOT_ZERO, // 20: "Is not zero value or address "
        FUND_PROXY_STORAGE_UTILS_IS_ZERO, // 21: "Is zero value or address"
        MORTGAGE_VAULT_FUND_MORTGAGED, // 22: "Fund mortgaged"
        SHARE_TOKEN_INVALID_FROM, // 23: "Invalid from"
        SHARE_TOKEN_INVALID_TO, // 24: "Invalid to"
        TASK_EXECUTOR_TOS_AND_DATAS_LENGTH_INCONSISTENT, // 25: "tos and datas length inconsistent"
        TASK_EXECUTOR_TOS_AND_CONFIGS_LENGTH_INCONSISTENT, // 26: "tos and configs length inconsistent"
        TASK_EXECUTOR_INVALID_COMPTROLLER_DELEGATE_CALL, // 27: "Invalid comptroller delegate call"
        TASK_EXECUTOR_INVALID_COMPTROLLER_CONTRACT_CALL, // 28: "Invalid comptroller contract call"
        TASK_EXECUTOR_INVALID_DEALING_ASSET, // 29: "Invalid dealing asset"
        TASK_EXECUTOR_REFERENCE_TO_OUT_OF_LOCALSTACK, // 30: "Reference to out of localStack"
        TASK_EXECUTOR_RETURN_NUM_AND_PARSED_RETURN_NUM_NOT_MATCHED, // 31: "Return num and parsed return num not matched"
        TASK_EXECUTOR_ILLEGAL_LENGTH_FOR_PARSE, // 32: "Illegal length for _parse"
        TASK_EXECUTOR_STACK_OVERFLOW, // 33: "Stack overflow"
        TASK_EXECUTOR_INVALID_INITIAL_ASSET, // 34: "Invalid initial asset"
        TASK_EXECUTOR_NON_ZERO_QUOTA, // 35: "Quota is not zero"
        AFURUCOMBO_DUPLICATED_TOKENSOUT, // 36: "Duplicated tokensOut"
        AFURUCOMBO_REMAINING_TOKENS, // 37: "Furucombo has remaining tokens"
        AFURUCOMBO_TOKENS_AND_AMOUNTS_LENGTH_INCONSISTENT, // 38: "Token length != amounts length"
        AFURUCOMBO_INVALID_COMPTROLLER_HANDLER_CALL, // 39: "Invalid comptroller handler call"
        CHAINLINK_ASSETS_AND_AGGREGATORS_INCONSISTENT, // 40: "assets.length == aggregators.length"
        CHAINLINK_ZERO_ADDRESS, // 41: "Zero address"
        CHAINLINK_EXISTING_ASSET, // 42: "Existing asset"
        CHAINLINK_NON_EXISTENT_ASSET, // 43: "Non-existent asset"
        CHAINLINK_INVALID_PRICE, // 44: "Invalid price"
        CHAINLINK_STALE_PRICE, // 45: "Stale price"
        ASSET_REGISTRY_UNREGISTERED, // 46: "Unregistered"
        ASSET_REGISTRY_BANNED_RESOLVER, // 47: "Resolver has been banned"
        ASSET_REGISTRY_ZERO_RESOLVER_ADDRESS, // 48: "Resolver zero address"
        ASSET_REGISTRY_ZERO_ASSET_ADDRESS, // 49: "Asset zero address"
        ASSET_REGISTRY_REGISTERED_RESOLVER, // 50: "Resolver is registered"
        ASSET_REGISTRY_NON_REGISTERED_RESOLVER, // 51: "Asset not registered"
        ASSET_REGISTRY_NON_BANNED_RESOLVER, // 52: "Resolver is not banned"
        ASSET_ROUTER_ASSETS_AND_AMOUNTS_LENGTH_INCONSISTENT, // 53: "assets length != amounts length"
        ASSET_ROUTER_NEGATIVE_VALUE, // 54: "Negative value"
        RESOLVER_ASSET_VALUE_NEGATIVE, // 55: "Resolver's asset value < 0"
        RESOLVER_ASSET_VALUE_POSITIVE, // 56: "Resolver's asset value > 0"
        RCURVE_STABLE_ZERO_ASSET_ADDRESS, // 57: "Zero asset address"
        RCURVE_STABLE_ZERO_POOL_ADDRESS, // 58: "Zero pool address"
        RCURVE_STABLE_ZERO_VALUED_ASSET_ADDRESS, // 59: "Zero valued asset address"
        RCURVE_STABLE_VALUED_ASSET_DECIMAL_NOT_MATCH_VALUED_ASSET, // 60: "Valued asset decimal not match valued asset"
        RCURVE_STABLE_POOL_INFO_IS_NOT_SET, // 61: "Pool info is not set"
        ASSET_MODULE_DIFFERENT_ASSET_REMAINING, // 62: "Different asset remaining"
        ASSET_MODULE_FULL_ASSET_CAPACITY, // 63: "Full Asset Capacity"
        MANAGEMENT_FEE_MODULE_FEE_RATE_SHOULD_BE_LESS_THAN_FUND_BASE, // 64: "Fee rate should be less than 100%"
        PERFORMANCE_FEE_MODULE_CAN_NOT_CRYSTALLIZED_YET, // 65: "Can not crystallized yet"
        PERFORMANCE_FEE_MODULE_TIME_BEFORE_START, // 66: "Time before start"
        PERFORMANCE_FEE_MODULE_FEE_RATE_SHOULD_BE_LESS_THAN_BASE, // 67: "Fee rate should be less than 100%"
        PERFORMANCE_FEE_MODULE_CRYSTALLIZATION_PERIOD_TOO_SHORT, // 68: "Crystallization period too short"
        SHARE_MODULE_SHARE_AMOUNT_TOO_LARGE, // 69: "The requesting share amount is greater than total share amount"
        SHARE_MODULE_PURCHASE_ZERO_BALANCE, // 70: "The purchased balance is zero"
        SHARE_MODULE_PURCHASE_ZERO_SHARE, // 71: "The share purchased need to greater than zero"
        SHARE_MODULE_REDEEM_ZERO_SHARE, // 72: "The redeem share is zero"
        SHARE_MODULE_INSUFFICIENT_SHARE, // 73: "Insufficient share amount"
        SHARE_MODULE_REDEEM_IN_PENDING_WITHOUT_PERMISSION, // 74: "Redeem in pending without permission"
        SHARE_MODULE_PENDING_ROUND_INCONSISTENT, // 75: "user pending round and current pending round are inconsistent"
        SHARE_MODULE_PENDING_REDEMPTION_NOT_CLAIMABLE // 76: "Pending redemption is not claimable"
    }

    function _require(bool condition_, Code errorCode_) internal pure {
        if (!condition_) revert RevertCode(errorCode_);
    }

    function _revertMsg(string memory functionName_, string memory reason_) internal pure {
        revert(string(abi.encodePacked(functionName_, ": ", reason_)));
    }

    function _revertMsg(string memory functionName_) internal pure {
        _revertMsg(functionName_, "Unspecified");
    }
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"enum Errors.Code","name":"errorCode","type":"uint8"}],"name":"RevertCode","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"}],"name":"ForbidAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"ForbidContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ForbidCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"ForbidDelegateCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"denomination","type":"address"}],"name":"ForbidDenomination","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"ForbidHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fundProxy","type":"address"}],"name":"FundProxyBanned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fundProxy","type":"address"}],"name":"FundProxyUnbanned","type":"event"},{"anonymous":false,"inputs":[],"name":"Halted","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":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"asset","type":"address"}],"name":"PermitAsset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"PermitContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PermitCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"PermitDelegateCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"denomination","type":"address"},{"indexed":false,"internalType":"uint256","name":"dust","type":"uint256"}],"name":"PermitDenomination","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes4","name":"sig","type":"bytes4"}],"name":"PermitHandler","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"assetCapacity","type":"uint256"}],"name":"SetAssetCapacity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"assetRouter","type":"address"}],"name":"SetAssetRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"SetDSProxyRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"action","type":"address"}],"name":"SetExecAction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tolerance","type":"uint256"}],"name":"SetExecAssetValueToleranceRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collector","type":"address"}],"name":"SetExecFeeCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"SetExecFeePercentage","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"check","type":"bool"}],"name":"SetInitialAssetCheck","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SetMortgageTier","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"mortgageVault","type":"address"}],"name":"SetMortgageVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"SetPendingExpiration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"liquidator","type":"address"}],"name":"SetPendingLiquidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"SetPendingPenalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"action","type":"address"}],"name":"SetSetupAction","type":"event"},{"anonymous":false,"inputs":[],"name":"UnHalted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"}],"name":"UnsetMortgageTier","type":"event"},{"inputs":[],"name":"assetCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetRouter","outputs":[{"internalType":"contract IAssetRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fundProxy_","type":"address"}],"name":"banFundProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bannedFundProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beacon","outputs":[{"internalType":"contract UpgradeableBeacon","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes4","name":"sig_","type":"bytes4"}],"name":"canContractCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes4","name":"sig_","type":"bytes4"}],"name":"canDelegateCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes4","name":"sig_","type":"bytes4"}],"name":"canHandlerCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"denomination","outputs":[{"internalType":"bool","name":"isPermitted","type":"bool"},{"internalType":"uint256","name":"dust","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dsProxyRegistry","outputs":[{"internalType":"contract IDSProxyRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execAction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execAssetValueToleranceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"execFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fHalt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fInitialAssetCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"assets_","type":"address[]"}],"name":"forbidAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"forbidContractCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"creators_","type":"address[]"}],"name":"forbidCreators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"forbidDelegateCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"denominations_","type":"address[]"}],"name":"forbidDenominations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"forbidHandlers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"denomination_","type":"address"}],"name":"getDenominationDust","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"halt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"implementation_","type":"address"},{"internalType":"contract IAssetRouter","name":"assetRouter_","type":"address"},{"internalType":"address","name":"execFeeCollector_","type":"address"},{"internalType":"uint256","name":"execFeePercentage_","type":"uint256"},{"internalType":"address","name":"pendingLiquidator_","type":"address"},{"internalType":"uint256","name":"pendingExpiration_","type":"uint256"},{"internalType":"contract IMortgageVault","name":"mortgageVault_","type":"address"},{"internalType":"uint256","name":"execAssetValueToleranceRate_","type":"uint256"},{"internalType":"contract IDSProxyRegistry","name":"dsProxyRegistry_","type":"address"},{"internalType":"contract ISetupAction","name":"setupAction_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator_","type":"address"}],"name":"isValidCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address","name":"asset_","type":"address"}],"name":"isValidDealingAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"assets_","type":"address[]"}],"name":"isValidDealingAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"denomination_","type":"address"}],"name":"isValidDenomination","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address","name":"asset_","type":"address"}],"name":"isValidInitialAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"assets_","type":"address[]"}],"name":"isValidInitialAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mortgageTier","outputs":[{"internalType":"bool","name":"isSet","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mortgageVault","outputs":[{"internalType":"contract IMortgageVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingExpiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingLiquidator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"assets_","type":"address[]"}],"name":"permitAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"permitContractCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"creators_","type":"address[]"}],"name":"permitCreators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"permitDelegateCalls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"denominations_","type":"address[]"},{"internalType":"uint256[]","name":"dusts_","type":"uint256[]"}],"name":"permitDenominations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"bytes4[]","name":"sigs_","type":"bytes4[]"}],"name":"permitHandlers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetCapacity_","type":"uint256"}],"name":"setAssetCapacity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAssetRouter","name":"assetRouter_","type":"address"}],"name":"setAssetRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IDSProxyRegistry","name":"dsProxyRegistry_","type":"address"}],"name":"setDSProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"action_","type":"address"}],"name":"setExecAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tolerance_","type":"uint256"}],"name":"setExecAssetValueToleranceRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage_","type":"uint256"}],"name":"setExecFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collector_","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"check_","type":"bool"}],"name":"setInitialAssetCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMortgageTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMortgageVault","name":"mortgageVault_","type":"address"}],"name":"setMortgageVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"expiration_","type":"uint256"}],"name":"setPendingExpiration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidator_","type":"address"}],"name":"setPendingLiquidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"penalty_","type":"uint256"}],"name":"setPendingPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISetupAction","name":"setupAction_","type":"address"}],"name":"setSetupAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setupAction","outputs":[{"internalType":"contract ISetupAction","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unHalt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fundProxy_","type":"address"}],"name":"unbanFundProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level_","type":"uint256"}],"name":"unsetMortgageTier","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506200001d336200002d565b620000276200007d565b6200011c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3362000088620000f1565b6001600160a01b031614620000e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b620000ef60006200002d565b565b6000620001086200010d60201b620026d51760201c565b905090565b6000546001600160a01b031690565b61335a806200012c6000396000f3fe60806040523480156200001157600080fd5b5060043610620004215760003560e01c80638404a9221162000229578063bc0aac101162000131578063ea750af611620000bb578063f2fde38b1162000086578063f2fde38b14620009bc578063f4d430e914620009d3578063f9d915c214620009ea578063f9e3ffb01462000a0157600080fd5b8063ea750af61462000962578063ead2b2961462000977578063eae80d43146200098e578063eb6161ed14620009a557600080fd5b8063cb78917711620000fc578063cb7891771462000906578063d14bc4ac146200091d578063d6dd87401462000934578063d85c2197146200094b57600080fd5b8063bc0aac1014620008a4578063bd6d285014620008b8578063bf11a11414620008c2578063c8d12bb914620008d657600080fd5b8063a24d7eda11620001b3578063a4e189b4116200017e578063a4e189b41462000855578063aebfc1ef146200086c578063b392d0d01462000883578063bbbf7562146200088d57600080fd5b8063a24d7eda14620007fc578063a3802d4e1462000810578063a4158c201462000827578063a42dce80146200083e57600080fd5b806390c594c511620001f457806390c594c514620007a557806396d19c7f14620007ba57806398a4f11c14620007ce5780639c0ae2f314620007e557600080fd5b80638404a922146200075b57806389be195814620007725780638da5cb5b14620007895780638ec128d2146200079b57600080fd5b806359659e90116200032d578063710ecfd911620002b757806378285c71116200028257806378285c71146200070c5780637a3479d014620007165780637ded7edf146200072d57806380626bb9146200074457600080fd5b8063710ecfd914620006ca578063715018a614620006e157806376865eea14620006eb5780637718263614620006f557600080fd5b8063666f85af11620002f8578063666f85af14620006565780636ac737f7146200066d578063700f81f21462000684578063706204e914620006b357600080fd5b806359659e9014620005ff5780635bb9b1d114620006135780635c60da1b14620006425780635ed7ca5b146200064c57600080fd5b8063337d118811620003af5780633f33d8f7116200037a5780633f33d8f714620005a6578063434e664514620005ba5780634b44cc7d14620005d15780634eace69c14620005e857600080fd5b8063337d1188146200054a57806335be7de614620005615780633a69db0114620005785780633ca5bf07146200058f57600080fd5b806329eaf0ab11620003f057806329eaf0ab14620004bb5780632c81c2d014620004d25780633197fff514620004eb57806331f307a4146200050257600080fd5b80630879366514620004265780630d55dc9a14620004575780630f2da230146200048e578063137d524214620004a7575b600080fd5b600c546200043a906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6200047d6200046836600462002958565b600f6020526000908152604090205460ff1681565b60405190151581526020016200044e565b620004a56200049f36600462002958565b62000a18565b005b600a546200043a906001600160a01b031681565b620004a5620004cc36600462002958565b62000ab2565b620004dc60085481565b6040519081526020016200044e565b6200047d620004fc36600462002996565b62000b43565b6200053262000513366004620029d9565b6010602052600090815260409020805460019091015460ff9091169082565b6040805192151583526020830191909152016200044e565b620004a56200055b366004620029d9565b62000b5e565b620004a56200057236600462002a42565b62000bbe565b620004a56200058936600462002ac3565b62000d2d565b620004a5620005a036600462002a42565b62000e41565b6002546200043a906001600160a01b031681565b6200047d620005cb36600462002996565b62000fa4565b6200047d620005e236600462002ac3565b62000fb5565b620004a5620005f936600462002ac3565b62001023565b600b546200043a906001600160a01b031681565b6200047d6200062436600462002958565b6001600160a01b03166000908152600e602052604090205460ff1690565b6200043a62001134565b620004a5620011ef565b620004a56200066736600462002a42565b62001258565b620004a56200067e36600462002958565b620013bb565b620004dc6200069536600462002958565b6001600160a01b03166000908152600e602052604090206001015490565b620004a5620006c4366004620029d9565b6200144c565b620004a5620006db36600462002b13565b620014ac565b620004a5620015b4565b620004a5620015ef565b620004a56200070636600462002a42565b62001652565b620004dc60045481565b620004a56200072736600462002b59565b620017b5565b6200047d6200073e36600462002996565b62001829565b6200047d6200075536600462002b7d565b6200183a565b6200047d6200076c36600462002ac3565b6200186e565b620004a56200078336600462002958565b620018d1565b6000546001600160a01b03166200043a565b620004dc60065481565b6000546200047d90600160a81b900460ff1681565b6005546200043a906001600160a01b031681565b620004a5620007df36600462002bb0565b62001947565b620004a5620007f6366004620029d9565b620019d4565b600d546200043a906001600160a01b031681565b620004a56200082136600462002a42565b62001a3d565b6200047d6200083836600462002958565b62001ba0565b620004a56200084f36600462002958565b62001baf565b620004a56200086636600462002958565b62001c40565b620004a56200087d366004620029d9565b62001cd1565b620004dc60035481565b620004a56200089e366004620029d9565b62001d34565b6009546200043a906001600160a01b031681565b620004dc60075481565b6001546200043a906001600160a01b031681565b62000532620008e736600462002958565b600e602052600090815260409020805460019091015460ff9091169082565b620004a56200091736600462002958565b62001d97565b620004a56200092e366004620029d9565b62001e28565b620004a56200094536600462002958565b62001e9b565b620004a56200095c36600462002a42565b62001f2c565b6000546200047d90600160a01b900460ff1681565b6200047d6200098836600462002b7d565b6200208f565b620004a56200099f36600462002bd3565b6200209f565b620004a5620009b636600462002958565b62002250565b620004a5620009cd36600462002958565b620022c9565b620004a5620009e436600462002b13565b6200236b565b620004a5620009fb36600462002c46565b62002471565b620004a562000a1236600462002b13565b620025d5565b8062000a316001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462000a675760405162461bcd60e51b815260040162000a5e9062002d0a565b60405180910390fd5b600580546001600160a01b0319166001600160a01b0384169081179091556040517fa0186f8bc899c7c5dba82c37e271000c4be4f12e532543e725e3cd7cb4f3eace90600090a25050565b8062000acb6001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462000af85760405162461bcd60e51b815260040162000a5e9062002d0a565b600a80546001600160a01b0319166001600160a01b0384169081179091556040517f8fe1e19823ec53b90ca49e6ee70cc7b8361837b106772800adcbf78b1fa7b37690600090a25050565b600062000b5460148585856200270b565b90505b9392505050565b6000546001600160a01b0316331462000b8b5760405162461bcd60e51b815260040162000a5e9062002d0a565b600881905560405181907fa775c6bfa3840437b72bbc218bd63743d1f26489f65722196a668d39cdf8852590600090a250565b8383838362000bd18184146003620026e4565b6000546001600160a01b0316331462000bfe5760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d215762000c728a8a8a8481811062000c245762000c2462002d3f565b905060200201602081019062000c3b919062002958565b89898581811062000c505762000c5062002d3f565b905060200201602081019062000c67919062002d55565b6014929190620027c7565b88888281811062000c875762000c8762002d3f565b905060200201602081019062000c9e919062002958565b6001600160a01b03168a7f83076f81d1ac0be8c02d99fb46a1c99d231cb9f99d2a99ab580be1bd2789de1c89898581811062000cde5762000cde62002d3f565b905060200201602081019062000cf5919062002d55565b60405162000d04919062002d73565b60405180910390a38062000d188162002d88565b91505062000c01565b50505050505050505050565b6000546001600160a01b0316331462000d5a5760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8181101562000e3b5762000dc48484848481811062000d805762000d8062002d3f565b905060200201602081019062000d97919062002958565b601291906000918252602092835260408083206001600160a01b039092168352925220805460ff19169055565b82828281811062000dd95762000dd962002d3f565b905060200201602081019062000df0919062002958565b6001600160a01b0316847f0397cf86399e6b9f309fcc0f70795ca0229a604b5458f9bcbbb25c0cc081f12760405160405180910390a38062000e328162002d88565b91505062000d5d565b50505050565b8383838362000e548184146003620026e4565b6000546001600160a01b0316331462000e815760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d215762000ef58a8a8a8481811062000ea75762000ea762002d3f565b905060200201602081019062000ebe919062002958565b89898581811062000ed35762000ed362002d3f565b905060200201602081019062000eea919062002d55565b601592919062002805565b88888281811062000f0a5762000f0a62002d3f565b905060200201602081019062000f21919062002958565b6001600160a01b03168a7f0ff1b4998062a278c5fca1afe10221978466ed8cb6938228bef7b012d2d442f089898581811062000f615762000f6162002d3f565b905060200201602081019062000f78919062002d55565b60405162000f87919062002d73565b60405180910390a38062000f9b8162002d88565b91505062000e84565b600062000b5460138585856200270b565b6000805b82811015620010185762000ff38585858481811062000fdc5762000fdc62002d3f565b905060200201602081019062000988919062002958565b6200100357600091505062000b57565b806200100f8162002d88565b91505062000fb9565b506001949350505050565b6000546001600160a01b03163314620010505760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8181101562000e3b57620010bd8484848481811062001076576200107662002d3f565b90506020020160208101906200108d919062002958565b601291906000918252602092835260408083206001600160a01b039092168352925220805460ff19166001179055565b828282818110620010d257620010d262002d3f565b9050602002016020810190620010e9919062002958565b6001600160a01b0316847fc0c66c34a729bf99819880566df94bb16fbf907984ff727431d9724e2d4d9b2a60405160405180910390a3806200112b8162002d88565b91505062001053565b600080546200114f90600160a01b900460ff161582620026e4565b336000908152600f6020526040902054620011709060ff16156001620026e4565b600b60009054906101000a90046001600160a01b03166001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620011c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011ea919062002db2565b905090565b6000546001600160a01b031633146200121c5760405162461bcd60e51b815260040162000a5e9062002d0a565b6000805460ff60a01b1916600160a01b1781556040517f1ee9080f6b55ca44ce58681c8162e6c1ac1c47e1da791a4a1c1ec6186d8af1f39190a1565b838383836200126b8184146003620026e4565b6000546001600160a01b03163314620012985760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d21576200130c8a8a8a84818110620012be57620012be62002d3f565b9050602002016020810190620012d5919062002958565b898985818110620012ea57620012ea62002d3f565b905060200201602081019062001301919062002d55565b6015929190620027c7565b88888281811062001321576200132162002d3f565b905060200201602081019062001338919062002958565b6001600160a01b03168a7ffa79f9a743dba3fa37dbe1df9ef24f8f0b3ce7e2440ec97df34f31c52218b3d089898581811062001378576200137862002d3f565b90506020020160208101906200138f919062002d55565b6040516200139e919062002d73565b60405180910390a380620013b28162002d88565b9150506200129b565b80620013d46001600160a01b03821615156002620026e4565b6000546001600160a01b03163314620014015760405162461bcd60e51b815260040162000a5e9062002d0a565b600d80546001600160a01b0319166001600160a01b0384169081179091556040517f57bc5661977fba9ee4252a74ada8ff31421c03d0a8d5b775a1f4028762e9774190600090a25050565b6000546001600160a01b03163314620014795760405162461bcd60e51b815260040162000a5e9062002d0a565b600381905560405181907f0ae6abd9d11829b1722f4b11e97f2303dcd168f0aab8fe4eef683cdfaff6355090600090a250565b6000546001600160a01b03163314620014d95760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b81811015620015af5762001539838383818110620014fe57620014fe62002d3f565b905060200201602081019062001515919062002958565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b8282828181106200154e576200154e62002d3f565b905060200201602081019062001565919062002958565b6001600160a01b03167fa3bf1872a4a102e6827b0786e27f49a02ecb4988681a1583324856b2b0952dde60405160405180910390a280620015a68162002d88565b915050620014dc565b505050565b6000546001600160a01b03163314620015e15760405162461bcd60e51b815260040162000a5e9062002d0a565b620015ed600062002846565b565b6000546001600160a01b031633146200161c5760405162461bcd60e51b815260040162000a5e9062002d0a565b6000805460ff60a01b191681556040517f0f787a5447331b863baf6cbcd077ec3fdbf62d246ae7f15c356d088adb8fb6749190a1565b83838383620016658184146003620026e4565b6000546001600160a01b03163314620016925760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d2157620017068a8a8a84818110620016b857620016b862002d3f565b9050602002016020810190620016cf919062002958565b898985818110620016e457620016e462002d3f565b9050602002016020810190620016fb919062002d55565b601392919062002805565b8888828181106200171b576200171b62002d3f565b905060200201602081019062001732919062002958565b6001600160a01b03168a7ff77e8bd126ecb0e118c50a633eae6a0c394723b517ecac50cbbf8586a351e99e89898581811062001772576200177262002d3f565b905060200201602081019062001789919062002d55565b60405162001798919062002d73565b60405180910390a380620017ac8162002d88565b91505062001695565b6000546001600160a01b03163314620017e25760405162461bcd60e51b815260040162000a5e9062002d0a565b6000805460ff60a81b1916600160a81b83151590810291909117825560405190917f733b9d9540d3c8f951de9a5515f7f23c39c52e7975ed3b8bd0ab0159f6200d2d91a250565b600062000b5460158585856200270b565b60008054600160a81b900460ff161562001864576200185c6012848462002896565b905062001868565b5060015b92915050565b6000805b828110156200101857620018ac8585858481811062001895576200189562002d3f565b905060200201602081019062000755919062002958565b620018bc57600091505062000b57565b80620018c88162002d88565b91505062001872565b6000546001600160a01b03163314620018fe5760405162461bcd60e51b815260040162000a5e9062002d0a565b6001600160a01b0381166000818152600f6020526040808220805460ff19169055517f55a93c40d1cb4f0bb8c53e6614ae2f651bbbfb64c71f6b559a528191dab0f3dd9190a250565b6000546001600160a01b03163314620019745760405162461bcd60e51b815260040162000a5e9062002d0a565b60008281526010602052604090819020805460ff191660019081178255018290555182907fb37de593af713585d66e0f4b5e0baedf805e33aaacafcca8c61113667b5b9b3d90620019c89084815260200190565b60405180910390a25050565b6000546001600160a01b0316331462001a015760405162461bcd60e51b815260040162000a5e9062002d0a565b60048190556040518181527f49e1bcf16854429389ecca282cbe962da160907bd912f9e4b50c83e72fe8ff62906020015b60405180910390a150565b8383838362001a508184146003620026e4565b6000546001600160a01b0316331462001a7d5760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d215762001af18a8a8a8481811062001aa35762001aa362002d3f565b905060200201602081019062001aba919062002958565b89898581811062001acf5762001acf62002d3f565b905060200201602081019062001ae6919062002d55565b6013929190620027c7565b88888281811062001b065762001b0662002d3f565b905060200201602081019062001b1d919062002958565b6001600160a01b03168a7f6ce596fede92a8f77370d67e2b2b05c73c7bc1ca793ef889914a76bb0c58fd6c89898581811062001b5d5762001b5d62002d3f565b905060200201602081019062001b74919062002d55565b60405162001b83919062002d73565b60405180910390a38062001b978162002d88565b91505062001a80565b600062001868601183620028f1565b8062001bc86001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462001bf55760405162461bcd60e51b815260040162000a5e9062002d0a565b600280546001600160a01b0319166001600160a01b0384169081179091556040517fc95df1555c83961bd1fea13de530b3282ee6aa093bb7190df13203e2620bf8b290600090a25050565b8062001c596001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462001c865760405162461bcd60e51b815260040162000a5e9062002d0a565b600c80546001600160a01b0319166001600160a01b0384169081179091556040517f30bd61955e32bfeab812c0cf877648692e2372026d77ccf4892e306c06b8731690600090a25050565b6000546001600160a01b0316331462001cfe5760405162461bcd60e51b815260040162000a5e9062002d0a565b60078190556040518181527fffb7d7924d30cc40058382514d06e53bbb4d340eb071692a06bd9f5c5a84254e9060200162001a32565b6000546001600160a01b0316331462001d615760405162461bcd60e51b815260040162000a5e9062002d0a565b60068190556040518181527fe05fc3197f87fe66989b4073383c5c8322350970e4afc4981376446d0bd6d03e9060200162001a32565b8062001db06001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462001ddd5760405162461bcd60e51b815260040162000a5e9062002d0a565b600180546001600160a01b0319166001600160a01b0384169081179091556040517f5798bdb81c7675d229a87a6422e70912a8a7a3dfff9e93201e658fb82b85f07e90600090a25050565b6000546001600160a01b0316331462001e555760405162461bcd60e51b815260040162000a5e9062002d0a565b600081815260106020526040808220805460ff191681556001018290555182917f4f94df325703b0d9c549cb800e0e92fafc79568dd830bc747974567ad0e73da691a250565b8062001eb46001600160a01b03821615156002620026e4565b6000546001600160a01b0316331462001ee15760405162461bcd60e51b815260040162000a5e9062002d0a565b600980546001600160a01b0319166001600160a01b0384169081179091556040517f8fcc97fb632d65cb02290fcb3a4ee50d54c5be8dc10af6ffbe974f25d59df0f890600090a25050565b8383838362001f3f8184146003620026e4565b6000546001600160a01b0316331462001f6c5760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b8781101562000d215762001fe08a8a8a8481811062001f925762001f9262002d3f565b905060200201602081019062001fa9919062002958565b89898581811062001fbe5762001fbe62002d3f565b905060200201602081019062001fd5919062002d55565b601492919062002805565b88888281811062001ff55762001ff562002d3f565b90506020020160208101906200200c919062002958565b6001600160a01b03168a7f8ab3faf7b74ea55b8fa40985b6d7bc3670de6a0e3377ff0b44eb046f397a4ba58989858181106200204c576200204c62002d3f565b905060200201602081019062002063919062002d55565b60405162002072919062002d73565b60405180910390a380620020868162002d88565b91505062001f6f565b600062000b576012848462002896565b6000546001600160a01b03163314620020cc5760405162461bcd60e51b815260040162000a5e9062002d0a565b620020db8382146005620026e4565b60005b8381101562002249576001600e600087878581811062002102576200210262002d3f565b905060200201602081019062002119919062002958565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905582828281811062002156576200215662002d3f565b90506020020135600e600087878581811062002176576200217662002d3f565b90506020020160208101906200218d919062002958565b6001600160a01b03168152602081019190915260400160002060010155848482818110620021bf57620021bf62002d3f565b9050602002016020810190620021d6919062002958565b6001600160a01b03167faba696e17ba175f8351d9adadfeae2286e1167c569b8209907d50b406551b81a84848481811062002215576200221562002d3f565b905060200201356040516200222c91815260200190565b60405180910390a280620022408162002d88565b915050620020de565b5050505050565b6000546001600160a01b031633146200227d5760405162461bcd60e51b815260040162000a5e9062002d0a565b6001600160a01b0381166000818152600f6020526040808220805460ff19166001179055517f86f833536a2d3e3def4f5b9df67a4bd47d4f056d97770609d7e670dbe32e3e5d9190a250565b6000546001600160a01b03163314620022f65760405162461bcd60e51b815260040162000a5e9062002d0a565b6001600160a01b0381166200235d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840162000a5e565b620023688162002846565b50565b6000546001600160a01b03163314620023985760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b81811015620015af57600e6000848484818110620023bd57620023bd62002d3f565b9050602002016020810190620023d4919062002958565b6001600160a01b0316815260208101919091526040016000908120805460ff191681556001015582828281811062002410576200241062002d3f565b905060200201602081019062002427919062002958565b6001600160a01b03167f0965b83a81445de7c60b856e9f7192708d2a7448c13d5df800638b40028d555460405160405180910390a280620024688162002d88565b9150506200239b565b600b546200248b906001600160a01b0316156004620026e4565b620024963362002846565b620024a18962001e9b565b620024ac8462000ab2565b620024b78862001baf565b620024c2876200144c565b620024cd8662000a18565b620024d88562001d34565b620024e4606462001cd1565b620024f0605062000b5e565b620024fb83620019d4565b620025076001620017b5565b620025128262001c40565b6200251d81620013bb565b896040516200252c9062002934565b6001600160a01b039091168152602001604051809103906000f08015801562002559573d6000803e3d6000fd5b50600b80546001600160a01b0319166001600160a01b0392909216918217905560405163f2fde38b60e01b815233600482015263f2fde38b90602401600060405180830381600087803b158015620025b057600080fd5b505af1158015620025c5573d6000803e3d6000fd5b5050505050505050505050505050565b6000546001600160a01b03163314620026025760405162461bcd60e51b815260040162000a5e9062002d0a565b60005b81811015620015af576200265f83838381811062002627576200262762002d3f565b90506020020160208101906200263e919062002958565b6001600160a01b03166000908152601160205260409020805460ff19169055565b82828281811062002674576200267462002d3f565b90506020020160208101906200268b919062002958565b6001600160a01b03167f0af40f3aeb02a745f9494210b18ae55d6d6a215ce29c01d99af9c5c05b4227e760405160405180910390a280620026cc8162002d88565b91505062002605565b6000546001600160a01b031690565b8162002707578060405163193106d160e21b815260040162000a5e919062002dd2565b5050565b6000838152602085815260408083206001600160a01b038616845282528083206001600160e01b03198516845290915281205460ff16806200277d57506000848152602086815260408083206001600160a01b038716845282528083206001600160e01b0319845290915290205460ff165b80620027be57506000196000908152602086815260408083206001600160a01b038716845282528083206001600160e01b03198616845290915290205460ff165b95945050505050565b6000928352602093845260408084206001600160a01b0390931684529184528183206001600160e01b0319909116835290925220805460ff19169055565b6000928352602093845260408084206001600160a01b0390931684529184528183206001600160e01b0319909116835290925220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000828152602084815260408083206001600160a01b038516845290915281205460ff168062000b5457506000196000908152602085815260408083206001600160a01b038616845290915290205460ff1690509392505050565b6001600160a01b03811660009081526020839052604081205460ff168062000b575750506001600160a01b03600090815260209290925250604090205460ff1690565b6105298062002dfc83390190565b6001600160a01b03811681146200236857600080fd5b6000602082840312156200296b57600080fd5b813562000b578162002942565b80356001600160e01b0319811681146200299157600080fd5b919050565b600080600060608486031215620029ac57600080fd5b833592506020840135620029c08162002942565b9150620029d06040850162002978565b90509250925092565b600060208284031215620029ec57600080fd5b5035919050565b60008083601f84011262002a0657600080fd5b50813567ffffffffffffffff81111562002a1f57600080fd5b6020830191508360208260051b850101111562002a3b57600080fd5b9250929050565b60008060008060006060868803121562002a5b57600080fd5b85359450602086013567ffffffffffffffff8082111562002a7b57600080fd5b62002a8989838a01620029f3565b9096509450604088013591508082111562002aa357600080fd5b5062002ab288828901620029f3565b969995985093965092949392505050565b60008060006040848603121562002ad957600080fd5b83359250602084013567ffffffffffffffff81111562002af857600080fd5b62002b0686828701620029f3565b9497909650939450505050565b6000806020838503121562002b2757600080fd5b823567ffffffffffffffff81111562002b3f57600080fd5b62002b4d85828601620029f3565b90969095509350505050565b60006020828403121562002b6c57600080fd5b8135801515811462000b5757600080fd5b6000806040838503121562002b9157600080fd5b82359150602083013562002ba58162002942565b809150509250929050565b6000806040838503121562002bc457600080fd5b50508035926020909101359150565b6000806000806040858703121562002bea57600080fd5b843567ffffffffffffffff8082111562002c0357600080fd5b62002c1188838901620029f3565b9096509450602087013591508082111562002c2b57600080fd5b5062002c3a87828801620029f3565b95989497509550505050565b6000806000806000806000806000806101408b8d03121562002c6757600080fd5b8a3562002c748162002942565b995060208b013562002c868162002942565b985060408b013562002c988162002942565b975060608b0135965060808b013562002cb18162002942565b955060a08b0135945060c08b013562002cca8162002942565b935060e08b013592506101008b013562002ce48162002942565b91506101208b013562002cf78162002942565b809150509295989b9194979a5092959850565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121562002d6857600080fd5b62000b578262002978565b6001600160e01b031991909116815260200190565b600060001982141562002dab57634e487b7160e01b600052601160045260246000fd5b5060010190565b60006020828403121562002dc557600080fd5b815162000b578162002942565b60208101604d831062002df557634e487b7160e01b600052602160045260246000fd5b9190529056fe608060405234801561001057600080fd5b5060405161052938038061052983398101604081905261002f91610151565b61003833610047565b61004181610097565b50610181565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6100aa8161014260201b61020a1760201c565b6101205760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f60448201527f6e206973206e6f74206120636f6e747261637400000000000000000000000000606482015260840160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03163b151590565b60006020828403121561016357600080fd5b81516001600160a01b038116811461017a57600080fd5b9392505050565b610399806101906000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633659cfe61461005c5780635c60da1b14610071578063715018a61461009a5780638da5cb5b146100a2578063f2fde38b146100b3575b600080fd5b61006f61006a3660046102fe565b6100c6565b005b6001546001600160a01b03165b6040516001600160a01b03909116815260200160405180910390f35b61006f610139565b6000546001600160a01b031661007e565b61006f6100c13660046102fe565b61016f565b6000546001600160a01b031633146100f95760405162461bcd60e51b81526004016100f09061032e565b60405180910390fd5b61010281610219565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000546001600160a01b031633146101635760405162461bcd60e51b81526004016100f09061032e565b61016d60006102ae565b565b6000546001600160a01b031633146101995760405162461bcd60e51b81526004016100f09061032e565b6001600160a01b0381166101fe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016100f0565b610207816102ae565b50565b6001600160a01b03163b151590565b6001600160a01b0381163b61028c5760405162461bcd60e51b815260206004820152603360248201527f5570677261646561626c65426561636f6e3a20696d706c656d656e746174696f6044820152721b881a5cc81b9bdd08184818dbdb9d1c9858dd606a1b60648201526084016100f0565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561031057600080fd5b81356001600160a01b038116811461032757600080fd5b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260408201526060019056fea26469706673582212202260bbae12767fb976f32cd3a33365bac49793dfb9a61c32efc78b5b4732666564736f6c634300080a0033a26469706673582212204783b5780f916a455949e9118ad6a75502e9e9894d51ac44fd5bfbf213fdcb0264736f6c634300080a0033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.