Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 859 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14832637 | 994 days ago | IN | 0 ETH | 0.00140864 | ||||
Redeem | 14822888 | 996 days ago | IN | 0 ETH | 0.0004743 | ||||
Redeem | 14817109 | 997 days ago | IN | 0 ETH | 0.00080112 | ||||
Redeem | 14804228 | 999 days ago | IN | 0 ETH | 0.00158504 | ||||
Redeem | 14798678 | 1000 days ago | IN | 0 ETH | 0.00097107 | ||||
Redeem | 14798675 | 1000 days ago | IN | 0 ETH | 0.00080123 | ||||
Redeem | 14791296 | 1001 days ago | IN | 0 ETH | 0.00121609 | ||||
Redeem | 14791032 | 1001 days ago | IN | 0 ETH | 0.00218532 | ||||
Redeem | 14779740 | 1003 days ago | IN | 0 ETH | 0.00175028 | ||||
Redeem | 14778799 | 1003 days ago | IN | 0 ETH | 0.00076372 | ||||
Redeem | 14775930 | 1003 days ago | IN | 0 ETH | 0.00100016 | ||||
Redeem | 14774535 | 1003 days ago | IN | 0 ETH | 0.0023698 | ||||
Redeem | 14774528 | 1003 days ago | IN | 0 ETH | 0.00208236 | ||||
Redeem | 14762647 | 1005 days ago | IN | 0 ETH | 0.00880134 | ||||
Redeem | 14758104 | 1006 days ago | IN | 0 ETH | 0.00673173 | ||||
Redeem | 14756162 | 1006 days ago | IN | 0 ETH | 0.00720338 | ||||
Deposit | 14756149 | 1006 days ago | IN | 0 ETH | 0.03136861 | ||||
Redeem | 14756146 | 1006 days ago | IN | 0 ETH | 0.00617415 | ||||
Redeem | 14755631 | 1006 days ago | IN | 0 ETH | 0.00606096 | ||||
Deposit | 14754619 | 1007 days ago | IN | 0 ETH | 0.02145294 | ||||
Deposit | 14754610 | 1007 days ago | IN | 0 ETH | 0.02171802 | ||||
Redeem | 14754607 | 1007 days ago | IN | 0 ETH | 0.00361851 | ||||
Redeem | 14751983 | 1007 days ago | IN | 0 ETH | 0.00124645 | ||||
Redeem | 14750678 | 1007 days ago | IN | 0 ETH | 0.00261022 | ||||
Deposit | 14747892 | 1008 days ago | IN | 0 ETH | 0.01199235 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CustomALCXBond
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-13 */ // 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/ALCXCustom/CustomALCXBond.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 CustomALCXBond 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
[{"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 CustomALCXBond.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
6101406040523480156200001257600080fd5b50604051620040013803806200400183398181016040526101208110156200003957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200009657600080fd5b83820191506020820185811115620000ad57600080fd5b8251866020820283011164010000000082111715620000cb57600080fd5b8083526020830192505050908051906020019060200280838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905001604052602001805160405193929190846401000000008211156200012e57600080fd5b838201915060208201858111156200014557600080fd5b82518660208202830111640100000000821117156200016357600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200019c5780820151818401526020810190506200017f565b5050505090500160405260200180519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200023157600080fd5b8873ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff16634efa82b66040518163ffffffff1660e01b815260040160206040518083038186803b158015620002af57600080fd5b505afa158015620002c4573d6000803e3d6000fd5b505050506040513d6020811015620002db57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156200035d57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003cf57600080fd5b86600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200044b57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620004be57600080fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200053957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508151835114620005cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062003fda6027913960400191505060405180910390fd5b60005b8351811015620006655760116040518060400160405280868481518110620005f357fe5b602002602001015181526020018584815181106200060d57fe5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080600101915050620005cf565b5080151561012081151560f81b8152505050505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c613891620007496000398061105d528061149c52806119635280611bf7525080612301525080610d955250806110c252806113ad52806118b252806119d65280611b1d5250806110fe52806113e95280611876528061198f5280611a125280611ad65280611b595280611cb65250806115015280611c445280611f205280612118528061241952806124d652806125c252806126d15280612e5252506138916000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ffdbf6546c2e15d8d3bf059110d8f304467c7a57fa85625baa63684de3bd358664736f6c6343000705003374696572206c656e67746820616e6420666565206c656e677468206e6f74207468652073616d65000000000000000000000000246c00f93001c344038a0d9cf012754b539c10140000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf900000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000004e20
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f00000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000246c00f93001c344038a0d9cf012754b539c10148a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b8a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220ffdbf6546c2e15d8d3bf059110d8f304467c7a57fa85625baa63684de3bd358664736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000246c00f93001c344038a0d9cf012754b539c10140000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf900000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000004e20
-----Decoded View---------------
Arg [0] : _customTreasury (address): 0x246c00f93001c344038A0d9Cf012754b539c1014
Arg [1] : _principalToken (address): 0x4e3FBD56CD56c3e72c1403e103b45Db9da5B9D2B
Arg [2] : _olympusTreasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _subsidyRouter (address): 0x97Fac4EA361338EaB5c89792eE196DA8712C9a4a
Arg [4] : _initialOwner (address): 0x9e2b6378ee8ad2A4A95Fe481d63CAba8FB0EBBF9
Arg [5] : _olympusDAO (address): 0x15fddc0d0397117b46903c1F6c735b55755C2a3a
Arg [6] : _tierCeilings (uint256[]): 0
Arg [7] : _fees (uint256[]): 20000
Arg [8] : _feeInPayout (bool): False
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000246c00f93001c344038a0d9cf012754b539c1014
Arg [1] : 0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a
Arg [4] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [5] : 00000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000004e20
Deployed Bytecode Sourcemap
16005:17762:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32918:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15222:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29850:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22056:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21310:550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16953:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15445:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22638:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17267:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33434:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32310:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31655:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30436:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;16914:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23465:2765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26322:1229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20456:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22984:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17430:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31294:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17212:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29454:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30099:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31863:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17070:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16988;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32918:400;32990:19;33023:18;33044:30;33062:10;33044:16;:30::i;:::-;33023:51;;33085:11;33099:8;:22;33109:10;33099:22;;;;;;;;;;;;;;;:29;;;33085:43;;33163:5;33146:13;:22;33141:170;;33203:6;33186:23;;33141:170;;;33259:40;33292:5;33259:27;33271:13;33259:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;33242:57;;33141:170;32918:400;;;;;:::o;15222:21::-;;;;;;;;;;;;:::o;29850:156::-;29897:11;29931:67;29947:49;29991:3;29947:38;29964:19;:17;:19::i;:::-;29947:11;:9;:11::i;:::-;:15;;:38;;;;:::i;:::-;:42;;:49;;;;:::i;:::-;29931:11;:9;:11::i;:::-;:15;;:67;;;;:::i;:::-;29922:76;;29850:156;:::o;22056:466::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22243:43:::1;22280:4;22243:31;22270:2;22243:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;22229:10;:57;;22220:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;22337:177;;;;;;;;22364:9;22337:177;;;;;;22394:10;22337:177;;;;22427:7;22337:177;;;;22457:7;22337:177;;;;22490:12;22337:177;;::::0;22324:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22056:466:::0;;;;:::o;21310:550::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21422:17:::1;21408:31;;;;;;;;:10;:31;;;;;;;;;21403:450;;;21481:5;21471:6;:15;;21462:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21563:6;21543:5;:17;;:26;;;;21403:450;;;21606:16;21592:30;;;;;;;;:10;:30;;;;;;;;;21587:266;;;21664:4;21654:6;:14;;21645:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;21739:6;21721:5;:15;;:24;;;;21587:266;;;21782:14;21768:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;21763:90;;;21835:6;21819:5;:13;;:22;;;;21763:90;21587:266;21403:450;21310:550:::0;;:::o;16953: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;22638:185::-;22738:10;22724:24;;:10;:24;;;22715:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22799:16;22781:15;;:34;;;;;;;;;;;;;;;;;;22638:185;:::o;17267:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33434:324::-;33484:16;33514:15;33532:8;:15;;;;33514:33;;33562:6;33558:193;33574:10;33570:1;:14;33558:193;;;33632:8;33641:1;33632:11;;;;;;;;;;;;;;;;;;:24;;;33609:20;;:47;:70;;;;33678:1;33665:10;:14;33660:1;:19;33609:70;33606:134;;;33708:8;33717:1;33708:11;;;;;;;;;;;;;;;;;;:16;;;33701:23;;;;;;33606:134;33586:3;;;;;;;33558:193;;;;33434:324;;;:::o;32310:427::-;32380:19;32413:16;;:::i;:::-;32432:8;:22;32442:10;32432:22;;;;;;;;;;;;;;;32413:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32465:20;32488:34;32506:4;:14;;;32488:12;:16;;:34;;;;:::i;:::-;32465:57;;32533:12;32548:4;:12;;;32533:27;;32588:1;32578:7;:11;32573:157;;;32624:43;32658:7;32624:28;32645:5;32624:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;32607:60;;32573:157;;;32717:1;32700:18;;32573:157;32310:427;;;;;;:::o;31655:106::-;31700:4;31725:28;31740:11;:9;:11::i;:::-;31725:9;;:13;;:28;;;;:::i;:::-;31718:35;;31655:106;:::o;30436:619::-;30492:12;30506:9;30532:11;30528:520;;30567:44;30606:3;30567:33;30579:19;:17;:19::i;:::-;30567:6;:10;;:33;;;;:::i;:::-;:37;;:44;;;;:::i;:::-;30560:51;;30636:136;30766:4;30636:124;:106;30657:14;:27;;;30693:14;30710:16;30721:4;30710:6;:10;;:16;;;;:::i;:::-;30657:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30729:11;:9;:11::i;:::-;30636:19;:106::i;:::-;:122;:124::i;:::-;:128;;:136;;;;:::i;:::-;30626:146;;30528:520;;;30805:10;30818:72;30884:4;30818:60;:42;30839:6;30847:11;:9;:11::i;:::-;30818:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;30805:85;;30915:54;30925:43;30963:3;30925:32;30936:19;:17;:19::i;:::-;30925:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30915:5;:9;;:54;;;;:::i;:::-;30905:64;;30991:43;31029:3;30991:32;31002:19;:17;:19::i;:::-;30991:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30984:50;;30528:520;;30436:619;;;:::o;16914:32::-;;;;:::o;23465:2765::-;23550:4;23598:1;23576:24;;:10;:24;;;;23567:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23634:11;:9;:11::i;:::-;23666:16;23685:15;:13;:15::i;:::-;23666:34;;23735:11;23722:9;:24;;23713:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23823:10;23836:14;:27;;;23873:14;23890:7;23836:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23823:76;;23912:11;23934:8;23958:11;23955:251;;;24002:18;24013:5;24002:9;:18::i;:::-;23986:34;;;;;;;;23955:251;;;24101:20;24112:7;24101:9;:20::i;:::-;24085:36;;;;;;;;24178:16;24190:3;24178:7;:11;;:16;;;;:::i;:::-;24168:26;;23955:251;24268:3;24243:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24237:28;;:2;:28;:34;;;;;;24227:6;:44;;24218:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24377:11;:9;:11::i;:::-;24367:6;:21;;24358:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24524:22;24539:5;24524:9;;:13;;:22;;;;:::i;:::-;24512:9;:34;;;;24581:5;:13;;;24568:9;;:26;;24559:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24711:208;;;;;;;;24740:43;24775:6;24740:8;:22;24750:10;24740:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;24711:208;;;;24807:5;:17;;;24711:208;;;;24850:12;24711:208;;;;24892:15;:13;:15::i;:::-;24711:208;;;24686:8;:22;24696:10;24686:22;;;;;;;;;;;;;;;:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24955:33;24980:7;24955:20;;:24;;:33;;;;:::i;:::-;24932:20;:56;;;;25044:28;25065:6;25044:16;;:20;;:28;;;;:::i;:::-;25025:16;:47;;;;25134:36;25162:6;25134:22;;:26;;:36;;;;:::i;:::-;25109:22;:61;;;;25212:14;:22;;;25244:14;25261:7;25212:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25286:11;25283:394;;;25314:69;25347:10;25367:4;25374:7;25314:14;:31;;;;:69;;;;;;:::i;:::-;25398:14;:22;;;25430:14;25447:7;25456:15;25467:3;25456:6;:10;;:15;;;;:::i;:::-;25398:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25283:394;;;25506:78;25539:10;25559:4;25566:16;25578:3;25566:7;:11;;:16;;;;:::i;:::-;25506:14;:31;;;;:78;;;;;;:::i;:::-;25599:14;:22;;;25631:14;25648:7;25657:6;25599:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25283:394;25709:1;25702:3;:8;25697:261;;25761:11;25758:189;;;25793:46;25818:15;;;;;;;;;;;25835:3;25793:11;:24;;;;:46;;;;;:::i;:::-;25758:189;;;25880:51;25909:15;;;;;;;;;;;25926:3;25880:14;:27;;;;:51;;;;;:::i;:::-;25758:189;25697:261;26014:69;26027:7;26036:6;26044:37;26062:5;:17;;;26044:12;:16;;:37;;;;:::i;:::-;26014:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26099:45;26117:12;:10;:12::i;:::-;26131:11;:9;:11::i;:::-;26099:45;;;;;;;;;;;;;;;;;;;;;;;;26157:8;:6;:8::i;:::-;26215:6;26208:13;;;;;;23465:2765;;;;;:::o;26322:1229::-;26376:4;26393:16;;:::i;:::-;26412:8;:22;26422:10;26412:22;;;;;;;;;;;;;;;26393:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26445:18;26466:30;26484:10;26466:16;:30::i;:::-;26445:51;;26591:5;26574:13;:22;26569:965;;26640:8;:22;26650:10;26640:22;;;;;;;;;;;;;;;;26633:29;;;;;;;;;;;;;;;;;;;;;;;;;;26702:42;26716:10;26728:4;:11;;;26741:1;26702:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26777:51;26803:10;26815:4;:11;;;26777;:24;;;;:51;;;;;:::i;:::-;26850:4;:11;;;26843:18;;;;;;26569:965;26953:11;26967:45;27005:5;26967:32;26984:13;26967:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;26953:59;;27097:249;;;;;;;;27129:25;27146:6;27129:4;:11;;;:15;;:25;;;;:::i;:::-;27097:249;;;;27182:54;27200:34;27218:4;:14;;;27200:12;:16;;:34;;;;:::i;:::-;27182:4;:12;;;:16;;:54;;;;:::i;:::-;27097:249;;;;27266:12;27097:249;;;;27312:4;:18;;;27097:249;;;27072:8;:22;27082:10;27072:22;;;;;;;;;;;;;;;:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27368:65;27382:10;27394:6;27402:8;:22;27412:10;27402:22;;;;;;;;;;;;;;;:29;;;27368:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27448:46;27474:10;27486:6;27448:11;:24;;;;:46;;;;;:::i;:::-;27516:6;27509:13;;;;;26322:1229;;;;:::o;20456:613::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20715:1:::1;20698:13;:11;:13::i;:::-;:18;20689:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20774:217;;;;;;;;20813:16;20774:217;;;;20857:12;20774:217;;;;20898:13;20774:217;;;;20937:10;20774:217;;;;20971:8;20774:217;;::::0;20766:5:::1;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21014:12;21002:9;:24;;;;21049:12;21037:9;:24;;;;20456:613:::0;;;;;;:::o;22984:254::-;23025:28;23090:13;23076:27;;:10;:27;;;23067:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23171:22;;23145:48;;23229:1;23204:22;:26;;;;22984:254;:::o;17430:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31294:262::-;31337:15;31382:166;31542:4;31382:154;:136;31417:49;31442:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31436:28;;:2;:28;31417:13;:11;:13::i;:::-;:17;;:49;;;;:::i;:::-;31482:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31382:19;:136::i;:::-;:152;:154::i;:::-;:158;;:166;;;;:::i;:::-;31369:179;;31294:262;:::o;17212:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29454:286::-;29497:11;29539:94;29592:38;29628:1;29600:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29592:31;;:35;;:38;;;;:::i;:::-;29585:2;:46;29539:40;29566:11;:9;:11::i;:::-;29539:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;29530:103;;29658:5;:18;;;29649:6;:27;29644:89;;;29703:5;:18;;;29694:27;;29644:89;29454:286;:::o;30099:138::-;30142:4;30167:62;30221:6;30167:48;30198:5;:15;;;30167:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;:52;;:62;;;;:::i;:::-;30160:69;;30099:138;:::o;31863:286::-;31906:11;31931:20;31954:29;31972:9;;31954:12;:16;;:29;;;;:::i;:::-;31931:52;;32003:57;32041:5;:17;;;32003:32;32018:15;32003:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;31994:66;;32085:9;;32076:6;:18;32071:71;;;32121:9;;32112:18;;32071:71;31863:286;;:::o;17070:21::-;;;;:::o;16988:::-;;;;:::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;28682:124::-;28735:28;28750:11;:9;:11::i;:::-;28735:9;;:13;;:28;;;;:::i;:::-;28723:9;:40;;;;28786:12;28774:9;:24;;;;28682: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;28933:370::-;28974:11;29008:94;29061:38;29097:1;29069:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29061:31;;:35;;:38;;;;:::i;:::-;29054:2;:46;29008:40;29035:11;:9;:11::i;:::-;29008:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;28999:103;;29127:5;:18;;;29118:6;:27;29113:183;;;29172:5;:18;;;29163:27;;29113:183;;;29243:1;29221:5;:18;;;:23;29216:80;;29283:1;29262:5;:18;;:22;;;;29216:80;29113:183;28933:370;:::o;27704:917::-;27742:19;27764:45;27790:10;:17;;;27764:10;:20;;;:24;;:45;;;;:::i;:::-;27742:67;;27843:1;27824:10;:15;;;:20;;:54;;;;;27864:14;27848:12;:30;;27824:54;27820:794;;;27896:12;27911:5;:21;;;27896:36;;27952:10;:14;;;;;;;;;;;;27947:494;;;28012:44;28039:10;:15;;;28012:5;:21;;;:25;;:44;;;;:::i;:::-;27988:5;:21;;:68;;;;28105:10;:17;;;28080:5;:21;;;:42;28075:112;;28166:1;28148:10;:15;;:19;;;;28075:112;27947:494;;;28251:44;28278:10;:15;;;28251:5;:21;;;:25;;:44;;;;:::i;:::-;28227:5;:21;;:68;;;;28344:10;:17;;;28319:5;:21;;;:42;28314:112;;28405:1;28387:10;:15;;:19;;;;28314:112;27947:494;28478:12;28455:10;:20;;:35;;;;28510:92;28537:7;28546:5;:21;;;28569:10;:15;;;28586:10;:14;;;;;;;;;;;;28510:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27820:794;;27704: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://ffdbf6546c2e15d8d3bf059110d8f304467c7a57fa85625baa63684de3bd3586
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $12.27 | 90.891 | $1,115.23 |
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.