Contract 0x00000000357646e36Fe575885Bb3e1A0772E64Cc 2

 
Txn Hash Method
Block
From
To
Value
0x920d7851dc8de1b7e089a073c0bf5317f6624024940de576ad11729c9ea8800bDefect133192282021-09-29 6:57:0327 days 11 hrs ago0xcdae1bab521e6ad0756f41166e1ac68d4b5ba55a IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.005396338591 55.850576913
0x2496da44f67e1c33e0dace8746e1de200e400b9b65c66634c75c50c9205842fdDefect109483372020-09-28 2:19:59393 days 16 hrs agoENS Name defaang.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00419153411354.000001459
0xff0b16b64010081adb210f56c86f99881cfea510a5ddf5359d23f5a35a5fe8fbDefect105202402020-07-24 5:07:45459 days 13 hrs agoGitcoin Grants: WhatIsOnchain IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00458034759
0x17c8ab078719573ad04aecf55a5f0520ba264aa2c41a1e4c56c5125a88c8e99aDefect104726122020-07-16 20:14:39466 days 22 hrs ago0xc17b314eb8116672caf765db59c818cca753acbf IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00407585244
0x924ef42c979841411086acc4c46761bd1792d486d62c7a281cf95e5154e1e5acDefect104435412020-07-12 8:12:11471 days 10 hrs agoENS Name bakkdoor.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00201783426
0x58c5d2ff0176c020e0b4d9334075724de37524f630239852ec49af315b37ae42Defect104215792020-07-08 22:29:49474 days 19 hrs agoENS Name chazschmidt.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.002018614621.8
0x76124ab8067796887e247dd8f502f6e8066eee3251967e9d54243cb5545b36fcDefect101814322020-06-01 17:54:22512 days 29 mins agoENS Name kingjacob.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00170739822
0xa319b5e379a7a705e2608a355770751015d21c661e2b7c5d31e6af81bf7ad430Defect101646122020-05-30 3:06:29514 days 15 hrs agoENS Name coopahtroopa.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0015519420
0x15b2e3bdaacd139ee3c8a429f61d318f07b13b50ef9912b5e458fd411ad8a9d2Defect99808792020-05-01 14:33:19543 days 3 hrs ago0x2dac7e6a5c9f607090a91ec6842038dfd7da8f8f IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00120422913
0x9ba467e0ad3dc4b17da0ffb5cc3a9ac0b3d7adab7041b363d7b1cfc0413108f3Defect99765462020-04-30 22:30:02543 days 19 hrs ago0x39811d0733b1f44407d4bae21d9106ffd983b44f IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0005556546
0xa894446812b178ed135dc22f99e40cd78b831e033759b974d63a9aa731c4b6b3Defect99755362020-04-30 18:27:43543 days 23 hrs ago0xaa679e4ee126f49c4c7e06bffae0f64562e74deb IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0006984819
0x9a6609f5a6fa3a9e3dced42cbeb6bc4ebeb041406a522ee6c57747846a8ed179Defect99607872020-04-28 11:37:13546 days 6 hrs ago0xc169699a825066f2f07e0b29c4082094b32a3f3e IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00025618893.3
0xeb5d0920da400666da4db9f4839636ce9e7fd9cf33462519987bd259356368d6Defect99298512020-04-23 16:35:01551 days 1 hr agoENS Name cry.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00062853578.1
0x0f7d527e96746e6630b48d188ea3d11c7276c0d5cabc89f03498c253bebe4e5fDefect99102692020-04-20 16:07:52554 days 2 hrs agoENS Name defaang.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00094685368.8
0x8d86d05b6a861020c601bf82566864428d5902a69e1ea98a5fa1355c92e3e9e2Defect99098972020-04-20 14:42:34554 days 3 hrs agoENS Name poap.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00071400289.2
0xbd60365c9c65f94227f6e7b8429e825ea65d8f2fa7793ec7eb04dca936f216e3Defect99098862020-04-20 14:41:11554 days 3 hrs agoENS Name patricioworthalter.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.00072941189.4
0xbd34cb1964c9956a42a56c9fbcb8478058327c516c2344e6f05a22c45a341f63Defect99042902020-04-19 17:45:04555 days 38 mins ago0xd9dad787111b045a90d637325d8396d54ff51f16 IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0007408728
0x0c1dd332339fd81ab4bebbc1beba0a25fa982bfd97dd1ba4a0152df6b7c5b545Defect98972522020-04-18 15:36:29556 days 2 hrs ago0xcbe10324ae2d82fb618fc4a17a1d19d0b0ca9b9f IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0005556546
0x74686a9aa455318a1580d9d0d2a40cb55ff4fad85856d6843174844e139bf143Defect98956932020-04-18 9:39:39556 days 8 hrs ago0x64814817b4174c4b0fab09b87122cf62c9907788 IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0009263310
0x00b9e674b2cc2a88ef83853bf79ed3fd74578abfbeba5dd83865dd2dea13c7ccEnlist98875312020-04-17 3:25:27557 days 14 hrs agoENS Name iii.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0001575287
0x70188c50021d8db187ab6e7a12226368ed26140a0913d7462aea38a3b8069d4eEnlist98875272020-04-17 3:24:54557 days 14 hrs agoENS Name iii.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0002025369
0x083234a8ccab5700a85e8699325a0d09fc2fe0911b55c83baac59cb40c614d9dEnlist98875122020-04-17 3:20:46557 days 15 hrs agoENS Name iii.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0003375615
0x457004b39f5d1e619af8e46e769c871a7c525dbaf7326669ccc10f58d0d75823Enlist98874442020-04-17 3:04:40557 days 15 hrs agoENS Name iii.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0003375615
0xcbe29431dcf502fb3671fd3bec80902b26641b2fa43d98a98640c7d2825417adEnlist98874342020-04-17 3:03:28557 days 15 hrs agoENS Name iii.eth IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.0002025369
0x81e6cf37553ae4a04b682748acfa8ee45ebcbfe6b1dbf24440aec5ce1619eba7Defect98824502020-04-16 8:39:40558 days 9 hrs ago0x75086316ae15b560186878cab2aef4db6b924285 IN  0x00000000357646e36fe575885bb3e1a0772e64cc0 Ether0.001556234416.8
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x76a62ca3f56627a74bd095e7142a49fb36e7f39a647a0c84c2741179b95c8bd796978362020-03-18 20:44:13586 days 21 hrs ago 0x0000000000ffe8b47b3e2130213b802212439497  Contract Creation0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DaiBackstopSyndicateV3

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-03-18
*/

pragma solidity 0.5.16; // optimization runs: 200


interface IDaiBackstopSyndicate {
  event AuctionEntered(uint256 auctionId, uint256 mkrAsk, uint256 daiBid);
  event AuctionFinalized(uint256 auctionId);

  enum Status {
    ACCEPTING_DEPOSITS,
    ACTIVATED,
    DEACTIVATED
  }

  // Anyone can deposit Dai up until the auctions have started at 1:1
  function enlist(uint256 daiAmount) external returns (uint256 backstopTokensMinted);

  // Anyone can withdraw at any point as long as Dai is not locked in auctions
  function defect(uint256 backstopTokenAmount) external returns (uint256 daiRedeemed, uint256 mkrRedeemed);

  // Anyone can enter an auction for the syndicate, bidding Dai in return for MKR
  function enterAuction(uint256 auctionId) external;

  // Anyone can finalize an auction, returning the Dai or MKR to the syndicate
  function finalizeAuction(uint256 auctionId) external;

  // An owner can halt all new deposits and auctions (but not withdrawals or ongoing auctions)
  function ceaseFire() external;
  
  /// Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat);

  /// Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions);

  /// Return total amount of DAI that is *not* currently being used in auctions
  function getAvailableDaiBalance() external view returns (uint256 daiInVat);

  /// Return total amount of MKR that is currently held by Syndicate
  function getMKRBalance() external view returns (uint256 mkr);

  /// Do a "dry-run" of a withdrawal of some amount of tokens
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  );

  // Determine if the contract is accepting deposits (0), active (1), or deactivated (2).
  function getStatus() external view returns (Status status);

  // Return all auctions that the syndicate is currently participating in.
  function getActiveAuctions() external view returns (uint256[] memory activeAuctions);
}


interface IJoin {
    function join(address, uint256) external;
    function exit(address, uint256) external;
}


interface IVat {
    function dai(address) external view returns (uint256);
    function hope(address) external;
    function move(address, address, uint256) external;
}


interface IFlopper {
    // --- Auth ---
    // caller authorization (1 = authorized, 0 = not authorized)
    function wards(address) external view returns (uint256);
    // authorize caller
    function rely(address usr) external;
    // deauthorize caller
    function deny(address usr) external;

    // Bid objects
    function bids(uint256) external view returns (
        uint256 bid,
        uint256 lot,
        address guy,
        uint48 tic,
        uint48 end
    );

    // DAI contract address
    function vat() external view returns (address);
    // MKR contract address
    function gem() external view returns (address);

    // num decimals (constant)
    function ONE() external pure returns (uint256);

    // minimum bid increase (config - 5% initial)
    function beg() external view returns (uint256);
    // initial lot increase (config - 50% initial)
    function pad() external view returns (uint256);
    // bid lifetime (config - 3 hours initial)
    function ttl() external view returns (uint48);
    // total auction length (config - 2 days initial)
    function tau() external view returns (uint48);

    // number of auctions
    function kicks() external view returns (uint256);
    // status of the auction (1 = active, 0 = disabled)
    function live() external view returns (uint256);
    // user who shut down flopper mechanism and paid off last bid
    function vow() external view returns (address);

    // --- Events ---
    event Kick(uint256 id, uint256 lot, uint256 bid, address indexed gal);

    // --- Admin ---
    function file(bytes32 what, uint256 data) external;

    // --- Auction ---

    // create an auction 
    // access control: authed
    // state machine: after auction expired
    // gal - recipient of the dai
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    // id - id of the auction
    function kick(address gal, uint256 lot, uint256 bid) external returns (uint256 id);

    // extend the auction and increase minimum maker amount minted
    // access control: not-authed
    // state machine: after auction expiry, before first bid
    // id - id of the auction
    function tick(uint256 id) external;

    // bid up auction and refund locked up dai to previous bidder
    // access control: not-authed
    // state machine: before auction expired
    // id - id of the auction
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    function dent(uint256 id, uint256 lot, uint256 bid) external;

    // finalize auction
    // access control: not-authed
    // state machine: after auction expired
    // id - id of the auction
    function deal(uint256 id) external;

    // --- Shutdown ---

    // shutdown flopper mechanism
    // access control: authed
    // state machine: anytime
    function cage() external;

    // get cancelled bid back
    // access control: authed
    // state machine: after shutdown
    function yank(uint256 id) external;
}


/**
 * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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


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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

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

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

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

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

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

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

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}


contract SimpleFlopper {

  // A "flopper" is a contract for auctioning off MKR in exchange for Dai.
  IFlopper internal constant _auction = IFlopper(
    0x4D95A049d5B0b7d32058cd3F2163015747522e99
  );

  // Getters //

  /// @notice Get the status of the flopper contract
  /// @return bool status true if auction contract is enabled
  function isEnabled() public view returns (bool status) {
    return (_auction.live() == 1) ? true : false;
  }

  /// @notice Get the id of the latest auction
  /// @return auctionID uint256 id
  function getTotalNumberOfAuctions() public view returns (uint256 auctionID) {
    return _auction.kicks();
  }

  /// @notice Get the address of the auction contract (Flopper)
  /// @return Auction address
  function getFlopperAddress() public pure returns (address flopper) {
    return address(_auction);
  }

  /// @notice Get the flopper contract config
  /// @return bidIncrement uint256 minimum bid increment as percentage (initial = 1.05E18)
  /// @return repriceIncrement uint256 reprice increment as percentage (initial = 1.50E18)
  /// @return bidDuration uint256 duration of a bid in seconds (initial = 3 hours)
  /// @return auctionDuration uint256 initial duration of an auction in seconds (initial = 2 days)
  function getAuctionInformation() public view returns (
    uint256 bidIncrement,
    uint256 repriceIncrement,
    uint256 bidDuration,
    uint256 auctionDuration
  ) {
    return (_auction.beg(), _auction.pad(), _auction.ttl(), _auction.tau());
  }

  /// @notice Get the winning bid for an auction
  /// @return amountDAI uint256 amount of DAI to be burned
  /// @return amountMKR uint256 amount of MKR to be minted
  /// @return bidder address account who placed bid
  /// @return bidDeadline uint48 deadline of bid
  /// @return auctionDeadline uint48 deadline of auction
  function getCurrentBid(uint256 auctionID) public view returns (
    uint256 amountDAI,
    uint256 amountMKR,
    address bidder,
    uint48 bidDeadline,
    uint48 auctionDeadline
  ) {
    return _auction.bids(auctionID);
  }

  // Setters //

  /// @notice Extend and reprice expired auction with no bid
  /// @dev state machine: after auction expiry, before first bid
  /// @param auctionID uint256 id of the auction
  function _reprice(uint256 auctionID) internal {
    _auction.tick(auctionID);
  }

  /// @notice Add bid to a live auction, if first bid this transfers DAI to vat
  /// @dev state machine: before auction expired
  /// @param auctionID uint256 id of the auction
  function _bid(uint256 auctionID, uint256 amountMKR, uint256 amountDAI) internal {
    _auction.dent(auctionID, amountMKR, amountDAI);
  }

  /// @notice Finalize an auction with a winning bid and release maker
  /// @dev state machine: after auction expired
  /// @param auctionID uint256 id of the auction
  function _finalize(uint256 auctionID) internal {
    _auction.deal(auctionID);
  }
}


/**
 * @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 aplied to your functions to restrict their use to
 * the owner.
 *
 * In order to transfer ownership, a recipient must be specified, at which point
 * the specified recipient can call `acceptOwnership` and take ownership.
 */
contract TwoStepOwnable {
  address private _owner;

  address private _newPotentialOwner;

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

  /**
   * @dev Initialize contract by setting transaction submitter as initial owner.
   */
  constructor() internal {
    _owner = tx.origin;
    emit OwnershipTransferred(address(0), _owner);
  }

  /**
   * @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(), "TwoStepOwnable: caller is not the owner.");
    _;
  }

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

  /**
   * @dev Allows a new account (`newOwner`) to accept ownership.
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(
      newOwner != address(0),
      "TwoStepOwnable: new potential owner is the zero address."
    );

    _newPotentialOwner = newOwner;
  }

  /**
   * @dev Cancel a transfer of ownership to a new account.
   * Can only be called by the current owner.
   */
  function cancelOwnershipTransfer() public onlyOwner {
    delete _newPotentialOwner;
  }

  /**
   * @dev Transfers ownership of the contract to the caller.
   * Can only be called by a new potential owner set by the current owner.
   */
  function acceptOwnership() public {
    require(
      msg.sender == _newPotentialOwner,
      "TwoStepOwnable: current owner must set caller as new potential owner."
    );

    delete _newPotentialOwner;

    emit OwnershipTransferred(_owner, msg.sender);

    _owner = msg.sender;
  }
}


/**
 * Adapted from OpenZeppelin's address version of the same, written by Alberto Cuesta Cañada:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5dfe7215a9156465d550030eadc08770503b2b2f/
 *   contracts/utils/EnumerableSet.sol
 */
library EnumerableSet {

  struct AuctionIDSet {
    // Position of the value in the `values` array, plus 1 because index 0
    // means a value is not in the set.
    mapping (uint256 => uint256) index;
    uint256[] values;
  }

  /**
   * @dev Add a value to a set. O(1).
   * Returns false if the value was already in the set.
   */
  function add(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (!contains(set, value)) {
      set.values.push(value);
      // The element is stored at length-1, but we add 1 to all indexes
      // and use 0 as a sentinel value
      set.index[value] = set.values.length;
      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Removes a value from a set. O(1).
   * Returns false if the value was not present in the set.
   */
  function remove(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (contains(set, value)){
      uint256 toDeleteIndex = set.index[value] - 1;
      uint256 lastIndex = set.values.length - 1;

      // If the element we're deleting is the last one, we can just remove it without doing a swap
      if (lastIndex != toDeleteIndex) {
        uint256 lastValue = set.values[lastIndex];

        // Move the last value to the index where the deleted value is
        set.values[toDeleteIndex] = lastValue;
        // Update the index for the moved value
        set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
      }

      // Delete the index entry for the deleted value
      delete set.index[value];

      // Delete the old entry for the moved value
      set.values.pop();

      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function contains(AuctionIDSet storage set, uint256 value)
    internal
    view
    returns (bool)
  {
    return set.index[value] != 0;
  }

  /**
   * @dev Returns an array with all values in the set. O(N).
   * Note that there are no guarantees on the ordering of values inside the
   * array, and it may change when more values are added or removed.
   * WARNING: This function may run out of gas on large sets: use {length} and
   * {get} instead in these cases.
   */
  function enumerate(AuctionIDSet storage set)
    internal
    view
    returns (uint256[] memory)
  {
    uint256[] memory output = new uint256[](set.values.length);
    for (uint256 i; i < set.values.length; i++){
      output[i] = set.values[i];
    }
    return output;
  }

  /**
   * @dev Returns the number of elements on the set. O(1).
   */
  function length(AuctionIDSet storage set)
    internal
    view
    returns (uint256)
  {
    return set.values.length;
  }

   /** @dev Returns the element stored at position `index` in the set. O(1).
  * Note that there are no guarantees on the ordering of values inside the
  * array, and it may change when more values are added or removed.
  *
  * Requirements:
  *
  * - `index` must be strictly less than {length}.
  */
  function get(AuctionIDSet storage set, uint256 index)
    internal
    view
    returns (uint256)
  {
    return set.values[index];
  }
}


/// @notice See https://github.com/backstop-syndicate/dai-backstop-syndicate
contract DaiBackstopSyndicateV3 is
  IDaiBackstopSyndicate,
  SimpleFlopper,
  TwoStepOwnable,
  ERC20
{
  using SafeMath for uint256;
  using EnumerableSet for EnumerableSet.AuctionIDSet;

  // Track the status of the Syndicate.
  Status internal _status;

  // Track each active auction as an enumerable set.
  EnumerableSet.AuctionIDSet internal _activeAuctions;

  IERC20 internal constant _DAI = IERC20(
    0x6B175474E89094C44Da98b954EedeAC495271d0F
  );

  IERC20 internal constant _MKR = IERC20(
    0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2
  );

  IJoin internal constant _DAI_JOIN = IJoin(
    0x9759A6Ac90977b93B58547b4A71c78317f391A28
  );

  IVat internal constant _VAT = IVat(
    0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B
  );

  constructor() public {
    // Begin in the "accepting deposits" state.
    _status = Status.ACCEPTING_DEPOSITS;
 
    // Enable "dai-join" to take vatDai in order mint ERC20 Dai.
    _VAT.hope(address(_DAI_JOIN));

    // Enable creation of "vat dai" by approving dai-join.
    _DAI.approve(address(_DAI_JOIN), uint256(-1));

    // Enable entry into auctions by approving the "flopper".
    _VAT.hope(SimpleFlopper.getFlopperAddress());
  }

  /// @notice User deposits DAI in the BackStop Syndicate and receives Syndicate shares
  /// @param daiAmount Amount of DAI to deposit
  /// @return Amount of Backstop Syndicate shares participant receives
  function enlist(
    uint256 daiAmount
  ) external notWhenDeactivated returns (uint256 backstopTokensMinted) {
    require(daiAmount > 0, "DaiBackstopSyndicate/enlist: No Dai amount supplied.");  
      
    require(
      _status == Status.ACCEPTING_DEPOSITS,
      "DaiBackstopSyndicate/enlist: Cannot deposit once the first auction bid has been made."
    );

    require(
      _DAI.transferFrom(msg.sender, address(this), daiAmount),
      "DaiBackstopSyndicate/enlist: Could not transfer Dai amount from caller."
    );

    // Place the supplied Dai into the central Maker ledger for use in auctions.
    _DAI_JOIN.join(address(this), daiAmount);

    // Mint tokens 1:1 to the caller in exchange for the supplied Dai.
    backstopTokensMinted = daiAmount;
    _mint(msg.sender, backstopTokensMinted);
  }

  /// @notice User withdraws DAI and MKR from BackStop Syndicate based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  function defect(
    uint256 backstopTokenAmount
  ) external returns (uint256 daiRedeemed, uint256 mkrRedeemed) {
    require(
      backstopTokenAmount > 0, "DaiBackstopSyndicate/defect: No token amount supplied."
    );
      
    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Burn the tokens.
    _burn(msg.sender, backstopTokenAmount);

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Ensure that something is returned in exchange for burned tokens.
    require(
      mkrRedeemed != 0 || daiRedeemed != 0,
      "DaiBackstopSyndicate/defect: Nothing returned after burning tokens."
    );

    // Ensure that sufficient Dai liquidity is currently available to withdraw.
    require(
      vatDaiRedeemed <= vatDaiBalance,
      "DaiBackstopSyndicate/defect: Insufficient Dai (in use in auctions)"
    );

    // Redeem the Dai and MKR, giving user vatDai if global settlement, otherwise, tokens
    if (vatDaiRedeemed > 0) {
      if (SimpleFlopper.isEnabled()) {
        _DAI_JOIN.exit(msg.sender, daiRedeemed);
      } else {
        _VAT.move(address(this), msg.sender, vatDaiRedeemed);
      }
    }

    if (mkrRedeemed > 0) {
      require(
        _MKR.transfer(msg.sender, mkrRedeemed),
        "DaiBackstopSyndicate/defect: MKR redemption failed."
      );      
    }
  }

  /// @notice Triggers syndicate participation in an auction, bidding 50k DAI for 500 MKR
  /// @param auctionId ID of the auction to participate in
  function enterAuction(uint256 auctionId) external notWhenDeactivated {
    require(
      !_activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/enterAuction: Auction already active."
    );

    // dai has 45 decimal places
    (uint256 amountDai, , , , ) = SimpleFlopper.getCurrentBid(auctionId);

    // lot needs to have 18 decimal places, and we're expecting 1 mkr == 100 dai
    uint256 expectedLot = (amountDai / 1e27) / 100;

    // Place the bid, reverting on failure.
    SimpleFlopper._bid(auctionId, expectedLot, amountDai);

    // Prevent further deposits.
    if (_status != Status.ACTIVATED) {
      _status = Status.ACTIVATED;
    }

    // Register auction if successful participation.
    _activeAuctions.add(auctionId);

    // Emit an event to signal that the auction was entered.
    emit AuctionEntered(auctionId, expectedLot, amountDai);
  }

  // Anyone can finalize an auction if it's ready
  function finalizeAuction(uint256 auctionId) external {
    require(
      _activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/finalizeAuction: Auction already finalized"
    );

    // If auction was finalized, end should be 0x0.
    (,, address bidder,, uint48 end) = SimpleFlopper.getCurrentBid(auctionId);

    // If auction isn't closed, we try to close it ourselves
    if (end != 0) {
      // If we are the winning bidder, we finalize the auction
      // Otherwise we got outbid and we withdraw DAI
      if (bidder == address(this)) {
        SimpleFlopper._finalize(auctionId);
      }
    }

    // Remove the auction from the set of active auctions.
    _activeAuctions.remove(auctionId);

    // Emit an event to signal that the auction was finalized.
    emit AuctionFinalized(auctionId);
  }

  /// @notice The owner can pause new deposits and auctions. Existing auctions
  /// and withdrawals will be unaffected.
  function ceaseFire() external onlyOwner {
    _status = Status.DEACTIVATED;
  }

  function getStatus() external view returns (Status status) {
    status = _status;
  }

  function getActiveAuctions() external view returns (
    uint256[] memory activeAuctions
  ) {
    activeAuctions = _activeAuctions.enumerate();
  }

  /**
   * @dev Returns the name of the token.
   */
  function name() external view returns (string memory) {
    return "Dai Backstop Syndicate v3-100";
  }

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the
   * name.
   */
  function symbol() external view returns (string memory) {
    return "DBSv3-100";
  }

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

  /// @notice Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat) {
    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    combinedDaiInVat = vatDaiLockedInAuctions.add(vatDaiBalance) / 1e27;
  }

  /// @notice Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions) {
    // Determine the Dai currently locked up in auctions.
    daiInVatForAuctions = _getActiveAuctionVatDaiTotal() / 1e27;
  }

  /// @notice Return total amount of DAI that is currently withdrawable
  function getAvailableDaiBalance() external view returns (uint256 daiInVat) {
    // Determine the Dai currently locked up on behalf of this contract.
    daiInVat = _VAT.dai(address(this)) / 1e27;
  }

  /// @notice Return total amount of MKR that is currently in this contract.
  function getMKRBalance() external view returns (uint256 mkr) {
    // Determine the MKR currently in this contract.
    mkr = _MKR.balanceOf(address(this));
  }

  /// @notice Dry-run of DAI and MKR withdrawal based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  /// @return redeemable: Whether there's enough Dai not in auctions to withdraw
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  ) {
    if (backstopTokenAmount == 0) {
      return (0, 0, false);
    }

    if (backstopTokenAmount > totalSupply()) {
      revert("Supplied token amount is greater than total supply.");
    }

    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Check that sufficient Dai liquidity is currently available to withdraw.
    redeemable = (vatDaiRedeemed <= vatDaiBalance);
  }

  function _getActiveAuctionVatDaiTotal() internal view returns (uint256 vatDai) {
    vatDai = 0;
    uint256[] memory activeAuctions = _activeAuctions.enumerate();

    uint256 auctionVatDai;
    address bidder;
    for (uint256 i = 0; i < activeAuctions.length; i++) {
      // Dai bid size is returned from getCurrentBid with 45 decimals
      (auctionVatDai,, bidder,,) = SimpleFlopper.getCurrentBid(activeAuctions[i]);
      if (bidder == address(this)) {
        // we are keeping the 45 decimals in case we need to return vatDai
        vatDai = vatDai.add(auctionVatDai);
      }
    }
  }

  modifier notWhenDeactivated() {
    require(
      _status != Status.DEACTIVATED,
      "DaiBackstopSyndicate/notWhenDeactivated: Syndicate is deactivated, please withdraw."
    );
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mkrAsk","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiBid","type":"uint256"}],"name":"AuctionEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ceaseFire","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"defect","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiAmount","type":"uint256"}],"name":"enlist","outputs":[{"internalType":"uint256","name":"backstopTokensMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"enterAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"finalizeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getActiveAuctions","outputs":[{"internalType":"uint256[]","name":"activeAuctions","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionInformation","outputs":[{"internalType":"uint256","name":"bidIncrement","type":"uint256"},{"internalType":"uint256","name":"repriceIncrement","type":"uint256"},{"internalType":"uint256","name":"bidDuration","type":"uint256"},{"internalType":"uint256","name":"auctionDuration","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableDaiBalance","outputs":[{"internalType":"uint256","name":"daiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"amountMKR","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint48","name":"bidDeadline","type":"uint48"},{"internalType":"uint48","name":"auctionDeadline","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalance","outputs":[{"internalType":"uint256","name":"combinedDaiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalanceForAuctions","outputs":[{"internalType":"uint256","name":"daiInVatForAuctions","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"getDefectAmount","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"},{"internalType":"bool","name":"redeemable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFlopperAddress","outputs":[{"internalType":"address","name":"flopper","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getMKRBalance","outputs":[{"internalType":"uint256","name":"mkr","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum IDaiBackstopSyndicate.Status","name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalNumberOfAuctions","outputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50600080546001600160a01b03191632178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36005805460ff19169055604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b158015620000cc57600080fd5b505af1158015620000e1573d6000803e3d6000fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f935063095ea7b3925060448083019260209291908290030181600087803b1580156200015557600080fd5b505af11580156200016a573d6000803e3d6000fd5b505050506040513d60208110156200018157600080fd5b507335d1b3f3d7966a1dfe207aa4514c12a259a0492b905063a3b22fc4620001b46200021c602090811b6200167217901c565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015620001fd57600080fd5b505af115801562000212573d6000803e3d6000fd5b5050505062000234565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6127aa80620002446000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638a5399721161011a578063bafebc6f116100ad578063dd62ed3e1161007c578063dd62ed3e146105f0578063e80838631461061e578063e918ad911461063b578063f2fde38b14610658578063feab50cb1461067e576101fb565b8063bafebc6f1461052d578063c49c2eb614610535578063cf44b5d51461053d578063da4e364f14610595576101fb565b80639d64087f116100e95780639d64087f14610490578063a457c2d7146104cd578063a9059cbb146104f9578063b2a8c6fe14610525576101fb565b80638a539972146104265780638da5cb5b1461045c5780638f32d59b1461048057806395d89b4114610488576101fb565b80633d8b7894116101925780636aa633b6116101615780636aa633b6146103e857806370a08231146103f0578063746fed731461041657806379ba50971461041e576101fb565b80633d8b7894146103695780633f1fc678146103865780634e69d560146103b45780635ddc916a146103e0576101fb565b806323452b9c116101ce57806323452b9c146102df57806323b872dd146102e9578063313ce5671461031f578063395093511461033d576101fb565b8063045f9f8a1461020057806306fdde031461021a578063095ea7b31461029757806318160ddd146102d7575b600080fd5b610208610686565b60408051918252519081900360200190f35b610222610721565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c3600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610758565b604080519115158252519081900360200190f35b61020861076f565b6102e7610775565b005b6102c3600480360360608110156102ff57600080fd5b506001600160a01b038135811691602081013590911690604001356107ca565b610327610821565b6040805160ff9092168252519081900360200190f35b6102c36004803603604081101561035357600080fd5b506001600160a01b038135169060200135610826565b6102086004803603602081101561037f57600080fd5b5035610862565b61038e610a8c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103bc610c8a565b604051808260028111156103cc57fe5b60ff16815260200191505060405180910390f35b610208610c93565b6102c3610d4f565b6102086004803603602081101561040657600080fd5b50356001600160a01b0316610de0565b610208610dfb565b6102e7610e81565b6104436004803603602081101561043c57600080fd5b5035610f26565b6040805192835260208301919091528051918290030190f35b61046461137e565b604080516001600160a01b039092168252519081900360200190f35b6102c361138d565b61022261139e565b6104ad600480360360208110156104a657600080fd5b50356113c1565b604080519384526020840192909252151582820152519081900360600190f35b6102c3600480360360408110156104e357600080fd5b506001600160a01b0381351690602001356115d7565b6102c36004803603604081101561050f57600080fd5b506001600160a01b038135169060200135611613565b6102e7611620565b610464611672565b61020861168a565b6105456116d9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610581578181015183820152602001610569565b505050509050019250505060405180910390f35b6105b2600480360360208110156105ab57600080fd5b50356116e5565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6102086004803603604081101561060657600080fd5b506001600160a01b0381358116916020013516611798565b6102e76004803603602081101561063457600080fd5b50356117c3565b6102e76004803603602081101561065157600080fd5b5035611896565b6102e76004803603602081101561066e57600080fd5b50356001600160a01b03166119f0565b610208611a9a565b60408051633612d9a360e11b815230600482015290516000916b033b2e3c9fd0803ce8000000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156106e857600080fd5b505afa1580156106fc573d6000803e3d6000fd5b505050506040513d602081101561071257600080fd5b50518161071b57fe5b04905090565b60408051808201909152601d81527f446169204261636b73746f702053796e6469636174652076332d313030000000602082015290565b6000610765338484611ab8565b5060015b92915050565b60045490565b61077d61138d565b6107b85760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006107d7848484611ba4565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610817918691610812908663ffffffff611ce816565b611ab8565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611d4516565b6000600260055460ff16600281111561087757fe5b14156108b45760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b600082116108f35760405162461bcd60e51b815260040180806020018281038252603481526020018061265e6034913960400191505060405180910390fd5b600060055460ff16600281111561090657fe5b146109425760405162461bcd60e51b81526004018080602001828103825260558152602001806124986055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b505050506040513d60208110156109cc57600080fd5b5051610a095760405162461bcd60e51b81526004018080602001828103825260478152602001806124516047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50505050819050610a873382611da6565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b158015610bcd57600080fd5b505afa158015610be1573d6000803e3d6000fd5b505050506040513d6020811015610bf757600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610c4457600080fd5b505afa158015610c58573d6000803e3d6000fd5b505050506040513d6020811015610c6e57600080fd5b5051929791965065ffffffffffff908116955090911692509050565b60055460ff1690565b600080610c9e611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d6020811015610d1f57600080fd5b505190506b033b2e3c9fd0803ce8000000610d40838363ffffffff611d4516565b81610d4757fe5b049250505090565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d6020811015610dc857600080fd5b5051600114610dd8576000610ddb565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b604080516370a0823160e01b81523060048201529051600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a0823191602480820192602092909190829003018186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d6020811015610e7a57600080fd5b5051919050565b6001546001600160a01b03163314610eca5760405162461bcd60e51b81526004018080602001828103825260458152602001806124ed6045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b60008060008311610f685760405162461bcd60e51b81526004018080602001828103825260368152602001806126926036913960400191505060405180910390fd5b6000610f99610f7561076f565b610f8d86670de0b6b3a764000063ffffffff611f0d16565b9063ffffffff611f6616565b9050610fa53385611fd0565b6000610faf611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d602081101561103057600080fd5b505190506000611046838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561109d57600080fd5b505afa1580156110b1573d6000803e3d6000fd5b505050506040513d60208110156110c757600080fd5b505190506000670de0b6b3a76400006110e6848863ffffffff611f0d16565b816110ed57fe5b049050670de0b6b3a7640000611109838863ffffffff611f0d16565b8161111057fe5b0496506b033b2e3c9fd0803ce8000000810497508615158061113157508715155b61116c5760405162461bcd60e51b81526004018080602001828103825260438152602001806126c86043913960600191505060405180910390fd5b838111156111ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806123676042913960600191505060405180910390fd5b80156112ac576111b9610d4f565b15611234576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050506112ac565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050505b8615611373576040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b50516113735760405162461bcd60e51b81526004018080602001828103825260338152602001806123cb6033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b604080518082019091526009815268044425376332d3130360bc1b602082015290565b60008080836113d8575060009150819050806115d0565b6113e061076f565b84111561141e5760405162461bcd60e51b815260040180806020018281038252603381526020018061270b6033913960400191505060405180910390fd5b600061144361142b61076f565b610f8d87670de0b6b3a764000063ffffffff611f0d16565b9050600061144f611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5051905060006114e6838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d602081101561156757600080fd5b505190506000670de0b6b3a7640000611586848863ffffffff611f0d16565b8161158d57fe5b049050670de0b6b3a76400006115a9838863ffffffff611f0d16565b816115b057fe5b0497506b033b2e3c9fd0803ce80000008104985092909211159450505050505b9193909250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611ce816565b6000610765338484611ba4565b61162861138d565b6116635760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b6060610ddb60066120ab565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d60a081101561176f57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6117d460068263ffffffff61213116565b61180f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061257b603f913960400191505060405180910390fd5b60008061181b836116e5565b945050935050508065ffffffffffff1660001461184c576001600160a01b03821630141561184c5761184c83612146565b61185d60068463ffffffff6121bb16565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff1660028111156118a957fe5b14156118e65760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b6118f760068263ffffffff61213116565b156119335760405162461bcd60e51b815260040180806020018281038252603a8152602001806125ba603a913960400191505060405180910390fd5b600061193e826116e5565b505050509050600060646b033b2e3c9fd0803ce8000000838161195d57fe5b048161196557fe5b049050611973838284612284565b600160055460ff16600281111561198657fe5b14611999576005805460ff191660011790555b6119aa60068463ffffffff61230216565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b6119f861138d565b611a335760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6001600160a01b038116611a785760405162461bcd60e51b815260040180806020018281038252603881526020018061273e6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006b033b2e3c9fd0803ce8000000611ab1611e98565b8161071b57fe5b6001600160a01b038316611afd5760405162461bcd60e51b815260040180806020018281038252602481526020018061263a6024913960400191505060405180910390fd5b6001600160a01b038216611b425760405162461bcd60e51b81526004018080602001828103825260228152602001806123a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611be95760405162461bcd60e51b81526004018080602001828103825260258152602001806126156025913960400191505060405180910390fd5b6001600160a01b038216611c2e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123446023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054611c57908263ffffffff611ce816565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611c8c908263ffffffff611d4516565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115611d3f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611d9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611e01576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600454611e14908263ffffffff611d4516565b6004556001600160a01b038216600090815260026020526040902054611e40908263ffffffff611d4516565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006060611ea660066120ab565b9050600080805b8351811015611f0657611ed2848281518110611ec557fe5b60200260200101516116e5565b50929550935050506001600160a01b038216301415611efe57611efb858463ffffffff611d4516565b94505b600101611ead565b5050505090565b600082611f1c57506000610769565b82820282848281611f2957fe5b0414611d9f5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b6000808211611fbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fc757fe5b04949350505050565b6001600160a01b0382166120155760405162461bcd60e51b81526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b600454612028908263ffffffff611ce816565b6004556001600160a01b038216600090815260026020526040902054612054908263ffffffff611ce816565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60608082600101805490506040519080825280602002602001820160405280156120df578160200160208202803883390190505b50905060005b600184015481101561212a5783600101818154811061210057fe5b906000526020600020015482828151811061211757fe5b60209081029190910101526001016120e5565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60006121c78383612131565b1561227c576000828152602084905260409020546001840154600019918201910180821461223f57600085600101828154811061220057fe5b906000526020600020015490508086600101848154811061221d57fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061225b57fe5b60019003818190600052602060002001600090559055600192505050610769565b506000610769565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b50505050505050565b600061230e8383612131565b61227c57506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561076956fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f66696e616c697a6541756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f656e6c6973743a204e6f2044616920616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f20746f6b656e20616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f7468696e672072657475726e6564206166746572206275726e696e6720746f6b656e732e537570706c69656420746f6b656e20616d6f756e742069732067726561746572207468616e20746f74616c20737570706c792e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a723158203b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f564736f6c63430005100032

Deployed ByteCode Sourcemap

29067:12360:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29067:12360:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38273:203;;;:::i;:::-;;;;;;;;;;;;;;;;36390:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36390:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14437:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14437:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13460:91;;;:::i;24872:90::-;;;:::i;:::-;;15056:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15056:256:0;;;;;;;;;;;;;;;;;:::i;37234:72::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15721:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15721:206:0;;;;;;;;:::i;30515:834::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30515:834:0;;:::i;21239:257::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36082:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37390:496;;;:::i;20298:112::-;;;:::i;13614:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:110:0;-1:-1:-1;;;;;13614:110:0;;:::i;38560:163::-;;;:::i;25120:298::-;;;:::i;31616:2293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31616:2293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23959:73;;;:::i;:::-;;;;-1:-1:-1;;;;;23959:73:0;;;;;;;;;;;;;;24301:86;;;:::i;36604:87::-;;;:::i;39055:1550::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39055:1550:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16430:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16430:216:0;;;;;;;;:::i;13937:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13937:156:0;;;;;;;;:::i;35995:81::-;;;:::i;20714:104::-;;;:::i;20500:112::-;;;:::i;36176:152::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36176:152:0;;;;;;;;;;;;;;;;;21833:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21833:235:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;21833:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14156:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14156:134:0;;;;;;;;;;:::i;35024:842::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35024:842:0;;:::i;34066:901::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34066:901:0;;:::i;24520:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24520:225:0;-1:-1:-1;;;;;24520:225:0;;:::i;37975:219::-;;;:::i;38273:203::-;38440:23;;;-1:-1:-1;;;38440:23:0;;38457:4;38440:23;;;;;;38330:16;;38466:4;;29792:42;;38440:8;;:23;;;;;;;;;;;;;;29792:42;38440:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38440:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38440:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38440:23:0;:30;;;;;;38429:41;;38273:203;:::o;36390:105::-;36451:38;;;;;;;;;;;;;;;;;36390:105;:::o;14437:148::-;14502:4;14519:36;14528:10;14540:7;14549:5;14519:8;:36::i;:::-;-1:-1:-1;14573:4:0;14437:148;;;;;:::o;13460:91::-;13531:12;;13460:91;:::o;24872:90::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24938:18;24931:25;;-1:-1:-1;;;;;;24931:25:0;;;24872:90::o;15056:256::-;15145:4;15162:36;15172:6;15180:9;15191:6;15162:9;:36::i;:::-;-1:-1:-1;;;;;15238:19:0;;;;;;:11;:19;;;;;;;;15226:10;15238:31;;;;;;;;;15209:73;;15218:6;;15238:43;;15274:6;15238:43;:35;:43;:::i;:::-;15209:8;:73::i;:::-;-1:-1:-1;15300:4:0;15056:256;;;;;:::o;37234:72::-;37298:2;37234:72;:::o;15721:206::-;15827:10;15801:4;15848:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15848:32:0;;;;;;;;;;15801:4;;15818:79;;15839:7;;15848:48;;15885:10;15848:48;:36;:48;:::i;30515:834::-;30597:28;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:1;30642:9;:13;30634:78;;;;-1:-1:-1;;;30634:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30756:25;30745:7;;;;:36;;;;;;;;;30729:155;;;;-1:-1:-1;;;30729:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30909:55;;;-1:-1:-1;;;30909:55:0;;30927:10;30909:55;;;;30947:4;30909:55;;;;;;;;;;;;29496:42;;30909:17;;:55;;;;;;;;;;;;;;-1:-1:-1;29496:42:0;30909:55;;;5:2:-1;;;;30:1;27;20:12;5:2;30909:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30909:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30909:55:0;30893:160;;;;-1:-1:-1;;;30893:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31144:40;;;-1:-1:-1;;;31144:40:0;;31167:4;31144:40;;;;;;;;;;;;29697:42;;31144:14;;:40;;;;;-1:-1:-1;;31144:40:0;;;;;;;-1:-1:-1;29697:42:0;31144:40;;;5:2:-1;;;;30:1;27;20:12;5:2;31144:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31144:40:0;;;;31288:9;31265:32;;31304:39;31310:10;31322:20;31304:5;:39::i;:::-;30515:834;;;:::o;21239:257::-;21299:20;21326:24;21357:19;21383:23;20108:42;-1:-1:-1;;;;;21427:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21427:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21427:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21427:14:0;21443;;;-1:-1:-1;;;21443:14:0;;;;20108:42;;21443:12;;:14;;;;;21427;;21443;;;;;;;20108:42;21443:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21443:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21443:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21443:14:0;21459;;;-1:-1:-1;;;21459:14:0;;;;20108:42;;21459:12;;:14;;;;;21443;;21459;;;;;;;20108:42;21459:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21459:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21459:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21459:14:0;21475;;;-1:-1:-1;;;21475:14:0;;;;20108:42;;21475:12;;:14;;;;;21459;;21475;;;;;;;20108:42;21475:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21475:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21475:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21475:14:0;21419:71;;;;-1:-1:-1;21419:71:0;;;;;-1:-1:-1;21419:71:0;;;;-1:-1:-1;21239:257:0;-1:-1:-1;21239:257:0:o;36082:88::-;36157:7;;;;;36082:88::o;37390:496::-;37438:24;37538:30;37571;:28;:30::i;:::-;37708:23;;;-1:-1:-1;;;37708:23:0;;37725:4;37708:23;;;;;;37538:63;;-1:-1:-1;37684:21:0;;29792:42;;37708:8;;:23;;;;;;;;;;;;;;29792:42;37708:23;;;5:2:-1;;;;30:1;27;20:12;5:2;37708:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37708:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37708:23:0;;-1:-1:-1;37876:4:0;37832:41;:22;37708:23;37832:41;:26;:41;:::i;:::-;:48;;;;;;37813:67;;37390:496;;;:::o;20298:112::-;20340:11;20108:42;-1:-1:-1;;;;;20368:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20368:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20368:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20368:15:0;20387:1;20368:20;20367:37;;20399:5;20367:37;;;20392:4;20367:37;20360:44;;20298:112;:::o;13614:110::-;-1:-1:-1;;;;;13698:18:0;13671:7;13698:18;;;:9;:18;;;;;;;13614:110::o;38560:163::-;38688:29;;;-1:-1:-1;;;38688:29:0;;38711:4;38688:29;;;;;;38608:11;;29595:42;;38688:14;;:29;;;;;;;;;;;;;;;29595:42;38688:29;;;5:2:-1;;;;30:1;27;20:12;5:2;38688:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38688:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38688:29:0;;38560:163;-1:-1:-1;38560:163:0:o;25120:298::-;25191:18;;-1:-1:-1;;;;;25191:18:0;25177:10;:32;25161:135;;;;-1:-1:-1;;;25161:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25312:18;25305:25;;-1:-1:-1;;;;;;25305:25:0;;;-1:-1:-1;25365:6:0;;25344:40;;25373:10;;-1:-1:-1;;;;;25365:6:0;;;;25344:40;;;25393:6;:19;;-1:-1:-1;;;;;;25393:19:0;25402:10;25393:19;;;25120:298::o;31616:2293::-;31689:19;31710;31776:1;31754:19;:23;31738:104;;;;-1:-1:-1;;;31738:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31912:18;31933:50;31969:13;:11;:13::i;:::-;31934:29;:19;31958:4;31934:29;:23;:29;:::i;:::-;31933:35;:50;:35;:50;:::i;:::-;31912:71;;32017:38;32023:10;32035:19;32017:5;:38::i;:::-;32131:30;32164;:28;:30::i;:::-;32301:23;;;-1:-1:-1;;;32301:23:0;;32318:4;32301:23;;;;;;32131:63;;-1:-1:-1;32277:21:0;;29792:42;;32301:8;;:23;;;;;;;;;;;;;;29792:42;32301:23;;;5:2:-1;;;;30:1;27;20:12;5:2;32301:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32301:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32301:23:0;;-1:-1:-1;32406:22:0;32431:41;:22;32301:23;32431:41;:26;:41;:::i;:::-;32564:29;;;-1:-1:-1;;;32564:29:0;;32587:4;32564:29;;;;;;32406:66;;-1:-1:-1;32541:20:0;;29595:42;;32564:14;;:29;;;;;;;;;;;;;;29595:42;32564:29;;;5:2:-1;;;;30:1;27;20:12;5:2;32564:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32564:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32564:29:0;;-1:-1:-1;32676:22:0;32734:4;32701:30;:14;32720:10;32701:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;32790:4:0;32759:28;:12;32776:10;32759:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;32969:4:0;32952:14;:21;;-1:-1:-1;33071:16:0;;;;:36;;-1:-1:-1;33091:16:0;;;33071:36;33055:137;;;;-1:-1:-1;;;33055:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:13;33298:14;:31;;33282:131;;;;-1:-1:-1;;;33282:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33517:18;;33513:210;;33550:25;:23;:25::i;:::-;33546:170;;;33588:39;;;-1:-1:-1;;;33588:39:0;;33603:10;33588:39;;;;;;;;;;;;29697:42;;33588:14;;:39;;;;;-1:-1:-1;;33588:39:0;;;;;;;-1:-1:-1;29697:42:0;33588:39;;;5:2:-1;;;;30:1;27;20:12;5:2;33588:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33588:39:0;;;;33546:170;;;33654:52;;;-1:-1:-1;;;33654:52:0;;33672:4;33654:52;;;;33679:10;33654:52;;;;;;;;;;;;29792:42;;33654:9;;:52;;;;;-1:-1:-1;;33654:52:0;;;;;;;-1:-1:-1;29792:42:0;33654:52;;;5:2:-1;;;;30:1;27;20:12;5:2;33654:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33654:52:0;;;;33546:170;33735:15;;33731:173;;33779:38;;;-1:-1:-1;;;33779:38:0;;33793:10;33779:38;;;;;;;;;;;;29595:42;;33779:13;;:38;;;;;;;;;;;;;;-1:-1:-1;29595:42:0;33779:38;;;5:2:-1;;;;30:1;27;20:12;5:2;33779:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33779:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33779:38:0;33761:129;;;;-1:-1:-1;;;33761:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31616:2293;;;;;;;;;:::o;23959:73::-;23997:7;24020:6;-1:-1:-1;;;;;24020:6:0;23959:73;:::o;24301:86::-;24341:4;24375:6;-1:-1:-1;;;;;24375:6:0;24361:10;:20;;24301:86::o;36604:87::-;36667:18;;;;;;;;;;;;-1:-1:-1;;;36667:18:0;;;;36604:87;:::o;39055:1550::-;39148:19;;;39222:24;39218:67;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;39257:20;;39218:67;39319:13;:11;:13::i;:::-;39297:19;:35;39293:119;;;39343:61;;-1:-1:-1;;;39343:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39293:119;39475:18;39496:50;39532:13;:11;:13::i;:::-;39497:29;:19;39521:4;39497:29;:23;:29;:::i;39496:50::-;39475:71;;39622:30;39655;:28;:30::i;:::-;39792:23;;;-1:-1:-1;;;39792:23:0;;39809:4;39792:23;;;;;;39622:63;;-1:-1:-1;39768:21:0;;29792:42;;39792:8;;:23;;;;;;;;;;;;;;29792:42;39792:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39792:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39792:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39792:23:0;;-1:-1:-1;39897:22:0;39922:41;:22;39792:23;39922:41;:26;:41;:::i;:::-;40055:29;;;-1:-1:-1;;;40055:29:0;;40078:4;40055:29;;;;;;39897:66;;-1:-1:-1;40032:20:0;;29595:42;;40055:14;;:29;;;;;;;;;;;;;;29595:42;40055:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40055:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40055:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40055:29:0;;-1:-1:-1;40167:22:0;40225:4;40192:30;:14;40211:10;40192:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;40281:4:0;40250:28;:12;40267:10;40250:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;40460:4:0;40443:14;:21;;-1:-1:-1;40567:31:0;;;;;;-1:-1:-1;;;;;39055:1550:0;;;;;;:::o;16430:216::-;16541:10;16515:4;16562:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16562:32:0;;;;;;;;;;16515:4;;16532:84;;16553:7;;16562:53;;16599:15;16562:53;:36;:53;:::i;13937:156::-;14006:4;14023:40;14033:10;14045:9;14056:6;14023:9;:40::i;35995:81::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36042:7;:28;;-1:-1:-1;;36042:28:0;36052:18;36042:28;;;35995:81::o;20714:104::-;20108:42;20714:104;:::o;20500:112::-;20557:17;20108:42;-1:-1:-1;;;;;20590:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;36176:152:0;36234:31;36295:27;:15;:25;:27::i;21833:235::-;21902:17;21926;21950:14;21971:18;21996:22;20108:42;-1:-1:-1;;;;;22038:13:0;;22052:9;22038:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22038:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22038:24:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;22038:24:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22038:24:0;-1:-1:-1;22038:24:0;;-1:-1:-1;22038:24:0;-1:-1:-1;21833:235:0;-1:-1:-1;;21833:235:0:o;14156:134::-;-1:-1:-1;;;;;14255:18:0;;;14228:7;14255:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14156:134::o;35024:842::-;35100:35;:15;35125:9;35100:35;:24;:35;:::i;:::-;35084:132;;;;-1:-1:-1;;;35084:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35282:14;35299:10;35313:38;35341:9;35313:27;:38::i;:::-;35278:73;;;;;;;35426:3;:8;;35433:1;35426:8;35422:232;;-1:-1:-1;;;;;35567:23:0;;35585:4;35567:23;35563:84;;;35603:34;35627:9;35603:23;:34::i;:::-;35722:33;:15;35745:9;35722:33;:22;:33;:::i;:::-;-1:-1:-1;35833:27:0;;;;;;;;;;;;;;;;;35024:842;;;:::o;34066:901::-;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34159:35;:15;34184:9;34159:35;:24;:35;:::i;:::-;34158:36;34142:128;;;;-1:-1:-1;;;34142:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34314:17;34343:38;34371:9;34343:27;:38::i;:::-;34313:68;;;;;;34472:19;34515:3;34507:4;34495:9;:16;;;;;;34494:24;;;;;;34472:46;;34572:53;34591:9;34602:11;34615:9;34572:18;:53::i;:::-;34683:16;34672:7;;;;:27;;;;;;;;;34668:76;;34710:7;:26;;-1:-1:-1;;34710:26:0;34720:16;34710:26;;;34668:76;34806:30;:15;34826:9;34806:30;:19;:30;:::i;:::-;-1:-1:-1;34912:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41417:1;;34066:901;:::o;24520:225::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24605:22:0;;24589:112;;;;-1:-1:-1;;;24589:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24710:18;:29;;-1:-1:-1;;;;;;24710:29:0;-1:-1:-1;;;;;24710:29:0;;;;;;;;;;24520:225::o;37975:219::-;38034:27;38184:4;38151:30;:28;:30::i;:::-;:37;;;;19232:335;-1:-1:-1;;;;;19325:19:0;;19317:68;;;;-1:-1:-1;;;19317:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19404:21:0;;19396:68;;;;-1:-1:-1;;;19396:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19477:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19528:31;;;;;;;;;;;;;;;;;19232:335;;;:::o;17136:429::-;-1:-1:-1;;;;;17234:20:0;;17226:70;;;;-1:-1:-1;;;17226:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17315:23:0;;17307:71;;;;-1:-1:-1;;;17307:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17411:17:0;;;;;;:9;:17;;;;;;:29;;17433:6;17411:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;17391:17:0;;;;;;;:9;:17;;;;;;:49;;;;17474:20;;;;;;;:32;;17499:6;17474:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17451:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17522:35;;;;;;;17451:20;;17522:35;;;;;;;;;;;;;17136:429;;;:::o;6882:184::-;6940:7;6973:1;6968;:6;;6960:49;;;;;-1:-1:-1;;;6960:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:5:0;;;6882:184::o;6426:181::-;6484:7;6516:5;;;6540:6;;;;6532:46;;;;;-1:-1:-1;;;6532:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6598:1;6426:181;-1:-1:-1;;;6426:181:0:o;17846:308::-;-1:-1:-1;;;;;17922:21:0;;17914:65;;;;;-1:-1:-1;;;17914:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18007:12;;:24;;18024:6;18007:24;:16;:24;:::i;:::-;17992:12;:39;-1:-1:-1;;;;;18063:18:0;;;;;;:9;:18;;;;;;:30;;18086:6;18063:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18042:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18109:37;;;;;;;18042:18;;;;18109:37;;;;;;;;;;17846:308;;:::o;40611:610::-;40674:14;40714:31;40748:27;:15;:25;:27::i;:::-;40714:61;-1:-1:-1;40784:21:0;;;40833:383;40857:14;:21;40853:1;:25;40833:383;;;40994:46;41022:14;41037:1;41022:17;;;;;;;;;;;;;;40994:27;:46::i;:::-;-1:-1:-1;40965:75:0;;-1:-1:-1;40965:75:0;-1:-1:-1;;;;;;;;41053:23:0;;41071:4;41053:23;41049:160;;;41174:25;:6;41185:13;41174:25;:10;:25;:::i;:::-;41165:34;;41049:160;40880:3;;40833:383;;;;40611:610;;;;:::o;7317:471::-;7375:7;7620:6;7616:47;;-1:-1:-1;7650:1:0;7643:8;;7616:47;7687:5;;;7691:1;7687;:5;:1;7711:5;;;;;:10;7703:56;;;;-1:-1:-1;;;7703:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8256:333;8314:7;8413:1;8409;:5;8401:44;;;;;-1:-1:-1;;;8401:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8456:9;8472:1;8468;:5;;;;;;;8256:333;-1:-1:-1;;;;8256:333:0:o;18486:306::-;-1:-1:-1;;;;;18561:21:0;;18553:67;;;;-1:-1:-1;;;18553:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18648:12;;:23;;18665:5;18648:23;:16;:23;:::i;:::-;18633:12;:38;-1:-1:-1;;;;;18703:18:0;;;;;;:9;:18;;;;;;:29;;18726:5;18703:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;18682:18:0;;;;;;:9;:18;;;;;;;;:50;;;;18748:36;;;;;;;18682:18;;18748:36;;;;;;;;;;;18486:306;;:::o;28028:286::-;28111:16;28139:23;28179:3;:10;;:17;;;;28165:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;28165:32:0;;28139:58;;28209:9;28204:85;28224:10;;;:17;28220:21;;28204:85;;;28268:3;:10;;28279:1;28268:13;;;;;;;;;;;;;;;;28256:6;28263:1;28256:9;;;;;;;;;;;;;;;;;:25;28243:3;;28204:85;;;-1:-1:-1;28302:6:0;28028:286;-1:-1:-1;;28028:286:0:o;27536:147::-;27633:4;27656:16;;;;;;;;;;;;:21;;;27536:147::o;22857:84::-;20108:42;-1:-1:-1;;;;;22911:13:0;;22925:9;22911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22911:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22911:24:0;;;;22857:84;:::o;26539:919::-;26624:4;26644:20;26653:3;26658:5;26644:8;:20::i;:::-;26640:813;;;26674:21;26698:16;;;;;;;;;;;26717:1;26747:10;;:17;-1:-1:-1;;26698:20:0;;;;26747:21;26883:26;;;26879:343;;26922:17;26942:3;:10;;26953:9;26942:21;;;;;;;;;;;;;;;;26922:41;;27076:9;27048:3;:10;;27059:13;27048:25;;;;;;;;;;;;;;;;;;;:37;;;;27145:20;;;;;;;;;27184:1;27168:17;;27145:40;;26879:343;27294:9;:16;;;;;;;;;;27287:23;27372:10;;;:16;;;;;;;;;;;;;;;;;;;;;;;;27406:4;27399:11;;;;;;26640:813;-1:-1:-1;27440:5:0;27433:12;;22541:139;22628:46;;;-1:-1:-1;;;22628:46:0;;;;;;;;;;;;;;;;;;;;;;20108:42;;22628:13;;:46;;;;;-1:-1:-1;;22628:46:0;;;;;;;-1:-1:-1;20108:42:0;22628:46;;;5:2:-1;;;;30:1;27;20:12;5:2;22628:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22628:46:0;;;;22541:139;;;:::o;26031:382::-;26113:4;26134:20;26143:3;26148:5;26134:8;:20::i;:::-;26129:279;;-1:-1:-1;26165:10:0;;;;27::-1;;23:18;;;45:23;;-1:-1;26165:22:0;;;;;;;;;;;;;26328:17;;26309:16;;;;;;;;;;;:36;26354:11;

Swarm Source

bzzr://3b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f5
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.