Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 120 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 14634927 | 1021 days ago | IN | 0 ETH | 0.00462626 | ||||
Redeem | 14397290 | 1058 days ago | IN | 0 ETH | 0.00105035 | ||||
Redeem | 14371346 | 1062 days ago | IN | 0 ETH | 0.00081932 | ||||
Deposit | 14330685 | 1069 days ago | IN | 0 ETH | 0.00932965 | ||||
Redeem | 14326515 | 1069 days ago | IN | 0 ETH | 0.00114546 | ||||
Deposit | 14275436 | 1077 days ago | IN | 0 ETH | 0.01139281 | ||||
Redeem | 14273670 | 1077 days ago | IN | 0 ETH | 0.00282036 | ||||
Redeem | 14262701 | 1079 days ago | IN | 0 ETH | 0.00291894 | ||||
Redeem | 14229845 | 1084 days ago | IN | 0 ETH | 0.00330154 | ||||
Redeem | 14228366 | 1084 days ago | IN | 0 ETH | 0.00328166 | ||||
Deposit | 14227871 | 1084 days ago | IN | 0 ETH | 0.01845197 | ||||
Redeem | 14227858 | 1084 days ago | IN | 0 ETH | 0.00326146 | ||||
Deposit | 14223539 | 1085 days ago | IN | 0 ETH | 0.02092231 | ||||
Redeem | 14222238 | 1085 days ago | IN | 0 ETH | 0.00295069 | ||||
Deposit | 14214590 | 1087 days ago | IN | 0 ETH | 0.01482868 | ||||
Redeem | 14213369 | 1087 days ago | IN | 0 ETH | 0.00421243 | ||||
Deposit | 14203119 | 1088 days ago | IN | 0 ETH | 0.00913793 | ||||
Redeem | 14203093 | 1088 days ago | IN | 0 ETH | 0.00229148 | ||||
Redeem | 14197975 | 1089 days ago | IN | 0 ETH | 0.00289001 | ||||
Redeem | 14193338 | 1090 days ago | IN | 0 ETH | 0.00492388 | ||||
Redeem | 14190002 | 1090 days ago | IN | 0 ETH | 0.00403595 | ||||
Redeem | 14185015 | 1091 days ago | IN | 0 ETH | 0.00403918 | ||||
Deposit | 14182611 | 1091 days ago | IN | 0 ETH | 0.02375345 | ||||
Redeem | 14182445 | 1091 days ago | IN | 0 ETH | 0.00482608 | ||||
Deposit | 14175569 | 1093 days ago | IN | 0 ETH | 0.01408005 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
CustomANGLEBond
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-16 */ // 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/ANGLECustom/CustomBond.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 CustomANGLEBond 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 CustomANGLEBond.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
6101406040523480156200001257600080fd5b50604051620040013803806200400183398181016040526101208110156200003957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200009657600080fd5b83820191506020820185811115620000ad57600080fd5b8251866020820283011164010000000082111715620000cb57600080fd5b8083526020830192505050908051906020019060200280838360005b8381101562000104578082015181840152602081019050620000e7565b50505050905001604052602001805160405193929190846401000000008211156200012e57600080fd5b838201915060208201858111156200014557600080fd5b82518660208202830111640100000000821117156200016357600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200019c5780820151818401526020810190506200017f565b5050505090500160405260200180519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200023157600080fd5b8873ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508873ffffffffffffffffffffffffffffffffffffffff16634efa82b66040518163ffffffff1660e01b815260040160206040518083038186803b158015620002af57600080fd5b505afa158015620002c4573d6000803e3d6000fd5b505050506040513d6020811015620002db57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614156200035d57600080fd5b8773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff161415620003cf57600080fd5b86600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200044b57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620004be57600080fd5b846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200053957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508151835114620005cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062003fda6027913960400191505060405180910390fd5b60005b8351811015620006655760116040518060400160405280868481518110620005f357fe5b602002602001015181526020018584815181106200060d57fe5b60200260200101518152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508080600101915050620005cf565b5080151561012081151560f81b8152505050505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6101205160f81c613891620007496000398061105d528061149c52806119635280611bf7525080612301525080610d955250806110c252806113ad52806118b252806119d65280611b1d5250806110fe52806113e95280611876528061198f5280611a125280611ad65280611b595280611cb65250806115015280611c445280611f205280612118528061241952806124d652806125c252806126d15280612e5252506138916000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220295c76ba61e116c0b2c2ac0c37500dc79d9421350d1b85a7537dad2281f070c964736f6c6343000705003374696572206c656e67746820616e6420666565206c656e677468206e6f74207468652073616d6500000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc780000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce80000000000000000000000009a315bdf513367c0377fb36545857d12e85813ef00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a000000000000000000000000e02f8e39b8cfa7d3b62307e4607766901088345900000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c8578063e392a262146106e6578063f5c2ab5b14610704578063fc7b9c18146107225761018e565b8063cea55f5714610652578063d502562514610670578063d7ccfb0b146106aa5761018e565b80637cbe044c146104855780638dbdbe6d146104a357806395a2251f1461050f578063a50603b214610567578063a9bc6b71146105c7578063cd1234b3146105e55761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610740565b6040518082815260200191505060405180910390f35b6101f36107d7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107fb565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610851565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a30565b005b6102ce610c4f565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c55565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d93565b005b610374610e98565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec9565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f4f565b6040518082815260200191505060405180910390f35b610426611035565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611058565b604051808381526020018281526020019250505060405180910390f35b61048d611292565b6040518082815260200191505060405180910390f35b6104f9600480360360608110156104b957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611298565b6040518082815260200191505060405180910390f35b6105516004803603602081101561052557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dbd565b6040518082815260200191505060405180910390f35b6105c5600480360360c081101561057d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050612168565b005b6105cf6122fd565b6040518082815260200191505060405180910390f35b610627600480360360208110156105fb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506123d0565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61065a612400565b6040518082815260200191505060405180910390f35b610678612592565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106b26125b6565b6040518082815260200191505060405180910390f35b6106d06126bd565b6040518082815260200191505060405180910390f35b6106ee612791565b6040518082815260200191505060405180910390f35b61070c6127ed565b6040518082815260200191505060405180910390f35b61072a6127f3565b6040518082815260200191505060405180910390f35b60008061074c83610f4f565b90506000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905061271082106107a6578092506107d0565b6107cd6127106107bf84846127f990919063ffffffff16565b61287f90919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c610836620f4240610828610812610ec9565b61081a6125b6565b6127f990919063ffffffff16565b61287f90919063ffffffff16565b61083e6125b6565b6128c990919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61093f6103e8610931601e6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b8311156109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600c60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610afe57fe5b826002811115610b0a57fe5b1415610b7a57612710811015610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061380e6024913960400191505060405180910390fd5b80600760010181905550610c4b565b60016002811115610b8757fe5b826002811115610b9357fe5b1415610c20576103e8811115610c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600760030181905550610c4a565b600280811115610c2c57fe5b826002811115610c3857fe5b1415610c4957806007600401819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d16576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d5057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f00000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080601180549050905060005b81811015610f495760118181548110610eec57fe5b9060005260206000209060020201600001546002541080610f0f57506001820381145b15610f3c5760118181548110610f2157fe5b90600052602060002090600202016001015492505050610f4c565b8080600101915050610ed7565b50505b90565b6000610f59613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fe682604001514361295190919063ffffffff16565b905060008260200151905060008111156110285761102181611013612710856127f990919063ffffffff16565b61287f90919063ffffffff16565b935061102d565b600093505b505050919050565b6000611053611042612791565b60045461295190919063ffffffff16565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006111e3576110af620f42406110a1611092610ec9565b866127f990919063ffffffff16565b61287f90919063ffffffff16565b90506111dc64174876e8006111ce6111c97f00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc7873ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce8611130888b61295190919063ffffffff16565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561118157600080fd5b505afa158015611195573d6000803e3d6000fd5b505050506040513d60208110156111ab57600080fd5b81019080805190602001909291905050506111c46125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b915061128d565b600061121564174876e800611207611202876111fd6125b6565b61299b565b612c7c565b61287f90919063ffffffff16565b9050611258611249620f424061123b61122c610ec9565b856127f990919063ffffffff16565b61287f90919063ffffffff16565b8261295190919063ffffffff16565b9250611289620f424061127b61126c610ec9565b846127f990919063ffffffff16565b61287f90919063ffffffff16565b9150505b915091565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611344612cb8565b600061134e6107fb565b9050808410156113a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806137eb6023913960400191505060405180910390fd5b60007f00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc7873ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce8886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561145a57600080fd5b505afa15801561146e573d6000803e3d6000fd5b505050506040513d602081101561148457600080fd5b810190808051906020019092919050505090506000807f0000000000000000000000000000000000000000000000000000000000000000156114d6576114c983611058565b80925081935050506114fd565b6114df88611058565b80925081935050506114fa818961295190919063ffffffff16565b97505b60647f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561156557600080fd5b505afa158015611579573d6000803e3d6000fd5b505050506040513d602081101561158f57600080fd5b810190808051906020019092919050505060ff16600a0a816115ad57fe5b04821015611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61162b6126bd565b8211156116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6116b5836004546128c990919063ffffffff16565b6004819055506007600401546004541115611738576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b604051806080016040528061179884601260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546128c990919063ffffffff16565b815260200160076001015481526020014381526020016117b66107fb565b815250601260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050611838886002546128c990919063ffffffff16565b600281905550611853826003546128c990919063ffffffff16565b60038190555061186e826006546128c990919063ffffffff16565b6006819055507f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc788a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561192557600080fd5b505af1158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000015611abc576119d433308a7f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce873ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc7873ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce88a611a4585876128c990919063ffffffff16565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611a9f57600080fd5b505af1158015611ab3573d6000803e3d6000fd5b50505050611bed565b611b1b3330611ad4848c6128c990919063ffffffff16565b7f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce873ffffffffffffffffffffffffffffffffffffffff16612ce3909392919063ffffffff16565b7f00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc7873ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce88a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b158015611bd457600080fd5b505af1158015611be8573d6000803e3d6000fd5b505050505b60008114611cfc577f000000000000000000000000000000000000000000000000000000000000000015611c8d57611c88600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b611cfb565b611cfa600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce873ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b5b5b7fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc08883611d37600760010154436128c990919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf16611d83612e46565b611d8b612400565b604051808381526020018281526020019250505060405180910390a1611daf612f6b565b819450505050509392505050565b6000611dc7613729565b601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611e4684610f4f565b90506127108110611f7257601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611f648483600001517f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b816000015192505050612163565b6000611f9f612710611f918486600001516127f990919063ffffffff16565b61287f90919063ffffffff16565b90506040518060800160405280611fc383866000015161295190919063ffffffff16565b8152602001611ff5611fe286604001514361295190919063ffffffff16565b866020015161295190919063ffffffff16565b81526020014381526020018460600151815250601260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582601260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a161215c85827f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff16612da49092919063ffffffff16565b8093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000612233611035565b14612289576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137a96021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600760008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060048190555043600581905550505050505050565b60007f00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6006549050600060068190555090565b60126020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600061258d670de0b6b3a764000061257f61257a6124d47f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561247d57600080fd5b505afa158015612491573d6000803e3d6000fd5b505050506040513d60208110156124a757600080fd5b810190808051906020019092919050505060ff16600a0a6124c6611035565b6127f990919063ffffffff16565b7f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253a57600080fd5b505afa15801561254e573d6000803e3d6000fd5b505050506040513d602081101561256457600080fd5b810190808051906020019092919050505061299b565b612c7c565b61287f90919063ffffffff16565b905090565b60078060000154908060010154908060020154908060030154908060040154905085565b60006126a261267260057f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561262657600080fd5b505afa15801561263a573d6000803e3d6000fd5b505050506040513d602081101561265057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612694612680612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b90506007600201548110156126ba5760076002015490505b90565b600061278c620186a061277e6007600301547f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273557600080fd5b505afa158015612749573d6000803e3d6000fd5b505050506040513d602081101561275f57600080fd5b81019080805190602001909291905050506127f990919063ffffffff16565b61287f90919063ffffffff16565b905090565b6000806127a96005544361295190919063ffffffff16565b90506127d76007600101546127c9836004546127f990919063ffffffff16565b61287f90919063ffffffff16565b91506004548211156127e95760045491505b5090565b60055481565b60045481565b60008083141561280c5760009050612879565b600082840290508284828161281d57fe5b0414612874576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806137ca6021913960400191505060405180910390fd5b809150505b92915050565b60006128c183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506130d1565b905092915050565b600080828401905083811015612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061299383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613197565b905092915050565b6129a3613751565b600082116129fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806137836026913960400191505060405180910390fd5b6000831415612a3a57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612c76565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612b7357600082607060ff1685901b81612a8757fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612c76565b6000612b8f846e01000000000000000000000000000085613257565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612cb057fe5b049050919050565b612cd4612cc3612791565b60045461295190919063ffffffff16565b60048190555043600581905550565b612d9e846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b50505050565b612e418363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613319565b505050565b6000612f32612f0260057f00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612eb657600080fd5b505afa158015612eca573d6000803e3d6000fd5b505050506040513d6020811015612ee057600080fd5b810190808051906020019092919050505060ff1661295190919063ffffffff16565b600a0a612f24612f10612400565b6007600001546127f990919063ffffffff16565b61287f90919063ffffffff16565b9050600760020154811015612f4e576007600201549050612f68565b600060076002015414612f675760006007600201819055505b5b90565b6000612f8a600c60030154600c600401546128c990919063ffffffff16565b90506000600c6001015414158015612fa25750804310155b156130ce5760006007600001549050600c60000160009054906101000a900460ff161561301157612fe6600c600101546007600001546128c990919063ffffffff16565b600760000181905550600c600201546007600001541061300c576000600c600101819055505b613055565b61302e600c6001015460076000015461295190919063ffffffff16565b600760000181905550600c6002015460076000015411613054576000600c600101819055505b5b43600c600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600760000154600c60010154600c60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b6000808311829061317d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613142578082015181840152602081019050613127565b50505050905090810190601f16801561316f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161318957fe5b049050809150509392505050565b6000838311158290613244576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156132095780820151818401526020810190506131ee565b50505050905090810190601f1680156132365780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060006132668686613408565b915091506000848061327457fe5b868809905082811115613288576001820391505b8083039250848210613302576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61330d83838761345b565b93505050509392505050565b606061337b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134f89092919063ffffffff16565b90506000815111156134035780806020019051602081101561339c57600080fd5b8101908080519060200190929190505050613402576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613832602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061343557fe5b84860990508385029250828103915082811015613453576001820391505b509250929050565b600080826000038316905080838161346f57fe5b04925080858161347b57fe5b049450600181826000038161348c57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606135078484600085613510565b90509392505050565b606061351b85613716565b61358d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106135dd57805182526020820191506020810190506020830392506135ba565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461363f576040519150601f19603f3d011682016040523d82523d6000602084013e613644565b606091505b5091509150811561365957809250505061370e565b60008151111561366c5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d35780820151818401526020810190506136b8565b50505050905090810190601f1680156137005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220295c76ba61e116c0b2c2ac0c37500dc79d9421350d1b85a7537dad2281f070c964736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc780000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce80000000000000000000000009a315bdf513367c0377fb36545857d12e85813ef00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a000000000000000000000000e02f8e39b8cfa7d3b62307e4607766901088345900000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000008214
-----Decoded View---------------
Arg [0] : _customTreasury (address): 0x40AdeDc0b097717583eD2C97645eB46e5B58CC78
Arg [1] : _principalToken (address): 0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8
Arg [2] : _olympusTreasury (address): 0x9A315BdF513367C0377FB36545857d12e85813Ef
Arg [3] : _subsidyRouter (address): 0x97Fac4EA361338EaB5c89792eE196DA8712C9a4a
Arg [4] : _initialOwner (address): 0xe02F8E39b8cFA7d3b62307E46077669010883459
Arg [5] : _olympusDAO (address): 0x15fddc0d0397117b46903c1F6c735b55755C2a3a
Arg [6] : _tierCeilings (uint256[]): 0
Arg [7] : _fees (uint256[]): 33300
Arg [8] : _feeInPayout (bool): False
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000040adedc0b097717583ed2c97645eb46e5b58cc78
Arg [1] : 0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce8
Arg [2] : 0000000000000000000000009a315bdf513367c0377fb36545857d12e85813ef
Arg [3] : 00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a
Arg [4] : 000000000000000000000000e02f8e39b8cfa7d3b62307e46077669010883459
Arg [5] : 00000000000000000000000015fddc0d0397117b46903c1f6c735b55755c2a3a
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000008214
Deployed Bytecode Sourcemap
16002:17763:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32916:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15222:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29848:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22054:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21308:550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16951:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15445:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22636:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17265:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33432:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32308:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31653:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30434:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;16912:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23463:2765;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26320:1229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20454:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22982:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31292:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17210:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29452:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30097:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31861:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17068:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16986;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32916:400;32988:19;33021:18;33042:30;33060:10;33042:16;:30::i;:::-;33021:51;;33083:11;33097:8;:22;33107:10;33097:22;;;;;;;;;;;;;;;:29;;;33083:43;;33161:5;33144:13;:22;33139:170;;33201:6;33184:23;;33139:170;;;33257:40;33290:5;33257:27;33269:13;33257:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;33240:57;;33139:170;32916:400;;;;;:::o;15222:21::-;;;;;;;;;;;;:::o;29848:156::-;29895:11;29929:67;29945:49;29989:3;29945:38;29962:19;:17;:19::i;:::-;29945:11;:9;:11::i;:::-;:15;;:38;;;;:::i;:::-;:42;;:49;;;;:::i;:::-;29929:11;:9;:11::i;:::-;:15;;:67;;;;:::i;:::-;29920:76;;29848:156;:::o;22054:466::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22241:43:::1;22278:4;22241:31;22268:2;22241:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;22227:10;:57;;22218:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;22335:177;;;;;;;;22362:9;22335:177;;;;;;22392:10;22335:177;;;;22425:7;22335:177;;;;22455:7;22335:177;;;;22488:12;22335:177;;::::0;22322:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22054:466:::0;;;;:::o;21308:550::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21420:17:::1;21406:31;;;;;;;;:10;:31;;;;;;;;;21401:450;;;21479:5;21469:6;:15;;21460:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21561:6;21541:5;:17;;:26;;;;21401:450;;;21604:16;21590:30;;;;;;;;:10;:30;;;;;;;;;21585:266;;;21662:4;21652:6;:14;;21643:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;21737:6;21719:5;:15;;:24;;;;21585:266;;;21780:14;21766:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;21761:90;;;21833:6;21817:5;:13;;:22;;;;21761:90;21585:266;21401:450;21308:550:::0;;:::o;16951: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;22636:185::-;22736:10;22722:24;;:10;:24;;;22713:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22797:16;22779:15;;:34;;;;;;;;;;;;;;;;;;22636:185;:::o;17265:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33432:324::-;33482:16;33512:15;33530:8;:15;;;;33512:33;;33560:6;33556:193;33572:10;33568:1;:14;33556:193;;;33630:8;33639:1;33630:11;;;;;;;;;;;;;;;;;;:24;;;33607:20;;:47;:70;;;;33676:1;33663:10;:14;33658:1;:19;33607:70;33604:134;;;33706:8;33715:1;33706:11;;;;;;;;;;;;;;;;;;:16;;;33699:23;;;;;;33604:134;33584:3;;;;;;;33556:193;;;;33432:324;;;:::o;32308:427::-;32378:19;32411:16;;:::i;:::-;32430:8;:22;32440:10;32430:22;;;;;;;;;;;;;;;32411:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32463:20;32486:34;32504:4;:14;;;32486:12;:16;;:34;;;;:::i;:::-;32463:57;;32531:12;32546:4;:12;;;32531:27;;32586:1;32576:7;:11;32571:157;;;32622:43;32656:7;32622:28;32643:5;32622:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;32605:60;;32571:157;;;32715:1;32698:18;;32571:157;32308:427;;;;;;:::o;31653:106::-;31698:4;31723:28;31738:11;:9;:11::i;:::-;31723:9;;:13;;:28;;;;:::i;:::-;31716:35;;31653:106;:::o;30434:619::-;30490:12;30504:9;30530:11;30526:520;;30565:44;30604:3;30565:33;30577:19;:17;:19::i;:::-;30565:6;:10;;:33;;;;:::i;:::-;:37;;:44;;;;:::i;:::-;30558:51;;30634:136;30764:4;30634:124;:106;30655:14;:27;;;30691:14;30708:16;30719:4;30708:6;:10;;:16;;;;:::i;:::-;30655:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30727:11;:9;:11::i;:::-;30634:19;:106::i;:::-;:122;:124::i;:::-;:128;;:136;;;;:::i;:::-;30624:146;;30526:520;;;30803:10;30816:72;30882:4;30816:60;:42;30837:6;30845:11;:9;:11::i;:::-;30816:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;30803:85;;30913:54;30923:43;30961:3;30923:32;30934:19;:17;:19::i;:::-;30923:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30913:5;:9;;:54;;;;:::i;:::-;30903:64;;30989:43;31027:3;30989:32;31000:19;:17;:19::i;:::-;30989:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30982:50;;30526:520;;30434:619;;;:::o;16912:32::-;;;;:::o;23463:2765::-;23548:4;23596:1;23574:24;;:10;:24;;;;23565:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23632:11;:9;:11::i;:::-;23664:16;23683:15;:13;:15::i;:::-;23664:34;;23733:11;23720:9;:24;;23711:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23821:10;23834:14;:27;;;23871:14;23888:7;23834:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23821:76;;23910:11;23932:8;23956:11;23953:251;;;24000:18;24011:5;24000:9;:18::i;:::-;23984:34;;;;;;;;23953:251;;;24099:20;24110:7;24099:9;:20::i;:::-;24083:36;;;;;;;;24176:16;24188:3;24176:7;:11;;:16;;;;:::i;:::-;24166:26;;23953:251;24266:3;24241:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24235:28;;:2;:28;:34;;;;;;24225:6;:44;;24216:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24375:11;:9;:11::i;:::-;24365:6;:21;;24356:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24522:22;24537:5;24522:9;;:13;;:22;;;;:::i;:::-;24510:9;:34;;;;24579:5;:13;;;24566:9;;:26;;24557:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24709:208;;;;;;;;24738:43;24773:6;24738:8;:22;24748:10;24738:22;;;;;;;;;;;;;;;:29;;;:33;;:43;;;;:::i;:::-;24709:208;;;;24805:5;:17;;;24709:208;;;;24848:12;24709:208;;;;24890:15;:13;:15::i;:::-;24709:208;;;24684:8;:22;24694:10;24684:22;;;;;;;;;;;;;;;:233;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24953:33;24978:7;24953:20;;:24;;:33;;;;:::i;:::-;24930:20;:56;;;;25042:28;25063:6;25042:16;;:20;;:28;;;;:::i;:::-;25023:16;:47;;;;25132:36;25160:6;25132:22;;:26;;:36;;;;:::i;:::-;25107:22;:61;;;;25210:14;:22;;;25242:14;25259:7;25210:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25284:11;25281:394;;;25312:69;25345:10;25365:4;25372:7;25312:14;:31;;;;:69;;;;;;:::i;:::-;25396:14;:22;;;25428:14;25445:7;25454:15;25465:3;25454:6;:10;;:15;;;;:::i;:::-;25396:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25281:394;;;25504:78;25537:10;25557:4;25564:16;25576:3;25564:7;:11;;:16;;;;:::i;:::-;25504:14;:31;;;;:78;;;;;;:::i;:::-;25597:14;:22;;;25629:14;25646:7;25655:6;25597:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25281:394;25707:1;25700:3;:8;25695:261;;25759:11;25756:189;;;25791:46;25816:15;;;;;;;;;;;25833:3;25791:11;:24;;;;:46;;;;;:::i;:::-;25756:189;;;25878:51;25907:15;;;;;;;;;;;25924:3;25878:14;:27;;;;:51;;;;;:::i;:::-;25756:189;25695:261;26012:69;26025:7;26034:6;26042:37;26060:5;:17;;;26042:12;:16;;:37;;;;:::i;:::-;26012:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26097:45;26115:12;:10;:12::i;:::-;26129:11;:9;:11::i;:::-;26097:45;;;;;;;;;;;;;;;;;;;;;;;;26155:8;:6;:8::i;:::-;26213:6;26206:13;;;;;;23463:2765;;;;;:::o;26320:1229::-;26374:4;26391:16;;:::i;:::-;26410:8;:22;26420:10;26410:22;;;;;;;;;;;;;;;26391:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26443:18;26464:30;26482:10;26464:16;:30::i;:::-;26443:51;;26589:5;26572:13;:22;26567:965;;26638:8;:22;26648:10;26638:22;;;;;;;;;;;;;;;;26631:29;;;;;;;;;;;;;;;;;;;;;;;;;;26700:42;26714:10;26726:4;:11;;;26739:1;26700:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26775:51;26801:10;26813:4;:11;;;26775;:24;;;;:51;;;;;:::i;:::-;26848:4;:11;;;26841:18;;;;;;26567:965;26951:11;26965:45;27003:5;26965:32;26982:13;26965:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;26951:59;;27095:249;;;;;;;;27127:25;27144:6;27127:4;:11;;;:15;;:25;;;;:::i;:::-;27095:249;;;;27180:54;27198:34;27216:4;:14;;;27198:12;:16;;:34;;;;:::i;:::-;27180:4;:12;;;:16;;:54;;;;:::i;:::-;27095:249;;;;27264:12;27095:249;;;;27310:4;:18;;;27095:249;;;27070:8;:22;27080:10;27070:22;;;;;;;;;;;;;;;:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27366:65;27380:10;27392:6;27400:8;:22;27410:10;27400:22;;;;;;;;;;;;;;;:29;;;27366:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27446:46;27472:10;27484:6;27446:11;:24;;;;:46;;;;;:::i;:::-;27514:6;27507:13;;;;;26320:1229;;;;:::o;20454:613::-;15365:10;15355:20;;:6;;;;;;;;;;:20;;;15346:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20713:1:::1;20696:13;:11;:13::i;:::-;:18;20687:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20772:217;;;;;;;;20811:16;20772:217;;;;20855:12;20772:217;;;;20896:13;20772:217;;;;20935:10;20772:217;;;;20969:8;20772:217;;::::0;20764:5:::1;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21012:12;21000:9;:24;;;;21047:12;21035:9;:24;;;;20454:613:::0;;;;;;:::o;22982:254::-;23023:28;23088:13;23074:27;;:10;:27;;;23065:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23169:22;;23143:48;;23227:1;23202:22;:26;;;;22982:254;:::o;17428:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31292:262::-;31335:15;31380:166;31540:4;31380:154;:136;31415:49;31440:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31434:28;;:2;:28;31415:13;:11;:13::i;:::-;:17;;:49;;;;:::i;:::-;31480:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31380:19;:136::i;:::-;:152;:154::i;:::-;:158;;:166;;;;:::i;:::-;31367:179;;31292:262;:::o;17210:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29452:286::-;29495:11;29537:94;29590:38;29626:1;29598:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29590:31;;:35;;:38;;;;:::i;:::-;29583:2;:46;29537:40;29564:11;:9;:11::i;:::-;29537:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;29528:103;;29656:5;:18;;;29647:6;:27;29642:89;;;29701:5;:18;;;29692:27;;29642:89;29452:286;:::o;30097:138::-;30140:4;30165:62;30219:6;30165:48;30196:5;:15;;;30165:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;:52;;:62;;;;:::i;:::-;30158:69;;30097:138;:::o;31861:286::-;31904:11;31929:20;31952:29;31970:9;;31952:12;:16;;:29;;;;:::i;:::-;31929:52;;32001:57;32039:5;:17;;;32001:32;32016:15;32001:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;31992:66;;32083:9;;32074:6;:18;32069:71;;;32119:9;;32110:18;;32069:71;31861:286;;:::o;17068:21::-;;;;:::o;16986:::-;;;;:::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;28680:124::-;28733:28;28748:11;:9;:11::i;:::-;28733:9;;:13;;:28;;;;:::i;:::-;28721:9;:40;;;;28784:12;28772:9;:24;;;;28680: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;28931:370::-;28972:11;29006:94;29059:38;29095:1;29067:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29059:31;;:35;;:38;;;;:::i;:::-;29052:2;:46;29006:40;29033:11;:9;:11::i;:::-;29006:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;28997:103;;29125:5;:18;;;29116:6;:27;29111:183;;;29170:5;:18;;;29161:27;;29111:183;;;29241:1;29219:5;:18;;;:23;29214:80;;29281:1;29260:5;:18;;:22;;;;29214:80;29111:183;28931:370;:::o;27702:917::-;27740:19;27762:45;27788:10;:17;;;27762:10;:20;;;:24;;:45;;;;:::i;:::-;27740:67;;27841:1;27822:10;:15;;;:20;;:54;;;;;27862:14;27846:12;:30;;27822:54;27818:794;;;27894:12;27909:5;:21;;;27894:36;;27950:10;:14;;;;;;;;;;;;27945:494;;;28010:44;28037:10;:15;;;28010:5;:21;;;:25;;:44;;;;:::i;:::-;27986:5;:21;;:68;;;;28103:10;:17;;;28078:5;:21;;;:42;28073:112;;28164:1;28146:10;:15;;:19;;;;28073:112;27945:494;;;28249:44;28276:10;:15;;;28249:5;:21;;;:25;;:44;;;;:::i;:::-;28225:5;:21;;:68;;;;28342:10;:17;;;28317:5;:21;;;:42;28312:112;;28403:1;28385:10;:15;;:19;;;;28312:112;27945:494;28476:12;28453:10;:20;;:35;;;;28508:92;28535:7;28544:5;:21;;;28567:10;:15;;;28584:10;:14;;;;;;;;;;;;28508:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27818:794;;27702: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://295c76ba61e116c0b2c2ac0c37500dc79d9421350d1b85a7537dad2281f070c9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.