ETH Price: $3,965.66 (+1.90%)

Token

ERC-20: Derived Ether (dEth)
 

Overview

Max Total Supply

31.127329711124332 dEth

Holders

36

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000035159539044242 dEth

Value
$0.00
0x045617fe2b023634b153f779e0c161cc9d7ebdb9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
dEth

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-10
*/

// File: ../common.5/openzeppelin/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @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: ../common.5/openzeppelin/token/ERC20/ERC20Detailed.sol

pragma solidity ^0.5.0;


/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

// File: ../common.5/openzeppelin/GSN/Context.sol

pragma solidity ^0.5.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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: ../common.5/openzeppelin/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: ../common.5/openzeppelin/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20Mintable}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

// File: contracts/DSMath.sol

pragma solidity ^0.5.17;

contract DSMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x / y;
    }

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x <= y ? x : y;
    }

    function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
        return x >= y ? x : y;
    }

    function imin(int256 x, int256 y) internal pure returns (int256 z) {    
        return x <= y ? x : y;
    }

    function imax(int256 x, int256 y) internal pure returns (int256 z) {
        return x >= y ? x : y;
    }

    uint256 constant WAD = 10**18;
    uint256 constant RAY = 10**27;

    function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }

    function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }

    function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, WAD), y / 2) / y;
    }

    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

// File: contracts/DSProxy.sol

pragma solidity ^0.5.17;

contract DSAuthority {
    function canCall(address src, address dst, bytes4 sig) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority(address indexed authority);
    event LogSetOwner(address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority public authority;
    address public owner;

    constructor() public {
        owner = msg.sender;
        emit LogSetOwner(msg.sender);
    }

    function setOwner(address owner_) public auth {
        owner = owner_;
        emit LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_) public auth {
        authority = authority_;
        emit LogSetAuthority(address(authority));
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, address(this), sig);
        }
    }
}

contract DSNote {
    event LogNote(
        bytes4 indexed sig,
        address indexed guy,
        bytes32 indexed foo,
        bytes32 indexed bar,
        uint256 wad,
        bytes fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}

contract DSProxy is DSAuth, DSNote {
    DSProxyCache public cache; 

    constructor(address _cacheAddr) public {
        require(setCache(_cacheAddr));
    }

    function() external payable {}

    
    function execute(bytes memory _code, bytes memory _data)
        public
        payable
        returns (address target, bytes32 response)
    {
        target = cache.read(_code);
        if (target == address(0)) {
            
            target = cache.write(_code);
        }

        response = execute(target, _data);
    }

    function execute(address _target, bytes memory _data)
        public
        payable
        auth
        note
        returns (bytes32 response)
    {
        require(_target != address(0));
        
        assembly {
            let succeeded := delegatecall(
                sub(gas, 5000),
                _target,
                add(_data, 0x20),
                mload(_data),
                0,
                32
            )
            response := mload(0)
            switch iszero(succeeded)
                case 1 
                {
                    revert(0, 0)
                }
        }
    }

    
    function setCache(address _cacheAddr) public payable auth note returns (bool) {
        require(_cacheAddr != address(0)); 
        cache = DSProxyCache(_cacheAddr); 
        return true;
    }
}

contract DSProxyCache {
    mapping(bytes32 => address) cache;

    function read(bytes memory _code) public view returns (address) {
        bytes32 hash = keccak256(_code);
        return cache[hash];
    }

    function write(bytes memory _code) public returns (address target) {
        assembly {
            target := create(0, add(_code, 0x20), mload(_code))
            switch iszero(extcodesize(target))
                case 1 {
                    
                    revert(0, 0)
                }
        }
        bytes32 hash = keccak256(_code);
        cache[hash] = target;
    }
}

// File: contracts/dEth.sol

// todo:
// add disclaimer

pragma solidity ^0.5.17;





// Number typing guide
// The subsystems we use, use different decimal systems
// Additionally we use different number assumptions for convenience
// RAY -    10**27 - Maker decimal for high precision calculation
// WAD -    10**18 - Maker decimal for token values
// PERC -   10**16 - 1% of a WAD, with 100% == 1 WAD
// CLP -    10**8  - Chainlink price format
// RATIO -  10**32 - Ratio from Maker for a CDP's debt to GDP ratio. 

contract IDSGuard is DSAuthority
{
    function permit(address src, address dst, bytes32 sig) public;
}

contract IDSGuardFactory 
{
    function newGuard() public returns (IDSGuard guard);
}

// Note:
// This is included to avoid method signature collisions between already imported 
// DSProxy's two execute functions. 
contract IDSProxy
{
    function execute(address _target, bytes memory _data) public payable returns (bytes32);
}

contract IMCDSaverProxy
{
    function getCdpDetailedInfo(uint _cdpId) public view returns (uint collateral, uint debt, uint price, bytes32 ilk);
    function getRatio(uint _cdpId, bytes32 _ilk) public view returns (uint);
}

contract IChainLinkPriceOracle
{
    function latestRoundData()
        external
        view
        returns (
            uint80 roundId,
            int256 answer,
            uint256 startedAt,
            uint256 updatedAt,
            uint80 answeredInRound);
}

contract IMakerOracle
{
    function read()
        public 
        view 
        returns(bytes32);
}

contract Oracle
{
    using SafeMath for uint256;

    uint constant ONE_PERC = 10**16; // 1.0%
    uint constant HUNDRED_PERC = 10**18; // 100.0%

    IMakerOracle public makerOracle;
    IChainLinkPriceOracle public daiUsdOracle;
    IChainLinkPriceOracle public ethUsdOracle;

    constructor (
            IMakerOracle _makerOracle, 
            IChainLinkPriceOracle _daiUsdOracle, 
            IChainLinkPriceOracle _ethUsdOracle) 
        public
    {
        makerOracle = _makerOracle;
        daiUsdOracle = _daiUsdOracle;
        ethUsdOracle = _ethUsdOracle;
    }   

    function getEthDaiPrice() 
        public
        view
        returns (uint _price)
    {
        // maker's price comes back as a decimal with 18 places
        uint makerEthUsdPrice = uint(makerOracle.read()); 

        // chainlink's price comes back as a decimal with 8 places
        (,int chainlinkEthUsdPrice,,,) = ethUsdOracle.latestRoundData();
        (,int chainlinkDaiUsdPrice,,,) = daiUsdOracle.latestRoundData();

        // chainlink's price comes back as a decimal with 8 places
        // multiplying two of them, produces 16 places
        // we need it in the WAD format which has 18, therefore .mul(10**2) at the end
        uint chainlinkEthDaiPrice = uint(chainlinkEthUsdPrice).mul(uint(chainlinkDaiUsdPrice)).mul(10**2);
    
        // if the differnce between the ethdai price from chainlink is more than 10% from the
        // maker oracle price, trust the maker oracle 
        uint percDiff = absDiff(makerEthUsdPrice, uint(chainlinkEthDaiPrice))
            .mul(HUNDRED_PERC)
            .div(makerEthUsdPrice);
        return percDiff > ONE_PERC.mul(10) ? 
            makerEthUsdPrice :
            chainlinkEthDaiPrice;
    }

    function absDiff(uint a, uint b)
        internal
        pure
        returns(uint)
    {
        return a > b ? a - b : b - a;
    }
}

// Description:
// This contract tokenizes ownership of a Maker CDP. It does so by allowing anyone to mint new
// tokens in exchange for collateral and issues tokens in proportion to the excess collateral
// that is already in the CDP. It also allows anyone with dEth tokens to redeem these tokens
// in exchange for the excess collateral in the CDP, proportional to their share of total dEth
// tokens.
// Furthermore the contract inherits from DSProxy which allows its CDP to be automated via the 
// DeFiSaver ecosystem. This automation is activated by calling the subscribe() method on the
// DeFiSaver SubscriptionsProxyV2 contract via the execute() method inherited from DSProxy.
// This automation will automatically increase the leverage of the CDP to a target ratio if the
// collateral increases in value and automatically decrease it to the target ratio if the 
// collateral falls in value. 
// SubscriptionsProxyV2 can be viewed here:
// https://etherscan.io/address/0xB78EbeD358Eb5a94Deb08Dc97846002F0632c99A#code
// An audit of the DeFiSaver system can be viewed here:
// https://github.com/DecenterApps/defisaver-contracts/blob/master/audits/Dedaub%20-%20DeFi%20Saver%20Automation%20Audit%20-%20February%202021.pdf

// When activate the automation makes the dEth contract a perpetually levered long position on
// the price of Ether in US dollars. 

// Details:
// The contract charges a protocol fee that is paid out to contract called the gulper. The fee
// is fixed at 0.9%. 
// Due to the sometimes extreme gas fees required to run the DefiSaver automations, an 
// additional automation fee is charged to anyone entering or exiting the system. This fee can 
// be increased or decreased as needed to compensate existing participants.
// There is a riskLimit parameter that prevents the system from acquiring too much collateral 
// before it has established a record of safety. This can also be used to prevent new 
// participants from minting new dEth in case an upgrade is necessary and dEth tokens need to 
// be migrated to a new version.
// The minRedemptionRatio parameter prevents too much collateral being removed at once from
// the CDP before DefiSaver has the opportunity to return the CDP to its target parameters. 

// Note: 
// What is not apparent explicitly in this contract is how calls to the "auth" methods are to
// be dealt with. All auth methods will initially be owned by the owner key of this contract. 
// The intent is to keep it under the control of the owner key until some history of use can be
// built up to increase confidence that the contract is indeed safe and stable in the wild.
// Thereafter the owner key will be given to an OpenZeppelin TimelockController contract with a
// 48 hour delay. The TimelockController in turn will be owned by the FoundryDAO and controlled
// via it's governance structures. This will give any participants at least 48 hours to take 
// action, should any change be unpalatable. 

// Note: 
// Since defisaver automation can be upgraded and since older versions of their subscription 
// contract are not guarenteed to be updated by their offchain services and since the calling 
// of the automation script involves passing in a custom contract to where a delgate call is
// made; it is safer to rather execute the automation script via an execute(_address, _data) 
// call inherited from DSProxy through the auth system.

contract dEth is 
    ERC20Detailed, 
    ERC20,
    DSMath,
    DSProxy
{
    using SafeMath for uint;

    string constant terms = "By interacting with this contract, you agree to be bound by the terms of service found at https://www.FoundryDao.com/dEthTerms/";

    uint constant ONE_PERC = 10**16;                    //   1.0% 
    uint constant HUNDRED_PERC = 10**18;                // 100.0%

    uint constant PROTOCOL_FEE_PERC = 9*10**15;         //   0.9%
    
    address payable public gulper;
    uint public cdpId;
    
    // Note:
    // Since these items are not available on test net and represent interactions
    // with the larger DeFi ecosystem, they are directly addressed here with the understanding
    // that testing occurs against simulated forks of the the Ethereum mainnet. 
    address constant public makerManager = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39;
    address constant public ethGemJoin = 0x2F0b23f53734252Bda2277357e97e1517d6B042A;
    address constant public saverProxy = 0xC563aCE6FACD385cB1F34fA723f412Cc64E63D47;
    address constant public saverProxyActions = 0x82ecD135Dce65Fbc6DbdD0e4237E0AF93FFD5038;

    Oracle public oracle;

    // automation variables
    uint public minRedemptionRatio; // the min % excess collateral that must remain after any ETH redeem action
    uint public automationFeePerc;  // the fee that goes to the collateral pool, on entry or exit, to compensate for potentially triggering a boost or redeem
    
    // Note:
    // riskLimit sets the maximum amount of excess collateral Eth the contract will place at risk
    // When exceeded it is no longer possible to issue dEth via the squander function
    // This can also be used to retire the contract by setting it to 0
    uint public riskLimit; 
    
    constructor(
            address payable _gulper,
            uint _cdpId,
            Oracle _oracle,
            address _initialRecipient,
            address _automationAuthority)
        public
        DSProxy(0x271293c67E2D3140a0E9381EfF1F9b01E07B0795) //_proxyCache on mainnet
        ERC20Detailed("Derived Ether", "dEth", 18)
    {
        gulper = _gulper;
        cdpId = _cdpId;

        oracle = _oracle;

        // Initial values of automation variables
        minRedemptionRatio = uint(160).mul(ONE_PERC).mul(10**18);
        automationFeePerc = ONE_PERC; // 1.0%
        riskLimit = 1000*10**18;      // sets an initial limit of 1000 ETH that the contract will risk. 

        // distributes the initial supply of dEth to the initial recipient at 1 ETH to 1 dEth
        uint excess = getExcessCollateral();
        _mint(_initialRecipient, excess);

        // set the automation authority to make sure the parameters can be adjusted later on
        IDSGuard guard = IDSGuardFactory(0x5a15566417e6C1c9546523066500bDDBc53F88C7).newGuard(); // DSGuardFactory
        guard.permit(
            _automationAuthority,
            address(this),
            bytes4(keccak256("changeSettings(uint256,uint256,uint256)")));
        setAuthority(guard);

        require(
            authority.canCall(
                _automationAuthority, 
                address(this), 
                bytes4(keccak256("changeSettings(uint256,uint256,uint256)"))),
            "guard setting failed");
    }

    function changeGulper(address payable _newGulper)
        public
        auth
    {
        gulper = _newGulper;
    }

    function giveCDPToDSProxy(address _dsProxy)
        public
        auth
    {
        bytes memory giveProxyCall = abi.encodeWithSignature(
            "give(address,uint256,address)", 
            makerManager, 
            cdpId, 
            _dsProxy);
        
        IDSProxy(address(this)).execute(saverProxyActions, giveProxyCall);

        // removes the ability to mint more dEth tokens
        riskLimit = 0;
    }

    function getCollateral()
        public
        view
        returns(uint _priceRAY, uint _totalCollateral, uint _debt, uint _collateralDenominatedDebt, uint _excessCollateral)
    {
        _priceRAY = getCollateralPriceRAY();
        (_totalCollateral, _debt,,) = IMCDSaverProxy(saverProxy).getCdpDetailedInfo(cdpId);
        _collateralDenominatedDebt = rdiv(_debt, _priceRAY);
        _excessCollateral = sub(_totalCollateral, _collateralDenominatedDebt);
    }

    function getCollateralPriceRAY()
        public
        view
        returns (uint _priceRAY)
    {
        // we multiply by 10^9 to cast the price to a RAY number as used by the Maker CDP
        _priceRAY = oracle.getEthDaiPrice().mul(10**9);
    }

    function getExcessCollateral()
        public
        view
        returns(uint _excessCollateral)
    {
        (,,,, _excessCollateral) = getCollateral();
    }

    function getRatio()
        public
        view
        returns(uint _ratio)
    {
        (,,,bytes32 ilk) = IMCDSaverProxy(saverProxy).getCdpDetailedInfo(cdpId);
        _ratio = IMCDSaverProxy(saverProxy).getRatio(cdpId, ilk);
    }

    function calculateIssuanceAmount(uint _suppliedCollateral)
        public
        view
        returns (
            uint _protocolFee,
            uint _automationFee,
            uint _actualCollateralAdded,
            uint _accreditedCollateral,
            uint _tokensIssued)
    {
        _protocolFee = _suppliedCollateral.mul(PROTOCOL_FEE_PERC).div(HUNDRED_PERC);
        _automationFee = _suppliedCollateral.mul(automationFeePerc).div(HUNDRED_PERC);
        _actualCollateralAdded = _suppliedCollateral.sub(_protocolFee); 
        _accreditedCollateral = _actualCollateralAdded.sub(_automationFee); 
        uint newTokenSupplyPerc = _accreditedCollateral.mul(HUNDRED_PERC).div(getExcessCollateral());
        _tokensIssued = totalSupply().mul(newTokenSupplyPerc).div(HUNDRED_PERC);
    }

    event Issued(
        address _receiver, 
        uint _suppliedCollateral,
        uint _protocolFee,
        uint _automationFee,
        uint _actualCollateralAdded,
        uint _accreditedCollateral,
        uint _tokensIssued);

    // Note: 
    // This method should have been called issue(address _receiver), but will remain this for meme value
    function squanderMyEthForWorthlessBeansAndAgreeToTerms(address _receiver)
        payable
        public
    { 
        // Goals:
        // 1. deposit eth into the vault 
        // 2. give the holder a claim on the vault for later withdrawal to the address they choose 
        // 3. pay the protocol

        require(getExcessCollateral() < riskLimit.add(msg.value), "risk limit exceeded");

        (uint protocolFee, 
        uint automationFee, 
        uint collateralToLock, 
        uint accreditedCollateral, 
        uint tokensToIssue)  = calculateIssuanceAmount(msg.value);

        bytes memory lockETHproxyCall = abi.encodeWithSignature(
            "lockETH(address,address,uint256)", 
            makerManager, 
            ethGemJoin,
            cdpId);
        IDSProxy(address(this)).execute.value(collateralToLock)(saverProxyActions, lockETHproxyCall);
        
        (bool protocolFeePaymentSuccess,) = gulper.call.value(protocolFee)("");
        require(protocolFeePaymentSuccess, "protocol fee transfer to gulper failed");

        // Note: 
        // The automationFee is left in the CDP to cover the gas implications of leaving or joining dEth
        // This is why it is not explicitly used in this method. 

        _mint(_receiver, tokensToIssue);
        
        emit Issued(
            _receiver, 
            msg.value, 
            protocolFee,
            automationFee, 
            collateralToLock, 
            accreditedCollateral,
            tokensToIssue);
    }

    function calculateRedemptionValue(uint _tokensToRedeem)
        public
        view
        returns (
            uint _protocolFee,
            uint _automationFee,
            uint _collateralRedeemed, 
            uint _collateralReturned)
    {
        // comment: a full check against the minimum ratio might be added in a future version
        // for now keep in mind that this function may return values greater than those that 
        // could be executed in one transaction. 
        require(_tokensToRedeem <= totalSupply(), "_tokensToRedeem exceeds totalSupply()");
        uint redeemTokenSupplyPerc = _tokensToRedeem.mul(HUNDRED_PERC).div(totalSupply());
        uint collateralAffected = getExcessCollateral().mul(redeemTokenSupplyPerc).div(HUNDRED_PERC);
        _protocolFee = collateralAffected.mul(PROTOCOL_FEE_PERC).div(HUNDRED_PERC);
        _automationFee = collateralAffected.mul(automationFeePerc).div(HUNDRED_PERC);
        _collateralRedeemed = collateralAffected.sub(_automationFee); // how much capital should exit the dEth contract
        _collateralReturned = _collateralRedeemed.sub(_protocolFee); // how much capital should return to the user
    }

    event Redeemed(
        address _redeemer,
        address _receiver, 
        uint _tokensRedeemed,
        uint _protocolFee,
        uint _automationFee,
        uint _collateralRedeemed,
        uint _collateralReturned);

    function redeem(address _receiver, uint _tokensToRedeem)
        public
    {
        // Goals:
        // 1. if the _tokensToRedeem being claimed does not drain the vault to below 160%
        // 2. pull out the amount of ether the senders' tokens entitle them to and send it to them

        (uint protocolFee, 
        uint automationFee, 
        uint collateralToFree,
        uint collateralToReturn) = calculateRedemptionValue(_tokensToRedeem);

        bytes memory freeETHProxyCall = abi.encodeWithSignature(
            "freeETH(address,address,uint256,uint256)",
            makerManager,
            ethGemJoin,
            cdpId,
            collateralToFree);
        IDSProxy(address(this)).execute(saverProxyActions, freeETHProxyCall);

        _burn(msg.sender, _tokensToRedeem);

        (bool protocolFeePaymentSuccess,) = gulper.call.value(protocolFee)("");
        require(protocolFeePaymentSuccess, "protocol fee transfer to gulper failed");

        // note: the automationFee is left in the CDP to cover the gas implications of leaving or joining dEth
        
        (bool payoutSuccess,) = _receiver.call.value(collateralToReturn)("");
        require(payoutSuccess, "eth send to receiver reverted");

        // this ensures that the CDP will be boostable by DefiSaver before it can be bitten
        // to prevent bites, getRatio() doesn't use oracle but the price set in the MakerCDP system 
        require(getRatio() >= minRedemptionRatio, "cannot violate collateral safety ratio");

        emit Redeemed(  
            msg.sender,
            _receiver, 
            _tokensToRedeem,
            protocolFee,
            automationFee,
            collateralToFree,
            collateralToReturn);
    }
    
    event SettingsChanged(
            uint _minRedemptionRatio,
            uint _automationFeePerc,
            uint _riskLimit);

    function changeSettings(
            uint _minRedemptionRatio,
            uint _automationFeePerc,
            uint _riskLimit)
        public
        auth
    {
        minRedemptionRatio = _minRedemptionRatio.mul(ONE_PERC).mul(10**18);
        automationFeePerc = _automationFeePerc;
        riskLimit = _riskLimit;

        emit SettingsChanged(
            minRedemptionRatio,
            automationFeePerc,
            riskLimit);
    }
}

// File: contracts/DeployMainnet_dEth.sol

contract DeployMainnet_dEth 
{
    event LogContracts(Oracle _oracle, dEth _dEth);

    constructor()
        public
    {
        Oracle oracle = new Oracle(
            IMakerOracle(0x729D19f657BD0614b4985Cf1D82531c67569197B),                 //IMakerOracle _makerOracle,
            IChainLinkPriceOracle(0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9),        //_daiUsdOracle
            IChainLinkPriceOracle(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419));       //_ethUsdOracle

        dEth mainnet_dEth = new dEth(
            0xD7DFA44E3dfeB1A1E65544Dc54ee02B9CbE1e66d,                 //_gulper,
            18963,                                                      //_cdpId,
            oracle,                                                     //_oracle

            0xB7c6bB064620270F8c1daA7502bCca75fC074CF4,                 //_initialRecipient
            0x93fE7D1d24bE7CB33329800ba2166f4D28Eaa553);                //_foundryTreasury)

        mainnet_dEth.setOwner(msg.sender);

        emit LogContracts(oracle, mainnet_dEth);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address payable","name":"_gulper","type":"address"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"contract Oracle","name":"_oracle","type":"address"},{"internalType":"address","name":"_initialRecipient","type":"address"},{"internalType":"address","name":"_automationAuthority","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_suppliedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_automationFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_actualCollateralAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_accreditedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokensIssued","type":"uint256"}],"name":"Issued","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"guy","type":"address"},{"indexed":true,"internalType":"bytes32","name":"foo","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"bar","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_redeemer","type":"address"},{"indexed":false,"internalType":"address","name":"_receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokensRedeemed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_protocolFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_automationFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collateralRedeemed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_collateralReturned","type":"uint256"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_minRedemptionRatio","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_automationFeePerc","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_riskLimit","type":"uint256"}],"name":"SettingsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"internalType":"contract DSAuthority","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"automationFeePerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cache","outputs":[{"internalType":"contract DSProxyCache","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_suppliedCollateral","type":"uint256"}],"name":"calculateIssuanceAmount","outputs":[{"internalType":"uint256","name":"_protocolFee","type":"uint256"},{"internalType":"uint256","name":"_automationFee","type":"uint256"},{"internalType":"uint256","name":"_actualCollateralAdded","type":"uint256"},{"internalType":"uint256","name":"_accreditedCollateral","type":"uint256"},{"internalType":"uint256","name":"_tokensIssued","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokensToRedeem","type":"uint256"}],"name":"calculateRedemptionValue","outputs":[{"internalType":"uint256","name":"_protocolFee","type":"uint256"},{"internalType":"uint256","name":"_automationFee","type":"uint256"},{"internalType":"uint256","name":"_collateralRedeemed","type":"uint256"},{"internalType":"uint256","name":"_collateralReturned","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cdpId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_newGulper","type":"address"}],"name":"changeGulper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minRedemptionRatio","type":"uint256"},{"internalType":"uint256","name":"_automationFeePerc","type":"uint256"},{"internalType":"uint256","name":"_riskLimit","type":"uint256"}],"name":"changeSettings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethGemJoin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bytes32","name":"response","type":"bytes32"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_code","type":"bytes"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes32","name":"response","type":"bytes32"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getCollateral","outputs":[{"internalType":"uint256","name":"_priceRAY","type":"uint256"},{"internalType":"uint256","name":"_totalCollateral","type":"uint256"},{"internalType":"uint256","name":"_debt","type":"uint256"},{"internalType":"uint256","name":"_collateralDenominatedDebt","type":"uint256"},{"internalType":"uint256","name":"_excessCollateral","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCollateralPriceRAY","outputs":[{"internalType":"uint256","name":"_priceRAY","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getExcessCollateral","outputs":[{"internalType":"uint256","name":"_excessCollateral","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRatio","outputs":[{"internalType":"uint256","name":"_ratio","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dsProxy","type":"address"}],"name":"giveCDPToDSProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gulper","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"makerManager","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minRedemptionRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_tokensToRedeem","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"riskLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saverProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"saverProxyActions","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract DSAuthority","name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_cacheAddr","type":"address"}],"name":"setCache","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"squanderMyEthForWorthlessBeansAndAgreeToTerms","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200351b3803806200351b833981810160405260a08110156200003757600080fd5b508051602080830151604080850151606086015160809096015182518084018452600d81526c2232b934bb32b21022ba3432b960991b818701908152845180860190955260048552630c88ae8d60e31b968501969096528051969794969295919373271293c67e2d3140a0e9381eff1f9b01e07b07959391929091601291620000c4916000919062000a88565b508151620000da90600190602085019062000a88565b506002805460ff90921660ff199092169190911790555050600780546001600160a01b031916339081179091556040517fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a262000144816001600160e01b036200045516565b6200014e57600080fd5b50600980546001600160a01b03199081166001600160a01b0388811691909117909255600a869055600b8054909116918516919091179055620001c7670de0b6b3a7640000620001b360a0662386f26fc100006200051e602090811b620022e017901c565b6200051e60201b620022e01790919060201c565b600c55662386f26fc10000600d55683635c9adc5dea00000600e556000620001f76001600160e01b036200058516565b90506200020e83826001600160e01b03620005a316565b6000735a15566417e6c1c9546523066500bddbc53f88c76001600160a01b03166365688cc96040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200026057600080fd5b505af115801562000275573d6000803e3d6000fd5b505050506040513d60208110156200028c57600080fd5b50516040519091506001600160a01b0382169063cbeea68c9085903090806027620034f48239604080519182900360270182206001600160e01b031960e088901b811684526001600160a01b0396871660048501529490951660248301529290931660448401525051606480830192600092919082900301818387803b1580156200031657600080fd5b505af11580156200032b573d6000803e3d6000fd5b505050506200034081620006a860201b60201c565b6006546040516001600160a01b039091169063b70096139085903090806027620034f48239604080519182900360270182206001600160e01b031960e088901b811684526001600160a01b03968716600485015294909516602483015292909316604484015250516064808301926020929190829003018186803b158015620003c857600080fd5b505afa158015620003dd573d6000803e3d6000fd5b505050506040513d6020811015620003f457600080fd5b505162000448576040805162461bcd60e51b815260206004820152601460248201527f67756172642073657474696e67206661696c6564000000000000000000000000604482015290519081900360640190fd5b5050505050505062000b2d565b600062000477336001600160e01b03198335166001600160e01b036200072316565b6200048157600080fd5b604080513480825260208201838152369383018490526004359360243593849386933393600080356001600160e01b03191694909260608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a46001600160a01b038416620004f657600080fd5b600880546001600160a01b0386166001600160a01b0319909116179055600192505050919050565b6000826200052f575060006200057f565b828202828482816200053d57fe5b04146200057c5760405162461bcd60e51b8152600401808060200182810382526021815260200180620034d36021913960400191505060405180910390fd5b90505b92915050565b60006200059a6001600160e01b036200081416565b95945050505050565b6001600160a01b038216620005ff576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200061b81600554620008f960201b620020a61790919060201c565b6005556001600160a01b03821660009081526003602090815260409091205462000650918390620020a6620008f9821b17901c565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b620006c9336001600160e01b0319600035166001600160e01b036200072316565b620006d357600080fd5b600680546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b60006001600160a01b03831630141562000740575060016200057f565b6007546001600160a01b038481169116141562000760575060016200057f565b6006546001600160a01b03166200077a575060006200057f565b6006546040805163b700961360e01b81526001600160a01b0386811660048301523060248301526001600160e01b0319861660448301529151919092169163b7009613916064808301926020929190829003018186803b158015620007de57600080fd5b505afa158015620007f3573d6000803e3d6000fd5b505050506040513d60208110156200080a57600080fd5b505190506200057f565b6000808080806200082d6001600160e01b036200095416565b945073c563ace6facd385cb1f34fa723f412cc64e63d476001600160a01b031663e304c608600a546040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b1580156200088a57600080fd5b505afa1580156200089f573d6000803e3d6000fd5b505050506040513d6080811015620008b657600080fd5b5080516020909101519094509250620008d983866001600160e01b03620009f416565b9150620008f084836001600160e01b0362000a3f16565b90509091929394565b6000828201838110156200057c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000620009ef633b9aca00600b60009054906101000a90046001600160a01b03166001600160a01b031663b0513c766040518163ffffffff1660e01b815260040160206040518083038186803b158015620009ae57600080fd5b505afa158015620009c3573d6000803e3d6000fd5b505050506040513d6020811015620009da57600080fd5b5051906200051e602090811b620022e017901c565b905090565b60008162000a2f62000a1c856b033b2e3c9fd0803ce80000006001600160e01b0362000a5016565b600285046001600160e01b0362000a7716565b8162000a3757fe5b049392505050565b808203828111156200057f57600080fd5b600081158062000a6d5750508082028282828162000a6a57fe5b04145b6200057f57600080fd5b808201828110156200057f57600080fd5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000acb57805160ff191683800117855562000afb565b8280016001018555821562000afb579182015b8281111562000afb57825182559160200191906001019062000ade565b5062000b0992915062000b0d565b5090565b62000b2a91905b8082111562000b09576000815560010162000b14565b90565b6129968062000b3d6000396000f3fe60806040526004361061023b5760003560e01c806370a082311161012e578063a626c089116100ab578063dd62ed3e1161006f578063dd62ed3e146109c8578063ea65212f14610a03578063ebc723cb14610a36578063ec1ebd7a14610a4b578063fb7f267214610a605761023b565b8063a626c0891461091a578063a9059cbb14610950578063b51fa45a14610989578063bf7e214f1461099e578063c70c82db146109b35761023b565b80638da5cb5b116100f25780638da5cb5b1461087c578063948f50761461089157806395d89b41146108b7578063a457c2d7146108cc578063a4e3c311146109055761023b565b806370a08231146107b95780637a9e5e4b146107ec5780637ae0a3d51461081f5780637dc0d1d0146108345780637edd39bc146108495761023b565b80631f6a1eb9116101bc5780634a1a066b116101805780634a1a066b146107255780635ac0f2bb1461073a5780635c1548fb1461074f57806360c7d2951461078f57806364a0a12f146107a45761023b565b80631f6a1eb91461051957806323b872dd14610669578063313ce567146106ac57806339509351146106d7578063470052cc146107105761023b565b806313af40351161020357806313af40351461039257806318160ddd146103c55780631a82c851146103da5780631cff79cd1461042a5780631e9a6950146104e05761023b565b8063024c23361461023d57806306fdde0314610264578063095ea7b3146102ee5780630c7305841461033b57806310861ac41461036c575b005b34801561024957600080fd5b50610252610a8a565b60408051918252519081900360200190f35b34801561027057600080fd5b50610279610a90565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b357818101518382015260200161029b565b50505050905090810190601f1680156102e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102fa57600080fd5b506103276004803603604081101561031157600080fd5b506001600160a01b038135169060200135610b26565b604080519115158252519081900360200190f35b34801561034757600080fd5b50610350610b44565b604080516001600160a01b039092168252519081900360200190f35b61023b6004803603602081101561038257600080fd5b50356001600160a01b0316610b53565b34801561039e57600080fd5b5061023b600480360360208110156103b557600080fd5b50356001600160a01b0316610e8b565b3480156103d157600080fd5b50610252610efa565b3480156103e657600080fd5b50610404600480360360208110156103fd57600080fd5b5035610f00565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102526004803603604081101561044057600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061101c945050505050565b3480156104ec57600080fd5b5061023b6004803603604081101561050357600080fd5b506001600160a01b0381351690602001356110e5565b6106466004803603604081101561052f57600080fd5b81019060208101813564010000000081111561054a57600080fd5b82018360208201111561055c57600080fd5b8035906020019184600183028401116401000000008311171561057e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184600183028401116401000000008311171561060557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061145d945050505050565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561067557600080fd5b506103276004803603606081101561068c57600080fd5b506001600160a01b03813581169160208101359091169060400135611637565b3480156106b857600080fd5b506106c16116c4565b6040805160ff9092168252519081900360200190f35b3480156106e357600080fd5b50610327600480360360408110156106fa57600080fd5b506001600160a01b0381351690602001356116cd565b34801561071c57600080fd5b50610252611721565b34801561073157600080fd5b506102526117b6565b34801561074657600080fd5b506102526117bc565b34801561075b57600080fd5b506107646117c2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561079b57600080fd5b50610350611885565b3480156107b057600080fd5b50610350611894565b3480156107c557600080fd5b50610252600480360360208110156107dc57600080fd5b50356001600160a01b03166118ac565b3480156107f857600080fd5b5061023b6004803603602081101561080f57600080fd5b50356001600160a01b03166118c7565b34801561082b57600080fd5b50610350611936565b34801561084057600080fd5b5061035061194e565b34801561085557600080fd5b5061023b6004803603602081101561086c57600080fd5b50356001600160a01b031661195d565b34801561088857600080fd5b5061035061199e565b610327600480360360208110156108a757600080fd5b50356001600160a01b03166119ad565b3480156108c357600080fd5b50610279611a6a565b3480156108d857600080fd5b50610327600480360360408110156108ef57600080fd5b506001600160a01b038135169060200135611aca565b34801561091157600080fd5b50610252611b38565b34801561092657600080fd5b5061023b6004803603606081101561093d57600080fd5b5080359060208101359060400135611b4b565b34801561095c57600080fd5b506103276004803603604081101561097357600080fd5b506001600160a01b038135169060200135611be0565b34801561099557600080fd5b50610252611bf4565b3480156109aa57600080fd5b50610350611bfa565b3480156109bf57600080fd5b50610350611c09565b3480156109d457600080fd5b50610252600480360360408110156109eb57600080fd5b506001600160a01b0381358116916020013516611c21565b348015610a0f57600080fd5b5061023b60048036036020811015610a2657600080fd5b50356001600160a01b0316611c4c565b348015610a4257600080fd5b50610350611dc3565b348015610a5757600080fd5b50610252611ddb565b348015610a6c57600080fd5b5061076460048036036020811015610a8357600080fd5b5035611ef9565b600d5481565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3a610b33611fb6565b8484611fba565b5060015b92915050565b6009546001600160a01b031681565b600e54610b66903463ffffffff6120a616565b610b6e611b38565b10610bb6576040805162461bcd60e51b81526020600482015260136024820152721c9a5cdac81b1a5b5a5d08195e18d959591959606a1b604482015290519081900360640190fd5b6000806000806000610bc734611ef9565b945094509450945094506060735ef30b9986345249bc32d8928b7ee64de9435e39732f0b23f53734252bda2277357e97e1517d6b042a600a5460405160240180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050604051602081830303815290604052631c40b82160e31b6001600160e01b0319166020820180516001600160e01b0383818316178352505050509050306001600160a01b0316631cff79cd857382ecd135dce65fbc6dbdd0e4237e0af93ffd5038846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d08578181015183820152602001610cf0565b50505050905090810190601f168015610d355780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b158015610d5457600080fd5b505af1158015610d68573d6000803e3d6000fd5b50505050506040513d6020811015610d7f57600080fd5b50506009546040516000916001600160a01b03169088908381818185875af1925050503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610e135760405162461bcd60e51b81526004018080602001828103825260268152602001806127af6026913960400191505060405180910390fd5b610e1d8884612107565b604080516001600160a01b038a168152346020820152808201899052606081018890526080810187905260a0810186905260c0810185905290517f2982905875ae47bb92b8b1c9373efd845be807ed05fb869e3bbeab0d7a3b9ca09181900360e00190a15050505050505050565b610ea1336000356001600160e01b0319166121f9565b610eaa57600080fd5b600780546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b60055490565b600080600080610f0e610efa565b851115610f4c5760405162461bcd60e51b81526004018080602001828103825260258152602001806127f76025913960400191505060405180910390fd5b6000610f7d610f59610efa565b610f7188670de0b6b3a764000063ffffffff6122e016565b9063ffffffff61233916565b90506000610fa5670de0b6b3a7640000610f7184610f99611b38565b9063ffffffff6122e016565b9050610fca670de0b6b3a7640000610f7183661ff973cafa800063ffffffff6122e016565b9550610fed670de0b6b3a7640000610f71600d54846122e090919063ffffffff16565b9450610fff818663ffffffff61237b16565b9350611011848763ffffffff61237b16565b925050509193509193565b6000611034336000356001600160e01b0319166121f9565b61103d57600080fd5b604080513480825260208201838152369383018490526004359360243593849386933393600080356001600160e01b03191694909260608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a46001600160a01b0385166110b157600080fd5b60206000855160208701886113885a03f460005193508015600181146110d6576110db565b600080fd5b5050505092915050565b6000806000806110f485610f00565b600a5460408051735ef30b9986345249bc32d8928b7ee64de9435e39602480830191909152732f0b23f53734252bda2277357e97e1517d6b042a60448084019190915260648084019590955260848084018890528451808503909101815260a490930184526020830180516001600160e01b0316637b5a3b4360e01b1781528451631cff79cd60e01b81527382ecd135dce65fbc6dbdd0e4237e0af93ffd50386004820181815294820196875285519382019390935284519a9e50989c50969a5094985090963096631cff79cd968995939493919091019180838360005b838110156111ea5781810151838201526020016111d2565b50505050905090810190601f1680156112175780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15801561123757600080fd5b505af115801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b5061126e905033876123bd565b6009546040516000916001600160a01b03169087908381818185875af1925050503d80600081146112bb576040519150601f19603f3d011682016040523d82523d6000602084013e6112c0565b606091505b50509050806113005760405162461bcd60e51b81526004018080602001828103825260268152602001806127af6026913960400191505060405180910390fd5b6040516000906001600160a01b038a169085908381818185875af1925050503d806000811461134b576040519150601f19603f3d011682016040523d82523d6000602084013e611350565b606091505b50509050806113a6576040805162461bcd60e51b815260206004820152601d60248201527f6574682073656e6420746f207265636569766572207265766572746564000000604482015290519081900360640190fd5b600c546113b1611ddb565b10156113ee5760405162461bcd60e51b81526004018080602001828103825260268152602001806128646026913960400191505060405180910390fd5b604080513381526001600160a01b038b1660208201528082018a9052606081018990526080810188905260a0810187905260c0810186905290517f347ee37487f7d4fe0b4d3777823c6a71c110e3df43f4f3d35356cf6909e9abdb9181900360e00190a1505050505050505050565b6008546040516322fd145760e21b815260206004820181815285516024840152855160009485946001600160a01b0390911693638bf4515c93899390928392604490910191908501908083838b5b838110156114c35781810151838201526020016114ab565b50505050905090810190601f1680156114f05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d602081101561153757600080fd5b505191506001600160a01b03821661162457600854604051633f6861d960e11b81526020600482018181528751602484015287516001600160a01b0390941693637ed0c3b293899383926044909201919085019080838360005b838110156115a9578181015183820152602001611591565b50505050905090810190601f1680156115d65780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b505050506040513d602081101561161f57600080fd5b505191505b61162e828461101c565b90509250929050565b60006116448484846124b9565b6116ba84611650611fb6565b6116b5856040518060600160405280602881526020016128ab602891396001600160a01b038a1660009081526004602052604081209061168e611fb6565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61261716565b611fba565b5060019392505050565b60025460ff1690565b6000610b3a6116da611fb6565b846116b585600460006116eb611fb6565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6120a616565b60006117b1633b9aca00600b60009054906101000a90046001600160a01b03166001600160a01b031663b0513c766040518163ffffffff1660e01b815260040160206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d60208110156117a357600080fd5b50519063ffffffff6122e016565b905090565b600a5481565b600c5481565b60008060008060006117d2611721565b945073c563ace6facd385cb1f34fa723f412cc64e63d476001600160a01b031663e304c608600a546040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561182e57600080fd5b505afa158015611842573d6000803e3d6000fd5b505050506040513d608081101561185857600080fd5b508051602090910151909450925061187083866126ae565b915061187c84836126e2565b90509091929394565b6008546001600160a01b031681565b732f0b23f53734252bda2277357e97e1517d6b042a81565b6001600160a01b031660009081526003602052604090205490565b6118dd336000356001600160e01b0319166121f9565b6118e657600080fd5b600680546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b600b546001600160a01b031681565b611973336000356001600160e01b0319166121f9565b61197c57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b60006119c5336000356001600160e01b0319166121f9565b6119ce57600080fd5b604080513480825260208201838152369383018490526004359360243593849386933393600080356001600160e01b03191694909260608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a46001600160a01b038416611a4257600080fd5b600880546001600160a01b0386166001600160a01b0319909116179055600192505050919050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b1c5780601f10610af157610100808354040283529160200191610b1c565b6000610b3a611ad7611fb6565b846116b58560405180606001604052806025815260200161293d6025913960046000611b01611fb6565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61261716565b6000611b426117c2565b95945050505050565b611b61336000356001600160e01b0319166121f9565b611b6a57600080fd5b611b8d670de0b6b3a7640000610f9985662386f26fc1000063ffffffff6122e016565b600c819055600d839055600e8290556040805191825260208201849052818101839052517f22456d468d73d3b914cf66a6630106f3187cdc17d8a99235d058f40d47f172c99181900360600190a1505050565b6000610b3a611bed611fb6565b84846124b9565b600e5481565b6006546001600160a01b031681565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b611c62336000356001600160e01b0319166121f9565b611c6b57600080fd5b600a5460408051735ef30b9986345249bc32d8928b7ee64de9435e396024808301919091526044808301949094526001600160a01b038516606480840191909152835180840382018152608490930184526020830180516001600160e01b0316631d10f23160e01b1781528451631cff79cd60e01b81527382ecd135dce65fbc6dbdd0e4237e0af93ffd503860048201818152948201968752855197820197909752845194963096631cff79cd969195899590949193019180838360005b83811015611d41578181015183820152602001611d29565b50505050905090810190601f168015611d6e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b505050506040513d6020811015611db857600080fd5b50506000600e555050565b73c563ace6facd385cb1f34fa723f412cc64e63d4781565b60008073c563ace6facd385cb1f34fa723f412cc64e63d476001600160a01b031663e304c608600a546040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b158015611e3857600080fd5b505afa158015611e4c573d6000803e3d6000fd5b505050506040513d6080811015611e6257600080fd5b5060600151600a5460408051630146a21760e61b81526004810192909252602482018390525191925073c563ace6facd385cb1f34fa723f412cc64e63d47916351a885c091604480820192602092909190829003018186803b158015611ec757600080fd5b505afa158015611edb573d6000803e3d6000fd5b505050506040513d6020811015611ef157600080fd5b505192915050565b600080808080611f22670de0b6b3a7640000610f7188661ff973cafa800063ffffffff6122e016565b9450611f45670de0b6b3a7640000610f71600d54896122e090919063ffffffff16565b9350611f57868663ffffffff61237b16565b9250611f69838563ffffffff61237b16565b91506000611f90611f78611b38565b610f7185670de0b6b3a764000063ffffffff6122e016565b9050611faa670de0b6b3a7640000610f7183610f99610efa565b91505091939590929450565b3390565b6001600160a01b038316611fff5760405162461bcd60e51b81526004018080602001828103825260248152602001806129196024913960400191505060405180910390fd5b6001600160a01b0382166120445760405162461bcd60e51b815260040180806020018281038252602281526020018061281c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015612100576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612162576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554612175908263ffffffff6120a616565b6005556001600160a01b0382166000908152600360205260409020546121a1908263ffffffff6120a616565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b03831630141561221457506001610b3e565b6007546001600160a01b038481169116141561223257506001610b3e565b6006546001600160a01b031661224a57506000610b3e565b6006546040805163b700961360e01b81526001600160a01b0386811660048301523060248301526001600160e01b0319861660448301529151919092169163b7009613916064808301926020929190829003018186803b1580156122ad57600080fd5b505afa1580156122c1573d6000803e3d6000fd5b505050506040513d60208110156122d757600080fd5b50519050610b3e565b6000826122ef57506000610b3e565b828202828482816122fc57fe5b04146121005760405162461bcd60e51b815260040180806020018281038252602181526020018061288a6021913960400191505060405180910390fd5b600061210083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126f2565b600061210083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612617565b6001600160a01b0382166124025760405162461bcd60e51b81526004018080602001828103825260218152602001806128d36021913960400191505060405180910390fd5b612445816040518060600160405280602281526020016127d5602291396001600160a01b038516600090815260036020526040902054919063ffffffff61261716565b6001600160a01b038316600090815260036020526040902055600554612471908263ffffffff61237b16565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0383166124fe5760405162461bcd60e51b81526004018080602001828103825260258152602001806128f46025913960400191505060405180910390fd5b6001600160a01b0382166125435760405162461bcd60e51b815260040180806020018281038252602381526020018061278c6023913960400191505060405180910390fd5b6125868160405180606001604052806026815260200161283e602691396001600160a01b038616600090815260036020526040902054919063ffffffff61261716565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546125bb908263ffffffff6120a616565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156126a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561266b578181015183820152602001612653565b50505050905090810190601f1680156126985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000816126d36126ca856b033b2e3c9fd0803ce8000000612757565b6002850461277b565b816126da57fe5b049392505050565b80820382811115610b3e57600080fd5b600081836127415760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561266b578181015183820152602001612653565b50600083858161274d57fe5b0495945050505050565b60008115806127725750508082028282828161276f57fe5b04145b610b3e57600080fd5b80820182811015610b3e57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737370726f746f636f6c20666565207472616e7366657220746f2067756c706572206661696c656445524332303a206275726e20616d6f756e7420657863656564732062616c616e63655f746f6b656e73546f52656465656d206578636565647320746f74616c537570706c79282945524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636563616e6e6f742076696f6c61746520636f6c6c61746572616c2073616665747920726174696f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c2c091f043a59c82da2217f8c74a4894e8ef4f58bc805a6ef4cd10a2fc22312e64736f6c63430005110032536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776368616e676553657474696e67732875696e743235362c75696e743235362c75696e7432353629000000000000000000000000d7dfa44e3dfeb1a1e65544dc54ee02b9cbe1e66d0000000000000000000000000000000000000000000000000000000000004a1300000000000000000000000053e0730396ccc8c463c48f3b481d0c81b8a02894000000000000000000000000b7c6bb064620270f8c1daa7502bcca75fc074cf400000000000000000000000093fe7d1d24be7cb33329800ba2166f4d28eaa553

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806370a082311161012e578063a626c089116100ab578063dd62ed3e1161006f578063dd62ed3e146109c8578063ea65212f14610a03578063ebc723cb14610a36578063ec1ebd7a14610a4b578063fb7f267214610a605761023b565b8063a626c0891461091a578063a9059cbb14610950578063b51fa45a14610989578063bf7e214f1461099e578063c70c82db146109b35761023b565b80638da5cb5b116100f25780638da5cb5b1461087c578063948f50761461089157806395d89b41146108b7578063a457c2d7146108cc578063a4e3c311146109055761023b565b806370a08231146107b95780637a9e5e4b146107ec5780637ae0a3d51461081f5780637dc0d1d0146108345780637edd39bc146108495761023b565b80631f6a1eb9116101bc5780634a1a066b116101805780634a1a066b146107255780635ac0f2bb1461073a5780635c1548fb1461074f57806360c7d2951461078f57806364a0a12f146107a45761023b565b80631f6a1eb91461051957806323b872dd14610669578063313ce567146106ac57806339509351146106d7578063470052cc146107105761023b565b806313af40351161020357806313af40351461039257806318160ddd146103c55780631a82c851146103da5780631cff79cd1461042a5780631e9a6950146104e05761023b565b8063024c23361461023d57806306fdde0314610264578063095ea7b3146102ee5780630c7305841461033b57806310861ac41461036c575b005b34801561024957600080fd5b50610252610a8a565b60408051918252519081900360200190f35b34801561027057600080fd5b50610279610a90565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b357818101518382015260200161029b565b50505050905090810190601f1680156102e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102fa57600080fd5b506103276004803603604081101561031157600080fd5b506001600160a01b038135169060200135610b26565b604080519115158252519081900360200190f35b34801561034757600080fd5b50610350610b44565b604080516001600160a01b039092168252519081900360200190f35b61023b6004803603602081101561038257600080fd5b50356001600160a01b0316610b53565b34801561039e57600080fd5b5061023b600480360360208110156103b557600080fd5b50356001600160a01b0316610e8b565b3480156103d157600080fd5b50610252610efa565b3480156103e657600080fd5b50610404600480360360208110156103fd57600080fd5b5035610f00565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6102526004803603604081101561044057600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561046b57600080fd5b82018360208201111561047d57600080fd5b8035906020019184600183028401116401000000008311171561049f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061101c945050505050565b3480156104ec57600080fd5b5061023b6004803603604081101561050357600080fd5b506001600160a01b0381351690602001356110e5565b6106466004803603604081101561052f57600080fd5b81019060208101813564010000000081111561054a57600080fd5b82018360208201111561055c57600080fd5b8035906020019184600183028401116401000000008311171561057e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092959493602081019350359150506401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184600183028401116401000000008311171561060557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061145d945050505050565b604080516001600160a01b03909316835260208301919091528051918290030190f35b34801561067557600080fd5b506103276004803603606081101561068c57600080fd5b506001600160a01b03813581169160208101359091169060400135611637565b3480156106b857600080fd5b506106c16116c4565b6040805160ff9092168252519081900360200190f35b3480156106e357600080fd5b50610327600480360360408110156106fa57600080fd5b506001600160a01b0381351690602001356116cd565b34801561071c57600080fd5b50610252611721565b34801561073157600080fd5b506102526117b6565b34801561074657600080fd5b506102526117bc565b34801561075b57600080fd5b506107646117c2565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561079b57600080fd5b50610350611885565b3480156107b057600080fd5b50610350611894565b3480156107c557600080fd5b50610252600480360360208110156107dc57600080fd5b50356001600160a01b03166118ac565b3480156107f857600080fd5b5061023b6004803603602081101561080f57600080fd5b50356001600160a01b03166118c7565b34801561082b57600080fd5b50610350611936565b34801561084057600080fd5b5061035061194e565b34801561085557600080fd5b5061023b6004803603602081101561086c57600080fd5b50356001600160a01b031661195d565b34801561088857600080fd5b5061035061199e565b610327600480360360208110156108a757600080fd5b50356001600160a01b03166119ad565b3480156108c357600080fd5b50610279611a6a565b3480156108d857600080fd5b50610327600480360360408110156108ef57600080fd5b506001600160a01b038135169060200135611aca565b34801561091157600080fd5b50610252611b38565b34801561092657600080fd5b5061023b6004803603606081101561093d57600080fd5b5080359060208101359060400135611b4b565b34801561095c57600080fd5b506103276004803603604081101561097357600080fd5b506001600160a01b038135169060200135611be0565b34801561099557600080fd5b50610252611bf4565b3480156109aa57600080fd5b50610350611bfa565b3480156109bf57600080fd5b50610350611c09565b3480156109d457600080fd5b50610252600480360360408110156109eb57600080fd5b506001600160a01b0381358116916020013516611c21565b348015610a0f57600080fd5b5061023b60048036036020811015610a2657600080fd5b50356001600160a01b0316611c4c565b348015610a4257600080fd5b50610350611dc3565b348015610a5757600080fd5b50610252611ddb565b348015610a6c57600080fd5b5061076460048036036020811015610a8357600080fd5b5035611ef9565b600d5481565b60008054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3a610b33611fb6565b8484611fba565b5060015b92915050565b6009546001600160a01b031681565b600e54610b66903463ffffffff6120a616565b610b6e611b38565b10610bb6576040805162461bcd60e51b81526020600482015260136024820152721c9a5cdac81b1a5b5a5d08195e18d959591959606a1b604482015290519081900360640190fd5b6000806000806000610bc734611ef9565b945094509450945094506060735ef30b9986345249bc32d8928b7ee64de9435e39732f0b23f53734252bda2277357e97e1517d6b042a600a5460405160240180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050604051602081830303815290604052631c40b82160e31b6001600160e01b0319166020820180516001600160e01b0383818316178352505050509050306001600160a01b0316631cff79cd857382ecd135dce65fbc6dbdd0e4237e0af93ffd5038846040518463ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610d08578181015183820152602001610cf0565b50505050905090810190601f168015610d355780820380516001836020036101000a031916815260200191505b5093505050506020604051808303818588803b158015610d5457600080fd5b505af1158015610d68573d6000803e3d6000fd5b50505050506040513d6020811015610d7f57600080fd5b50506009546040516000916001600160a01b03169088908381818185875af1925050503d8060008114610dce576040519150601f19603f3d011682016040523d82523d6000602084013e610dd3565b606091505b5050905080610e135760405162461bcd60e51b81526004018080602001828103825260268152602001806127af6026913960400191505060405180910390fd5b610e1d8884612107565b604080516001600160a01b038a168152346020820152808201899052606081018890526080810187905260a0810186905260c0810185905290517f2982905875ae47bb92b8b1c9373efd845be807ed05fb869e3bbeab0d7a3b9ca09181900360e00190a15050505050505050565b610ea1336000356001600160e01b0319166121f9565b610eaa57600080fd5b600780546001600160a01b0319166001600160a01b0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b60055490565b600080600080610f0e610efa565b851115610f4c5760405162461bcd60e51b81526004018080602001828103825260258152602001806127f76025913960400191505060405180910390fd5b6000610f7d610f59610efa565b610f7188670de0b6b3a764000063ffffffff6122e016565b9063ffffffff61233916565b90506000610fa5670de0b6b3a7640000610f7184610f99611b38565b9063ffffffff6122e016565b9050610fca670de0b6b3a7640000610f7183661ff973cafa800063ffffffff6122e016565b9550610fed670de0b6b3a7640000610f71600d54846122e090919063ffffffff16565b9450610fff818663ffffffff61237b16565b9350611011848763ffffffff61237b16565b925050509193509193565b6000611034336000356001600160e01b0319166121f9565b61103d57600080fd5b604080513480825260208201838152369383018490526004359360243593849386933393600080356001600160e01b03191694909260608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a46001600160a01b0385166110b157600080fd5b60206000855160208701886113885a03f460005193508015600181146110d6576110db565b600080fd5b5050505092915050565b6000806000806110f485610f00565b600a5460408051735ef30b9986345249bc32d8928b7ee64de9435e39602480830191909152732f0b23f53734252bda2277357e97e1517d6b042a60448084019190915260648084019590955260848084018890528451808503909101815260a490930184526020830180516001600160e01b0316637b5a3b4360e01b1781528451631cff79cd60e01b81527382ecd135dce65fbc6dbdd0e4237e0af93ffd50386004820181815294820196875285519382019390935284519a9e50989c50969a5094985090963096631cff79cd968995939493919091019180838360005b838110156111ea5781810151838201526020016111d2565b50505050905090810190601f1680156112175780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15801561123757600080fd5b505af115801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b5061126e905033876123bd565b6009546040516000916001600160a01b03169087908381818185875af1925050503d80600081146112bb576040519150601f19603f3d011682016040523d82523d6000602084013e6112c0565b606091505b50509050806113005760405162461bcd60e51b81526004018080602001828103825260268152602001806127af6026913960400191505060405180910390fd5b6040516000906001600160a01b038a169085908381818185875af1925050503d806000811461134b576040519150601f19603f3d011682016040523d82523d6000602084013e611350565b606091505b50509050806113a6576040805162461bcd60e51b815260206004820152601d60248201527f6574682073656e6420746f207265636569766572207265766572746564000000604482015290519081900360640190fd5b600c546113b1611ddb565b10156113ee5760405162461bcd60e51b81526004018080602001828103825260268152602001806128646026913960400191505060405180910390fd5b604080513381526001600160a01b038b1660208201528082018a9052606081018990526080810188905260a0810187905260c0810186905290517f347ee37487f7d4fe0b4d3777823c6a71c110e3df43f4f3d35356cf6909e9abdb9181900360e00190a1505050505050505050565b6008546040516322fd145760e21b815260206004820181815285516024840152855160009485946001600160a01b0390911693638bf4515c93899390928392604490910191908501908083838b5b838110156114c35781810151838201526020016114ab565b50505050905090810190601f1680156114f05780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561150d57600080fd5b505afa158015611521573d6000803e3d6000fd5b505050506040513d602081101561153757600080fd5b505191506001600160a01b03821661162457600854604051633f6861d960e11b81526020600482018181528751602484015287516001600160a01b0390941693637ed0c3b293899383926044909201919085019080838360005b838110156115a9578181015183820152602001611591565b50505050905090810190601f1680156115d65780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b505050506040513d602081101561161f57600080fd5b505191505b61162e828461101c565b90509250929050565b60006116448484846124b9565b6116ba84611650611fb6565b6116b5856040518060600160405280602881526020016128ab602891396001600160a01b038a1660009081526004602052604081209061168e611fb6565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61261716565b611fba565b5060019392505050565b60025460ff1690565b6000610b3a6116da611fb6565b846116b585600460006116eb611fb6565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6120a616565b60006117b1633b9aca00600b60009054906101000a90046001600160a01b03166001600160a01b031663b0513c766040518163ffffffff1660e01b815260040160206040518083038186803b15801561177957600080fd5b505afa15801561178d573d6000803e3d6000fd5b505050506040513d60208110156117a357600080fd5b50519063ffffffff6122e016565b905090565b600a5481565b600c5481565b60008060008060006117d2611721565b945073c563ace6facd385cb1f34fa723f412cc64e63d476001600160a01b031663e304c608600a546040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b15801561182e57600080fd5b505afa158015611842573d6000803e3d6000fd5b505050506040513d608081101561185857600080fd5b508051602090910151909450925061187083866126ae565b915061187c84836126e2565b90509091929394565b6008546001600160a01b031681565b732f0b23f53734252bda2277357e97e1517d6b042a81565b6001600160a01b031660009081526003602052604090205490565b6118dd336000356001600160e01b0319166121f9565b6118e657600080fd5b600680546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada490600090a250565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b600b546001600160a01b031681565b611973336000356001600160e01b0319166121f9565b61197c57600080fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031681565b60006119c5336000356001600160e01b0319166121f9565b6119ce57600080fd5b604080513480825260208201838152369383018490526004359360243593849386933393600080356001600160e01b03191694909260608201848480828437600083820152604051601f909101601f1916909201829003965090945050505050a46001600160a01b038416611a4257600080fd5b600880546001600160a01b0386166001600160a01b0319909116179055600192505050919050565b60018054604080516020601f60026000196101008789161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b1c5780601f10610af157610100808354040283529160200191610b1c565b6000610b3a611ad7611fb6565b846116b58560405180606001604052806025815260200161293d6025913960046000611b01611fb6565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61261716565b6000611b426117c2565b95945050505050565b611b61336000356001600160e01b0319166121f9565b611b6a57600080fd5b611b8d670de0b6b3a7640000610f9985662386f26fc1000063ffffffff6122e016565b600c819055600d839055600e8290556040805191825260208201849052818101839052517f22456d468d73d3b914cf66a6630106f3187cdc17d8a99235d058f40d47f172c99181900360600190a1505050565b6000610b3a611bed611fb6565b84846124b9565b600e5481565b6006546001600160a01b031681565b7382ecd135dce65fbc6dbdd0e4237e0af93ffd503881565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b611c62336000356001600160e01b0319166121f9565b611c6b57600080fd5b600a5460408051735ef30b9986345249bc32d8928b7ee64de9435e396024808301919091526044808301949094526001600160a01b038516606480840191909152835180840382018152608490930184526020830180516001600160e01b0316631d10f23160e01b1781528451631cff79cd60e01b81527382ecd135dce65fbc6dbdd0e4237e0af93ffd503860048201818152948201968752855197820197909752845194963096631cff79cd969195899590949193019180838360005b83811015611d41578181015183820152602001611d29565b50505050905090810190601f168015611d6e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b158015611d8e57600080fd5b505af1158015611da2573d6000803e3d6000fd5b505050506040513d6020811015611db857600080fd5b50506000600e555050565b73c563ace6facd385cb1f34fa723f412cc64e63d4781565b60008073c563ace6facd385cb1f34fa723f412cc64e63d476001600160a01b031663e304c608600a546040518263ffffffff1660e01b81526004018082815260200191505060806040518083038186803b158015611e3857600080fd5b505afa158015611e4c573d6000803e3d6000fd5b505050506040513d6080811015611e6257600080fd5b5060600151600a5460408051630146a21760e61b81526004810192909252602482018390525191925073c563ace6facd385cb1f34fa723f412cc64e63d47916351a885c091604480820192602092909190829003018186803b158015611ec757600080fd5b505afa158015611edb573d6000803e3d6000fd5b505050506040513d6020811015611ef157600080fd5b505192915050565b600080808080611f22670de0b6b3a7640000610f7188661ff973cafa800063ffffffff6122e016565b9450611f45670de0b6b3a7640000610f71600d54896122e090919063ffffffff16565b9350611f57868663ffffffff61237b16565b9250611f69838563ffffffff61237b16565b91506000611f90611f78611b38565b610f7185670de0b6b3a764000063ffffffff6122e016565b9050611faa670de0b6b3a7640000610f7183610f99610efa565b91505091939590929450565b3390565b6001600160a01b038316611fff5760405162461bcd60e51b81526004018080602001828103825260248152602001806129196024913960400191505060405180910390fd5b6001600160a01b0382166120445760405162461bcd60e51b815260040180806020018281038252602281526020018061281c6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260046020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082820183811015612100576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612162576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600554612175908263ffffffff6120a616565b6005556001600160a01b0382166000908152600360205260409020546121a1908263ffffffff6120a616565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b03831630141561221457506001610b3e565b6007546001600160a01b038481169116141561223257506001610b3e565b6006546001600160a01b031661224a57506000610b3e565b6006546040805163b700961360e01b81526001600160a01b0386811660048301523060248301526001600160e01b0319861660448301529151919092169163b7009613916064808301926020929190829003018186803b1580156122ad57600080fd5b505afa1580156122c1573d6000803e3d6000fd5b505050506040513d60208110156122d757600080fd5b50519050610b3e565b6000826122ef57506000610b3e565b828202828482816122fc57fe5b04146121005760405162461bcd60e51b815260040180806020018281038252602181526020018061288a6021913960400191505060405180910390fd5b600061210083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126f2565b600061210083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612617565b6001600160a01b0382166124025760405162461bcd60e51b81526004018080602001828103825260218152602001806128d36021913960400191505060405180910390fd5b612445816040518060600160405280602281526020016127d5602291396001600160a01b038516600090815260036020526040902054919063ffffffff61261716565b6001600160a01b038316600090815260036020526040902055600554612471908263ffffffff61237b16565b6005556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b0383166124fe5760405162461bcd60e51b81526004018080602001828103825260258152602001806128f46025913960400191505060405180910390fd5b6001600160a01b0382166125435760405162461bcd60e51b815260040180806020018281038252602381526020018061278c6023913960400191505060405180910390fd5b6125868160405180606001604052806026815260200161283e602691396001600160a01b038616600090815260036020526040902054919063ffffffff61261716565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546125bb908263ffffffff6120a616565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156126a65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561266b578181015183820152602001612653565b50505050905090810190601f1680156126985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000816126d36126ca856b033b2e3c9fd0803ce8000000612757565b6002850461277b565b816126da57fe5b049392505050565b80820382811115610b3e57600080fd5b600081836127415760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561266b578181015183820152602001612653565b50600083858161274d57fe5b0495945050505050565b60008115806127725750508082028282828161276f57fe5b04145b610b3e57600080fd5b80820182811015610b3e57600080fdfe45524332303a207472616e7366657220746f20746865207a65726f206164647265737370726f746f636f6c20666565207472616e7366657220746f2067756c706572206661696c656445524332303a206275726e20616d6f756e7420657863656564732062616c616e63655f746f6b656e73546f52656465656d206578636565647320746f74616c537570706c79282945524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636563616e6e6f742076696f6c61746520636f6c6c61746572616c2073616665747920726174696f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c2c091f043a59c82da2217f8c74a4894e8ef4f58bc805a6ef4cd10a2fc22312e64736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d7dfa44e3dfeb1a1e65544dc54ee02b9cbe1e66d0000000000000000000000000000000000000000000000000000000000004a1300000000000000000000000053e0730396ccc8c463c48f3b481d0c81b8a02894000000000000000000000000b7c6bb064620270f8c1daa7502bcca75fc074cf400000000000000000000000093fe7d1d24be7cb33329800ba2166f4d28eaa553

-----Decoded View---------------
Arg [0] : _gulper (address): 0xD7DFA44E3dfeB1A1E65544Dc54ee02B9CbE1e66d
Arg [1] : _cdpId (uint256): 18963
Arg [2] : _oracle (address): 0x53E0730396ccc8c463C48f3B481d0c81B8a02894
Arg [3] : _initialRecipient (address): 0xB7c6bB064620270F8c1daA7502bCca75fC074CF4
Arg [4] : _automationAuthority (address): 0x93fE7D1d24bE7CB33329800ba2166f4D28Eaa553

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d7dfa44e3dfeb1a1e65544dc54ee02b9cbe1e66d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000004a13
Arg [2] : 00000000000000000000000053e0730396ccc8c463c48f3b481d0c81b8a02894
Arg [3] : 000000000000000000000000b7c6bb064620270f8c1daa7502bcca75fc074cf4
Arg [4] : 00000000000000000000000093fe7d1d24be7cb33329800ba2166f4d28eaa553


Deployed Bytecode Sourcemap

32298:11721:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33654:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33654:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;3594:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3594:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3594:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13795:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13795:152:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13795:152:0;;-1:-1:-1;;;;;13795:152:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;32787:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32787:29:0;;;:::i;:::-;;;;-1:-1:-1;;;;;32787:29:0;;;;;;;;;;;;;;38620:1552;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38620:1552:0;-1:-1:-1;;;;;38620:1552:0;;:::i;21968:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21968:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21968:113:0;-1:-1:-1;;;;;21968:113:0;;:::i;12816:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12816:91:0;;;:::i;40180:1201::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40180:1201:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40180:1201:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23788:639;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23788:639:0;;-1:-1:-1;;;;;23788:639:0;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;23788:639:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23788:639:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23788:639:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23788:639:0;;-1:-1:-1;23788:639:0;;-1:-1:-1;;;;;23788:639:0:i;41629:1780::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41629:1780:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41629:1780:0;;-1:-1:-1;;;;;41629:1780:0;;;;;;:::i;23438:342::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23438:342:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;23438:342:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23438:342:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23438:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23438:342:0;;;;;;;;-1:-1:-1;23438:342:0;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;23438:342:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23438:342:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;23438:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;23438:342:0;;-1:-1:-1;23438:342:0;;-1:-1:-1;;;;;23438:342:0:i;:::-;;;;-1:-1:-1;;;;;23438:342:0;;;;;;;;;;;;;;;;;;;;;;14419:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14419:304:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14419:304:0;;;;;;;;;;;;;;;;;:::i;4446:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4446:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15132:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15132:210:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15132:210:0;;-1:-1:-1;;;;;15132:210:0;;;;;;:::i;36737:258::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36737:258:0;;;:::i;32823:17::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32823:17:0;;;:::i;33541:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33541:30:0;;;:::i;36255:474::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36255:474:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23264:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23264:25:0;;;:::i;33216:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33216:79:0;;;:::i;12970:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12970:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12970:110:0;-1:-1:-1;;;;;12970:110:0;;:::i;22089:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22089:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22089:150:0;-1:-1:-1;;;;;22089:150:0;;:::i;33128:81::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33128:81:0;;;:::i;33483:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33483:20:0;;;:::i;35677:123::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35677:123:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35677:123:0;-1:-1:-1;;;;;35677:123:0;;:::i;21834:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21834:20:0;;;:::i;24441:197::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24441:197:0;-1:-1:-1;;;;;24441:197:0;;:::i;3796:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3796:87:0;;;:::i;15845:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15845:261:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15845:261:0;;-1:-1:-1;;;;;15845:261:0;;;;;;:::i;37003:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37003:168:0;;;:::i;43559:457::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43559:457:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43559:457:0;;;;;;;;;;;;:::i;13293:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13293:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13293:158:0;;-1:-1:-1;;;;;13293:158:0;;;;;;:::i;34091:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34091:21:0;;;:::i;21799:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21799:28:0;;;:::i;33388:86::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33388:86:0;;;:::i;13514:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13514:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13514:134:0;;;;;;;;;;:::i;35808:439::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35808:439:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35808:439:0;-1:-1:-1;;;;;35808:439:0;;:::i;33302:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33302:79:0;;;:::i;37179:242::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37179:242:0;;;:::i;37429:814::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37429:814:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37429:814:0;;:::i;33654:29::-;;;;:::o;3594:83::-;3664:5;3657:12;;;;;;;;;;;;;-1:-1:-1;;3657:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;3631:13;;3657:12;;3664:5;;3657:12;;;3664:5;3657:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3594:83;:::o;13795:152::-;13861:4;13878:39;13887:12;:10;:12::i;:::-;13901:7;13910:6;13878:8;:39::i;:::-;-1:-1:-1;13935:4:0;13795:152;;;;;:::o;32787:29::-;;;-1:-1:-1;;;;;32787:29:0;;:::o;38620:1552::-;38973:9;;:24;;38987:9;38973:24;:13;:24;:::i;:::-;38949:21;:19;:21::i;:::-;:48;38941:80;;;;;-1:-1:-1;;;38941:80:0;;;;;;;;;;;;-1:-1:-1;;;38941:80:0;;;;;;;;;;;;;;;39035:16;39063:18;39093:21;39126:25;39163:18;39186:34;39210:9;39186:23;:34::i;:::-;39034:186;;;;;;;;;;39233:29;33167:42;33253;39406:5;;39265:147;;;;;;-1:-1:-1;;;;;39265:147:0;-1:-1:-1;;;;;39265:147:0;;;;;;-1:-1:-1;;;;;39265:147:0;-1:-1:-1;;;;;39265:147:0;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39265:147:0;;;-1:-1:-1;;;;;;;;39265:147:0;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;39265:147:0;39233:179;;39440:4;-1:-1:-1;;;;;39423:31:0;;39461:16;33432:42;39498:16;39423:92;;;;;;;;;;;;;-1:-1:-1;;;;;39423:92:0;-1:-1:-1;;;;;39423:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;39423:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39423:92:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39423:92:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;39572:6:0;;:34;;39537:30;;-1:-1:-1;;;;;39572:6:0;;39590:11;;39537:30;39572:34;39537:30;39572:34;39590:11;39572:6;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;39536:70:0;;;39625:25;39617:76;;;;-1:-1:-1;;;39617:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39900:31;39906:9;39917:13;39900:5;:31::i;:::-;39957:207;;;-1:-1:-1;;;;;39957:207:0;;;;40003:9;39957:207;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39957:207:0;;;;;;;;;;;;;;;;;;;;;;38620:1552;;;;;;;;:::o;21968:113::-;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;22025:5;:14;;-1:-1:-1;;;;;;22025:14:0;-1:-1:-1;;;;;22025:14:0;;;;;;;;;;;22055:18;;22067:5;;;22055:18;;-1:-1:-1;;22055:18:0;21968:113;:::o;12816:91::-;12887:12;;12816:91;:::o;40180:1201::-;40298:17;40330:19;40364:24;40404;40714:13;:11;:13::i;:::-;40695:15;:32;;40687:82;;;;-1:-1:-1;;;40687:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40780:26;40809:52;40847:13;:11;:13::i;:::-;40809:33;:15;32674:6;40809:33;:19;:33;:::i;:::-;:37;:52;:37;:52;:::i;:::-;40780:81;;40872:23;40898:66;32674:6;40898:48;40924:21;40898;:19;:21::i;:::-;:25;:48;:25;:48;:::i;:66::-;40872:92;-1:-1:-1;40990:59:0;32674:6;40990:41;40872:92;32748:8;40990:41;:22;:41;:::i;:59::-;40975:74;;41077:59;32674:6;41077:41;41100:17;;41077:18;:22;;:41;;;;:::i;:59::-;41060:76;-1:-1:-1;41169:38:0;:18;41060:76;41169:38;:22;:38;:::i;:::-;41147:60;-1:-1:-1;41290:37:0;41147:60;41314:12;41290:37;:23;:37;:::i;:::-;41268:59;;40180:1201;;;;;;;:::o;23788:639::-;23921:16;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;23134:59;;;23173:9;23134:59;;;;;;;;;23184:8;23134:59;;;;;;23067:1;23054:15;;23103:2;23090:16;;;;23054:15;;23151:10;;-1:-1:-1;23142:7:0;;-1:-1:-1;;;;;;23142:7:0;;-1:-1:-1;;23134:59:0;;;-1:-1:-1;23184:8:0;;-1:-1:-1;23134:59:0;1:33:-1;99:1;81:16;;;74:27;23134:59:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;23134:59:0;;;;-1:-1:-1;23134:59:0;;-1:-1:-1;;;;;23134:59:0;-1:-1:-1;;;;;23963:21:0;;23955:30;;;;;;24223:2;24203:1;24178:5;24172:12;24148:4;24141:5;24137:16;24111:7;24087:4;24082:3;24078:14;24047:193;24272:1;24266:8;24254:20;;24302:9;24295:17;24335:1;24330:79;;;;24288:121;;24330:79;24388:1;24385;24378:12;24288:121;;24015:405;22325:1;;23788:639;;;;:::o;41629:1780::-;41931:16;41959:18;41989:21;42021:23;42048:41;42073:15;42048:24;:41::i;:::-;42281:5;;42134:184;;;33167:42;42134:184;;;;;;;;33253:42;42134:184;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;42134:184:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;42329:68:0;;-1:-1:-1;;;42329:68:0;;33432:42;42329:68;;;;;;;;;;;;;;;;;;;;;;;41930:159;;-1:-1:-1;41930:159:0;;-1:-1:-1;42134:184:0;;-1:-1:-1;41930:159:0;;-1:-1:-1;42134:184:0;;42346:4;;-1:-1:-1;;42134:184:0;;42329:68;;;;;;;;;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42329:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42329:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42329:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42410:34:0;;-1:-1:-1;42416:10:0;42428:15;42410:5;:34::i;:::-;42493:6;;:34;;42458:30;;-1:-1:-1;;;;;42493:6:0;;42511:11;;42458:30;42493:34;42458:30;42493:34;42511:11;42493:6;:34;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;42457:70:0;;;42546:25;42538:76;;;;-1:-1:-1;;;42538:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42773:44;;42750:18;;-1:-1:-1;;;;;42773:14:0;;;42794:18;;42750;42773:44;42750:18;42773:44;42794:18;42773:14;:44;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;42749:68:0;;;42836:13;42828:55;;;;;-1:-1:-1;;;42828:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43113:18;;43099:10;:8;:10::i;:::-;:32;;43091:83;;;;-1:-1:-1;;;43091:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43192:209;;;43217:10;43192:209;;-1:-1:-1;;;;;43192:209:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43192:209:0;;;;;;;;;;;;;;;;;;;;;;41629:1780;;;;;;;;;:::o;23438:342::-;23605:5;;:17;;-1:-1:-1;;;23605:17:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;23605:5:0;;;;:10;;:17;;;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23605:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23605:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23605:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23605:17:0;;-1:-1:-1;;;;;;23637:20:0;;23633:94;;23697:5;;:18;;-1:-1:-1;;;23697:18:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23697:5:0;;;;:11;;:18;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23697:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23697:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23697:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23697:18:0;;-1:-1:-1;23633:94:0;23750:22;23758:6;23766:5;23750:7;:22::i;:::-;23739:33;;23438:342;;;;;:::o;14419:304::-;14508:4;14525:36;14535:6;14543:9;14554:6;14525:9;:36::i;:::-;14572:121;14581:6;14589:12;:10;:12::i;:::-;14603:89;14641:6;14603:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14603:19:0;;;;;;:11;:19;;;;;;14623:12;:10;:12::i;:::-;-1:-1:-1;;;;;14603:33:0;;;;;;;;;;;;-1:-1:-1;14603:33:0;;;;:37;:89::i;:::-;14572:8;:121::i;:::-;-1:-1:-1;14711:4:0;14419:304;;;;;:::o;4446:83::-;4512:9;;;;4446:83;:::o;15132:210::-;15212:4;15229:83;15238:12;:10;:12::i;:::-;15252:7;15261:50;15300:10;15261:11;:25;15273:12;:10;:12::i;:::-;-1:-1:-1;;;;;15261:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15261:25:0;;;:34;;;;;;;;;;;:38;:50::i;36737:258::-;36953:6;;:23;;;-1:-1:-1;;;36953:23:0;;;;36818:14;;36953:34;;36981:5;;-1:-1:-1;;;;;36953:6:0;;;;:21;;:23;;;;;;;;;;;;;;;:6;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;36953:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36953:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36953:23:0;;:34;:27;:34;:::i;:::-;36941:46;;36737:258;:::o;32823:17::-;;;;:::o;33541:30::-;;;;:::o;36255:474::-;36327:14;36343:21;36366:10;36378:31;36411:22;36463:23;:21;:23::i;:::-;36573:5;;36527:52;;;-1:-1:-1;;;36527:52:0;;;;;;;;;;36451:35;;-1:-1:-1;33339:42:0;;36527:45;;:52;;;;;;;;;;;;;;;33339:42;36527:52;;;5:2:-1;;;;30:1;27;20:12;5:2;36527:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36527:52:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;36527:52:0;;;;;;;;;-1:-1:-1;36527:52:0;-1:-1:-1;36619:22:0;36527:52;36631:9;36619:4;:22::i;:::-;36590:51;;36672:49;36676:16;36694:26;36672:3;:49::i;:::-;36652:69;;36255:474;;;;;:::o;23264:25::-;;;-1:-1:-1;;;;;23264:25:0;;:::o;33216:79::-;33253:42;33216:79;:::o;12970:110::-;-1:-1:-1;;;;;13054:18:0;13027:7;13054:18;;;:9;:18;;;;;;;12970:110::o;22089:150::-;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;22158:9;:22;;-1:-1:-1;;;;;;22158:22:0;-1:-1:-1;;;;;22158:22:0;;;;;;;;;;;22196:35;;22220:9;;;22196:35;;-1:-1:-1;;22196:35:0;22089:150;:::o;33128:81::-;33167:42;33128:81;:::o;33483:20::-;;;-1:-1:-1;;;;;33483:20:0;;:::o;35677:123::-;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;35773:6;:19;;-1:-1:-1;;;;;;35773:19:0;-1:-1:-1;;;;;35773:19:0;;;;;;;;;;35677:123::o;21834:20::-;;;-1:-1:-1;;;;;21834:20:0;;:::o;24441:197::-;24513:4;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;23134:59;;;23173:9;23134:59;;;;;;;;;23184:8;23134:59;;;;;;23067:1;23054:15;;23103:2;23090:16;;;;23054:15;;23151:10;;-1:-1:-1;23142:7:0;;-1:-1:-1;;;;;;23142:7:0;;-1:-1:-1;;23134:59:0;;;-1:-1:-1;23184:8:0;;-1:-1:-1;23134:59:0;1:33:-1;99:1;81:16;;;74:27;23134:59:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;23134:59:0;;;;-1:-1:-1;23134:59:0;;-1:-1:-1;;;;;23134:59:0;-1:-1:-1;;;;;24538:24:0;;24530:33;;;;;;-1:-1:-1;;24575:5:0;:32;;-1:-1:-1;;;;;;24575:32:0;-1:-1:-1;;;;;24575:32:0;;;;;;;;;;;-1:-1:-1;;;24441:197:0:o;3796:87::-;3868:7;3861:14;;;;;;;;;;;;;-1:-1:-1;;3861:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;3835:13;;3861:14;;3868:7;;3861:14;;;3868:7;3861:14;;;;;;;;;;;;;;;;;;;;;;;;15845:261;15930:4;15947:129;15956:12;:10;:12::i;:::-;15970:7;15979:96;16018:15;15979:96;;;;;;;;;;;;;;;;;:11;:25;15991:12;:10;:12::i;:::-;-1:-1:-1;;;;;15979:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;15979:25:0;;;:34;;;;;;;;;;;;:38;:96::i;37003:168::-;37081:22;37148:15;:13;:15::i;:::-;37121:42;37003:168;-1:-1:-1;;;;;37003:168:0:o;43559:457::-;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;43758:45;43796:6;43758:33;:19;32602:6;43758:33;:23;:33;:::i;:45::-;43737:18;:66;;;43814:17;:38;;;43863:9;:22;;;43903:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;43559:457;;;:::o;13293:158::-;13362:4;13379:42;13389:12;:10;:12::i;:::-;13403:9;13414:6;13379:9;:42::i;34091:21::-;;;;:::o;21799:28::-;;;-1:-1:-1;;;;;21799:28:0;;:::o;33388:86::-;33432:42;33388:86;:::o;13514:134::-;-1:-1:-1;;;;;13613:18:0;;;13586:7;13613:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13514:134::o;35808:439::-;22280:33;22293:10;-1:-1:-1;;;;;;22305:7:0;;;22280:12;:33::i;:::-;22272:42;;;;;;36040:5;;35927:143;;;33167:42;35927:143;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35927:143:0;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;35927:143:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;36091:65:0;;-1:-1:-1;;;36091:65:0;;33432:42;36091:65;;;;;;;;;;;;;;;;;;;;;;;35927:143;;36108:4;;-1:-1:-1;;33432:42:0;;35927:143;;36091:65;;;;;;;;25:18:-1;-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36091:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36091:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36091:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;36238:1:0;36226:9;:13;-1:-1:-1;;35808:439:0:o;33302:79::-;33339:42;33302:79;:::o;37179:242::-;37340:5;;37294:52;;;-1:-1:-1;;;37294:52:0;;;;;;;;;;37246:11;;;;33339:42;;37294:45;;:52;;;;;;;;;;;;;;33339:42;37294:52;;;5:2:-1;;;;30:1;27;20:12;5:2;37294:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37294:52:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;37294:52:0;;;37402:5;;37294:52;37366:47;;-1:-1:-1;;;37366:47:0;;;;;;;;;;;;;;;;37294:52;;-1:-1:-1;33339:42:0;;37366:35;;:47;;;;;37294:52;;37366:47;;;;;;;;33339:42;37366:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37366:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37366:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37366:47:0;;37179:242;-1:-1:-1;;37179:242:0:o;37429:814::-;37550:17;;;;;37750:60;32674:6;37750:42;:19;32748:8;37750:42;:23;:42;:::i;:60::-;37735:75;;37838:60;32674:6;37838:42;37862:17;;37838:19;:23;;:42;;;;:::i;:60::-;37821:77;-1:-1:-1;37934:37:0;:19;37958:12;37934:37;:23;:37;:::i;:::-;37909:62;-1:-1:-1;38007:42:0;37909:62;38034:14;38007:42;:26;:42;:::i;:::-;37983:66;;38061:23;38087:66;38131:21;:19;:21::i;:::-;38087:39;:21;32674:6;38087:39;:25;:39;:::i;:66::-;38061:92;;38180:55;32674:6;38180:37;38198:18;38180:13;:11;:13::i;:55::-;38164:71;;37429:814;;;;;;;;:::o;5395:98::-;5475:10;5395:98;:::o;18776:338::-;-1:-1:-1;;;;;18870:19:0;;18862:68;;;;-1:-1:-1;;;18862:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18949:21:0;;18941:68;;;;-1:-1:-1;;;18941:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19022:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19074:32;;;;;;;;;;;;;;;;;18776:338;;;:::o;6647:181::-;6705:7;6737:5;;;6761:6;;;;6753:46;;;;;-1:-1:-1;;;6753:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6819:1;6647:181;-1:-1:-1;;;6647:181:0:o;17348:308::-;-1:-1:-1;;;;;17424:21:0;;17416:65;;;;;-1:-1:-1;;;17416:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17509:12;;:24;;17526:6;17509:24;:16;:24;:::i;:::-;17494:12;:39;-1:-1:-1;;;;;17565:18:0;;;;;;:9;:18;;;;;;:30;;17588:6;17565:22;:30::i;:::-;-1:-1:-1;;;;;17544:18:0;;;;;;:9;:18;;;;;;;;:51;;;;17611:37;;;;;;;17544:18;;;;17611:37;;;;;;;;;;17348:308;;:::o;22342:380::-;22412:4;22448;-1:-1:-1;;;;;22433:20:0;;;22429:286;;;-1:-1:-1;22477:4:0;22470:11;;22429:286;22510:5;;-1:-1:-1;;;;;22503:12:0;;;22510:5;;22503:12;22499:216;;;-1:-1:-1;22539:4:0;22532:11;;22499:216;22565:9;;-1:-1:-1;;;;;22565:9:0;22561:154;;-1:-1:-1;22616:5:0;22609:12;;22561:154;22661:9;;:42;;;-1:-1:-1;;;22661:42:0;;-1:-1:-1;;;;;22661:42:0;;;;;;;22692:4;22661:42;;;;-1:-1:-1;;;;;;22661:42:0;;;;;;;;:9;;;;;-1:-1:-1;;22661:42:0;;;;;;;;;;;;;;:9;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;22661:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22661:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22661:42:0;;-1:-1:-1;22654:49:0;;8019:471;8077:7;8322:6;8318:47;;-1:-1:-1;8352:1:0;8345:8;;8318:47;8389:5;;;8393:1;8389;:5;:1;8413:5;;;;;:10;8405:56;;;;-1:-1:-1;;;8405:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8958:132;9016:7;9043:39;9047:1;9050;9043:39;;;;;;;;;;;;;;;;;:3;:39::i;7103:136::-;7161:7;7188:43;7192:1;7195;7188:43;;;;;;;;;;;;;;;;;:3;:43::i;17988:348::-;-1:-1:-1;;;;;18064:21:0;;18056:67;;;;-1:-1:-1;;;18056:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18157:68;18180:6;18157:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18157:18:0;;;;;;:9;:18;;;;;;;;:22;:68::i;:::-;-1:-1:-1;;;;;18136:18:0;;;;;;:9;:18;;;;;:89;18251:12;;:24;;18268:6;18251:16;:24::i;:::-;18236:12;:39;18291:37;;;;;;;;18317:1;;-1:-1:-1;;;;;18291:37:0;;;;;;;;;;;;17988:348;;:::o;16596:471::-;-1:-1:-1;;;;;16694:20:0;;16686:70;;;;-1:-1:-1;;;16686:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16775:23:0;;16767:71;;;;-1:-1:-1;;;16767:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16871;16893:6;16871:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16871:17:0;;;;;;:9;:17;;;;;;;;:21;:71::i;:::-;-1:-1:-1;;;;;16851:17:0;;;;;;;:9;:17;;;;;;:91;;;;16976:20;;;;;;;:32;;17001:6;16976:24;:32::i;:::-;-1:-1:-1;;;;;16953:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17024:35;;;;;;;16953:20;;17024:35;;;;;;;;;;;;;16596:471;;;:::o;7576:192::-;7662:7;7698:12;7690:6;;;;7682:29;;;;-1:-1:-1;;;7682:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;7682:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7734:5:0;;;7576:192::o;21038:120::-;21097:9;21149:1;21123:23;21127:11;21131:1;20635:6;21127:3;:11::i;:::-;21144:1;21140;:5;21123:3;:23::i;:::-;:27;;;;;;;21038:120;-1:-1:-1;;;21038:120:0:o;19744:113::-;19837:5;;;19832:16;;;;19824:25;;;;;9620:345;9706:7;9808:12;9801:5;9793:28;;;;-1:-1:-1;;;9793:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27:10;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;9793:28:0;;9832:9;9848:1;9844;:5;;;;;;;9620:345;-1:-1:-1;;;;;9620:345:0:o;19865:127::-;19923:9;19953:6;;;:30;;-1:-1:-1;;19968:5:0;;;19982:1;19977;19968:5;19977:1;19963:15;;;;;:20;19953:30;19945:39;;;;;19623:113;19716:5;;;19711:16;;;;19703:25;;;;

Swarm Source

bzzr://c2c091f043a59c82da2217f8c74a4894e8ef4f58bc805a6ef4cd10a2fc22312e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.