Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 379 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 19837139 | 225 days ago | IN | 0 ETH | 0.00038057 | ||||
Redeem | 12699648 | 1275 days ago | IN | 0 ETH | 0.00191914 | ||||
Redeem | 12698265 | 1275 days ago | IN | 0 ETH | 0.00126894 | ||||
Redeem | 12698248 | 1275 days ago | IN | 0 ETH | 0.00074644 | ||||
Redeem | 12697673 | 1275 days ago | IN | 0 ETH | 0.00164216 | ||||
Redeem | 12696110 | 1275 days ago | IN | 0 ETH | 0.00148572 | ||||
Redeem | 12696068 | 1275 days ago | IN | 0 ETH | 0.0011597 | ||||
Redeem | 12693890 | 1276 days ago | IN | 0 ETH | 0.00118857 | ||||
Redeem | 12693862 | 1276 days ago | IN | 0 ETH | 0.00149104 | ||||
Redeem | 12691628 | 1276 days ago | IN | 0 ETH | 0.00267429 | ||||
Redeem | 12691511 | 1276 days ago | IN | 0 ETH | 0.00282286 | ||||
Redeem | 12690796 | 1276 days ago | IN | 0 ETH | 0.00283647 | ||||
Redeem | 12690481 | 1276 days ago | IN | 0 ETH | 0.00104501 | ||||
Redeem | 12689444 | 1276 days ago | IN | 0 ETH | 0.00265075 | ||||
Redeem | 12688413 | 1277 days ago | IN | 0 ETH | 0.00198806 | ||||
Redeem | 12688265 | 1277 days ago | IN | 0 ETH | 0.00164891 | ||||
Redeem | 12688053 | 1277 days ago | IN | 0 ETH | 0.00282286 | ||||
Redeem | 12687273 | 1277 days ago | IN | 0 ETH | 0.00358101 | ||||
Redeem | 12687218 | 1277 days ago | IN | 0 ETH | 0.00297136 | ||||
Redeem | 12686848 | 1277 days ago | IN | 0 ETH | 0.0022698 | ||||
Redeem | 12686482 | 1277 days ago | IN | 0 ETH | 0.00118029 | ||||
Redeem | 12686432 | 1277 days ago | IN | 0 ETH | 0.00133822 | ||||
Redeem | 12684913 | 1277 days ago | IN | 0 ETH | 0.02054332 | ||||
Redeem | 12684908 | 1277 days ago | IN | 0 ETH | 0.01484019 | ||||
Redeem | 12682955 | 1277 days ago | IN | 0 ETH | 0.00579852 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
OlympusBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-28 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function manager() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function manager() public view override returns (address) { return _owner; } modifier onlyManager() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyManager() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyManager() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); } interface IBondCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } contract OlympusBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; event BondCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BondRedeemed( uint indexed payout, uint indexed remaining ); event BondPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); address public immutable OHM; // Token given as payment for bond address public immutable principle; // Token used to create bond address public immutable treasury; // Mints OHM when receives principle address public immutable DAO; // Receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // Calculates value of LP tokens address public staking; constructor ( address _OHM, address _principle, address _treasury, address _DAO, address _bondCalculator, uint _controlVariable, uint _minimumPrice ) { require( _OHM != address(0) ); OHM = _OHM; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _DAO != address(0) ); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = ( _bondCalculator != address(0) ); terms.controlVariable = _controlVariable; terms.minimumPrice = _minimumPrice; } /* Bond holder information */ struct Bond { uint valueRemaining; // value of principle given uint payoutRemaining; // OHM remaining to be paid uint vestingPeriod; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In DAI, for front end viewing } mapping( address => Bond ) public bondInfo; // Stores bond information for depositor /* New bond terms */ struct Terms { uint controlVariable; // scaling variable for price uint vestingTerm; // in blocks uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) } Terms public terms; // Stores terms for new bonds // Total value of outstanding bonds uint public totalDebt; // Used for pricing /** @notice set parameters of new bonds @param _vestingTerm uint @param _maxPayout uint @param _fee uint @return bool */ function setBondTerms ( uint _vestingTerm, // Length in blocks for bond to vest uint _minimumPrice, // lowest price for bond uint _maxPayout, // Maximum amount (as % of circ supply) a bond can pay out uint _fee // Amount of profits DAO takes ) external onlyManager() returns ( bool ) { require( _vestingTerm >= 10000, "Vesting must be longer than 36 hours" ); require( _maxPayout <= 1000, "Payout cannot be above 1 percent" ); require( _fee <= 10000, "DAO fee cannot exceed payout" ); terms.vestingTerm = _vestingTerm; terms.minimumPrice = _minimumPrice; terms.maxPayout = _maxPayout; terms.fee = _fee; return true; } /** Info for incremental adjustments to control variable */ struct Adjust { bool add; uint rate; uint target; } Adjust public adjustment; /** @notice set control variable adjustment @param _addition bool @param _increment uint @param _target uint */ function setAdjustment ( bool _addition, uint _increment, uint _target ) external onlyManager() { require( _increment <= terms.controlVariable.mul( 25 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target }); } /** @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" ); uint priceInUSD = bondPriceInUSD(); // Stored in bond info uint nativePrice = _bondPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value; if( isLiquidityBond ) { // LP is calculated at risk-free value value = IBondCalculator( bondCalculator ).valuation( principle, _amount ); } else { // reserve is converted to OHM decimals value = _amount.mul( 10 ** IERC20( OHM ).decimals() ).div( 10 ** IERC20( principle ).decimals() ); } uint payout = payoutFor( value ); // payout to bonder is computed require( payout >= 10000000, "Bond too small" ); // must be > 0.01 OHM ( underflow protection ) require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // calculate profits uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury returning (_amount - profit) OHM */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); // fee is transferred to dao IERC20( OHM ).safeTransfer( DAO, fee ); // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored Bond memory info = bondInfo[ _depositor ]; bondInfo[ _depositor ] = Bond({ valueRemaining: info.valueRemaining.add( value ), // add on to previous payoutRemaining: info.payoutRemaining.add( payout ), // amounts if they exist vestingPeriod: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // emit indexed events emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD ); emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); adjust(); // adjustment control variable return payout; } /** @notice redeem all unvested bonds @param _stake bool @return payout_ uint */ function redeem( bool _stake ) external returns ( uint ) { Bond memory info = bondInfo[ msg.sender ]; uint percentVested = percentVestedFor( msg.sender ); // (blocks since last interaction / vesting term remaining) if ( percentVested >= 10000 ) { // if fully vested delete bondInfo[msg.sender]; // delete user info totalDebt = totalDebt.sub( info.valueRemaining ); // reduce debt emit BondRedeemed( info.payoutRemaining, 0 ); // emit bond data return stakeOrSend( _stake, info.payoutRemaining ); // pay user everything due } else { // if unfinished // calculate payout vested uint value = info.valueRemaining.mul( percentVested ).div( 10000 ); uint payout = info.payoutRemaining.mul( percentVested ).div( 10000 ); uint blocksSinceLast = block.number.sub( info.lastBlock ); // store updated deposit info bondInfo[ msg.sender ] = Bond({ valueRemaining: info.valueRemaining.sub( value ), payoutRemaining: info.payoutRemaining.sub( payout ), vestingPeriod: info.vestingPeriod.sub( blocksSinceLast ), lastBlock: block.number, pricePaid: info.pricePaid }); // reduce total debt by vested amount totalDebt = totalDebt.sub( value ); emit BondRedeemed( payout, bondInfo[ msg.sender ].payoutRemaining ); return stakeOrSend( _stake, payout ); } } /** @notice allow user to stake payout automatically @param _stake bool @param _amount uint @return uint */ function stakeOrSend( bool _stake, uint _amount ) internal returns ( uint ) { emit BondPriceChanged( bondPriceInUSD(), _bondPrice(), debtRatio() ); if ( !_stake ) { // if user does not want to stake IERC20( OHM ).transfer( msg.sender, _amount ); // send payout } else { // if user wants to stake IERC20( OHM ).approve( staking, _amount ); IStaking( staking ).stake( _amount, msg.sender ); // stake payout } return _amount; } /** @notice makes incremental adjustment to control variable */ function adjust() internal { if( adjustment.rate != 0 ) { 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; } } } } /** @notice determine maximum bond size @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( OHM ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** @notice calculate current bond premium @return price_ uint */ function bondPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** @notice calculate current bond price and remove floor if above @return price_ uint */ function _bondPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** @notice converts bond price to DAI value @return price_ uint */ function bondPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBond ) { price_ = bondPrice().mul( IBondCalculator( bondCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = bondPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** @notice calculate current ratio of payouts to OHM supply @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( OHM ).totalSupply(); debtRatio_ = FixedPoint.fraction( totalDebt.mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** @notice calculate interest due for new bond @param _value uint @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e16 ); } /** @notice calculate 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 vestingPeriod = bond.vestingPeriod; if ( vestingPeriod > 0 ) { percentVested_ = blocksSinceLast.mul( 10000 ).div( vestingPeriod ); } else { percentVested_ = 0; } } /** @notice calculate amount of OHM available for claim by depositor @param _depositor address @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payoutRemaining = bondInfo[ _depositor ].payoutRemaining; if ( percentVested >= 10000 ) { pendingPayout_ = payoutRemaining; } else { pendingPayout_ = payoutRemaining.mul( percentVested ).div( 10000 ); } } /** @notice initializes auto-stake redemptions @param _staking address @return bool */ function setStaking( address _staking ) external onlyManager() returns ( bool ) { require( _staking != address(0) ); require( staking == address(0) ); staking = _staking; return true; } /** @notice allow anyone to send lost tokens (excluding principle or OHM) to the DAO @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != OHM ); require( _token != principle ); IERC20( _token ).safeTransfer( DAO, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_OHM","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","type":"address"},{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OHM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"valueRemaining","type":"uint256"},{"internalType":"uint256","name":"payoutRemaining","type":"uint256"},{"internalType":"uint256","name":"vestingPeriod","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[],"name":"isLiquidityBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setBondTerms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"}],"name":"setStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b5060405162003ff538038062003ff5833981810160405260e08110156200003857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156200017b57600080fd5b8673ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415620001ed57600080fd5b8573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200025f57600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620002d157600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b8152505081600460000181905550806004600201819055505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c613b8b6200046a60003980611236528061155952806124ce5250806112085280611533528061263c525080611b4b5280611f7052806123dc5250806111a752806119a25280611a5352508061081d5280611272528061134b5280611595528061164d528061191f52806119665280611a9052806123805250806116f75280611b6d5280611f945280612327528061252b52806126d9528061310552806131d75250613b8b6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638ff39099116100f9578063cea55f5711610097578063d7ccfb0b11610071578063d7ccfb0b1461077d578063e0176de81461079b578063f2dff968146107b9578063fc7b9c18146107fd576101c4565b8063cea55f5714610705578063d502562514610723578063d79690601461075d576101c4565b8063ab49b786116100d3578063ab49b786146105bf578063b4abccba14610603578063c5332b7c1461065d578063cd1234b314610691576101c4565b80638ff39099146104fd57806398fabd3a14610557578063a6c41fec1461058b576101c4565b8063507930ec1161016657806361d027b31161014057806361d027b3146103fd5780637927ebf814610431578063844b5c7c146104735780638dbdbe6d14610491576101c4565b8063507930ec14610339578063508efd31146103915780635a96ac0a146103f3576101c4565b8063451ee4a1116101a2578063451ee4a11461025f57806346f68ee91461028d578063481c6a75146102d15780634cf088d914610305576101c4565b8063016a4284146101c957806301b88ee8146101fd578063089208d814610255575b600080fd5b6101d161081b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61023f6004803603602081101561021357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061083f565b6040518082815260200191505060405180910390f35b61025d6108d6565b005b610267610a55565b604051808415158152602001838152602001828152602001935050505060405180910390f35b6102cf600480360360208110156102a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a7a565b005b6102d9610c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61030d610ca8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037b6004803603602081101561034f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cce565b6040518082815260200191505060405180910390f35b6103db600480360360808110156103a757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610dbe565b60405180821515815260200191505060405180910390f35b6103fb610fff565b005b6104056111a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61045d6004803603602081101561044757600080fd5b81019080803590602001909291905050506111c9565b6040518082815260200191505060405180910390f35b61047b611204565b6040518082815260200191505060405180910390f35b6104e7600480360360608110156104a757600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141a565b6040518082815260200191505060405180910390f35b61053f6004803603602081101561051357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dcc565b60405180821515815260200191505060405180910390f35b61055f611f6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610593611f92565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105ed600480360360208110156105d557600080fd5b81019080803515159060200190929190505050611fb6565b6040518082815260200191505060405180910390f35b6106456004803603602081101561061957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612323565b60405180821515815260200191505060405180910390f35b6106656124cc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106d3600480360360208110156106a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124f0565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61070d612526565b6040518082815260200191505060405180910390f35b61072b612616565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61076561263a565b60405180821515815260200191505060405180910390f35b61078561265e565b6040518082815260200191505060405180910390f35b6107a36126c5565b6040518082815260200191505060405180910390f35b6107fb600480360360608110156107cf57600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050612799565b005b610805612957565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061084b83610cce565b90506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905061271082106108a5578092506108cf565b6108cc6127106108be848461295d90919063ffffffff16565b6129e390919063ffffffff16565b92505b5050919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600a8060000160009054906101000a900460ff16908060010154908060020154905083565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a566026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cd86139f5565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000610d6f826060015143612a2d90919063ffffffff16565b90506000826040015190506000811115610db157610daa81610d9c6127108561295d90919063ffffffff16565b6129e390919063ffffffff16565b9350610db6565b600093505b505050919050565b60003373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612710851015610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613b086024913960400191505060405180910390fd5b6103e8831115610f54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b612710821115610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b84600460010181905550836004600201819055508260046003018190555081600480018190555060019050949350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613a7c6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006111fd662386f26fc100006111ef6111ea856111e561265e565b612a77565b612d58565b6129e390919063ffffffff16565b9050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000156113415761133a606461132c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112db57600080fd5b505afa1580156112ef573d6000803e3d6000fd5b505050506040513d602081101561130557600080fd5b810190808051906020019092919050505061131e61265e565b61295d90919063ffffffff16565b6129e390919063ffffffff16565b9050611417565b61141460646114067f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113af57600080fd5b505afa1580156113c3573d6000803e3d6000fd5b505050506040513d60208110156113d957600080fd5b810190808051906020019092919050505060ff16600a0a6113f861265e565b61295d90919063ffffffff16565b6129e390919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b60006114c8611204565b905060006114d4612d94565b90508085101561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613ae56023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000015611648577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634249719f7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d602081101561163057600080fd5b810190808051906020019092919050505090506117bc565b6117b97f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b157600080fd5b505afa1580156116c5573d6000803e3d6000fd5b505050506040513d60208110156116db57600080fd5b810190808051906020019092919050505060ff16600a0a6117ab7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b810190808051906020019092919050505060ff16600a0a8a61295d90919063ffffffff16565b6129e390919063ffffffff16565b90505b60006117c7826111c9565b905062989680811015611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61184a6126c5565b8111156118bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006118ec6127106118de60048001548561295d90919063ffffffff16565b6129e390919063ffffffff16565b90506000611915826119078587612a2d90919063ffffffff16565b612a2d90919063ffffffff16565b905061196433308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612e19909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b505050506040513d6020811015611b3457600080fd5b810190808051906020019092919050505050611bb17f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612eda9092919063ffffffff16565b611bc684600954612f7c90919063ffffffff16565b600981905550611bd46139f5565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a00160405280611c74878460000151612f7c90919063ffffffff16565b8152602001611c90868460200151612f7c90919063ffffffff16565b8152602001600460010154815260200143815260200188815250600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505086611d3760046001015443612f7c90919063ffffffff16565b857f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58e6040518082815260200191505060405180910390a4611d77612526565b611d7f612d94565b611d87611204565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4611dbb613004565b839750505050505050509392505050565b60003373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f2457600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611fc06139f5565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600061204933610cce565b9050612710811061212757600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000905550506120d78260000151600954612a2d90919063ffffffff16565b600981905550600082602001517ff7cb4fd3cb7bacbd7412c1ae5150a50b1ed6e125533064337a34163f0e47049860405160405180910390a361211e8483602001516130b8565b9250505061231e565b600061215461271061214684866000015161295d90919063ffffffff16565b6129e390919063ffffffff16565b9050600061218361271061217585876020015161295d90919063ffffffff16565b6129e390919063ffffffff16565b9050600061219e856060015143612a2d90919063ffffffff16565b90506040518060a001604052806121c2858860000151612a2d90919063ffffffff16565b81526020016121de848860200151612a2d90919063ffffffff16565b81526020016121fa838860400151612a2d90919063ffffffff16565b81526020014381526020018660800151815250600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505061229683600954612a2d90919063ffffffff16565b600981905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154827ff7cb4fd3cb7bacbd7412c1ae5150a50b1ed6e125533064337a34163f0e47049860405160405180910390a361231687836130b8565b955050505050505b919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561237e57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d757600080fd5b6124c37f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d602081101561248c57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16612eda9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d60208110156125b957600080fd5b81019080805190602001909291905050509050612610670de0b6b3a76400006126026125fd6125f7633b9aca0060095461295d90919063ffffffff16565b85612a77565b612d58565b6129e390919063ffffffff16565b91505090565b60048060000154908060010154908060020154908060030154908060040154905085565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006126aa6298968061269c633b9aca0061268e61267a612526565b60046000015461295d90919063ffffffff16565b612f7c90919063ffffffff16565b6129e390919063ffffffff16565b90506004600201548110156126c25760046002015490505b90565b6000612794620186a06127866004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273d57600080fd5b505afa158015612751573d6000803e3d6000fd5b505050506040513d602081101561276757600080fd5b810190808051906020019092919050505061295d90919063ffffffff16565b6129e390919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461285a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128876103e8612879601960046000015461295d90919063ffffffff16565b6129e390919063ffffffff16565b8211156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060600160405280841515815260200183815260200182815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155905050505050565b60095481565b60008083141561297057600090506129dd565b600082840290508284828161298157fe5b04146129d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ac46021913960400191505060405180910390fd5b809150505b92915050565b6000612a2583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061339d565b905092915050565b6000612a6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613463565b905092915050565b612a7f613a24565b60008211612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a9e6026913960400191505060405180910390fd5b6000831415612b1657604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612d52565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612c4f57600082607060ff1685901b81612b6357fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612d52565b6000612c6b846e01000000000000000000000000000085613523565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612d21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612d8c57fe5b049050919050565b6000612de062989680612dd2633b9aca00612dc4612db0612526565b60046000015461295d90919063ffffffff16565b612f7c90919063ffffffff16565b6129e390919063ffffffff16565b9050600460020154811015612dfc576004600201549050612e16565b600060046002015414612e155760006004600201819055505b5b90565b612ed4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135e5565b50505050565b612f778363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135e5565b505050565b600080828401905083811015612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600a60010154146130b657600a60000160009054906101000a900460ff161561307157613046600a60010154600460000154612f7c90919063ffffffff16565b600460000181905550600a600201546004600001541061306c576000600a600101819055505b6130b5565b61308e600a60010154600460000154612a2d90919063ffffffff16565b600460000181905550600a60020154600460000154116130b4576000600a600101819055505b5b5b565b60006130c2612526565b6130ca612d94565b6130d2611204565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4826131d5577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319457600080fd5b505af11580156131a8573d6000803e3d6000fd5b505050506040513d60208110156131be57600080fd5b810190808051906020019092919050505050613394565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561328857600080fd5b505af115801561329c573d6000803e3d6000fd5b505050506040513d60208110156132b257600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561335757600080fd5b505af115801561336b573d6000803e3d6000fd5b505050506040513d602081101561338157600080fd5b8101908080519060200190929190505050505b81905092915050565b60008083118290613449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340e5780820151818401526020810190506133f3565b50505050905090810190601f16801561343b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161345557fe5b049050809150509392505050565b6000838311158290613510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134d55780820151818401526020810190506134ba565b50505050905090810190601f1680156135025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080600061353286866136d4565b915091506000848061354057fe5b868809905082811115613554576001820391505b80830392508482106135ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b6135d9838387613727565b93505050509392505050565b6060613647826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137c49092919063ffffffff16565b90506000815111156136cf5780806020019051602081101561366857600080fd5b81019080805190602001909291905050506136ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613b2c602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061370157fe5b8486099050838502925082810391508281101561371f576001820391505b509250929050565b600080826000038316905080838161373b57fe5b04925080858161374757fe5b049450600181826000038161375857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606137d384846000856137dc565b90509392505050565b60606137e7856139e2565b613859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106138a95780518252602082019150602081019050602083039250613886565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461390b576040519150601f19603f3d011682016040523d82523d6000602084013e613910565b606091505b509150915081156139255780925050506139da565b6000815111156139385780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561399f578082015181840152602081019050613984565b50505050905090810190601f1680156139cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220f6024c85076ebb80ec89638444e60f389696e17da3386054669d22c2b77a3e6464736f6c63430007050033000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a00000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000578
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638ff39099116100f9578063cea55f5711610097578063d7ccfb0b11610071578063d7ccfb0b1461077d578063e0176de81461079b578063f2dff968146107b9578063fc7b9c18146107fd576101c4565b8063cea55f5714610705578063d502562514610723578063d79690601461075d576101c4565b8063ab49b786116100d3578063ab49b786146105bf578063b4abccba14610603578063c5332b7c1461065d578063cd1234b314610691576101c4565b80638ff39099146104fd57806398fabd3a14610557578063a6c41fec1461058b576101c4565b8063507930ec1161016657806361d027b31161014057806361d027b3146103fd5780637927ebf814610431578063844b5c7c146104735780638dbdbe6d14610491576101c4565b8063507930ec14610339578063508efd31146103915780635a96ac0a146103f3576101c4565b8063451ee4a1116101a2578063451ee4a11461025f57806346f68ee91461028d578063481c6a75146102d15780634cf088d914610305576101c4565b8063016a4284146101c957806301b88ee8146101fd578063089208d814610255575b600080fd5b6101d161081b565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61023f6004803603602081101561021357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061083f565b6040518082815260200191505060405180910390f35b61025d6108d6565b005b610267610a55565b604051808415158152602001838152602001828152602001935050505060405180910390f35b6102cf600480360360208110156102a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a7a565b005b6102d9610c7f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61030d610ca8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61037b6004803603602081101561034f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cce565b6040518082815260200191505060405180910390f35b6103db600480360360808110156103a757600080fd5b8101908080359060200190929190803590602001909291908035906020019092919080359060200190929190505050610dbe565b60405180821515815260200191505060405180910390f35b6103fb610fff565b005b6104056111a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61045d6004803603602081101561044757600080fd5b81019080803590602001909291905050506111c9565b6040518082815260200191505060405180910390f35b61047b611204565b6040518082815260200191505060405180910390f35b6104e7600480360360608110156104a757600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141a565b6040518082815260200191505060405180910390f35b61053f6004803603602081101561051357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dcc565b60405180821515815260200191505060405180910390f35b61055f611f6e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610593611f92565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105ed600480360360208110156105d557600080fd5b81019080803515159060200190929190505050611fb6565b6040518082815260200191505060405180910390f35b6106456004803603602081101561061957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612323565b60405180821515815260200191505060405180910390f35b6106656124cc565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106d3600480360360208110156106a757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124f0565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61070d612526565b6040518082815260200191505060405180910390f35b61072b612616565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61076561263a565b60405180821515815260200191505060405180910390f35b61078561265e565b6040518082815260200191505060405180910390f35b6107a36126c5565b6040518082815260200191505060405180910390f35b6107fb600480360360608110156107cf57600080fd5b810190808035151590602001909291908035906020019092919080359060200190929190505050612799565b005b610805612957565b6040518082815260200191505060405180910390f35b7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c81565b60008061084b83610cce565b90506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905061271082106108a5578092506108cf565b6108cc6127106108be848461295d90919063ffffffff16565b6129e390919063ffffffff16565b92505b5050919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600a8060000160009054906101000a900460ff16908060010154908060020154905083565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a566026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cd86139f5565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506000610d6f826060015143612a2d90919063ffffffff16565b90506000826040015190506000811115610db157610daa81610d9c6127108561295d90919063ffffffff16565b6129e390919063ffffffff16565b9350610db6565b600093505b505050919050565b60003373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612710851015610edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613b086024913960400191505060405180910390fd5b6103e8831115610f54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b612710821115610fcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b84600460010181905550836004600201819055508260046003018190555081600480018190555060019050949350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613a7c6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e881565b60006111fd662386f26fc100006111ef6111ea856111e561265e565b612a77565b612d58565b6129e390919063ffffffff16565b9050919050565b60007f0000000000000000000000000000000000000000000000000000000000000001156113415761133a606461132c7f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a73ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156112db57600080fd5b505afa1580156112ef573d6000803e3d6000fd5b505050506040513d602081101561130557600080fd5b810190808051906020019092919050505061131e61265e565b61295d90919063ffffffff16565b6129e390919063ffffffff16565b9050611417565b61141460646114067f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113af57600080fd5b505afa1580156113c3573d6000803e3d6000fd5b505050506040513d60208110156113d957600080fd5b810190808051906020019092919050505060ff16600a0a6113f861265e565b61295d90919063ffffffff16565b6129e390919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b60006114c8611204565b905060006114d4612d94565b90508085101561152f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613ae56023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000115611648577f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a73ffffffffffffffffffffffffffffffffffffffff16634249719f7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561160657600080fd5b505afa15801561161a573d6000803e3d6000fd5b505050506040513d602081101561163057600080fd5b810190808051906020019092919050505090506117bc565b6117b97f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156116b157600080fd5b505afa1580156116c5573d6000803e3d6000fd5b505050506040513d60208110156116db57600080fd5b810190808051906020019092919050505060ff16600a0a6117ab7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561175b57600080fd5b505afa15801561176f573d6000803e3d6000fd5b505050506040513d602081101561178557600080fd5b810190808051906020019092919050505060ff16600a0a8a61295d90919063ffffffff16565b6129e390919063ffffffff16565b90505b60006117c7826111c9565b905062989680811015611842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61184a6126c5565b8111156118bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006118ec6127106118de60048001548561295d90919063ffffffff16565b6129e390919063ffffffff16565b90506000611915826119078587612a2d90919063ffffffff16565b612a2d90919063ffffffff16565b905061196433308c7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c73ffffffffffffffffffffffffffffffffffffffff16612e19909392919063ffffffff16565b7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e88c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b8101908080519060200190929190505050507f00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e873ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611b0a57600080fd5b505af1158015611b1e573d6000803e3d6000fd5b505050506040513d6020811015611b3457600080fd5b810190808051906020019092919050505050611bb17f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b837f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff16612eda9092919063ffffffff16565b611bc684600954612f7c90919063ffffffff16565b600981905550611bd46139f5565b600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152505090506040518060a00160405280611c74878460000151612f7c90919063ffffffff16565b8152602001611c90868460200151612f7c90919063ffffffff16565b8152602001600460010154815260200143815260200188815250600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505086611d3760046001015443612f7c90919063ffffffff16565b857f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58e6040518082815260200191505060405180910390a4611d77612526565b611d7f612d94565b611d87611204565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4611dbb613004565b839750505050505050509392505050565b60003373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ec957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f2457600080fd5b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b81565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89981565b6000611fc06139f5565b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815250509050600061204933610cce565b9050612710811061212757600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055600482016000905550506120d78260000151600954612a2d90919063ffffffff16565b600981905550600082602001517ff7cb4fd3cb7bacbd7412c1ae5150a50b1ed6e125533064337a34163f0e47049860405160405180910390a361211e8483602001516130b8565b9250505061231e565b600061215461271061214684866000015161295d90919063ffffffff16565b6129e390919063ffffffff16565b9050600061218361271061217585876020015161295d90919063ffffffff16565b6129e390919063ffffffff16565b9050600061219e856060015143612a2d90919063ffffffff16565b90506040518060a001604052806121c2858860000151612a2d90919063ffffffff16565b81526020016121de848860200151612a2d90919063ffffffff16565b81526020016121fa838860400151612a2d90919063ffffffff16565b81526020014381526020018660800151815250600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015590505061229683600954612a2d90919063ffffffff16565b600981905550600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154827ff7cb4fd3cb7bacbd7412c1ae5150a50b1ed6e125533064337a34163f0e47049860405160405180910390a361231687836130b8565b955050505050505b919050565b60007f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561237e57600080fd5b7f00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123d757600080fd5b6124c37f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561246257600080fd5b505afa158015612476573d6000803e3d6000fd5b505050506040513d602081101561248c57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff16612eda9092919063ffffffff16565b60019050919050565b7f000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a81565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154905085565b6000807f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561258f57600080fd5b505afa1580156125a3573d6000803e3d6000fd5b505050506040513d60208110156125b957600080fd5b81019080805190602001909291905050509050612610670de0b6b3a76400006126026125fd6125f7633b9aca0060095461295d90919063ffffffff16565b85612a77565b612d58565b6129e390919063ffffffff16565b91505090565b60048060000154908060010154908060020154908060030154908060040154905085565b7f000000000000000000000000000000000000000000000000000000000000000181565b60006126aa6298968061269c633b9aca0061268e61267a612526565b60046000015461295d90919063ffffffff16565b612f7c90919063ffffffff16565b6129e390919063ffffffff16565b90506004600201548110156126c25760046002015490505b90565b6000612794620186a06127866004600301547f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561273d57600080fd5b505afa158015612751573d6000803e3d6000fd5b505050506040513d602081101561276757600080fd5b810190808051906020019092919050505061295d90919063ffffffff16565b6129e390919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461285a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128876103e8612879601960046000015461295d90919063ffffffff16565b6129e390919063ffffffff16565b8211156128fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060600160405280841515815260200183815260200182815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155905050505050565b60095481565b60008083141561297057600090506129dd565b600082840290508284828161298157fe5b04146129d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ac46021913960400191505060405180910390fd5b809150505b92915050565b6000612a2583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061339d565b905092915050565b6000612a6f83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613463565b905092915050565b612a7f613a24565b60008211612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613a9e6026913960400191505060405180910390fd5b6000831415612b1657604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612d52565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff168311612c4f57600082607060ff1685901b81612b6357fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612c1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612d52565b6000612c6b846e01000000000000000000000000000085613523565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115612d21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612d8c57fe5b049050919050565b6000612de062989680612dd2633b9aca00612dc4612db0612526565b60046000015461295d90919063ffffffff16565b612f7c90919063ffffffff16565b6129e390919063ffffffff16565b9050600460020154811015612dfc576004600201549050612e16565b600060046002015414612e155760006004600201819055505b5b90565b612ed4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135e5565b50505050565b612f778363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506135e5565b505050565b600080828401905083811015612ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000600a60010154146130b657600a60000160009054906101000a900460ff161561307157613046600a60010154600460000154612f7c90919063ffffffff16565b600460000181905550600a600201546004600001541061306c576000600a600101819055505b6130b5565b61308e600a60010154600460000154612a2d90919063ffffffff16565b600460000181905550600a60020154600460000154116130b4576000600a600101819055505b5b5b565b60006130c2612526565b6130ca612d94565b6130d2611204565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a4826131d5577f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561319457600080fd5b505af11580156131a8573d6000803e3d6000fd5b505050506040513d60208110156131be57600080fd5b810190808051906020019092919050505050613394565b7f000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89973ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561328857600080fd5b505af115801561329c573d6000803e3d6000fd5b505050506040513d60208110156132b257600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783336040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561335757600080fd5b505af115801561336b573d6000803e3d6000fd5b505050506040513d602081101561338157600080fd5b8101908080519060200190929190505050505b81905092915050565b60008083118290613449576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561340e5780820151818401526020810190506133f3565b50505050905090810190601f16801561343b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161345557fe5b049050809150509392505050565b6000838311158290613510576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134d55780820151818401526020810190506134ba565b50505050905090810190601f1680156135025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080600061353286866136d4565b915091506000848061354057fe5b868809905082811115613554576001820391505b80830392508482106135ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b6135d9838387613727565b93505050509392505050565b6060613647826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166137c49092919063ffffffff16565b90506000815111156136cf5780806020019051602081101561366857600080fd5b81019080805190602001909291905050506136ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613b2c602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061370157fe5b8486099050838502925082810391508281101561371f576001820391505b509250929050565b600080826000038316905080838161373b57fe5b04925080858161374757fe5b049450600181826000038161375857fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b60606137d384846000856137dc565b90509392505050565b60606137e7856139e2565b613859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106138a95780518252602082019150602081019050602083039250613886565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461390b576040519150601f19603f3d011682016040523d82523d6000602084013e613910565b606091505b509150915081156139255780925050506139da565b6000815111156139385780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561399f578082015181840152602081019050613984565b50505050905090810190601f1680156139cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220f6024c85076ebb80ec89638444e60f389696e17da3386054669d22c2b77a3e6464736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a89900000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a00000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000578
-----Decoded View---------------
Arg [0] : _OHM (address): 0x383518188C0C6d7730D91b2c03a03C837814a899
Arg [1] : _principle (address): 0x34d7d7Aaf50AD4944B70B320aCB24C95fa2def7c
Arg [2] : _treasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [3] : _DAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [4] : _bondCalculator (address): 0xcaaA6a2d4B26067a391E7B7D65C16bb2d5FA571A
Arg [5] : _controlVariable (uint256): 200
Arg [6] : _minimumPrice (uint256): 1400
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899
Arg [1] : 00000000000000000000000034d7d7aaf50ad4944b70b320acb24c95fa2def7c
Arg [2] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [3] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [4] : 000000000000000000000000caaa6a2d4b26067a391e7b7d65c16bb2d5fa571a
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000578
Deployed Bytecode Sourcemap
21109:14354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21614:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34259:436;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;921:159;;;:::i;:::-;;24892:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1088:261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;694:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22011:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33636:451;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23972:740;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1361:221;;;:::i;:::-;;21684:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33314:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32461:331;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25635:2578;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34828:226;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21761:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21544;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28342:1583;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35192:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21932:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;23170:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32919:266;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23643:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21833:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31623:261;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31380:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25084:376;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23745:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21614:34;;;:::o;34259:436::-;34331:19;34364:18;34385:30;34403:10;34385:16;:30::i;:::-;34364:51;;34426:20;34449:8;:22;34459:10;34449:22;;;;;;;;;;;;;;;:38;;;34426:61;;34522:5;34505:13;:22;34500:188;;34562:15;34545:32;;34500:188;;;34627:49;34669:5;34627:36;34648:13;34627:15;:19;;:36;;;;:::i;:::-;:40;;:49;;;;:::i;:::-;34610:66;;34500:188;34259:436;;;;;:::o;921:159::-;845:10;835:20;;:6;;;;;;;;;;:20;;;826:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1038:1:::1;1005:37;;1022:6;::::0;::::1;;;;;;;;1005:37;;;;;;;;;;;;1070:1;1053:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;921:159::o:0;24892:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1088:261::-;845:10;835:20;;:6;;;;;;;;;;:20;;;826:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1212:1:::1;1191:23;;:9;:23;;;;1182:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1298:9;1273:36;;1290:6;::::0;::::1;;;;;;;;1273:36;;;;;;;;;;;;1332:9;1320;;:21;;;;;;;;;;;;;;;;;;1088:261:::0;:::o;694:90::-;743:7;770:6;;;;;;;;;;;763:13;;694:90;:::o;22011:22::-;;;;;;;;;;;;;:::o;33636:451::-;33706:19;33739:16;;:::i;:::-;33758:8;:22;33768:10;33758:22;;;;;;;;;;;;;;;33739:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33791:20;33814:34;33832:4;:14;;;33814:12;:16;;:34;;;;:::i;:::-;33791:57;;33859:18;33880:4;:18;;;33859:39;;33932:1;33916:13;:17;33911:169;;;33968:49;34002:13;33968:28;33989:5;33968:15;:19;;:28;;;;:::i;:::-;:32;;:49;;;;:::i;:::-;33951:66;;33911:169;;;34067:1;34050:18;;33911:169;33636:451;;;;;;:::o;23972:740::-;24291:4;845:10;835:20;;:6;;;;;;;;;;:20;;;826:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24334:5:::1;24318:12;:21;;24309:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24415:4;24401:10;:18;;24392:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24485:5;24477:4;:13;;24468:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;24557:12;24537:5;:17;;:32;;;;24601:13;24580:5;:18;;:34;;;;24643:10;24625:5;:15;;:28;;;;24676:4;24664:5;:9:::0;::::1;:16;;;;24700:4;24693:11;;23972:740:::0;;;;;;:::o;1361:221::-;1445:9;;;;;;;;;;;1431:23;;:10;:23;;;1422:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1534:9;;;;;;;;;;;1509:36;;1526:6;;;;;;;;;;1509:36;;;;;;;;;;;;1565:9;;;;;;;;;;;1556:6;;:18;;;;;;;;;;;;;;;;;;1361:221::o;21684:33::-;;;:::o;33314:161::-;33370:4;33395:72;33461:4;33395:60;:42;33416:6;33424:11;:9;:11::i;:::-;33395:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;33388:79;;33314:161;;;:::o;32461:331::-;32509:11;32538:15;32534:251;;;32580:85;32660:3;32580:74;32614:14;32597:42;;;32641:9;32597:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32580:11;:9;:11::i;:::-;:15;;:74;;;;:::i;:::-;:78;;:85;;;;:::i;:::-;32571:94;;32534:251;;;32707:66;32768:3;32707:55;32738:9;32730:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32724:36;;:2;:36;32707:11;:9;:11::i;:::-;:15;;:55;;;;:::i;:::-;:59;;:66;;;;:::i;:::-;32698:75;;32534:251;32461:331;:::o;25635:2578::-;25757:4;25806:1;25784:24;;:10;:24;;;;25775:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25850:15;25868:16;:14;:16::i;:::-;25850:34;;25918:16;25937:12;:10;:12::i;:::-;25918:31;;25984:11;25971:9;:24;;25962:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26072:10;26097:15;26093:333;;;26194:14;26177:43;;;26222:9;26233:7;26177:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26169:73;;26093:333;;;26324:89;26389:9;26381:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26375:36;;:2;:36;26324:45;26351:3;26343:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26337:30;;:2;:30;26324:7;:11;;:45;;;;:::i;:::-;:49;;:89;;;;:::i;:::-;26316:97;;26093:333;26436:11;26450:18;26461:5;26450:9;:18::i;:::-;26436:32;;26532:8;26522:6;:18;;26513:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26637:11;:9;:11::i;:::-;26627:6;:21;;26618:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26758:8;26769:36;26798:5;26769:23;26781:5;:9;;;26769:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;26758:47;;26816:11;26830:30;26855:3;26830:19;26841:6;26830:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;26816:44;;27053:74;27091:10;27111:4;27118:7;27061:9;27053:36;;;;:74;;;;;;:::i;:::-;27146:9;27138:27;;;27176:8;27188:7;27138:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27219:8;27208:29;;;27239:7;27248:9;27259:6;27208:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27327:38;27355:3;27360;27335;27327:26;;;;:38;;;;;:::i;:::-;27435:22;27450:5;27435:9;;:13;;:22;;;;:::i;:::-;27423:9;:34;;;;27524:16;;:::i;:::-;27543:8;:22;27553:10;27543:22;;;;;;;;;;;;;;;27524:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27601:316;;;;;;;;27638:32;27663:5;27638:4;:19;;;:23;;:32;;;;:::i;:::-;27601:316;;;;27725:34;27751:6;27725:4;:20;;;:24;;:34;;;;:::i;:::-;27601:316;;;;27814:5;:17;;;27601:316;;;;27857:12;27601:316;;;;27895:10;27601:316;;;27576:8;:22;27586:10;27576:22;;;;;;;;;;;;;;;:341;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28037:10;27998:37;28016:5;:17;;;27998:12;:16;;:37;;;;:::i;:::-;27990:6;27968:81;27981:7;27968:81;;;;;;;;;;;;;;;;;;28115:11;:9;:11::i;:::-;28101:12;:10;:12::i;:::-;28083:16;:14;:16::i;:::-;28065:63;;;;;;;;;;28141:8;:6;:8::i;:::-;28198:6;28191:13;;;;;;;;;25635:2578;;;;;:::o;34828:226::-;34901:4;845:10;835:20;;:6;;;;;;;;;;:20;;;826:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34948:1:::1;34928:22;;:8;:22;;;;34919:33;;;::::0;::::1;;34991:1;34972:21;;:7;;;;;;;;;;;:21;;;34963:32;;;::::0;::::1;;35016:8;35006:7;;:18;;;;;;;;;;;;;;;;;;35042:4;35035:11;;34828:226:::0;;;:::o;21761:28::-;;;:::o;21544:::-;;;:::o;28342:1583::-;28392:4;28418:16;;:::i;:::-;28437:8;:22;28447:10;28437:22;;;;;;;;;;;;;;;28418:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28470:18;28491:30;28509:10;28491:16;:30::i;:::-;28470:51;;28616:5;28599:13;:22;28594:1324;;28665:8;:20;28674:10;28665:20;;;;;;;;;;;;;;;;28658:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28732:36;28747:4;:19;;;28732:9;;:13;;:36;;;;:::i;:::-;28720:9;:48;;;;28839:1;28817:4;:20;;;28803:39;;;;;;;;;;28882:43;28895:6;28903:4;:20;;;28882:11;:43::i;:::-;28875:50;;;;;;28594:1324;29044:10;29057:53;29103:5;29057:40;29082:13;29057:4;:19;;;:23;;:40;;;;:::i;:::-;:44;;:53;;;;:::i;:::-;29044:66;;29125:11;29139:54;29186:5;29139:41;29165:13;29139:4;:20;;;:24;;:41;;;;:::i;:::-;:45;;:54;;;;:::i;:::-;29125:68;;29208:20;29231:34;29249:4;:14;;;29231:12;:16;;:34;;;;:::i;:::-;29208:57;;29350:319;;;;;;;;29390:32;29415:5;29390:4;:19;;;:23;;:32;;;;:::i;:::-;29350:319;;;;29458:34;29484:6;29458:4;:20;;;:24;;:34;;;;:::i;:::-;29350:319;;;;29526:41;29550:15;29526:4;:18;;;:22;;:41;;;;:::i;:::-;29350:319;;;;29597:12;29350:319;;;;29639:4;:14;;;29350:319;;;29325:8;:22;29335:10;29325:22;;;;;;;;;;;;;;;:344;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29749:22;29764:5;29749:9;;:13;;:22;;;;:::i;:::-;29737:9;:34;;;;29815:8;:22;29825:10;29815:22;;;;;;;;;;;;;;;:38;;;29807:6;29793:62;;;;;;;;;;29877:29;29890:6;29898;29877:11;:29::i;:::-;29870:36;;;;;;;28342:1583;;;;:::o;35192:268::-;35255:4;35292:3;35282:13;;:6;:13;;;;35273:24;;;;;;35327:9;35317:19;;:6;:19;;;;35308:30;;;;;;35349:81;35380:3;35393:6;35385:26;;;35421:4;35385:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35357:6;35349:29;;;;:81;;;;;:::i;:::-;35448:4;35441:11;;35192:268;;;:::o;21932:39::-;;;:::o;23170:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32919:266::-;32962:15;32994:11;33016:3;33008:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32994:41;;33059:118;33171:4;33059:106;:88;33094:20;33109:3;33094:9;;:13;;:20;;;;:::i;:::-;33130:6;33059:19;:88::i;:::-;:104;:106::i;:::-;:110;;:118;;;;:::i;:::-;33046:131;;32919:266;;:::o;23643:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21833:37::-;;;:::o;31623:261::-;31666:11;31708:69;31772:3;31708:58;31754:10;31708:40;31735:11;:9;:11::i;:::-;31708:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;31699:78;;31802:5;:18;;;31793:6;:27;31788:89;;;31847:5;:18;;;31838:27;;31788:89;31623:261;:::o;31380:140::-;31423:4;31448:64;31504:6;31448:50;31481:5;:15;;;31456:3;31448:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;31441:71;;31380:140;:::o;25084:376::-;845:10;835:20;;:6;;;;;;;;;;:20;;;826:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25249:43:::1;25286:4;25249:31;25276:2;25249:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;25235:10;:57;;25226:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25343:109;;;;;;;;25370:9;25343:109;;;;;;25400:10;25343:109;;;;25433:7;25343:109;;::::0;25330:10:::1;:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25084:376:::0;;;:::o;23745:21::-;;;;:::o;2148:250::-;2206:7;2235:1;2230;:6;2226:47;;;2260:1;2253:8;;;;2226:47;2285:9;2301:1;2297;:5;2285:17;;2330:1;2325;2321;:5;;;;;;:10;2313:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2389:1;2382:8;;;2148:250;;;;;:::o;2406:132::-;2464:7;2491:39;2495:1;2498;2491:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2484:46;;2406:132;;;;:::o;1804:136::-;1862:7;1889:43;1893:1;1896;1889:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1882:50;;1804:136;;;;:::o;19961:719::-;20042:16;;:::i;:::-;20093:1;20079:11;:15;20071:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20165:1;20152:9;:14;20148:50;;;20175:23;;;;;;;;20196:1;20175:23;;;;;20168:30;;;;20148:50;20236:2;20215:24;;:9;:24;20211:462;;20256:14;20301:11;19387:3;20274:23;;:9;:23;;20273:39;;;;;;20256:56;;20353:2;20335:21;;:6;:21;;20327:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20413:26;;;;;;;;20431:6;20413:26;;;;;20406:33;;;;;20211:462;20472:14;20489:45;20505:9;19429:31;20522:11;20489:15;:45::i;:::-;20472:62;;20575:2;20557:21;;:6;:21;;20549:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20635:26;;;;;;;;20653:6;20635:26;;;;;20628:33;;;19961:719;;;;;:::o;19816:137::-;19887:4;19929:16;19918:4;:7;;;19913:13;;:32;;;;;;19906:39;;19816:137;;;:::o;32011:345::-;32052:11;32086:69;32150:3;32086:58;32132:10;32086:40;32113:11;:9;:11::i;:::-;32086:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;32077:78;;32180:5;:18;;;32171:6;:27;32166:183;;;32225:5;:18;;;32216:27;;32166:183;;;32296:1;32274:5;:18;;;:23;32269:80;;32336:1;32315:5;:18;;:22;;;;32269:80;32166:183;32011:345;:::o;16498:205::-;16599:96;16619:5;16649:27;;;16678:4;16684:2;16688:5;16626:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16599:19;:96::i;:::-;16498:205;;;;:::o;16313:177::-;16396:86;16416:5;16446:23;;;16471:2;16475:5;16423:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16396:19;:86::i;:::-;16313:177;;;:::o;1615:181::-;1673:7;1693:9;1709:1;1705;:5;1693:17;;1734:1;1729;:6;;1721:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1787:1;1780:8;;;1615:181;;;;:::o;30695:592::-;30756:1;30737:10;:15;;;:20;30733:547;;30780:10;:14;;;;;;;;;;;;30775:494;;;30840:44;30867:10;:15;;;30840:5;:21;;;:25;;:44;;;;:::i;:::-;30816:5;:21;;:68;;;;30933:10;:17;;;30908:5;:21;;;:42;30903:112;;30994:1;30976:10;:15;;:19;;;;30903:112;30775:494;;;31079:44;31106:10;:15;;;31079:5;:21;;;:25;;:44;;;;:::i;:::-;31055:5;:21;;:68;;;;31172:10;:17;;;31147:5;:21;;;:42;31142:112;;31233:1;31215:10;:15;;:19;;;;31142:112;30775:494;30733:547;30695:592::o;30088:515::-;30157:4;30230:11;:9;:11::i;:::-;30216:12;:10;:12::i;:::-;30198:16;:14;:16::i;:::-;30180:63;;;;;;;;;;30262:6;30256:315;;30328:3;30320:22;;;30344:10;30356:7;30320:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30256:315;;;30447:3;30439:21;;;30462:7;;;;;;;;;;;30471;30439:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30505:7;;;;;;;;;;;30495:25;;;30522:7;30531:10;30495:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30256:315;30588:7;30581:14;;30088:515;;;;:::o;2546:189::-;2632:7;2664:1;2660;:5;2667:12;2652:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2691:9;2707:1;2703;:5;;;;;;2691:17;;2726:1;2719:8;;;2546:189;;;;;:::o;1948:192::-;2034:7;2067:1;2062;:6;;2070:12;2054:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2094:9;2110:1;2106;:5;2094:17;;2131:1;2124:8;;;1948:192;;;;;:::o;18861:347::-;18967:7;18988:9;18999;19012:13;19020:1;19023;19012:7;:13::i;:::-;18987:38;;;;19036:10;19062:1;19049:15;;;;;19059:1;19056;19049:15;19036:28;;19084:1;19079:2;:6;19075:18;;;19092:1;19087:6;;;;19075:18;19109:2;19104:7;;;;19134:1;19130;:5;19122:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19184:16;19192:1;19195;19198;19184:7;:16::i;:::-;19177:23;;;;;18861:347;;;;;:::o;17702:420::-;17785:23;17811:69;17839:4;17811:69;;;;;;;;;;;;;;;;;17819:5;17811:27;;;;:69;;;;;:::i;:::-;17785:95;;17915:1;17895:10;:17;:21;17891:224;;;18037:10;18026:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18018:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17891:224;17702:420;;;:::o;18153:210::-;18214:9;18225;18247:10;18281:2;18260:25;;;;;18270:1;18267;18260:25;18247:38;;18304:1;18300;:5;18296:9;;18325:1;18320:2;:6;18316:10;;18346:1;18341:2;:6;18337:18;;;18354:1;18349:6;;;;18337:18;18153:210;;;;;;:::o;18371:482::-;18477:7;18497:12;18517:1;18516:2;;18512:1;:6;18497:21;;18534:4;18529:9;;;;;;;;;18554:4;18549:9;;;;;;;;;18596:1;18589:4;18581;18580:5;;18579:14;;;;;;:18;18574:1;:24;18569:29;;;;18609:9;18621:1;18609:13;;18646:1;18642;:5;18638:1;:9;18633:14;;;;18671:1;18667;:5;18663:1;:9;18658:14;;;;18696:1;18692;:5;18688:1;:9;18683:14;;;;18721:1;18717;:5;18713:1;:9;18708:14;;;;18746:1;18742;:5;18738:1;:9;18733:14;;;;18771:1;18767;:5;18763:1;:9;18758:14;;;;18796:1;18792;:5;18788:1;:9;18783:14;;;;18821:1;18817;:5;18813:1;:9;18808:14;;;;18844:1;18840;:5;18833:12;;;;18371:482;;;;;:::o;4247:196::-;4350:12;4382:53;4405:6;4413:4;4419:1;4422:12;4382:22;:53::i;:::-;4375:60;;4247:196;;;;;:::o;5223:979::-;5353:12;5386:18;5397:6;5386:10;:18::i;:::-;5378:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5512:12;5526:23;5553:6;:11;;5573:8;5584:4;5553:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5511:78;;;;5604:7;5600:595;;;5635:10;5628:17;;;;;;5600:595;5769:1;5749:10;:17;:21;5745:439;;;6012:10;6006:17;6073:15;6060:10;6056:2;6052:19;6045:44;5960:148;6155:12;6148:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5223:979;;;;;;;:::o;3420:233::-;3480:4;3499:12;3610:7;3598:20;3590:28;;3644:1;3637:4;:8;3630:15;;;3420:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://f6024c85076ebb80ec89638444e60f389696e17da3386054669d22c2b77a3e64
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.