Contract 0x2d7c40cd0228264ae5a73f01bc54fa13c4476da1

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x121570bd3a6e3bae4158ad676ec4bffb22c5c6527c98dce1a325380162cd3e7fRedeem238001112022-01-16 20:37:30167 days 2 hrs ago0x9494d5950802446f2abdf81149cea96227861b5c IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0000999363
0x77d048d5ca707423f61e9bf196a57140cd9f726742deeaadc63bd83f84596f0fRedeem238001092022-01-16 20:37:26167 days 2 hrs ago0x9494d5950802446f2abdf81149cea96227861b5c IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00103267231
0xa83fcfdce7129fc3e26fa69a74ab70c2ca70963538349665dd428fed60ab5533Redeem238001012022-01-16 20:37:10167 days 2 hrs ago0x9494d5950802446f2abdf81149cea96227861b5c IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00124080631
0x490a9fe60b057d2e10f03ac8a7229d6bbe3c7de3dabb4b0d78aedd152a22ed04Redeem237457472022-01-15 11:44:14168 days 11 hrs ago0x1ef27323cc1291637bd6e94f4e76676b7365c559 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0012007830
0x20d631eaab23af0321f16c49912c8997d95da60d1eb2adf15c7ebf9377f9be0bRedeem237335172022-01-15 3:35:34168 days 19 hrs ago0x5580ba66f8d6dc71adb0ca1d1c6b3d142ff7aaca IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0012007830
0x255437ca03717d98621bd3d0f23fbb95b42347f5e750b5784e29b7c78d0bfd12Redeem237204752022-01-14 19:50:07169 days 3 hrs ago0xe553347cd0d7a777aacd0ad052d3f68f764a73ba IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.001224795630.6
0xf33c644e502eaa3d4ededb4c3d58f8e993ae1675ec9c55738641f93e122ef3f5Redeem237158072022-01-14 17:03:13169 days 6 hrs ago0x09b087a70087f14077101288bf5bad0667b006ad IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0013206633
0xb70d825b097524740d6bc64600c9dbdb7ecc2e7ace1b0e42bce008be3eada1f7Redeem237141012022-01-14 16:02:22169 days 7 hrs ago0x7ee9033aad1d11a80f1c1e8d769feacbc97416db IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0009442830
0xbb5f73940076723839e1210eca5597e026cbb3ea1374a2d19f957f458b97c38aRedeem237078542022-01-14 12:03:59169 days 11 hrs ago0x8de5469f7bf563daa3284c60984f2c9215cef448 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00094431147630.001
0x169cf34ad4e91f244f45f9d481d54f7db97c79c6c57b9f7fa79fd5d0e990f6aeRedeem237069062022-01-14 11:24:59169 days 11 hrs ago0x09b087a70087f14077101288bf5bad0667b006ad IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00259525233
0xf7ed8c099c04d178bfdd20d6c2a9660c822e34295e32ec0b3512c2cc192eade9Redeem237068282022-01-14 11:22:19169 days 11 hrs ago0x5580ba66f8d6dc71adb0ca1d1c6b3d142ff7aaca IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.002406873630.6
0x751de24c5d14d104d1ad79fdb185f56ac760122b20976b1db1f879eaf0d56df6Redeem237062332022-01-14 10:57:33169 days 12 hrs ago0x6f7ed8b4478bb8e110337a56d0d9d148992aac55 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0012007830.000000001
0x1f8aba4c04b7f400cd5c9b6af6652888d0e3eed1de5cf602ef62b2ee5c1e79bbRedeem237060652022-01-14 10:51:49169 days 12 hrs ago0x587fbe613c3cc991455f0ea531ff6006c0b8fd51 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00122491567830.603000001
0xfcf85c4e09557738ec5395c0daf76138a772c51ed2f20a2bb7700f92d25cea8aRedeem237056422022-01-14 10:35:07169 days 12 hrs ago0x45cb620c9b4bd6a5ff227a41e855626a3a0e1c78 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0010594821633.66
0x0b49bb08d83131e9b1aa41e11bf9bcd57ed1839925e9c77881f9b5e10dc63187Redeem237056082022-01-14 10:33:59169 days 12 hrs ago0x6330f080a1a445abe68117d63ffbf126d7ec63cb IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.00467216639959.399999999
0xfc57d731e427f56f19172a09c8a6cf94a907fcaac4ccbac91aa534d0a2f4ec02Redeem237054132022-01-14 10:23:01169 days 12 hrs ago0xc3a68bde255054537b0fbbe932c89d5b11de2cda IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0031476100
0x9ff8586217c238658d86fd3c8f8a9ffb85c4df5decccfff0eeb973dc70a27dcaRedeem237015392022-01-14 7:35:38169 days 15 hrs ago0x6330f080a1a445abe68117d63ffbf126d7ec63cb IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0031462440
0x7148474154ffc1c37735e483d694916ef01c69d6eaa23d30a8cd4e105a4be375Redeem236995352022-01-14 6:16:38169 days 16 hrs ago0x29dc94c7734a0aa19199c029ceef8bd4cb84b101 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.004362834109
0xcc7f5771f4253c3de88aed8b45ac8016a38bb6d7c0ec22a1e2f6bcbf8b0b17b2Redeem236993882022-01-14 6:11:00169 days 17 hrs ago0xe3035decd6937ba6b961e96cfeab62f0b51d6a7c IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0009442830
0xb9a59e00c377ee04ae6216c838409d6f948db7b059b07d051c9cfb612eea3b64Redeem236983552022-01-14 5:33:22169 days 17 hrs ago0x6330f080a1a445abe68117d63ffbf126d7ec63cb IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0023596830
0x1bf9e0763b35fb078ac8136705d1fe40899ae83aaffa2fa0e98ccdd3fe4d4d61Redeem236976172022-01-14 5:08:01169 days 18 hrs ago0x6330f080a1a445abe68117d63ffbf126d7ec63cb IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0023596830
0x77b3990d31f6794b98e70cc851d8c671e16cd25808c4abf7bd1d9e4f7e6370bbRedeem236955932022-01-14 3:54:09169 days 19 hrs ago0x815d000ecf7876a8edfb750b5091ab692bbff7f6 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.000944130
0x403005b2558358b327eb80c367b6983e96f8f96c784cc09ab9f0d22bb3dd6e7fRedeem236955072022-01-14 3:51:13169 days 19 hrs ago0x6330f080a1a445abe68117d63ffbf126d7ec63cb IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0023596830
0x649f754097812ee4e71812a67a7cb02d91584f197a6ff5e6b9154313ca944907Redeem236955042022-01-14 3:51:07169 days 19 hrs ago0xe553347cd0d7a777aacd0ad052d3f68f764a73ba IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0023596830
0xdb4f5963c3b50e9a6f488c86a33f0c8b947f00cf216a355d0ad6dc9ec57ad212Redeem236954402022-01-14 3:48:55169 days 19 hrs ago0x6f7ed8b4478bb8e110337a56d0d9d148992aac55 IN  0x2d7c40cd0228264ae5a73f01bc54fa13c4476da10 MATIC0.0023596830
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VSQBondDepository

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-01-01
*/

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor () {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

interface IOwnable {
  function policy() external view returns (address);

  function renounceManagement() external;
  
  function pushManagement( address newOwner_ ) external;
  
  function pullManagement() external;
}

// Audit on 5-Jan-2021 by Keno and BoringCrypto
// Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol
// Edited by BoringCrypto

contract BoringOwnableData {
    address public owner;
    address public pendingOwner;
}

contract BoringOwnable is BoringOwnableData {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice `owner` defaults to msg.sender on construction.
    constructor() public {
        owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }

    /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
    /// Can only be invoked by the current `owner`.
    /// @param newOwner Address of the new owner.
    /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
    /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
    function transferOwnership(
        address newOwner,
        bool direct,
        bool renounce
    ) public onlyOwner {
        if (direct) {
            // Checks
            require(newOwner != address(0) || renounce, "Ownable: zero address");

            // Effects
            emit OwnershipTransferred(owner, newOwner);
            owner = newOwner;
            pendingOwner = address(0);
        } else {
            // Effects
            pendingOwner = newOwner;
        }
    }

    /// @notice Needs to be called by `pendingOwner` to claim ownership.
    function claimOwnership() public {
        address _pendingOwner = pendingOwner;

        // Checks
        require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

        // Effects
        emit OwnershipTransferred(owner, _pendingOwner);
        owner = _pendingOwner;
        pendingOwner = address(0);
    }

    /// @notice Only allows the `owner` to execute the function.
    modifier onlyOwner() {
        require(msg.sender == owner, "Ownable: caller is not the owner");
        _;
    }
}

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function sub32(uint32 a, uint32 b) internal pure returns (uint32) {
        return sub32(a, b, "SafeMath: subtraction overflow");
    }

    function sub32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) {
        require(b <= a, errorMessage);
        uint32 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    function sqrrt(uint256 a) internal pure returns (uint c) {
        if (a > 3) {
            c = a;
            uint b = add( div( a, 2), 1 );
            while (b < c) {
                c = b;
                b = div( add( div( a, b ), b), 2 );
            }
        } else if (a != 0) {
            c = 1;
        }
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target, 
        bytes memory data, 
        string memory errorMessage
    ) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target, 
        bytes memory data, 
        uint256 value, 
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _functionCallWithValue(
        address target, 
        bytes memory data, 
        uint256 weiValue, 
        string memory errorMessage
    ) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    function functionStaticCall(
        address target, 
        bytes memory data, 
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    function functionDelegateCall(
        address target, 
        bytes memory data, 
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success, 
        bytes memory returndata, 
        string memory errorMessage
    ) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {

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

    function addressToString(address _address) internal pure returns(string memory) {
        bytes32 _bytes = bytes32(uint256(_address));
        bytes memory HEX = "0123456789abcdef";
        bytes memory _addr = new bytes(42);

        _addr[0] = '0';
        _addr[1] = 'x';

        for(uint256 i = 0; i < 20; i++) {
            _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
            _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
        }

        return string(_addr);

    }
}

interface IERC20 {
    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {

        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender)
            .sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

library FullMath {
    function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);
        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;
        require(h < d, 'FullMath::mulDiv: overflow');
        return fullDiv(l, h, d);
    }
}

library FixedPoint {

    struct uq112x112 {
        uint224 _x;
    }

    struct uq144x112 {
        uint256 _x;
    }

    uint8 private constant RESOLUTION = 112;
    uint256 private constant Q112 = 0x10000000000000000000000000000;
    uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
    uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)

    function decode(uq112x112 memory self) internal pure returns (uint112) {
        return uint112(self._x >> RESOLUTION);
    }

    function decode112with18(uq112x112 memory self) internal pure returns (uint) {

        return uint(self._x) / 5192296858534827;
    }

    function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
        require(denominator > 0, 'FixedPoint::fraction: division by zero');
        if (numerator == 0) return FixedPoint.uq112x112(0);

        if (numerator <= uint144(-1)) {
            uint256 result = (numerator << RESOLUTION) / denominator;
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        } else {
            uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
            require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
            return uq112x112(uint224(result));
        }
    }
}

interface ITreasury {
    function deposit( uint _amount, address _token, uint _profit ) external returns ( bool );
    function valueOf( address _token, uint _amount ) external view returns ( uint value_ );
}

interface IBondCalculator {
    function valuation( address _LP, uint _amount ) external view returns ( uint );
    function markdown( address _LP ) external view returns ( uint );
}

interface IStaking {
    function stake( uint _amount, address _recipient ) external returns ( bool );
    function checkUserDepositorWhitelist( address recipient, address sender ) external returns ( bool );
}

interface IStakingHelper {
    function stake( uint _amount, address _recipient ) external;
    function checkUserDepositorWhitelist( address recipient, address sender ) external returns ( bool );
}

contract VSQBondDepository is BoringOwnable, ReentrancyGuard {

    using FixedPoint for *;
    using SafeERC20 for IERC20;
    using SafeMath for uint;
    using SafeMath for uint32;




    /* ======== EVENTS ======== */

    event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD );
    event BondRedeemed( address indexed recipient, uint payout, uint remaining );
    event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio );
    event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition );
    event BondTermsInitialized( uint indexed _controlVariable, uint indexed _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _vestingTerm, uint indexed initialLatDcay );
    event SetBondTerms( uint _parameter, uint _input );
    event SetAdjustment( bool _addition, uint _increment, uint indexed _target, uint _buffer, uint indexed initialLastAdjustment );
    event SetStaking( address _staking, bool _helper );
    event LostTokenRecovered( address _token, uint amount );



    /* ======== STATE VARIABLES ======== */

    address public immutable VSQ; // token given as payment for bond
    address public immutable principle; // token used to create bond
    address public immutable treasury; // mints VSQ when receives principle
    address public immutable DAO; // receives profit share from bond

    bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different
    address public immutable bondCalculator; // calculates value of LP tokens

    address public staking; // to auto-stake payout
    address public stakingHelper; // to stake and claim if no staking warmup
    bool public useHelper;

    Terms public terms; // stores terms for new bonds
    Adjust public adjustment; // stores adjustment to BCV data

    mapping( address => Bond ) public bondInfo; // stores bond information for depositors

    uint public totalDebt; // total value of outstanding bonds; used for pricing
    uint256 public lastDecay; // reference time for debt decay


    /* ======== STRUCTS ======== */

    // Info for creating new bonds
    struct Terms {
        uint controlVariable; // scaling variable for price
        uint minimumPrice; // vs principle value
        uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5%
        uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid)
        uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt
        uint256 vestingTerm; // in seconds
    }

    // Info for bond holder
    struct Bond {
        uint payout; // VSQ remaining to be paid
        uint pricePaid; // In DAI, for front end viewing
        uint256 lastTime; // Last interaction
        uint256 vesting; // Seconds left to vest
    }

    // Info for incremental adjustments to control variable 
    struct Adjust {
        bool add; // addition or subtraction
        uint rate; // increment
        uint target; // BCV when adjustment finished
        uint256 buffer; // minimum length (in seconds) between adjustments
        uint256 lastTime; // time when last adjustment made
    }




    /* ======== INITIALIZATION ======== */

    constructor ( 
        address _VSQ,
        address _principle,
        address _treasury, 
        address _DAO, 
        address _bondCalculator
    ) {
        require( _VSQ != address(0) );
        VSQ = _VSQ;
        require( _principle != address(0) );
        principle = _principle;
        require( _treasury != address(0) );
        treasury = _treasury;
        require( _DAO != address(0) );
        DAO = _DAO;
        // bondCalculator should be address(0) if not LP bond
        bondCalculator = _bondCalculator;
        isLiquidityBond = ( _bondCalculator != address(0) );
    }

    /**
     *  @notice initializes bond parameters
     *  @param _controlVariable uint
     *  @param _minimumPrice uint
     *  @param _maxPayout uint
     *  @param _maxDebt uint
     *  @param _vestingTerm uint
     */
    function initializeBondTerms( 
        uint _controlVariable, 
        uint _minimumPrice,
        uint _maxPayout,
        uint _fee,
        uint _maxDebt,
        uint _vestingTerm
    ) external onlyOwner() {
        require( lastDecay == 0, "bond has already been initalized" );
        require( terms.controlVariable == 0, "Bonds must be initialized from 0" );
        require( _controlVariable > 0, "Bonds must be initialized greater than 0" );
        require( _maxPayout > 0, "maxPayout must be initialized greater than 0");
        require( _fee <= 10000, "DAO fee cannot exceed payout" );
        require( _vestingTerm >= 129600, "Vesting must be longer than 36 hours" );

        terms = Terms ({
            controlVariable: _controlVariable,
            minimumPrice: _minimumPrice,
            maxPayout: _maxPayout,
            fee: _fee,
            maxDebt: _maxDebt,
            vestingTerm: _vestingTerm
        });

        lastDecay = block.timestamp;

        emit BondTermsInitialized( _controlVariable, _minimumPrice, _maxPayout, _fee, _maxDebt, _vestingTerm, lastDecay );
    }



    
    /* ======== POLICY FUNCTIONS ======== */

    enum PARAMETER { VESTING, PAYOUT, FEE, DEBT, MINPRICE }
    /**
     *  @notice set parameters for new bonds
     *  @param _parameter PARAMETER
     *  @param _input uint
     */
    function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyOwner() {
        if ( _parameter == PARAMETER.VESTING ) { // 0
            require( _input >= 129600, "Vesting must be longer than 36 hours" );
            terms.vestingTerm = _input;
        } else if ( _parameter == PARAMETER.PAYOUT ) { // 1
            require( _input <= 75000, "Payout cannot be above 75 percent" );
            terms.maxPayout = _input;
        } else if ( _parameter == PARAMETER.FEE ) { // 2
            require( _input <= 10000, "DAO fee cannot exceed payout" );
            terms.fee = _input;
        } else if ( _parameter == PARAMETER.DEBT ) { // 3
            terms.maxDebt = _input;
        } else if ( _parameter == PARAMETER.MINPRICE ) { // 4
            terms.minimumPrice = _input;
        }

        emit SetBondTerms( uint256(_parameter), _input );
    }

    /**
     *  @notice set control variable adjustment
     *  @param _addition bool
     *  @param _increment uint
     *  @param _target uint
     *  @param _buffer uint
     */
    function setAdjustment ( 
        bool _addition,
        uint _increment, 
        uint _target,
        uint _buffer
    ) external onlyOwner() {
        require( _increment != 0 && ( _addition && terms.controlVariable < _target || !_addition && terms.controlVariable > _target ),
            "Invalid adjustment" );
        uint256 maxIncrement = terms.controlVariable.mul( 25 ).div( 1000 );
        require( _increment <= maxIncrement ||
                    maxIncrement == 0 && _increment == 1, "Increment too large" );

        adjustment = Adjust({
            add: _addition,
            rate: _increment,
            target: _target,
            buffer: _buffer,
            lastTime: block.timestamp
        });

        emit SetAdjustment( _addition, _increment, _target, _buffer, block.timestamp );
    }

    /**
     *  @notice set contract for auto stake
     *  @param _staking address
     *  @param _helper bool
     */
    function setStaking( address _staking, bool _helper ) external onlyOwner() {
        require( _staking != address(0) );
        if ( _helper ) {
            useHelper = true;
            stakingHelper = _staking;
        } else {
            useHelper = false;
            staking = _staking;
        }

        emit SetStaking( _staking, _helper );
    }


    

    /* ======== USER FUNCTIONS ======== */

    /**
     *  @notice deposit bond
     *  @param _amount uint
     *  @param _maxPrice uint
     *  @param _depositor address
     *  @return uint
     */
    function deposit( 
        uint _amount, 
        uint _maxPrice,
        address _depositor
    ) external nonReentrant returns ( uint ) {
        require( lastDecay != 0, "Cannot deposit before bond is initalized" );
        require( _depositor == msg.sender || checkUserDepositorWhitelist( _depositor, msg.sender ), "Sender not authorized" );
        require( _depositor != address(0), "Invalid address" );

        decayDebt();

        uint value = ITreasury( treasury ).valueOf( principle, _amount );
        require( totalDebt.add( value ) <= terms.maxDebt, "Max capacity reached" );
        
        uint priceInUSD = bondPriceInUSD(); // Stored in bond info
        uint nativePrice = _bondPrice();

        require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection

        uint payout = payoutFor( value ); // payout to bonder is computed

        require( payout >= 10000000, "Bond too small" ); // must be > 0.01 VSQ ( underflow protection )
        require( payout <= maxPayout(), "Bond too large" ); // size protection because there is no slippage

        // total debt is increased
        totalDebt = totalDebt.add( value );

        // profits are calculated
        uint fee = payout.mul( terms.fee ).div( 10000 );

        require( value >= payout.add( fee ), "Bond is awaiting reconfiguration" );

        uint profit = value.sub( payout ).sub( fee );

        /**
            principle is transferred in
            approved and
            deposited into the treasury, returning (_amount - profit) VSQ
         */
        IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount );
        IERC20( principle ).approve( treasury, _amount );
        ITreasury( treasury ).deposit( _amount, principle, profit );

        if ( fee != 0 ) { // fee is transferred to dao 
            IERC20( VSQ ).safeTransfer( DAO, fee ); 
        }

        // depositor info is stored
        bondInfo[ _depositor ] = Bond({ 
            payout: bondInfo[ _depositor ].payout.add( payout ),
            vesting: terms.vestingTerm,
            lastTime: block.timestamp,
            pricePaid: priceInUSD
        });

        // indexed events are emitted
        emit BondCreated( _amount, payout, block.timestamp.add( terms.vestingTerm ), priceInUSD );
        emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() );


        adjust(); // control variable is adjusted
        return payout; 
    }

    /** 
     *  @notice redeem bond for user
     *  @param _recipient address
     *  @param _stake bool
     *  @return uint
     */ 
    function redeem( address _recipient, bool _stake ) external returns ( uint ) {        
        require( _recipient == msg.sender || checkUserDepositorWhitelist( _recipient, msg.sender ), "Redeemer not authorized" );
        require( _recipient != address(0), "Invalid address" );

        Bond memory info = bondInfo[ _recipient ];
        // (seconds since last interaction / vesting term remaining)
        uint percentVested = percentVestedFor( _recipient );

        if ( percentVested >= 10000 ) { // if fully vested
            delete bondInfo[ _recipient ]; // delete user info
            emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data
            return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due

        } else { // if unfinished
            // calculate payout vested
            uint payout = info.payout.mul( percentVested ).div( 10000 );
            // store updated deposit info
            bondInfo[ _recipient ] = Bond({
                payout: info.payout.sub( payout ),
                vesting: info.vesting.sub( block.timestamp.sub( info.lastTime ) ),
                lastTime: block.timestamp,
                pricePaid: info.pricePaid
            });

            emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout );
            return stakeOrSend( _recipient, _stake, payout );
        }
    }



    
    /* ======== INTERNAL HELPER FUNCTIONS ======== */

    /**
     *  @notice allow user to stake payout automatically
     *  @param _stake bool
     *  @param _amount uint
     *  @return uint
     */
    function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) {
        if ( !_stake ) { // if user does not want to stake
            IERC20( VSQ ).safeTransfer( _recipient, _amount ); // send payout
        } else { // if user wants to stake
            if ( useHelper ) { // use if staking warmup is 0
                IERC20( VSQ ).approve( stakingHelper, _amount );
                IStakingHelper( stakingHelper ).stake( _amount, _recipient );
            } else {
                IERC20( VSQ ).approve( staking, _amount );
                IStaking( staking ).stake( _amount, _recipient );
            }
        }
        return _amount;
    }

    /**
     *  @notice get the staking permissions for a users account
     *  @param recipient address
     *  @param sender address
     */
    function checkUserDepositorWhitelist( address recipient, address sender ) internal returns ( bool ) {
        if ( useHelper ) { // use if staking warmup is 0
            return IStakingHelper( stakingHelper ).checkUserDepositorWhitelist( recipient, sender );
        } else {
            return IStaking( staking ).checkUserDepositorWhitelist( recipient, sender );
        }
    }

    /**
     *  @notice makes incremental adjustment to control variable
     */
    function adjust() internal {
        uint timeCanAdjust = adjustment.lastTime.add( adjustment.buffer );
        if( adjustment.rate != 0 && block.timestamp >= timeCanAdjust ) {
            uint initial = terms.controlVariable;
            if ( adjustment.add ) {
                terms.controlVariable = terms.controlVariable.add( adjustment.rate );
                if ( terms.controlVariable >= adjustment.target ) {
                    terms.controlVariable = adjustment.target;
                    adjustment.target = 0;
                    adjustment.rate = 0;
                }
            } else {
                terms.controlVariable = terms.controlVariable > adjustment.rate ? terms.controlVariable.sub( adjustment.rate ) : 0;
                if ( terms.controlVariable <= adjustment.target ) {
                    terms.controlVariable = adjustment.target;
                    adjustment.target = 0;
                    adjustment.rate = 0;
                }
            }
            adjustment.lastTime = block.timestamp;
            emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add );
        }
    }

    /**
     *  @notice reduce total debt
     */
    function decayDebt() internal {
        totalDebt = totalDebt.sub( debtDecay() );
        lastDecay = block.timestamp;
    }




    /* ======== VIEW FUNCTIONS ======== */

    /**
     *  @notice determine maximum bond size
     *  @return uint
     */
    function maxPayout() public view returns ( uint ) {
        return IERC20( VSQ ).totalSupply().mul( terms.maxPayout ).div( 100000 );
    }

    /**
     *  @notice calculate interest due for new bond
     *  @param _value uint
     *  @return uint
     */
    function payoutFor( uint _value ) public view returns ( uint ) {
        return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 );
    }


    /**
     *  @notice calculate current bond premium
     *  @return price_ uint
     */
    function bondPrice() public view returns ( uint price_ ) {        
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        }
    }

    /**
     *  @notice calculate current bond price and remove floor if above
     *  @return price_ uint
     */
    function _bondPrice() internal returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;        
        } else if ( terms.minimumPrice != 0 ) {
            terms.minimumPrice = 0;
        }
    }

    /**
     *  @notice converts bond price to DAI value
     *  @return price_ uint
     */
    function bondPriceInUSD() public view returns ( uint price_ ) {
        if( isLiquidityBond ) {
            price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 );
        } else {
            price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 );
        }
    }


    /**
     *  @notice calculate current ratio of debt to VSQ supply
     *  @return debtRatio_ uint
     */
    function debtRatio() public view returns ( uint debtRatio_ ) {   
        uint supply = IERC20( VSQ ).totalSupply();
        debtRatio_ = FixedPoint.fraction( 
            currentDebt().mul( 1e9 ), 
            supply
        ).decode112with18().div( 1e18 );
    }

    /**
     *  @notice debt ratio in same terms for reserve or liquidity bonds
     *  @return uint
     */
    function standardizedDebtRatio() external view returns ( uint ) {
        if ( isLiquidityBond ) {
            return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 );
        } else {
            return debtRatio();
        }
    }

    /**
     *  @notice calculate debt factoring in decay
     *  @return uint
     */
    function currentDebt() public view returns ( uint ) {
        return totalDebt.sub( debtDecay() );
    }

    /**
     *  @notice amount to decay total debt by
     *  @return decay_ uint
     */
    function debtDecay() public view returns ( uint decay_ ) {
        uint256 timeSinceLast = block.timestamp.sub( lastDecay );
        decay_ = totalDebt.mul( timeSinceLast ).div( terms.vestingTerm );
        if ( decay_ > totalDebt ) {
            decay_ = totalDebt;
        }
    }


    /**
     *  @notice calculate how far into vesting a depositor is
     *  @param _depositor address
     *  @return percentVested_ uint
     */
    function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) {
        Bond memory bond = bondInfo[ _depositor ];
        uint secondsSinceLast = block.timestamp.sub( bond.lastTime );
        uint vesting = bond.vesting;

        if ( vesting > 0 ) {
            percentVested_ = secondsSinceLast.mul( 10000 ).div( vesting );
        } else {
            percentVested_ = 0;
        }
    }

    /**
     *  @notice calculate amount of VSQ available for claim by depositor
     *  @param _depositor address
     *  @return pendingPayout_ uint
     */
    function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) {
        uint percentVested = percentVestedFor( _depositor );
        uint payout = bondInfo[ _depositor ].payout;

        if ( percentVested >= 10000 ) {
            pendingPayout_ = payout;
        } else {
            pendingPayout_ = payout.mul( percentVested ).div( 10000 );
        }
    }




    /* ======= AUXILLIARY ======= */

    /**
     *  @notice allow anyone to send lost tokens (excluding principle or VSQ) to the DAO
     *  @return bool
     */
    function recoverLostToken( address _token ) external returns ( bool ) {
        require( _token != VSQ );
        require( _token != principle );

        emit LostTokenRecovered( _token, IERC20( _token ).balanceOf( address(this) ) );

        IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) );

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_VSQ","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"initialLatDcay","type":"uint256"}],"name":"BondTermsInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LostTokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_addition","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_increment","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_buffer","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"initialLastAdjustment","type":"uint256"}],"name":"SetAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_parameter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_input","type":"uint256"}],"name":"SetBondTerms","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staking","type":"address"},{"indexed":false,"internalType":"bool","name":"_helper","type":"bool"}],"name":"SetStaking","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VSQ","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"lastTime","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum VSQBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b506040516200509738038062005097833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001600281905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200014f57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001c157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200023357600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002a557600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c614c6a6200042d60003980611fce5280612c6c528061304a525080611fa05280612c3b52806133d7525080612a395280612d875280612f58525080611aeb5280612414528061288852806129395250806109df528061200a52806120e352806124505280612805528061284c52806129765280612ca85280612e06525080612a5b5280612dad52806130a1528061347452806135b752806138b252806139125280613ab15250614c6a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063d5025625116100ad578063e30c39781161007c578063e30c39781461091b578063e392a2621461094f578063e9c70da51461096d578063f5c2ab5b146109a1578063fc7b9c18146109bf57610211565b8063d50256251461087e578063d7969060146108bf578063d7ccfb0b146108df578063e0176de8146108fd57610211565b8063b4abccba116100f4578063b4abccba14610715578063c5332b7c1461076f578063cd1234b3146107a3578063cea55f5714610810578063d4d863ce1461082e57610211565b80638da5cb5b146106235780638dbdbe6d14610657578063904b3ece146106c357806398fabd3a146106e157610211565b80634cf088d9116101a8578063759076e511610177578063759076e51461051157806377b818951461052f5780637927ebf8146105635780637b261727146105a5578063844b5c7c1461060557610211565b80634cf088d9146104475780634e71e0c81461047b578063507930ec1461048557806361d027b3146104dd57610211565b80631e321a0f116101e45780631e321a0f1461034c5780631feed31f146103875780632f3f470a146103eb578063451ee4a11461040b57610211565b8063016a42841461021657806301b88ee81461024a578063078dfbe7146102a25780631a3d0068146102fe575b600080fd5b61021e6109dd565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a01565b6040518082815260200191505060405180910390f35b6102fc600480360360608110156102b857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190803515159060200190929190505050610a98565b005b61034a6004803603608081101561031457600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610d52565b005b6103856004803603604081101561036257600080fd5b81019080803560ff16906020019092919080359060200190929190505050611042565b005b6103d56004803603604081101561039d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611365565b6040518082815260200191505060405180910390f35b6103f36117d2565b60405180821515815260200191505060405180910390f35b6104136117e5565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61044f611816565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61048361183c565b005b6104c76004803603602081101561049b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a03565b6040518082815260200191505060405180910390f35b6104e5611ae9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610519611b0d565b6040518082815260200191505060405180910390f35b610537611b30565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61058f6004803603602081101561057957600080fd5b8101908080359060200190929190505050611b56565b6040518082815260200191505060405180910390f35b610603600480360360c08110156105bb57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611b91565b005b61060d611f9c565b6040518082815260200191505060405180910390f35b61062b6121b2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106ad6004803603606081101561066d57600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121d6565b6040518082815260200191505060405180910390f35b6106cb612c37565b6040518082815260200191505060405180910390f35b6106e9612d85565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107576004803603602081101561072b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612da9565b60405180821515815260200191505060405180910390f35b610777613048565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107e5600480360360208110156107b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061306c565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61081861309c565b6040518082815260200191505060405180910390f35b61087c6004803603604081101561084457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613191565b005b6108866133ab565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108c76133d5565b60405180821515815260200191505060405180910390f35b6108e76133f9565b6040518082815260200191505060405180910390f35b610905613460565b6040518082815260200191505060405180910390f35b610923613534565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61095761355a565b6040518082815260200191505060405180910390f35b6109756135b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109a96135d9565b6040518082815260200191505060405180910390f35b6109c76135df565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b600080610a0d83611a03565b90506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a6757809250610a91565b610a8e612710610a8084846135e590919063ffffffff16565b61366b90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8115610d0b57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580610b985750805b610c0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f776e61626c653a207a65726f2061646472657373000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610d4d565b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60008314158015610e4a5750838015610e30575081600560000154105b80610e49575083158015610e48575081600560000154115b5b5b610ebc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e76616c69642061646a7573746d656e74000000000000000000000000000081525060200191505060405180910390fd5b6000610eeb6103e8610edd60196005600001546135e590919063ffffffff16565b61366b90919063ffffffff16565b90508084111580610f085750600081148015610f075750600184145b5b610f7a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280861515815260200185815260200184815260200183815260200142815250600b60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505042837f801c1dd2df206cc8f7c9edbaf171e23708d4a305e80d2cabb29fff1e4cd73f2f878786604051808415158152602001838152602001828152602001935050505060405180910390a35050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600481111561111057fe5b82600481111561111c57fe5b141561118c576201fa4081101561117e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614be76024913960400191505060405180910390fd5b806005800181905550611317565b6001600481111561119957fe5b8260048111156111a557fe5b141561121657620124f8811115611207576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b086021913960400191505060405180910390fd5b80600560020181905550611316565b6002600481111561122357fe5b82600481111561122f57fe5b14156112bc576127108111156112ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b80600560030181905550611315565b600360048111156112c957fe5b8260048111156112d557fe5b14156112ea5780600560040181905550611314565b6004808111156112f657fe5b82600481111561130257fe5b141561131357806005600101819055505b5b5b5b5b7f6ce30ede0614e2c337df047a16883821e992fff8189523906fdc63fa247b014e82600481111561134457fe5b82604051808381526020018281526020019250505060405180910390a15050565b60003373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806113a757506113a683336136b5565b5b611419576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f52656465656d6572206e6f7420617574686f72697a656400000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156114bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b6114c4614a86565b601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061154385611a03565b9050612710811061162357601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261161a858584600001516138a4565b925050506117cc565b60006116506127106116428486600001516135e590919063ffffffff16565b61366b90919063ffffffff16565b90506040518060800160405280611674838660000151613c7990919063ffffffff16565b8152602001846020015181526020014281526020016116b66116a3866040015142613c7990919063ffffffff16565b8660600151613c7990919063ffffffff16565b815250601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26117c68686836138a4565b93505050505b92915050565b600460149054906101000a900460ff1681565b600b8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611a0d614a86565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611a9a826040015142613c7990919063ffffffff16565b90506000826060015190506000811115611adc57611ad581611ac7612710856135e590919063ffffffff16565b61366b90919063ffffffff16565b9350611ae1565b600093505b505050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611b2b611b1a61355a565b601154613c7990919063ffffffff16565b905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b8a662386f26fc10000611b7c611b7785611b726133f9565b613cc3565b613fa4565b61366b90919063ffffffff16565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060125414611cca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f626f6e642068617320616c7265616479206265656e20696e6974616c697a656481525060200191505060405180910390fd5b600060056000015414611d45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b60008611611d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614ae06028913960400191505060405180910390fd5b60008411611df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180614b98602c913960400191505060405180910390fd5b612710831115611e6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b6201fa40811015611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614be76024913960400191505060405180910390fd5b6040518060c00160405280878152602001868152602001858152602001848152602001838152602001828152506005600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050504260128190555060125485877fe9a2e3e0ea1db8e8d98c18bdd491a371e94350a66ce9f76bfe89d1baa99ef1a0878787876040518085815260200184815260200183815260200182815260200194505050505060405180910390a4505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156120d9576120d260646120c47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561207357600080fd5b505afa158015612087573d6000803e3d6000fd5b505050506040513d602081101561209d57600080fd5b81019080805190602001909291905050506120b66133f9565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b90506121af565b6121ac606461219e7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561214757600080fd5b505afa15801561215b573d6000803e3d6000fd5b505050506040513d602081101561217157600080fd5b810190808051906020019092919050505060ff16600a0a6121906133f9565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b90505b90565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600280541415612250576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60028081905550600060125414156122b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614b296028913960400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806122f357506122f282336136b5565b5b612365576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f53656e646572206e6f7420617574686f72697a6564000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612408576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b612410613fe0565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b1580156124c157600080fd5b505afa1580156124d5573d6000803e3d6000fd5b505050506040513d60208110156124eb57600080fd5b810190808051906020019092919050505090506005600401546125198260115461400b90919063ffffffff16565b111561258d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000612597611f9c565b905060006125a3614093565b9050808610156125fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614bc46023913960400191505060405180910390fd5b600061260984611b56565b905062989680811015612684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61268c613460565b811115612701576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6127168460115461400b90919063ffffffff16565b601181905550600061274a61271061273c600560030154856135e590919063ffffffff16565b61366b90919063ffffffff16565b905061275f818361400b90919063ffffffff16565b8510156127d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e64206973206177616974696e67207265636f6e66696775726174696f6e81525060200191505060405180910390fd5b60006127fb826127ed8589613c7990919063ffffffff16565b613c7990919063ffffffff16565b905061284a33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16614118909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156128fb57600080fd5b505af115801561290f573d6000803e3d6000fd5b505050506040513d602081101561292557600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156129f057600080fd5b505af1158015612a04573d6000803e3d6000fd5b505050506040513d6020811015612a1a57600080fd5b81019080805190602001909291905050505060008214612aa057612a9f7f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b5b6040518060800160405280612b0085601060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461400b90919063ffffffff16565b81526020018681526020014281526020016005800154815250601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505084612b9b60058001544261400b90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a4612bdb61309c565b612be3614093565b612beb611f9c565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4612c1f61427b565b82965050505050505060016002819055509392505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612d7757612d70633b9aca00612d627f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d1157600080fd5b505afa158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b8101908080519060200190929190505050612d5461309c565b6135e590919063ffffffff16565b61366b90919063ffffffff16565b9050612d82565b612d7f61309c565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e0457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e5d57600080fd5b7f243a2623004d785f69b32e4c3554598be81aab5a716683781ec11c8ba61a212a828373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612ee657600080fd5b505afa158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b8101908080519060200190929190505050604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a161303f7f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612fde57600080fd5b505afa158015612ff2573d6000803e3d6000fd5b505050506040513d602081101561300857600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60106020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561310557600080fd5b505afa158015613119573d6000803e3d6000fd5b505050506040513d602081101561312f57600080fd5b8101908080519060200190929190505050905061318b670de0b6b3a764000061317d613178613172633b9aca00613164611b0d565b6135e590919063ffffffff16565b85613cc3565b613fa4565b61366b90919063ffffffff16565b91505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613252576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328c57600080fd5b80156132f3576001600460146101000a81548160ff02191690831515021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550613350565b6000600460146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b7f73caa800c10cd22f14eb0c9c372b61140240e409486c87e70d1ad9d79e7f2c698282604051808373ffffffffffffffffffffffffffffffffffffffff16815260200182151581526020019250505060405180910390a15050565b60058060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061344562989680613437633b9aca0061342961341561309c565b6005600001546135e590919063ffffffff16565b61400b90919063ffffffff16565b61366b90919063ffffffff16565b905060056001015481101561345d5760056001015490505b90565b600061352f620186a06135216005600201547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156134d857600080fd5b505afa1580156134ec573d6000803e3d6000fd5b505050506040513d602081101561350257600080fd5b81019080805190602001909291905050506135e590919063ffffffff16565b61366b90919063ffffffff16565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008061357260125442613c7990919063ffffffff16565b905061359f6005800154613591836011546135e590919063ffffffff16565b61366b90919063ffffffff16565b91506011548211156135b15760115491505b5090565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b60115481565b6000808314156135f85760009050613665565b600082840290508284828161360957fe5b0414613660576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b776021913960400191505060405180910390fd5b809150505b92915050565b60006136ad83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061442e565b905092915050565b6000600460149054906101000a900460ff16156137b757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634048590e84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561377557600080fd5b505af1158015613789573d6000803e3d6000fd5b505050506040513d602081101561379f57600080fd5b8101908080519060200190929190505050905061389e565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634048590e84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561386057600080fd5b505af1158015613874573d6000803e3d6000fd5b505050506040513d602081101561388a57600080fd5b810190808051906020019092919050505090505b92915050565b6000826138fb576138f684837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166141d99092919063ffffffff16565b613c6f565b600460149054906101000a900460ff1615613aaf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156139c357600080fd5b505af11580156139d7573d6000803e3d6000fd5b505050506040513d60208110156139ed57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015613a9257600080fd5b505af1158015613aa6573d6000803e3d6000fd5b50505050613c6e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015613b6257600080fd5b505af1158015613b76573d6000803e3d6000fd5b505050506040513d6020811015613b8c57600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015613c3157600080fd5b505af1158015613c45573d6000803e3d6000fd5b505050506040513d6020811015613c5b57600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b6000613cbb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506144f4565b905092915050565b613ccb614aae565b60008211613d24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614b516026913960400191505060405180910390fd5b6000831415613d6257604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050613f9e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311613e9b57600082607060ff1685901b81613daf57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050613f9e565b6000613eb7846e010000000000000000000000000000856145b4565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681613fd857fe5b049050919050565b613ffc613feb61355a565b601154613c7990919063ffffffff16565b60118190555042601281905550565b600080828401905083811015614089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006140df629896806140d1633b9aca006140c36140af61309c565b6005600001546135e590919063ffffffff16565b61400b90919063ffffffff16565b61366b90919063ffffffff16565b90506005600101548110156140fb576005600101549050614115565b6000600560010154146141145760006005600101819055505b5b90565b6141d3846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614676565b50505050565b6142768363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614676565b505050565b600061429a600b60030154600b6004015461400b90919063ffffffff16565b90506000600b60010154141580156142b25750804210155b1561442b5760006005600001549050600b60000160009054906101000a900460ff161561433b576142f6600b6001015460056000015461400b90919063ffffffff16565b600560000181905550600b600201546005600001541061433657600b600201546005600001819055506000600b600201819055506000600b600101819055505b6143b2565b600b6001015460056000015411614353576000614371565b614370600b60010154600560000154613c7990919063ffffffff16565b5b600560000181905550600b60020154600560000154116143b157600b600201546005600001819055506000600b600201819055506000600b600101819055505b5b42600b600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600560000154600b60010154600b60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b600080831182906144da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561449f578082015181840152602081019050614484565b50505050905090810190601f1680156144cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816144e657fe5b049050809150509392505050565b60008383111582906145a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561456657808201518184015260208101905061454b565b50505050905090810190601f1680156145935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006145c38686614765565b91509150600084806145d157fe5b8688099050828111156145e5576001820391505b808303925084821061465f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61466a8383876147b8565b93505050509392505050565b60606146d8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166148559092919063ffffffff16565b9050600081511115614760578080602001905160208110156146f957600080fd5b810190808051906020019092919050505061475f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614c0b602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061479257fe5b848609905083850292508281039150828110156147b0576001820391505b509250929050565b60008082600003831690508083816147cc57fe5b0492508085816147d857fe5b04945060018182600003816147e957fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060614864848460008561486d565b90509392505050565b606061487885614a73565b6148ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061493a5780518252602082019150602081019050602083039250614917565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461499c576040519150601f19603f3d011682016040523d82523d6000602084013e6149a1565b606091505b509150915081156149b6578092505050614a6b565b6000815111156149c95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a30578082015181840152602081019050614a15565b50505050905090810190601f168015614a5d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe426f6e6473206d75737420626520696e697469616c697a65642067726561746572207468616e20305061796f75742063616e6e6f742062652061626f76652037352070657263656e7443616e6e6f74206465706f736974206265666f726520626f6e6420697320696e6974616c697a65644669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776d61785061796f7574206d75737420626520696e697469616c697a65642067726561746572207468616e2030536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220df75655642e0f1ef4c6e5a85ffd67a497d59cb1ab845bf2a21d1018f8ea6cbfc64736f6c6343000705003300000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4

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

00000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4

-----Decoded View---------------
Arg [0] : _VSQ (address): 0x29f1e986fca02b7e54138c04c4f503dddd250558
Arg [1] : _principle (address): 0xc2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e
Arg [2] : _treasury (address): 0x8c7290399cecbbbf31e471951cc4c2ce91f5073c
Arg [3] : _DAO (address): 0x4f64c22fb06ab877bf63f7064fa21c5c51cc85bf
Arg [4] : _bondCalculator (address): 0xfeeadb0798ef580b1394eb38659cf85cc25d43e4

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000029f1e986fca02b7e54138c04c4f503dddd250558
Arg [1] : 000000000000000000000000c2f4694ab1384e6bce1c8aa91b9a3e8cc1a6477e
Arg [2] : 0000000000000000000000008c7290399cecbbbf31e471951cc4c2ce91f5073c
Arg [3] : 0000000000000000000000004f64c22fb06ab877bf63f7064fa21c5c51cc85bf
Arg [4] : 000000000000000000000000feeadb0798ef580b1394eb38659cf85cc25d43e4


Deployed ByteCode Sourcemap

18681:20223:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19939:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37954:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3991:506;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25358:837;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24280:882;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29611:1415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20469:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20554:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20338:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4579:340;;;:::i;:::-;;37351:431;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20009:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36692:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20391:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34368:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22894:1130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35472:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3137:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26923:2537;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36318:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20086:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38538:363;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20257:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20620:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35927:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26328:366;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;20499:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20158:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34634:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34099:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3164:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36900:288;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19869:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;20795:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20713:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19939:34;;;:::o;37954:400::-;38026:19;38059:18;38080:30;38098:10;38080:16;:30::i;:::-;38059:51;;38121:11;38135:8;:22;38145:10;38135:22;;;;;;;;;;;;;;;:29;;;38121:43;;38199:5;38182:13;:22;38177:170;;38239:6;38222:23;;38177:170;;;38295:40;38328:5;38295:27;38307:13;38295:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;38278:57;;38177:170;37954:400;;;;;:::o;3991:506::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4130:6:::1;4126:364;;;4204:1;4184:22;;:8;:22;;;;:34;;;;4210:8;4184:34;4176:68;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;4318:8;4290:37;;4311:5;::::0;::::1;;;;;;;;4290:37;;;;;;;;;;;;4350:8;4342:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;4396:1;4373:12;;:25;;;;;;;;;;;;;;;;;;4126:364;;;4470:8;4455:12;;:23;;;;;;;;;;;;;;;;;;4126:364;3991:506:::0;;;:::o;25358:837::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25543:1:::1;25529:10;:15;;:116;;;;;25550:9;:44;;;;;25587:7;25563:5;:21;;;:31;25550:44;:93;;;;25599:9;25598:10;:45;;;;;25636:7;25612:5;:21;;;:31;25598:45;25550:93;25529:116;25520:162;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25693:20;25716:43;25753:4;25716:31;25743:2;25716:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;25693:66;;25793:12;25779:10;:26;;:87;;;;25846:1;25830:12;:17;:36;;;;;25865:1;25851:10;:15;25830:36;25779:87;25770:121;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25917:179;;;;;;;;25944:9;25917:179;;;;;;25974:10;25917:179;;;;26007:7;25917:179;;;;26037:7;25917:179;;;;26069:15;25917:179;;::::0;25904:10:::1;:192;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26170:15;26152:7;26114:73;26129:9;26140:10;26161:7;26114:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5100:1;25358:837:::0;;;;:::o;24280:882::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24391:17:::1;24377:31;;;;;;;;:10;:31;;;;;;;;;24372:722;;;24450:6;24440;:16;;24431:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24533:6;24513:5;:17:::0;::::1;:26;;;;24372:722;;;24576:16;24562:30;;;;;;;;:10;:30;;;;;;;;;24557:537;;;24634:5;24624:6;:15;;24615:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24711:6;24693:5;:15;;:24;;;;24557:537;;;24754:13;24740:27;;;;;;;;:10;:27;;;;;;;;;24735:359;;;24809:5;24799:6;:15;;24790:58;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24875:6;24863:5;:9;;:18;;;;24735:359;;;24918:14;24904:28;;;;;;;;:10;:28;;;;;;;;;24899:195;;;24971:6;24955:5;:13;;:22;;;;24899:195;;;25014:18;25000:32:::0;::::1;;;;;;;:10;:32;;;;;;;;;24995:99;;;25076:6;25055:5;:18;;:27;;;;24995:99;24899:195;24735:359;24557:537;24372:722;25111:43;25133:10;25125:19;;;;;;;;25146:6;25111:43;;;;;;;;;;;;;;;;;;;;;;;;24280:882:::0;;:::o;29611:1415::-;29681:4;29730:10;29716:24;;:10;:24;;;:81;;;;29744:53;29773:10;29785;29744:27;:53::i;:::-;29716:81;29707:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29868:1;29846:24;;:10;:24;;;;29837:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29904:16;;:::i;:::-;29923:8;:22;29933:10;29923:22;;;;;;;;;;;;;;;29904:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30026:18;30047:30;30065:10;30047:16;:30::i;:::-;30026:51;;30112:5;30095:13;:22;30090:929;;30161:8;:22;30171:10;30161:22;;;;;;;;;;;;;;;;30154:29;;;;;;;;;;;;;;;;;;;;;;;;;;30237:10;30223:42;;;30249:4;:11;;;30262:1;30223:42;;;;;;;;;;;;;;;;;;;;;;;;30305:46;30318:10;30330:6;30338:4;:11;;;30305;:46::i;:::-;30298:53;;;;;;30090:929;30470:11;30484:45;30522:5;30484:32;30501:13;30484:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;30470:59;;30612:245;;;;;;;;30644:25;30661:6;30644:4;:11;;;:15;;:25;;;;:::i;:::-;30612:245;;;;30827:4;:14;;;30612:245;;;;30782:15;30612:245;;;;30697:56;30715:36;30736:4;:13;;;30715:15;:19;;:36;;;;:::i;:::-;30697:4;:12;;;:16;;:56;;;;:::i;:::-;30612:245;;;30587:8;:22;30597:10;30587:22;;;;;;;;;;;;;;;:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30893:10;30879:65;;;30905:6;30913:8;:22;30923:10;30913:22;;;;;;;;;;;;;;;:29;;;30879:65;;;;;;;;;;;;;;;;;;;;;;;;30966:41;30979:10;30991:6;30999;30966:11;:41::i;:::-;30959:48;;;;;29611:1415;;;;;:::o;20469:21::-;;;;;;;;;;;;;:::o;20554:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20338:22::-;;;;;;;;;;;;;:::o;4579:340::-;4623:21;4647:12;;;;;;;;;;;4623:36;;4713:13;4699:27;;:10;:27;;;4691:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4829:13;4801:42;;4822:5;;;;;;;;;;4801:42;;;;;;;;;;;;4862:13;4854:5;;:21;;;;;;;;;;;;;;;;;;4909:1;4886:12;;:25;;;;;;;;;;;;;;;;;;4579:340;:::o;37351:431::-;37421:19;37454:16;;:::i;:::-;37473:8;:22;37483:10;37473:22;;;;;;;;;;;;;;;37454:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37506:21;37530:36;37551:4;:13;;;37530:15;:19;;:36;;;;:::i;:::-;37506:60;;37577:12;37592:4;:12;;;37577:27;;37632:1;37622:7;:11;37617:158;;;37668:44;37703:7;37668:29;37690:5;37668:16;:20;;:29;;;;:::i;:::-;:33;;:44;;;;:::i;:::-;37651:61;;37617:158;;;37762:1;37745:18;;37617:158;37351:431;;;;;;:::o;20009:33::-;;;:::o;36692:106::-;36737:4;36762:28;36777:11;:9;:11::i;:::-;36762:9;;:13;;:28;;;;:::i;:::-;36755:35;;36692:106;:::o;20391:28::-;;;;;;;;;;;;;:::o;34368:161::-;34424:4;34449:72;34515:4;34449:60;:42;34470:6;34478:11;:9;:11::i;:::-;34449:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;34442:79;;34368:161;;;:::o;22894:1130::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23145:1:::1;23132:9;;:14;23123:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23229:1;23204:5;:21;;;:26;23195:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23307:1;23288:16;:20;23279:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23387:1;23374:10;:14;23365:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23465:5;23457:4;:13;;23448:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23540:6;23524:12;:22;;23515:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23609:241;;;;;;;;23648:16;23609:241;;;;23693:13;23609:241;;;;23732:10;23609:241;;;;23762:4;23609:241;;;;23790:8;23609:241;;;;23826:12;23609:241;;::::0;23601:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23875:15;23863:9;:27;;;;24005:9;;23948:13;23930:16;23908:108;23963:10;23975:4;23981:8;23991:12;23908:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:1130:::0;;;;;;:::o;35472:331::-;35520:11;35549:15;35545:251;;;35591:85;35671:3;35591:74;35625:14;35608:42;;;35652:9;35608:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35591:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;35582:94;;35545:251;;;35718:66;35779:3;35718:55;35749:9;35741:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35735:36;;:2;:36;35718:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;35709:75;;35545:251;35472:331;:::o;3137:20::-;;;;;;;;;;;;:::o;26923:2537::-;27058:4;1724:1;2321:7;;:19;;2313:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1724:1;2454:7;:18;;;;27098:1:::1;27085:9;;:14;;27076:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27179:10;27165:24;;:10;:24;;;:81;;;;27193:53;27222:10;27234;27193:27;:53::i;:::-;27165:81;27156:117;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27315:1;27293:24;;:10;:24;;;;27284:54;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27351:11;:9;:11::i;:::-;27375:10;27399:8;27388:29;;;27419:9;27430:7;27388:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;27375:64;;27485:5;:13;;;27459:22;27474:5;27459:9;;:13;;:22;;;;:::i;:::-;:39;;27450:74;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27545:15;27563:16;:14;:16::i;:::-;27545:34;;27613:16;27632:12;:10;:12::i;:::-;27613:31;;27679:11;27666:9;:24;;27657:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27767:11;27781:18;27792:5;27781:9;:18::i;:::-;27767:32;;27863:8;27853:6;:18;;27844:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27968:11;:9;:11::i;:::-;27958:6;:21;;27949:50;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28108:22;28123:5;28108:9;;:13;;:22;;;;:::i;:::-;28096:9;:34;;;;28178:8;28189:36;28218:5;28189:23;28201:5;:9;;;28189:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;28178:47;;28256:17;28268:3;28256:6;:10;;:17;;;;:::i;:::-;28247:5;:26;;28238:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28324:11;28338:30;28363:3;28338:19;28349:6;28338:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;28324:44;;28549:74;28587:10;28607:4;28614:7;28557:9;28549:36;;;;:74;;;;;;:::i;:::-;28642:9;28634:27;;;28663:8;28673:7;28634:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;28704:8;28693:29;;;28724:7;28733:9;28744:6;28693:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;28777:1;28770:3;:8;28765:112;;28826:38;28854:3;28859;28834;28826:26;;;;:38;;;;;:::i;:::-;28765:112;28951:201;;;;;;;;28980:43;29015:6;28980:8;:22;28990:10;28980:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;28951:201;;;;29130:10;28951:201;;;;29089:15;28951:201;;;;29047:5;:17:::0;::::1;;28951:201;;::::0;28926:8:::1;:22;28936:10;28926:22;;;;;;;;;;;;;;;:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29281:10;29239:40;29260:5;:17:::0;::::1;;29239:15;:19;;:40;;;;:::i;:::-;29231:6;29209:84;29222:7;29209:84;;;;;;;;;;;;;;;;;;29359:11;:9;:11::i;:::-;29345:12;:10;:12::i;:::-;29327:16;:14;:16::i;:::-;29309:63;;;;;;;;;;29387:8;:6;:8::i;:::-;29445:6;29438:13;;;;;;;;1680:1:::0;2633:7;:22;;;;26923:2537;;;;;:::o;36318:275::-;36375:4;36398:15;36393:193;;;36438:85;36518:3;36438:74;36472:14;36455:42;;;36499:9;36455:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36438:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;36431:92;;;;36393:193;36563:11;:9;:11::i;:::-;36556:18;;36318:275;;:::o;20086:28::-;;;:::o;38538:363::-;38601:4;38638:3;38628:13;;:6;:13;;;;38619:24;;;;;;38673:9;38663:19;;:6;:19;;;;38654:30;;;;;;38702:73;38722:6;38738;38730:26;;;38766:4;38730:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38702:73;;;;;;;;;;;;;;;;;;;;;;;;;;38788:81;38819:3;38832:6;38824:26;;;38860:4;38824:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38796:6;38788:29;;;;:81;;;;;:::i;:::-;38889:4;38882:11;;38538:363;;;:::o;20257:39::-;;;:::o;20620:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35927:270::-;35970:15;36002:11;36024:3;36016:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36002:41;;36067:122;36183:4;36067:110;:92;36102:24;36121:3;36102:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;36142:6;36067:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;36054:135;;35927:270;;:::o;26328:366::-;5047:5;;;;;;;;;;5033:19;;:10;:19;;;5025:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26443:1:::1;26423:22;;:8;:22;;;;26414:33;;;::::0;::::1;;26463:7;26458:180;;;26500:4;26488:9;;:16;;;;;;;;;;;;;;;;;;26535:8;26519:13;;:24;;;;;;;;;;;;;;;;;;26458:180;;;26588:5;26576:9;;:17;;;;;;;;;;;;;;;;;;26618:8;26608:7;;:18;;;;;;;;;;;;;;;;;;26458:180;26655:31;26667:8;26677:7;26655:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;26328:366:::0;;:::o;20499:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20158:37::-;;;:::o;34634:261::-;34677:11;34719:69;34783:3;34719:58;34765:10;34719:40;34746:11;:9;:11::i;:::-;34719:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34710:78;;34813:5;:18;;;34804:6;:27;34799:89;;;34858:5;:18;;;34849:27;;34799:89;34634:261;:::o;34099:140::-;34142:4;34167:64;34223:6;34167:50;34200:5;:15;;;34175:3;34167:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;34160:71;;34099:140;:::o;3164:27::-;;;;;;;;;;;;;:::o;36900:288::-;36943:11;36968:21;36992:32;37013:9;;36992:15;:19;;:32;;;;:::i;:::-;36968:56;;37044:55;37080:5;:17;;;37044:30;37059:13;37044:9;;:13;;:30;;;;:::i;:::-;:34;;:55;;;;:::i;:::-;37035:64;;37124:9;;37115:6;:18;37110:71;;;37160:9;;37151:18;;37110:71;36900:288;;:::o;19869:28::-;;;:::o;20795:24::-;;;;:::o;20713:21::-;;;;:::o;6018:250::-;6076:7;6105:1;6100;:6;6096:47;;;6130:1;6123:8;;;;6096:47;6155:9;6171:1;6167;:5;6155:17;;6200:1;6195;6191;:5;;;;;;:10;6183:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6259:1;6252:8;;;6018:250;;;;;:::o;6276:132::-;6334:7;6361:39;6365:1;6368;6361:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6354:46;;6276:132;;;;:::o;32106:387::-;32199:4;32222:9;;;;;;;;;;;32217:269;;;32302:13;;;;;;;;;;;32286:59;;;32347:9;32358:6;32286:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32279:87;;;;32217:269;32416:7;;;;;;;;;;;32406:47;;;32455:9;32466:6;32406:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32399:75;;32106:387;;;;;:::o;31256:694::-;31345:4;31369:6;31363:555;;31427:49;31455:10;31467:7;31435:3;31427:26;;;;:49;;;;;:::i;:::-;31363:555;;;31555:9;;;;;;;;;;;31550:357;;;31624:3;31616:21;;;31639:13;;;;;;;;;;;31654:7;31616:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31698:13;;;;;;;;;;;31682:37;;;31721:7;31730:10;31682:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31550:357;;;31791:3;31783:21;;;31806:7;;;;;;;;;;;31815;31783:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31853:7;;;;;;;;;;;31843:25;;;31870:7;31879:10;31843:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31550:357;31363:555;31935:7;31928:14;;31256:694;;;;;:::o;5331:136::-;5389:7;5416:43;5420:1;5423;5416:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5409:50;;5331:136;;;;:::o;17129:719::-;17210:16;;:::i;:::-;17261:1;17247:11;:15;17239:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17333:1;17320:9;:14;17316:50;;;17343:23;;;;;;;;17364:1;17343:23;;;;;17336:30;;;;17316:50;17404:2;17383:24;;:9;:24;17379:462;;17424:14;17469:11;16555:3;17442:23;;:9;:23;;17441:39;;;;;;17424:56;;17521:2;17503:21;;:6;:21;;17495:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17581:26;;;;;;;;17599:6;17581:26;;;;;17574:33;;;;;17379:462;17640:14;17657:45;17673:9;16597:31;17690:11;17657:15;:45::i;:::-;17640:62;;17743:2;17725:21;;:6;:21;;17717:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17803:26;;;;;;;;17821:6;17803:26;;;;;17796:33;;;17129:719;;;;;:::o;16984:137::-;17055:4;17097:16;17086:4;:7;;;17081:13;;:32;;;;;;17074:39;;16984:137;;;:::o;33827:127::-;33880:28;33895:11;:9;:11::i;:::-;33880:9;;:13;;:28;;;;:::i;:::-;33868:9;:40;;;;33931:15;33919:9;:27;;;;33827:127::o;5142:181::-;5200:7;5220:9;5236:1;5232;:5;5220:17;;5261:1;5256;:6;;5248:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5314:1;5307:8;;;5142:181;;;;:::o;35022:345::-;35063:11;35097:69;35161:3;35097:58;35143:10;35097:40;35124:11;:9;:11::i;:::-;35097:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;35088:78;;35191:5;:18;;;35182:6;:27;35177:183;;;35236:5;:18;;;35227:27;;35177:183;;;35307:1;35285:5;:18;;;:23;35280:80;;35347:1;35326:5;:18;;:22;;;;35280:80;35177:183;35022:345;:::o;13652:205::-;13753:96;13773:5;13803:27;;;13832:4;13838:2;13842:5;13780:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13753:19;:96::i;:::-;13652:205;;;;:::o;13467:177::-;13550:86;13570:5;13600:23;;;13625:2;13629:5;13577:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13550:19;:86::i;:::-;13467:177;;;:::o;32585:1181::-;32623:18;32644:44;32669:10;:17;;;32644:10;:19;;;:23;;:44;;;;:::i;:::-;32623:65;;32722:1;32703:10;:15;;;:20;;:56;;;;;32746:13;32727:15;:32;;32703:56;32699:1060;;;32777:12;32792:5;:21;;;32777:36;;32833:10;:14;;;;;;;;;;;;32828:756;;;32893:44;32920:10;:15;;;32893:5;:21;;;:25;;:44;;;;:::i;:::-;32869:5;:21;;:68;;;;32986:10;:17;;;32961:5;:21;;;:42;32956:220;;33053:10;:17;;;33029:5;:21;;:41;;;;33113:1;33093:10;:17;;:21;;;;33155:1;33137:10;:15;;:19;;;;32956:220;32828:756;;;33264:10;:15;;;33240:5;:21;;;:39;:90;;33329:1;33240:90;;;33282:44;33309:10;:15;;;33282:5;:21;;;:25;;:44;;;;:::i;:::-;33240:90;33216:5;:21;;:114;;;;33379:10;:17;;;33354:5;:21;;;:42;33349:220;;33446:10;:17;;;33422:5;:21;;:41;;;;33506:1;33486:10;:17;;:21;;;;33548:1;33530:10;:15;;:19;;;;33349:220;32828:756;33620:15;33598:10;:19;;:37;;;;33655:92;33682:7;33691:5;:21;;;33714:10;:15;;;33731:10;:14;;;;;;;;;;;;33655:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32699:1060;;32585:1181;:::o;6416:189::-;6502:7;6534:1;6530;:5;6537:12;6522:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6561:9;6577:1;6573;:5;;;;;;6561:17;;6596:1;6589:8;;;6416:189;;;;;:::o;5475:192::-;5561:7;5594:1;5589;:6;;5597:12;5581:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5621:9;5637:1;5633;:5;5621:17;;5658:1;5651:8;;;5475:192;;;;;:::o;16029:347::-;16135:7;16156:9;16167;16180:13;16188:1;16191;16180:7;:13::i;:::-;16155:38;;;;16204:10;16230:1;16217:15;;;;;16227:1;16224;16217:15;16204:28;;16252:1;16247:2;:6;16243:18;;;16260:1;16255:6;;;;16243:18;16277:2;16272:7;;;;16302:1;16298;:5;16290:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16352:16;16360:1;16363;16366;16352:7;:16::i;:::-;16345:23;;;;;16029:347;;;;;:::o;14870:420::-;14953:23;14979:69;15007:4;14979:69;;;;;;;;;;;;;;;;;14987:5;14979:27;;;;:69;;;;;:::i;:::-;14953:95;;15083:1;15063:10;:17;:21;15059:224;;;15205:10;15194:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15186:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15059:224;14870:420;;;:::o;15321:210::-;15382:9;15393;15415:10;15449:2;15428:25;;;;;15438:1;15435;15428:25;15415:38;;15472:1;15468;:5;15464:9;;15493:1;15488:2;:6;15484:10;;15514:1;15509:2;:6;15505:18;;;15522:1;15517:6;;;;15505:18;15321:210;;;;;;:::o;15539:482::-;15645:7;15665:12;15685:1;15684:2;;15680:1;:6;15665:21;;15702:4;15697:9;;;;;;;;;15722:4;15717:9;;;;;;;;;15764:1;15757:4;15749;15748:5;;15747:14;;;;;;:18;15742:1;:24;15737:29;;;;15777:9;15789:1;15777:13;;15814:1;15810;:5;15806:1;:9;15801:14;;;;15839:1;15835;:5;15831:1;:9;15826:14;;;;15864:1;15860;:5;15856:1;:9;15851:14;;;;15889:1;15885;:5;15881:1;:9;15876:14;;;;15914:1;15910;:5;15906:1;:9;15901:14;;;;15939:1;15935;:5;15931:1;:9;15926:14;;;;15964:1;15960;:5;15956:1;:9;15951:14;;;;15989:1;15985;:5;15981:1;:9;15976:14;;;;16012:1;16008;:5;16001:12;;;;15539:482;;;;;:::o;8117:232::-;8256:12;8288:53;8311:6;8319:4;8325:1;8328:12;8288:22;:53::i;:::-;8281:60;;8117:232;;;;;:::o;9175:1025::-;9351:12;9384:18;9395:6;9384:10;:18::i;:::-;9376:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9510:12;9524:23;9551:6;:11;;9571:8;9582:4;9551:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9509:78;;;;9602:7;9598:595;;;9633:10;9626:17;;;;;;9598:595;9767:1;9747:10;:17;:21;9743:439;;;10010:10;10004:17;10071:15;10058:10;10054:2;10050:19;10043:44;9958:148;10153:12;10146:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9175:1025;;;;;;;:::o;7290:233::-;7350:4;7369:12;7480:7;7468:20;7460:28;;7514:1;7507:4;:8;7500:15;;;7290:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o

Swarm Source

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