ETH Price: $2,956.76 (-0.00%)

Token

ERC20 ***

Overview

Max Total Supply

40.276098172177876096 ERC20 ***

Holders

661

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000472828592371347 ERC20 ***

Value
$0.00
0xb4192ab96664248c260f9b7e3ef5d55b55b55384
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BAMM

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSD-3-Clause license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2022-02-07
*/

/*
B.PROTOCOL TERMS OF USE
=======================

THE TERMS OF USE CONTAINED HEREIN (THESE “TERMS”) GOVERN YOUR USE OF B.PROTOCOL, WHICH IS A DECENTRALIZED PROTOCOL ON THE ETHEREUM BLOCKCHAIN (the “PROTOCOL”) THAT enables a backstop liquidity mechanism FOR DECENTRALIZED LENDING PLATFORMS (“DLPs”).  
PLEASE READ THESE TERMS CAREFULLY AT https://github.com/backstop-protocol/Terms-and-Conditions, INCLUDING ALL DISCLAIMERS AND RISK FACTORS, BEFORE USING THE PROTOCOL. BY USING THE PROTOCOL, YOU ARE IRREVOCABLY CONSENTING TO BE BOUND BY THESE TERMS. 
IF YOU DO NOT AGREE TO ALL OF THESE TERMS, DO NOT USE THE PROTOCOL. YOUR RIGHT TO USE THE PROTOCOL IS SUBJECT AND DEPENDENT BY YOUR AGREEMENT TO ALL TERMS AND CONDITIONS SET FORTH HEREIN, WHICH AGREEMENT SHALL BE EVIDENCED BY YOUR USE OF THE PROTOCOL.
Minors Prohibited: The Protocol is not directed to individuals under the age of eighteen (18) or the age of majority in your jurisdiction if the age of majority is greater. If you are under the age of eighteen or the age of majority (if greater), you are not authorized to access or use the Protocol. By using the Protocol, you represent and warrant that you are above such age.

License; No Warranties; Limitation of Liability;
(a) The software underlying the Protocol is licensed for use in accordance with the 3-clause BSD License, which can be accessed here: https://opensource.org/licenses/BSD-3-Clause.
(b) THE PROTOCOL IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS", “WITH ALL FAULTS” and “AS AVAILABLE” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
(c) IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File contracts/B.Protocol/crop.sol

// SPDX-License-Identifier AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity 0.6.11;

interface VatLike {
    function urns(bytes32, address) external view returns (uint256, uint256);
    function gem(bytes32, address) external view returns (uint256);
    function slip(bytes32, address, int256) external;
}

interface ERC20 {
    function balanceOf(address owner) external view returns (uint256);
    function transfer(address dst, uint256 amount) external returns (bool);
    function transferFrom(address src, address dst, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function decimals() external returns (uint8);
}

// receives tokens and shares them among holders
contract CropJoin {

    VatLike     public immutable vat;    // cdp engine
    bytes32     public immutable ilk;    // collateral type
    ERC20       public immutable gem;    // collateral token
    uint256     public immutable dec;    // gem decimals
    ERC20       public immutable bonus;  // rewards token

    uint256     public share;  // crops per gem    [ray]
    uint256     public total;  // total gems       [wad]
    uint256     public stock;  // crop balance     [wad]

    mapping (address => uint256) public crops; // crops per user  [wad]
    mapping (address => uint256) public stake; // gems per user   [wad]

    uint256 immutable internal to18ConversionFactor;
    uint256 immutable internal toGemConversionFactor;

    // --- Events ---
    event Join(uint256 val);
    event Exit(uint256 val);
    event Flee();
    event Tack(address indexed src, address indexed dst, uint256 wad);

    constructor(address vat_, bytes32 ilk_, address gem_, address bonus_) public {
        vat = VatLike(vat_);
        ilk = ilk_;
        gem = ERC20(gem_);
        uint256 dec_ = ERC20(gem_).decimals();
        require(dec_ <= 18);
        dec = dec_;
        to18ConversionFactor = 10 ** (18 - dec_);
        toGemConversionFactor = 10 ** dec_;

        bonus = ERC20(bonus_);
    }

    function add(uint256 x, uint256 y) public pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }
    function sub(uint256 x, uint256 y) public pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }
    function mul(uint256 x, uint256 y) public pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
    function divup(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = add(x, sub(y, 1)) / y;
    }
    uint256 constant WAD  = 10 ** 18;
    function wmul(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, y) / WAD;
    }
    function wdiv(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, WAD) / y;
    }
    function wdivup(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = divup(mul(x, WAD), y);
    }
    uint256 constant RAY  = 10 ** 27;
    function rmul(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, y) / RAY;
    }
    function rmulup(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = divup(mul(x, y), RAY);
    }
    function rdiv(uint256 x, uint256 y) public pure returns (uint256 z) {
        z = mul(x, RAY) / y;
    }

    // Net Asset Valuation [wad]
    function nav() public virtual returns (uint256) {
        uint256 _nav = gem.balanceOf(address(this));
        return mul(_nav, to18ConversionFactor);
    }

    // Net Assets per Share [wad]
    function nps() public returns (uint256) {
        if (total == 0) return WAD;
        else return wdiv(nav(), total);
    }

    function crop() internal virtual returns (uint256) {
        return sub(bonus.balanceOf(address(this)), stock);
    }

    function harvest(address from, address to) internal {
        if (total > 0) share = add(share, rdiv(crop(), total));

        uint256 last = crops[from];
        uint256 curr = rmul(stake[from], share);
        if (curr > last) require(bonus.transfer(to, curr - last));
        stock = bonus.balanceOf(address(this));
    }

    function join(address urn, uint256 val) internal virtual {
        harvest(urn, urn);
        if (val > 0) {
            uint256 wad = wdiv(mul(val, to18ConversionFactor), nps());

            // Overflow check for int256(wad) cast below
            // Also enforces a non-zero wad
            require(int256(wad) > 0);

            require(gem.transferFrom(msg.sender, address(this), val));
            vat.slip(ilk, urn, int256(wad));

            total = add(total, wad);
            stake[urn] = add(stake[urn], wad);
        }
        crops[urn] = rmulup(stake[urn], share);
        emit Join(val);
    }

    function exit(address guy, uint256 val) internal virtual {
        harvest(msg.sender, guy);
        if (val > 0) {
            uint256 wad = wdivup(mul(val, to18ConversionFactor), nps());

            // Overflow check for int256(wad) cast below
            // Also enforces a non-zero wad
            require(int256(wad) > 0);

            require(gem.transfer(guy, val));
            vat.slip(ilk, msg.sender, -int256(wad));

            total = sub(total, wad);
            stake[msg.sender] = sub(stake[msg.sender], wad);
        }
        crops[msg.sender] = rmulup(stake[msg.sender], share);
        emit Exit(val);
    }
}


// File contracts/B.Protocol/CropJoinAdapter.sol

//  MIT

pragma solidity 0.6.11;

// NOTE! - this is not an ERC20 token. transfer is not supported.
contract CropJoinAdapter is CropJoin {
    string constant public name = "B.AMM LUSD-ETH";
    string constant public symbol = "LUSDETH";
    uint constant public decimals = 18;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    constructor(address _lqty) public 
        CropJoin(address(new Dummy()), "B.AMM", address(new DummyGem()), _lqty)
    {
    }

    // adapter to cropjoin
    function nav() public override returns (uint256) {
        return total;
    }
    
    function totalSupply() public view returns (uint256) {
        return total;
    }

    function balanceOf(address owner) public view returns (uint256 balance) {
        balance = stake[owner];
    }

    function mint(address to, uint value) virtual internal {
        join(to, value);
        emit Transfer(address(0), to, value);
    }

    function burn(address owner, uint value) virtual internal {
        exit(owner, value);
        emit Transfer(owner, address(0), value);        
    }
}

contract Dummy {
    fallback() external {}
}

contract DummyGem is Dummy {
    function transfer(address, uint) external pure returns(bool) {
        return true;
    }

    function transferFrom(address, address, uint) external pure returns(bool) {
        return true;
    }

    function decimals() external pure returns(uint) {
        return 18;
    } 
}


// File contracts/B.Protocol/Dependencies/SafeMath.sol

//  MIT

pragma solidity 0.6.11;

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

//  MIT

pragma solidity 0.6.11;

contract PriceFormula {
    using SafeMath for uint256;

    function getSumFixedPoint(uint x, uint y, uint A) public pure returns(uint) {
        if(x == 0 && y == 0) return 0;

        uint sum = x.add(y);

        for(uint i = 0 ; i < 255 ; i++) {
            uint dP = sum;
            dP = dP.mul(sum) / (x.mul(2)).add(1);
            dP = dP.mul(sum) / (y.mul(2)).add(1);

            uint prevSum = sum;

            uint n = (A.mul(2).mul(x.add(y)).add(dP.mul(2))).mul(sum);
            uint d = (A.mul(2).sub(1).mul(sum));
            sum = n / d.add(dP.mul(3));

            if(sum <= prevSum.add(1) && prevSum <= sum.add(1)) break;
        }

        return sum;
    }

    function getReturn(uint xQty, uint xBalance, uint yBalance, uint A) public pure returns(uint) {
        uint sum = getSumFixedPoint(xBalance, yBalance, A);

        uint c = sum.mul(sum) / (xQty.add(xBalance)).mul(2);
        c = c.mul(sum) / A.mul(4);
        uint b = (xQty.add(xBalance)).add(sum / A.mul(2));
        uint yPrev = 0;
        uint y = sum;

        for(uint i = 0 ; i < 255 ; i++) {
            yPrev = y;
            uint n = (y.mul(y)).add(c);
            uint d = y.mul(2).add(b).sub(sum); 
            y = n / d;

            if(y <= yPrev.add(1) && yPrev <= y.add(1)) break;
        }

        return yBalance.sub(y).sub(1);
    }
}


// File contracts/B.Protocol/Interfaces/IPriceFeed.sol

//  MIT

pragma solidity 0.6.11;

interface IPriceFeed {

    // --- Events ---
    event LastGoodPriceUpdated(uint _lastGoodPrice);
   
    // --- Function ---
    function fetchPrice() external returns (uint);
}


// File contracts/B.Protocol/Dependencies/IERC20.sol

//  MIT

pragma solidity 0.6.11;

/**
 * Based on the OpenZeppelin IER20 interface:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
 *
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File contracts/B.Protocol/Dependencies/Ownable.sol

//  MIT

pragma solidity 0.6.11;

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

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

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

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

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

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

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


// File contracts/B.Protocol/Dependencies/AggregatorV3Interface.sol

//  MIT
// Code from https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol

pragma solidity 0.6.11;

interface AggregatorV3Interface {

  function decimals() external view returns (uint8);
  function description() external view returns (string memory);
  function version() external view returns (uint256);

  // getRoundData and latestRoundData should both raise "No data present"
  // if they do not have data to report, instead of returning unset values
  // which could be misinterpreted as actual reported values.
  function getRoundData(uint80 _roundId)
    external
    view
    returns (
      uint80 roundId,
      int256 answer,
      uint256 startedAt,
      uint256 updatedAt,
      uint80 answeredInRound
    );

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


// File contracts/B.Protocol/BAMM.sol

//  MIT

pragma solidity 0.6.11;







interface StabilityPoolLike {
    function withdrawFromSP(uint256 _amount) external;
    function provideToSP(uint256 _amount) external;
    function getCompoundedVSTDeposit(address _depositor)
        external
        view
        returns (uint256);
    function getDepositorAssetGain(address _depositor)
        external
        view
        returns (uint256);
}

contract BAMM is CropJoinAdapter, PriceFormula, Ownable {
    using SafeMath for uint256;

    AggregatorV3Interface public immutable priceAggregator;
    IERC20 public immutable LUSD;
    IERC20 public immutable collateral;    
    StabilityPoolLike immutable public SP;

    address payable public immutable feePool;
    uint public constant MAX_FEE = 100; // 1%
    uint public fee = 0; // fee in bps
    uint public A = 20;
    uint public constant MIN_A = 20;
    uint public constant MAX_A = 200;    

    uint public immutable maxDiscount; // max discount in bips

    address public immutable frontEndTag;

    uint constant public PRECISION = 1e18;

    event ParamsSet(uint A, uint fee);
    event UserDeposit(address indexed user, uint lusdAmount, uint numShares);
    event UserWithdraw(address indexed user, uint lusdAmount, uint ethAmount, uint numShares);
    event RebalanceSwap(address indexed user, uint lusdAmount, uint ethAmount, uint timestamp);

    constructor(
        address _priceAggregator,
        address payable _SP,
        address _LUSD,
        address _LQTY,
        address _collateral,
        uint _maxDiscount,
        address payable _feePool,
        address _fronEndTag)
        public
        CropJoinAdapter(_LQTY)
    {
        priceAggregator = AggregatorV3Interface(_priceAggregator);
        LUSD = IERC20(_LUSD);
        collateral = IERC20(_collateral);
        SP = StabilityPoolLike(_SP);

        feePool = _feePool;
        maxDiscount = _maxDiscount;
        frontEndTag = _fronEndTag;
    }

    function setParams(uint _A, uint _fee) external onlyOwner {
        require(_fee <= MAX_FEE, "setParams: fee is too big");
        require(_A >= MIN_A, "setParams: A too small");
        require(_A <= MAX_A, "setParams: A too big");

        fee = _fee;
        A = _A;

        emit ParamsSet(_A, _fee);
    }

    function fetchPrice() public view returns(uint) {
        uint chainlinkDecimals;
        uint chainlinkLatestAnswer;
        uint chainlinkTimestamp;

        // First, try to get current decimal precision:
        try priceAggregator.decimals() returns (uint8 decimals) {
            // If call to Chainlink succeeds, record the current decimal precision
            chainlinkDecimals = decimals;
        } catch {
            // If call to Chainlink aggregator reverts, return a zero response with success = false
            return 0;
        }

        // Secondly, try to get latest price data:
        try priceAggregator.latestRoundData() returns
        (
            uint80 /* roundId */,
            int256 answer,
            uint256 /* startedAt */,
            uint256 timestamp,
            uint80 /* answeredInRound */
        )
        {
            // If call to Chainlink succeeds, return the response and success = true
            chainlinkLatestAnswer = uint(answer);
            chainlinkTimestamp = timestamp;
        } catch {
            // If call to Chainlink aggregator reverts, return a zero response with success = false
            return 0;
        }

        if(chainlinkTimestamp + 1 hours < now) return 0; // price is down

        uint chainlinkFactor = 10 ** chainlinkDecimals;
        return chainlinkLatestAnswer.mul(PRECISION) / chainlinkFactor;
    }

    function deposit(uint lusdAmount) external {        
        // update share
        uint lusdValue = SP.getCompoundedVSTDeposit(address(this));
        uint ethValue = getCollateralBalance();

        uint price = fetchPrice();
        require(ethValue == 0 || price > 0, "deposit: chainlink is down");

        uint totalValue = lusdValue.add(ethValue.mul(price) / PRECISION);

        // this is in theory not reachable. if it is, better halt deposits
        // the condition is equivalent to: (totalValue = 0) ==> (total = 0)
        require(totalValue > 0 || total == 0, "deposit: system is rekt");

        uint newShare = PRECISION;
        if(total > 0) newShare = total.mul(lusdAmount) / totalValue;

        // deposit
        require(LUSD.transferFrom(msg.sender, address(this), lusdAmount), "deposit: transferFrom failed");
        SP.provideToSP(lusdAmount);

        // update LP token
        mint(msg.sender, newShare);

        emit UserDeposit(msg.sender, lusdAmount, newShare);        
    }

    function withdraw(uint numShares) external {
        uint lusdValue = SP.getCompoundedVSTDeposit(address(this));
        uint ethValue = getCollateralBalance();

        uint lusdAmount = lusdValue.mul(numShares).div(total);
        uint ethAmount = ethValue.mul(numShares).div(total);

        // this withdraws lusd, lqty, and eth
        SP.withdrawFromSP(lusdAmount);

        // update LP token
        burn(msg.sender, numShares);

        // send lusd and eth
        if(lusdAmount > 0) LUSD.transfer(msg.sender, lusdAmount);
        if(ethAmount > 0) {
            sendCollateral(msg.sender, ethAmount);
        }

        emit UserWithdraw(msg.sender, lusdAmount, ethAmount, numShares);            
    }

    function addBps(uint n, int bps) internal pure returns(uint) {
        require(bps <= 10000, "reduceBps: bps exceeds max");
        require(bps >= -10000, "reduceBps: bps exceeds min");

        return n.mul(uint(10000 + bps)) / 10000;
    }

    function getSwapEthAmount(uint lusdQty) public view returns(uint ethAmount, uint feeLusdAmount) {
        uint lusdBalance = SP.getCompoundedVSTDeposit(address(this));
        uint ethBalance  = getCollateralBalance();

        uint eth2usdPrice = fetchPrice();
        if(eth2usdPrice == 0) return (0, 0); // chainlink is down

        uint ethUsdValue = ethBalance.mul(eth2usdPrice) / PRECISION;
        uint maxReturn = addBps(lusdQty.mul(PRECISION) / eth2usdPrice, int(maxDiscount));

        uint xQty = lusdQty;
        uint xBalance = lusdBalance;
        uint yBalance = lusdBalance.add(ethUsdValue.mul(2));
        
        uint usdReturn = getReturn(xQty, xBalance, yBalance, A);
        uint basicEthReturn = usdReturn.mul(PRECISION) / eth2usdPrice;

        if(ethBalance < basicEthReturn) basicEthReturn = ethBalance; // cannot give more than balance 
        if(maxReturn < basicEthReturn) basicEthReturn = maxReturn;

        ethAmount = basicEthReturn;
        feeLusdAmount = addBps(lusdQty, int(fee)).sub(lusdQty);
    }

    // get ETH in return to LUSD
    function swap(uint lusdAmount, uint minEthReturn, address payable dest) public returns(uint) {
        (uint ethAmount, uint feeAmount) = getSwapEthAmount(lusdAmount);

        require(ethAmount >= minEthReturn, "swap: low return");

        LUSD.transferFrom(msg.sender, address(this), lusdAmount);
        SP.provideToSP(lusdAmount.sub(feeAmount));

        if(feeAmount > 0) LUSD.transfer(feePool, feeAmount);
        sendCollateral(dest, ethAmount); // re-entry is fine here

        emit RebalanceSwap(msg.sender, lusdAmount, ethAmount, now);

        return ethAmount;
    }

    // kyber network reserve compatible function
    function trade(
        IERC20 /* srcToken */,
        uint256 srcAmount,
        IERC20 /* destToken */,
        address payable destAddress,
        uint256 /* conversionRate */,
        bool /* validate */
    ) external payable returns (bool) {
        return swap(srcAmount, 0, destAddress) > 0;
    }

    function getConversionRate(
        IERC20 /* src */,
        IERC20 /* dest */,
        uint256 srcQty,
        uint256 /* blockNumber */
    ) external view returns (uint256) {
        (uint ethQty, ) = getSwapEthAmount(srcQty);
        return ethQty.mul(PRECISION) / srcQty;
    }

    receive() external payable {}

    // multi collateral competability
    function collaterals(uint index) public view returns(address) {
        require(index == 0, "only one collateral");
        return address(collateral);
    }

    function sendCollateral(address to, uint amount) internal {
        if(collateral == IERC20(0x0)) {
            (bool success, ) = to.call{ value: amount }("");
            require(success, "sendCollateral: sending ETH failed");            
        }
        else {
            require(collateral.transfer(to, amount), "sendCollateral: swap failed");
        }
    }

    function getCollateralBalance() public view returns(uint) {
        uint spBalance = SP.getDepositorAssetGain(address(this));
        uint contractBalance;

        if(collateral == IERC20(0x0)) {
            contractBalance = address(this).balance;            
        }
        else {
            contractBalance = collateral.balanceOf(address(this));
        }

        return spBalance.add(contractBalance);
    }

    function getCollateralValue() public view returns(bool succ, uint value) {
        uint ethValue = getCollateralBalance();

        uint price = fetchPrice();

        succ = price > 0;
        value = (ethValue.mul(price) / PRECISION);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_priceAggregator","type":"address"},{"internalType":"address payable","name":"_SP","type":"address"},{"internalType":"address","name":"_LUSD","type":"address"},{"internalType":"address","name":"_LQTY","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_maxDiscount","type":"uint256"},{"internalType":"address payable","name":"_feePool","type":"address"},{"internalType":"address","name":"_fronEndTag","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Exit","type":"event"},{"anonymous":false,"inputs":[],"name":"Flee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"Join","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"A","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"ParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RebalanceSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Tack","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"inputs":[],"name":"A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_A","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SP","outputs":[{"internalType":"contract StabilityPoolLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"add","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonus","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"collaterals","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"frontEndTag","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gem","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralValue","outputs":[{"internalType":"bool","name":"succ","type":"bool"},{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"xQty","type":"uint256"},{"internalType":"uint256","name":"xBalance","type":"uint256"},{"internalType":"uint256","name":"yBalance","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"A","type":"uint256"}],"name":"getSumFixedPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdQty","type":"uint256"}],"name":"getSwapEthAmount","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"feeLusdAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ilk","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"mul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceAggregator","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"rmulup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_A","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"sub","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lusdAmount","type":"uint256"},{"internalType":"uint256","name":"minEthReturn","type":"uint256"},{"internalType":"address payable","name":"dest","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20","name":"","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"trade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract VatLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdiv","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wdivup","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"numShares","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"name":"wmul","outputs":[{"internalType":"uint256","name":"z","type":"uint256"}],"stateMutability":"pure","type":"function"},{"stateMutability":"payable","type":"receive"}]

610240604052600060065560146007553480156200001c57600080fd5b50604051620036d3380380620036d383398181016040526101008110156200004357600080fd5b50805160208201516040808401516060850151608086015160a087015160c088015160e090980151945196979596939592949193909291908590620000889062000240565b604051809103906000f080158015620000a5573d6000803e3d6000fd5b5064422e414d4d60d81b604051620000bd906200024d565b604051809103906000f080158015620000da573d6000803e3d6000fd5b506001600160601b0319606084811b821660805260a084905282901b1660c0526040805163313ce56760e01b8152905185916000916001600160a01b0385169163313ce56791600480830192602092919082900301818787803b1580156200014157600080fd5b505af115801562000156573d6000803e3d6000fd5b505050506040513d60208110156200016d57600080fd5b505160ff16905060128111156200018357600080fd5b60e08190526012819003600a90810a610120520a6101405260601b6001600160601b03191661010052505060058054336001600160a01b03199091168117909155604051909250600091507f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606098891b81166101605295881b86166101805292871b85166101a05294861b84166101c05293851b83166101e0526102009390935250911b16610220526200025b565b6065806200353c83390190565b61013280620035a183390190565b60805160601c60a05160c05160601c60e0516101005160601c61012051610140516101605160601c6101805160601c6101a05160601c6101c05160601c6101e05160601c610200516102205160601c61319b620003a160003980611421525080611ccc528061201d52508061164e52806118a2525080610efd528061113d528061120652806113dc5280611591528061195b5280611c025280611f01525080610f755280610fc852806110cc528061219b528061259052806126545250806112b95280611513528061161f5280611b3b5280612141525080610d4b5280610dde528061138a525050806129d15280612c305250806117615280612f065280612fdb528061307d5250806118c65250806117da5280612a135280612c9d525080611ed85280612ad65280612d4b5250806113b35280612b165280612d1c525061319b6000f3fe6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000000000000000000000000000000000000000000000919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601281565b7f000000000000000000000000000000000000000000000000000000000000000081565b60c881565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000000000000000000000000000000000000000000081565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000000006127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000006120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000006120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637cdd3fde7f000000000000000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b00336080604052348015600f57600080fd5b50604880601d6000396000f3fe6080604052348015600f57600080fd5b5000fea2646970667358221220c9dbde2b8bd5037d447820e2775b3e09ebae168220c996babde4dae9f370b5d564736f6c634300060b0033608060405234801561001057600080fd5b50610112806100206000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c806323b872dd14603e578063313ce567146085578063a9059cbb14609d575b005b607160048036036060811015605257600080fd5b506001600160a01b0381358116916020810135909116906040013560c6565b604080519115158252519081900360200190f35b608b60cf565b60408051918252519081900360200190f35b60716004803603604081101560b157600080fd5b506001600160a01b03813516906020013560d4565b60019392505050565b601290565b60019291505056fea2646970667358221220e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a81396164736f6c634300060b0033000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e4200000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000190000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a390000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103545760003560e01c80637bd2bea7116101c6578063bdf3c4ae116100f7578063cf59d56311610095578063ddca3f431161006f578063ddca3f4314610adf578063e29e4fbc14610af4578063f2fde38b14610b2a578063f446c1d014610b5d5761035b565b8063cf59d56314610aa0578063d20998de14610ab5578063d8dfeb4514610aca5761035b565b8063c1590cd7116100d1578063c1590cd714610492578063c5ce281e14610a18578063c67e2b6014610a2d578063c8a4ac9c14610a705761035b565b8063bdf3c4ae146109a3578063c0324c77146109b8578063c047e563146109e85761035b565b8063aaf5eb6811610164578063b67d77c51161013e578063b67d77c51461091f578063b6b55f251461094f578063b8b89e1b14610979578063bc063e1a1461098e5761035b565b8063aaf5eb68146108e0578063ae2e933b146108f5578063b3bcfa821461090a5761035b565b80638da5cb5b116101a05780638da5cb5b1461088c5780638f32d59b146108a157806395d89b41146108b6578063a8d5fd65146108cb5761035b565b80637bd2bea7146107fe5780637cd44272146108135780638b9af5c11461085c5761035b565b8063313ce567116102a0578063674570221161023e5780636e9fe670116102185780636e9fe6701461077157806370a082311461078657806375b4d78c146107b9578063771602f7146107ce5761035b565b806367457022146106a25780636cf69811146106d25780636d9a640a146107325761035b565b80634426ebd01161027a5780634426ebd014610618578063509f82fd1461062d5780635da937c41461065d5780635fde731c146106725761035b565b8063313ce567146105d957806336569e77146105ee57806339698415146106035761035b565b806323f3dc8f1161030d5780632baeda48116102e75780632baeda48146105505780632ddbd13a146105835780632e1a7d4d146105985780633078fff5146105c45761035b565b806323f3dc8f146104a757806324c1173b146104d7578063264762041461051d5761035b565b8063068d59111461036057806306fdde03146103ae5780630e2286d3146104385780630fdb11cf146104685780631529a6391461047d57806318160ddd146104925761035b565b3661035b57005b600080fd5b34801561036c57600080fd5b5061039c6004803603608081101561038357600080fd5b5080359060208101359060408101359060600135610b72565b60408051918252519081900360200190f35b3480156103ba57600080fd5b506103c3610cf1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103fd5781810151838201526020016103e5565b50505050905090810190601f16801561042a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044457600080fd5b5061039c6004803603604081101561045b57600080fd5b5080359060200135610d1b565b34801561047457600080fd5b5061039c610d43565b34801561048957600080fd5b5061039c610ed8565b34801561049e57600080fd5b5061039c611054565b3480156104b357600080fd5b5061039c600480360360408110156104ca57600080fd5b508035906020013561105a565b3480156104e357600080fd5b50610501600480360360208110156104fa57600080fd5b503561107e565b604080516001600160a01b039092168252519081900360200190f35b34801561052957600080fd5b5061039c6004803603602081101561054057600080fd5b50356001600160a01b03166110f0565b34801561055c57600080fd5b5061039c6004803603602081101561057357600080fd5b50356001600160a01b0316611102565b34801561058f57600080fd5b5061039c611114565b3480156105a457600080fd5b506105c2600480360360208110156105bb57600080fd5b503561111a565b005b3480156105d057600080fd5b50610501611388565b3480156105e557600080fd5b5061039c6113ac565b3480156105fa57600080fd5b506105016113b1565b34801561060f57600080fd5b5061039c6113d5565b34801561062457600080fd5b506105016113da565b34801561063957600080fd5b5061039c6004803603604081101561065057600080fd5b50803590602001356113fe565b34801561066957600080fd5b5061050161141f565b34801561067e57600080fd5b5061039c6004803603604081101561069557600080fd5b5080359060200135611443565b3480156106ae57600080fd5b5061039c600480360360408110156106c557600080fd5b5080359060200135611458565b61071e600480360360c08110156106e857600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060808101359060a001351515611471565b604080519115158252519081900360200190f35b34801561073e57600080fd5b5061039c6004803603606081101561075557600080fd5b50803590602081013590604001356001600160a01b031661148c565b34801561077d57600080fd5b5061039c61173f565b34801561079257600080fd5b5061039c600480360360208110156107a957600080fd5b50356001600160a01b0316611744565b3480156107c557600080fd5b5061050161175f565b3480156107da57600080fd5b5061039c600480360360408110156107f157600080fd5b5080359060200135611783565b34801561080a57600080fd5b506105016117d8565b34801561081f57600080fd5b5061039c6004803603608081101561083657600080fd5b506001600160a01b038135811691602081013590911690604081013590606001356117fc565b34801561086857600080fd5b5061039c6004803603604081101561087f57600080fd5b5080359060200135611836565b34801561089857600080fd5b5061050161184b565b3480156108ad57600080fd5b5061071e61185a565b3480156108c257600080fd5b506103c361186b565b3480156108d757600080fd5b5061039c61188e565b3480156108ec57600080fd5b5061039c611894565b34801561090157600080fd5b506105016118a0565b34801561091657600080fd5b5061039c6118c4565b34801561092b57600080fd5b5061039c6004803603604081101561094257600080fd5b50803590602001356118e8565b34801561095b57600080fd5b506105c26004803603602081101561097257600080fd5b5035611938565b34801561098557600080fd5b5061039c611cca565b34801561099a57600080fd5b5061039c611cee565b3480156109af57600080fd5b5061039c611cf3565b3480156109c457600080fd5b506105c2600480360360408110156109db57600080fd5b5080359060200135611cf9565b3480156109f457600080fd5b506109fd611e8d565b60408051921515835260208301919091528051918290030190f35b348015610a2457600080fd5b5061039c611ed6565b348015610a3957600080fd5b50610a5760048036036020811015610a5057600080fd5b5035611efa565b6040805192835260208301919091528051918290030190f35b348015610a7c57600080fd5b5061039c60048036036040811015610a9357600080fd5b50803590602001356120dc565b348015610aac57600080fd5b5061050161213f565b348015610ac157600080fd5b5061039c612163565b348015610ad657600080fd5b50610501612199565b348015610aeb57600080fd5b5061039c6121bd565b348015610b0057600080fd5b5061039c60048036036060811015610b1757600080fd5b50803590602081013590604001356121c3565b348015610b3657600080fd5b506105c260048036036020811015610b4d57600080fd5b50356001600160a01b0316612341565b348015610b6957600080fd5b5061039c6123eb565b600080610b808585856121c3565b90506000610ba56002610b99898963ffffffff6123f116565b9063ffffffff61244b16565b610bb5838063ffffffff61244b16565b81610bbc57fe5b049050610bd084600463ffffffff61244b16565b610be0828463ffffffff61244b16565b81610be757fe5b0490506000610c25610c0086600263ffffffff61244b16565b8481610c0857fe5b04610c198a8a63ffffffff6123f116565b9063ffffffff6123f116565b9050600083815b60ff811015610ccd5790915081906000610c5086610c19858063ffffffff61244b16565b90506000610c7988610c6d88610c1988600263ffffffff61244b16565b9063ffffffff6124a416565b9050808281610c8457fe5b049350610c9885600163ffffffff6123f116565b8411158015610cb75750610cb384600163ffffffff6123f116565b8511155b15610cc3575050610ccd565b5050600101610c2c565b50610ce36001610c6d8a8463ffffffff6124a416565b9a9950505050505050505050565b6040518060400160405280600e81526020016d0845c829a9a4098aaa6885a8aa8960931b81525081565b600081610d34846b033b2e3c9fd0803ce80000006120dc565b81610d3b57fe5b049392505050565b6000806000807f000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610da257600080fd5b505afa925050508015610dc757506040513d6020811015610dc257600080fd5b505160015b610dd75760009350505050610ed5565b60ff1692507f000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015610e3557600080fd5b505afa925050508015610e7757506040513d60a0811015610e5557600080fd5b5080516020820151604083015160608401516080909401519293919290919060015b610e875760009350505050610ed5565b5091945090925050504281610e10011015610ea85760009350505050610ed5565b600a83900a80610ec684670de0b6b3a764000063ffffffff61244b16565b81610ecd57fe5b049450505050505b90565b6040805163ba22f7cb60e01b8152306004820152905160009182916001600160a01b037f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e42169163ba22f7cb916024808301926020929190829003018186803b158015610f4357600080fd5b505afa158015610f57573d6000803e3d6000fd5b505050506040513d6020811015610f6d57600080fd5b5051905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610fa857504761103d565b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a08231916024808301926020929190829003018186803b15801561100e57600080fd5b505afa158015611022573d6000803e3d6000fd5b505050506040513d602081101561103857600080fd5b505190505b61104d828263ffffffff6123f116565b9250505090565b60015490565b600061107761107184670de0b6b3a76400006120dc565b836124e6565b9392505050565b600081156110c9576040805162461bcd60e51b81526020600482015260136024820152721bdb9b1e481bdb994818dbdb1b185d195c985b606a1b604482015290519081900360640190fd5b507f0000000000000000000000000000000000000000000000000000000000000000919050565b60046020526000908152604090205481565b60036020526000908152604090205481565b60015481565b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e42169163eb9a2ed691602480820192602092909190829003018186803b15801561118457600080fd5b505afa158015611198573d6000803e3d6000fd5b505050506040513d60208110156111ae57600080fd5b5051905060006111bc610ed8565b905060006111e56001546111d9868661244b90919063ffffffff16565b9063ffffffff6124fd16565b905060006112026001546111d9878661244b90919063ffffffff16565b90507f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e426001600160a01b0316632e54bf95836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b5050505061128c338661253f565b811561132e576040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17169163a9059cbb9160448083019260209291908290030181600087803b15801561130157600080fd5b505af1158015611315573d6000803e3d6000fd5b505050506040513d602081101561132b57600080fd5b50505b801561133e5761133e338261258e565b6040805183815260208101839052808201879052905133917f5706e30facf103fa63b976a5142c96bb88e65a98f82412f1ddbef60ba7169557919081900360600190a25050505050565b7f000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f81565b601281565b7f000000000000000000000000a84e3d36f610c6ae079d60ad175de5757478dffb81565b60c881565b7f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e4281565b600061107761140d84846120dc565b6b033b2e3c9fd0803ce80000006124e6565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081610d3484670de0b6b3a76400006120dc565b60006b033b2e3c9fd0803ce8000000610d3484846120dc565b6000806114808760008761148c565b11979650505050505050565b600080600061149a86611efa565b91509150848210156114e6576040805162461bcd60e51b815260206004820152601060248201526f39bbb0b81d103637bb903932ba3ab93760811b604482015290519081900360640190fd5b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b15801561155b57600080fd5b505af115801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50506001600160a01b037f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e42166378c77a246115c6888463ffffffff6124a416565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b5050505060008111156116ea577f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f176001600160a01b031663a9059cbb7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156116bd57600080fd5b505af11580156116d1573d6000803e3d6000fd5b505050506040513d60208110156116e757600080fd5b50505b6116f4848361258e565b60408051878152602081018490524281830152905133917fc690f9b0d999c94570f07e58078c65fc21a4400d416daf05414dc565eb6a1342919081900360600190a250949350505050565b601481565b6001600160a01b031660009081526004602052604090205490565b7f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2481565b808201828110156117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b92915050565b7f0000000000000000000000000c0773b16c749bdb03c0350115e43e654e94113a81565b60008061180884611efa565b5090508361182482670de0b6b3a764000063ffffffff61244b16565b8161182b57fe5b049695505050505050565b6000670de0b6b3a7640000610d3484846120dc565b6005546001600160a01b031690565b6005546001600160a01b0316331490565b60405180604001604052806007815260200166098aaa6888aa8960cb1b81525081565b60005481565b670de0b6b3a764000081565b7f000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a3981565b7f000000000000000000000000000000000000000000000000000000000000001281565b808203828111156117d2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516375cd176b60e11b815230600482015290516000916001600160a01b037f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e42169163eb9a2ed691602480820192602092909190829003018186803b1580156119a257600080fd5b505afa1580156119b6573d6000803e3d6000fd5b505050506040513d60208110156119cc57600080fd5b5051905060006119da610ed8565b905060006119e6610d43565b90508115806119f55750600081115b611a46576040805162461bcd60e51b815260206004820152601a60248201527f6465706f7369743a20636861696e6c696e6b20697320646f776e000000000000604482015290519081900360640190fd5b6000611a7a670de0b6b3a7640000611a64858563ffffffff61244b16565b81611a6b57fe5b8691900463ffffffff6123f116565b90506000811180611a8b5750600154155b611adc576040805162461bcd60e51b815260206004820152601760248201527f6465706f7369743a2073797374656d2069732072656b74000000000000000000604482015290519081900360640190fd5b600154670de0b6b3a76400009015611b0e576001548290611b03908863ffffffff61244b16565b81611b0a57fe5b0490505b604080516323b872dd60e01b81523360048201523060248201526044810188905290516001600160a01b037f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1716916323b872dd9160648083019260209291908290030181600087803b158015611b8357600080fd5b505af1158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051611c00576040805162461bcd60e51b815260206004820152601c60248201527f6465706f7369743a207472616e7366657246726f6d206661696c656400000000604482015290519081900360640190fd5b7f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e426001600160a01b03166378c77a24876040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c6657600080fd5b505af1158015611c7a573d6000803e3d6000fd5b50505050611c883382612753565b6040805187815260208101839052815133927f2f1a7fda57b5fd5cb62770aebd7fc9a8a0a834c5ff558eb7562f85f2b28c4375928290030190a2505050505050565b7f000000000000000000000000000000000000000000000000000000000000019081565b606481565b60025481565b611d0161185a565b611d52576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6064811115611da8576040805162461bcd60e51b815260206004820152601960248201527f736574506172616d733a2066656520697320746f6f2062696700000000000000604482015290519081900360640190fd5b6014821015611df7576040805162461bcd60e51b81526020600482015260166024820152751cd95d14185c985b5cce8810481d1bdbc81cdb585b1b60521b604482015290519081900360640190fd5b60c8821115611e44576040805162461bcd60e51b8152602060048201526014602482015273736574506172616d733a204120746f6f2062696760601b604482015290519081900360640190fd5b60068190556007829055604080518381526020810183905281517f3d5244a9b2f415f6ebc57f5d8ca058f82b1561d1cbf0c010ab3e4a8773c1f6b5929181900390910190a15050565b6000806000611e9a610ed8565b90506000611ea6610d43565b80151594509050670de0b6b3a7640000611ec6838363ffffffff61244b16565b81611ecd57fe5b04925050509091565b7f422e414d4d00000000000000000000000000000000000000000000000000000081565b60008060007f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e426001600160a01b031663eb9a2ed6306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611f7557600080fd5b505afa158015611f89573d6000803e3d6000fd5b505050506040513d6020811015611f9f57600080fd5b505190506000611fad610ed8565b90506000611fb9610d43565b905080611fd05750600093508392506120d7915050565b6000670de0b6b3a7640000611feb848463ffffffff61244b16565b81611ff257fe5b0490506000612041836120138a670de0b6b3a764000063ffffffff61244b16565b8161201a57fe5b047f00000000000000000000000000000000000000000000000000000000000001906127a2565b90508785600061206861205b86600263ffffffff61244b16565b899063ffffffff6123f116565b9050600061207a848484600754610b72565b905060008761209783670de0b6b3a764000063ffffffff61244b16565b8161209e57fe5b049050808910156120ac5750875b808610156120b75750845b809b506120ca8d610c6d8f6006546127a2565b9a50505050505050505050505b915091565b60008115806120f7575050808202828282816120f457fe5b04145b6117d2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b7f00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f1781565b60006001546000141561217f5750670de0b6b3a7640000610ed5565b61219261218a611054565b600154611443565b9050610ed5565b7f000000000000000000000000000000000000000000000000000000000000000081565b60065481565b6000831580156121d1575082155b156121de57506000611077565b60006121f0858563ffffffff6123f116565b905060005b60ff81101561233857816122156001610c1989600263ffffffff61244b16565b612225828563ffffffff61244b16565b8161222c57fe5b0490506122456001610c1988600263ffffffff61244b16565b612255828563ffffffff61244b16565b8161225c57fe5b04905082600061229e82610b9961227a86600263ffffffff61244b16565b610c1961228d8e8e63ffffffff6123f116565b610b998d600263ffffffff61244b16565b905060006122bc86610b996001610c6d8c600263ffffffff61244b16565b90506122df6122d285600363ffffffff61244b16565b829063ffffffff6123f116565b82816122e757fe5b0495506122fb83600163ffffffff6123f116565b861115801561231a575061231686600163ffffffff6123f116565b8311155b156123285750505050612338565b5050600190920191506121f59050565b50949350505050565b61234961185a565b61239a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166123df5760405162461bcd60e51b81526004018080602001828103825260268152602001806130fd6026913960400191505060405180910390fd5b6123e881612868565b50565b60075481565b600082820183811015611077576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261245a575060006117d2565b8282028284828161246757fe5b04146110775760405162461bcd60e51b81526004018080602001828103825260218152602001806131456021913960400191505060405180910390fd5b600061107783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506128ba565b600081610d34846124f88560016118e8565b611783565b600061107783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612951565b61254982826129b6565b6040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316612652576040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612607576040519150601f19603f3d011682016040523d82523d6000602084013e61260c565b606091505b505090508061264c5760405162461bcd60e51b81526004018080602001828103825260228152602001806131236022913960400191505060405180910390fd5b5061274f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126d257600080fd5b505af11580156126e6573d6000803e3d6000fd5b505050506040513d60208110156126fc57600080fd5b505161274f576040805162461bcd60e51b815260206004820152601b60248201527f73656e64436f6c6c61746572616c3a2073776170206661696c65640000000000604482015290519081900360640190fd5b5050565b61275d8282612c15565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b60006127108213156127fb576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d6178000000000000604482015290519081900360640190fd5b61270f19821215612853576040805162461bcd60e51b815260206004820152601a60248201527f7265647563654270733a206270732065786365656473206d696e000000000000604482015290519081900360640190fd5b612710610d348484830163ffffffff61244b16565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081848411156129495760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561290e5781810151838201526020016128f6565b50505050905090810190601f16801561293b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836129a05760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561290e5781810151838201526020016128f6565b5060008385816129ac57fe5b0495945050505050565b6129c03383612ea2565b8015612bac576000612a026129f5837f00000000000000000000000000000000000000000000000000000000000000016120dc565b6129fd612163565b61105a565b905060008113612a1157600080fd5b7f0000000000000000000000000c0773b16c749bdb03c0350115e43e654e94113a6001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506040513d6020811015612abb57600080fd5b5051612ac657600080fd5b60408051633e6e9fef60e11b81527f422e414d4d00000000000000000000000000000000000000000000000000000060048201523360248201526000838103604483015291516001600160a01b037f000000000000000000000000a84e3d36f610c6ae079d60ad175de5757478dffb1692637cdd3fde926064808201939182900301818387803b158015612b5957600080fd5b505af1158015612b6d573d6000803e3d6000fd5b50505050612b7d600154826118e8565b60015533600090815260046020526040902054612b9a90826118e8565b33600090815260046020526040902055505b336000908152600460205260408120549054612bc891906113fe565b3360009081526003602090815260409182902092909255805183815290517fb20101a10c7cc8d4a9b5accf3d34c34f89d53ec195fce51620af16429526c755929181900390910190a15050565b612c1f8283612ea2565b8015612e27576000612c61612c54837f00000000000000000000000000000000000000000000000000000000000000016120dc565b612c5c612163565b611443565b905060008113612c7057600080fd5b604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b037f0000000000000000000000000c0773b16c749bdb03c0350115e43e654e94113a16916323b872dd9160648083019260209291908290030181600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b5051612d1a57600080fd5b7f000000000000000000000000a84e3d36f610c6ae079d60ad175de5757478dffb6001600160a01b0316637cdd3fde7f422e414d4d00000000000000000000000000000000000000000000000000000085846040518463ffffffff1660e01b815260040180848152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015612dc257600080fd5b505af1158015612dd6573d6000803e3d6000fd5b50505050612de660015482611783565b6001556001600160a01b038316600090815260046020526040902054612e0c9082611783565b6001600160a01b038416600090815260046020526040902055505b6001600160a01b0382166000908152600460205260408120549054612e4c91906113fe565b6001600160a01b03831660009081526003602090815260409182902092909255805183815290517f858d2e17a8121c939a8c52f6821c748d2592cc8ecd8e6afcda3fc4c84248002f929181900390910190a15050565b60015415612ec757612ec36000546124f8612ebb613056565b600154610d1b565b6000555b6001600160a01b03821660009081526003602090815260408083205460049092528220548254919291612efa9190611458565b905081811115612fbb577f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d246001600160a01b031663a9059cbb848484036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f8657600080fd5b505af1158015612f9a573d6000803e3d6000fd5b505050506040513d6020811015612fb057600080fd5b5051612fbb57600080fd5b604080516370a0823160e01b815230600482015290516001600160a01b037f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2416916370a08231916024808301926020929190829003018186803b15801561302157600080fd5b505afa158015613035573d6000803e3d6000fd5b505050506040513d602081101561304b57600080fd5b505160025550505050565b604080516370a0823160e01b815230600482015290516000916130f7916001600160a01b037f000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2416916370a08231916024808301926020929190829003018186803b1580156130c357600080fd5b505afa1580156130d7573d6000803e3d6000fd5b505050506040513d60208110156130ed57600080fd5b50516002546118e8565b90509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737373656e64436f6c6c61746572616c3a2073656e64696e6720455448206661696c6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212208f19ee1a8e3936423dc37facd5e87de2d1410dece6b54334e043f1af83053b6264736f6c634300060b0033

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

000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e4200000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d2400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000190000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a390000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _priceAggregator (address): 0x190b8C66E8e1694Ae9Ff16170122Feb2D287820f
Arg [1] : _SP (address): 0x64cA46508ad4559E1fD94B3cf48f3164B4a77E42
Arg [2] : _LUSD (address): 0x64343594Ab9b56e99087BfA6F2335Db24c2d1F17
Arg [3] : _LQTY (address): 0xa684cd057951541187f288294a1e1C2646aA2d24
Arg [4] : _collateral (address): 0x0000000000000000000000000000000000000000
Arg [5] : _maxDiscount (uint256): 400
Arg [6] : _feePool (address): 0xf2bb803010FA55ab60aF1a4740d1A1D6c9C93a39
Arg [7] : _fronEndTag (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000190b8c66e8e1694ae9ff16170122feb2d287820f
Arg [1] : 00000000000000000000000064ca46508ad4559e1fd94b3cf48f3164b4a77e42
Arg [2] : 00000000000000000000000064343594ab9b56e99087bfa6f2335db24c2d1f17
Arg [3] : 000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [6] : 000000000000000000000000f2bb803010fa55ab60af1a4740d1a1d6c9c93a39
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

25144:9093:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16762:672;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16762:672:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;8914:46;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6475:106;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6475:106:0;;;;;;;:::i;27071:1428::-;;;;;;;;;;;;;:::i;33548:429::-;;;;;;;;;;;;;:::i;9398:84::-;;;;;;;;;;;;;:::i;6084:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6084:114:0;;;;;;;:::i;32998:160::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32998:160:0;;:::i;:::-;;;;-1:-1:-1;;;;;32998:160:0;;;;;;;;;;;;;;4499:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4499:41:0;-1:-1:-1;;;;;4499:41:0;;:::i;4426:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4426:41:0;-1:-1:-1;;;;;4426:41:0;;:::i;4308:24::-;;;;;;;;;;;;;:::i;29551:733::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29551:733:0;;:::i;:::-;;25242:54;;;;;;;;;;;;;:::i;9015:34::-;;;;;;;;;;;;;:::i;3952:32::-;;;;;;;;;;;;;:::i;25626:::-;;;;;;;;;;;;;:::i;25383:37::-;;;;;;;;;;;;;:::i;6355:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6355:114:0;;;;;;;:::i;25737:36::-;;;;;;;;;;;;;:::i;5972:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5972:106:0;;;;;;;:::i;6243:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6243:106:0;;;;;;;:::i;32300:315::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32300:315:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;31648:594;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31648:594:0;;;;;;;;;;;-1:-1:-1;;;;;31648:594:0;;:::i;25588:31::-;;;;;;;;;;;;;:::i;9490:113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9490:113:0;-1:-1:-1;;;;;9490:113:0;;:::i;4189:34::-;;;;;;;;;;;;;:::i;5262:135::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5262:135:0;;;;;;;:::i;4069:32::-;;;;;;;;;;;;;:::i;32623:291::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32623:291:0;;;;;;;;;;;;;;;;;;;;;;:::i;5860:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5860:106:0;;;;;;;:::i;22136:79::-;;;;;;;;;;;;;:::i;22502:92::-;;;;;;;;;;;;;:::i;8967:41::-;;;;;;;;;;;;;:::i;4250:24::-;;;;;;;;;;;;;:::i;25782:37::-;;;;;;;;;;;;;:::i;25429:40::-;;;;;;;;;;;;;:::i;4131:32::-;;;;;;;;;;;;;:::i;5403:136::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5403:136:0;;;;;;;:::i;28507:1036::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28507:1036:0;;:::i;25671:33::-;;;;;;;;;;;;;:::i;25476:34::-;;;;;;;;;;;;;:::i;4366:24::-;;;;;;;;;;;;;:::i;26744:319::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26744:319:0;;;;;;;:::i;33985:249::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;4008:32;;;;;;;;;;;;;:::i;30546:1060::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30546:1060:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5545:149;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5545:149:0;;;;;;;:::i;25303:28::-;;;;;;;;;;;;;:::i;6825:126::-;;;;;;;;;;;;;:::i;25338:34::-;;;;;;;;;;;;;:::i;25523:19::-;;;;;;;;;;;;;:::i;16116:638::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16116:638:0;;;;;;;;;;;;:::i;22602:192::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22602:192:0;-1:-1:-1;;;;;22602:192:0;;:::i;25563:18::-;;;;;;;;;;;;;:::i;16762:672::-;16850:4;16867:8;16878:39;16895:8;16905;16915:1;16878:16;:39::i;:::-;16867:50;-1:-1:-1;16930:6:0;16954:27;16979:1;16955:18;:4;16964:8;16955:18;:8;:18;:::i;:::-;16954:24;:27;:24;:27;:::i;:::-;16939:12;16947:3;;16939:12;:7;:12;:::i;:::-;:42;;;;;;;-1:-1:-1;17009:8:0;:1;17015;17009:8;:5;:8;:::i;:::-;16996:10;:1;17002:3;16996:10;:5;:10;:::i;:::-;:21;;;;;;;-1:-1:-1;17028:6:0;17037:40;17068:8;:1;17074;17068:8;:5;:8;:::i;:::-;17062:3;:14;;;;;;17038:18;:4;17047:8;17038:18;:8;:18;:::i;:::-;17037:24;:40;:24;:40;:::i;:::-;17028:49;-1:-1:-1;17088:10:0;17122:3;17088:10;17138:247;17159:3;17155:1;:7;17138:247;;;17193:1;;-1:-1:-1;17193:1:0;;17209:6;17218:17;17233:1;17219:8;17193:1;;17219:8;:5;:8;:::i;17218:17::-;17209:26;-1:-1:-1;17250:6:0;17259:24;17279:3;17259:15;17272:1;17259:8;:1;17265;17259:8;:5;:8;:::i;:15::-;:19;:24;:19;:24;:::i;:::-;17250:33;;17307:1;17303;:5;;;;;;;-1:-1:-1;17333:12:0;:5;17343:1;17333:12;:9;:12;:::i;:::-;17328:1;:17;;:38;;;;-1:-1:-1;17358:8:0;:1;17364;17358:8;:5;:8;:::i;:::-;17349:5;:17;;17328:38;17325:48;;;17368:5;;;;17325:48;-1:-1:-1;;17165:3:0;;17138:247;;;-1:-1:-1;17404:22:0;17424:1;17404:15;:8;17417:1;17404:15;:12;:15;:::i;:22::-;17397:29;16762:672;-1:-1:-1;;;;;;;;;;16762:672:0:o;8914:46::-;;;;;;;;;;;;;;-1:-1:-1;;;8914:46:0;;;;:::o;6475:106::-;6532:9;6572:1;6558:11;6562:1;6228:8;6558:3;:11::i;:::-;:15;;;;;;;6475:106;-1:-1:-1;;;6475:106:0:o;27071:1428::-;27113:4;27130:22;27163:26;27200:23;27297:15;-1:-1:-1;;;;;27297:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27297:26:0;;;27293:338;;27618:1;27611:8;;;;;;;27293:338;27448:28;;;-1:-1:-1;27699:15:0;-1:-1:-1;;;;;27699:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27699:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27695:589;;28271:1;28264:8;;;;;;;27695:589;-1:-1:-1;28077:6:0;;-1:-1:-1;28120:9:0;;-1:-1:-1;;;28330:3:0;28299:18;28320:7;28299:28;:34;28296:47;;;28342:1;28335:8;;;;;;;28296:47;28396:2;:23;;;;28437:36;:21;25815:4;28437:36;:25;:36;:::i;:::-;:54;;;;;;28430:61;;;;;;27071:1428;;:::o;33548:429::-;33634:39;;;-1:-1:-1;;;33634:39:0;;33667:4;33634:39;;;;;;33600:4;;;;-1:-1:-1;;;;;33634:2:0;:24;;;;:39;;;;;;;;;;;;;;:24;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33634:39:0;;-1:-1:-1;33684:20:0;33720:10;-1:-1:-1;;;;;33720:25:0;33717:203;;-1:-1:-1;33780:21:0;33717:203;;;33873:35;;;-1:-1:-1;;;33873:35:0;;33902:4;33873:35;;;;;;-1:-1:-1;;;;;33873:10:0;:20;;;;:35;;;;;;;;;;;;;;:20;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33873:35:0;;-1:-1:-1;33717:203:0;33939:30;:9;33953:15;33939:30;:13;:30;:::i;:::-;33932:37;;;;33548:429;:::o;9398:84::-;9469:5;;9398:84;:::o;6084:114::-;6143:9;6169:21;6175:11;6179:1;5845:8;6175:3;:11::i;:::-;6188:1;6169:5;:21::i;:::-;6165:25;6084:114;-1:-1:-1;;;6084:114:0:o;32998:160::-;33051:7;33079:10;;33071:42;;;;;-1:-1:-1;;;33071:42:0;;;;;;;;;;;;-1:-1:-1;;;33071:42:0;;;;;;;;;;;;;;;-1:-1:-1;33139:10:0;32998:160;;;:::o;4499:41::-;;;;;;;;;;;;;:::o;4426:::-;;;;;;;;;;;;;:::o;4308:24::-;;;;:::o;29551:733::-;29622:41;;;-1:-1:-1;;;29622:41:0;;29657:4;29622:41;;;;;;29605:14;;-1:-1:-1;;;;;29622:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29622:41:0;;-1:-1:-1;29674:13:0;29690:22;:20;:22::i;:::-;29674:38;;29725:15;29743:35;29772:5;;29743:24;29757:9;29743;:13;;:24;;;;:::i;:::-;:28;:35;:28;:35;:::i;:::-;29725:53;;29789:14;29806:34;29834:5;;29806:23;29819:9;29806:8;:12;;:23;;;;:::i;:34::-;29789:51;;29900:2;-1:-1:-1;;;;;29900:17:0;;29918:10;29900:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29970:27;29975:10;29987:9;29970:4;:27::i;:::-;30043:14;;30040:56;;30059:37;;;-1:-1:-1;;;30059:37:0;;30073:10;30059:37;;;;;;;;;;;;-1:-1:-1;;;;;30059:4:0;:13;;;;:37;;;;;;;;;;;;;;-1:-1:-1;30059:13:0;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30040:56:0;30110:13;;30107:82;;30140:37;30155:10;30167:9;30140:14;:37::i;:::-;30206:58;;;;;;;;;;;;;;;;;;;;30219:10;;30206:58;;;;;;;;;;29551:733;;;;;:::o;25242:54::-;;;:::o;9015:34::-;9047:2;9015:34;:::o;3952:32::-;;;:::o;25626:::-;25655:3;25626:32;:::o;25383:37::-;;;:::o;6355:114::-;6414:9;6440:21;6446:9;6450:1;6453;6446:3;:9::i;:::-;6228:8;6440:5;:21::i;25737:36::-;;;:::o;5972:106::-;6029:9;6069:1;6055:11;6059:1;5845:8;6055:3;:11::i;6243:106::-;6300:9;6228:8;6326:9;6330:1;6333;6326:3;:9::i;32300:315::-;32548:4;32606:1;32572:31;32577:9;32588:1;32591:11;32572:4;:31::i;:::-;:35;;32300:315;-1:-1:-1;;;;;;;32300:315:0:o;31648:594::-;31735:4;31753:14;31769;31787:28;31804:10;31787:16;:28::i;:::-;31752:63;;;;31849:12;31836:9;:25;;31828:54;;;;;-1:-1:-1;;;31828:54:0;;;;;;;;;;;;-1:-1:-1;;;31828:54:0;;;;;;;;;;;;;;;31895:56;;;-1:-1:-1;;;31895:56:0;;31913:10;31895:56;;;;31933:4;31895:56;;;;;;;;;;;;-1:-1:-1;;;;;31895:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;31895:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;31962:2:0;:14;;31977:25;:10;31992:9;31977:25;:14;:25;:::i;:::-;31962:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32031:1;32019:9;:13;32016:51;;;32034:4;-1:-1:-1;;;;;32034:13:0;;32048:7;32057:9;32034:33;;;;;;;;;;;;;-1:-1:-1;;;;;32034:33:0;-1:-1:-1;;;;;32034:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32016:51:0;32078:31;32093:4;32099:9;32078:14;:31::i;:::-;32152:53;;;;;;;;;;;;32201:3;32152:53;;;;;;32166:10;;32152:53;;;;;;;;;;-1:-1:-1;32225:9:0;31648:594;-1:-1:-1;;;;31648:594:0:o;25588:31::-;25617:2;25588:31;:::o;9490:113::-;-1:-1:-1;;;;;9583:12:0;9545:15;9583:12;;;:5;:12;;;;;;;9490:113::o;4189:34::-;;;:::o;5262:135::-;5353:5;;;5348:16;;;;5340:49;;;;;-1:-1:-1;;;5340:49:0;;;;;;;;;;;;-1:-1:-1;;;5340:49:0;;;;;;;;;;;;;;;5262:135;;;;:::o;4069:32::-;;;:::o;32623:291::-;32796:7;32817:11;32834:24;32851:6;32834:16;:24::i;:::-;-1:-1:-1;32816:42:0;-1:-1:-1;32900:6:0;32876:21;32816:42;25815:4;32876:21;:10;:21;:::i;:::-;:30;;;;;;;32623:291;-1:-1:-1;;;;;;32623:291:0:o;5860:106::-;5917:9;5845:8;5943:9;5947:1;5950;5943:3;:9::i;22136:79::-;22201:6;;-1:-1:-1;;;;;22201:6:0;22136:79;:::o;22502:92::-;22580:6;;-1:-1:-1;;;;;22580:6:0;22566:10;:20;;22502:92::o;8967:41::-;;;;;;;;;;;;;;-1:-1:-1;;;8967:41:0;;;;:::o;4250:24::-;;;;:::o;25782:37::-;25815:4;25782:37;:::o;25429:40::-;;;:::o;4131:32::-;;;:::o;5403:136::-;5494:5;;;5489:16;;;;5481:50;;;;;-1:-1:-1;;;5481:50:0;;;;;;;;;;;;-1:-1:-1;;;5481:50:0;;;;;;;;;;;;;;28507:1036;28611:41;;;-1:-1:-1;;;28611:41:0;;28646:4;28611:41;;;;;;28594:14;;-1:-1:-1;;;;;28611:2:0;:26;;;;:41;;;;;;;;;;;;;;;:26;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28611:41:0;;-1:-1:-1;28663:13:0;28679:22;:20;:22::i;:::-;28663:38;;28714:10;28727:12;:10;:12::i;:::-;28714:25;-1:-1:-1;28758:13:0;;;:26;;;28783:1;28775:5;:9;28758:26;28750:65;;;;;-1:-1:-1;;;28750:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28828:15;28846:46;25815:4;28860:19;:8;28873:5;28860:19;:12;:19;:::i;:::-;:31;;;;;28846:9;;28860:31;;28846:46;:13;:46;:::i;:::-;28828:64;;29079:1;29066:10;:14;:28;;;-1:-1:-1;29084:5:0;;:10;29066:28;29058:64;;;;;-1:-1:-1;;;29058:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29174:5;;25815:4;;29174:9;29171:59;;29196:5;;29220:10;;29196:21;;29206:10;29196:21;:9;:21;:::i;:::-;:34;;;;;;29185:45;;29171:59;29271:56;;;-1:-1:-1;;;29271:56:0;;29289:10;29271:56;;;;29309:4;29271:56;;;;;;;;;;;;-1:-1:-1;;;;;29271:4:0;:17;;;;:56;;;;;;;;;;;;;;-1:-1:-1;29271:17:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29271:56:0;29263:97;;;;;-1:-1:-1;;;29263:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29371:2;-1:-1:-1;;;;;29371:14:0;;29386:10;29371:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29438;29443:10;29455:8;29438:4;:26::i;:::-;29482:45;;;;;;;;;;;;;;29494:10;;29482:45;;;;;;;;28507:1036;;;;;;:::o;25671:33::-;;;:::o;25476:34::-;25507:3;25476:34;:::o;4366:24::-;;;;:::o;26744:319::-;22348:9;:7;:9::i;:::-;22340:54;;;;;-1:-1:-1;;;22340:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25507:3:::1;26821:4;:15;;26813:53;;;::::0;;-1:-1:-1;;;26813:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25617:2;26885;:11;;26877:46;;;::::0;;-1:-1:-1;;;26877:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26877:46:0;;;;;;;;;;;;;::::1;;25655:3;26942:2;:11;;26934:44;;;::::0;;-1:-1:-1;;;26934:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26934:44:0;;;;;;;;;;;;;::::1;;26991:3;:10:::0;;;27012:1:::1;:6:::0;;;27036:19:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;26744:319:::0;;:::o;33985:249::-;34035:9;34046:10;34069:13;34085:22;:20;:22::i;:::-;34069:38;;34120:10;34133:12;:10;:12::i;:::-;34165:9;;;;-1:-1:-1;34120:25:0;-1:-1:-1;25815:4:0;34194:19;:8;34120:25;34194:19;:12;:19;:::i;:::-;:31;;;;;;34185:41;;33985:249;;;;:::o;4008:32::-;;;:::o;30546:1060::-;30606:14;30622:18;30653:16;30672:2;-1:-1:-1;;;;;30672:26:0;;30707:4;30672:41;;;;;;;;;;;;;-1:-1:-1;;;;;30672:41:0;-1:-1:-1;;;;;30672:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30672:41:0;;-1:-1:-1;30724:15:0;30743:22;:20;:22::i;:::-;30724:41;;30778:17;30798:12;:10;:12::i;:::-;30778:32;-1:-1:-1;30824:17:0;30821:35;;-1:-1:-1;30851:1:0;;-1:-1:-1;30851:1:0;;-1:-1:-1;30843:13:0;;-1:-1:-1;;30843:13:0;30821:35;30890:16;25815:4;30909:28;:10;30924:12;30909:28;:14;:28;:::i;:::-;:40;;;;;;;-1:-1:-1;30960:14:0;30977:63;31009:12;30984:22;:7;25815:4;30984:22;:11;:22;:::i;:::-;:37;;;;;;31027:11;30977:6;:63::i;:::-;30960:80;-1:-1:-1;31065:7:0;31099:11;31053:9;31137:35;31153:18;:11;31169:1;31153:18;:15;:18;:::i;:::-;31137:11;;:35;:15;:35;:::i;:::-;31121:51;;31193:14;31210:38;31220:4;31226:8;31236;31246:1;;31210:9;:38::i;:::-;31193:55;-1:-1:-1;31259:19:0;31308:12;31281:24;31193:55;25815:4;31281:24;:13;:24;:::i;:::-;:39;;;;;;31259:61;;31349:14;31336:10;:27;31333:59;;;-1:-1:-1;31382:10:0;31333:59;31452:14;31440:9;:26;31437:57;;;-1:-1:-1;31485:9:0;31437:57;31519:14;31507:26;;31560:38;31590:7;31560:25;31567:7;31580:3;;31560:6;:25::i;:38::-;31544:54;;30546:1060;;;;;;;;;;;;;;:::o;5545:149::-;5601:9;5631:6;;;:30;;-1:-1:-1;;5646:5:0;;;5660:1;5655;5646:5;5655:1;5641:15;;;;;:20;5631:30;5623:63;;;;;-1:-1:-1;;;5623:63:0;;;;;;;;;;;;-1:-1:-1;;;5623:63:0;;;;;;;;;;;;;;25303:28;;;:::o;6825:126::-;6856:7;6880:5;;6889:1;6880:10;6876:67;;;-1:-1:-1;5845:8:0;6892:10;;6876:67;6925:18;6930:5;:3;:5::i;:::-;6937;;6925:4;:18::i;:::-;6918:25;;;;25338:34;;;:::o;25523:19::-;;;;:::o;16116:638::-;16186:4;16206:6;;:16;;;;-1:-1:-1;16216:6:0;;16206:16;16203:29;;;-1:-1:-1;16231:1:0;16224:8;;16203:29;16245:8;16256;:1;16262;16256:8;:5;:8;:::i;:::-;16245:19;-1:-1:-1;16281:6:0;16277:447;16298:3;16294:1;:7;16277:447;;;16334:3;16371:17;16386:1;16372:8;:1;16378;16372:8;:5;:8;:::i;16371:17::-;16357:11;:2;16364:3;16357:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;16422:17:0;16437:1;16423:8;:1;16429;16423:8;:5;:8;:::i;16422:17::-;16408:11;:2;16415:3;16408:11;:6;:11;:::i;:::-;:31;;;;;;;-1:-1:-1;16471:3:0;16456:12;16500:48;16471:3;16501:37;16528:9;16408:31;16535:1;16528:9;:6;:9;:::i;:::-;16501:22;16514:8;:1;16520;16514:8;:5;:8;:::i;:::-;16501;:1;16507;16501:8;:5;:8;:::i;16500:48::-;16491:57;-1:-1:-1;16563:6:0;16573:24;16593:3;16573:15;16586:1;16573:8;:1;16579;16573:8;:5;:8;:::i;:24::-;16563:35;-1:-1:-1;16623:16:0;16629:9;:2;16636:1;16629:9;:6;:9;:::i;:::-;16623:1;;:16;:5;:16;:::i;:::-;16619:1;:20;;;;;;;-1:-1:-1;16666:14:0;:7;16678:1;16666:14;:11;:14;:::i;:::-;16659:3;:21;;:46;;;;-1:-1:-1;16695:10:0;:3;16703:1;16695:10;:7;:10;:::i;:::-;16684:7;:21;;16659:46;16656:56;;;16707:5;;;;;;16656:56;-1:-1:-1;;16304:3:0;;;;;-1:-1:-1;16277:447:0;;-1:-1:-1;16277:447:0;;-1:-1:-1;16743:3:0;16116:638;-1:-1:-1;;;;16116:638:0:o;22602:192::-;22348:9;:7;:9::i;:::-;22340:54;;;;;-1:-1:-1;;;22340:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22691:22:0;::::1;22683:73;;;;-1:-1:-1::0;;;22683:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22767:19;22777:8;22767:9;:19::i;:::-;22602:192:::0;:::o;25563:18::-;;;;:::o;11366:181::-;11424:7;11456:5;;;11480:6;;;;11472:46;;;;;-1:-1:-1;;;11472:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12738:471;12796:7;13041:6;13037:47;;-1:-1:-1;13071:1:0;13064:8;;13037:47;13108:5;;;13112:1;13108;:5;:1;13132:5;;;;;:10;13124:56;;;;-1:-1:-1;;;13124:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11822:136;11880:7;11907:43;11911:1;11914;11907:43;;;;;;;;;;;;;;;;;:3;:43::i;5700:115::-;5760:9;5806:1;5786:17;5790:1;5793:9;5797:1;5800;5793:3;:9::i;:::-;5786:3;:17::i;13677:132::-;13735:7;13762:39;13766:1;13769;13762:39;;;;;;;;;;;;;;;;;:3;:39::i;9755:153::-;9824:18;9829:5;9836;9824:4;:18::i;:::-;9858:34;;;;;;;;9882:1;;-1:-1:-1;;;;;9858:34:0;;;;;;;;;;;;9755:153;;:::o;33166:374::-;33238:10;-1:-1:-1;;;;;33238:25:0;33235:298;;33299:28;;33281:12;;-1:-1:-1;;;;;33299:7:0;;;33315:6;;33281:12;33299:28;33281:12;33299:28;33315:6;33299:7;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33280:47;;;33350:7;33342:54;;;;-1:-1:-1;;;33342:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33235:298;;;;33458:10;-1:-1:-1;;;;;33458:19:0;;33478:2;33482:6;33458:31;;;;;;;;;;;;;-1:-1:-1;;;;;33458:31:0;-1:-1:-1;;;;;33458:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33458:31:0;33450:71;;;;;-1:-1:-1;;;33450:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33166:374;;:::o;9611:136::-;9677:15;9682:2;9686:5;9677:4;:15::i;:::-;9708:31;;;;;;;;-1:-1:-1;;;;;9708:31:0;;;9725:1;;9708:31;;;;;;;;;9611:136;;:::o;30292:246::-;30347:4;30379:5;30372:3;:12;;30364:51;;;;;-1:-1:-1;;;30364:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30434:3:0;:13;;30426:52;;;;;-1:-1:-1;;;30426:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30525:5;30498:24;:1;30509:11;;;30498:24;:5;:24;:::i;22802:173::-;22877:6;;;-1:-1:-1;;;;;22894:17:0;;;-1:-1:-1;;;;;;22894:17:0;;;;;;;22927:40;;22877:6;;;22894:17;22877:6;;22927:40;;22858:16;;22927:40;22802:173;;:::o;12295:192::-;12381:7;12417:12;12409:6;;;;12401:29;;;;-1:-1:-1;;;12401:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12453:5:0;;;12295:192::o;14339:345::-;14425:7;14527:12;14520:5;14512:28;;;;-1:-1:-1;;;14512:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14551:9;14567:1;14563;:5;;;;;;;14339:345;-1:-1:-1;;;;;14339:345:0:o;8059:645::-;8127:24;8135:10;8147:3;8127:7;:24::i;:::-;8166:7;;8162:447;;8190:11;8204:45;8211:30;8215:3;8220:20;8211:3;:30::i;:::-;8243:5;:3;:5::i;:::-;8204:6;:45::i;:::-;8190:59;;8391:1;8384:3;8377:15;8369:24;;;;;;8418:3;-1:-1:-1;;;;;8418:12:0;;8431:3;8436;8418:22;;;;;;;;;;;;;-1:-1:-1;;;;;8418:22:0;-1:-1:-1;;;;;8418:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8418:22:0;8410:31;;;;;;8456:39;;;-1:-1:-1;;;8456:39:0;;8465:3;8456:39;;;;8470:10;8456:39;;;;8482:12;;;;8456:39;;;;;;-1:-1:-1;;;;;8456:3:0;:8;;;;:39;;;;;;;;;;;8482:12;8456:8;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8520:15;8524:5;;8531:3;8520;:15::i;:::-;8512:5;:23;8580:10;8574:17;;;;:5;:17;;;;;;8570:27;;8593:3;8570;:27::i;:::-;8556:10;8550:17;;;;:5;:17;;;;;:47;-1:-1:-1;8162:447:0;8652:10;8646:17;;;;:5;:17;;;;;;8665:5;;8639:32;;8646:17;8639:6;:32::i;:::-;8625:10;8619:17;;;;:5;:17;;;;;;;;;:52;;;;8687:9;;;;;;;;;;;;;;;;;;8059:645;;:::o;7425:626::-;7493:17;7501:3;7506;7493:7;:17::i;:::-;7525:7;;7521:449;;7549:11;7563:43;7568:30;7572:3;7577:20;7568:3;:30::i;:::-;7600:5;:3;:5::i;:::-;7563:4;:43::i;:::-;7549:57;;7748:1;7741:3;7734:15;7726:24;;;;;;7775:48;;;-1:-1:-1;;;7775:48:0;;7792:10;7775:48;;;;7812:4;7775:48;;;;;;;;;;;;-1:-1:-1;;;;;7775:3:0;:16;;;;:48;;;;;;;;;;;;;;-1:-1:-1;7775:16:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7775:48:0;7767:57;;;;;;7839:3;-1:-1:-1;;;;;7839:8:0;;7848:3;7853;7865;7839:31;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7839:31:0;-1:-1:-1;;;;;7839:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7895:15;7899:5;;7906:3;7895;:15::i;:::-;7887:5;:23;-1:-1:-1;;;;;7942:10:0;;;;;;:5;:10;;;;;;7938:20;;7954:3;7938;:20::i;:::-;-1:-1:-1;;;;;7925:10:0;;;;;;:5;:10;;;;;:33;-1:-1:-1;7521:449:0;-1:-1:-1;;;;;8000:10:0;;;;;;:5;:10;;;;;;8012:5;;7993:25;;8000:10;7993:6;:25::i;:::-;-1:-1:-1;;;;;7980:10:0;;;;;;:5;:10;;;;;;;;;:38;;;;8034:9;;;;;;;;;;;;;;;;;;7425:626;;:::o;7086:331::-;7153:5;;:9;7149:54;;7172:31;7176:5;;7183:19;7188:6;:4;:6::i;:::-;7196:5;;7183:4;:19::i;7172:31::-;7164:5;:39;7149:54;-1:-1:-1;;;;;7231:11:0;;7216:12;7231:11;;;:5;:11;;;;;;;;;7273:5;:11;;;;;;7286:5;;7231:11;;7216:12;7268:24;;7273:11;7268:4;:24::i;:::-;7253:39;;7314:4;7307;:11;7303:57;;;7328:5;-1:-1:-1;;;;;7328:14:0;;7343:2;7354:4;7347;:11;7328:31;;;;;;;;;;;;;-1:-1:-1;;;;;7328:31:0;-1:-1:-1;;;;;7328:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7328:31:0;7320:40;;;;;;7379:30;;;-1:-1:-1;;;7379:30:0;;7403:4;7379:30;;;;;;-1:-1:-1;;;;;7379:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7379:30:0;7371:5;:38;-1:-1:-1;;;;7086:331:0:o;6959:119::-;7032:30;;;-1:-1:-1;;;7032:30:0;;7056:4;7032:30;;;;;;7001:7;;7028:42;;-1:-1:-1;;;;;7032:5:0;:15;;;;:30;;;;;;;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:30:0;7064:5;;7028:3;:42::i;:::-;7021:49;;6959:119;:::o

Swarm Source

ipfs://e6b5c0eb67145cffbf00803a59a0bb57cb7408977cb3f5c56b700de88a813961
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.