Contract
0x49EDb46546035e28B7138B21FC3fcCd41bF4b928
1
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
TimeBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2021-11-25 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyPolicy() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyPolicy() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function sub32(uint32 a, uint32 b) internal pure returns (uint32) { return sub32(a, b, "SafeMath: subtraction overflow"); } function sub32(uint32 a, uint32 b, string memory errorMessage) internal pure returns (uint32) { require(b <= a, errorMessage); uint32 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender] .sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] .sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender) .sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract TimeBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; using SafeMath for uint32; /* ======== EVENTS ======== */ event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint payout, uint remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable Time; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints OHM when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new bonds Adjust public adjustment; // stores adjustment to BCV data mapping( address => Bond ) public bondInfo; // stores bond information for depositors uint public totalDebt; // total value of outstanding bonds; used for pricing uint32 public lastDecay; // reference time for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint controlVariable; // scaling variable for price uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint32 vestingTerm; // in seconds } // Info for bond holder struct Bond { uint payout; // OHM remaining to be paid uint pricePaid; // In DAI, for front end viewing uint32 lastTime; // Last interaction uint32 vesting; // Seconds left to vest } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint32 buffer; // minimum length (in seconds) between adjustments uint32 lastTime; // time when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _Time, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require( _Time != address(0) ); Time = _Time; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint32 * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint _controlVariable, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt, uint32 _vestingTerm ) external onlyPolicy() { require( terms.controlVariable == 0, "Bonds must be initialized from 0" ); terms = Terms ({ controlVariable: _controlVariable, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt, vestingTerm: _vestingTerm }); totalDebt = _initialDebt; lastDecay = uint32(block.timestamp); } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT, MINPRICE } /** * @notice set parameters for new bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 129600, "Vesting must be longer than 36 hours" ); terms.vestingTerm = uint32(_input); } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "DAO fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } else if ( _parameter == PARAMETER.MINPRICE ) { // 4 terms.minimumPrice = _input; } } /** * @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, uint32 _buffer ) external onlyPolicy() { adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastTime: uint32(block.timestamp) }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== 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(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 OHM ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) OHM */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to dao IERC20( Time ).safeTransfer( DAO, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored bondInfo[ _depositor ] = Bond({ payout: bondInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastTime: uint32(block.timestamp), pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.timestamp.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ _recipient ]; // (seconds since last interaction / vesting term remaining) uint percentVested = percentVestedFor( _recipient ); if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[ _recipient ]; // delete user info emit BondRedeemed( _recipient, info.payout, 0 ); // emit bond data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info bondInfo[ _recipient ] = Bond({ payout: info.payout.sub( payout ), vesting: info.vesting.sub32( uint32( block.timestamp ).sub32( info.lastTime ) ), lastTime: uint32(block.timestamp), pricePaid: info.pricePaid }); emit BondRedeemed( _recipient, payout, bondInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( Time ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( Time ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( Time ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint timeCanAdjust = adjustment.lastTime.add( adjustment.buffer ); if( adjustment.rate != 0 && block.timestamp >= timeCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if ( terms.controlVariable <= adjustment.target ) { adjustment.rate = 0; } } adjustment.lastTime = uint32(block.timestamp); emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = uint32(block.timestamp); } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum bond size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( Time ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to OHM supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( Time ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBond ) { return debtRatio().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint32 timeSinceLast = uint32(block.timestamp).sub32( lastDecay ); decay_ = totalDebt.mul( timeSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Bond memory bond = bondInfo[ _depositor ]; uint secondsSinceLast = uint32(block.timestamp).sub( bond.lastTime ); uint vesting = bond.vesting; if ( vesting > 0 ) { percentVested_ = secondsSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of OHM available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = bondInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or OHM) to the DAO * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != Time ); require( _token != principle ); IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
[{"inputs":[{"internalType":"address","name":"_Time","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Time","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint32","name":"buffer","type":"uint32"},{"internalType":"uint32","name":"lastTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint32","name":"lastTime","type":"uint32"},{"internalType":"uint32","name":"vesting","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"},{"internalType":"uint32","name":"_vestingTerm","type":"uint32"}],"name":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","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":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint32","name":"_buffer","type":"uint32"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum TimeBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b5060405162002f7238038062002f72833981810160405260a08110156200003857600080fd5b50805160208201516040808401516060850151608090950151600080546001600160a01b031916331780825593519596949592949391926001600160a01b0392909216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908290a36001600160a01b038516620000b557600080fd5b6001600160601b0319606086901b166080526001600160a01b038416620000db57600080fd5b6001600160601b0319606085901b1660a0526001600160a01b0383166200010157600080fd5b6001600160601b0319606084901b1660c0526001600160a01b0382166200012757600080fd5b6001600160601b0319606092831b811660e0529181901b909116610120526001600160a01b0316151560f81b6101005250505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c612d446200022e60003980610ebe52806116c852806119c2525080610e9052806116975280611ced5250806115075280611791528061190f525080610e1a528061113e5280611360528061145b5250806106055280610eed5280610f94528061116d52806113075280611331528061142a52806116f752806118cd5250806114e5528061188e5280611a1c5280611d625280611e525280611f25528061200a528061211f5250612d446000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80638dbdbe6d11610145578063d4d863ce116100bd578063e0176de81161008c578063f5c2ab5b11610071578063f5c2ab5b146105d2578063f8e157ea146105f3578063fc7b9c18146105fb57610241565b8063e0176de8146105c2578063e392a262146105ca57610241565b8063d4d863ce14610543578063d502562514610571578063d7969060146105b2578063d7ccfb0b146105ba57610241565b8063b4abccba11610114578063cd1234b3116100f9578063cd1234b3146104a2578063cea55f57146104f4578063cf37a891146104fc57610241565b8063b4abccba14610474578063c5332b7c1461049a57610241565b80638dbdbe6d146103fb578063904b3ece1461042d57806398fabd3a14610435578063ae9832cf1461043d57610241565b806346f68ee9116101d857806361d027b3116101a757806377b818951161018c57806377b81895146103ce5780637927ebf8146103d6578063844b5c7c146103f357610241565b806361d027b3146103be578063759076e5146103c657610241565b806346f68ee9146103625780634cf088d914610388578063507930ec146103905780635a96ac0a146103b657610241565b80631e321a0f116102145780631e321a0f146102b45780631feed31f146102da5780632f3f470a14610308578063451ee4a11461032457610241565b8063016a42841461024657806301b88ee81461026a5780630505c8c9146102a2578063089208d8146102aa575b600080fd5b61024e610603565b604080516001600160a01b039092168252519081900360200190f35b6102906004803603602081101561028057600080fd5b50356001600160a01b0316610627565b60408051918252519081900360200190f35b61024e610680565b6102b2610690565b005b6102b2600480360360408110156102ca57600080fd5b5060ff8135169060200135610739565b610290600480360360408110156102f057600080fd5b506001600160a01b038135169060200135151561092e565b610310610b80565b604080519115158252519081900360200190f35b61032c610b90565b60408051951515865260208601949094528484019290925263ffffffff9081166060850152166080830152519081900360a00190f35b6102b26004803603602081101561037857600080fd5b50356001600160a01b0316610bb7565b61024e610cb6565b610290600480360360208110156103a657600080fd5b50356001600160a01b0316610cc5565b6102b2610d6e565b61024e610e18565b610290610e3c565b61024e610e57565b610290600480360360208110156103ec57600080fd5b5035610e66565b610290610e8c565b6102906004803603606081101561041157600080fd5b50803590602081013590604001356001600160a01b0316611025565b610290611693565b61024e61178f565b6102b26004803603608081101561045357600080fd5b5080351515906020810135906040810135906060013563ffffffff166117b3565b6103106004803603602081101561048a57600080fd5b50356001600160a01b031661188a565b61024e6119c0565b6104c8600480360360208110156104b857600080fd5b50356001600160a01b03166119e4565b60408051948552602085019390935263ffffffff91821684840152166060830152519081900360800190f35b610290611a17565b6102b2600480360360e081101561051257600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c0013563ffffffff16611acf565b6102b26004803603604081101561055957600080fd5b506001600160a01b0381351690602001351515611bfb565b610579611cd0565b604080519687526020870195909552858501939093526060850191909152608084015263ffffffff1660a0830152519081900360c00190f35b610310611ceb565b610290611d0f565b610290611d4e565b610290611deb565b6105da611e44565b6040805163ffffffff9092168252519081900360200190f35b61024e611e50565b610290611e74565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061063383610cc5565b6001600160a01b0384166000908152600e6020526040902054909150612710821061066057809250610679565b6106766127106106708385611e7a565b90611eda565b92505b5050919050565b6000546001600160a01b03165b90565b6000546001600160a01b031633146106ef576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610798576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60008260048111156107a657fe5b1415610808576201fa408110156107ee5760405162461bcd60e51b8152600401808060200182810382526024815260200180612cc16024913960400191505060405180910390fd5b6009805463ffffffff191663ffffffff831617905561092a565b600182600481111561081657fe5b141561087d576103e8811115610873576040805162461bcd60e51b815260206004820181905260248201527f5061796f75742063616e6e6f742062652061626f766520312070657263656e74604482015290519081900360640190fd5b600681905561092a565b600282600481111561088b57fe5b14156108f2576127108111156108e8576040805162461bcd60e51b815260206004820152601c60248201527f44414f206665652063616e6e6f7420657863656564207061796f757400000000604482015290519081900360640190fd5b600781905561092a565b600382600481111561090057fe5b141561091057600881905561092a565b600482600481111561091e57fe5b141561092a5760058190555b5050565b6000610938612bc8565b506001600160a01b0383166000908152600e602090815260408083208151608081018352815481526001820154938101939093526002015463ffffffff8082169284019290925264010000000090041660608201529061099785610cc5565b90506127108110610a2c576001600160a01b0385166000818152600e6020908152604080832083815560018101849055600201805467ffffffffffffffff19169055855181519081529182019290925281517f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b1929181900390910190a2610a2385858460000151611f1c565b92505050610b7a565b8151600090610a4390612710906106709085611e7a565b90506040518060800160405280610a6783866000015161222090919063ffffffff16565b8152602001846020015181526020014263ffffffff168152602001610abb610aa286604001514263ffffffff1661226290919063ffffffff16565b866060015163ffffffff1661226290919063ffffffff16565b63ffffffff9081169091526001600160a01b0388166000818152600e60209081526040918290208551808255868301516001830155868401516002909201805460609098015187166401000000000267ffffffff00000000199390971663ffffffff19909816979097179190911694909417909455805185815293840192909252815190927f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b192908290030190a2610b74868683611f1c565b93505050505b92915050565b600354600160a01b900460ff1681565b600a54600b54600c54600d5460ff9093169263ffffffff8082169164010000000090041685565b6000546001600160a01b03163314610c16576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116610c5b5760405162461bcd60e51b8152600401808060200182810382526026815260200180612c0f6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000610ccf612bc8565b506001600160a01b0382166000908152600e602090815260408083208151608081018352815481526001820154938101939093526002015463ffffffff80821692840183905264010000000090910481166060840152919291610d36914282169161222016565b606083015190915063ffffffff168015610d6157610d5a8161067084612710611e7a565b9350610d66565b600093505b505050919050565b6001546001600160a01b03163314610db75760405162461bcd60e51b8152600401808060200182810382526022815260200180612c356022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e52610e49611deb565b600f5490612220565b905090565b6003546001600160a01b031681565b6000610b7a662386f26fc10000610670610e8785610e82611d0f565b6122a4565b612426565b60007f000000000000000000000000000000000000000000000000000000000000000015610f8a57610f8360646106707f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610f4957600080fd5b505afa158015610f5d573d6000803e3d6000fd5b505050506040513d6020811015610f7357600080fd5b5051610f7d611d0f565b90611e7a565b905061068d565b610e5260646106707f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610feb57600080fd5b505afa158015610fff573d6000803e3d6000fd5b505050506040513d602081101561101557600080fd5b505160ff16600a0a610f7d611d0f565b60006001600160a01b038216611082576040805162461bcd60e51b815260206004820152600f60248201527f496e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b61108a61243e565b600854600f5411156110e3576040805162461bcd60e51b815260206004820152601460248201527f4d61782063617061636974792072656163686564000000000000000000000000604482015290519081900360640190fd5b60006110ed610e8c565b905060006110f9612463565b90508085101561113a5760405162461bcd60e51b8152600401808060200182810382526023815260200180612c9e6023913960400191505060405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b50519050600061120a82610e66565b905062989680811015611264576040805162461bcd60e51b815260206004820152600e60248201527f426f6e6420746f6f20736d616c6c000000000000000000000000000000000000604482015290519081900360640190fd5b61126c611d4e565b8111156112c0576040805162461bcd60e51b815260206004820152600e60248201527f426f6e6420746f6f206c61726765000000000000000000000000000000000000604482015290519081900360640190fd5b60006112e061271061067060046003015485611e7a90919063ffffffff16565b905060006112f8826112f28686612220565b90612220565b905061132f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308d6124a5565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b505050506040513d60208110156113f057600080fd5b5050604080517fbc157ac1000000000000000000000000000000000000000000000000000000008152600481018c90526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820184905291517f00000000000000000000000000000000000000000000000000000000000000009092169163bc157ac1916064808201926020929091908290030181600087803b1580156114a657600080fd5b505af11580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5050811561152c5761152c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000008461251e565b600f54611539908561258e565b600f55604080516080810182526001600160a01b038a166000908152600e6020529190912054819061156b908661258e565b8152602080820189905263ffffffff428181166040808601919091526009805484166060968701526001600160a01b038f166000908152600e8652829020875181559487015160018601559086015160029094018054969095015183166401000000000267ffffffff000000001994841663ffffffff1990971696909617939093169490941790925554889261160692909181169061258e16565b604080518d8152905186917f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae5919081900360200190a4611644611a17565b61164c612463565b611654610e8c565b6040517f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a90600090a46116856125e8565b509098975050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561178757610f83633b9aca006106707f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561175357600080fd5b505afa158015611767573d6000803e3d6000fd5b505050506040513d602081101561177d57600080fd5b5051610f7d611a17565b610f83611a17565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314611812576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6040805160a0810182529415158086526020860185905290850183905263ffffffff91821660608601819052429092166080909501859052600a805460ff19169091179055600b92909255600c55600d805463ffffffff191690911767ffffffff000000001916640100000000909202919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614156118cb57600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316141561190a57600080fd5b6119b87f0000000000000000000000000000000000000000000000000000000000000000836001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d60208110156119a557600080fd5b50516001600160a01b038516919061251e565b506001919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600e6020526000908152604090208054600182015460029092015490919063ffffffff8082169164010000000090041684565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7357600080fd5b505afa158015611a87573d6000803e3d6000fd5b505050506040513d6020811015611a9d57600080fd5b50519050611ac9670de0b6b3a7640000610670610e87611ac3633b9aca00610f7d610e3c565b856122a4565b91505090565b6000546001600160a01b03163314611b2e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60045415611b83576040805162461bcd60e51b815260206004820181905260248201527f426f6e6473206d75737420626520696e697469616c697a65642066726f6d2030604482015290519081900360640190fd5b6040805160c08101825288815260208101889052908101869052606081018590526080810184905263ffffffff91821660a09091018190526004979097556005959095556006939093556007919091556008556009805463ffffffff199081169094179055600f556010805490921642909116179055565b6000546001600160a01b03163314611c5a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038216611c6d57600080fd5b8015611ca25760038054600160a01b60ff60a01b19909116176001600160a01b0319166001600160a01b03841617905561092a565b6003805460ff60a01b19169055600280546001600160a01b0384166001600160a01b03199091161790555050565b60045460055460065460075460085460095463ffffffff1686565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611d3a62989680610670633b9aca00611d34611d2b611a17565b60045490611e7a565b9061258e565b60055490915081101561068d575060055490565b6000610e52620186a06106706004600201547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db957600080fd5b505afa158015611dcd573d6000803e3d6000fd5b505050506040513d6020811015611de357600080fd5b505190611e7a565b6010546000908190611e099063ffffffff4281169181169061226216565b600954600f54919250611e2e9163ffffffff91821691610670919080861690611e7a16565b9150600f54821115611e4057600f5491505b5090565b60105463ffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f5481565b600082611e8957506000610b7a565b82820282848281611e9657fe5b0414611ed35760405162461bcd60e51b8152600401808060200182810382526021815260200180612c7d6021913960400191505060405180910390fd5b9392505050565b6000611ed383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126f5565b600082611fcc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb85846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611f9a57600080fd5b505af1158015611fae573d6000803e3d6000fd5b505050506040513d6020811015611fc457600080fd5b506122199050565b600354600160a01b900460ff16156120f3576003546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b15801561205557600080fd5b505af1158015612069573d6000803e3d6000fd5b505050506040513d602081101561207f57600080fd5b505060035460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb775791604480830192600092919082900301818387803b1580156120d657600080fd5b505af11580156120ea573d6000803e3d6000fd5b50505050612219565b6002546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810185905290517f00000000000000000000000000000000000000000000000000000000000000009092169163095ea7b3916044808201926020929091908290030181600087803b15801561216a57600080fd5b505af115801561217e573d6000803e3d6000fd5b505050506040513d602081101561219457600080fd5b505060025460408051637acb775760e01b8152600481018590526001600160a01b03878116602483015291519190921691637acb77579160448083019260209291908290030181600087803b1580156121ec57600080fd5b505af1158015612200573d6000803e3d6000fd5b505050506040513d602081101561221657600080fd5b50505b5092915050565b6000611ed383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612797565b6000611ed383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127f1565b6122ac612bfc565b600082116122eb5760405162461bcd60e51b8152600401808060200182810382526026815260200180612c576026913960400191505060405180910390fd5b826123055750604080516020810190915260008152610b7a565b71ffffffffffffffffffffffffffffffffffff83116123ac57600082607085901b8161232d57fe5b0490506001600160e01b0381111561238c576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b6040518060200160405280826001600160e01b0316815250915050610b7a565b60006123c8846e01000000000000000000000000000085612850565b90506001600160e01b0381111561238c576040805162461bcd60e51b815260206004820152601e60248201527f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f770000604482015290519081900360640190fd5b516612725dd1d243ab6001600160e01b039091160490565b612449610e49611deb565b600f556010805463ffffffff19164263ffffffff16179055565b600061247f62989680610670633b9aca00611d34611d2b611a17565b600554909150811015612495575060055461068d565b6005541561068d57600060055590565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790526125189085906128f0565b50505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb000000000000000000000000000000000000000000000000000000001790526125899084906128f0565b505050565b600082820183811015611ed3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600d5460009061260b9063ffffffff640100000000820481169181169061258e16565b600b549091501580159061261f5750804210155b156126f257600454600a5460ff161561265957600b546004546126419161258e565b6004819055600c5411612654576000600b555b61267b565b600b5460045461266891612220565b6004819055600c541061267b576000600b555b600d805467ffffffff0000000019166401000000004263ffffffff1602179055600454600b54600a546040805185815260208101949094528381019290925260ff1615156060830152517fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a916080908290030190a1505b50565b600081836127815760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561274657818101518382015260200161272e565b50505050905090810190601f1680156127735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161278d57fe5b0495945050505050565b600081848411156127e95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561274657818101518382015260200161272e565b505050900390565b60008363ffffffff168363ffffffff16111582906127e95760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561274657818101518382015260200161272e565b600080600061285f86866129a1565b915091506000848061286d57fe5b868809905082811115612881576001820391505b80830392508482106128da576040805162461bcd60e51b815260206004820152601a60248201527f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f77000000000000604482015290519081900360640190fd5b6128e58383876129ce565b979650505050505050565b6060612945826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a3e9092919063ffffffff16565b8051909150156125895780806020019051602081101561296457600080fd5b50516125895760405162461bcd60e51b815260040180806020018281038252602a815260200180612ce5602a913960400191505060405180910390fd5b60008080600019848609905083850292508281039150828110156129c6576001820391505b509250929050565b600081810382168083816129de57fe5b0492508085816129ea57fe5b0494508081600003816129f957fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b6060612a4d8484600085612a55565b949350505050565b6060612a6085612bc2565b612ab1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612af05780518252601f199092019160209182019101612ad1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612b52576040519150601f19603f3d011682016040523d82523d6000602084013e612b57565b606091505b50915091508115612b6b579150612a4d9050565b805115612b7b5780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561274657818101518382015260200161272e565b3b151590565b60405180608001604052806000815260200160008152602001600063ffffffff168152602001600063ffffffff1681525090565b6040805160208101909152600081529056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ad047f27874cf906acc4e6f0349e240057d0ac3b73f1e69ab34cf053b90d7d5864736f6c63430007050033000000000000000000000000f2f7ce610a091b94d41d69f4ff1129434a82e2f0000000000000000000000000e9e8d6b6ce6d94fc9d724711e80784ec096949fc000000000000000000000000d5f922e23693e552793fe0431f9a95ba67a60a23000000000000000000000000deedd1646984f9372cc9d3d7e13ac1606cc2b5480000000000000000000000003e0b7bbad42445dc760059f085d56a86963793c1
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f2f7ce610a091b94d41d69f4ff1129434a82e2f0000000000000000000000000e9e8d6b6ce6d94fc9d724711e80784ec096949fc000000000000000000000000d5f922e23693e552793fe0431f9a95ba67a60a23000000000000000000000000deedd1646984f9372cc9d3d7e13ac1606cc2b5480000000000000000000000003e0b7bbad42445dc760059f085d56a86963793c1
-----Decoded View---------------
Arg [0] : _Time (address): 0xf2f7ce610a091b94d41d69f4ff1129434a82e2f0
Arg [1] : _principle (address): 0xe9e8d6b6ce6d94fc9d724711e80784ec096949fc
Arg [2] : _treasury (address): 0xd5f922e23693e552793fe0431f9a95ba67a60a23
Arg [3] : _DAO (address): 0xdeedd1646984f9372cc9d3d7e13ac1606cc2b548
Arg [4] : _bondCalculator (address): 0x3e0b7bbad42445dc760059f085d56a86963793c1
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000f2f7ce610a091b94d41d69f4ff1129434a82e2f0
Arg [1] : 000000000000000000000000e9e8d6b6ce6d94fc9d724711e80784ec096949fc
Arg [2] : 000000000000000000000000d5f922e23693e552793fe0431f9a95ba67a60a23
Arg [3] : 000000000000000000000000deedd1646984f9372cc9d3d7e13ac1606cc2b548
Arg [4] : 0000000000000000000000003e0b7bbad42445dc760059f085d56a86963793c1
Deployed ByteCode Sourcemap
21917:17449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22662:34;;;:::i;:::-;;;;-1:-1:-1;;;;;22662:34:0;;;;;;;;;;;;;;38510:400;;;;;;;;;;;;;;;;-1:-1:-1;38510:400:0;-1:-1:-1;;;;;38510:400:0;;:::i;:::-;;;;;;;;;;;;;;;;693:89;;;:::i;918:158::-;;;:::i;:::-;;26619:828;;;;;;;;;;;;;;;;-1:-1:-1;26619:828:0;;;;;;;;;:::i;31113:1240::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31113:1240:0;;;;;;;;;;:::i;23192:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23277:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;-1:-1:-1;1084:260:0;-1:-1:-1;;;;;1084:260:0;;:::i;23061:22::-;;;:::i;37899:439::-;;;;;;;;;;;;;;;;-1:-1:-1;37899:439:0;-1:-1:-1;;;;;37899:439:0;;:::i;1356:221::-;;;:::i;22732:33::-;;;:::i;37231:106::-;;;:::i;23114:28::-;;;:::i;34906:161::-;;;;;;;;;;;;;;;;-1:-1:-1;34906:161:0;;:::i;36010:331::-;;;:::i;28699:2263::-;;;;;;;;;;;;;;;;-1:-1:-1;28699:2263:0;;;;;;;;;;;-1:-1:-1;;;;;28699:2263:0;;:::i;36857:275::-;;;:::i;22809:28::-;;;:::i;27643:376::-;;;;;;;;;;;;;;;;-1:-1:-1;27643:376:0;;;;;;;;;;;;;;;;;;;;;:::i;39094:269::-;;;;;;;;;;;;;;;;-1:-1:-1;39094:269:0;-1:-1:-1;;;;;39094:269:0;;:::i;22980:39::-;;;:::i;23343:42::-;;;;;;;;;;;;;;;;-1:-1:-1;23343:42:0;-1:-1:-1;;;;;23343:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36465:271;;;:::i;25681:682::-;;;;;;;;;;;;;;;;-1:-1:-1;25681:682:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;28152:318::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28152:318:0;;;;;;;;;;:::i;23222:18::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22881:37;;;:::i;35172:261::-;;;:::i;34636:141::-;;;:::i;37439:297::-;;;:::i;23518:23::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22591:29;;;:::i;23436:21::-;;;:::i;22662:34::-;;;:::o;38510:400::-;38582:19;38615:18;38636:30;38654:10;38636:16;:30::i;:::-;-1:-1:-1;;;;;38691:22:0;;38677:11;38691:22;;;:8;:22;;;;;:29;38615:51;;-1:-1:-1;38755:5:0;38738:22;;38733:170;;38795:6;38778:23;;38733:170;;;38851:40;38884:5;38851:27;:6;38863:13;38851:10;:27::i;:::-;:31;;:40::i;:::-;38834:57;;38733:170;38510:400;;;;;:::o;693:89::-;741:7;768:6;-1:-1:-1;;;;;768:6:0;693:89;;:::o;918:158::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1034:1:::1;1018:6:::0;;1001:37:::1;::::0;-1:-1:-1;;;;;1018:6:0;;::::1;::::0;1001:37:::1;::::0;1034:1;;1001:37:::1;1066:1;1049:19:::0;;-1:-1:-1;;;;;;1049:19:0::1;::::0;;918:158::o;26619:828::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26731:17:::1;26717:10;:31;;;;;;;;;26712:728;;;26790:6;26780;:16;;26771:67;;;;-1:-1:-1::0;;;26771:67:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26853:17:::0;:34;;-1:-1:-1;;26853:34:0::1;;::::0;::::1;;::::0;;26712:728:::1;;;26924:16;26910:10;:30;;;;;;;;;26905:535;;;26982:4;26972:6;:14;;26963:61;;;::::0;;-1:-1:-1;;;26963:61:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27039:15:::0;:24;;;26905:535:::1;;;27100:13;27086:10;:27;;;;;;;;;27081:359;;;27155:5;27145:6;:15;;27136:58;;;::::0;;-1:-1:-1;;;27136:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;27209:9:::0;:18;;;27081:359:::1;;;27264:14;27250:10;:28;;;;;;;;;27245:195;;;27301:13:::0;:22;;;27245:195:::1;;;27360:18;27346:10;:32;;;;;;;;;27341:99;;;27401:18:::0;:27;;;27341:99:::1;26619:828:::0;;:::o;31113:1240::-;31183:4;31209:16;;:::i;:::-;-1:-1:-1;;;;;;31228:22:0;;;;;;:8;:22;;;;;;;;31209:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31352:30;31238:10;31352:16;:30::i;:::-;31331:51;;31417:5;31400:13;:22;31395:951;;-1:-1:-1;;;;;31466:22:0;;;;;;:8;:22;;;;;;;;31459:29;;;;;;;;;;;;;-1:-1:-1;;31459:29:0;;;31554:11;;31528:42;;;;;;;;;;;;;;;;;;;;;;;;;31610:46;31623:10;31635:6;31643:4;:11;;;31610;:46::i;:::-;31603:53;;;;;;31395:951;31789:11;;31775;;31789:45;;31827:5;;31789:32;;31806:13;31789:15;:32::i;:45::-;31775:59;;31917:267;;;;;;;;31949:25;31966:6;31949:4;:11;;;:15;;:25;;;;:::i;:::-;31917:267;;;;32154:4;:14;;;31917:267;;;;32108:15;31917:267;;;;;;32002:70;32022:48;32055:4;:13;;;32030:15;32022:31;;;;:48;;;;:::i;:::-;32002:4;:12;;;:18;;;;:70;;;;:::i;:::-;31917:267;;;;;;;-1:-1:-1;;;;;31892:22:0;;;;;;:8;:22;;;;;;;;;:292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31892:292:0;;;;-1:-1:-1;;31892:292:0;;;;;;;;;;;;;;;;;;32206:65;;;;;;;;;;;;;;31892:22;;32206:65;;;;;;;;;32293:41;32306:10;32318:6;32326;32293:11;:41::i;:::-;32286:48;;;;;31113:1240;;;;;:::o;23192:21::-;;;-1:-1:-1;;;23192:21:0;;;;;:::o;23277:24::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;1084:260::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1186:23:0;::::1;1177:75;;;;-1:-1:-1::0;;;1177:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1285:6;::::0;;1268:36:::1;::::0;-1:-1:-1;;;;;1268:36:0;;::::1;::::0;1285:6;::::1;::::0;1268:36:::1;::::0;::::1;1315:9;:21:::0;;-1:-1:-1;;;;;;1315:21:0::1;-1:-1:-1::0;;;;;1315:21:0;;;::::1;::::0;;;::::1;::::0;;1084:260::o;23061:22::-;;;-1:-1:-1;;;;;23061:22:0;;:::o;37899:439::-;37969:19;38002:16;;:::i;:::-;-1:-1:-1;;;;;;38021:22:0;;;;;;:8;:22;;;;;;;;38002:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38021:22;38078:44;;38085:15;38078:27;;;;:44;:::i;:::-;38148:12;;;;38054:68;;-1:-1:-1;38133:27:0;;38178:11;;38173:158;;38224:44;38259:7;38224:29;:16;38246:5;38224:20;:29::i;:44::-;38207:61;;38173:158;;;38318:1;38301:18;;38173:158;37899:439;;;;;;:::o;1356:221::-;1440:9;;-1:-1:-1;;;;;1440:9:0;1426:10;:23;1417:71;;;;-1:-1:-1;;;1417:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;1521:6;;1504:36;;-1:-1:-1;;;;;1529:9:0;;;;1521:6;;;;1504:36;;;1560:9;;;1551:18;;-1:-1:-1;;;;;;1551:18:0;-1:-1:-1;;;;;1560:9:0;;;1551:18;;;;;;1356:221::o;22732:33::-;;;:::o;37231:106::-;37276:4;37301:28;37316:11;:9;:11::i;:::-;37301:9;;;:13;:28::i;:::-;37294:35;;37231:106;:::o;23114:28::-;;;-1:-1:-1;;;;;23114:28:0;;:::o;34906:161::-;34962:4;34987:72;35053:4;34987:60;:42;35008:6;35016:11;:9;:11::i;:::-;34987:19;:42::i;:::-;:58;:60::i;36010:331::-;36058:11;36087:15;36083:251;;;36129:85;36209:3;36129:74;36163:14;-1:-1:-1;;;;;36146:42:0;;36190:9;36146:55;;;;;;;;;;;;;-1:-1:-1;;;;;36146:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36146:55:0;36129:11;:9;:11::i;:::-;:15;;:74::i;:85::-;36120:94;;36083:251;;;36256:66;36317:3;36256:55;36287:9;-1:-1:-1;;;;;36279:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36279:30:0;36273:36;;:2;:36;36256:11;:9;:11::i;28699:2263::-;28821:4;-1:-1:-1;;;;;28848:24:0;;28839:54;;;;;-1:-1:-1;;;28839:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28906:11;:9;:11::i;:::-;28950:13;;28937:9;;:26;;28928:61;;;;;-1:-1:-1;;;28928:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29010:15;29028:16;:14;:16::i;:::-;29010:34;;29078:16;29097:12;:10;:12::i;:::-;29078:31;;29144:11;29131:9;:24;;29122:74;;;;-1:-1:-1;;;29122:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29232:10;29256:8;-1:-1:-1;;;;;29245:29:0;;29276:9;29287:7;29245:51;;;;;;;;;;;;;-1:-1:-1;;;;;29245:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29245:51:0;;-1:-1:-1;29307:11:0;29321:18;29245:51;29321:9;:18::i;:::-;29307:32;;29403:8;29393:6;:18;;29384:47;;;;;-1:-1:-1;;;29384:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:11;:9;:11::i;:::-;29498:6;:21;;29489:49;;;;;-1:-1:-1;;;29489:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29634:8;29645:36;29674:5;29645:23;29657:5;:9;;;29645:6;:10;;:23;;;;:::i;:36::-;29634:47;-1:-1:-1;29692:11:0;29706:30;29634:47;29706:19;:5;29717:6;29706:9;:19::i;:::-;:23;;:30::i;:::-;29692:44;-1:-1:-1;29917:74:0;-1:-1:-1;;;;;29925:9:0;29917:36;29955:10;29975:4;29982:7;29917:36;:74::i;:::-;30010:9;-1:-1:-1;;;;;30002:27:0;;30040:8;30052:7;30002:59;;;;;;;;;;;;;-1:-1:-1;;;;;30002:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30072:59:0;;;;;;;;;;;;-1:-1:-1;;;;;30112:9:0;30072:59;;;;;;;;;;;;;;30083:8;30072:29;;;;;;:59;;;;;30002;;30072;;;;;;;;-1:-1:-1;30072:29:0;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30157:8:0;;30152:113;;30213:39;-1:-1:-1;;;;;30221:4:0;30213:27;30242:3;30247;30213:27;:39::i;:::-;30333:9;;:22;;30348:5;30333:13;:22::i;:::-;30321:9;:34;30447:209;;;;;;;;-1:-1:-1;;;;;30476:22:0;;-1:-1:-1;30476:22:0;;;:8;:22;;;;;;:29;30447:209;;30476:43;;30511:6;30476:33;:43::i;:::-;30447:209;;;;;;;;;;30592:15;30447:209;;;;;;;;;;;30543:17;;;;;30447:209;;;;;-1:-1:-1;;;;;30422:22:0;;-1:-1:-1;30422:22:0;;;:8;:22;;;;;:234;;;;;;;;30543:17;30422:234;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30422:234:0;;;-1:-1:-1;;30422:234:0;;;;;;;;;;;;;;;;;;30764:17;30634:10;;30743:40;;30592:15;;30764:17;;;30743:19;:40;:::i;:::-;30713:84;;;;;;;;30735:6;;30713:84;;;;;;;;;;30863:11;:9;:11::i;:::-;30849:12;:10;:12::i;:::-;30831:16;:14;:16::i;:::-;30813:63;;;;;;;30889:8;:6;:8::i;:::-;-1:-1:-1;30947:6:0;;28699:2263;-1:-1:-1;;;;;;;;28699:2263:0:o;36857:275::-;36914:4;36937:15;36932:193;;;36977:85;37057:3;36977:74;37011:14;-1:-1:-1;;;;;36994:42:0;;37038:9;36994:55;;;;;;;;;;;;;-1:-1:-1;;;;;36994:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36994:55:0;36977:11;:9;:11::i;36932:193::-;37102:11;:9;:11::i;22809:28::-;;;:::o;27643:376::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27824:187:::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;27983:15:::1;27824:187:::0;;::::1;::::0;;;;;;;27811:10:::1;:200:::0;;-1:-1:-1;;27811:200:0::1;::::0;;::::1;::::0;;;;;;;;;;;;-1:-1:-1;;27811:200:0::1;::::0;;::::1;-1:-1:-1::0;;27811:200:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;27643:376::o;39094:269::-;39157:4;39194;-1:-1:-1;;;;;39184:14:0;:6;-1:-1:-1;;;;;39184:14:0;;;39175:25;;;;;;39230:9;-1:-1:-1;;;;;39220:19:0;:6;-1:-1:-1;;;;;39220:19:0;;;39211:30;;;;;;39252:81;39283:3;39296:6;-1:-1:-1;;;;;39288:26:0;;39324:4;39288:43;;;;;;;;;;;;;-1:-1:-1;;;;;39288:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39288:43:0;-1:-1:-1;;;;;39252:29:0;;;:81;:29;:81::i;:::-;-1:-1:-1;39351:4:0;39094:269;;;:::o;22980:39::-;;;:::o;23343:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36465:271::-;36508:15;36540:11;36562:4;-1:-1:-1;;;;;36554:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36554:28:0;;-1:-1:-1;36606:122:0;36722:4;36606:110;:92;36641:24;36660:3;36641:13;:11;:13::i;:24::-;36681:6;36606:19;:92::i;:122::-;36593:135;;36465:271;;:::o;25681:682::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25950:5:::1;:21:::0;:26;25941:73:::1;;;::::0;;-1:-1:-1;;;25941:73:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;26033:241;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;26025:5:::1;:249:::0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26025:249:0;;::::1;::::0;;::::1;::::0;;26285:9:::1;:24:::0;26320:9:::1;:35:::0;;;;::::1;26339:15;26320:35:::0;;::::1;;::::0;;25681:682::o;28152:318::-;832:6;;-1:-1:-1;;;;;832:6:0;842:10;832:20;823:67;;;;;-1:-1:-1;;;823:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28248:22:0;::::1;28239:33;;;::::0;::::1;;28288:7;28283:180;;;28313:9;:16:::0;;-1:-1:-1;;;;;;;28313:16:0;;::::1;;-1:-1:-1::0;;;;;;28344:24:0::1;-1:-1:-1::0;;;;;28344:24:0;::::1;;::::0;;28283:180:::1;;;28401:9;:17:::0;;-1:-1:-1;;;;28401:17:0::1;::::0;;28433:7:::1;:18:::0;;-1:-1:-1;;;;;28433:18:0;::::1;-1:-1:-1::0;;;;;;28433:18:0;;::::1;;::::0;;28152:318;;:::o;23222:18::-;;;;;;;;;;;;;;;;:::o;22881:37::-;;;:::o;35172:261::-;35215:11;35257:69;35321:3;35257:58;35303:10;35257:40;35284:11;:9;:11::i;:::-;35257:5;:21;;:25;:40::i;:::-;:44;;:58::i;:69::-;35351:18;;35248:78;;-1:-1:-1;35342:27:0;;35337:89;;;-1:-1:-1;35396:18:0;;35172:261;:::o;34636:141::-;34679:4;34704:65;34761:6;34704:51;34738:5;:15;;;34712:4;-1:-1:-1;;;;;34704:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34704:28:0;;:32;:51::i;37439:297::-;37561:9;;37482:11;;;;37530:42;;37561:9;37537:15;37530:29;;;37561:9;;;37530:29;:42;:::i;:::-;37628:17;;37592:9;;37507:65;;-1:-1:-1;37592:55:0;;37628:17;;;;;37592:30;;:9;:30;;;;:13;:30;:::i;:55::-;37583:64;;37672:9;;37663:6;:18;37658:71;;;37708:9;;37699:18;;37658:71;37439:297;;:::o;23518:23::-;;;;;;:::o;22591:29::-;;;:::o;23436:21::-;;;;:::o;2486:250::-;2544:7;2568:6;2564:47;;-1:-1:-1;2598:1:0;2591:8;;2564:47;2635:5;;;2639:1;2635;:5;:1;2659:5;;;;;:10;2651:56;;;;-1:-1:-1;;;2651:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2727:1;2486:250;-1:-1:-1;;;2486:250:0:o;2744:132::-;2802:7;2829:39;2833:1;2836;2829:39;;;;;;;;;;;;;;;;;:3;:39::i;32583:693::-;32672:4;32696:6;32690:554;;32762:4;-1:-1:-1;;;;;32754:23:0;;32779:10;32791:7;32754:46;;;;;;;;;;;;;-1:-1:-1;;;;;32754:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32690:554:0;;-1:-1:-1;32690:554:0;;32879:9;;-1:-1:-1;;;32879:9:0;;;;32874:359;;;32964:13;;32940:48;;;-1:-1:-1;;;32940:48:0;;-1:-1:-1;;;;;32964:13:0;;;32940:48;;;;;;;;;;;;32948:4;32940:22;;;;;;:48;;;;;;;;;;;;;;;-1:-1:-1;32940:22:0;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33023:13:0;;33007:60;;;-1:-1:-1;;;33007:60:0;;;;;;;;-1:-1:-1;;;;;33007:60:0;;;;;;;;;33023:13;;;;;33007:37;;:60;;;;;33023:13;;33007:60;;;;;;;33023:13;;33007:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32874:359;;;33132:7;;33108:42;;;-1:-1:-1;;;33108:42:0;;-1:-1:-1;;;;;33132:7:0;;;33108:42;;;;;;;;;;;;33116:4;33108:22;;;;;;:42;;;;;;;;;;;;;;;-1:-1:-1;33108:22:0;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33179:7:0;;33169:48;;;-1:-1:-1;;;33169:48:0;;;;;;;;-1:-1:-1;;;;;33169:48:0;;;;;;;;;33179:7;;;;;33169:25;;:48;;;;;33108:42;;33169:48;;;;;;;33179:7;;33169:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32874:359:0;-1:-1:-1;33261:7:0;32583:693;-1:-1:-1;;32583:693:0:o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;2143:137::-;2201:6;2227:45;2233:1;2236;2227:45;;;;;;;;;;;;;;;;;:5;:45::i;20577:719::-;20658:16;;:::i;:::-;20709:1;20695:11;:15;20687:66;;;;-1:-1:-1;;;20687:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20768:14;20764:50;;-1:-1:-1;20791:23:0;;;;;;;;;-1:-1:-1;20791:23:0;;20784:30;;20764:50;20831:24;;;20827:462;;20872:14;20917:11;20003:3;20890:23;;;20917:11;20889:39;;;;;;-1:-1:-1;;;;;;20951:21:0;;;20943:64;;;;;-1:-1:-1;;;20943:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21029:26;;;;;;;;21047:6;-1:-1:-1;;;;;21029:26:0;;;;21022:33;;;;;20827:462;21088:14;21105:45;21121:9;20045:31;21138:11;21105:15;:45::i;:::-;21088:62;-1:-1:-1;;;;;;21173:21:0;;;21165:64;;;;;-1:-1:-1;;;21165:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20432:137;20534:7;20545:16;-1:-1:-1;;;;;20529:13:0;;;:32;;20432:137::o;34356:135::-;34409:28;34424:11;:9;:11::i;34409:28::-;34397:9;:40;34448:9;:35;;-1:-1:-1;;34448:35:0;34467:15;34448:35;;;;;34356:135::o;35560:345::-;35601:11;35635:69;35699:3;35635:58;35681:10;35635:40;35662:11;:9;:11::i;35635:69::-;35729:18;;35626:78;;-1:-1:-1;35720:27:0;;35715:183;;;-1:-1:-1;35774:18:0;;35715:183;;;35823:18;;:23;35818:80;;35885:1;35864:18;:22;35560:345;:::o;17100:205::-;17228:68;;;-1:-1:-1;;;;;17228:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17228:68:0;17251:27;17228:68;;;17201:96;;17221:5;;17201:19;:96::i;:::-;17100:205;;;;:::o;16915:177::-;17025:58;;;-1:-1:-1;;;;;17025:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17025:58:0;17048:23;17025:58;;;16998:86;;17018:5;;16998:19;:86::i;:::-;16915:177;;;:::o;1610:181::-;1668:7;1700:5;;;1724:6;;;;1716:46;;;;;-1:-1:-1;;;1716:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33368:927;33452:17;;33406:18;;33427:44;;33452:17;33427:19;;;;;;33452:17;;;33427:23;:44;:::i;:::-;33486:15;;33406:65;;-1:-1:-1;33486:20:0;;;;:56;;;33529:13;33510:15;:32;;33486:56;33482:806;;;33575:5;:21;33616:10;:14;;;33611:494;;;33703:15;;33676:5;:21;:44;;:25;:44::i;:::-;33652:5;:68;;;33769:17;;-1:-1:-1;33739:112:0;;33830:1;33812:15;:19;33739:112;33611:494;;;33942:15;;33915:5;:21;:44;;:25;:44::i;:::-;33891:5;:68;;;34008:17;;-1:-1:-1;33978:112:0;;34069:1;34051:15;:19;33978:112;34119:19;:45;;-1:-1:-1;;34119:45:0;;34148:15;34119:45;;;;;;:19;34220:21;34243:15;;34119:10;34260:14;34184:92;;;;;;;;;;;;;;;;;;;;34260:14;;34184:92;;;;;;;;;;;;;;;;;33482:806;;33368:927;:::o;2884:189::-;2970:7;3005:12;2998:5;2990:28;;;;-1:-1:-1;;;2990:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3029:9;3045:1;3041;:5;;;;;;;2884:189;-1:-1:-1;;;;;2884:189:0:o;1943:192::-;2029:7;2065:12;2057:6;;;;2049:29;;;;-1:-1:-1;;;2049:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2101:5:0;;;1943:192::o;2288:190::-;2374:6;2406:1;2401:6;;:1;:6;;;;2409:12;2393:29;;;;;-1:-1:-1;;;2393:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19477:347;19583:7;19604:9;19615;19628:13;19636:1;19639;19628:7;:13::i;:::-;19603:38;;;;19652:10;19678:1;19665:15;;;;;19675:1;19672;19665:15;19652:28;;19700:1;19695:2;:6;19691:18;;;19708:1;19703:6;;;;19691:18;19725:2;19720:7;;;;19750:1;19746;:5;19738:44;;;;;-1:-1:-1;;;19738:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19800:16;19808:1;19811;19814;19800:7;:16::i;:::-;19793:23;19477:347;-1:-1:-1;;;;;;;19477:347:0:o;18318:420::-;18401:23;18427:69;18455:4;18427:69;;;;;;;;;;;;;;;;;18435:5;-1:-1:-1;;;;;18427:27:0;;;:69;;;;;:::i;:::-;18511:17;;18401:95;;-1:-1:-1;18511:21:0;18507:224;;18653:10;18642:30;;;;;;;;;;;;;;;-1:-1:-1;18642:30:0;18634:85;;;;-1:-1:-1;;;18634:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18769:210;18830:9;;;-1:-1:-1;;18886:1:0;18883;18876:25;18863:38;;18920:1;18916;:5;18912:9;;18941:1;18936:2;:6;18932:10;;18962:1;18957:2;:6;18953:18;;;18970:1;18965:6;;;;18953:18;18769:210;;;;;;:::o;18987:482::-;19093:7;19132:2;;;19128:6;;;19133:1;19128:6;19145:9;;;;;;;19170:4;19165:9;;;;;;;;;19205:4;19197;19196:5;;19195:14;;;;;19254:1;:9;;;19283:5;;;19279:9;;19274:14;19308:5;;;19304:9;;19299:14;19333:5;;;19329:9;;19324:14;19358:5;;;19354:9;;19349:14;19383:5;;;19379:9;;19374:14;19408:5;;;19404:9;;19399:14;19433:5;;;19429:9;;19424:14;;;19195;;19212:1;19195:18;19190:24;;;;19185:29;;;;19456:5;;18987:482;-1:-1:-1;;18987:482:0:o;4585:232::-;4724:12;4756:53;4779:6;4787:4;4793:1;4796:12;4756:22;:53::i;:::-;4749:60;4585:232;-1:-1:-1;;;;4585:232:0:o;5643:1025::-;5819:12;5852:18;5863:6;5852:10;:18::i;:::-;5844:60;;;;;-1:-1:-1;;;5844:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5978:12;5992:23;6019:6;-1:-1:-1;;;;;6019:11:0;6039:8;6050:4;6019:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6019:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5977:78;;;;6070:7;6066:595;;;6101:10;-1:-1:-1;6094:17:0;;-1:-1:-1;6094:17:0;6066:595;6215:17;;:21;6211:439;;6478:10;6472:17;6539:15;6526:10;6522:2;6518:19;6511:44;6426:148;6614:20;;-1:-1:-1;;;6614:20:0;;;;;;;;;;;;;;;;;6621:12;;6614:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3758:233;3936:20;3975:8;;;3758:233::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://ad047f27874cf906acc4e6f0349e240057d0ac3b73f1e69ab34cf053b90d7d58
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.