Contract 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253

 

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1d902cd2e77eb3791831972c318aa7784994716c2ccfcfb91fb4b9e6c02efd8bRedeem265336552022-09-25 7:54:384 days 22 hrs ago0x0ab71c08687ad6248b76d3f7e799fc6f339f6625 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.00001127
0xb67060edb4709ba53eefda8504c2a74c9ee4bedec821b74beb9b795fdc3bc8bcRedeem265314932022-09-25 7:41:484 days 22 hrs ago0x1c65b333dfb1acc18c96fc5469040b222dbe548a IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.00001126
0x53ba481c371d69e3b5ed460fe735cd9b6db4ec20de0c679d1406514889aa22d2Redeem262253672022-09-23 16:18:216 days 14 hrs ago0xc80606a31ea077c244aeff4946ba1bfb6dc160ba IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.00002071
0x74e9f489d479b73689fc6f20368653de359741ac8a3903d916e41a6e94c3f897Redeem261528162022-09-23 9:58:466 days 20 hrs ago0xb3384ebd56b9e7265d8ab94f17563f2cc71154b3 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.00000913
0xca426e631943b8b230b4474c3408654bd4258bd154cbf0596a7abd661cbb691cRedeem215988772022-08-27 22:32:3433 days 7 hrs ago0x312cc4444979141d77c861487c5e9648dacc9c8d IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000046717034 ETH
0x0b4b25356a4f35a78891bbfa2bd4328ad12fb025fd0e0fe62fb0268f44205875Redeem197748032022-08-09 5:44:0952 days 41 mins ago0x2b7c6e9612c3935c039d13222f852103305d6657 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000092975543 ETH
0x75d2c82f7b49d4f4d2827ec5d5a89d84ff6af24e91921e039ae58f3853877518Redeem179578212022-07-18 22:28:5673 days 7 hrs ago0xce56164cde045e27b6d0e960ff317aa404563f39 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000153568287 ETH
0x7ef57d1783f039ee337cb4e155fdd0231fd8e7e308e2e040fbf0e31dc302a3c2Redeem176895162022-07-15 12:58:0776 days 17 hrs ago0xa8c4e3ce1743d0f2a6c227548c982a7c40569940 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000118244942 ETH
0x1962975a5f143a082556534c32e893514e90804b1e4d708775b33ea40fc9681bRedeem174641912022-07-12 7:06:4679 days 23 hrs ago0xa104976c1abd0e68ce78deacbf3eb961585255df IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000112435298 ETH
0x6eaa8888ce935b12d0860b43b156997caf71567fc480e7b1f5a8770c2fa3459dRedeem174530182022-07-12 1:45:4980 days 4 hrs ago0x031720474d79e0d42894dfa663cbead0b8611211 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000140914899 ETH
0xe8900b43777cea8c4ad48e66359fcdef89f072771952b1cb758b157e52f7fb56Redeem174518582022-07-12 1:07:5380 days 5 hrs ago0x305a41f9582b704224240908d5880393c7c1cfc7 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000127687518 ETH
0x6824ff12f96573c6d4dbe1833d77748f3eab44a24cba7464d30b937d0bbd54c8Redeem173287672022-07-09 17:51:2182 days 12 hrs ago0xa104976c1abd0e68ce78deacbf3eb961585255df IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000088385189 ETH
0xe6ee178f48f01144f8943763fec54322e9f329deadcbdedc1737d433d3b94c4cRedeem173266382022-07-09 16:56:0082 days 13 hrs ago0xbb7a86d410ac2f4af22c29ca035ad24bb928179e IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000082068048 ETH
0x0b47823415206e3a69892844a9caaa64620301a09642f4e792774b077e24ef3aRedeem172350322022-07-08 6:56:5283 days 23 hrs ago0x031720474d79e0d42894dfa663cbead0b8611211 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000203811776 ETH
0x89a3ffd8568163157383cd5be81358c0beff43cc7460b5d3461becbf219dc398Redeem172349832022-07-08 6:56:2983 days 23 hrs ago0x305a41f9582b704224240908d5880393c7c1cfc7 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000204416644 ETH
0x4364e8bb6dc855be37f7751376efa04c28c96ad3c71aee78cba9b37a14fbae70Redeem172349232022-07-08 6:53:0083 days 23 hrs ago0xca5fcf84fa33f9c190cea4985d848f5b22b36105 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000203284689 ETH
0xc66551b109a4d1c8e89bb5d7b84485a4c5d6d9e846853d0894fd6258eec13527Redeem171575912022-07-07 1:02:0485 days 5 hrs ago0x10e61eafba7e35b554d2cfe3fbdd2ec23796f0a3 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000169892248 ETH
0x403af1deb435526c62d39330d4bd55faa878867166433dbbbe89496a019f7072Redeem171574302022-07-07 0:59:3185 days 5 hrs ago0x361ed02811bfdb084860d47ec2e89eaaa20ba1d2 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000168695448 ETH
0xb826dade2526bbf38a61062108217c6ffed2861122264e836f953b76cd57042fRedeem171574222022-07-07 0:57:2985 days 5 hrs ago0xca5fcf84fa33f9c190cea4985d848f5b22b36105 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000169539517 ETH
0xff73428be8dc49f631f2c9073a2c17f74b10c6e9130b89bbee97a144f85446bcRedeem171574072022-07-07 0:57:2985 days 5 hrs ago0x031720474d79e0d42894dfa663cbead0b8611211 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000153330909 ETH
0xde12362fc6578794f4b41f139d379537d122df2aa9f30004ea43c5f47cb82e8cRedeem171573862022-07-07 0:57:2985 days 5 hrs ago0x305a41f9582b704224240908d5880393c7c1cfc7 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.00017014658 ETH
0x4f67511ca4ed1e776fae651a775f09868484ada479b06d1b7bcf10bbc1e75753Redeem170968662022-07-06 4:23:1186 days 2 hrs ago0xa104976c1abd0e68ce78deacbf3eb961585255df IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000134081687 ETH
0xcc4d7f9962703578585bdd901725ee40caeb7524fd1c8dc8f038aa13a5cbfbbfRedeem170968572022-07-06 4:23:1186 days 2 hrs ago0xbb7a86d410ac2f4af22c29ca035ad24bb928179e IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000147943922 ETH
0x7ed51e2c091b3c8398c27d4c3a3a1b5396e12c640cb95d7bf4072df24e9b55b5Redeem170868202022-07-06 0:36:4986 days 5 hrs ago0x031720474d79e0d42894dfa663cbead0b8611211 IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000127765978 ETH
0xed3ed25415436e4770a439f7266984269ad1ae43e77dc141577ded94e24add4aDeposit170318862022-07-05 6:37:1586 days 23 hrs ago0xa104976c1abd0e68ce78deacbf3eb961585255df IN 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae2530 ETH0.000189450105 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1d902cd2e77eb3791831972c318aa7784994716c2ccfcfb91fb4b9e6c02efd8b265336552022-09-25 7:54:384 days 22 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xb67060edb4709ba53eefda8504c2a74c9ee4bedec821b74beb9b795fdc3bc8bc265314932022-09-25 7:41:484 days 22 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x53ba481c371d69e3b5ed460fe735cd9b6db4ec20de0c679d1406514889aa22d2262253672022-09-23 16:18:216 days 14 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x74e9f489d479b73689fc6f20368653de359741ac8a3903d916e41a6e94c3f897261528162022-09-23 9:58:466 days 20 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xca426e631943b8b230b4474c3408654bd4258bd154cbf0596a7abd661cbb691c215988772022-08-27 22:32:3433 days 7 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x0b4b25356a4f35a78891bbfa2bd4328ad12fb025fd0e0fe62fb0268f44205875197748032022-08-09 5:44:0952 days 41 mins ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x75d2c82f7b49d4f4d2827ec5d5a89d84ff6af24e91921e039ae58f3853877518179578212022-07-18 22:28:5673 days 7 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x7ef57d1783f039ee337cb4e155fdd0231fd8e7e308e2e040fbf0e31dc302a3c2176895162022-07-15 12:58:0776 days 17 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x1962975a5f143a082556534c32e893514e90804b1e4d708775b33ea40fc9681b174641912022-07-12 7:06:4679 days 23 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x6eaa8888ce935b12d0860b43b156997caf71567fc480e7b1f5a8770c2fa3459d174530182022-07-12 1:45:4980 days 4 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xe8900b43777cea8c4ad48e66359fcdef89f072771952b1cb758b157e52f7fb56174518582022-07-12 1:07:5380 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x6824ff12f96573c6d4dbe1833d77748f3eab44a24cba7464d30b937d0bbd54c8173287672022-07-09 17:51:2182 days 12 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xe6ee178f48f01144f8943763fec54322e9f329deadcbdedc1737d433d3b94c4c173266382022-07-09 16:56:0082 days 13 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x0b47823415206e3a69892844a9caaa64620301a09642f4e792774b077e24ef3a172350322022-07-08 6:56:5283 days 23 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x89a3ffd8568163157383cd5be81358c0beff43cc7460b5d3461becbf219dc398172349832022-07-08 6:56:2983 days 23 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x4364e8bb6dc855be37f7751376efa04c28c96ad3c71aee78cba9b37a14fbae70172349232022-07-08 6:53:0083 days 23 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xc66551b109a4d1c8e89bb5d7b84485a4c5d6d9e846853d0894fd6258eec13527171575912022-07-07 1:02:0485 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x403af1deb435526c62d39330d4bd55faa878867166433dbbbe89496a019f7072171574302022-07-07 0:59:3185 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xb826dade2526bbf38a61062108217c6ffed2861122264e836f953b76cd57042f171574222022-07-07 0:57:2985 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xff73428be8dc49f631f2c9073a2c17f74b10c6e9130b89bbee97a144f85446bc171574072022-07-07 0:57:2985 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xde12362fc6578794f4b41f139d379537d122df2aa9f30004ea43c5f47cb82e8c171573862022-07-07 0:57:2985 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x4f67511ca4ed1e776fae651a775f09868484ada479b06d1b7bcf10bbc1e75753170968662022-07-06 4:23:1186 days 2 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xcc4d7f9962703578585bdd901725ee40caeb7524fd1c8dc8f038aa13a5cbfbbf170968572022-07-06 4:23:1186 days 2 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0x7ed51e2c091b3c8398c27d4c3a3a1b5396e12c640cb95d7bf4072df24e9b55b5170868202022-07-06 0:36:4986 days 5 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
0xed3ed25415436e4770a439f7266984269ad1ae43e77dc141577ded94e24add4a170318862022-07-05 6:37:1586 days 23 hrs ago 0x4357ce2c5ef9f0d88ae3e560232decf4be3ae253Treasure DAO: Magic Token0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CustomBond

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan on 2022-03-11
*/

// File: contracts/types/Ownable.sol


pragma solidity ^0.7.5;

contract Ownable {

    address public policy;

    constructor () {
        policy = msg.sender;
    }

    modifier onlyPolicy() {
        require( policy == msg.sender, "Ownable: caller is not the owner" );
        _;
    }
    
    function transferManagment(address _newOwner) external onlyPolicy() {
        require( _newOwner != address(0) );
        policy = _newOwner;
    }
}
// File: contracts/interfaces/ITreasury.sol


pragma solidity ^0.7.5;

interface ITreasury {
    function sendPayoutTokens(uint _amountPayoutToken) external;
    function valueOfToken( address _principalTokenAddress, uint _amount ) external view returns ( uint value_ );
    function payoutToken() external view returns (address);
}
// File: contracts/libraries/FullMath.sol


pragma solidity 0.7.5;

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);
    }
}
// File: contracts/libraries/FixedPoint.sol


pragma solidity ^0.7.5;



library Babylonian {

    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;

        uint256 xx = x;
        uint256 r = 1;
        if (xx >= 0x100000000000000000000000000000000) {
            xx >>= 128;
            r <<= 64;
        }
        if (xx >= 0x10000000000000000) {
            xx >>= 64;
            r <<= 32;
        }
        if (xx >= 0x100000000) {
            xx >>= 32;
            r <<= 16;
        }
        if (xx >= 0x10000) {
            xx >>= 16;
            r <<= 8;
        }
        if (xx >= 0x100) {
            xx >>= 8;
            r <<= 4;
        }
        if (xx >= 0x10) {
            xx >>= 4;
            r <<= 2;
        }
        if (xx >= 0x8) {
            r <<= 1;
        }
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1;
        r = (r + x / r) >> 1; // Seven iterations should be enough
        uint256 r1 = x / r;
        return (r < r1 ? r : r1);
    }
}

library BitMath {

    function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {
        require(x > 0, 'BitMath::mostSignificantBit: zero');

        if (x >= 0x100000000000000000000000000000000) {
            x >>= 128;
            r += 128;
        }
        if (x >= 0x10000000000000000) {
            x >>= 64;
            r += 64;
        }
        if (x >= 0x100000000) {
            x >>= 32;
            r += 32;
        }
        if (x >= 0x10000) {
            x >>= 16;
            r += 16;
        }
        if (x >= 0x100) {
            x >>= 8;
            r += 8;
        }
        if (x >= 0x10) {
            x >>= 4;
            r += 4;
        }
        if (x >= 0x4) {
            x >>= 2;
            r += 2;
        }
        if (x >= 0x2) r += 1;
    }
}


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));
        }
    }
    
    // square root of a UQ112x112
    // lossy between 0/1 and 40 bits
    function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) {
        if (self._x <= uint144(-1)) {
            return uq112x112(uint224(Babylonian.sqrt(uint256(self._x) << 112)));
        }

        uint8 safeShiftBits = 255 - BitMath.mostSignificantBit(self._x);
        safeShiftBits -= safeShiftBits % 2;
        return uq112x112(uint224(Babylonian.sqrt(uint256(self._x) << safeShiftBits) << ((112 - safeShiftBits) / 2)));
    }
}
// File: contracts/interfaces/IERC20.sol



pragma solidity ^0.7.5;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);

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

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


pragma solidity 0.7.5;


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);

    }
}
// File: contracts/libraries/SafeMath.sol


pragma solidity 0.7.5;


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 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;
        }
    }
}
// File: contracts/libraries/SafeERC20.sol


pragma solidity 0.7.5;




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");
        }
    }
} 
// File: contracts/ProCustomBond.sol


pragma solidity 0.7.5;







contract CustomBond is Ownable {
    using FixedPoint for *;
    using SafeERC20 for IERC20;
    using SafeMath for uint;
    
    /* ======== EVENTS ======== */

    event BondCreated( uint deposit, uint payout, uint expires );
    event BondRedeemed( address recipient, uint payout, uint remaining );
    event BondPriceChanged( uint internalPrice, uint debtRatio );
    event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition );
    
    
     /* ======== STATE VARIABLES ======== */
    
    IERC20 immutable private payoutToken; // token paid for principal
    IERC20 immutable private principalToken; // inflow token
    ITreasury immutable private customTreasury; // pays for and receives principal
    address immutable private olympusDAO;
    address immutable private subsidyRouter; // pays subsidy in OHM to custom treasury
    address private olympusTreasury; // receives fee

    uint public totalPrincipalBonded;
    uint public totalPayoutGiven;
    uint public totalDebt; // total value of outstanding bonds; used for pricing
    uint public lastDecay; // reference timestamp for debt decay
    uint private payoutSinceLastSubsidy; // principal accrued since subsidy paid
    
    Terms public terms; // stores terms for new bonds
    Adjust public adjustment; // stores adjustment to BCV data
    FeeTiers[] private feeTiers; // stores fee tiers

    bool immutable private feeInPayout;

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

    struct FeeTiers {
        uint tierCeilings; // principal bonded till next tier
        uint fees; // in ten-thousandths (i.e. 33300 = 3.33%)
    }

    // Info for creating new bonds
    struct Terms {
        uint controlVariable; // scaling variable for price
        uint vestingTerm; // in seconds
        uint minimumPrice; // vs principal value
        uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5%
        uint maxDebt; // payout token decimal debt ratio, max % total supply created as debt
    }

    // Info for bond holder
    struct Bond {
        uint payout; // payout token remaining to be paid
        uint vesting; // seconds left to vest
        uint lastBlockTimestamp; // Last interaction
        uint truePricePaid; // Price paid (principal tokens per payout token) in ten-millionths - 4000000 = 0.4
    }

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

    constructor(
        address _customTreasury, 
        address _principalToken, 
        address _olympusTreasury,
        address _subsidyRouter, 
        address _initialOwner, 
        address _olympusDAO,
        uint[] memory _tierCeilings, 
        uint[] memory _fees,
        bool _feeInPayout
    ) {
        require( _customTreasury != address(0) );
        customTreasury = ITreasury( _customTreasury );
        payoutToken = IERC20( ITreasury(_customTreasury).payoutToken() );
        require( _principalToken != address(0) );
        principalToken = IERC20( _principalToken );
        require( _olympusTreasury != address(0) );
        olympusTreasury = _olympusTreasury;
        require( _subsidyRouter != address(0) );
        subsidyRouter = _subsidyRouter;
        require( _initialOwner != address(0) );
        policy = _initialOwner;
        require( _olympusDAO != address(0) );
        olympusDAO = _olympusDAO;
        require(_tierCeilings.length == _fees.length, "tier length and fee length not the same");

        for(uint i; i < _tierCeilings.length; i++) {
            feeTiers.push( FeeTiers({
                tierCeilings: _tierCeilings[i],
                fees: _fees[i]
            }));
        }

        feeInPayout = _feeInPayout;
    }

    /* ======== INITIALIZATION ======== */
    
    /**
     *  @notice initializes bond parameters
     *  @param _controlVariable uint
     *  @param _vestingTerm uint
     *  @param _minimumPrice uint
     *  @param _maxPayout uint
     *  @param _maxDebt uint
     *  @param _initialDebt uint
     */
    function initializeBond( 
        uint _controlVariable, 
        uint _vestingTerm,
        uint _minimumPrice,
        uint _maxPayout,
        uint _maxDebt,
        uint _initialDebt
    ) external onlyPolicy() {
        require( currentDebt() == 0, "Debt must be 0 for initialization" );
        terms = Terms ({
            controlVariable: _controlVariable,
            vestingTerm: _vestingTerm,
            minimumPrice: _minimumPrice,
            maxPayout: _maxPayout,
            maxDebt: _maxDebt
        });
        totalDebt = _initialDebt;
        lastDecay = block.timestamp;
    }
    
    
    /* ======== POLICY FUNCTIONS ======== */

    enum PARAMETER { VESTING, PAYOUT, DEBT }
    /**
     *  @notice set parameters for new bonds
     *  @param _parameter PARAMETER
     *  @param _input uint
     */
    function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() {
        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 <= 1000, "Payout cannot be above 1 percent" );
            terms.maxPayout = _input;
        } else if ( _parameter == PARAMETER.DEBT ) { // 2
            terms.maxDebt = _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 onlyPolicy() {
        require( _increment <= terms.controlVariable.mul( 30 ).div( 1000 ), "Increment too large" );

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

    /**
     *  @notice change address of Olympus Treasury
     *  @param _olympusTreasury address
     */
    function changeOlympusTreasury(address _olympusTreasury) external {
        require( msg.sender == olympusDAO, "Only Olympus DAO" );
        olympusTreasury = _olympusTreasury;
    }

    /**
     *  @notice subsidy controller checks payouts since last subsidy and resets counter
     *  @return payoutSinceLastSubsidy_ uint
     */
    function paySubsidy() external returns ( uint payoutSinceLastSubsidy_ ) {
        require( msg.sender == subsidyRouter, "Only subsidy controller" );

        payoutSinceLastSubsidy_ = payoutSinceLastSubsidy;
        payoutSinceLastSubsidy = 0;
    }
    
    /* ======== 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 returns (uint) {
        require( _depositor != address(0), "Invalid address" );

        decayDebt();
        
        uint nativePrice = trueBondPrice();

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

        uint value = customTreasury.valueOfToken( address(principalToken), _amount );

        uint payout;
        uint fee;

        if(feeInPayout) {
            (payout, fee) = payoutFor( value ); // payout and fee is computed
        } else {
            (payout, fee) = payoutFor( _amount ); // payout and fee is computed
            _amount = _amount.sub(fee);
        }

        require( payout >= 10 ** payoutToken.decimals() / 100, "Bond too small" ); // must be > 0.01 payout token ( underflow protection )
        require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage
        
        // total debt is increased
        totalDebt = totalDebt.add( value );

        require( totalDebt <= terms.maxDebt, "Max capacity reached" );
                
        // depositor info is stored
        bondInfo[ _depositor ] = Bond({ 
            payout: bondInfo[ _depositor ].payout.add( payout ),
            vesting: terms.vestingTerm,
            lastBlockTimestamp: block.timestamp,
            truePricePaid: trueBondPrice()
        });

        totalPrincipalBonded = totalPrincipalBonded.add(_amount); // total bonded increased
        totalPayoutGiven = totalPayoutGiven.add(payout); // total payout increased
        payoutSinceLastSubsidy = payoutSinceLastSubsidy.add( payout ); // subsidy counter increased

        if(feeInPayout) {
            customTreasury.sendPayoutTokens( payout.add(fee) );
            if(fee != 0) { // if fee, send to Olympus treasury
                payoutToken.safeTransfer(olympusTreasury, fee);
            }
        } else {
            customTreasury.sendPayoutTokens( payout );
            if(fee != 0) { // if fee, send to Olympus treasury
                principalToken.safeTransferFrom( msg.sender, olympusTreasury, fee );
            }
        }

        principalToken.safeTransferFrom( msg.sender, address(customTreasury), _amount ); // transfer principal bonded to custom treasury

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

        adjust(); // control variable is adjusted
        return payout; 
    }
    
    /** 
     *  @notice redeem bond for user
     *  @param _depositor address
     *  @return uint
     */ 
    function redeem(address _depositor) external returns (uint) {
        Bond memory info = bondInfo[ _depositor ];
        uint percentVested = percentVestedFor( _depositor ); // (seconds since last interaction / vesting term remaining)

        if ( percentVested >= 10000 ) { // if fully vested
            delete bondInfo[ _depositor ]; // delete user info
            emit BondRedeemed( _depositor, info.payout, 0 ); // emit bond data
            payoutToken.safeTransfer( _depositor, info.payout );
            return info.payout;

        } else { // if unfinished
            // calculate payout vested
            uint payout = info.payout.mul( percentVested ).div( 10000 );

            // store updated deposit info
            bondInfo[ _depositor ] = Bond({
                payout: info.payout.sub( payout ),
                vesting: info.vesting.sub( block.timestamp.sub( info.lastBlockTimestamp ) ),
                lastBlockTimestamp: block.timestamp,
                truePricePaid: info.truePricePaid
            });

            emit BondRedeemed( _depositor, payout, bondInfo[ _depositor ].payout );
            payoutToken.safeTransfer( _depositor, payout );
            return payout;
        }
        
    }
    
    /* ======== INTERNAL HELPER FUNCTIONS ======== */

    /**
     *  @notice makes incremental adjustment to control variable
     */
    function adjust() internal {
        uint timestampCanAdjust = adjustment.lastBlockTimestamp.add( adjustment.buffer );
        if( adjustment.rate != 0 && block.timestamp >= timestampCanAdjust ) {
            uint initial = terms.controlVariable;
            if ( adjustment.add ) {
                terms.controlVariable = terms.controlVariable.add( adjustment.rate );
                if ( terms.controlVariable >= adjustment.target ) {
                    adjustment.rate = 0;
                }
            } else {
                terms.controlVariable = terms.controlVariable.sub( adjustment.rate );
                if ( terms.controlVariable <= adjustment.target ) {
                    adjustment.rate = 0;
                }
            }
            adjustment.lastBlockTimestamp = 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;
    }

    /**
     *  @notice calculate current bond price and remove floor if above
     *  @return price_ uint
     */
    function _bondPrice() internal returns ( uint price_ ) {
        price_ = terms.controlVariable.mul( debtRatio() ).div( 10 ** (uint256(payoutToken.decimals()).sub(5)) );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;        
        } else if ( terms.minimumPrice != 0 ) {
            terms.minimumPrice = 0;
        }
    }


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

    /**
     *  @notice calculate current bond premium
     *  @return price_ uint
     */
    function bondPrice() public view returns ( uint price_ ) {        
        price_ = terms.controlVariable.mul( debtRatio() ).div( 10 ** (uint256(payoutToken.decimals()).sub(5)) );
        if ( price_ < terms.minimumPrice ) {
            price_ = terms.minimumPrice;
        }
    }

    /**
     *  @notice calculate true bond price a user pays
     *  @return price_ uint
     */
    function trueBondPrice() public view returns ( uint price_ ) {
        price_ = bondPrice().add(bondPrice().mul( currentOlympusFee() ).div( 1e6 ) );
    }

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

    /**
     *  @notice calculate user's interest due for new bond, accounting for Olympus Fee. 
     If fee is in payout then takes in the already calculated value. If fee is in principal token 
     than takes in the amount of principal being deposited and then calculates the fee based on
     the amount of principal and not in terms of the payout token
     *  @param _value uint
     *  @return _payout uint
     *  @return _fee uint
     */
    function payoutFor( uint _value ) public view returns ( uint _payout, uint _fee) {
        if(feeInPayout) {
            uint total = FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e11 );
            _fee = total.mul( currentOlympusFee() ).div( 1e6 );
            _payout = total.sub(_fee);
        } else {
            _fee = _value.mul( currentOlympusFee() ).div( 1e6 );
            _payout = FixedPoint.fraction( customTreasury.valueOfToken(address(principalToken), _value.sub(_fee)), bondPrice() ).decode112with18().div( 1e11 );
        }
    }

    /**
     *  @notice calculate current ratio of debt to payout token supply
     *  @notice protocols using Olympus Pro should be careful when quickly adding large %s to total supply
     *  @return debtRatio_ uint
     */
    function debtRatio() public view returns ( uint debtRatio_ ) {   
        debtRatio_ = FixedPoint.fraction( 
            currentDebt().mul( 10 ** payoutToken.decimals() ), 
            payoutToken.totalSupply()
        ).decode112with18().div( 1e18 );
    }

    /**
     *  @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_ ) {
        uint timestampSinceLast = block.timestamp.sub( lastDecay );
        decay_ = totalDebt.mul( timestampSinceLast ).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 timestampSinceLast = block.timestamp.sub( bond.lastBlockTimestamp );
        uint vesting = bond.vesting;

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

    /**
     *  @notice calculate amount of payout token 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 );
        }
    }

    /**
     *  @notice current fee Olympus takes of each bond
     *  @return currentFee_ uint
     */
    function currentOlympusFee() public view returns( uint currentFee_ ) {
        uint tierLength = feeTiers.length;
        for(uint i; i < tierLength; i++) {
            if(totalPrincipalBonded < feeTiers[i].tierCeilings || i == tierLength - 1 ) {
                return feeTiers[i].fees;
            }
        }
    }
    
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_customTreasury","type":"address"},{"internalType":"address","name":"_principalToken","type":"address"},{"internalType":"address","name":"_olympusTreasury","type":"address"},{"internalType":"address","name":"_subsidyRouter","type":"address"},{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_olympusDAO","type":"address"},{"internalType":"uint256[]","name":"_tierCeilings","type":"uint256[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"},{"internalType":"bool","name":"_feeInPayout","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"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":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"},{"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":"lastBlockTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlockTimestamp","type":"uint256"},{"internalType":"uint256","name":"truePricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_olympusTreasury","type":"address"}],"name":"changeOlympusTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentOlympusFee","outputs":[{"internalType":"uint256","name":"currentFee_","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":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBond","outputs":[],"stateMutability":"nonpayable","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":"paySubsidy","outputs":[{"internalType":"uint256","name":"payoutSinceLastSubsidy_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"_payout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"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":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"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 CustomBond.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayoutGiven","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrincipalBonded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferManagment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trueBondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"}]

6101406040523480156200001257600080fd5b5060405162003de338038062003de383398181016040526101208110156200003957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200009657600080fd5b83820191506020820185811115620000ad57600080fd5b8251866020820283011164010000000082111715620000cb57600080fd5b8083526020830192505050908051906020019060200280838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905001604052602001805160405193929190846401000000008211156200012e57600080fd5b838201915060208201858111156200014557600080fd5b82518660208202830111640100000000821117156200016357600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200019c5780820151818401526020810190506200017f565b5050505090500160405260200180519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200023157600080fd5b8873ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff16634efa82b66040518163ffffffff1660e01b815260040160206040518083038186803b158015620002af57600080fd5b505afa158015620002c4573d6000803e3d6000fd5b505050506040513d6020811015620002db57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156200035d57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003cf57600080fd5b86600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200044b57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620004be57600080fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200053957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508151835114620005cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062003dbc6027913960400191505060405180910390fd5b60005b8351811015620006655760116040518060400160405280868481518110620005f357fe5b602002602001015181526020018584815181106200060d57fe5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080600101915050620005cf565b5080151561012081151560f81b8152505050505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c61368c620007306000398061105e5280611470528061184a5250806120fc525080610d965250806111445280611381528061187052806119885280611a9052508061118052806113bd5280611a435280611ab25250806114d5528061193c5280611d1b5280611f13528061221452806122d152806123bd52806124cc5280612c4d525061368c6000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c50565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c56565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d94565b005b610374610e99565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610eca565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f50565b6040518082815260200191505060405180910390f35b610426611036565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611059565b604051808381526020018281526020019250505060405180910390f35b61048d611266565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061126c565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611bb8565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611f63565b005b6105cf6120f8565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121cb565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a6121fb565b6040518082815260200191505060405180910390f35b61067861238d565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26123b1565b6040518082815260200191505060405180910390f35b6106d06124b8565b6040518082815260200191505060405180910390f35b6106ee61258c565b6040518082815260200191505060405180910390f35b61070c6125e8565b6040518082815260200191505060405180910390f35b61072a6125ee565b6040518082815260200191505060405180910390f35b60008061074c83610f50565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846125f490919063ffffffff16565b61267a90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610eca565b61081a6123b1565b6125f490919063ffffffff16565b61267a90919063ffffffff16565b61083e6123b1565b6126c490919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546125f490919063ffffffff16565b61267a90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200142815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7b576201fa40811015610b6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136096024913960400191505060405180910390fd5b80600760010181905550610c4c565b60016002811115610b8857fe5b826002811115610b9457fe5b1415610c21576103e8811115610c12576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4b565b600280811115610c2d57fe5b826002811115610c3957fe5b1415610c4a57806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d17576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5157600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e55576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f4a5760118181548110610eed57fe5b9060005260206000209060020201600001546002541080610f1057506001820381145b15610f3d5760118181548110610f2257fe5b90600052602060002090600202016001015492505050610f4d565b8080600101915050610ed8565b50505b90565b6000610f5a613524565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe782604001514261274c90919063ffffffff16565b905060008260200151905060008111156110295761102281611014612710856125f490919063ffffffff16565b61267a90919063ffffffff16565b935061102e565b600093505b505050919050565b600061105461104361258c565b60045461274c90919063ffffffff16565b905090565b6000807f0000000000000000000000000000000000000000000000000000000000000000156111025760006110b464174876e8006110a66110a18761109c6123b1565b612796565b612a77565b61267a90919063ffffffff16565b90506110e5620f42406110d76110c8610eca565b846125f490919063ffffffff16565b61267a90919063ffffffff16565b91506110fa828261274c90919063ffffffff16565b925050611261565b611131620f4240611123611114610eca565b866125f490919063ffffffff16565b61267a90919063ffffffff16565b905061125e64174876e80061125061124b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f00000000000000000000000000000000000000000000000000000000000000006111b2888b61274c90919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561120357600080fd5b505afa158015611217573d6000803e3d6000fd5b505050506040513d602081101561122d57600080fd5b81019080805190602001909291905050506112466123b1565b612796565b612a77565b61267a90919063ffffffff16565b91505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611318612ab3565b60006113226107fb565b90508084101561137d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135e66023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561142e57600080fd5b505afa158015611442573d6000803e3d6000fd5b505050506040513d602081101561145857600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114aa5761149d83611059565b80925081935050506114d1565b6114b388611059565b80925081935050506114ce818961274c90919063ffffffff16565b97505b60647f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561153957600080fd5b505afa15801561154d573d6000803e3d6000fd5b505050506040513d602081101561156357600080fd5b810190808051906020019092919050505060ff16600a0a8161158157fe5b048210156115f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b6115ff6124b8565b821115611674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b611689836004546126c490919063ffffffff16565b600481905550600760040154600454111561170c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061176c84601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546126c490919063ffffffff16565b8152602001600760010154815260200142815260200161178a6107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505061180c886002546126c490919063ffffffff16565b600281905550611827826003546126c490919063ffffffff16565b600381905550611842826006546126c490919063ffffffff16565b6006819055507f000000000000000000000000000000000000000000000000000000000000000015611986577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b04f9186118bd83856126c490919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156118f357600080fd5b505af1158015611907573d6000803e3d6000fd5b505050506000811461198157611980600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ade9092919063ffffffff16565b5b611a8a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630b04f918836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156119f957600080fd5b505af1158015611a0d573d6000803e3d6000fd5b5050505060008114611a8957611a8833600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612b80909392919063ffffffff16565b5b5b611af7337f00000000000000000000000000000000000000000000000000000000000000008a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612b80909392919063ffffffff16565b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611b32600760010154426126c490919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611b7e612c41565b611b866121fb565b604051808381526020018281526020019250505060405180910390a1611baa612d66565b819450505050509392505050565b6000611bc2613524565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611c4184610f50565b90506127108110611d6d57601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611d5f8483600001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ade9092919063ffffffff16565b816000015192505050611f5e565b6000611d9a612710611d8c8486600001516125f490919063ffffffff16565b61267a90919063ffffffff16565b90506040518060800160405280611dbe83866000015161274c90919063ffffffff16565b8152602001611df0611ddd86604001514261274c90919063ffffffff16565b866020015161274c90919063ffffffff16565b81526020014281526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f5785827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ade9092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612024576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600061202e611036565b14612084576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135a46021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555042600581905550505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000612388670de0b6b3a764000061237a6123756122cf7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561227857600080fd5b505afa15801561228c573d6000803e3d6000fd5b505050506040513d60208110156122a257600080fd5b810190808051906020019092919050505060ff16600a0a6122c1611036565b6125f490919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561233557600080fd5b505afa158015612349573d6000803e3d6000fd5b505050506040513d602081101561235f57600080fd5b8101908080519060200190929190505050612796565b612a77565b61267a90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b600061249d61246d60057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561242157600080fd5b505afa158015612435573d6000803e3d6000fd5b505050506040513d602081101561244b57600080fd5b810190808051906020019092919050505060ff1661274c90919063ffffffff16565b600a0a61248f61247b6121fb565b6007600001546125f490919063ffffffff16565b61267a90919063ffffffff16565b90506007600201548110156124b55760076002015490505b90565b6000612587620186a06125796007600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253057600080fd5b505afa158015612544573d6000803e3d6000fd5b505050506040513d602081101561255a57600080fd5b81019080805190602001909291905050506125f490919063ffffffff16565b61267a90919063ffffffff16565b905090565b6000806125a46005544261274c90919063ffffffff16565b90506125d26007600101546125c4836004546125f490919063ffffffff16565b61267a90919063ffffffff16565b91506004548211156125e45760045491505b5090565b60055481565b60045481565b6000808314156126075760009050612674565b600082840290508284828161261857fe5b041461266f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135c56021913960400191505060405180910390fd5b809150505b92915050565b60006126bc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ecc565b905092915050565b600080828401905083811015612742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061278e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f92565b905092915050565b61279e61354c565b600082116127f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061357e6026913960400191505060405180910390fd5b600083141561283557604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612a71565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161296e57600082607060ff1685901b8161288257fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612939576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612a71565b600061298a846e01000000000000000000000000000085613052565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612aab57fe5b049050919050565b612acf612abe61258c565b60045461274c90919063ffffffff16565b60048190555042600581905550565b612b7b8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613114565b505050565b612c3b846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613114565b50505050565b6000612d2d612cfd60057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612cb157600080fd5b505afa158015612cc5573d6000803e3d6000fd5b505050506040513d6020811015612cdb57600080fd5b810190808051906020019092919050505060ff1661274c90919063ffffffff16565b600a0a612d1f612d0b6121fb565b6007600001546125f490919063ffffffff16565b61267a90919063ffffffff16565b9050600760020154811015612d49576007600201549050612d63565b600060076002015414612d625760006007600201819055505b5b90565b6000612d85600c60030154600c600401546126c490919063ffffffff16565b90506000600c6001015414158015612d9d5750804210155b15612ec95760006007600001549050600c60000160009054906101000a900460ff1615612e0c57612de1600c600101546007600001546126c490919063ffffffff16565b600760000181905550600c6002015460076000015410612e07576000600c600101819055505b612e50565b612e29600c6001015460076000015461274c90919063ffffffff16565b600760000181905550600c6002015460076000015411612e4f576000600c600101819055505b5b42600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290612f78576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f3d578082015181840152602081019050612f22565b50505050905090810190601f168015612f6a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612f8457fe5b049050809150509392505050565b600083831115829061303f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613004578082015181840152602081019050612fe9565b50505050905090810190601f1680156130315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006130618686613203565b915091506000848061306f57fe5b868809905082811115613083576001820391505b80830392508482106130fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613108838387613256565b93505050509392505050565b6060613176826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132f39092919063ffffffff16565b90506000815111156131fe5780806020019051602081101561319757600080fd5b81019080805190602001909291905050506131fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061362d602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061323057fe5b8486099050838502925082810391508281101561324e576001820391505b509250929050565b600080826000038316905080838161326a57fe5b04925080858161327657fe5b049450600181826000038161328757fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613302848460008561330b565b90509392505050565b606061331685613511565b613388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106133d857805182526020820191506020810190506020830392506133b5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461343a576040519150601f19603f3d011682016040523d82523d6000602084013e61343f565b606091505b50915091508115613454578092505050613509565b6000815111156134675780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134ce5780820151818401526020810190506134b3565b50505050905090810190601f1680156134fb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212209161474fd558abbbd666521a0eed9849d23ff33f7dc9db3b0d61315c30650de164736f6c6343000705003374696572206c656e67746820616e6420666565206c656e677468206e6f74207468652073616d6500000000000000000000000078ab1f527d8a9758c6bba1adf812b5cfeaa7ab71000000000000000000000000b7e50106a5bd3cf21af210a755f9c8740890a8c900000000000000000000000016e12f54c527ccfbc5325586d735b5b3caf41088000000000000000000000000db340b10f4a6ce2b1187a8c8f1f220054709f962000000000000000000000000482729215aaf99b3199e41125865821ed5a4978a00000000000000000000000016e12f54c527ccfbc5325586d735b5b3caf410880000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214

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

00000000000000000000000078aB1f527d8a9758c6BbA1adf812B5CfEaa7ab71000000000000000000000000b7e50106a5bd3cf21af210a755f9c8740890a8c900000000000000000000000016E12F54C527CcfbC5325586d735B5B3cAF41088000000000000000000000000DB340B10f4A6ce2B1187A8C8F1F220054709f962000000000000000000000000482729215AAF99B3199E41125865821ed5A4978a00000000000000000000000016E12F54C527CcfbC5325586d735B5B3cAF410880000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214

-----Decoded View---------------
Arg [0] : _customTreasury (address): 0x78ab1f527d8a9758c6bba1adf812b5cfeaa7ab71
Arg [1] : _principalToken (address): 0xb7e50106a5bd3cf21af210a755f9c8740890a8c9
Arg [2] : _olympusTreasury (address): 0x16e12f54c527ccfbc5325586d735b5b3caf41088
Arg [3] : _subsidyRouter (address): 0xdb340b10f4a6ce2b1187a8c8f1f220054709f962
Arg [4] : _initialOwner (address): 0x482729215aaf99b3199e41125865821ed5a4978a
Arg [5] : _olympusDAO (address): 0x16e12f54c527ccfbc5325586d735b5b3caf41088
Arg [6] : _tierCeilings (uint256[]): 0
Arg [7] : _fees (uint256[]): 33300
Arg [8] : _feeInPayout (bool): True

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000078aB1f527d8a9758c6BbA1adf812B5CfEaa7ab71
Arg [1] : 000000000000000000000000b7e50106a5bd3cf21af210a755f9c8740890a8c9
Arg [2] : 00000000000000000000000016E12F54C527CcfbC5325586d735B5B3cAF41088
Arg [3] : 000000000000000000000000DB340B10f4A6ce2B1187A8C8F1F220054709f962
Arg [4] : 000000000000000000000000482729215AAF99B3199E41125865821ed5A4978a
Arg [5] : 00000000000000000000000016E12F54C527CcfbC5325586d735B5B3cAF41088
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000008214


Deployed ByteCode Sourcemap

18082:18089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35322:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;95:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;32003:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24218:478;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23471:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19074:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;318:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;24815:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19400:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35838:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34696:445;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34032:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32855:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;19035:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25642:2646;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28415:1254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22614:616;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25161:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19563:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33671:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19345:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31607:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32252:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34240:295;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19191:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35322:400;35394:19;35427:18;35448:30;35466:10;35448:16;:30::i;:::-;35427:51;;35489:11;35503:8;:22;35513:10;35503:22;;;;;;;;;;;;;;;:29;;;35489:43;;35567:5;35550:13;:22;35545:170;;35607:6;35590:23;;35545:170;;;35663:40;35696:5;35663:27;35675:13;35663:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;35646:57;;35545:170;35322:400;;;;;:::o;95:21::-;;;;;;;;;;;;:::o;32003:156::-;32050:11;32084:67;32100:49;32144:3;32100:38;32117:19;:17;:19::i;:::-;32100:11;:9;:11::i;:::-;:15;;:38;;;;:::i;:::-;:42;;:49;;;;:::i;:::-;32084:11;:9;:11::i;:::-;:15;;:67;;;;:::i;:::-;32075:76;;32003:156;:::o;24218:478::-;238:10;228:20;;:6;;;;;;;;;;:20;;;219:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24405:43:::1;24442:4;24405:31;24432:2;24405:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;24391:10;:57;;24382:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24499:189;;;;;;;;24526:9;24499:189;;;;;;24556:10;24499:189;;;;24589:7;24499:189;;;;24619:7;24499:189;;;;24661:15;24499:189;;::::0;24486:10:::1;:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24218:478:::0;;;;:::o;23471:551::-;238:10;228:20;;:6;;;;;;;;;;:20;;;219:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23583:17:::1;23569:31;;;;;;;;:10;:31;;;;;;;;;23564:451;;;23642:6;23632;:16;;23623:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23725:6;23705:5;:17;;:26;;;;23564:451;;;23768:16;23754:30;;;;;;;;:10;:30;;;;;;;;;23749:266;;;23826:4;23816:6;:14;;23807:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;23901:6;23883:5;:15;;:24;;;;23749:266;;;23944:14;23930:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;23925:90;;;23997:6;23981:5;:13;;:22;;;;23925:90;23749:266;23564:451;23471:551:::0;;:::o;19074:28::-;;;;:::o;318:150::-;238:10;228:20;;:6;;;;;;;;;;:20;;;219:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;427:1:::1;406:23;;:9;:23;;;;397:34;;;::::0;::::1;;451:9;442:6;::::0;:18:::1;;;;;;;;;;;;;;;;;;318:150:::0;:::o;24815:185::-;24915:10;24901:24;;:10;:24;;;24892:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24976:16;24958:15;;:34;;;;;;;;;;;;;;;;;;24815:185;:::o;19400:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35838:324::-;35888:16;35918:15;35936:8;:15;;;;35918:33;;35966:6;35962:193;35978:10;35974:1;:14;35962:193;;;36036:8;36045:1;36036:11;;;;;;;;;;;;;;;;;;:24;;;36013:20;;:47;:70;;;;36082:1;36069:10;:14;36064:1;:19;36013:70;36010:134;;;36112:8;36121:1;36112:11;;;;;;;;;;;;;;;;;;:16;;;36105:23;;;;;;36010:134;35990:3;;;;;;;35962:193;;;;35838:324;;;:::o;34696:445::-;34766:19;34799:16;;:::i;:::-;34818:8;:22;34828:10;34818:22;;;;;;;;;;;;;;;34799:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34851:23;34877:46;34898:4;:23;;;34877:15;:19;;:46;;;;:::i;:::-;34851:72;;34934:12;34949:4;:12;;;34934:27;;34989:1;34979:7;:11;34974:160;;;35025:46;35062:7;35025:31;35049:5;35025:18;:22;;:31;;;;:::i;:::-;:35;;:46;;;;:::i;:::-;35008:63;;34974:160;;;35121:1;35104:18;;34974:160;34696:445;;;;;;:::o;34032:106::-;34077:4;34102:28;34117:11;:9;:11::i;:::-;34102:9;;:13;;:28;;;;:::i;:::-;34095:35;;34032:106;:::o;32855:577::-;32911:12;32925:9;32950:11;32947:478;;;32978:10;32991:72;33057:4;32991:60;:42;33012:6;33020:11;:9;:11::i;:::-;32991:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;32978:85;;33085:43;33123:3;33085:32;33096:19;:17;:19::i;:::-;33085:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;33078:50;;33153:15;33163:4;33153:5;:9;;:15;;;;:::i;:::-;33143:25;;32947:478;;;;33208:44;33247:3;33208:33;33220:19;:17;:19::i;:::-;33208:6;:10;;:33;;;;:::i;:::-;:37;;:44;;;;:::i;:::-;33201:51;;33277:136;33407:4;33277:124;:106;33298:14;:27;;;33334:14;33351:16;33362:4;33351:6;:10;;:16;;;;:::i;:::-;33298:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33370:11;:9;:11::i;:::-;33277:19;:106::i;:::-;:122;:124::i;:::-;:128;;:136;;;;:::i;:::-;33267:146;;32947:478;32855:577;;;:::o;19035:32::-;;;;:::o;25642:2646::-;25727:4;25775:1;25753:24;;:10;:24;;;;25744:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25811:11;:9;:11::i;:::-;25843:16;25862:15;:13;:15::i;:::-;25843:34;;25912:11;25899:9;:24;;25890:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26000:10;26013:14;:27;;;26050:14;26067:7;26013:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26000:76;;26089:11;26111:8;26135:11;26132:247;;;26179:18;26190:5;26179:9;:18::i;:::-;26163:34;;;;;;;;26132:247;;;26276:20;26287:7;26276:9;:20::i;:::-;26260:36;;;;;;;;26351:16;26363:3;26351:7;:11;;:16;;;;:::i;:::-;26341:26;;26132:247;26441:3;26416:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26410:28;;:2;:28;:34;;;;;;26400:6;:44;;26391:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26550:11;:9;:11::i;:::-;26540:6;:21;;26531:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26697:22;26712:5;26697:9;;:13;;:22;;;;:::i;:::-;26685:9;:34;;;;26754:5;:13;;;26741:9;;:26;;26732:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26884:220;;;;;;;;26913:43;26948:6;26913:8;:22;26923:10;26913:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;26884:220;;;;26980:5;:17;;;26884:220;;;;27032:15;26884:220;;;;27077:15;:13;:15::i;:::-;26884:220;;;26859:8;:22;26869:10;26859:22;;;;;;;;;;;;;;;:245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27140:33;27165:7;27140:20;;:24;;:33;;;;:::i;:::-;27117:20;:56;;;;27229:28;27250:6;27229:16;;:20;;:28;;;;:::i;:::-;27210:16;:47;;;;27319:36;27347:6;27319:22;;:26;;:36;;;;:::i;:::-;27294:22;:61;;;;27400:11;27397:476;;;27428:14;:31;;;27461:15;27472:3;27461:6;:10;;:15;;;;:::i;:::-;27428:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27503:1;27496:3;:8;27493:130;;27561:46;27586:15;;;;;;;;;;;27603:3;27561:11;:24;;;;:46;;;;;:::i;:::-;27493:130;27397:476;;;27655:14;:31;;;27688:6;27655:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27721:1;27714:3;:8;27711:151;;27779:67;27812:10;27824:15;;;;;;;;;;;27841:3;27779:14;:31;;;;:67;;;;;;:::i;:::-;27711:151;27397:476;27885:79;27918:10;27938:14;27955:7;27885:14;:31;;;;:79;;;;;;:::i;:::-;28069:72;28082:7;28091:6;28099:40;28120:5;:17;;;28099:15;:19;;:40;;;;:::i;:::-;28069:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28157:45;28175:12;:10;:12::i;:::-;28189:11;:9;:11::i;:::-;28157:45;;;;;;;;;;;;;;;;;;;;;;;;28215:8;:6;:8::i;:::-;28273:6;28266:13;;;;;;25642:2646;;;;;:::o;28415:1254::-;28469:4;28486:16;;:::i;:::-;28505:8;:22;28515:10;28505:22;;;;;;;;;;;;;;;28486:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28538:18;28559:30;28577:10;28559:16;:30::i;:::-;28538:51;;28685:5;28668:13;:22;28663:989;;28734:8;:22;28744:10;28734:22;;;;;;;;;;;;;;;;28727:29;;;;;;;;;;;;;;;;;;;;;;;;;;28796:42;28810:10;28822:4;:11;;;28835:1;28796:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28871:51;28897:10;28909:4;:11;;;28871;:24;;;;:51;;;;;:::i;:::-;28944:4;:11;;;28937:18;;;;;;28663:989;29047:11;29061:45;29099:5;29061:32;29078:13;29061:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;29047:59;;29191:273;;;;;;;;29223:25;29240:6;29223:4;:11;;;:15;;:25;;;;:::i;:::-;29191:273;;;;29276:66;29294:46;29315:4;:23;;;29294:15;:19;;:46;;;;:::i;:::-;29276:4;:12;;;:16;;:66;;;;:::i;:::-;29191:273;;;;29381:15;29191:273;;;;29430:4;:18;;;29191:273;;;29166:8;:22;29176:10;29166:22;;;;;;;;;;;;;;;:298;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29486:65;29500:10;29512:6;29520:8;:22;29530:10;29520:22;;;;;;;;;;;;;;;:29;;;29486:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29566:46;29592:10;29604:6;29566:11;:24;;;;:46;;;;;:::i;:::-;29634:6;29627:13;;;;;28415:1254;;;;:::o;22614:616::-;238:10;228:20;;:6;;;;;;;;;;:20;;;219:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22873:1:::1;22856:13;:11;:13::i;:::-;:18;22847:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22932:217;;;;;;;;22971:16;22932:217;;;;23015:12;22932:217;;;;23056:13;22932:217;;;;23095:10;22932:217;;;;23129:8;22932:217;;::::0;22924:5:::1;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23172:12;23160:9;:24;;;;23207:15;23195:9;:27;;;;22614:616:::0;;;;;;:::o;25161:254::-;25202:28;25267:13;25253:27;;:10;:27;;;25244:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25348:22;;25322:48;;25406:1;25381:22;:26;;;;25161:254;:::o;19563:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33671:262::-;33714:15;33759:166;33919:4;33759:154;:136;33794:49;33819:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33813:28;;:2;:28;33794:13;:11;:13::i;:::-;:17;;:49;;;;:::i;:::-;33859:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33759:19;:136::i;:::-;:152;:154::i;:::-;:158;;:166;;;;:::i;:::-;33746:179;;33671:262;:::o;19345:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31607:286::-;31650:11;31692:94;31745:38;31781:1;31753:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31745:31;;:35;;:38;;;;:::i;:::-;31738:2;:46;31692:40;31719:11;:9;:11::i;:::-;31692:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;31683:103;;31811:5;:18;;;31802:6;:27;31797:89;;;31856:5;:18;;;31847:27;;31797:89;31607:286;:::o;32252:138::-;32295:4;32320:62;32374:6;32320:48;32351:5;:15;;;32320:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;:52;;:62;;;;:::i;:::-;32313:69;;32252:138;:::o;34240:295::-;34283:11;34308:23;34334:32;34355:9;;34334:15;:19;;:32;;;;:::i;:::-;34308:58;;34386:60;34427:5;:17;;;34386:35;34401:18;34386:9;;:13;;:35;;;;:::i;:::-;:39;;:60;;;;:::i;:::-;34377:69;;34471:9;;34462:6;:18;34457:71;;;34507:9;;34498:18;;34457:71;34240:295;;:::o;19191:21::-;;;;:::o;19109:::-;;;;:::o;14770:250::-;14828:7;14857:1;14852;:6;14848:47;;;14882:1;14875:8;;;;14848:47;14907:9;14923:1;14919;:5;14907:17;;14952:1;14947;14943;:5;;;;;;:10;14935:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15011:1;15004:8;;;14770:250;;;;;:::o;15028:132::-;15086:7;15113:39;15117:1;15120;15113:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;15106:46;;15028:132;;;;:::o;14237:181::-;14295:7;14315:9;14331:1;14327;:5;14315:17;;14356:1;14351;:6;;14343:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14409:1;14402:8;;;14237:181;;;;:::o;14426:136::-;14484:7;14511:43;14515:1;14518;14511:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;14504:50;;14426:136;;;;:::o;4755:719::-;4836:16;;:::i;:::-;4887:1;4873:11;:15;4865:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4959:1;4946:9;:14;4942:50;;;4969:23;;;;;;;;4990:1;4969:23;;;;;4962:30;;;;4942:50;5030:2;5009:24;;:9;:24;5005:462;;5050:14;5095:11;4181:3;5068:23;;:9;:23;;5067:39;;;;;;5050:56;;5147:2;5129:21;;:6;:21;;5121:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5207:26;;;;;;;;5225:6;5207:26;;;;;5200:33;;;;;5005:462;5266:14;5283:45;5299:9;4223:31;5316:11;5283:15;:45::i;:::-;5266:62;;5369:2;5351:21;;:6;:21;;5343:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5429:26;;;;;;;;5447:6;5429:26;;;;;5422:33;;;4755:719;;;;;:::o;4610:137::-;4681:4;4723:16;4712:4;:7;;;4707:13;;:32;;;;;;4700:39;;4610:137;;;:::o;30832:127::-;30885:28;30900:11;:9;:11::i;:::-;30885:9;;:13;;:28;;;;:::i;:::-;30873:9;:40;;;;30936:15;30924:9;:27;;;;30832:127::o;16187:177::-;16270:86;16290:5;16320:23;;;16345:2;16349:5;16297:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16270:19;:86::i;:::-;16187:177;;;:::o;16372:205::-;16473:96;16493:5;16523:27;;;16552:4;16558:2;16562:5;16500:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16473:19;:96::i;:::-;16372:205;;;;:::o;31086:370::-;31127:11;31161:94;31214:38;31250:1;31222:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31214:31;;:35;;:38;;;;:::i;:::-;31207:2;:46;31161:40;31188:11;:9;:11::i;:::-;31161:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;31152:103;;31280:5;:18;;;31271:6;:27;31266:183;;;31325:5;:18;;;31316:27;;31266:183;;;31396:1;31374:5;:18;;;:23;31369:80;;31436:1;31415:5;:18;;:22;;;;31369:80;31266:183;31086:370;:::o;29822:949::-;29860:23;29886:54;29921:10;:17;;;29886:10;:29;;;:33;;:54;;;;:::i;:::-;29860:80;;29974:1;29955:10;:15;;;:20;;:61;;;;;29998:18;29979:15;:37;;29955:61;29951:813;;;30034:12;30049:5;:21;;;30034:36;;30090:10;:14;;;;;;;;;;;;30085:494;;;30150:44;30177:10;:15;;;30150:5;:21;;;:25;;:44;;;;:::i;:::-;30126:5;:21;;:68;;;;30243:10;:17;;;30218:5;:21;;;:42;30213:112;;30304:1;30286:10;:15;;:19;;;;30213:112;30085:494;;;30389:44;30416:10;:15;;;30389:5;:21;;;:25;;:44;;;;:::i;:::-;30365:5;:21;;:68;;;;30482:10;:17;;;30457:5;:21;;;:42;30452:112;;30543:1;30525:10;:15;;:19;;;;30452:112;30085:494;30625:15;30593:10;:29;;:47;;;;30660:92;30687:7;30696:5;:21;;;30719:10;:15;;;30736:10;:14;;;;;;;;;;;;30660:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29951:813;;29822:949;:::o;15168:189::-;15254:7;15286:1;15282;:5;15289:12;15274:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15313:9;15329:1;15325;:5;;;;;;15313:17;;15348:1;15341:8;;;15168:189;;;;;:::o;14570:192::-;14656:7;14689:1;14684;:6;;14692:12;14676:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14716:9;14732:1;14728;:5;14716:17;;14753:1;14746:8;;;14570:192;;;;;:::o;1621:347::-;1727:7;1748:9;1759;1772:13;1780:1;1783;1772:7;:13::i;:::-;1747:38;;;;1796:10;1822:1;1809:15;;;;;1819:1;1816;1809:15;1796:28;;1844:1;1839:2;:6;1835:18;;;1852:1;1847:6;;;;1835:18;1869:2;1864:7;;;;1894:1;1890;:5;1882:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1944:16;1952:1;1955;1958;1944:7;:16::i;:::-;1937:23;;;;;1621:347;;;;;:::o;17576:420::-;17659:23;17685:69;17713:4;17685:69;;;;;;;;;;;;;;;;;17693:5;17685:27;;;;:69;;;;;:::i;:::-;17659:95;;17789:1;17769:10;:17;:21;17765:224;;;17911:10;17900:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17892:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17765:224;17576:420;;;:::o;913:210::-;974:9;985;1007:10;1041:2;1020:25;;;;;1030:1;1027;1020:25;1007:38;;1064:1;1060;:5;1056:9;;1085:1;1080:2;:6;1076:10;;1106:1;1101:2;:6;1097:18;;;1114:1;1109:6;;;;1097:18;913:210;;;;;;:::o;1131:482::-;1237:7;1257:12;1277:1;1276:2;;1272:1;:6;1257:21;;1294:4;1289:9;;;;;;;;;1314:4;1309:9;;;;;;;;;1356:1;1349:4;1341;1340:5;;1339:14;;;;;;:18;1334:1;:24;1329:29;;;;1369:9;1381:1;1369:13;;1406:1;1402;:5;1398:1;:9;1393:14;;;;1431:1;1427;:5;1423:1;:9;1418:14;;;;1456:1;1452;:5;1448:1;:9;1443:14;;;;1481:1;1477;:5;1473:1;:9;1468:14;;;;1506:1;1502;:5;1498:1;:9;1493:14;;;;1531:1;1527;:5;1523:1;:9;1518:14;;;;1556:1;1552;:5;1548:1;:9;1543:14;;;;1581:1;1577;:5;1573:1;:9;1568:14;;;;1604:1;1600;:5;1593:12;;;;1131:482;;;;;:::o;9865:196::-;9968:12;10000:53;10023:6;10031:4;10037:1;10040:12;10000:22;:53::i;:::-;9993:60;;9865:196;;;;;:::o;10841:979::-;10971:12;11004:18;11015:6;11004:10;:18::i;:::-;10996:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11130:12;11144:23;11171:6;:11;;11191:8;11202:4;11171:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11129:78;;;;11222:7;11218:595;;;11253:10;11246:17;;;;;;11218:595;11387:1;11367:10;:17;:21;11363:439;;;11630:10;11624:17;11691:15;11678:10;11674:2;11670:19;11663:44;11578:148;11773:12;11766:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10841:979;;;;;;;:::o;9038:233::-;9098:4;9117:12;9228:7;9216:20;9208:28;;9262:1;9255:4;:8;9248:15;;;9038:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o

Metadata Hash

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