Feature Tip: Add private address tag to any address under My Name Tag !
Latest 25 from a total of 760 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Redeem | 14832640 | 1370 days ago | IN | 0 ETH | 0.00115363 | ||||
| Redeem | 14816605 | 1372 days ago | IN | 0 ETH | 0.00168864 | ||||
| Redeem | 14796773 | 1375 days ago | IN | 0 ETH | 0.00100361 | ||||
| Redeem | 14795038 | 1376 days ago | IN | 0 ETH | 0.00143902 | ||||
| Redeem | 14778799 | 1378 days ago | IN | 0 ETH | 0.00091762 | ||||
| Redeem | 14764891 | 1381 days ago | IN | 0 ETH | 0.00441806 | ||||
| Redeem | 14764855 | 1381 days ago | IN | 0 ETH | 0.00454618 | ||||
| Redeem | 14762647 | 1381 days ago | IN | 0 ETH | 0.00865442 | ||||
| Redeem | 14758104 | 1382 days ago | IN | 0 ETH | 0.00661936 | ||||
| Redeem | 14746021 | 1384 days ago | IN | 0 ETH | 0.00420886 | ||||
| Redeem | 14743439 | 1384 days ago | IN | 0 ETH | 0.01064995 | ||||
| Redeem | 14732641 | 1386 days ago | IN | 0 ETH | 0.00173587 | ||||
| Redeem | 14704683 | 1390 days ago | IN | 0 ETH | 0.00354075 | ||||
| Redeem | 14683178 | 1394 days ago | IN | 0 ETH | 0.00227385 | ||||
| Redeem | 14680611 | 1394 days ago | IN | 0 ETH | 0.00472079 | ||||
| Redeem | 14660575 | 1397 days ago | IN | 0 ETH | 0.00502009 | ||||
| Redeem | 14651964 | 1398 days ago | IN | 0 ETH | 0.00117722 | ||||
| Redeem | 14642476 | 1400 days ago | IN | 0 ETH | 0.00128422 | ||||
| Redeem | 14638657 | 1401 days ago | IN | 0 ETH | 0.00162715 | ||||
| Redeem | 14627855 | 1402 days ago | IN | 0 ETH | 0.00347522 | ||||
| Redeem | 14626867 | 1402 days ago | IN | 0 ETH | 0.00210334 | ||||
| Redeem | 14626757 | 1402 days ago | IN | 0 ETH | 0.00293483 | ||||
| Redeem | 14625273 | 1403 days ago | IN | 0 ETH | 0.00240181 | ||||
| Redeem | 14621398 | 1403 days ago | IN | 0 ETH | 0.0027777 | ||||
| Redeem | 14621397 | 1403 days ago | IN | 0 ETH | 0.00193267 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 13291728 | 1611 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CustomBond
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-09-25
*/
// File contracts/libraries/SafeMath.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function sqrrt(uint256 a) internal pure returns (uint c) {
if (a > 3) {
c = a;
uint b = add( div( a, 2), 1 );
while (b < c) {
c = b;
b = div( add( div( a, b ), b), 2 );
}
} else if (a != 0) {
c = 1;
}
}
}
// File contracts/libraries/Address.sol
pragma solidity 0.7.5;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function addressToString(address _address) internal pure returns(string memory) {
bytes32 _bytes = bytes32(uint256(_address));
bytes memory HEX = "0123456789abcdef";
bytes memory _addr = new bytes(42);
_addr[0] = '0';
_addr[1] = 'x';
for(uint256 i = 0; i < 20; i++) {
_addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)];
_addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
}
return string(_addr);
}
}
// File contracts/interfaces/IERC20.sol
pragma solidity 0.7.5;
interface IERC20 {
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/libraries/SafeERC20.sol
pragma solidity 0.7.5;
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/libraries/FullMath.sol
pragma solidity 0.7.5;
library FullMath {
function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) {
uint256 mm = mulmod(x, y, uint256(-1));
l = x * y;
h = mm - l;
if (mm < l) h -= 1;
}
function fullDiv(
uint256 l,
uint256 h,
uint256 d
) private pure returns (uint256) {
uint256 pow2 = d & -d;
d /= pow2;
l /= pow2;
l += h * ((-pow2) / pow2 + 1);
uint256 r = 1;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
r *= 2 - d * r;
return l * r;
}
function mulDiv(
uint256 x,
uint256 y,
uint256 d
) internal pure returns (uint256) {
(uint256 l, uint256 h) = fullMul(x, y);
uint256 mm = mulmod(x, y, d);
if (mm > l) h -= 1;
l -= mm;
require(h < d, 'FullMath::mulDiv: overflow');
return fullDiv(l, h, d);
}
}
// File contracts/libraries/FixedPoint.sol
pragma solidity 0.7.5;
library Babylonian {
function sqrt(uint256 x) internal pure returns (uint256) {
if (x == 0) return 0;
uint256 xx = x;
uint256 r = 1;
if (xx >= 0x100000000000000000000000000000000) {
xx >>= 128;
r <<= 64;
}
if (xx >= 0x10000000000000000) {
xx >>= 64;
r <<= 32;
}
if (xx >= 0x100000000) {
xx >>= 32;
r <<= 16;
}
if (xx >= 0x10000) {
xx >>= 16;
r <<= 8;
}
if (xx >= 0x100) {
xx >>= 8;
r <<= 4;
}
if (xx >= 0x10) {
xx >>= 4;
r <<= 2;
}
if (xx >= 0x8) {
r <<= 1;
}
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1;
r = (r + x / r) >> 1; // Seven iterations should be enough
uint256 r1 = x / r;
return (r < r1 ? r : r1);
}
}
library BitMath {
function mostSignificantBit(uint256 x) internal pure returns (uint8 r) {
require(x > 0, 'BitMath::mostSignificantBit: zero');
if (x >= 0x100000000000000000000000000000000) {
x >>= 128;
r += 128;
}
if (x >= 0x10000000000000000) {
x >>= 64;
r += 64;
}
if (x >= 0x100000000) {
x >>= 32;
r += 32;
}
if (x >= 0x10000) {
x >>= 16;
r += 16;
}
if (x >= 0x100) {
x >>= 8;
r += 8;
}
if (x >= 0x10) {
x >>= 4;
r += 4;
}
if (x >= 0x4) {
x >>= 2;
r += 2;
}
if (x >= 0x2) r += 1;
}
}
library FixedPoint {
struct uq112x112 {
uint224 _x;
}
struct uq144x112 {
uint256 _x;
}
uint8 private constant RESOLUTION = 112;
uint256 private constant Q112 = 0x10000000000000000000000000000;
uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000;
uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits)
function decode(uq112x112 memory self) internal pure returns (uint112) {
return uint112(self._x >> RESOLUTION);
}
function decode112with18(uq112x112 memory self) internal pure returns (uint) {
return uint(self._x) / 5192296858534827;
}
function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) {
require(denominator > 0, 'FixedPoint::fraction: division by zero');
if (numerator == 0) return FixedPoint.uq112x112(0);
if (numerator <= uint144(-1)) {
uint256 result = (numerator << RESOLUTION) / denominator;
require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
return uq112x112(uint224(result));
} else {
uint256 result = FullMath.mulDiv(numerator, Q112, denominator);
require(result <= uint224(-1), 'FixedPoint::fraction: overflow');
return uq112x112(uint224(result));
}
}
// square root of a UQ112x112
// lossy between 0/1 and 40 bits
function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) {
if (self._x <= uint144(-1)) {
return uq112x112(uint224(Babylonian.sqrt(uint256(self._x) << 112)));
}
uint8 safeShiftBits = 255 - BitMath.mostSignificantBit(self._x);
safeShiftBits -= safeShiftBits % 2;
return uq112x112(uint224(Babylonian.sqrt(uint256(self._x) << safeShiftBits) << ((112 - safeShiftBits) / 2)));
}
}
// File contracts/interfaces/ITreasury.sol
pragma solidity 0.7.5;
interface ITreasury {
function deposit(address _principleTokenAddress, uint _amountPrincipleToken, uint _amountPayoutToken) external;
function valueOfToken( address _principleTokenAddress, uint _amount ) external view returns ( uint value_ );
}
// File contracts/types/Ownable.sol
pragma solidity 0.7.5;
contract Ownable {
address public policy;
constructor () {
policy = msg.sender;
}
modifier onlyPolicy() {
require( policy == msg.sender, "Ownable: caller is not the owner" );
_;
}
function transferManagment(address _newOwner) external onlyPolicy() {
require( _newOwner != address(0) );
policy = _newOwner;
}
}
// File contracts/OlympusProCustomBond.sol
pragma solidity 0.7.5;
contract CustomBond is Ownable {
using FixedPoint for *;
using SafeERC20 for IERC20;
using SafeMath for uint;
/* ======== EVENTS ======== */
event BondCreated( uint deposit, uint payout, uint expires );
event BondRedeemed( address recipient, uint payout, uint remaining );
event BondPriceChanged( uint internalPrice, uint debtRatio );
event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition );
/* ======== STATE VARIABLES ======== */
IERC20 immutable payoutToken; // token paid for principal
IERC20 immutable principalToken; // inflow token
ITreasury immutable customTreasury; // pays for and receives principal
address immutable olympusDAO;
address olympusTreasury; // receives fee
uint public totalPrincipalBonded;
uint public totalPayoutGiven;
Terms public terms; // stores terms for new bonds
Adjust public adjustment; // stores adjustment to BCV data
FeeTiers[] private feeTiers; // stores fee tiers
mapping( address => Bond ) public bondInfo; // stores bond information for depositors
uint public totalDebt; // total value of outstanding bonds; used for pricing
uint public lastDecay; // reference block for debt decay
address immutable subsidyRouter; // pays subsidy in OHM to custom treasury
uint payoutSinceLastSubsidy; // principal accrued since subsidy paid
/* ======== STRUCTS ======== */
struct FeeTiers {
uint tierCeilings; // principal bonded till next tier
uint fees; // in ten-thousandths (i.e. 33300 = 3.33%)
}
// Info for creating new bonds
struct Terms {
uint controlVariable; // scaling variable for price
uint vestingTerm; // in blocks
uint minimumPrice; // vs principal value
uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5%
uint maxDebt; // payout token decimal debt ratio, max % total supply created as debt
}
// Info for bond holder
struct Bond {
uint payout; // payout token remaining to be paid
uint vesting; // Blocks left to vest
uint lastBlock; // Last interaction
uint truePricePaid; // Price paid (principal tokens per payout token) in ten-millionths - 4000000 = 0.4
}
// Info for incremental adjustments to control variable
struct Adjust {
bool add; // addition or subtraction
uint rate; // increment
uint target; // BCV when adjustment finished
uint buffer; // minimum length (in blocks) between adjustments
uint lastBlock; // block when last adjustment made
}
/* ======== CONSTRUCTOR ======== */
constructor(
address _customTreasury,
address _payoutToken,
address _principalToken,
address _olympusTreasury,
address _subsidyRouter,
address _initialOwner,
address _olympusDAO,
uint[] memory _tierCeilings,
uint[] memory _fees
) {
require( _customTreasury != address(0) );
customTreasury = ITreasury( _customTreasury );
require( _payoutToken != address(0) );
payoutToken = IERC20( _payoutToken );
require( _principalToken != address(0) );
principalToken = IERC20( _principalToken );
require( _olympusTreasury != address(0) );
olympusTreasury = _olympusTreasury;
require( _subsidyRouter != address(0) );
subsidyRouter = _subsidyRouter;
require( _initialOwner != address(0) );
policy = _initialOwner;
require( _olympusDAO != address(0) );
olympusDAO = _olympusDAO;
require(_tierCeilings.length == _fees.length, "tier length and fee length not the same");
for(uint i; i < _tierCeilings.length; i++) {
feeTiers.push( FeeTiers({
tierCeilings: _tierCeilings[i],
fees: _fees[i]
}));
}
}
/* ======== INITIALIZATION ======== */
/**
* @notice initializes bond parameters
* @param _controlVariable uint
* @param _vestingTerm uint
* @param _minimumPrice uint
* @param _maxPayout uint
* @param _maxDebt uint
* @param _initialDebt uint
*/
function initializeBond(
uint _controlVariable,
uint _vestingTerm,
uint _minimumPrice,
uint _maxPayout,
uint _maxDebt,
uint _initialDebt
) external onlyPolicy() {
require( currentDebt() == 0, "Debt must be 0 for initialization" );
terms = Terms ({
controlVariable: _controlVariable,
vestingTerm: _vestingTerm,
minimumPrice: _minimumPrice,
maxPayout: _maxPayout,
maxDebt: _maxDebt
});
totalDebt = _initialDebt;
lastDecay = block.number;
}
/* ======== POLICY FUNCTIONS ======== */
enum PARAMETER { VESTING, PAYOUT, DEBT }
/**
* @notice set parameters for new bonds
* @param _parameter PARAMETER
* @param _input uint
*/
function setBondTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() {
if ( _parameter == PARAMETER.VESTING ) { // 0
require( _input >= 10000, "Vesting must be longer than 36 hours" );
terms.vestingTerm = _input;
} else if ( _parameter == PARAMETER.PAYOUT ) { // 1
require( _input <= 1000, "Payout cannot be above 1 percent" );
terms.maxPayout = _input;
} else if ( _parameter == PARAMETER.DEBT ) { // 2
terms.maxDebt = _input;
}
}
/**
* @notice set control variable adjustment
* @param _addition bool
* @param _increment uint
* @param _target uint
* @param _buffer uint
*/
function setAdjustment (
bool _addition,
uint _increment,
uint _target,
uint _buffer
) external onlyPolicy() {
require( _increment <= terms.controlVariable.mul( 30 ).div( 1000 ), "Increment too large" );
adjustment = Adjust({
add: _addition,
rate: _increment,
target: _target,
buffer: _buffer,
lastBlock: block.number
});
}
/**
* @notice change address of Olympus Treasury
* @param _olympusTreasury uint
*/
function changeOlympusTreasury(address _olympusTreasury) external {
require( msg.sender == olympusDAO, "Only Olympus DAO" );
olympusTreasury = _olympusTreasury;
}
/**
* @notice subsidy controller checks payouts since last subsidy and resets counter
* @return payoutSinceLastSubsidy_ uint
*/
function paySubsidy() external returns ( uint payoutSinceLastSubsidy_ ) {
require( msg.sender == subsidyRouter, "Only subsidy controller" );
payoutSinceLastSubsidy_ = payoutSinceLastSubsidy;
payoutSinceLastSubsidy = 0;
}
/* ======== USER FUNCTIONS ======== */
/**
* @notice deposit bond
* @param _amount uint
* @param _maxPrice uint
* @param _depositor address
* @return uint
*/
function deposit(uint _amount, uint _maxPrice, address _depositor) external returns (uint) {
require( _depositor != address(0), "Invalid address" );
decayDebt();
require( totalDebt <= terms.maxDebt, "Max capacity reached" );
uint nativePrice = trueBondPrice();
require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection
uint value = customTreasury.valueOfToken( address(principalToken), _amount );
uint payout = _payoutFor( value ); // payout to bonder is computed
require( payout >= 10 ** payoutToken.decimals() / 100, "Bond too small" ); // must be > 0.01 payout token ( underflow protection )
require( payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage
// profits are calculated
uint fee = payout.mul( currentOlympusFee() ).div( 1e6 );
/**
principal is transferred in
approved and
deposited into the treasury, returning (_amount - profit) payout token
*/
principalToken.safeTransferFrom( msg.sender, address(this), _amount );
principalToken.approve( address(customTreasury), _amount );
customTreasury.deposit( address(principalToken), _amount, payout );
if ( fee != 0 ) { // fee is transferred to dao
payoutToken.transfer(olympusTreasury, fee);
}
// total debt is increased
totalDebt = totalDebt.add( value );
// depositor info is stored
bondInfo[ _depositor ] = Bond({
payout: bondInfo[ _depositor ].payout.add( payout.sub(fee) ),
vesting: terms.vestingTerm,
lastBlock: block.number,
truePricePaid: trueBondPrice()
});
// indexed events are emitted
emit BondCreated( _amount, payout, block.number.add( terms.vestingTerm ) );
emit BondPriceChanged( _bondPrice(), debtRatio() );
totalPrincipalBonded = totalPrincipalBonded.add(_amount); // total bonded increased
totalPayoutGiven = totalPayoutGiven.add(payout); // total payout increased
payoutSinceLastSubsidy = payoutSinceLastSubsidy.add( payout ); // subsidy counter increased
adjust(); // control variable is adjusted
return payout;
}
/**
* @notice redeem bond for user
* @return uint
*/
function redeem(address _depositor) external returns (uint) {
Bond memory info = bondInfo[ _depositor ];
uint percentVested = percentVestedFor( _depositor ); // (blocks since last interaction / vesting term remaining)
if ( percentVested >= 10000 ) { // if fully vested
delete bondInfo[ _depositor ]; // delete user info
emit BondRedeemed( _depositor, info.payout, 0 ); // emit bond data
payoutToken.transfer( _depositor, info.payout );
return info.payout;
} else { // if unfinished
// calculate payout vested
uint payout = info.payout.mul( percentVested ).div( 10000 );
// store updated deposit info
bondInfo[ _depositor ] = Bond({
payout: info.payout.sub( payout ),
vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ),
lastBlock: block.number,
truePricePaid: info.truePricePaid
});
emit BondRedeemed( _depositor, payout, bondInfo[ _depositor ].payout );
payoutToken.transfer( _depositor, payout );
return payout;
}
}
/* ======== INTERNAL HELPER FUNCTIONS ======== */
/**
* @notice makes incremental adjustment to control variable
*/
function adjust() internal {
uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer );
if( adjustment.rate != 0 && block.number >= blockCanAdjust ) {
uint initial = terms.controlVariable;
if ( adjustment.add ) {
terms.controlVariable = terms.controlVariable.add( adjustment.rate );
if ( terms.controlVariable >= adjustment.target ) {
adjustment.rate = 0;
}
} else {
terms.controlVariable = terms.controlVariable.sub( adjustment.rate );
if ( terms.controlVariable <= adjustment.target ) {
adjustment.rate = 0;
}
}
adjustment.lastBlock = block.number;
emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add );
}
}
/**
* @notice reduce total debt
*/
function decayDebt() internal {
totalDebt = totalDebt.sub( debtDecay() );
lastDecay = block.number;
}
/**
* @notice calculate current bond price and remove floor if above
* @return price_ uint
*/
function _bondPrice() internal returns ( uint price_ ) {
price_ = terms.controlVariable.mul( debtRatio() ).div( 10 ** (uint256(payoutToken.decimals()).sub(5)) );
if ( price_ < terms.minimumPrice ) {
price_ = terms.minimumPrice;
} else if ( terms.minimumPrice != 0 ) {
terms.minimumPrice = 0;
}
}
/* ======== VIEW FUNCTIONS ======== */
/**
* @notice calculate current bond premium
* @return price_ uint
*/
function bondPrice() public view returns ( uint price_ ) {
price_ = terms.controlVariable.mul( debtRatio() ).div( 10 ** (uint256(payoutToken.decimals()).sub(5)) );
if ( price_ < terms.minimumPrice ) {
price_ = terms.minimumPrice;
}
}
/**
* @notice calculate true bond price a user pays
* @return price_ uint
*/
function trueBondPrice() public view returns ( uint price_ ) {
price_ = bondPrice().add(bondPrice().mul( currentOlympusFee() ).div( 1e6 ) );
}
/**
* @notice determine maximum bond size
* @return uint
*/
function maxPayout() public view returns ( uint ) {
return payoutToken.totalSupply().mul( terms.maxPayout ).div( 100000 );
}
/**
* @notice calculate total interest due for new bond
* @param _value uint
* @return uint
*/
function _payoutFor( uint _value ) internal view returns ( uint ) {
return FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e11 );
}
/**
* @notice calculate user's interest due for new bond, accounting for Olympus Fee
* @param _value uint
* @return uint
*/
function payoutFor( uint _value ) external view returns ( uint ) {
uint total = FixedPoint.fraction( _value, bondPrice() ).decode112with18().div( 1e11 );
return total.sub(total.mul( currentOlympusFee() ).div( 1e6 ));
}
/**
* @notice calculate current ratio of debt to payout token supply
* @notice protocols using Olympus Pro should be careful when quickly adding large %s to total supply
* @return debtRatio_ uint
*/
function debtRatio() public view returns ( uint debtRatio_ ) {
debtRatio_ = FixedPoint.fraction(
currentDebt().mul( 10 ** payoutToken.decimals() ),
payoutToken.totalSupply()
).decode112with18().div( 1e18 );
}
/**
* @notice calculate debt factoring in decay
* @return uint
*/
function currentDebt() public view returns ( uint ) {
return totalDebt.sub( debtDecay() );
}
/**
* @notice amount to decay total debt by
* @return decay_ uint
*/
function debtDecay() public view returns ( uint decay_ ) {
uint blocksSinceLast = block.number.sub( lastDecay );
decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm );
if ( decay_ > totalDebt ) {
decay_ = totalDebt;
}
}
/**
* @notice calculate how far into vesting a depositor is
* @param _depositor address
* @return percentVested_ uint
*/
function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) {
Bond memory bond = bondInfo[ _depositor ];
uint blocksSinceLast = block.number.sub( bond.lastBlock );
uint vesting = bond.vesting;
if ( vesting > 0 ) {
percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting );
} else {
percentVested_ = 0;
}
}
/**
* @notice calculate amount of payout token available for claim by depositor
* @param _depositor address
* @return pendingPayout_ uint
*/
function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) {
uint percentVested = percentVestedFor( _depositor );
uint payout = bondInfo[ _depositor ].payout;
if ( percentVested >= 10000 ) {
pendingPayout_ = payout;
} else {
pendingPayout_ = payout.mul( percentVested ).div( 10000 );
}
}
/**
* @notice current fee Olympus takes of each bond
* @return currentFee_ uint
*/
function currentOlympusFee() public view returns( uint currentFee_ ) {
uint tierLength = feeTiers.length;
for(uint i; i < tierLength; i++) {
if(totalPrincipalBonded < feeTiers[i].tierCeilings || i == tierLength - 1 ) {
return feeTiers[i].fees;
}
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_customTreasury","type":"address"},{"internalType":"address","name":"_payoutToken","type":"address"},{"internalType":"address","name":"_principalToken","type":"address"},{"internalType":"address","name":"_olympusTreasury","type":"address"},{"internalType":"address","name":"_subsidyRouter","type":"address"},{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_olympusDAO","type":"address"},{"internalType":"uint256[]","name":"_tierCeilings","type":"uint256[]"},{"internalType":"uint256[]","name":"_fees","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"BondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BondPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BondRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"truePricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_olympusTreasury","type":"address"}],"name":"changeOlympusTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentOlympusFee","outputs":[{"internalType":"uint256","name":"currentFee_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paySubsidy","outputs":[{"internalType":"uint256","name":"payoutSinceLastSubsidy_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CustomBond.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayoutGiven","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPrincipalBonded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferManagment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trueBondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101206040523480156200001257600080fd5b5060405162003ca938038062003ca983398181016040526101208110156200003957600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080516040519392919084640100000000821115620000a057600080fd5b83820191506020820185811115620000b757600080fd5b8251866020820283011164010000000082111715620000d557600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200010e578082015181840152602081019050620000f1565b50505050905001604052602001805160405193929190846401000000008211156200013857600080fd5b838201915060208201858111156200014f57600080fd5b82518660208202830111640100000000821117156200016d57600080fd5b8083526020830192505050908051906020019060200280838360005b83811015620001a657808201518184015260208101905062000189565b50505050905001604052505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614156200022e57600080fd5b8873ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415620002a057600080fd5b8773ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614156200031257600080fd5b8673ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156200038457600080fd5b85600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200040057600080fd5b8473ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156200047357600080fd5b836000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620004ee57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050805182511462000581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018062003c826027913960400191505060405180910390fd5b60005b82518110156200061a57600e6040518060400160405280858481518110620005a857fe5b60200260200101518152602001848481518110620005c257fe5b6020026020010151815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050808060010191505062000584565b5050505050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160601c6135ce620006b4600039806120a7525080610d8d52508061126552806115bd528061166e5250806112a1528061153a528061158152806116aa52508061136052806117475280611bb95280611e3752806121bf528061227c528061236852806124775280612b8f52506135ce6000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c1578063e392a262146106df578063f5c2ab5b146106fd578063fc7b9c181461071b5761018e565b8063cea55f571461064b578063d502562514610669578063d7ccfb0b146106a35761018e565b80637cbe044c1461047e5780638dbdbe6d1461049c57806395a2251f14610508578063a50603b214610560578063a9bc6b71146105c0578063cd1234b3146105de5761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610739565b6040518082815260200191505060405180910390f35b6101f36107d0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107f4565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291908035906020019092919050505061084a565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a29565b005b6102ce610c47565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c4d565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d8b565b005b610374610e90565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec1565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f47565b6040518082815260200191505060405180910390f35b61042661102d565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611050565b6040518082815260200191505060405180910390f35b6104866110ce565b6040518082815260200191505060405180910390f35b6104f2600480360360608110156104b257600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d4565b6040518082815260200191505060405180910390f35b61054a6004803603602081101561051e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a5f565b6040518082815260200191505060405180910390f35b6105be600480360360c081101561057657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611f0e565b005b6105c86120a3565b6040518082815260200191505060405180910390f35b610620600480360360208110156105f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612176565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6106536121a6565b6040518082815260200191505060405180910390f35b610671612338565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106ab61235c565b6040518082815260200191505060405180910390f35b6106c9612463565b6040518082815260200191505060405180910390f35b6106e7612537565b6040518082815260200191505060405180910390f35b610705612593565b6040518082815260200191505060405180910390f35b610723612599565b6040518082815260200191505060405180910390f35b60008061074583610f47565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612710821061079f578092506107c9565b6107c66127106107b8848461259f90919063ffffffff16565b61262590919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084561082f620f424061082161080b610ec1565b61081361235c565b61259f90919063ffffffff16565b61262590919063ffffffff16565b61083761235c565b61266f90919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461090b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109386103e861092a601e60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b8311156109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600960008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610af757fe5b826002811115610b0357fe5b1415610b7357612710811015610b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061354b6024913960400191505060405180910390fd5b80600460010181905550610c43565b60016002811115610b8057fe5b826002811115610b8c57fe5b1415610c19576103e8811115610c0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600460030181905550610c42565b600280811115610c2557fe5b826002811115610c3157fe5b1415610c41578060048001819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080600e80549050905060005b81811015610f4157600e8181548110610ee457fe5b9060005260206000209060020201600001546002541080610f0757506001820381145b15610f3457600e8181548110610f1957fe5b90600052602060002090600202016001015492505050610f44565b8080600101915050610ecf565b50505b90565b6000610f51613466565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fde8260400151436126f790919063ffffffff16565b90506000826020015190506000811115611020576110198161100b6127108561259f90919063ffffffff16565b61262590919063ffffffff16565b9350611025565b600093505b505050919050565b600061104b61103a612537565b6010546126f790919063ffffffff16565b905090565b60008061108364174876e8006110756110708661106b61235c565b612741565b612a22565b61262590919063ffffffff16565b90506110c66110b7620f42406110a961109a610ec1565b8561259f90919063ffffffff16565b61262590919063ffffffff16565b826126f790919063ffffffff16565b915050919050565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611180612a5e565b600480015460105411156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b60006112066107f4565b905080841015611261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135286023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d602081101561133c57600080fd5b81019080805190602001909291905050509050600061135a82612a89565b905060647f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c457600080fd5b505afa1580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b810190808051906020019092919050505060ff16600a0a8161140c57fe5b04811015611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61148a612463565b8111156114ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000611530620f4240611522611513610ec1565b8561259f90919063ffffffff16565b61262590919063ffffffff16565b905061157f33308a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ac2909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561163057600080fd5b505af1158015611644573d6000803e3d6000fd5b505050506040513d602081101561165a57600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f00000000000000000000000000000000000000000000000000000000000000008a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b15801561172557600080fd5b505af1158015611739573d6000803e3d6000fd5b5050505060008114611835577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b8101908080519060200190929190505050505b61184a8360105461266f90919063ffffffff16565b60108190555060405180608001604052806118c261187184866126f790919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461266f90919063ffffffff16565b815260200160046001015481526020014381526020016118e06107f4565b815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc088836119886004600101544361266f90919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf166119d4612b83565b6119dc6121a6565b604051808381526020018281526020019250505060405180910390a1611a0d8860025461266f90919063ffffffff16565b600281905550611a288260035461266f90919063ffffffff16565b600381905550611a438260125461266f90919063ffffffff16565b601281905550611a51612ca8565b819450505050509392505050565b6000611a69613466565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611ae884610f47565b90506127108110611c9657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8584600001516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611c4c57600080fd5b505af1158015611c60573d6000803e3d6000fd5b505050506040513d6020811015611c7657600080fd5b810190808051906020019092919050505050816000015192505050611f09565b6000611cc3612710611cb584866000015161259f90919063ffffffff16565b61262590919063ffffffff16565b90506040518060800160405280611ce78386600001516126f790919063ffffffff16565b8152602001611d19611d068660400151436126f790919063ffffffff16565b86602001516126f790919063ffffffff16565b81526020014381526020018460600151815250600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a17f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d6020811015611ef057600080fd5b8101908080519060200190929190505050508093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000611fd961102d565b1461202f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134e66021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600460008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060108190555043601181905550505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6012549050600060128190555090565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000612333670de0b6b3a764000061232561232061227a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561222357600080fd5b505afa158015612237573d6000803e3d6000fd5b505050506040513d602081101561224d57600080fd5b810190808051906020019092919050505060ff16600a0a61226c61102d565b61259f90919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122e057600080fd5b505afa1580156122f4573d6000803e3d6000fd5b505050506040513d602081101561230a57600080fd5b8101908080519060200190929190505050612741565b612a22565b61262590919063ffffffff16565b905090565b60048060000154908060010154908060020154908060030154908060040154905085565b600061244861241860057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d60208110156123f657600080fd5b810190808051906020019092919050505060ff166126f790919063ffffffff16565b600a0a61243a6124266121a6565b60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b90506004600201548110156124605760046002015490505b90565b6000612532620186a06125246004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124db57600080fd5b505afa1580156124ef573d6000803e3d6000fd5b505050506040513d602081101561250557600080fd5b810190808051906020019092919050505061259f90919063ffffffff16565b61262590919063ffffffff16565b905090565b60008061254f601154436126f790919063ffffffff16565b905061257d60046001015461256f8360105461259f90919063ffffffff16565b61262590919063ffffffff16565b915060105482111561258f5760105491505b5090565b60115481565b60105481565b6000808314156125b2576000905061261f565b60008284029050828482816125c357fe5b041461261a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135076021913960400191505060405180910390fd5b809150505b92915050565b600061266783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e0e565b905092915050565b6000808284019050838110156126ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061273983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ed4565b905092915050565b61274961348e565b600082116127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134c06026913960400191505060405180910390fd5b60008314156127e057604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612a1c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161291957600082607060ff1685901b8161282d57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156128e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612a1c565b6000612935846e01000000000000000000000000000085612f94565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156129eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612a5657fe5b049050919050565b612a7a612a69612537565b6010546126f790919063ffffffff16565b60108190555043601181905550565b6000612abb64174876e800612aad612aa885612aa361235c565b612741565b612a22565b61262590919063ffffffff16565b9050919050565b612b7d846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613056565b50505050565b6000612c6f612c3f60057f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bf357600080fd5b505afa158015612c07573d6000803e3d6000fd5b505050506040513d6020811015612c1d57600080fd5b810190808051906020019092919050505060ff166126f790919063ffffffff16565b600a0a612c61612c4d6121a6565b60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b9050600460020154811015612c8b576004600201549050612ca5565b600060046002015414612ca45760006004600201819055505b5b90565b6000612cc760096003015460096004015461266f90919063ffffffff16565b9050600060096001015414158015612cdf5750804310155b15612e0b5760006004600001549050600960000160009054906101000a900460ff1615612d4e57612d2360096001015460046000015461266f90919063ffffffff16565b60046000018190555060096002015460046000015410612d495760006009600101819055505b612d92565b612d6b6009600101546004600001546126f790919063ffffffff16565b60046000018190555060096002015460046000015411612d915760006009600101819055505b5b436009600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600960010154600960000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290612eba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e7f578082015181840152602081019050612e64565b50505050905090810190601f168015612eac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612ec657fe5b049050809150509392505050565b6000838311158290612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f46578082015181840152602081019050612f2b565b50505050905090810190601f168015612f735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000612fa38686613145565b9150915060008480612fb157fe5b868809905082811115612fc5576001820391505b808303925084821061303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61304a838387613198565b93505050509392505050565b60606130b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132359092919063ffffffff16565b9050600081511115613140578080602001905160208110156130d957600080fd5b810190808051906020019092919050505061313f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061356f602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061317257fe5b84860990508385029250828103915082811015613190576001820391505b509250929050565b60008082600003831690508083816131ac57fe5b0492508085816131b857fe5b04945060018182600003816131c957fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613244848460008561324d565b90509392505050565b606061325885613453565b6132ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061331a57805182526020820191506020810190506020830392506132f7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461337c576040519150601f19603f3d011682016040523d82523d6000602084013e613381565b606091505b5091509150811561339657809250505061344b565b6000815111156133a95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134105780820151818401526020810190506133f5565b50505050905090810190601f16801561343d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220534e04728123362f376f70180716c54d4c6a44d2c6775c6f7aee44a2c8273bae64736f6c6343000705003374696572206c656e67746820616e6420666565206c656e677468206e6f74207468652073616d65000000000000000000000000246c00f93001c344038a0d9cf012754b539c1014000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a800000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000004e20
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80637cbe044c116100de578063cea55f5711610097578063e0176de811610071578063e0176de8146106c1578063e392a262146106df578063f5c2ab5b146106fd578063fc7b9c181461071b5761018e565b8063cea55f571461064b578063d502562514610669578063d7ccfb0b146106a35761018e565b80637cbe044c1461047e5780638dbdbe6d1461049c57806395a2251f14610508578063a50603b214610560578063a9bc6b71146105c0578063cd1234b3146105de5761018e565b80633bfdd7de1161014b5780634799afda116101255780634799afda146103a8578063507930ec146103c6578063759076e51461041e5780637927ebf81461043c5761018e565b80633bfdd7de146102e45780633f0fb92f14610328578063451ee4a11461036c5761018e565b806301b88ee8146101935780630505c8c9146101eb5780630a7484891461021f5780631a3d00681461023d5780631e321a0f1461028b5780632bab6bde146102c6575b600080fd5b6101d5600480360360208110156101a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610739565b6040518082815260200191505060405180910390f35b6101f36107d0565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102276107f4565b6040518082815260200191505060405180910390f35b6102896004803603608081101561025357600080fd5b8101908080351515906020019092919080359060200190929190803590602001909291908035906020019092919050505061084a565b005b6102c4600480360360408110156102a157600080fd5b81019080803560ff16906020019092919080359060200190929190505050610a29565b005b6102ce610c47565b6040518082815260200191505060405180910390f35b610326600480360360208110156102fa57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c4d565b005b61036a6004803603602081101561033e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d8b565b005b610374610e90565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6103b0610ec1565b6040518082815260200191505060405180910390f35b610408600480360360208110156103dc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f47565b6040518082815260200191505060405180910390f35b61042661102d565b6040518082815260200191505060405180910390f35b6104686004803603602081101561045257600080fd5b8101908080359060200190929190505050611050565b6040518082815260200191505060405180910390f35b6104866110ce565b6040518082815260200191505060405180910390f35b6104f2600480360360608110156104b257600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d4565b6040518082815260200191505060405180910390f35b61054a6004803603602081101561051e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a5f565b6040518082815260200191505060405180910390f35b6105be600480360360c081101561057657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190505050611f0e565b005b6105c86120a3565b6040518082815260200191505060405180910390f35b610620600480360360208110156105f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612176565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6106536121a6565b6040518082815260200191505060405180910390f35b610671612338565b604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6106ab61235c565b6040518082815260200191505060405180910390f35b6106c9612463565b6040518082815260200191505060405180910390f35b6106e7612537565b6040518082815260200191505060405180910390f35b610705612593565b6040518082815260200191505060405180910390f35b610723612599565b6040518082815260200191505060405180910390f35b60008061074583610f47565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612710821061079f578092506107c9565b6107c66127106107b8848461259f90919063ffffffff16565b61262590919063ffffffff16565b92505b5050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061084561082f620f424061082161080b610ec1565b61081361235c565b61259f90919063ffffffff16565b61262590919063ffffffff16565b61083761235c565b61266f90919063ffffffff16565b905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461090b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6109386103e861092a601e60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b8311156109ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600960008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610aea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006002811115610af757fe5b826002811115610b0357fe5b1415610b7357612710811015610b64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061354b6024913960400191505060405180910390fd5b80600460010181905550610c43565b60016002811115610b8057fe5b826002811115610b8c57fe5b1415610c19576103e8811115610c0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b80600460030181905550610c42565b600280811115610c2557fe5b826002811115610c3157fe5b1415610c41578060048001819055505b5b5b5050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d0e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4857600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4f6e6c79204f6c796d7075732044414f0000000000000000000000000000000081525060200191505060405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60098060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b600080600e80549050905060005b81811015610f4157600e8181548110610ee457fe5b9060005260206000209060020201600001546002541080610f0757506001820381145b15610f3457600e8181548110610f1957fe5b90600052602060002090600202016001015492505050610f44565b8080600101915050610ecf565b50505b90565b6000610f51613466565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610fde8260400151436126f790919063ffffffff16565b90506000826020015190506000811115611020576110198161100b6127108561259f90919063ffffffff16565b61262590919063ffffffff16565b9350611025565b600093505b505050919050565b600061104b61103a612537565b6010546126f790919063ffffffff16565b905090565b60008061108364174876e8006110756110708661106b61235c565b612741565b612a22565b61262590919063ffffffff16565b90506110c66110b7620f42406110a961109a610ec1565b8561259f90919063ffffffff16565b61262590919063ffffffff16565b826126f790919063ffffffff16565b915050919050565b60025481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611180612a5e565b600480015460105411156111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b60006112066107f4565b905080841015611261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135286023913960400191505060405180910390fd5b60007f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a8886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d602081101561133c57600080fd5b81019080805190602001909291905050509050600061135a82612a89565b905060647f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c457600080fd5b505afa1580156113d8573d6000803e3d6000fd5b505050506040513d60208110156113ee57600080fd5b810190808051906020019092919050505060ff16600a0a8161140c57fe5b04811015611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b61148a612463565b8111156114ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b6000611530620f4240611522611513610ec1565b8561259f90919063ffffffff16565b61262590919063ffffffff16565b905061157f33308a7f000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a873ffffffffffffffffffffffffffffffffffffffff16612ac2909392919063ffffffff16565b7f000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f000000000000000000000000246c00f93001c344038a0d9cf012754b539c10148a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561163057600080fd5b505af1158015611644573d6000803e3d6000fd5b505050506040513d602081101561165a57600080fd5b8101908080519060200190929190505050507f000000000000000000000000246c00f93001c344038a0d9cf012754b539c101473ffffffffffffffffffffffffffffffffffffffff16630efe6a8b7f000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a88a856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019350505050600060405180830381600087803b15801561172557600080fd5b505af1158015611739573d6000803e3d6000fd5b5050505060008114611835577f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156117f857600080fd5b505af115801561180c573d6000803e3d6000fd5b505050506040513d602081101561182257600080fd5b8101908080519060200190929190505050505b61184a8360105461266f90919063ffffffff16565b60108190555060405180608001604052806118c261187184866126f790919063ffffffff16565b600f60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461266f90919063ffffffff16565b815260200160046001015481526020014381526020016118e06107f4565b815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507fb7ce5a2d90f1705ca02547b0eb827724683e0df3b809477ae4326d0eefed0bc088836119886004600101544361266f90919063ffffffff16565b60405180848152602001838152602001828152602001935050505060405180910390a17f2cb17bd1fd2a1fecfefae2de1e6a59194abaa62179652924ccdca01617f0bf166119d4612b83565b6119dc6121a6565b604051808381526020018281526020019250505060405180910390a1611a0d8860025461266f90919063ffffffff16565b600281905550611a288260035461266f90919063ffffffff16565b600381905550611a438260125461266f90919063ffffffff16565b601281905550611a51612ca8565b819450505050509392505050565b6000611a69613466565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000611ae884610f47565b90506127108110611c9657600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18483600001516000604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a17f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8584600001516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611c4c57600080fd5b505af1158015611c60573d6000803e3d6000fd5b505050506040513d6020811015611c7657600080fd5b810190808051906020019092919050505050816000015192505050611f09565b6000611cc3612710611cb584866000015161259f90919063ffffffff16565b61262590919063ffffffff16565b90506040518060800160405280611ce78386600001516126f790919063ffffffff16565b8152602001611d19611d068660400151436126f790919063ffffffff16565b86602001516126f790919063ffffffff16565b81526020014381526020018460600151815250600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b18582600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a17f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d6020811015611ef057600080fd5b8101908080519060200190929190505050508093505050505b919050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000611fd961102d565b1461202f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134e66021913960400191505060405180910390fd5b6040518060a0016040528087815260200186815260200185815260200184815260200183815250600460008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401559050508060108190555043601181905550505050505050565b60007f00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4f6e6c79207375627369647920636f6e74726f6c6c657200000000000000000081525060200191505060405180910390fd5b6012549050600060128190555090565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000612333670de0b6b3a764000061232561232061227a7f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561222357600080fd5b505afa158015612237573d6000803e3d6000fd5b505050506040513d602081101561224d57600080fd5b810190808051906020019092919050505060ff16600a0a61226c61102d565b61259f90919063ffffffff16565b7f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122e057600080fd5b505afa1580156122f4573d6000803e3d6000fd5b505050506040513d602081101561230a57600080fd5b8101908080519060200190929190505050612741565b612a22565b61262590919063ffffffff16565b905090565b60048060000154908060010154908060020154908060030154908060040154905085565b600061244861241860057f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d60208110156123f657600080fd5b810190808051906020019092919050505060ff166126f790919063ffffffff16565b600a0a61243a6124266121a6565b60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b90506004600201548110156124605760046002015490505b90565b6000612532620186a06125246004600301547f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124db57600080fd5b505afa1580156124ef573d6000803e3d6000fd5b505050506040513d602081101561250557600080fd5b810190808051906020019092919050505061259f90919063ffffffff16565b61262590919063ffffffff16565b905090565b60008061254f601154436126f790919063ffffffff16565b905061257d60046001015461256f8360105461259f90919063ffffffff16565b61262590919063ffffffff16565b915060105482111561258f5760105491505b5090565b60115481565b60105481565b6000808314156125b2576000905061261f565b60008284029050828482816125c357fe5b041461261a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135076021913960400191505060405180910390fd5b809150505b92915050565b600061266783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e0e565b905092915050565b6000808284019050838110156126ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600061273983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ed4565b905092915050565b61274961348e565b600082116127a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806134c06026913960400191505060405180910390fd5b60008314156127e057604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050612a1c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161291957600082607060ff1685901b8161282d57fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156128e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050612a1c565b6000612935846e01000000000000000000000000000085612f94565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156129eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681612a5657fe5b049050919050565b612a7a612a69612537565b6010546126f790919063ffffffff16565b60108190555043601181905550565b6000612abb64174876e800612aad612aa885612aa361235c565b612741565b612a22565b61262590919063ffffffff16565b9050919050565b612b7d846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613056565b50505050565b6000612c6f612c3f60057f000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612bf357600080fd5b505afa158015612c07573d6000803e3d6000fd5b505050506040513d6020811015612c1d57600080fd5b810190808051906020019092919050505060ff166126f790919063ffffffff16565b600a0a612c61612c4d6121a6565b60046000015461259f90919063ffffffff16565b61262590919063ffffffff16565b9050600460020154811015612c8b576004600201549050612ca5565b600060046002015414612ca45760006004600201819055505b5b90565b6000612cc760096003015460096004015461266f90919063ffffffff16565b9050600060096001015414158015612cdf5750804310155b15612e0b5760006004600001549050600960000160009054906101000a900460ff1615612d4e57612d2360096001015460046000015461266f90919063ffffffff16565b60046000018190555060096002015460046000015410612d495760006009600101819055505b612d92565b612d6b6009600101546004600001546126f790919063ffffffff16565b60046000018190555060096002015460046000015411612d915760006009600101819055505b5b436009600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600960010154600960000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290612eba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e7f578082015181840152602081019050612e64565b50505050905090810190601f168015612eac5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612ec657fe5b049050809150509392505050565b6000838311158290612f81576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612f46578082015181840152602081019050612f2b565b50505050905090810190601f168015612f735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000612fa38686613145565b9150915060008480612fb157fe5b868809905082811115612fc5576001820391505b808303925084821061303f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b61304a838387613198565b93505050509392505050565b60606130b8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132359092919063ffffffff16565b9050600081511115613140578080602001905160208110156130d957600080fd5b810190808051906020019092919050505061313f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061356f602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8061317257fe5b84860990508385029250828103915082811015613190576001820391505b509250929050565b60008082600003831690508083816131ac57fe5b0492508085816131b857fe5b04945060018182600003816131c957fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613244848460008561324d565b90509392505050565b606061325885613453565b6132ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061331a57805182526020820191506020810190506020830392506132f7565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461337c576040519150601f19603f3d011682016040523d82523d6000602084013e613381565b606091505b5091509150811561339657809250505061344b565b6000815111156133a95780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134105780820151818401526020810190506133f5565b50505050905090810190601f16801561343d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f44656274206d757374206265203020666f7220696e697469616c697a6174696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220534e04728123362f376f70180716c54d4c6a44d2c6775c6f7aee44a2c8273bae64736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000246c00f93001c344038a0d9cf012754b539c1014000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a800000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e800000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000004e20
-----Decoded View---------------
Arg [0] : _customTreasury (address): 0x246c00f93001c344038A0d9Cf012754b539c1014
Arg [1] : _payoutToken (address): 0xdBdb4d16EdA451D0503b854CF79D55697F90c8DF
Arg [2] : _principalToken (address): 0xC3f279090a47e80990Fe3a9c30d24Cb117EF91a8
Arg [3] : _olympusTreasury (address): 0x31F8Cc382c9898b273eff4e0b7626a6987C846E8
Arg [4] : _subsidyRouter (address): 0x97Fac4EA361338EaB5c89792eE196DA8712C9a4a
Arg [5] : _initialOwner (address): 0x9e2b6378ee8ad2A4A95Fe481d63CAba8FB0EBBF9
Arg [6] : _olympusDAO (address): 0x245cc372C84B3645Bf0Ffe6538620B04a217988B
Arg [7] : _tierCeilings (uint256[]): 0
Arg [8] : _fees (uint256[]): 20000
-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 000000000000000000000000246c00f93001c344038a0d9cf012754b539c1014
Arg [1] : 000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df
Arg [2] : 000000000000000000000000c3f279090a47e80990fe3a9c30d24cb117ef91a8
Arg [3] : 00000000000000000000000031f8cc382c9898b273eff4e0b7626a6987c846e8
Arg [4] : 00000000000000000000000097fac4ea361338eab5c89792ee196da8712c9a4a
Arg [5] : 0000000000000000000000009e2b6378ee8ad2a4a95fe481d63caba8fb0ebbf9
Arg [6] : 000000000000000000000000245cc372c84b3645bf0ffe6538620b04a217988b
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000004e20
Deployed Bytecode Sourcemap
16015:17246:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32412:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15555:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29456:156;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22008:466;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21262:550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16879:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15778:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22590:185;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16975:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32928:324;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31804:427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31147:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30306:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16840:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23417:2427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25936:1221;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;20408:613;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22936:254;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17095:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30786:262;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16920:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29060:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29705:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31355:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17270:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17188;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32412:400;32484:19;32517:18;32538:30;32556:10;32538:16;:30::i;:::-;32517:51;;32579:11;32593:8;:22;32603:10;32593:22;;;;;;;;;;;;;;;:29;;;32579:43;;32657:5;32640:13;:22;32635:170;;32697:6;32680:23;;32635:170;;;32753:40;32786:5;32753:27;32765:13;32753:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;32736:57;;32635:170;32412:400;;;;;:::o;15555:21::-;;;;;;;;;;;;:::o;29456:156::-;29503:11;29537:67;29553:49;29597:3;29553:38;29570:19;:17;:19::i;:::-;29553:11;:9;:11::i;:::-;:15;;:38;;;;:::i;:::-;:42;;:49;;;;:::i;:::-;29537:11;:9;:11::i;:::-;:15;;:67;;;;:::i;:::-;29528:76;;29456:156;:::o;22008:466::-;15698:10;15688:20;;:6;;;;;;;;;;:20;;;15679:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22195:43:::1;22232:4;22195:31;22222:2;22195:5;:21;;;:25;;:31;;;;:::i;:::-;:35;;:43;;;;:::i;:::-;22181:10;:57;;22172:91;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;22289:177;;;;;;;;22316:9;22289:177;;;;;;22346:10;22289:177;;;;22379:7;22289:177;;;;22409:7;22289:177;;;;22442:12;22289:177;;::::0;22276:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22008:466:::0;;;;:::o;21262:550::-;15698:10;15688:20;;:6;;;;;;;;;;:20;;;15679:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21374:17:::1;21360:31;;;;;;;;:10;:31;;;;;;;;;21355:450;;;21433:5;21423:6;:15;;21414:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21515:6;21495:5;:17;;:26;;;;21355:450;;;21558:16;21544:30;;;;;;;;:10;:30;;;;;;;;;21539:266;;;21616:4;21606:6;:14;;21597:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;21691:6;21673:5;:15;;:24;;;;21539:266;;;21734:14;21720:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;21715:90;;;21787:6;21771:5;:13:::0;::::1;:22;;;;21715:90;21539:266;21355:450;21262:550:::0;;:::o;16879:28::-;;;;:::o;15778:150::-;15698:10;15688:20;;:6;;;;;;;;;;:20;;;15679:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15887:1:::1;15866:23;;:9;:23;;;;15857:34;;;::::0;::::1;;15911:9;15902:6;::::0;:18:::1;;;;;;;;;;;;;;;;;;15778:150:::0;:::o;22590:185::-;22690:10;22676:24;;:10;:24;;;22667:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22751:16;22733:15;;:34;;;;;;;;;;;;;;;;;;22590:185;:::o;16975:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32928:324::-;32978:16;33008:15;33026:8;:15;;;;33008:33;;33056:6;33052:193;33068:10;33064:1;:14;33052:193;;;33126:8;33135:1;33126:11;;;;;;;;;;;;;;;;;;:24;;;33103:20;;:47;:70;;;;33172:1;33159:10;:14;33154:1;:19;33103:70;33100:134;;;33202:8;33211:1;33202:11;;;;;;;;;;;;;;;;;;:16;;;33195:23;;;;;;33100:134;33080:3;;;;;;;33052:193;;;;32928:324;;;:::o;31804:427::-;31874:19;31907:16;;:::i;:::-;31926:8;:22;31936:10;31926:22;;;;;;;;;;;;;;;31907:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31959:20;31982:34;32000:4;:14;;;31982:12;:16;;:34;;;;:::i;:::-;31959:57;;32027:12;32042:4;:12;;;32027:27;;32082:1;32072:7;:11;32067:157;;;32118:43;32152:7;32118:28;32139:5;32118:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;32101:60;;32067:157;;;32211:1;32194:18;;32067:157;31804:427;;;;;;:::o;31147:106::-;31192:4;31217:28;31232:11;:9;:11::i;:::-;31217:9;;:13;;:28;;;;:::i;:::-;31210:35;;31147:106;:::o;30306:241::-;30364:4;30382:10;30395:72;30461:4;30395:60;:42;30416:6;30424:11;:9;:11::i;:::-;30395:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;30382:85;;30485:54;30495:43;30533:3;30495:32;30506:19;:17;:19::i;:::-;30495:5;:9;;:32;;;;:::i;:::-;:36;;:43;;;;:::i;:::-;30485:5;:9;;:54;;;;:::i;:::-;30478:61;;;30306:241;;;:::o;16840:32::-;;;;:::o;23417:2427::-;23502:4;23550:1;23528:24;;:10;:24;;;;23519:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23586:11;:9;:11::i;:::-;23630:5;:13;;;23617:9;;:26;;23608:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23690:16;23709:15;:13;:15::i;:::-;23690:34;;23759:11;23746:9;:24;;23737:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23847:10;23860:14;:27;;;23897:14;23914:7;23860:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23847:76;;23934:11;23948:19;23960:5;23948:10;:19::i;:::-;23934:33;;24062:3;24037:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24031:28;;:2;:28;:34;;;;;;24021:6;:44;;24012:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24171:11;:9;:11::i;:::-;24161:6;:21;;24152:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24297:8;24308:44;24347:3;24308:33;24320:19;:17;:19::i;:::-;24308:6;:10;;:33;;;;:::i;:::-;:37;;:44;;;;:::i;:::-;24297:55;;24542:69;24575:10;24595:4;24602:7;24542:14;:31;;;;:69;;;;;;:::i;:::-;24622:14;:22;;;24654:14;24671:7;24622:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24691:14;:22;;;24723:14;24740:7;24749:6;24691:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24790:1;24783:3;:8;24778:115;;24839:11;:20;;;24860:15;;;;;;;;;;;24877:3;24839:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24778:115;24961:22;24976:5;24961:9;;:13;;:22;;;;:::i;:::-;24949:9;:34;;;;25074:217;;;;;;;;25103:52;25138:15;25149:3;25138:6;:10;;:15;;;;:::i;:::-;25103:8;:22;25113:10;25103:22;;;;;;;;;;;;;;;:29;;;:33;;:52;;;;:::i;:::-;25074:217;;;;25179:5;:17;;;25074:217;;;;25222:12;25074:217;;;;25264:15;:13;:15::i;:::-;25074:217;;;25049:8;:22;25059:10;25049:22;;;;;;;;;;;;;;;:242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25348:69;25361:7;25370:6;25378:37;25396:5;:17;;;25378:12;:16;;:37;;;;:::i;:::-;25348:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25433:45;25451:12;:10;:12::i;:::-;25465:11;:9;:11::i;:::-;25433:45;;;;;;;;;;;;;;;;;;;;;;;;25514:33;25539:7;25514:20;;:24;;:33;;;;:::i;:::-;25491:20;:56;;;;25603:28;25624:6;25603:16;;:20;;:28;;;;:::i;:::-;25584:16;:47;;;;25693:36;25721:6;25693:22;;:26;;:36;;;;:::i;:::-;25668:22;:61;;;;25771:8;:6;:8::i;:::-;25829:6;25822:13;;;;;;23417:2427;;;;;:::o;25936:1221::-;25990:4;26007:16;;:::i;:::-;26026:8;:22;26036:10;26026:22;;;;;;;;;;;;;;;26007:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26059:18;26080:30;26098:10;26080:16;:30::i;:::-;26059:51;;26205:5;26188:13;:22;26183:957;;26254:8;:22;26264:10;26254:22;;;;;;;;;;;;;;;;26247:29;;;;;;;;;;;;;;;;;;;;;;;;;;26316:42;26330:10;26342:4;:11;;;26355:1;26316:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26391:11;:20;;;26413:10;26425:4;:11;;;26391:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26460:4;:11;;;26453:18;;;;;;26183:957;26563:11;26577:45;26615:5;26577:32;26594:13;26577:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;26563:59;;26707:249;;;;;;;;26739:25;26756:6;26739:4;:11;;;:15;;:25;;;;:::i;:::-;26707:249;;;;26792:54;26810:34;26828:4;:14;;;26810:12;:16;;:34;;;;:::i;:::-;26792:4;:12;;;:16;;:54;;;;:::i;:::-;26707:249;;;;26876:12;26707:249;;;;26922:4;:18;;;26707:249;;;26682:8;:22;26692:10;26682:22;;;;;;;;;;;;;;;:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26978:65;26992:10;27004:6;27012:8;:22;27022:10;27012:22;;;;;;;;;;;;;;;:29;;;26978:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27058:11;:20;;;27080:10;27092:6;27058:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27122:6;27115:13;;;;;25936:1221;;;;:::o;20408:613::-;15698:10;15688:20;;:6;;;;;;;;;;:20;;;15679:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20667:1:::1;20650:13;:11;:13::i;:::-;:18;20641:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20726:217;;;;;;;;20765:16;20726:217;;;;20809:12;20726:217;;;;20850:13;20726:217;;;;20889:10;20726:217;;;;20923:8;20726:217;;::::0;20718:5:::1;:225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20966:12;20954:9;:24;;;;21001:12;20989:9;:24;;;;20408:613:::0;;;;;;:::o;22936:254::-;22977:28;23042:13;23028:27;;:10;:27;;;23019:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23123:22;;23097:48;;23181:1;23156:22;:26;;;;22936:254;:::o;17095:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30786:262::-;30829:15;30874:166;31034:4;30874:154;:136;30909:49;30934:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30928:28;;:2;:28;30909:13;:11;:13::i;:::-;:17;;:49;;;;:::i;:::-;30974:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30874:19;:136::i;:::-;:152;:154::i;:::-;:158;;:166;;;;:::i;:::-;30861:179;;30786:262;:::o;16920:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29060:286::-;29103:11;29145:94;29198:38;29234:1;29206:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29198:31;;:35;;:38;;;;:::i;:::-;29191:2;:46;29145:40;29172:11;:9;:11::i;:::-;29145:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;29136:103;;29264:5;:18;;;29255:6;:27;29250:89;;;29309:5;:18;;;29300:27;;29250:89;29060:286;:::o;29705:138::-;29748:4;29773:62;29827:6;29773:48;29804:5;:15;;;29773:11;:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:48;;;;:::i;:::-;:52;;:62;;;;:::i;:::-;29766:69;;29705:138;:::o;31355:286::-;31398:11;31423:20;31446:29;31464:9;;31446:12;:16;;:29;;;;:::i;:::-;31423:52;;31495:57;31533:5;:17;;;31495:32;31510:15;31495:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;31486:66;;31577:9;;31568:6;:18;31563:71;;;31613:9;;31604:18;;31563:71;31355:286;;:::o;17270:21::-;;;;:::o;17188:::-;;;;:::o;678:250::-;736:7;765:1;760;:6;756:47;;;790:1;783:8;;;;756:47;815:9;831:1;827;:5;815:17;;860:1;855;851;:5;;;;;;:10;843:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;919:1;912:8;;;678:250;;;;;:::o;936:132::-;994:7;1021:39;1025:1;1028;1021:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;1014:46;;936:132;;;;:::o;145:181::-;203:7;223:9;239:1;235;:5;223:17;;264:1;259;:6;;251:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;317:1;310:8;;;145:181;;;;:::o;334:136::-;392:7;419:43;423:1;426;419:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;412:50;;334:136;;;;:::o;13860:719::-;13941:16;;:::i;:::-;13992:1;13978:11;:15;13970:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14064:1;14051:9;:14;14047:50;;;14074:23;;;;;;;;14095:1;14074:23;;;;;14067:30;;;;14047:50;14135:2;14114:24;;:9;:24;14110:462;;14155:14;14200:11;13286:3;14173:23;;:9;:23;;14172:39;;;;;;14155:56;;14252:2;14234:21;;:6;:21;;14226:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14312:26;;;;;;;;14330:6;14312:26;;;;;14305:33;;;;;14110:462;14371:14;14388:45;14404:9;13328:31;14421:11;14388:15;:45::i;:::-;14371:62;;14474:2;14456:21;;:6;:21;;14448:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14534:26;;;;;;;;14552:6;14534:26;;;;;14527:33;;;13860:719;;;;;:::o;13715:137::-;13786:4;13828:16;13817:4;:7;;;13812:13;;:32;;;;;;13805:39;;13715:137;;;:::o;28288:124::-;28341:28;28356:11;:9;:11::i;:::-;28341:9;;:13;;:28;;;;:::i;:::-;28329:9;:40;;;;28392:12;28380:9;:24;;;;28288:124::o;29978:164::-;30037:4;30062:72;30128:4;30062:60;:42;30083:6;30091:11;:9;:11::i;:::-;30062:19;:42::i;:::-;:58;:60::i;:::-;:64;;:72;;;;:::i;:::-;30055:79;;29978:164;;;:::o;8295:205::-;8396:96;8416:5;8446:27;;;8475:4;8481:2;8485:5;8423:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8396:19;:96::i;:::-;8295:205;;;;:::o;28539:370::-;28580:11;28614:94;28667:38;28703:1;28675:11;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28667:31;;:35;;:38;;;;:::i;:::-;28660:2;:46;28614:40;28641:11;:9;:11::i;:::-;28614:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:94;;;;:::i;:::-;28605:103;;28733:5;:18;;;28724:6;:27;28719:183;;;28778:5;:18;;;28769:27;;28719:183;;;28849:1;28827:5;:18;;;:23;28822:80;;28889:1;28868:5;:18;;:22;;;;28822:80;28719:183;28539:370;:::o;27310:917::-;27348:19;27370:45;27396:10;:17;;;27370:10;:20;;;:24;;:45;;;;:::i;:::-;27348:67;;27449:1;27430:10;:15;;;:20;;:54;;;;;27470:14;27454:12;:30;;27430:54;27426:794;;;27502:12;27517:5;:21;;;27502:36;;27558:10;:14;;;;;;;;;;;;27553:494;;;27618:44;27645:10;:15;;;27618:5;:21;;;:25;;:44;;;;:::i;:::-;27594:5;:21;;:68;;;;27711:10;:17;;;27686:5;:21;;;:42;27681:112;;27772:1;27754:10;:15;;:19;;;;27681:112;27553:494;;;27857:44;27884:10;:15;;;27857:5;:21;;;:25;;:44;;;;:::i;:::-;27833:5;:21;;:68;;;;27950:10;:17;;;27925:5;:21;;;:42;27920:112;;28011:1;27993:10;:15;;:19;;;;27920:112;27553:494;28084:12;28061:10;:20;;:35;;;;28116:92;28143:7;28152:5;:21;;;28175:10;:15;;;28192:10;:14;;;;;;;;;;;;28116:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27426:794;;27310:917;:::o;1076:189::-;1162:7;1194:1;1190;:5;1197:12;1182:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1221:9;1237:1;1233;:5;;;;;;1221:17;;1256:1;1249:8;;;1076:189;;;;;:::o;478:192::-;564:7;597:1;592;:6;;600:12;584:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;624:9;640:1;636;:5;624:17;;661:1;654:8;;;478:192;;;;;:::o;10730:347::-;10836:7;10857:9;10868;10881:13;10889:1;10892;10881:7;:13::i;:::-;10856:38;;;;10905:10;10931:1;10918:15;;;;;10928:1;10925;10918:15;10905:28;;10953:1;10948:2;:6;10944:18;;;10961:1;10956:6;;;;10944:18;10978:2;10973:7;;;;11003:1;10999;:5;10991:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11053:16;11061:1;11064;11067;11053:7;:16::i;:::-;11046:23;;;;;10730:347;;;;;:::o;9499:420::-;9582:23;9608:69;9636:4;9608:69;;;;;;;;;;;;;;;;;9616:5;9608:27;;;;:69;;;;;:::i;:::-;9582:95;;9712:1;9692:10;:17;:21;9688:224;;;9834:10;9823:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9815:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9688:224;9499:420;;;:::o;10022:210::-;10083:9;10094;10116:10;10150:2;10129:25;;;;;10139:1;10136;10129:25;10116:38;;10173:1;10169;:5;10165:9;;10194:1;10189:2;:6;10185:10;;10215:1;10210:2;:6;10206:18;;;10223:1;10218:6;;;;10206:18;10022:210;;;;;;:::o;10240:482::-;10346:7;10366:12;10386:1;10385:2;;10381:1;:6;10366:21;;10403:4;10398:9;;;;;;;;;10423:4;10418:9;;;;;;;;;10465:1;10458:4;10450;10449:5;;10448:14;;;;;;:18;10443:1;:24;10438:29;;;;10478:9;10490:1;10478:13;;10515:1;10511;:5;10507:1;:9;10502:14;;;;10540:1;10536;:5;10532:1;:9;10527:14;;;;10565:1;10561;:5;10557:1;:9;10552:14;;;;10590:1;10586;:5;10582:1;:9;10577:14;;;;10615:1;10611;:5;10607:1;:9;10602:14;;;;10640:1;10636;:5;10632:1;:9;10627:14;;;;10665:1;10661;:5;10657:1;:9;10652:14;;;;10690:1;10686;:5;10682:1;:9;10677:14;;;;10713:1;10709;:5;10702:12;;;;10240:482;;;;;:::o;2850:196::-;2953:12;2985:53;3008:6;3016:4;3022:1;3025:12;2985:22;:53::i;:::-;2978:60;;2850:196;;;;;:::o;3826:979::-;3956:12;3989:18;4000:6;3989:10;:18::i;:::-;3981:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4115:12;4129:23;4156:6;:11;;4176:8;4187:4;4156:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4114:78;;;;4207:7;4203:595;;;4238:10;4231:17;;;;;;4203:595;4372:1;4352:10;:17;:21;4348:439;;;4615:10;4609:17;4676:15;4663:10;4659:2;4655:19;4648:44;4563:148;4758:12;4751:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3826:979;;;;;;;:::o;2023:233::-;2083:4;2102:12;2213:7;2201:20;2193:28;;2247:1;2240:4;:8;2233:15;;;2023:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://534e04728123362f376f70180716c54d4c6a44d2c6775c6f7aee44a2c8273bae
Loading...
Loading
Loading...
Loading
Net Worth in USD
$226.56
Net Worth in ETH
0.114955
Token Allocations
ALCX
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $4.91 | 46.1429 | $226.56 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.