Source Code
Latest 25 from a total of 209 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem | 14495608 | 1455 days ago | IN | 0 ETH | 0.00272601 | ||||
| Redeem | 14211743 | 1499 days ago | IN | 0 ETH | 0.00434175 | ||||
| Redeem | 14145216 | 1510 days ago | IN | 0 ETH | 0.00475759 | ||||
| Redeem | 14134458 | 1511 days ago | IN | 0 ETH | 0.00817526 | ||||
| Redeem | 14131830 | 1512 days ago | IN | 0 ETH | 0.00465893 | ||||
| Redeem | 14123910 | 1513 days ago | IN | 0 ETH | 0.00689314 | ||||
| Redeem | 14120263 | 1514 days ago | IN | 0 ETH | 0.00386942 | ||||
| Redeem | 14096156 | 1517 days ago | IN | 0 ETH | 0.00736635 | ||||
| Redeem | 14093274 | 1518 days ago | IN | 0 ETH | 0.00504331 | ||||
| Redeem | 14088988 | 1518 days ago | IN | 0 ETH | 0.01823751 | ||||
| Redeem | 14076676 | 1520 days ago | IN | 0 ETH | 0.02446585 | ||||
| Redeem | 14076635 | 1520 days ago | IN | 0 ETH | 0.01218088 | ||||
| Deposit | 14075969 | 1520 days ago | IN | 0 ETH | 0.0501635 | ||||
| Deposit | 14068165 | 1522 days ago | IN | 0 ETH | 0.02079778 | ||||
| Redeem | 14068144 | 1522 days ago | IN | 0 ETH | 0.00551439 | ||||
| Redeem | 14062785 | 1522 days ago | IN | 0 ETH | 0.00794086 | ||||
| Deposit | 14059907 | 1523 days ago | IN | 0 ETH | 0.02361932 | ||||
| Deposit | 14059879 | 1523 days ago | IN | 0 ETH | 0.0323958 | ||||
| Redeem | 14055424 | 1524 days ago | IN | 0 ETH | 0.00570338 | ||||
| Redeem | 14049284 | 1525 days ago | IN | 0 ETH | 0.00579429 | ||||
| Deposit | 14048686 | 1525 days ago | IN | 0 ETH | 0.02581076 | ||||
| Redeem | 14045972 | 1525 days ago | IN | 0 ETH | 0.00959674 | ||||
| Deposit | 14044532 | 1525 days ago | IN | 0 ETH | 0.05344791 | ||||
| Deposit | 14037981 | 1526 days ago | IN | 0 ETH | 0.02901972 | ||||
| Redeem | 14035303 | 1527 days ago | IN | 0 ETH | 0.00620188 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CustomBlackPoolBond
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-11-25
*/
// File contracts/libraries/SafeMath.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
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/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/interfaces/IERC20.sol
pragma solidity 0.7.5;
interface IERC20 {
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// 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/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/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/BlackPoolCustom/CustomBlackPoolBond.sol
pragma solidity 0.7.5;
interface ITreasury {
function deposit(address _principleTokenAddress, uint _amountPrincipleToken, uint _amountPayoutToken) external;
function valueOfToken( address _principalTokenAddress, uint _amount ) external view returns ( uint value_ );
function payoutToken() external view returns (address);
}
contract CustomBlackPoolBond 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 payoutToken; // token paid for principal
IERC20 immutable principalToken; // inflow token
ITreasury immutable customTreasury; // pays for and receives principal
address immutable olympusDAO;
address olympusTreasury; // receives fee
address immutable subsidyRouter; // pays subsidy in OHM to custom treasury
uint public totalPrincipalBonded;
uint public totalPayoutGiven;
uint public totalDebt; // total value of outstanding bonds; used for pricing
uint public lastDecay; // reference block for debt decay
uint 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 blocks
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; // Blocks left to vest
uint lastBlock; // 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 blocks) between adjustments
uint lastBlock; // block 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.number;
}
/* ======== 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 >= 10000, "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,
lastBlock: block.number
});
}
/**
* @notice change address of Olympus Treasury
* @param _olympusTreasury uint
*/
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 to bonder is computed
} else {
(payout, fee) = payoutFor( _amount ); // payout to bonder 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,
lastBlock: block.number,
truePricePaid: trueBondPrice()
});
totalPrincipalBonded = totalPrincipalBonded.add(_amount); // total bonded increased
totalPayoutGiven = totalPayoutGiven.add(payout); // total payout increased
payoutSinceLastSubsidy = payoutSinceLastSubsidy.add( payout ); // subsidy counter increased
principalToken.approve( address(customTreasury), _amount );
if(feeInPayout) {
principalToken.safeTransferFrom( msg.sender, address(this), _amount );
customTreasury.deposit( address(principalToken), _amount, payout.add(fee) );
} else {
principalToken.safeTransferFrom( msg.sender, address(this), _amount.add(fee) );
customTreasury.deposit( address(principalToken), _amount, payout );
}
if ( fee != 0 ) { // fee is transferred to dao
if(feeInPayout) {
payoutToken.safeTransfer(olympusTreasury, fee);
} else {
principalToken.safeTransfer( olympusTreasury, fee );
}
}
// indexed events are emitted
emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ) );
emit BondPriceChanged( _bondPrice(), debtRatio() );
adjust(); // control variable is adjusted
return payout;
}
/**
* @notice redeem bond for user
* @return uint
*/
function redeem(address _depositor) external returns (uint) {
Bond memory info = bondInfo[ _depositor ];
uint percentVested = percentVestedFor( _depositor ); // (blocks 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.number.sub( info.lastBlock ) ),
lastBlock: block.number,
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 blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer );
if( adjustment.rate != 0 && block.number >= blockCanAdjust ) {
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.lastBlock = block.number;
emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add );
}
}
/**
* @notice reduce total debt
*/
function decayDebt() internal {
totalDebt = totalDebt.sub( debtDecay() );
lastDecay = block.number;
}
/**
* @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
* @param _value uint
* @return _payout uint
* @return _fee uint
*/
function payoutFor( uint _value ) public view returns ( uint _payout, uint _fee) {
if(!feeInPayout) {
_fee = _value.mul( currentOlympusFee() ).div( 1e6 );
_payout = FixedPoint.fraction( customTreasury.valueOfToken(address(principalToken), _value.sub(_fee)), bondPrice() ).decode112with18().div( 1e11 );
} else {
uint total = FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e11 );
_payout = total.sub(total.mul( currentOlympusFee() ).div( 1e6 ));
_fee = total.mul( currentOlympusFee() ).div( 1e6 );
}
}
/**
* @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 blocksSinceLast = block.number.sub( lastDecay );
decay_ = totalDebt.mul( blocksSinceLast ).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 blocksSinceLast = block.number.sub( bond.lastBlock );
uint vesting = bond.vesting;
if ( vesting > 0 ) {
percentVested_ = blocksSinceLast.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 Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"lastBlock","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":"lastBlock","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 CustomBlackPoolBond.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"}]Contract Creation Code
6101406040523480156200001257600080fd5b50604051620040013803806200400183398181016040526101208110156200003957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200009657600080fd5b83820191506020820185811115620000ad57600080fd5b8251866020820283011164010000000082111715620000cb57600080fd5b8083526020830192505050908051906020019060200280838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905001604052602001805160405193929190846401000000008211156200012e57600080fd5b838201915060208201858111156200014557600080fd5b82518660208202830111640100000000821117156200016357600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200019c5780820151818401526020810190506200017f565b5050505090500160405260200180519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200023157600080fd5b8873ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff16634efa82b66040518163ffffffff1660e01b815260040160206040518083038186803b158015620002af57600080fd5b505afa158015620002c4573d6000803e3d6000fd5b505050506040513d6020811015620002db57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156200035d57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003cf57600080fd5b86600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200044b57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620004be57600080fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200053957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508151835114620005cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062003fda6027913960400191505060405180910390fd5b60005b8351811015620006655760116040518060400160405280868481518110620005f357fe5b602002602001015181526020018584815181106200060d57fe5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080600101915050620005cf565b5080151561012081151560f81b8152505050505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c613891620007496000398061105d528061149c52806119635280611bf7525080612301525080610d955250806110c252806113ad52806118b252806119d65280611b1d5250806110fe52806113e95280611876528061198f5280611a125280611ad65280611b595280611cb65250806115015280611c445280611f205280612118528061241952806124d652806125c252806126d15280612e5252506138916000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b1e88e1e1ec56cef5040a48f95371dd67ec4bed4c258500cfb6e8a9c19869e1f64736f6c6343000705003374696572206c656e67746820616e6420666565206c656e677468206e6f74207468652073616d65000000000000000000000000508273118b010ec185c7bcb4893498ef201eed43000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a00000000000000000000000007dff52fb8b38e55e6ecb407913cd847396af4f0000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f000000000000000000000000508273118b010ec185c7bcb4893498ef201eed4373ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f000000000000000000000000508273118b010ec185c7bcb4893498ef201eed4373ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000508273118b010ec185c7bcb4893498ef201eed438a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000508273118b010ec185c7bcb4893498ef201eed4373ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000508273118b010ec185c7bcb4893498ef201eed4373ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f0000000000000000000000000ec9f76202a7061eb9b3a7d6b59d36215a7e37da73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220b1e88e1e1ec56cef5040a48f95371dd67ec4bed4c258500cfb6e8a9c19869e1f64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000508273118b010ec185c7bcb4893498ef201eed43000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a00000000000000000000000007dff52fb8b38e55e6ecb407913cd847396af4f0000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214
-----Decoded View---------------
Arg [0] : _customTreasury (address): 0x508273118b010ec185C7BCB4893498ef201EEd43
Arg [1] : _principalToken (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _olympusTreasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _subsidyRouter (address): 0x97Fac4EA361338EaB5c89792eE196DA8712C9a4a
Arg [4] : _initialOwner (address): 0x07DFF52fb8B38E55E6eCb407913cd847396Af4f0
Arg [5] : _olympusDAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [6] : _tierCeilings (uint256[]): 0
Arg [7] : _fees (uint256[]): 33300
Arg [8] : _feeInPayout (bool): False
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000508273118b010ec185c7bcb4893498ef201eed43
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a
Arg [4] : 00000000000000000000000007dff52fb8b38e55e6ecb407913cd847396af4f0
Arg [5] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000008214
Deployed Bytecode Sourcemap
16015:17767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32933:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15222:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29865:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22071:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21325:550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16968:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15445:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22653:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17282:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33449:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32325:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31670:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30451:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;16929:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23480:2765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26337:1229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20471:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22999:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17445:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31309:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17227:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29469:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30114:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31878:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17085:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17003;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32933:400;33005:19;33038:18;33059:30;33077:10;33059:16;:30::i;:::-;33038:51;;33100:11;33114:8;:22;33124:10;33114:22;;;;;;;;;;;;;;;:29;;;33100:43;;33178:5;33161:13;:22;33156:170;;33218:6;33201:23;;33156:170;;;33274:40;33307:5;33274:27;33286:13;33274:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;33257:57;;33156:170;32933:400;;;;;:::o;15222:21::-;;;;;;;;;;;;:::o;29865:156::-;29912:11;29946:67;29962:49;30006:3;29962:38;29979:19;:17;:19::i;:::-;29962:11;:9;:11::i;:::-;:15;;:38;;;;:::i;:::-;:42;;:49;;;;:::i;:::-;29946:11;:9;:11::i;:::-;:15;;:67;;;;:::i;:::-;29937:76;;29865:156;:::o;22071:466::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22258:43:::1;22295:4;22258:31;22285:2;22258:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;22244:10;:57;;22235:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;22352:177;;;;;;;;22379:9;22352:177;;;;;;22409:10;22352:177;;;;22442:7;22352:177;;;;22472:7;22352:177;;;;22505:12;22352:177;;::::0;22339:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22071:466:::0;;;;:::o;21325:550::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21437:17:::1;21423:31;;;;;;;;:10;:31;;;;;;;;;21418:450;;;21496:5;21486:6;:15;;21477:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21578:6;21558:5;:17;;:26;;;;21418:450;;;21621:16;21607:30;;;;;;;;:10;:30;;;;;;;;;21602:266;;;21679:4;21669:6;:14;;21660:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;21754:6;21736:5;:15;;:24;;;;21602:266;;;21797:14;21783:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;21778:90;;;21850:6;21834:5;:13;;:22;;;;21778:90;21602:266;21418:450;21325:550:::0;;:::o;16968:28::-;;;;:::o;15445:150::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15554:1:::1;15533:23;;:9;:23;;;;15524:34;;;::::0;::::1;;15578:9;15569:6;::::0;:18:::1;;;;;;;;;;;;;;;;;;15445:150:::0;:::o;22653:185::-;22753:10;22739:24;;:10;:24;;;22730:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22814:16;22796:15;;:34;;;;;;;;;;;;;;;;;;22653:185;:::o;17282:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33449:324::-;33499:16;33529:15;33547:8;:15;;;;33529:33;;33577:6;33573:193;33589:10;33585:1;:14;33573:193;;;33647:8;33656:1;33647:11;;;;;;;;;;;;;;;;;;:24;;;33624:20;;:47;:70;;;;33693:1;33680:10;:14;33675:1;:19;33624:70;33621:134;;;33723:8;33732:1;33723:11;;;;;;;;;;;;;;;;;;:16;;;33716:23;;;;;;33621:134;33601:3;;;;;;;33573:193;;;;33449:324;;;:::o;32325:427::-;32395:19;32428:16;;:::i;:::-;32447:8;:22;32457:10;32447:22;;;;;;;;;;;;;;;32428:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32480:20;32503:34;32521:4;:14;;;32503:12;:16;;:34;;;;:::i;:::-;32480:57;;32548:12;32563:4;:12;;;32548:27;;32603:1;32593:7;:11;32588:157;;;32639:43;32673:7;32639:28;32660:5;32639:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;32622:60;;32588:157;;;32732:1;32715:18;;32588:157;32325:427;;;;;;:::o;31670:106::-;31715:4;31740:28;31755:11;:9;:11::i;:::-;31740:9;;:13;;:28;;;;:::i;:::-;31733:35;;31670:106;:::o;30451:619::-;30507:12;30521:9;30547:11;30543:520;;30582:44;30621:3;30582:33;30594:19;:17;:19::i;:::-;30582:6;:10;;:33;;;;:::i;:::-;:37;;:44;;;;:::i;:::-;30575:51;;30651:136;30781:4;30651:124;:106;30672:14;:27;;;30708:14;30725:16;30736:4;30725:6;:10;;:16;;;;:::i;:::-;30672:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30744:11;:9;:11::i;:::-;30651:19;:106::i;:::-;:122;:124::i;:::-;:128;;:136;;;;:::i;:::-;30641:146;;30543:520;;;30820:10;30833:72;30899:4;30833:60;:42;30854:6;30862:11;:9;:11::i;:::-;30833:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;30820:85;;30930:54;30940:43;30978:3;30940:32;30951:19;:17;:19::i;:::-;30940:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30930:5;:9;;:54;;;;:::i;:::-;30920:64;;31006:43;31044:3;31006:32;31017:19;:17;:19::i;:::-;31006:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30999:50;;30543:520;;30451:619;;;:::o;16929:32::-;;;;:::o;23480:2765::-;23565:4;23613:1;23591:24;;:10;:24;;;;23582:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23649:11;:9;:11::i;:::-;23681:16;23700:15;:13;:15::i;:::-;23681:34;;23750:11;23737:9;:24;;23728:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23838:10;23851:14;:27;;;23888:14;23905:7;23851:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23838:76;;23927:11;23949:8;23973:11;23970:251;;;24017:18;24028:5;24017:9;:18::i;:::-;24001:34;;;;;;;;23970:251;;;24116:20;24127:7;24116:9;:20::i;:::-;24100:36;;;;;;;;24193:16;24205:3;24193:7;:11;;:16;;;;:::i;:::-;24183:26;;23970:251;24283:3;24258:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24252:28;;:2;:28;:34;;;;;;24242:6;:44;;24233:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24392:11;:9;:11::i;:::-;24382:6;:21;;24373:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24539:22;24554:5;24539:9;;:13;;:22;;;;:::i;:::-;24527:9;:34;;;;24596:5;:13;;;24583:9;;:26;;24574:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24726:208;;;;;;;;24755:43;24790:6;24755:8;:22;24765:10;24755:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;24726:208;;;;24822:5;:17;;;24726:208;;;;24865:12;24726:208;;;;24907:15;:13;:15::i;:::-;24726:208;;;24701:8;:22;24711:10;24701:22;;;;;;;;;;;;;;;:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24970:33;24995:7;24970:20;;:24;;:33;;;;:::i;:::-;24947:20;:56;;;;25059:28;25080:6;25059:16;;:20;;:28;;;;:::i;:::-;25040:16;:47;;;;25149:36;25177:6;25149:22;;:26;;:36;;;;:::i;:::-;25124:22;:61;;;;25227:14;:22;;;25259:14;25276:7;25227:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25301:11;25298:394;;;25329:69;25362:10;25382:4;25389:7;25329:14;:31;;;;:69;;;;;;:::i;:::-;25413:14;:22;;;25445:14;25462:7;25471:15;25482:3;25471:6;:10;;:15;;;;:::i;:::-;25413:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25298:394;;;25521:78;25554:10;25574:4;25581:16;25593:3;25581:7;:11;;:16;;;;:::i;:::-;25521:14;:31;;;;:78;;;;;;:::i;:::-;25614:14;:22;;;25646:14;25663:7;25672:6;25614:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25298:394;25724:1;25717:3;:8;25712:261;;25776:11;25773:189;;;25808:46;25833:15;;;;;;;;;;;25850:3;25808:11;:24;;;;:46;;;;;:::i;:::-;25773:189;;;25895:51;25924:15;;;;;;;;;;;25941:3;25895:14;:27;;;;:51;;;;;:::i;:::-;25773:189;25712:261;26029:69;26042:7;26051:6;26059:37;26077:5;:17;;;26059:12;:16;;:37;;;;:::i;:::-;26029:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26114:45;26132:12;:10;:12::i;:::-;26146:11;:9;:11::i;:::-;26114:45;;;;;;;;;;;;;;;;;;;;;;;;26172:8;:6;:8::i;:::-;26230:6;26223:13;;;;;;23480:2765;;;;;:::o;26337:1229::-;26391:4;26408:16;;:::i;:::-;26427:8;:22;26437:10;26427:22;;;;;;;;;;;;;;;26408:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26460:18;26481:30;26499:10;26481:16;:30::i;:::-;26460:51;;26606:5;26589:13;:22;26584:965;;26655:8;:22;26665:10;26655:22;;;;;;;;;;;;;;;;26648:29;;;;;;;;;;;;;;;;;;;;;;;;;;26717:42;26731:10;26743:4;:11;;;26756:1;26717:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26792:51;26818:10;26830:4;:11;;;26792;:24;;;;:51;;;;;:::i;:::-;26865:4;:11;;;26858:18;;;;;;26584:965;26968:11;26982:45;27020:5;26982:32;26999:13;26982:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;26968:59;;27112:249;;;;;;;;27144:25;27161:6;27144:4;:11;;;:15;;:25;;;;:::i;:::-;27112:249;;;;27197:54;27215:34;27233:4;:14;;;27215:12;:16;;:34;;;;:::i;:::-;27197:4;:12;;;:16;;:54;;;;:::i;:::-;27112:249;;;;27281:12;27112:249;;;;27327:4;:18;;;27112:249;;;27087:8;:22;27097:10;27087:22;;;;;;;;;;;;;;;:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27383:65;27397:10;27409:6;27417:8;:22;27427:10;27417:22;;;;;;;;;;;;;;;:29;;;27383:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27463:46;27489:10;27501:6;27463:11;:24;;;;:46;;;;;:::i;:::-;27531:6;27524:13;;;;;26337:1229;;;;:::o;20471:613::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20730:1:::1;20713:13;:11;:13::i;:::-;:18;20704:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20789:217;;;;;;;;20828:16;20789:217;;;;20872:12;20789:217;;;;20913:13;20789:217;;;;20952:10;20789:217;;;;20986:8;20789:217;;::::0;20781:5:::1;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21029:12;21017:9;:24;;;;21064:12;21052:9;:24;;;;20471:613:::0;;;;;;:::o;22999:254::-;23040:28;23105:13;23091:27;;:10;:27;;;23082:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23186:22;;23160:48;;23244:1;23219:22;:26;;;;22999:254;:::o;17445:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31309:262::-;31352:15;31397:166;31557:4;31397:154;:136;31432:49;31457:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31451:28;;:2;:28;31432:13;:11;:13::i;:::-;:17;;:49;;;;:::i;:::-;31497:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31397:19;:136::i;:::-;:152;:154::i;:::-;:158;;:166;;;;:::i;:::-;31384:179;;31309:262;:::o;17227:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29469:286::-;29512:11;29554:94;29607:38;29643:1;29615:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29607:31;;:35;;:38;;;;:::i;:::-;29600:2;:46;29554:40;29581:11;:9;:11::i;:::-;29554:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;29545:103;;29673:5;:18;;;29664:6;:27;29659:89;;;29718:5;:18;;;29709:27;;29659:89;29469:286;:::o;30114:138::-;30157:4;30182:62;30236:6;30182:48;30213:5;:15;;;30182:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;:52;;:62;;;;:::i;:::-;30175:69;;30114:138;:::o;31878:286::-;31921:11;31946:20;31969:29;31987:9;;31969:12;:16;;:29;;;;:::i;:::-;31946:52;;32018:57;32056:5;:17;;;32018:32;32033:15;32018:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;32009:66;;32100:9;;32091:6;:18;32086:71;;;32136:9;;32127:18;;32086:71;31878:286;;:::o;17085:21::-;;;;:::o;17003:::-;;;;:::o;678:250::-;736:7;765:1;760;:6;756:47;;;790:1;783:8;;;;756:47;815:9;831:1;827;:5;815:17;;860:1;855;851;:5;;;;;;:10;843:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;919:1;912:8;;;678:250;;;;;:::o;936:132::-;994:7;1021:39;1025:1;1028;1021:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;1014:46;;936:132;;;;:::o;145:181::-;203:7;223:9;239:1;235;:5;223:17;;264:1;259;:6;;251:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;317:1;310:8;;;145:181;;;;:::o;334:136::-;392:7;419:43;423:1;426;419:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;412:50;;334:136;;;;:::o;13860:719::-;13941:16;;:::i;:::-;13992:1;13978:11;:15;13970:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14064:1;14051:9;:14;14047:50;;;14074:23;;;;;;;;14095:1;14074:23;;;;;14067:30;;;;14047:50;14135:2;14114:24;;:9;:24;14110:462;;14155:14;14200:11;13286:3;14173:23;;:9;:23;;14172:39;;;;;;14155:56;;14252:2;14234:21;;:6;:21;;14226:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14312:26;;;;;;;;14330:6;14312:26;;;;;14305:33;;;;;14110:462;14371:14;14388:45;14404:9;13328:31;14421:11;14388:15;:45::i;:::-;14371:62;;14474:2;14456:21;;:6;:21;;14448:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14534:26;;;;;;;;14552:6;14534:26;;;;;14527:33;;;13860:719;;;;;:::o;13715:137::-;13786:4;13828:16;13817:4;:7;;;13812:13;;:32;;;;;;13805:39;;13715:137;;;:::o;28697:124::-;28750:28;28765:11;:9;:11::i;:::-;28750:9;;:13;;:28;;;;:::i;:::-;28738:9;:40;;;;28801:12;28789:9;:24;;;;28697:124::o;8295:205::-;8396:96;8416:5;8446:27;;;8475:4;8481:2;8485:5;8423:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8396:19;:96::i;:::-;8295:205;;;;:::o;8110:177::-;8193:86;8213:5;8243:23;;;8268:2;8272:5;8220:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8193:19;:86::i;:::-;8110:177;;;:::o;28948:370::-;28989:11;29023:94;29076:38;29112:1;29084:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29076:31;;:35;;:38;;;;:::i;:::-;29069:2;:46;29023:40;29050:11;:9;:11::i;:::-;29023:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;29014:103;;29142:5;:18;;;29133:6;:27;29128:183;;;29187:5;:18;;;29178:27;;29128:183;;;29258:1;29236:5;:18;;;:23;29231:80;;29298:1;29277:5;:18;;:22;;;;29231:80;29128:183;28948:370;:::o;27719:917::-;27757:19;27779:45;27805:10;:17;;;27779:10;:20;;;:24;;:45;;;;:::i;:::-;27757:67;;27858:1;27839:10;:15;;;:20;;:54;;;;;27879:14;27863:12;:30;;27839:54;27835:794;;;27911:12;27926:5;:21;;;27911:36;;27967:10;:14;;;;;;;;;;;;27962:494;;;28027:44;28054:10;:15;;;28027:5;:21;;;:25;;:44;;;;:::i;:::-;28003:5;:21;;:68;;;;28120:10;:17;;;28095:5;:21;;;:42;28090:112;;28181:1;28163:10;:15;;:19;;;;28090:112;27962:494;;;28266:44;28293:10;:15;;;28266:5;:21;;;:25;;:44;;;;:::i;:::-;28242:5;:21;;:68;;;;28359:10;:17;;;28334:5;:21;;;:42;28329:112;;28420:1;28402:10;:15;;:19;;;;28329:112;27962:494;28493:12;28470:10;:20;;:35;;;;28525:92;28552:7;28561:5;:21;;;28584:10;:15;;;28601:10;:14;;;;;;;;;;;;28525:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27835:794;;27719:917;:::o;1076:189::-;1162:7;1194:1;1190;:5;1197:12;1182:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1221:9;1237:1;1233;:5;;;;;;1221:17;;1256:1;1249:8;;;1076:189;;;;;:::o;478:192::-;564:7;597:1;592;:6;;600:12;584:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;624:9;640:1;636;:5;624:17;;661:1;654:8;;;478:192;;;;;:::o;10730:347::-;10836:7;10857:9;10868;10881:13;10889:1;10892;10881:7;:13::i;:::-;10856:38;;;;10905:10;10931:1;10918:15;;;;;10928:1;10925;10918:15;10905:28;;10953:1;10948:2;:6;10944:18;;;10961:1;10956:6;;;;10944:18;10978:2;10973:7;;;;11003:1;10999;:5;10991:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11053:16;11061:1;11064;11067;11053:7;:16::i;:::-;11046:23;;;;;10730:347;;;;;:::o;9499:420::-;9582:23;9608:69;9636:4;9608:69;;;;;;;;;;;;;;;;;9616:5;9608:27;;;;:69;;;;;:::i;:::-;9582:95;;9712:1;9692:10;:17;:21;9688:224;;;9834:10;9823:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9815:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9688:224;9499:420;;;:::o;10022:210::-;10083:9;10094;10116:10;10150:2;10129:25;;;;;10139:1;10136;10129:25;10116:38;;10173:1;10169;:5;10165:9;;10194:1;10189:2;:6;10185:10;;10215:1;10210:2;:6;10206:18;;;10223:1;10218:6;;;;10206:18;10022:210;;;;;;:::o;10240:482::-;10346:7;10366:12;10386:1;10385:2;;10381:1;:6;10366:21;;10403:4;10398:9;;;;;;;;;10423:4;10418:9;;;;;;;;;10465:1;10458:4;10450;10449:5;;10448:14;;;;;;:18;10443:1;:24;10438:29;;;;10478:9;10490:1;10478:13;;10515:1;10511;:5;10507:1;:9;10502:14;;;;10540:1;10536;:5;10532:1;:9;10527:14;;;;10565:1;10561;:5;10557:1;:9;10552:14;;;;10590:1;10586;:5;10582:1;:9;10577:14;;;;10615:1;10611;:5;10607:1;:9;10602:14;;;;10640:1;10636;:5;10632:1;:9;10627:14;;;;10665:1;10661;:5;10657:1;:9;10652:14;;;;10690:1;10686;:5;10682:1;:9;10677:14;;;;10713:1;10709;:5;10702:12;;;;10240:482;;;;;:::o;2850:196::-;2953:12;2985:53;3008:6;3016:4;3022:1;3025:12;2985:22;:53::i;:::-;2978:60;;2850:196;;;;;:::o;3826:979::-;3956:12;3989:18;4000:6;3989:10;:18::i;:::-;3981:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4115:12;4129:23;4156:6;:11;;4176:8;4187:4;4156:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4114:78;;;;4207:7;4203:595;;;4238:10;4231:17;;;;;;4203:595;4372:1;4352:10;:17;:21;4348:439;;;4615:10;4609:17;4676:15;4663:10;4659:2;4655:19;4648:44;4563:148;4758:12;4751:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3826:979;;;;;;;:::o;2023:233::-;2083:4;2102:12;2213:7;2201:20;2193:28;;2247:1;2240:4;:8;2233:15;;;2023:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://b1e88e1e1ec56cef5040a48f95371dd67ec4bed4c258500cfb6e8a9c19869e1f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1.55
Net Worth in ETH
0.000747
Token Allocations
BPT
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.002359 | 658.2457 | $1.55 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.