Feature Tip: Add private address tag to any address under My Name Tag !
Latest 25 from a total of 102 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Reweight | 12317045 | 1762 days ago | IN | 0 ETH | 0.029279 | ||||
| Reweight | 12224950 | 1776 days ago | IN | 0 ETH | 0.026079 | ||||
| Reweight | 12218103 | 1777 days ago | IN | 0 ETH | 0.0199744 | ||||
| Reweight | 12200054 | 1780 days ago | IN | 0 ETH | 0.1571316 | ||||
| Reweight | 12198159 | 1780 days ago | IN | 0 ETH | 0.09427896 | ||||
| Reweight | 12196415 | 1781 days ago | IN | 0 ETH | 0.08092277 | ||||
| Reweight | 12196094 | 1781 days ago | IN | 0 ETH | 0.20427108 | ||||
| Reweight | 12196080 | 1781 days ago | IN | 0 ETH | 0.10057346 | ||||
| Reweight | 12195880 | 1781 days ago | IN | 0 ETH | 0.06583965 | ||||
| Reweight | 12195876 | 1781 days ago | IN | 0 ETH | 0.13616099 | ||||
| Reweight | 12195795 | 1781 days ago | IN | 0 ETH | 0.11863435 | ||||
| Reweight | 12195731 | 1781 days ago | IN | 0 ETH | 0.31662017 | ||||
| Reweight | 12195721 | 1781 days ago | IN | 0 ETH | 0.08326519 | ||||
| Reweight | 12195720 | 1781 days ago | IN | 0 ETH | 0.1571316 | ||||
| Reweight | 12195612 | 1781 days ago | IN | 0 ETH | 0.14100569 | ||||
| Reweight | 12195611 | 1781 days ago | IN | 0 ETH | 0.0509392 | ||||
| Reweight | 12195611 | 1781 days ago | IN | 0 ETH | 0.0509392 | ||||
| Reweight | 12195611 | 1781 days ago | IN | 0 ETH | 0.0509392 | ||||
| Reweight | 12195610 | 1781 days ago | IN | 0 ETH | 0.15422498 | ||||
| Reweight | 12195609 | 1781 days ago | IN | 0 ETH | 0.0322878 | ||||
| Reweight | 12195607 | 1781 days ago | IN | 0 ETH | 0.02056548 | ||||
| Reweight | 12195606 | 1781 days ago | IN | 0 ETH | 0.02056548 | ||||
| Reweight | 12195606 | 1781 days ago | IN | 0 ETH | 0.16758417 | ||||
| Reweight | 12195604 | 1781 days ago | IN | 0 ETH | 0.0179583 | ||||
| Reweight | 12195598 | 1781 days ago | IN | 0 ETH | 0.15585327 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12200054 | 1780 days ago | 467,458.55760689 ETH | ||||
| - | 12200054 | 1780 days ago | 644.6706399 ETH | ||||
| - | 12200054 | 1780 days ago | 468,103.22824679 ETH | ||||
| - | 12198159 | 1780 days ago | 467,866.246878 ETH | ||||
| - | 12198159 | 1780 days ago | 654.65456731 ETH | ||||
| - | 12198159 | 1780 days ago | 468,520.90144531 ETH | ||||
| - | 12196415 | 1781 days ago | 476,020.61828037 ETH | ||||
| - | 12196415 | 1781 days ago | 619.87492019 ETH | ||||
| - | 12196415 | 1781 days ago | 476,640.49320056 ETH | ||||
| - | 12196415 | 1781 days ago | 494,020.87136966 ETH | ||||
| - | 12196415 | 1781 days ago | 435.74295856 ETH | ||||
| - | 12196415 | 1781 days ago | 494,456.61432823 ETH | ||||
| - | 12196094 | 1781 days ago | 487,349.1363392 ETH | ||||
| - | 12196094 | 1781 days ago | 505.2655316 ETH | ||||
| - | 12196094 | 1781 days ago | 487,854.4018708 ETH | ||||
| - | 12196094 | 1781 days ago | 495,349.24914814 ETH | ||||
| - | 12196094 | 1781 days ago | 423.4287794 ETH | ||||
| - | 12196094 | 1781 days ago | 495,772.67792754 ETH | ||||
| - | 12196080 | 1781 days ago | 487,239.51256721 ETH | ||||
| - | 12196080 | 1781 days ago | 506.38663869 ETH | ||||
| - | 12196080 | 1781 days ago | 487,745.8992059 ETH | ||||
| - | 12196080 | 1781 days ago | 495,239.62534707 ETH | ||||
| - | 12196080 | 1781 days ago | 424.54991557 ETH | ||||
| - | 12196080 | 1781 days ago | 495,664.17526264 ETH | ||||
| - | 12195880 | 1781 days ago | 486,358.25866984 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
EthUniswapPCVController
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-03-30
*/
// hevm: flattened sources of ./contracts/pcv/EthUniswapPCVController.sol
pragma solidity >=0.4.0 >=0.5.0 >=0.6.0 >=0.6.2 >=0.6.0 <0.7.0 >=0.6.0 <0.8.0 >=0.6.2 <0.7.0 >=0.6.2 <0.8.0;
pragma experimental ABIEncoderV2;
////// ./contracts/core/IPermissions.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/// @title Permissions interface
/// @author Fei Protocol
interface IPermissions {
// ----------- Governor only state changing api -----------
function createRole(bytes32 role, bytes32 adminRole) external;
function grantMinter(address minter) external;
function grantBurner(address burner) external;
function grantPCVController(address pcvController) external;
function grantGovernor(address governor) external;
function grantGuardian(address guardian) external;
function revokeMinter(address minter) external;
function revokeBurner(address burner) external;
function revokePCVController(address pcvController) external;
function revokeGovernor(address governor) external;
function revokeGuardian(address guardian) external;
// ----------- Revoker only state changing api -----------
function revokeOverride(bytes32 role, address account) external;
// ----------- Getters -----------
function isBurner(address _address) external view returns (bool);
function isMinter(address _address) external view returns (bool);
function isGovernor(address _address) external view returns (bool);
function isGuardian(address _address) external view returns (bool);
function isPCVController(address _address) external view returns (bool);
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20_5 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
////// ./contracts/token/IFei.sol
/* pragma solidity ^0.6.2; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/token/ERC20/IERC20.sol"; */
/// @title FEI stablecoin interface
/// @author Fei Protocol
interface IFei is IERC20_5 {
// ----------- Events -----------
event Minting(
address indexed _to,
address indexed _minter,
uint256 _amount
);
event Burning(
address indexed _to,
address indexed _burner,
uint256 _amount
);
event IncentiveContractUpdate(
address indexed _incentivized,
address indexed _incentiveContract
);
// ----------- State changing api -----------
function burn(uint256 amount) external;
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
// ----------- Burner only state changing api -----------
function burnFrom(address account, uint256 amount) external;
// ----------- Minter only state changing api -----------
function mint(address account, uint256 amount) external;
// ----------- Governor only state changing api -----------
function setIncentiveContract(address account, address incentive) external;
// ----------- Getters -----------
function incentiveContract(address account) external view returns (address);
}
////// ./contracts/core/ICore.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "./IPermissions.sol"; */
/* import "../token/IFei.sol"; */
/// @title Core Interface
/// @author Fei Protocol
interface ICore is IPermissions {
// ----------- Events -----------
event FeiUpdate(address indexed _fei);
event TribeUpdate(address indexed _tribe);
event GenesisGroupUpdate(address indexed _genesisGroup);
event TribeAllocation(address indexed _to, uint256 _amount);
event GenesisPeriodComplete(uint256 _timestamp);
// ----------- Governor only state changing api -----------
function init() external;
// ----------- Governor only state changing api -----------
function setFei(address token) external;
function setTribe(address token) external;
function setGenesisGroup(address _genesisGroup) external;
function allocateTribe(address to, uint256 amount) external;
// ----------- Genesis Group only state changing api -----------
function completeGenesisGroup() external;
// ----------- Getters -----------
function fei() external view returns (IFei);
function tribe() external view returns (IERC20_5);
function genesisGroup() external view returns (address);
function hasGenesisGroupCompleted() external view returns (bool);
}
////// ./contracts/external/SafeMathCopy.sol
// SPDX-License-Identifier: MIT
/* pragma solidity ^0.6.0; */
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMathCopy { // To avoid namespace collision between openzeppelin safemath and uniswap safemath
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
////// ./contracts/external/Decimal.sol
/*
Copyright 2019 dYdX Trading Inc.
Copyright 2020 Empty Set Squad <emptysetsquad@protonmail.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "./SafeMathCopy.sol"; */
/**
* @title Decimal
* @author dYdX
*
* Library that defines a fixed-point number with 18 decimal places.
*/
library Decimal {
using SafeMathCopy for uint256;
// ============ Constants ============
uint256 private constant BASE = 10**18;
// ============ Structs ============
struct D256 {
uint256 value;
}
// ============ Static Functions ============
function zero()
internal
pure
returns (D256 memory)
{
return D256({ value: 0 });
}
function one()
internal
pure
returns (D256 memory)
{
return D256({ value: BASE });
}
function from(
uint256 a
)
internal
pure
returns (D256 memory)
{
return D256({ value: a.mul(BASE) });
}
function ratio(
uint256 a,
uint256 b
)
internal
pure
returns (D256 memory)
{
return D256({ value: getPartial(a, BASE, b) });
}
// ============ Self Functions ============
function add(
D256 memory self,
uint256 b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.add(b.mul(BASE)) });
}
function sub(
D256 memory self,
uint256 b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.sub(b.mul(BASE)) });
}
function sub(
D256 memory self,
uint256 b,
string memory reason
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.sub(b.mul(BASE), reason) });
}
function mul(
D256 memory self,
uint256 b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.mul(b) });
}
function div(
D256 memory self,
uint256 b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.div(b) });
}
function pow(
D256 memory self,
uint256 b
)
internal
pure
returns (D256 memory)
{
if (b == 0) {
return from(1);
}
D256 memory temp = D256({ value: self.value });
for (uint256 i = 1; i < b; i++) {
temp = mul(temp, self);
}
return temp;
}
function add(
D256 memory self,
D256 memory b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.add(b.value) });
}
function sub(
D256 memory self,
D256 memory b
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.sub(b.value) });
}
function sub(
D256 memory self,
D256 memory b,
string memory reason
)
internal
pure
returns (D256 memory)
{
return D256({ value: self.value.sub(b.value, reason) });
}
function mul(
D256 memory self,
D256 memory b
)
internal
pure
returns (D256 memory)
{
return D256({ value: getPartial(self.value, b.value, BASE) });
}
function div(
D256 memory self,
D256 memory b
)
internal
pure
returns (D256 memory)
{
return D256({ value: getPartial(self.value, BASE, b.value) });
}
function equals(D256 memory self, D256 memory b) internal pure returns (bool) {
return self.value == b.value;
}
function greaterThan(D256 memory self, D256 memory b) internal pure returns (bool) {
return compareTo(self, b) == 2;
}
function lessThan(D256 memory self, D256 memory b) internal pure returns (bool) {
return compareTo(self, b) == 0;
}
function greaterThanOrEqualTo(D256 memory self, D256 memory b) internal pure returns (bool) {
return compareTo(self, b) > 0;
}
function lessThanOrEqualTo(D256 memory self, D256 memory b) internal pure returns (bool) {
return compareTo(self, b) < 2;
}
function isZero(D256 memory self) internal pure returns (bool) {
return self.value == 0;
}
function asUint256(D256 memory self) internal pure returns (uint256) {
return self.value.div(BASE);
}
// ============ Core Methods ============
function getPartial(
uint256 target,
uint256 numerator,
uint256 denominator
)
private
pure
returns (uint256)
{
return target.mul(numerator).div(denominator);
}
function compareTo(
D256 memory a,
D256 memory b
)
private
pure
returns (uint256)
{
if (a.value == b.value) {
return 1;
}
return a.value > b.value ? 2 : 0;
}
}
////// ./contracts/external/UniswapV2Library.sol
/* pragma solidity >=0.6.0; */
/* import "./SafeMathCopy.sol"; */
library UniswapV2Library_2 {
using SafeMathCopy for uint;
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
uint amountInWithFee = amountIn.mul(997);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(amountInWithFee);
amountOut = numerator / denominator;
}
}
////// ./contracts/oracle/IOracle.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "../external/Decimal.sol"; */
/// @title generic oracle interface for Fei Protocol
/// @author Fei Protocol
interface IOracle {
// ----------- Events -----------
event Update(uint256 _peg);
// ----------- State changing API -----------
function update() external returns (bool);
// ----------- Getters -----------
function read() external view returns (Decimal.D256 memory, bool);
function isOutdated() external view returns (bool);
}
////// ./contracts/pcv/IPCVDeposit.sol
/* pragma solidity ^0.6.2; */
/// @title a PCV Deposit interface
/// @author Fei Protocol
interface IPCVDeposit {
// ----------- Events -----------
event Deposit(address indexed _from, uint256 _amount);
event Withdrawal(
address indexed _caller,
address indexed _to,
uint256 _amount
);
// ----------- State changing api -----------
function deposit(uint256 amount) external payable;
// ----------- PCV Controller only state changing api -----------
function withdraw(address to, uint256 amount) external;
// ----------- Getters -----------
function totalValue() external view returns (uint256);
}
////// ./contracts/token/IIncentive.sol
/* pragma solidity ^0.6.2; */
/// @title incentive contract interface
/// @author Fei Protocol
/// @notice Called by FEI token contract when transferring with an incentivized address
/// @dev should be appointed as a Minter or Burner as needed
interface IIncentive {
// ----------- Fei only state changing api -----------
/// @notice apply incentives on transfer
/// @param sender the sender address of the FEI
/// @param receiver the receiver address of the FEI
/// @param operator the operator (msg.sender) of the transfer
/// @param amount the amount of FEI transferred
function incentivize(
address sender,
address receiver,
address operator,
uint256 amount
) external;
}
////// ./contracts/token/IUniswapIncentive.sol
/* pragma solidity ^0.6.2; */
/* pragma experimental ABIEncoderV2; */
/* import "./IIncentive.sol"; */
/* import "../external/Decimal.sol"; */
/// @title UniswapIncentive interface
/// @author Fei Protocol
interface IUniswapIncentive is IIncentive {
// ----------- Events -----------
event TimeWeightUpdate(uint256 _weight, bool _active);
event GrowthRateUpdate(uint256 _growthRate);
event ExemptAddressUpdate(address indexed _account, bool _isExempt);
// ----------- Governor only state changing api -----------
function setExemptAddress(address account, bool isExempt) external;
function setTimeWeightGrowth(uint32 growthRate) external;
function setTimeWeight(
uint32 weight,
uint32 growth,
bool active
) external;
// ----------- Getters -----------
function isIncentiveParity() external view returns (bool);
function isExemptAddress(address account) external view returns (bool);
// solhint-disable-next-line func-name-mixedcase
function TIME_WEIGHT_GRANULARITY() external view returns (uint32);
function getGrowthRate() external view returns (uint32);
function getTimeWeight() external view returns (uint32);
function isTimeWeightActive() external view returns (bool);
function getBuyIncentive(uint256 amount)
external
view
returns (
uint256 incentive,
uint32 weight,
Decimal.D256 memory initialDeviation,
Decimal.D256 memory finalDeviation
);
function getSellPenalty(uint256 amount)
external
view
returns (
uint256 penalty,
Decimal.D256 memory initialDeviation,
Decimal.D256 memory finalDeviation
);
function getSellPenaltyMultiplier(
Decimal.D256 calldata initialDeviation,
Decimal.D256 calldata finalDeviation
) external view returns (Decimal.D256 memory);
function getBuyIncentiveMultiplier(
Decimal.D256 calldata initialDeviation,
Decimal.D256 calldata finalDeviation
) external view returns (Decimal.D256 memory);
}
////// ./contracts/pcv/IUniswapPCVController.sol
/* pragma solidity ^0.6.2; */
/* pragma experimental ABIEncoderV2; */
/* import "./IPCVDeposit.sol"; */
/* import "../token/IUniswapIncentive.sol"; */
/// @title a Uniswap PCV Controller interface
/// @author Fei Protocol
interface IUniswapPCVController {
// ----------- Events -----------
event Reweight(address indexed _caller);
event PCVDepositUpdate(address indexed _pcvDeposit);
event ReweightIncentiveUpdate(uint256 _amount);
event ReweightMinDistanceUpdate(uint256 _basisPoints);
event ReweightWithdrawBPsUpdate(uint256 _reweightWithdrawBPs);
// ----------- State changing API -----------
function reweight() external;
// ----------- Governor only state changing API -----------
function forceReweight() external;
function setPCVDeposit(address _pcvDeposit) external;
function setReweightIncentive(uint256 amount) external;
function setReweightMinDistance(uint256 basisPoints) external;
function setReweightWithdrawBPs(uint256 _reweightWithdrawBPs) external;
// ----------- Getters -----------
function pcvDeposit() external view returns (IPCVDeposit);
function incentiveContract() external view returns (IUniswapIncentive);
function reweightIncentiveAmount() external view returns (uint256);
function reweightEligible() external view returns (bool);
function reweightWithdrawBPs() external view returns (uint256);
function minDistanceForReweight()
external
view
returns (Decimal.D256 memory);
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol
/* pragma solidity >=0.5.0; */
interface IUniswapV2Pair_3 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
/* pragma solidity >=0.6.2; */
interface IUniswapV2Router01_2 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
/* pragma solidity >=0.6.2; */
/* import './IUniswapV2Router01.sol'; */
interface IUniswapV2Router02_2 is IUniswapV2Router01_2 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
////// ./contracts/refs/IUniRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/token/ERC20/IERC20.sol"; */
/* import "../external/Decimal.sol"; */
/// @title UniRef interface
/// @author Fei Protocol
interface IUniRef {
// ----------- Events -----------
event PairUpdate(address indexed _pair);
// ----------- Governor only state changing api -----------
function setPair(address _pair) external;
// ----------- Getters -----------
function router() external view returns (IUniswapV2Router02_2);
function pair() external view returns (IUniswapV2Pair_3);
function token() external view returns (address);
function getReserves()
external
view
returns (uint256 feiReserves, uint256 tokenReserves);
function deviationBelowPeg(
Decimal.D256 calldata price,
Decimal.D256 calldata peg
) external pure returns (Decimal.D256 memory);
function liquidityOwned() external view returns (uint256);
}
////// ./contracts/refs/ICoreRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "../core/ICore.sol"; */
/// @title CoreRef interface
/// @author Fei Protocol
interface ICoreRef {
// ----------- Events -----------
event CoreUpdate(address indexed _core);
// ----------- Governor only state changing api -----------
function setCore(address core) external;
function pause() external;
function unpause() external;
// ----------- Getters -----------
function core() external view returns (ICore);
function fei() external view returns (IFei);
function tribe() external view returns (IERC20_5);
function feiBalance() external view returns (uint256);
function tribeBalance() external view returns (uint256);
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.2 <0.8.0; */
/**
* @dev Collection of functions related to the address type
*/
library Address_2 {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
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");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
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");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
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);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
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);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
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 {
// 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);
}
}
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context_2 {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/Pausable.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/* import "./Context.sol"; */
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable_2 is Context_2 {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
////// ./contracts/refs/CoreRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "./ICoreRef.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/Pausable.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/Address.sol"; */
/// @title A Reference to Core
/// @author Fei Protocol
/// @notice defines some modifiers and utilities around interacting with Core
abstract contract CoreRef is ICoreRef, Pausable_2 {
ICore private _core;
/// @notice CoreRef constructor
/// @param core Fei Core to reference
constructor(address core) public {
_core = ICore(core);
}
modifier ifMinterSelf() {
if (_core.isMinter(address(this))) {
_;
}
}
modifier ifBurnerSelf() {
if (_core.isBurner(address(this))) {
_;
}
}
modifier onlyMinter() {
require(_core.isMinter(msg.sender), "CoreRef: Caller is not a minter");
_;
}
modifier onlyBurner() {
require(_core.isBurner(msg.sender), "CoreRef: Caller is not a burner");
_;
}
modifier onlyPCVController() {
require(
_core.isPCVController(msg.sender),
"CoreRef: Caller is not a PCV controller"
);
_;
}
modifier onlyGovernor() {
require(
_core.isGovernor(msg.sender),
"CoreRef: Caller is not a governor"
);
_;
}
modifier onlyGuardianOrGovernor() {
require(
_core.isGovernor(msg.sender) ||
_core.isGuardian(msg.sender),
"CoreRef: Caller is not a guardian or governor"
);
_;
}
modifier onlyFei() {
require(msg.sender == address(fei()), "CoreRef: Caller is not FEI");
_;
}
modifier onlyGenesisGroup() {
require(
msg.sender == _core.genesisGroup(),
"CoreRef: Caller is not GenesisGroup"
);
_;
}
modifier postGenesis() {
require(
_core.hasGenesisGroupCompleted(),
"CoreRef: Still in Genesis Period"
);
_;
}
modifier nonContract() {
require(!Address_2.isContract(msg.sender), "CoreRef: Caller is a contract");
_;
}
/// @notice set new Core reference address
/// @param core the new core address
function setCore(address core) external override onlyGovernor {
_core = ICore(core);
emit CoreUpdate(core);
}
/// @notice set pausable methods to paused
function pause() public override onlyGuardianOrGovernor {
_pause();
}
/// @notice set pausable methods to unpaused
function unpause() public override onlyGuardianOrGovernor {
_unpause();
}
/// @notice address of the Core contract referenced
/// @return ICore implementation address
function core() public view override returns (ICore) {
return _core;
}
/// @notice address of the Fei contract referenced by Core
/// @return IFei implementation address
function fei() public view override returns (IFei) {
return _core.fei();
}
/// @notice address of the Tribe contract referenced by Core
/// @return IERC20 implementation address
function tribe() public view override returns (IERC20_5) {
return _core.tribe();
}
/// @notice fei balance of contract
/// @return fei amount held
function feiBalance() public view override returns (uint256) {
return fei().balanceOf(address(this));
}
/// @notice tribe balance of contract
/// @return tribe amount held
function tribeBalance() public view override returns (uint256) {
return tribe().balanceOf(address(this));
}
function _burnFeiHeld() internal {
fei().burn(feiBalance());
}
function _mintFei(uint256 amount) internal {
fei().mint(address(this), amount);
}
}
////// ./contracts/refs/IOracleRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "../oracle/IOracle.sol"; */
/// @title OracleRef interface
/// @author Fei Protocol
interface IOracleRef {
// ----------- Events -----------
event OracleUpdate(address indexed _oracle);
// ----------- State changing API -----------
function updateOracle() external returns (bool);
// ----------- Governor only state changing API -----------
function setOracle(address _oracle) external;
// ----------- Getters -----------
function oracle() external view returns (IOracle);
function peg() external view returns (Decimal.D256 memory);
function invert(Decimal.D256 calldata price)
external
pure
returns (Decimal.D256 memory);
}
////// ./contracts/refs/OracleRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "./IOracleRef.sol"; */
/* import "./CoreRef.sol"; */
/// @title Reference to an Oracle
/// @author Fei Protocol
/// @notice defines some utilities around interacting with the referenced oracle
abstract contract OracleRef is IOracleRef, CoreRef {
using Decimal for Decimal.D256;
/// @notice the oracle reference by the contract
IOracle public override oracle;
/// @notice OracleRef constructor
/// @param _core Fei Core to reference
/// @param _oracle oracle to reference
constructor(address _core, address _oracle) public CoreRef(_core) {
_setOracle(_oracle);
}
/// @notice sets the referenced oracle
/// @param _oracle the new oracle to reference
function setOracle(address _oracle) external override onlyGovernor {
_setOracle(_oracle);
}
/// @notice invert a peg price
/// @param price the peg price to invert
/// @return the inverted peg as a Decimal
/// @dev the inverted peg would be X per FEI
function invert(Decimal.D256 memory price)
public
pure
override
returns (Decimal.D256 memory)
{
return Decimal.one().div(price);
}
/// @notice updates the referenced oracle
/// @return true if the update is effective
function updateOracle() public override returns (bool) {
return oracle.update();
}
/// @notice the peg price of the referenced oracle
/// @return the peg as a Decimal
/// @dev the peg is defined as FEI per X with X being ETH, dollars, etc
function peg() public view override returns (Decimal.D256 memory) {
(Decimal.D256 memory _peg, bool valid) = oracle.read();
require(valid, "OracleRef: oracle invalid");
return _peg;
}
function _setOracle(address _oracle) internal {
oracle = IOracle(_oracle);
emit OracleUpdate(_oracle);
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/math/SignedSafeMath.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/**
* @title SignedSafeMath
* @dev Signed math operations with safety checks that revert on error.
*/
library SignedSafeMath_2 {
int256 constant private _INT256_MIN = -2**255;
/**
* @dev Returns the multiplication of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two signed integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero");
require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;
return c;
}
/**
* @dev Returns the subtraction of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
return c;
}
/**
* @dev Returns the addition of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
return c;
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/SafeCast.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/**
* @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*
* Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
* all math on `uint256` and `int256` and then downcasting.
*/
library SafeCast_2 {
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toUint128(uint256 value) internal pure returns (uint128) {
require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
return uint128(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toUint64(uint256 value) internal pure returns (uint64) {
require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
return uint64(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toUint32(uint256 value) internal pure returns (uint32) {
require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
return uint32(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toUint16(uint256 value) internal pure returns (uint16) {
require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits.
*/
function toUint8(uint256 value) internal pure returns (uint8) {
require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*/
function toUint256(int256 value) internal pure returns (uint256) {
require(value >= 0, "SafeCast: value must be positive");
return uint256(value);
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*
* _Available since v3.1._
*/
function toInt128(int256 value) internal pure returns (int128) {
require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits");
return int128(value);
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*
* _Available since v3.1._
*/
function toInt64(int256 value) internal pure returns (int64) {
require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits");
return int64(value);
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*
* _Available since v3.1._
*/
function toInt32(int256 value) internal pure returns (int32) {
require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits");
return int32(value);
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*
* _Available since v3.1._
*/
function toInt16(int256 value) internal pure returns (int16) {
require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits");
return int16(value);
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits.
*
* _Available since v3.1._
*/
function toInt8(int256 value) internal pure returns (int8) {
require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits");
return int8(value);
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*/
function toInt256(uint256 value) internal pure returns (int256) {
require(value < 2**255, "SafeCast: value doesn't fit in an int256");
return int256(value);
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/lib/contracts/libraries/Babylonian.sol
// SPDX-License-Identifier: GPL-3.0-or-later
/* pragma solidity >=0.4.0; */
// computes square roots using the babylonian method
// https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method
library Babylonian_3 {
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
// else z = 0
}
}
////// ./contracts/refs/UniRef.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/math/SignedSafeMath.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/utils/SafeCast.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/lib/contracts/libraries/Babylonian.sol"; */
/* import "./OracleRef.sol"; */
/* import "./IUniRef.sol"; */
/// @title A Reference to Uniswap
/// @author Fei Protocol
/// @notice defines some modifiers and utilities around interacting with Uniswap
/// @dev the uniswap pair should be FEI and another asset
abstract contract UniRef is IUniRef, OracleRef {
using Decimal for Decimal.D256;
using Babylonian_3 for uint256;
using SignedSafeMath_2 for int256;
using SafeMathCopy for uint256;
using SafeCast_2 for uint256;
using SafeCast_2 for int256;
/// @notice the Uniswap router contract
IUniswapV2Router02_2 public override router;
/// @notice the referenced Uniswap pair contract
IUniswapV2Pair_3 public override pair;
/// @notice UniRef constructor
/// @param _core Fei Core to reference
/// @param _pair Uniswap pair to reference
/// @param _router Uniswap Router to reference
/// @param _oracle oracle to reference
constructor(
address _core,
address _pair,
address _router,
address _oracle
) public OracleRef(_core, _oracle) {
_setupPair(_pair);
router = IUniswapV2Router02_2(_router);
_approveToken(address(fei()));
_approveToken(token());
_approveToken(_pair);
}
/// @notice set the new pair contract
/// @param _pair the new pair
/// @dev also approves the router for the new pair token and underlying token
function setPair(address _pair) external override onlyGovernor {
_setupPair(_pair);
_approveToken(token());
_approveToken(_pair);
}
/// @notice the address of the non-fei underlying token
function token() public view override returns (address) {
address token0 = pair.token0();
if (address(fei()) == token0) {
return pair.token1();
}
return token0;
}
/// @notice pair reserves with fei listed first
/// @dev uses the max of pair fei balance and fei reserves. Mitigates attack vectors which manipulate the pair balance
function getReserves()
public
view
override
returns (uint256 feiReserves, uint256 tokenReserves)
{
address token0 = pair.token0();
(uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
(feiReserves, tokenReserves) = address(fei()) == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
return (feiReserves, tokenReserves);
}
/// @notice get deviation from peg as a percent given price
/// @dev will return Decimal.zero() if above peg
function deviationBelowPeg(
Decimal.D256 calldata price,
Decimal.D256 calldata peg
) external pure override returns (Decimal.D256 memory) {
return _deviationBelowPeg(price, peg);
}
/// @notice amount of pair liquidity owned by this contract
/// @return amount of LP tokens
function liquidityOwned() public view override returns (uint256) {
return pair.balanceOf(address(this));
}
/// @notice ratio of all pair liquidity owned by this contract
function _ratioOwned() internal view returns (Decimal.D256 memory) {
uint256 balance = liquidityOwned();
uint256 total = pair.totalSupply();
return Decimal.ratio(balance, total);
}
/// @notice returns true if price is below the peg
/// @dev counterintuitively checks if peg < price because price is reported as FEI per X
function _isBelowPeg(Decimal.D256 memory peg) internal view returns (bool) {
(Decimal.D256 memory price, , ) = _getUniswapPrice();
return peg.lessThan(price);
}
/// @notice approves a token for the router
function _approveToken(address _token) internal {
uint256 maxTokens = uint256(-1);
IERC20_5(_token).approve(address(router), maxTokens);
}
function _setupPair(address _pair) internal {
pair = IUniswapV2Pair_3(_pair);
emit PairUpdate(_pair);
}
function _isPair(address account) internal view returns (bool) {
return address(pair) == account;
}
/// @notice utility for calculating absolute distance from peg based on reserves
/// @param reserveTarget pair reserves of the asset desired to trade with
/// @param reserveOther pair reserves of the non-traded asset
/// @param peg the target peg reported as Target per Other
function _getAmountToPeg(
uint256 reserveTarget,
uint256 reserveOther,
Decimal.D256 memory peg
) internal pure returns (uint256) {
uint256 radicand = peg.mul(reserveTarget).mul(reserveOther).asUint256();
uint256 root = radicand.sqrt();
if (root > reserveTarget) {
return (root - reserveTarget).mul(1000).div(997);
}
return (reserveTarget - root).mul(1000).div(997);
}
/// @notice calculate amount of Fei needed to trade back to the peg
function _getAmountToPegFei(
uint256 feiReserves,
uint256 tokenReserves,
Decimal.D256 memory peg
) internal pure returns (uint256) {
return _getAmountToPeg(feiReserves, tokenReserves, peg);
}
/// @notice calculate amount of the not Fei token needed to trade back to the peg
function _getAmountToPegOther(
uint256 feiReserves,
uint256 tokenReserves,
Decimal.D256 memory peg
) internal pure returns (uint256) {
return _getAmountToPeg(tokenReserves, feiReserves, invert(peg));
}
/// @notice get uniswap price and reserves
/// @return price reported as Fei per X
/// @return reserveFei fei reserves
/// @return reserveOther non-fei reserves
function _getUniswapPrice()
internal
view
returns (
Decimal.D256 memory,
uint256 reserveFei,
uint256 reserveOther
)
{
(reserveFei, reserveOther) = getReserves();
return (
Decimal.ratio(reserveFei, reserveOther),
reserveFei,
reserveOther
);
}
/// @notice get final uniswap price after hypothetical FEI trade
/// @param amountFei a signed integer representing FEI trade. Positive=sell, negative=buy
/// @param reserveFei fei reserves
/// @param reserveOther non-fei reserves
function _getFinalPrice(
int256 amountFei,
uint256 reserveFei,
uint256 reserveOther
) internal pure returns (Decimal.D256 memory) {
uint256 k = reserveFei.mul(reserveOther);
int256 signedReservesFei = reserveFei.toInt256();
int256 amountFeiWithFee = amountFei > 0 ? amountFei.mul(997).div(1000) : amountFei; // buys already have fee factored in on uniswap's other token side
uint256 adjustedReserveFei = signedReservesFei.add(amountFeiWithFee).toUint256();
uint256 adjustedReserveOther = k / adjustedReserveFei;
return Decimal.ratio(adjustedReserveFei, adjustedReserveOther); // alt: adjustedReserveFei^2 / k
}
/// @notice return the percent distance from peg before and after a hypothetical trade
/// @param amountIn a signed amount of FEI to be traded. Positive=sell, negative=buy
/// @return initialDeviation the percent distance from peg before trade
/// @return finalDeviation the percent distance from peg after hypothetical trade
/// @dev deviations will return Decimal.zero() if above peg
function _getPriceDeviations(int256 amountIn)
internal
view
returns (
Decimal.D256 memory initialDeviation,
Decimal.D256 memory finalDeviation,
Decimal.D256 memory _peg,
uint256 feiReserves,
uint256 tokenReserves
)
{
_peg = peg();
(Decimal.D256 memory price, uint256 reserveFei, uint256 reserveOther) =
_getUniswapPrice();
initialDeviation = _deviationBelowPeg(price, _peg);
Decimal.D256 memory finalPrice =
_getFinalPrice(amountIn, reserveFei, reserveOther);
finalDeviation = _deviationBelowPeg(finalPrice, _peg);
return (
initialDeviation,
finalDeviation,
_peg,
reserveFei,
reserveOther
);
}
/// @notice return current percent distance from peg
/// @dev will return Decimal.zero() if above peg
function _getDistanceToPeg()
internal
view
returns (Decimal.D256 memory distance)
{
(Decimal.D256 memory price, , ) = _getUniswapPrice();
return _deviationBelowPeg(price, peg());
}
/// @notice get deviation from peg as a percent given price
/// @dev will return Decimal.zero() if above peg
function _deviationBelowPeg(
Decimal.D256 memory price,
Decimal.D256 memory peg
) internal pure returns (Decimal.D256 memory) {
// If price <= peg, then FEI is more expensive and above peg
// In this case we can just return zero for deviation
if (price.lessThanOrEqualTo(peg)) {
return Decimal.zero();
}
Decimal.D256 memory delta = price.sub(peg, "Impossible underflow");
return delta.div(peg);
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/math/Math.sol
// SPDX-License-Identifier: MIT
/* pragma solidity >=0.6.0 <0.8.0; */
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math_4 {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
////// /home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-periphery/contracts/interfaces/IWETH.sol
/* pragma solidity >=0.5.0; */
interface IWETH_2 {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
////// ./contracts/pcv/EthUniswapPCVController.sol
/* pragma solidity ^0.6.0; */
/* pragma experimental ABIEncoderV2; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/uniswap/v2-periphery/contracts/interfaces/IWETH.sol"; */
/* import "/home/brock/git_pkgs/fei-protocol-core/contracts/openzeppelin/contracts/math/Math.sol"; */
/* import "./IUniswapPCVController.sol"; */
/* import "../refs/UniRef.sol"; */
/* import "../external/UniswapV2Library.sol"; */
/// @title a IUniswapPCVController implementation for ETH
/// @author Fei Protocol
contract EthUniswapPCVController is IUniswapPCVController, UniRef {
using Decimal for Decimal.D256;
using SafeMathCopy for uint256;
uint256 public override reweightWithdrawBPs = 9900;
uint256 internal constant BASIS_POINTS_GRANULARITY = 10000;
/// @notice returns the linked pcv deposit contract
IPCVDeposit public override pcvDeposit;
/// @notice gets the FEI reward incentive for reweighting
uint256 public override reweightIncentiveAmount;
Decimal.D256 internal _minDistanceForReweight;
/// @notice EthUniswapPCVController constructor
/// @param _core Fei Core for reference
/// @param _pcvDeposit PCV Deposit to reweight
/// @param _oracle oracle for reference
/// @param _incentiveAmount amount of FEI for triggering a reweight
/// @param _minDistanceForReweightBPs minimum distance from peg to reweight in basis points
/// @param _pair Uniswap pair contract to reweight
/// @param _router Uniswap Router
constructor(
address _core,
address _pcvDeposit,
address _oracle,
uint256 _incentiveAmount,
uint256 _minDistanceForReweightBPs,
address _pair,
address _router
) public UniRef(_core, _pair, _router, _oracle) {
pcvDeposit = IPCVDeposit(_pcvDeposit);
reweightIncentiveAmount = _incentiveAmount;
_minDistanceForReweight = Decimal.ratio(
_minDistanceForReweightBPs,
BASIS_POINTS_GRANULARITY
);
}
receive() external payable {}
/// @notice reweights the linked PCV Deposit to the peg price. Needs to be reweight eligible
function reweight() external override postGenesis whenNotPaused nonContract {
updateOracle();
require(
reweightEligible(),
"EthUniswapPCVController: Not at incentive parity or not at min distance"
);
_reweight();
_incentivize();
}
/// @notice reweights regardless of eligibility
function forceReweight() external override onlyGuardianOrGovernor {
_reweight();
}
/// @notice sets the target PCV Deposit address
function setPCVDeposit(address _pcvDeposit) external override onlyGovernor {
pcvDeposit = IPCVDeposit(_pcvDeposit);
emit PCVDepositUpdate(_pcvDeposit);
}
/// @notice sets the reweight incentive amount
function setReweightIncentive(uint256 amount)
external
override
onlyGovernor
{
reweightIncentiveAmount = amount;
emit ReweightIncentiveUpdate(amount);
}
/// @notice sets the reweight withdrawal BPs
function setReweightWithdrawBPs(uint256 _reweightWithdrawBPs)
external
override
onlyGovernor
{
require(_reweightWithdrawBPs <= BASIS_POINTS_GRANULARITY, "EthUniswapPCVController: withdraw percent too high");
reweightWithdrawBPs = _reweightWithdrawBPs;
emit ReweightWithdrawBPsUpdate(_reweightWithdrawBPs);
}
/// @notice sets the reweight min distance in basis points
function setReweightMinDistance(uint256 basisPoints)
external
override
onlyGovernor
{
_minDistanceForReweight = Decimal.ratio(
basisPoints,
BASIS_POINTS_GRANULARITY
);
emit ReweightMinDistanceUpdate(basisPoints);
}
/// @notice signal whether the reweight is available. Must have incentive parity and minimum distance from peg
function reweightEligible() public view override returns (bool) {
bool magnitude =
_getDistanceToPeg().greaterThan(_minDistanceForReweight);
// incentive parity is achieved after a certain time relative to distance from peg
bool time = incentiveContract().isIncentiveParity();
return magnitude && time;
}
/// @notice minimum distance as a percentage from the peg for a reweight to be eligible
function minDistanceForReweight()
external
view
override
returns (Decimal.D256 memory)
{
return _minDistanceForReweight;
}
/// @notice returns the linked Uniswap incentive contract
function incentiveContract() public view override returns(IUniswapIncentive) {
return IUniswapIncentive(fei().incentiveContract(address(pair)));
}
function _incentivize() internal ifMinterSelf {
fei().mint(msg.sender, reweightIncentiveAmount);
}
function _reweight() internal {
_withdraw();
_returnToPeg();
// resupply PCV at peg ratio
uint256 balance = address(this).balance;
pcvDeposit.deposit{value: balance}(balance);
_burnFeiHeld();
emit Reweight(msg.sender);
}
function _returnToPeg() internal {
(uint256 feiReserves, uint256 ethReserves) = getReserves();
if (feiReserves == 0 || ethReserves == 0) {
return;
}
updateOracle();
Decimal.D256 memory _peg = peg();
require(
_isBelowPeg(_peg),
"EthUniswapPCVController: already at or above peg"
);
// calculate amount ETH needed to return to peg then swap
uint256 amountEth = _getAmountToPegOther(feiReserves, ethReserves, _peg);
_swapEth(amountEth, ethReserves, feiReserves);
}
function _swapEth(
uint256 amountEth,
uint256 ethReserves,
uint256 feiReserves
) internal {
uint256 balance = address(this).balance;
uint256 amount = Math_4.min(amountEth, balance);
uint256 amountOut =
UniswapV2Library_2.getAmountOut(amount, ethReserves, feiReserves);
IWETH_2 weth = IWETH_2(router.WETH());
weth.deposit{value: amount}();
assert(weth.transfer(address(pair), amount));
(uint256 amount0Out, uint256 amount1Out) =
pair.token0() == address(weth)
? (uint256(0), amountOut)
: (amountOut, uint256(0));
pair.swap(amount0Out, amount1Out, address(this), new bytes(0));
}
function _withdraw() internal {
// Only withdraw a portion to prevent rounding errors on Uni LP dust
uint256 value =
pcvDeposit.totalValue().mul(reweightWithdrawBPs) /
BASIS_POINTS_GRANULARITY;
pcvDeposit.withdraw(address(this), value);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_core","type":"address"},{"internalType":"address","name":"_pcvDeposit","type":"address"},{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_incentiveAmount","type":"uint256"},{"internalType":"uint256","name":"_minDistanceForReweightBPs","type":"uint256"},{"internalType":"address","name":"_pair","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_core","type":"address"}],"name":"CoreUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oracle","type":"address"}],"name":"OracleUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pcvDeposit","type":"address"}],"name":"PCVDepositUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pair","type":"address"}],"name":"PairUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_caller","type":"address"}],"name":"Reweight","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReweightIncentiveUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_basisPoints","type":"uint256"}],"name":"ReweightMinDistanceUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_reweightWithdrawBPs","type":"uint256"}],"name":"ReweightWithdrawBPsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"core","outputs":[{"internalType":"contract ICore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"price","type":"tuple"},{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"peg","type":"tuple"}],"name":"deviationBelowPeg","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"fei","outputs":[{"internalType":"contract IFei","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feiBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceReweight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"feiReserves","type":"uint256"},{"internalType":"uint256","name":"tokenReserves","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incentiveContract","outputs":[{"internalType":"contract IUniswapIncentive","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"price","type":"tuple"}],"name":"invert","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"liquidityOwned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDistanceForReweight","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair_3","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcvDeposit","outputs":[{"internalType":"contract IPCVDeposit","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peg","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct Decimal.D256","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reweight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reweightEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reweightIncentiveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reweightWithdrawBPs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02_2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"core","type":"address"}],"name":"setCore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pcvDeposit","type":"address"}],"name":"setPCVDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setReweightIncentive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"setReweightMinDistance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reweightWithdrawBPs","type":"uint256"}],"name":"setReweightWithdrawBPs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tribe","outputs":[{"internalType":"contract IERC20_5","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tribeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateOracle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526126ac6004553480156200001757600080fd5b5060405162003313380380620033138339810160408190526200003a91620005ba565b600080546001600160a81b0319166101006001600160a01b038a16021790558682828783816200006a8162000134565b50620000819050836001600160e01b036200017e16565b600280546001600160a01b0319166001600160a01b038416179055620000b9620000aa620001c8565b6001600160e01b036200025916565b620000d0620000aa6001600160e01b03620002ec16565b620000e4836001600160e01b036200025916565b5050600580546001600160a01b0319166001600160a01b038a161790555050600684905562000122836127106200043b602090811b6200178317901c565b51600755506200073895505050505050565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc17757c327b55fd7741523e1dd00ff52d2a125e38254b540926d1de3a3c9bfa990600090a250565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f2d021ed9645bb1ccb57dd1b9e52e80dcf0a056b96a13a5d524ab76bc1570f65390600090a250565b60008060019054906101000a90046001600160a01b03166001600160a01b0316639a9ba4da6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200021857600080fd5b505afa1580156200022d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025391906200059b565b90505b90565b60025460405163095ea7b360e01b8152600019916001600160a01b038085169263095ea7b3926200029192169085906004016200066f565b602060405180830381600087803b158015620002ac57600080fd5b505af1158015620002c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e791906200064d565b505050565b600080600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033e57600080fd5b505afa15801562000353573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037991906200059b565b90506001600160a01b038116620003986001600160e01b03620001c816565b6001600160a01b031614156200025357600360009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620003f757600080fd5b505afa1580156200040c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043291906200059b565b91505062000256565b6200044562000588565b60405180602001604052806200046b85670de0b6b3a7640000866200047660201b60201c565b905290505b92915050565b6000620004ab82620004978587620004b360201b62001f1b1790919060201c565b6200050360201b62001f551790919060201c565b949350505050565b600082620004c45750600062000470565b82820282848281620004d257fe5b0414620004fc5760405162461bcd60e51b8152600401620004f390620006de565b60405180910390fd5b9392505050565b6000620004fc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200054d60201b60201c565b60008183620005715760405162461bcd60e51b8152600401620004f3919062000688565b5060008385816200057e57fe5b0495945050505050565b6040518060200160405280600081525090565b600060208284031215620005ad578081fd5b8151620004fc816200071f565b600080600080600080600060e0888a031215620005d5578283fd5b8751620005e2816200071f565b6020890151909750620005f5816200071f565b604089015190965062000608816200071f565b80955050606088015193506080880151925060a08801516200062a816200071f565b60c08901519092506200063d816200071f565b8091505092959891949750929550565b6000602082840312156200065f578081fd5b81518015158114620004fc578182fd5b6001600160a01b03929092168252602082015260400190565b6000602080835283518082850152825b81811015620006b65785810183015185820160400152820162000698565b81811115620006c85783604083870101525b50601f01601f1916929092016040019392505050565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6001600160a01b03811681146200073557600080fd5b50565b612bcb80620007486000396000f3fe6080604052600436106101f25760003560e01c80638187f5161161010d578063b86677fe116100a0578063e65376df1161006f578063e65376df146104ef578063f086f4ae14610504578063f2f4eb2614610524578063f887ea4014610539578063fc0c546a1461054e576101f9565b8063b86677fe1461049b578063c2cc16d9146104b0578063d6f124f0146104c5578063d7e08158146104da576101f9565b80639a9ba4da116100dc5780639a9ba4da14610447578063a883479a1461045c578063a8aa1b3114610471578063b490589714610486576101f9565b80638187f516146103e85780638456cb5914610408578063849feb6b1461041d578063900c6f9014610432576101f9565b80636b6dff0a116101855780637adbf973116101545780637adbf973146103715780637b8164fa146103915780637dc0d1d0146103a657806380009630146103c8576101f9565b80636b6dff0a146102fc5780636e791c831461031157806374edb0ee1461033157806375c56da114610351576101f9565b806358db3072116101c157806358db3072146102835780635c975abb146102a357806369c20b68146102c55780636b4e1398146102da576101f9565b80630902f1ac146101fe5780631f1cb62b1461022a5780631fca50da1461024c5780633f4ba83a1461026e576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610213610563565b604051610221929190612b09565b60405180910390f35b34801561023657600080fd5b5061023f6106c6565b6040516102219190612af6565b34801561025857600080fd5b5061026c61026736600461268d565b610780565b005b34801561027a57600080fd5b5061026c61086b565b34801561028f57600080fd5b5061023f61029e366004612591565b61099f565b3480156102af57600080fd5b506102b86109d6565b6040516102219190612735565b3480156102d157600080fd5b5061023f6109df565b3480156102e657600080fd5b506102ef6109fb565b6040516102219190612b00565b34801561030857600080fd5b506102ef610a81565b34801561031d57600080fd5b5061023f61032c3660046125c5565b610ab6565b34801561033d57600080fd5b5061026c61034c36600461268d565b610ade565b34801561035d57600080fd5b5061026c61036c366004612539565b610bd5565b34801561037d57600080fd5b5061026c61038c366004612539565b610cbf565b34801561039d57600080fd5b506102ef610d6b565b3480156103b257600080fd5b506103bb610d71565b6040516102219190612708565b3480156103d457600080fd5b5061026c6103e3366004612539565b610d80565b3480156103f457600080fd5b5061026c610403366004612539565b610e70565b34801561041457600080fd5b5061026c610f32565b34801561042957600080fd5b5061026c611064565b34801561043e57600080fd5b506102ef61118e565b34801561045357600080fd5b506103bb611194565b34801561046857600080fd5b5061026c61121b565b34801561047d57600080fd5b506103bb61134d565b34801561049257600080fd5b506102ef61135c565b3480156104a757600080fd5b506103bb611366565b3480156104bc57600080fd5b506103bb6113b5565b3480156104d157600080fd5b506102b8611408565b3480156104e657600080fd5b506102b8611486565b3480156104fb57600080fd5b506103bb611542565b34801561051057600080fd5b5061026c61051f36600461268d565b611551565b34801561053057600080fd5b506103bb611626565b34801561054557600080fd5b506103bb61163a565b34801561055a57600080fd5b506103bb611649565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b657600080fd5b505afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190612555565b9050600080600360009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561064157600080fd5b505afa158015610655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106799190612639565b506001600160701b031691506001600160701b03169150826001600160a01b03166106a2611194565b6001600160a01b0316146106b75780826106ba565b81815b90955093505050509091565b6106ce61250f565b6106d661250f565b600154604080516315f789a960e21b815281516000936001600160a01b0316926357de26a49260048082019391829003018186803b15801561071757600080fd5b505afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f91906125ea565b91509150806107795760405162461bcd60e51b815260040161077090612973565b60405180910390fd5b5090505b90565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906107b4903390600401612708565b60206040518083038186803b1580156107cc57600080fd5b505afa1580156107e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108049190612571565b6108205760405162461bcd60e51b815260040161077090612a6a565b61082c81612710611783565b516007556040517fe5bb6677a331f9fa646d3b1c54535ea5aa4143689e7ece9281cf9d7a18263c3c90610860908390612b00565b60405180910390a150565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b89061089f903390600401612708565b60206040518083038186803b1580156108b757600080fd5b505afa1580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190612571565b806109795750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610929903390600401612708565b60206040518083038186803b15801561094157600080fd5b505afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612571565b6109955760405162461bcd60e51b8152600401610770906127b6565b61099d6117b2565b565b6109a761250f565b6109cd6109b9368590038501856125c5565b6109c8368590038501856125c5565b611820565b90505b92915050565b60005460ff1690565b6109e761250f565b506040805160208101909152600754815290565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a2c903090600401612708565b60206040518083038186803b158015610a4457600080fd5b505afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906126a5565b905090565b6000610a8b611366565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a2c9190612708565b610abe61250f565b610ad682610aca6118ac565b9063ffffffff6118ce16565b90505b919050565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610b12903390600401612708565b60206040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190612571565b610b7e5760405162461bcd60e51b815260040161077090612a6a565b612710811115610ba05760405162461bcd60e51b8152600401610770906128f7565b60048190556040517f78831012d28319019d036a602255ed7e1cecfd8baf16837cb7b30f1a87cdf92690610860908390612b00565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610c09903390600401612708565b60206040518083038186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c599190612571565b610c755760405162461bcd60e51b815260040161077090612a6a565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f8ee28614624382db5c9b713cd59dd96b46043fb2b0a02ca2b42f9a08af54a64f90600090a250565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610cf3903390600401612708565b60206040518083038186803b158015610d0b57600080fd5b505afa158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190612571565b610d5f5760405162461bcd60e51b815260040161077090612a6a565b610d68816118fc565b50565b60045481565b6001546001600160a01b031681565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610db4903390600401612708565b60206040518083038186803b158015610dcc57600080fd5b505afa158015610de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e049190612571565b610e205760405162461bcd60e51b815260040161077090612a6a565b60008054610100600160a81b0319166101006001600160a01b03841690810291909117825560405190917fad9400e618eb1344fde53db22397a1b82c765527ecbba3a5c86bcac15090828b91a250565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610ea4903390600401612708565b60206040518083038186803b158015610ebc57600080fd5b505afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef49190612571565b610f105760405162461bcd60e51b815260040161077090612a6a565b610f1981611946565b610f29610f24611649565b611990565b610d6881611990565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610f66903390600401612708565b60206040518083038186803b158015610f7e57600080fd5b505afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190612571565b806110405750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610ff0903390600401612708565b60206040518083038186803b15801561100857600080fd5b505afa15801561101c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110409190612571565b61105c5760405162461bcd60e51b8152600401610770906127b6565b61099d611a1d565b600060019054906101000a90046001600160a01b03166001600160a01b0316639711ac346040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b257600080fd5b505afa1580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612571565b6111065760405162461bcd60e51b815260040161077090612753565b61110e6109d6565b1561112b5760405162461bcd60e51b815260040161077090612949565b61113433611a78565b156111515760405162461bcd60e51b815260040161077090612a33565b611159611408565b50611162611486565b61117e5760405162461bcd60e51b815260040161077090612803565b611186611a7e565b61099d611b28565b60065481565b60008060019054906101000a90046001600160a01b03166001600160a01b0316639a9ba4da6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190612555565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b89061124f903390600401612708565b60206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f9190612571565b806113295750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba21906112d9903390600401612708565b60206040518083038186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113299190612571565b6113455760405162461bcd60e51b8152600401610770906127b6565b61099d611a7e565b6003546001600160a01b031681565b6000610a8b611194565b60008060019054906101000a90046001600160a01b03166001600160a01b031663b86677fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e357600080fd5b60006113bf611194565b60035460405163bc701e7560e01b81526001600160a01b039283169263bc701e75926113f092911690600401612708565b60206040518083038186803b1580156111e357600080fd5b6001546040805163a2e6204560e01b815290516000926001600160a01b03169163a2e6204591600480830192602092919082900301818787803b15801561144e57600080fd5b505af1158015611462573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190612571565b6040805160208101909152600754815260009081906114b3906114a7611c1c565b9063ffffffff611c4a16565b905060006114bf6113b5565b6001600160a01b0316635f4a88786040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f757600080fd5b505afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190612571565b905081801561153b5750805b9250505090565b6005546001600160a01b031681565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890611585903390600401612708565b60206040518083038186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d59190612571565b6115f15760405162461bcd60e51b815260040161077090612a6a565b60068190556040517fc78b2369493489f9ad07acab573d78f5333b8bf6bbd572f123af5a3fa380c0a290610860908390612b00565b60005461010090046001600160a01b031690565b6002546001600160a01b031681565b600080600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d29190612555565b9050806001600160a01b03166116e6611194565b6001600160a01b03161415610a7c57600360009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561174357600080fd5b505afa158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b9190612555565b91505061077d565b61178b61250f565b60405180602001604052806117a985670de0b6b3a764000086611c60565b90529392505050565b6117ba6109d6565b6117d65760405162461bcd60e51b815260040161077090612788565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611809611c8c565b6040516118169190612708565b60405180910390a1565b61182861250f565b611838838363ffffffff611c9016565b1561184c57611845611ca6565b90506109d0565b61185461250f565b604080518082019091526014815273496d706f737369626c6520756e646572666c6f7760601b6020820152611892908590859063ffffffff611cc116565b90506118a4818463ffffffff6118ce16565b949350505050565b6118b461250f565b506040805160208101909152670de0b6b3a7640000815290565b6118d661250f565b60405180602001604052806117a98560000151670de0b6b3a76400008660000151611c60565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc17757c327b55fd7741523e1dd00ff52d2a125e38254b540926d1de3a3c9bfa990600090a250565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f2d021ed9645bb1ccb57dd1b9e52e80dcf0a056b96a13a5d524ab76bc1570f65390600090a250565b60025460405163095ea7b360e01b8152600019916001600160a01b038085169263095ea7b3926119c6921690859060040161271c565b602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190612571565b505050565b611a256109d6565b15611a425760405162461bcd60e51b815260040161077090612949565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611809611c8c565b3b151590565b611a86611cf5565b611a8e611e04565b60055460405163b6b55f2560e01b815247916001600160a01b03169063b6b55f25908390611ac0908290600401612b00565b6000604051808303818588803b158015611ad957600080fd5b505af1158015611aed573d6000803e3d6000fd5b5050505050611afa611e86565b60405133907f57704cb86ee66a96e9c026ffadca94f041e3b6c1e6aea06046c96dcf106e745590600090a250565b6000546040516355138f0d60e11b81526101009091046001600160a01b03169063aa271e1a90611b5c903090600401612708565b60206040518083038186803b158015611b7457600080fd5b505afa158015611b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bac9190612571565b1561099d57611bb9611194565b6001600160a01b03166340c10f19336006546040518363ffffffff1660e01b8152600401611be892919061271c565b600060405180830381600087803b158015611c0257600080fd5b505af1158015611c16573d6000803e3d6000fd5b50505050565b611c2461250f565b611c2c61250f565b611c34611ec0565b50509050611c44816109c86106c6565b91505090565b6000611c568383611ee9565b6002149392505050565b6000611c8282611c76868663ffffffff611f1b16565b9063ffffffff611f5516565b90505b9392505050565b3390565b60006002611c9e8484611ee9565b109392505050565b611cae61250f565b5060408051602081019091526000815290565b611cc961250f565b6040805160208101909152835185518291611ceb91908663ffffffff611f9716565b9052949350505050565b6000612710611d92600454600560009054906101000a90046001600160a01b03166001600160a01b031663d4c3eea06040518163ffffffff1660e01b815260040160206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8691906126a5565b9063ffffffff611f1b16565b81611d9957fe5b60055460405163f3fef3a360e01b81529290910492506001600160a01b03169063f3fef3a390611dcf903090859060040161271c565b600060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b5050505050565b600080611e0f610563565b915091508160001480611e20575080155b15611e2c57505061099d565b611e34611408565b50611e3d61250f565b611e456106c6565b9050611e5081611fc3565b611e6c5760405162461bcd60e51b8152600401610770906128a7565b6000611e79848484611feb565b9050611c16818486612000565b611e8e611194565b6001600160a01b03166342966c68611ea461135c565b6040518263ffffffff1660e01b8152600401611be89190612b00565b611ec861250f565b600080611ed3610563565b9092509050611ee28282611783565b9250909192565b805182516000911415611efe575060016109d0565b8151835111611f0e576000611f11565b60025b60ff169392505050565b600082611f2a575060006109d0565b82820282848281611f3757fe5b04146109cd5760405162461bcd60e51b8152600401610770906129f2565b60006109cd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122b9565b60008184841115611fbb5760405162461bcd60e51b81526004016107709190612740565b505050900390565b6000611fcd61250f565b611fd5611ec0565b50909150611c859050838263ffffffff6122f016565b6000611c828385611ffb85610ab6565b612304565b47600061200d858361238d565b9050600061201c8286866123a3565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561206e57600080fd5b505afa158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190612555565b9050806001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505060035460405163a9059cbb60e01b81526001600160a01b03868116955063a9059cbb9450612130935090911690879060040161271c565b602060405180830381600087803b15801561214a57600080fd5b505af115801561215e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121829190612571565b61218857fe5b600080826001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e357600080fd5b505afa1580156121f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221b9190612555565b6001600160a01b03161461223157836000612235565b6000845b6003546040805160008152602081019182905263022c0d9f60e01b9091529294509092506001600160a01b03169063022c0d9f9061227c9085908590309060248101612b17565b600060405180830381600087803b15801561229657600080fd5b505af11580156122aa573d6000803e3d6000fd5b50505050505050505050505050565b600081836122da5760405162461bcd60e51b81526004016107709190612740565b5060008385816122e657fe5b0495945050505050565b60006122fc8383611ee9565b159392505050565b60008061232f61232a8561231e868963ffffffff61245516565b9063ffffffff61245516565b61247c565b9050600061233c82612499565b905085811115612369576123606103e5611c768884036103e863ffffffff611f1b16565b92505050611c85565b6123836103e5611c768389036103e863ffffffff611f1b16565b9695505050505050565b600081831061239c57816109cd565b5090919050565b60008084116123c45760405162461bcd60e51b815260040161077090612aab565b6000831180156123d45750600082115b6123f05760405162461bcd60e51b8152600401610770906129aa565b6000612404856103e563ffffffff611f1b16565b90506000612418828563ffffffff611f1b16565b9050600061243e83612432886103e863ffffffff611f1b16565b9063ffffffff6124ea16565b905080828161244957fe5b04979650505050505050565b61245d61250f565b6040805160208101909152835181906117a9908563ffffffff611f1b16565b8051600090610ad690670de0b6b3a764000063ffffffff611f5516565b600060038211156124dc575080600160028204015b818110156124d6578091506002818285816124c557fe5b0401816124ce57fe5b0490506124ae565b50610ad9565b8115610ad957506001919050565b6000828201838110156109cd5760405162461bcd60e51b815260040161077090612870565b6040518060200160405280600081525090565b600060208284031215612533578081fd5b50919050565b60006020828403121561254a578081fd5b81356109cd81612b6b565b600060208284031215612566578081fd5b81516109cd81612b6b565b600060208284031215612582578081fd5b815180151581146109cd578182fd5b600080604083850312156125a3578081fd5b6125ad8484612522565b91506125bc8460208501612522565b90509250929050565b6000602082840312156125d6578081fd5b6125e06020612b44565b9135825250919050565b60008082840360408112156125fd578283fd5b602081121561260a578283fd5b506126156020612b44565b835181526020840151909250801515811461262e578182fd5b809150509250929050565b60008060006060848603121561264d578081fd5b835161265881612b80565b602085015190935061266981612b80565b604085015190925063ffffffff81168114612682578182fd5b809150509250925092565b60006020828403121561269e578081fd5b5035919050565b6000602082840312156126b6578081fd5b5051919050565b60008151808452815b818110156126e2576020818501810151868301820152016126c6565b818111156126f35782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526109cd60208301846126bd565b6020808252818101527f436f72655265663a205374696c6c20696e2047656e6573697320506572696f64604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602d908201527f436f72655265663a2043616c6c6572206973206e6f742061206775617264696160408201526c371037b91033b7bb32b93737b960991b606082015260800190565b60208082526047908201527f457468556e6973776170504356436f6e74726f6c6c65723a204e6f742061742060408201527f696e63656e7469766520706172697479206f72206e6f74206174206d696e2064606082015266697374616e636560c81b608082015260a00190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526030908201527f457468556e6973776170504356436f6e74726f6c6c65723a20616c726561647960408201526f206174206f722061626f76652070656760801b606082015260800190565b60208082526032908201527f457468556e6973776170504356436f6e74726f6c6c65723a20776974686472616040820152710ee40e0cae4c6cadce840e8dede40d0d2ced60731b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526019908201527f4f7261636c655265663a206f7261636c6520696e76616c696400000000000000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f436f72655265663a2043616c6c6572206973206120636f6e7472616374000000604082015260600190565b60208082526021908201527f436f72655265663a2043616c6c6572206973206e6f74206120676f7665726e6f6040820152603960f91b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015261238360808301846126bd565b60405181810167ffffffffffffffff81118282101715612b6357600080fd5b604052919050565b6001600160a01b0381168114610d6857600080fd5b6001600160701b0381168114610d6857600080fdfea2646970667358221220931c312c2806cb7b29a3426b169afacc61b9af481ed679a3cff3b0490441bddb64736f6c634300060600330000000000000000000000008d5ed43dca8c2f7dfb20cf7b53cc7e593635d7b90000000000000000000000009b0c6299d08fe823f2c0598d97a1141507e4ad8600000000000000000000000089714d3ac9149426219a3568543200d1964101c400000000000000000000000000000000000000000000001b1ae4d6e2ef500000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000094b0a3d511b6ecdb17ebf877278ab030acb0a8780000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80638187f5161161010d578063b86677fe116100a0578063e65376df1161006f578063e65376df146104ef578063f086f4ae14610504578063f2f4eb2614610524578063f887ea4014610539578063fc0c546a1461054e576101f9565b8063b86677fe1461049b578063c2cc16d9146104b0578063d6f124f0146104c5578063d7e08158146104da576101f9565b80639a9ba4da116100dc5780639a9ba4da14610447578063a883479a1461045c578063a8aa1b3114610471578063b490589714610486576101f9565b80638187f516146103e85780638456cb5914610408578063849feb6b1461041d578063900c6f9014610432576101f9565b80636b6dff0a116101855780637adbf973116101545780637adbf973146103715780637b8164fa146103915780637dc0d1d0146103a657806380009630146103c8576101f9565b80636b6dff0a146102fc5780636e791c831461031157806374edb0ee1461033157806375c56da114610351576101f9565b806358db3072116101c157806358db3072146102835780635c975abb146102a357806369c20b68146102c55780636b4e1398146102da576101f9565b80630902f1ac146101fe5780631f1cb62b1461022a5780631fca50da1461024c5780633f4ba83a1461026e576101f9565b366101f957005b600080fd5b34801561020a57600080fd5b50610213610563565b604051610221929190612b09565b60405180910390f35b34801561023657600080fd5b5061023f6106c6565b6040516102219190612af6565b34801561025857600080fd5b5061026c61026736600461268d565b610780565b005b34801561027a57600080fd5b5061026c61086b565b34801561028f57600080fd5b5061023f61029e366004612591565b61099f565b3480156102af57600080fd5b506102b86109d6565b6040516102219190612735565b3480156102d157600080fd5b5061023f6109df565b3480156102e657600080fd5b506102ef6109fb565b6040516102219190612b00565b34801561030857600080fd5b506102ef610a81565b34801561031d57600080fd5b5061023f61032c3660046125c5565b610ab6565b34801561033d57600080fd5b5061026c61034c36600461268d565b610ade565b34801561035d57600080fd5b5061026c61036c366004612539565b610bd5565b34801561037d57600080fd5b5061026c61038c366004612539565b610cbf565b34801561039d57600080fd5b506102ef610d6b565b3480156103b257600080fd5b506103bb610d71565b6040516102219190612708565b3480156103d457600080fd5b5061026c6103e3366004612539565b610d80565b3480156103f457600080fd5b5061026c610403366004612539565b610e70565b34801561041457600080fd5b5061026c610f32565b34801561042957600080fd5b5061026c611064565b34801561043e57600080fd5b506102ef61118e565b34801561045357600080fd5b506103bb611194565b34801561046857600080fd5b5061026c61121b565b34801561047d57600080fd5b506103bb61134d565b34801561049257600080fd5b506102ef61135c565b3480156104a757600080fd5b506103bb611366565b3480156104bc57600080fd5b506103bb6113b5565b3480156104d157600080fd5b506102b8611408565b3480156104e657600080fd5b506102b8611486565b3480156104fb57600080fd5b506103bb611542565b34801561051057600080fd5b5061026c61051f36600461268d565b611551565b34801561053057600080fd5b506103bb611626565b34801561054557600080fd5b506103bb61163a565b34801561055a57600080fd5b506103bb611649565b6000806000600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156105b657600080fd5b505afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190612555565b9050600080600360009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561064157600080fd5b505afa158015610655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106799190612639565b506001600160701b031691506001600160701b03169150826001600160a01b03166106a2611194565b6001600160a01b0316146106b75780826106ba565b81815b90955093505050509091565b6106ce61250f565b6106d661250f565b600154604080516315f789a960e21b815281516000936001600160a01b0316926357de26a49260048082019391829003018186803b15801561071757600080fd5b505afa15801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f91906125ea565b91509150806107795760405162461bcd60e51b815260040161077090612973565b60405180910390fd5b5090505b90565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b8906107b4903390600401612708565b60206040518083038186803b1580156107cc57600080fd5b505afa1580156107e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108049190612571565b6108205760405162461bcd60e51b815260040161077090612a6a565b61082c81612710611783565b516007556040517fe5bb6677a331f9fa646d3b1c54535ea5aa4143689e7ece9281cf9d7a18263c3c90610860908390612b00565b60405180910390a150565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b89061089f903390600401612708565b60206040518083038186803b1580156108b757600080fd5b505afa1580156108cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ef9190612571565b806109795750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610929903390600401612708565b60206040518083038186803b15801561094157600080fd5b505afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190612571565b6109955760405162461bcd60e51b8152600401610770906127b6565b61099d6117b2565b565b6109a761250f565b6109cd6109b9368590038501856125c5565b6109c8368590038501856125c5565b611820565b90505b92915050565b60005460ff1690565b6109e761250f565b506040805160208101909152600754815290565b6003546040516370a0823160e01b81526000916001600160a01b0316906370a0823190610a2c903090600401612708565b60206040518083038186803b158015610a4457600080fd5b505afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c91906126a5565b905090565b6000610a8b611366565b6001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610a2c9190612708565b610abe61250f565b610ad682610aca6118ac565b9063ffffffff6118ce16565b90505b919050565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610b12903390600401612708565b60206040518083038186803b158015610b2a57600080fd5b505afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b629190612571565b610b7e5760405162461bcd60e51b815260040161077090612a6a565b612710811115610ba05760405162461bcd60e51b8152600401610770906128f7565b60048190556040517f78831012d28319019d036a602255ed7e1cecfd8baf16837cb7b30f1a87cdf92690610860908390612b00565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610c09903390600401612708565b60206040518083038186803b158015610c2157600080fd5b505afa158015610c35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c599190612571565b610c755760405162461bcd60e51b815260040161077090612a6a565b600580546001600160a01b0319166001600160a01b0383169081179091556040517f8ee28614624382db5c9b713cd59dd96b46043fb2b0a02ca2b42f9a08af54a64f90600090a250565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610cf3903390600401612708565b60206040518083038186803b158015610d0b57600080fd5b505afa158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190612571565b610d5f5760405162461bcd60e51b815260040161077090612a6a565b610d68816118fc565b50565b60045481565b6001546001600160a01b031681565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610db4903390600401612708565b60206040518083038186803b158015610dcc57600080fd5b505afa158015610de0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e049190612571565b610e205760405162461bcd60e51b815260040161077090612a6a565b60008054610100600160a81b0319166101006001600160a01b03841690810291909117825560405190917fad9400e618eb1344fde53db22397a1b82c765527ecbba3a5c86bcac15090828b91a250565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610ea4903390600401612708565b60206040518083038186803b158015610ebc57600080fd5b505afa158015610ed0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef49190612571565b610f105760405162461bcd60e51b815260040161077090612a6a565b610f1981611946565b610f29610f24611649565b611990565b610d6881611990565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890610f66903390600401612708565b60206040518083038186803b158015610f7e57600080fd5b505afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190612571565b806110405750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba2190610ff0903390600401612708565b60206040518083038186803b15801561100857600080fd5b505afa15801561101c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110409190612571565b61105c5760405162461bcd60e51b8152600401610770906127b6565b61099d611a1d565b600060019054906101000a90046001600160a01b03166001600160a01b0316639711ac346040518163ffffffff1660e01b815260040160206040518083038186803b1580156110b257600080fd5b505afa1580156110c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ea9190612571565b6111065760405162461bcd60e51b815260040161077090612753565b61110e6109d6565b1561112b5760405162461bcd60e51b815260040161077090612949565b61113433611a78565b156111515760405162461bcd60e51b815260040161077090612a33565b611159611408565b50611162611486565b61117e5760405162461bcd60e51b815260040161077090612803565b611186611a7e565b61099d611b28565b60065481565b60008060019054906101000a90046001600160a01b03166001600160a01b0316639a9ba4da6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190612555565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b89061124f903390600401612708565b60206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f9190612571565b806113295750600054604051630c68ba2160e01b81526101009091046001600160a01b031690630c68ba21906112d9903390600401612708565b60206040518083038186803b1580156112f157600080fd5b505afa158015611305573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113299190612571565b6113455760405162461bcd60e51b8152600401610770906127b6565b61099d611a7e565b6003546001600160a01b031681565b6000610a8b611194565b60008060019054906101000a90046001600160a01b03166001600160a01b031663b86677fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111e357600080fd5b60006113bf611194565b60035460405163bc701e7560e01b81526001600160a01b039283169263bc701e75926113f092911690600401612708565b60206040518083038186803b1580156111e357600080fd5b6001546040805163a2e6204560e01b815290516000926001600160a01b03169163a2e6204591600480830192602092919082900301818787803b15801561144e57600080fd5b505af1158015611462573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190612571565b6040805160208101909152600754815260009081906114b3906114a7611c1c565b9063ffffffff611c4a16565b905060006114bf6113b5565b6001600160a01b0316635f4a88786040518163ffffffff1660e01b815260040160206040518083038186803b1580156114f757600080fd5b505afa15801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190612571565b905081801561153b5750805b9250505090565b6005546001600160a01b031681565b600054604051631c86b03760e31b81526101009091046001600160a01b03169063e43581b890611585903390600401612708565b60206040518083038186803b15801561159d57600080fd5b505afa1580156115b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d59190612571565b6115f15760405162461bcd60e51b815260040161077090612a6a565b60068190556040517fc78b2369493489f9ad07acab573d78f5333b8bf6bbd572f123af5a3fa380c0a290610860908390612b00565b60005461010090046001600160a01b031690565b6002546001600160a01b031681565b600080600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561169a57600080fd5b505afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d29190612555565b9050806001600160a01b03166116e6611194565b6001600160a01b03161415610a7c57600360009054906101000a90046001600160a01b03166001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561174357600080fd5b505afa158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b9190612555565b91505061077d565b61178b61250f565b60405180602001604052806117a985670de0b6b3a764000086611c60565b90529392505050565b6117ba6109d6565b6117d65760405162461bcd60e51b815260040161077090612788565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611809611c8c565b6040516118169190612708565b60405180910390a1565b61182861250f565b611838838363ffffffff611c9016565b1561184c57611845611ca6565b90506109d0565b61185461250f565b604080518082019091526014815273496d706f737369626c6520756e646572666c6f7760601b6020820152611892908590859063ffffffff611cc116565b90506118a4818463ffffffff6118ce16565b949350505050565b6118b461250f565b506040805160208101909152670de0b6b3a7640000815290565b6118d661250f565b60405180602001604052806117a98560000151670de0b6b3a76400008660000151611c60565b600180546001600160a01b0319166001600160a01b0383169081179091556040517fc17757c327b55fd7741523e1dd00ff52d2a125e38254b540926d1de3a3c9bfa990600090a250565b600380546001600160a01b0319166001600160a01b0383169081179091556040517f2d021ed9645bb1ccb57dd1b9e52e80dcf0a056b96a13a5d524ab76bc1570f65390600090a250565b60025460405163095ea7b360e01b8152600019916001600160a01b038085169263095ea7b3926119c6921690859060040161271c565b602060405180830381600087803b1580156119e057600080fd5b505af11580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a189190612571565b505050565b611a256109d6565b15611a425760405162461bcd60e51b815260040161077090612949565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611809611c8c565b3b151590565b611a86611cf5565b611a8e611e04565b60055460405163b6b55f2560e01b815247916001600160a01b03169063b6b55f25908390611ac0908290600401612b00565b6000604051808303818588803b158015611ad957600080fd5b505af1158015611aed573d6000803e3d6000fd5b5050505050611afa611e86565b60405133907f57704cb86ee66a96e9c026ffadca94f041e3b6c1e6aea06046c96dcf106e745590600090a250565b6000546040516355138f0d60e11b81526101009091046001600160a01b03169063aa271e1a90611b5c903090600401612708565b60206040518083038186803b158015611b7457600080fd5b505afa158015611b88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bac9190612571565b1561099d57611bb9611194565b6001600160a01b03166340c10f19336006546040518363ffffffff1660e01b8152600401611be892919061271c565b600060405180830381600087803b158015611c0257600080fd5b505af1158015611c16573d6000803e3d6000fd5b50505050565b611c2461250f565b611c2c61250f565b611c34611ec0565b50509050611c44816109c86106c6565b91505090565b6000611c568383611ee9565b6002149392505050565b6000611c8282611c76868663ffffffff611f1b16565b9063ffffffff611f5516565b90505b9392505050565b3390565b60006002611c9e8484611ee9565b109392505050565b611cae61250f565b5060408051602081019091526000815290565b611cc961250f565b6040805160208101909152835185518291611ceb91908663ffffffff611f9716565b9052949350505050565b6000612710611d92600454600560009054906101000a90046001600160a01b03166001600160a01b031663d4c3eea06040518163ffffffff1660e01b815260040160206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8691906126a5565b9063ffffffff611f1b16565b81611d9957fe5b60055460405163f3fef3a360e01b81529290910492506001600160a01b03169063f3fef3a390611dcf903090859060040161271c565b600060405180830381600087803b158015611de957600080fd5b505af1158015611dfd573d6000803e3d6000fd5b5050505050565b600080611e0f610563565b915091508160001480611e20575080155b15611e2c57505061099d565b611e34611408565b50611e3d61250f565b611e456106c6565b9050611e5081611fc3565b611e6c5760405162461bcd60e51b8152600401610770906128a7565b6000611e79848484611feb565b9050611c16818486612000565b611e8e611194565b6001600160a01b03166342966c68611ea461135c565b6040518263ffffffff1660e01b8152600401611be89190612b00565b611ec861250f565b600080611ed3610563565b9092509050611ee28282611783565b9250909192565b805182516000911415611efe575060016109d0565b8151835111611f0e576000611f11565b60025b60ff169392505050565b600082611f2a575060006109d0565b82820282848281611f3757fe5b04146109cd5760405162461bcd60e51b8152600401610770906129f2565b60006109cd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506122b9565b60008184841115611fbb5760405162461bcd60e51b81526004016107709190612740565b505050900390565b6000611fcd61250f565b611fd5611ec0565b50909150611c859050838263ffffffff6122f016565b6000611c828385611ffb85610ab6565b612304565b47600061200d858361238d565b9050600061201c8286866123a3565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561206e57600080fd5b505afa158015612082573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a69190612555565b9050806001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156120e357600080fd5b505af11580156120f7573d6000803e3d6000fd5b505060035460405163a9059cbb60e01b81526001600160a01b03868116955063a9059cbb9450612130935090911690879060040161271c565b602060405180830381600087803b15801561214a57600080fd5b505af115801561215e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121829190612571565b61218857fe5b600080826001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e357600080fd5b505afa1580156121f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221b9190612555565b6001600160a01b03161461223157836000612235565b6000845b6003546040805160008152602081019182905263022c0d9f60e01b9091529294509092506001600160a01b03169063022c0d9f9061227c9085908590309060248101612b17565b600060405180830381600087803b15801561229657600080fd5b505af11580156122aa573d6000803e3d6000fd5b50505050505050505050505050565b600081836122da5760405162461bcd60e51b81526004016107709190612740565b5060008385816122e657fe5b0495945050505050565b60006122fc8383611ee9565b159392505050565b60008061232f61232a8561231e868963ffffffff61245516565b9063ffffffff61245516565b61247c565b9050600061233c82612499565b905085811115612369576123606103e5611c768884036103e863ffffffff611f1b16565b92505050611c85565b6123836103e5611c768389036103e863ffffffff611f1b16565b9695505050505050565b600081831061239c57816109cd565b5090919050565b60008084116123c45760405162461bcd60e51b815260040161077090612aab565b6000831180156123d45750600082115b6123f05760405162461bcd60e51b8152600401610770906129aa565b6000612404856103e563ffffffff611f1b16565b90506000612418828563ffffffff611f1b16565b9050600061243e83612432886103e863ffffffff611f1b16565b9063ffffffff6124ea16565b905080828161244957fe5b04979650505050505050565b61245d61250f565b6040805160208101909152835181906117a9908563ffffffff611f1b16565b8051600090610ad690670de0b6b3a764000063ffffffff611f5516565b600060038211156124dc575080600160028204015b818110156124d6578091506002818285816124c557fe5b0401816124ce57fe5b0490506124ae565b50610ad9565b8115610ad957506001919050565b6000828201838110156109cd5760405162461bcd60e51b815260040161077090612870565b6040518060200160405280600081525090565b600060208284031215612533578081fd5b50919050565b60006020828403121561254a578081fd5b81356109cd81612b6b565b600060208284031215612566578081fd5b81516109cd81612b6b565b600060208284031215612582578081fd5b815180151581146109cd578182fd5b600080604083850312156125a3578081fd5b6125ad8484612522565b91506125bc8460208501612522565b90509250929050565b6000602082840312156125d6578081fd5b6125e06020612b44565b9135825250919050565b60008082840360408112156125fd578283fd5b602081121561260a578283fd5b506126156020612b44565b835181526020840151909250801515811461262e578182fd5b809150509250929050565b60008060006060848603121561264d578081fd5b835161265881612b80565b602085015190935061266981612b80565b604085015190925063ffffffff81168114612682578182fd5b809150509250925092565b60006020828403121561269e578081fd5b5035919050565b6000602082840312156126b6578081fd5b5051919050565b60008151808452815b818110156126e2576020818501810151868301820152016126c6565b818111156126f35782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526109cd60208301846126bd565b6020808252818101527f436f72655265663a205374696c6c20696e2047656e6573697320506572696f64604082015260600190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602d908201527f436f72655265663a2043616c6c6572206973206e6f742061206775617264696160408201526c371037b91033b7bb32b93737b960991b606082015260800190565b60208082526047908201527f457468556e6973776170504356436f6e74726f6c6c65723a204e6f742061742060408201527f696e63656e7469766520706172697479206f72206e6f74206174206d696e2064606082015266697374616e636560c81b608082015260a00190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526030908201527f457468556e6973776170504356436f6e74726f6c6c65723a20616c726561647960408201526f206174206f722061626f76652070656760801b606082015260800190565b60208082526032908201527f457468556e6973776170504356436f6e74726f6c6c65723a20776974686472616040820152710ee40e0cae4c6cadce840e8dede40d0d2ced60731b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526019908201527f4f7261636c655265663a206f7261636c6520696e76616c696400000000000000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f436f72655265663a2043616c6c6572206973206120636f6e7472616374000000604082015260600190565b60208082526021908201527f436f72655265663a2043616c6c6572206973206e6f74206120676f7665726e6f6040820152603960f91b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b9051815260200190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015261238360808301846126bd565b60405181810167ffffffffffffffff81118282101715612b6357600080fd5b604052919050565b6001600160a01b0381168114610d6857600080fd5b6001600160701b0381168114610d6857600080fdfea2646970667358221220931c312c2806cb7b29a3426b169afacc61b9af481ed679a3cff3b0490441bddb64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008d5ed43dca8c2f7dfb20cf7b53cc7e593635d7b90000000000000000000000009b0c6299d08fe823f2c0598d97a1141507e4ad8600000000000000000000000089714d3ac9149426219a3568543200d1964101c400000000000000000000000000000000000000000000001b1ae4d6e2ef500000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000094b0a3d511b6ecdb17ebf877278ab030acb0a8780000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
-----Decoded View---------------
Arg [0] : _core (address): 0x8d5ED43dCa8C2F7dFB20CF7b53CC7E593635d7b9
Arg [1] : _pcvDeposit (address): 0x9b0C6299D08fe823f2C0598d97A1141507e4ad86
Arg [2] : _oracle (address): 0x89714d3AC9149426219a3568543200D1964101C4
Arg [3] : _incentiveAmount (uint256): 500000000000000000000
Arg [4] : _minDistanceForReweightBPs (uint256): 100
Arg [5] : _pair (address): 0x94B0A3d511b6EcDb17eBF877278Ab030acb0A878
Arg [6] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d5ed43dca8c2f7dfb20cf7b53cc7e593635d7b9
Arg [1] : 0000000000000000000000009b0c6299d08fe823f2c0598d97a1141507e4ad86
Arg [2] : 00000000000000000000000089714d3ac9149426219a3568543200d1964101c4
Arg [3] : 00000000000000000000000000000000000000000000001b1ae4d6e2ef500000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000094b0a3d511b6ecdb17ebf877278ab030acb0a878
Arg [6] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Deployed Bytecode Sourcemap
76654:6545:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;67474:441:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67474:441:0;;;:::i;:::-;;;;;;;;;;;;;;;;;54136:215;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54136:215:0;;;:::i;:::-;;;;;;;;79802:304;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;79802:304:0;;;;;;;;:::i;:::-;;50275:87;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50275:87:0;;;:::i;68042:217::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;68042:217:0;;;;;;;;:::i;46212:86::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;46212:86:0;;;:::i;:::-;;;;;;;;80689:177;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80689:177:0;;;:::i;68369:120::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;68369:120:0;;;:::i;:::-;;;;;;;;51264:121;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51264:121:0;;;:::i;53572:185::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;53572:185:0;;;;;;;;:::i;79359:371::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;79359:371:0;;;;;;;;:::i;78858:176::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;78858:176:0;;;;;;;;:::i;53280:105::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;53280:105:0;;;;;;;;:::i;76803:50::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;76803:50:0;;;:::i;52906:30::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52906:30:0;;;:::i;:::-;;;;;;;;49946:132;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;49946:132:0;;;;;;;;:::i;66839:165::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;66839:165:0;;;;;;;;:::i;50134:83::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50134:83:0;;;:::i;78334:306::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;78334:306:0;;;:::i;77096:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;77096:47:0;;;:::i;50674:88::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50674:88:0;;;:::i;78701:96::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;78701:96:0;;;:::i;66055:37::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66055:37:0;;;:::i;51061:117::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51061:117:0;;;:::i;50883:96::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50883:96:0;;;:::i;80937:160::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80937:160:0;;;:::i;53861:96::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53861:96:0;;;:::i;80230:358::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80230:358:0;;;:::i;76986:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;76986:38:0;;;:::i;79094:207::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;79094:207:0;;;;;;;;:::i;50473:84::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50473:84:0;;;:::i;65949:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65949:43:0;;;:::i;67073:216::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67073:216:0;;;:::i;67474:441::-;67563:19;67584:21;67623:14;67640:4;;;;;;;;;-1:-1:-1;;;;;67640:4:0;-1:-1:-1;;;;;67640:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67640:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67640:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67640:13:0;;;;;;;;;67623:30;;67665:16;67683;67705:4;;;;;;;;;-1:-1:-1;;;;;67705:4:0;-1:-1:-1;;;;;67705:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67705:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67705:18:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67705:18:0;;;;;;;;;67664:59;-1:-1:-1;;;;;67664:59:0;;;-1:-1:-1;;;;;67664:59:0;;;67783:6;-1:-1:-1;;;;;67765:24:0;67773:5;:3;:5::i;:::-;-1:-1:-1;;;;;67765:24:0;;:96;;67842:8;67852;67765:96;;;67806:8;67816;67765:96;67734:127;;-1:-1:-1;67734:127:0;-1:-1:-1;;;;67474:441:0;;:::o;54136:215::-;54181:19;;:::i;:::-;54214:24;;:::i;:::-;54254:6;;:13;;;-1:-1:-1;;;54254:13:0;;;;54240:10;;-1:-1:-1;;;;;54254:6:0;;:11;;:13;;;;;;;;;;;:6;:13;;;2:2:-1;;;;27:1;24;17:12;2:2;54254:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54254:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54254:13:0;;;;;;;;;54213:54;;;;54286:5;54278:43;;;;-1:-1:-1;;;54278:43:0;;;;;;;;;;;;;;;;;-1:-1:-1;54339:4:0;-1:-1:-1;54136:215:0;;:::o;79802:304::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;79955:89:::1;79983:11;76915:5;79955:13;:89::i;:::-;79929:115:::0;:23:::1;:115:::0;80060:38:::1;::::0;::::1;::::0;::::1;::::0;80086:11;;80060:38:::1;;;;;;;;;;79802:304:::0;:::o;50275:87::-;49058:5;;:28;;-1:-1:-1;;;49058:28:0;;:5;;;;-1:-1:-1;;;;;49058:5:0;;:16;;:28;;49075:10;;49058:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49058:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49058:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49058:28:0;;;;;;;;;:73;;;-1:-1:-1;49103:5:0;;:28;;-1:-1:-1;;;49103:28:0;;:5;;;;-1:-1:-1;;;;;49103:5:0;;:16;;:28;;49120:10;;49103:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49103:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49103:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49103:28:0;;;;;;;;;49036:168;;;;-1:-1:-1;;;49036:168:0;;;;;;;;;50344:10:::1;:8;:10::i;:::-;50275:87::o:0;68042:217::-;68182:19;;:::i;:::-;68221:30;;;;;;;;68240:5;68221:30;;;;;;;;;;68247:3;68221:30;;;:18;:30::i;:::-;68214:37;;68042:217;;;;;:::o;46212:86::-;46259:4;46283:7;;;46212:86;:::o;80689:177::-;80791:19;;:::i;:::-;-1:-1:-1;80828:30:0;;;;;;;;;80835:23;80828:30;;;80689:177;:::o;68369:120::-;68452:4;;:29;;-1:-1:-1;;;68452:29:0;;68425:7;;-1:-1:-1;;;;;68452:4:0;;:14;;:29;;68475:4;;68452:29;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;68452:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;68452:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;68452:29:0;;;;;;;;;68445:36;;68369:120;:::o;51264:121::-;51318:7;51345;:5;:7::i;:::-;-1:-1:-1;;;;;51345:17:0;;51371:4;51345:32;;;;;;;;;;;;;;;;53572:185;53681:19;;:::i;:::-;53725:24;53743:5;53725:13;:11;:13::i;:::-;:17;:24;:17;:24;:::i;:::-;53718:31;;53572:185;;;;:::o;79359:371::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;76915:5:::1;79503:20;:48;;79495:111;;;;-1:-1:-1::0;;;79495:111:0::1;;;;;;;;;79617:19;:42:::0;;;79675:47:::1;::::0;::::1;::::0;::::1;::::0;79639:20;;79675:47:::1;;78858:176:::0;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;78944:10:::1;:37:::0;;-1:-1:-1;;;;;;78944:37:0::1;-1:-1:-1::0;;;;;78944:37:0;::::1;::::0;;::::1;::::0;;;78997:29:::1;::::0;::::1;::::0;-1:-1:-1;;78997:29:0::1;78858:176:::0;:::o;53280:105::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;53358:19:::1;53369:7;53358:10;:19::i;:::-;53280:105:::0;:::o;76803:50::-;;;;:::o;52906:30::-;;;-1:-1:-1;;;;;52906:30:0;;:::o;49946:132::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;50019:5:::1;:19:::0;;-1:-1:-1;;;;;;50019:19:0::1;;-1:-1:-1::0;;;;;50019:19:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;50054:16:::1;::::0;50019:19;;50054:16:::1;::::0;::::1;49946:132:::0;:::o;66839:165::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;66913:17:::1;66924:5;66913:10;:17::i;:::-;66943:22;66957:7;:5;:7::i;:::-;66943:13;:22::i;:::-;66976:20;66990:5;66976:13;:20::i;50134:83::-:0;49058:5;;:28;;-1:-1:-1;;;49058:28:0;;:5;;;;-1:-1:-1;;;;;49058:5:0;;:16;;:28;;49075:10;;49058:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49058:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49058:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49058:28:0;;;;;;;;;:73;;;-1:-1:-1;49103:5:0;;:28;;-1:-1:-1;;;49103:28:0;;:5;;;;-1:-1:-1;;;;;49103:5:0;;:16;;:28;;49120:10;;49103:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49103:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49103:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49103:28:0;;;;;;;;;49036:168;;;;-1:-1:-1;;;49036:168:0;;;;;;;;;50201:8:::1;:6;:8::i;78334:306::-:0;49599:5;;;;;;;;;-1:-1:-1;;;;;49599:5:0;-1:-1:-1;;;;;49599:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49599:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49599:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49599:32:0;;;;;;;;;49577:114;;;;-1:-1:-1;;;49577:114:0;;;;;;;;;46538:8:::1;:6;:8::i;:::-;46537:9;46529:38;;;;-1:-1:-1::0;;;46529:38:0::1;;;;;;;;;49762:32:::2;49783:10;49762:20;:32::i;:::-;49761:33;49753:75;;;;-1:-1:-1::0;;;49753:75:0::2;;;;;;;;;78421:14:::3;:12;:14::i;:::-;;78468:18;:16;:18::i;:::-;78446:139;;;;-1:-1:-1::0;;;78446:139:0::3;;;;;;;;;78596:11;:9;:11::i;:::-;78618:14;:12;:14::i;77096:47::-:0;;;;:::o;50674:88::-;50719:4;50743:5;;;;;;;;;-1:-1:-1;;;;;50743:5:0;-1:-1:-1;;;;;50743:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50743:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50743:11:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;50743:11:0;;;;;;;;78701:96;49058:5;;:28;;-1:-1:-1;;;49058:28:0;;:5;;;;-1:-1:-1;;;;;49058:5:0;;:16;;:28;;49075:10;;49058:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49058:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49058:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49058:28:0;;;;;;;;;:73;;;-1:-1:-1;49103:5:0;;:28;;-1:-1:-1;;;49103:28:0;;:5;;;;-1:-1:-1;;;;;49103:5:0;;:16;;:28;;49120:10;;49103:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49103:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49103:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49103:28:0;;;;;;;;;49036:168;;;;-1:-1:-1;;;49036:168:0;;;;;;;;;78778:11:::1;:9;:11::i;66055:37::-:0;;;-1:-1:-1;;;;;66055:37:0;;:::o;51061:117::-;51113:7;51140:5;:3;:5::i;50883:96::-;50930:8;50958:5;;;;;;;;;-1:-1:-1;;;;;50958:5:0;-1:-1:-1;;;;;50958:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;80937:160:0;80995:17;81050:5;:3;:5::i;:::-;81082:4;;81050:38;;-1:-1:-1;;;81050:38:0;;-1:-1:-1;;;;;81050:23:0;;;;;;:38;;81082:4;;;81050:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;53861:96:0;53934:6;;:15;;;-1:-1:-1;;;53934:15:0;;;;53910:4;;-1:-1:-1;;;;;53934:6:0;;:13;;:15;;;;;;;;;;;;;;53910:4;53934:6;:15;;;2:2:-1;;;;27:1;24;17:12;2:2;53934:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53934:15:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53934:15:0;;;;;;;;80230:358;80335:56;;;;;;;;;80367:23;80335:56;;;80288:4;;;;80335:56;;:19;:17;:19::i;:::-;:31;:56;:31;:56;:::i;:::-;80305:86;;80494:9;80506:19;:17;:19::i;:::-;-1:-1:-1;;;;;80506:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80506:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;80506:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;80506:39:0;;;;;;;;;80494:51;;80563:9;:17;;;;;80576:4;80563:17;80556:24;;;;80230:358;:::o;76986:38::-;;;-1:-1:-1;;;;;76986:38:0;;:::o;79094:207::-;48874:5;;:28;;-1:-1:-1;;;48874:28:0;;:5;;;;-1:-1:-1;;;;;48874:5:0;;:16;;:28;;48891:10;;48874:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48874:28:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48874:28:0;;;;;;;;;48852:111;;;;-1:-1:-1;;;48852:111:0;;;;;;;;;79214:23:::1;:32:::0;;;79262:31:::1;::::0;::::1;::::0;::::1;::::0;79240:6;;79262:31:::1;;50473:84:::0;50519:5;50544;;;;-1:-1:-1;;;;;50544:5:0;;50473:84::o;65949:43::-;;;-1:-1:-1;;;;;65949:43:0;;:::o;67073:216::-;67120:7;67140:14;67157:4;;;;;;;;;-1:-1:-1;;;;;67157:4:0;-1:-1:-1;;;;;67157:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67157:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67157:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67157:13:0;;;;;;;;;67140:30;;67203:6;-1:-1:-1;;;;;67185:24:0;67193:5;:3;:5::i;:::-;-1:-1:-1;;;;;67185:24:0;;67181:77;;;67233:4;;;;;;;;;-1:-1:-1;;;;;67233:4:0;-1:-1:-1;;;;;67233:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67233:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67233:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;67233:13:0;;;;;;;;;67226:20;;;;;14692:183;14792:11;;:::i;:::-;14828:39;;;;;;;;14842:22;14853:1;14117:6;14862:1;14842:10;:22::i;:::-;14828:39;;14821:46;14692:183;-1:-1:-1;;;14692:183:0:o;47271:120::-;46815:8;:6;:8::i;:::-;46807:41;;;;-1:-1:-1;;;46807:41:0;;;;;;;;;47340:5:::1;47330:15:::0;;-1:-1:-1;;47330:15:0::1;::::0;;47361:22:::1;47370:12;:10;:12::i;:::-;47361:22;;;;;;;;;;;;;;;47271:120::o:0;74325:491::-;74453:19;;:::i;:::-;74622:28;:5;74646:3;74622:28;:23;:28;:::i;:::-;74618:82;;;74674:14;:12;:14::i;:::-;74667:21;;;;74618:82;74710:25;;:::i;:::-;74738:38;;;;;;;;;;;;-1:-1:-1;;;74738:38:0;;;;;;:5;;74748:3;;74738:38;:9;:38;:::i;:::-;74710:66;-1:-1:-1;74794:14:0;74710:66;74804:3;74794:14;:9;:14;:::i;:::-;74787:21;74325:491;-1:-1:-1;;;;74325:491:0:o;14407:118::-;14460:11;;:::i;:::-;-1:-1:-1;14496:21:0;;;;;;;;;14117:6;14496:21;;14407:118;:::o;17191:207::-;17300:11;;:::i;:::-;17336:54;;;;;;;;17350:37;17361:4;:10;;;14117:6;17379:1;:7;;;17350:10;:37::i;54359:127::-;54416:6;:25;;-1:-1:-1;;;;;;54416:25:0;-1:-1:-1;;;;;54416:25:0;;;;;;;;54457:21;;;;-1:-1:-1;;54457:21:0;54359:127;:::o;69344:126::-;69399:4;:30;;-1:-1:-1;;;;;;69399:30:0;-1:-1:-1;;;;;69399:30:0;;;;;;;;69445:17;;;;-1:-1:-1;;69445:17:0;69344:126;:::o;69175:161::-;69309:6;;69276:52;;-1:-1:-1;;;69276:52:0;;-1:-1:-1;;69262:2:0;-1:-1:-1;;;;;69276:24:0;;;;;;:52;;69309:6;;69262:2;;69276:52;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69276:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69276:52:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;69276:52:0;;;;;;;;;;69175:161;;:::o;47012:118::-;46538:8;:6;:8::i;:::-;46537:9;46529:38;;;;-1:-1:-1;;;46529:38:0;;;;;;;;;47072:7:::1;:14:::0;;-1:-1:-1;;47072:14:0::1;47082:4;47072:14;::::0;;47102:20:::1;47109:12;:10;:12::i;36675:422::-:0;37042:20;37081:8;;;36675:422::o;81225:294::-;81266:11;:9;:11::i;:::-;81288:14;:12;:14::i;:::-;81403:10;;:43;;-1:-1:-1;;;81403:43:0;;81371:21;;-1:-1:-1;;;;;81403:10:0;;:18;;81371:21;;81403:43;;81371:21;;81403:43;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;81403:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;81403:43:0;;;;;81459:14;:12;:14::i;:::-;81491:20;;81500:10;;81491:20;;;;;81225:294;:::o;81105:112::-;48178:5;;:29;;-1:-1:-1;;;48178:29:0;;:5;;;;-1:-1:-1;;;;;48178:5:0;;:14;;:29;;48201:4;;48178:29;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48178:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48178:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48178:29:0;;;;;;;;;48174:63;;;81162:5:::1;:3;:5::i;:::-;-1:-1:-1::0;;;;;81162:10:0::1;;81173;81185:23;;81162:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;81162:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;81162:47:0;;;;81105:112::o:0;73963:235::-;74042:28;;:::i;:::-;74089:25;;:::i;:::-;74122:18;:16;:18::i;:::-;74088:52;;;;74158:32;74177:5;74184;:3;:5::i;74158:32::-;74151:39;;;73963:235;:::o;17539:132::-;17616:4;17640:18;17650:4;17656:1;17640:9;:18::i;:::-;17662:1;17640:23;;17539:132;-1:-1:-1;;;17539:132:0:o;18393:225::-;18540:7;18572:38;18598:11;18572:21;:6;18583:9;18572:21;:10;:21;:::i;:::-;:25;:38;:25;:38;:::i;:::-;18565:45;;18393:225;;;;;;:::o;44653:106::-;44741:10;44653:106;:::o;17964:137::-;18047:4;18092:1;18071:18;18081:4;18087:1;18071:9;:18::i;:::-;:22;;17964:137;-1:-1:-1;;;17964:137:0:o;14283:116::-;14337:11;;:::i;:::-;-1:-1:-1;14373:18:0;;;;;;;;;-1:-1:-1;14373:18:0;;14283:116;:::o;16736:232::-;16876:11;;:::i;:::-;16912:48;;;;;;;;;16941:7;;16926:10;;16912:48;;16926:31;;:10;16950:6;16926:31;:14;:31;:::i;:::-;16912:48;;16905:55;16736:232;-1:-1:-1;;;;16736:232:0:o;82896:300::-;83015:13;76915:5;83044:48;83072:19;;83044:10;;;;;;;;;-1:-1:-1;;;;;83044:10:0;-1:-1:-1;;;;;83044:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;83044:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83044:23:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;83044:23:0;;;;;;;;;:27;:48;:27;:48;:::i;:::-;:92;;;;;83147:10;;:41;;-1:-1:-1;;;83147:41:0;;83044:92;;;;;-1:-1:-1;;;;;;83147:10:0;;:19;;:41;;83175:4;;83044:92;;83147:41;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;83147:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;83147:41:0;;;;82896:300;:::o;81527:601::-;81572:19;81593;81616:13;:11;:13::i;:::-;81571:58;;;;81644:11;81659:1;81644:16;:36;;;-1:-1:-1;81664:16:0;;81644:36;81640:75;;;81697:7;;;;81640:75;81727:14;:12;:14::i;:::-;;81754:24;;:::i;:::-;81781:5;:3;:5::i;:::-;81754:32;;81819:17;81831:4;81819:11;:17::i;:::-;81797:115;;;;-1:-1:-1;;;81797:115:0;;;;;;;;;81992:17;82012:52;82033:11;82046;82059:4;82012:20;:52::i;:::-;81992:72;;82075:45;82084:9;82095:11;82108;82075:8;:45::i;51393:76::-;51437:5;:3;:5::i;:::-;-1:-1:-1;;;;;51437:10:0;;51448:12;:10;:12::i;:::-;51437:24;;;;;;;;;;;;;;;;71206:392;71298:19;;:::i;:::-;71332:18;71365:20;71442:13;:11;:13::i;:::-;71413:42;;-1:-1:-1;71413:42:0;-1:-1:-1;71488:39:0;71413:42;;71488:13;:39::i;:::-;71466:124;-1:-1:-1;71206:392:0;;;:::o;18626:245::-;18777:7;;18766;;18737;;18766:18;18762:59;;;-1:-1:-1;18808:1:0;18801:8;;18762:59;18848:7;;18838;;:17;:25;;18862:1;18838:25;;;18858:1;18838:25;18831:32;;;18626:245;-1:-1:-1;;;18626:245:0:o;9920:471::-;9978:7;10223:6;10219:47;;-1:-1:-1;10253:1:0;10246:8;;10219:47;10290:5;;;10294:1;10290;:5;:1;10314:5;;;;;:10;10306:56;;;;-1:-1:-1;;;10306:56:0;;;;;;;;10867:132;10925:7;10952:39;10956:1;10959;10952:39;;;;;;;;;;;;;;;;;:3;:39::i;9469:192::-;9555:7;9591:12;9583:6;;;;9575:29;;;;-1:-1:-1;;;9575:29:0;;;;;;;;;;-1:-1:-1;;;9627:5:0;;;9469:192::o;68935:183::-;69004:4;69022:25;;:::i;:::-;69055:18;:16;:18::i;:::-;-1:-1:-1;69021:52:0;;-1:-1:-1;69091:19:0;;-1:-1:-1;69091:3:0;69021:52;69091:19;:12;:19;:::i;70770:247::-;70926:7;70953:56;70969:13;70984:11;70997;71004:3;70997:6;:11::i;:::-;70953:15;:56::i;82136:752::-;82287:21;82269:15;82336:30;82347:9;82287:21;82336:10;:30::i;:::-;82319:47;;82379:17;82412:65;82444:6;82452:11;82465;82412:31;:65::i;:::-;82379:98;;82490:12;82513:6;;;;;;;;;-1:-1:-1;;;;;82513:6:0;-1:-1:-1;;;;;82513:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;82513:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82513:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;82513:13:0;;;;;;;;;82490:37;;82538:4;-1:-1:-1;;;;;82538:12:0;;82558:6;82538:29;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;82538:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;82607:4:0;;82585:36;;-1:-1:-1;;;82585:36:0;;-1:-1:-1;;;;;82585:13:0;;;;-1:-1:-1;82585:13:0;;-1:-1:-1;82585:36:0;;-1:-1:-1;82607:4:0;;;;82614:6;;82585:36;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;82585:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82585:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;82585:36:0;;;;;;;;;82578:44;;;;82636:18;82656;82716:4;-1:-1:-1;;;;;82691:30:0;:4;;;;;;;;;-1:-1:-1;;;;;82691:4:0;-1:-1:-1;;;;;82691:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;82691:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82691:13:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;82691:13:0;;;;;;;;;-1:-1:-1;;;;;82691:30:0;;:116;;82785:9;82804:1;82691:116;;;82750:1;82754:9;82691:116;82818:4;;82867:12;;;82818:4;82867:12;;;;;;;;;-1:-1:-1;;;82818:62:0;;;82635:172;;-1:-1:-1;82635:172:0;;-1:-1:-1;;;;;;82818:4:0;;:9;;:62;;82635:172;;;;82860:4;;82818:62;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;82818:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;82818:62:0;;;;82136:752;;;;;;;;;:::o;11495:278::-;11581:7;11616:12;11609:5;11601:28;;;;-1:-1:-1;;;11601:28:0;;;;;;;;;;;11640:9;11656:1;11652;:5;;;;;;;11495:278;-1:-1:-1;;;;;11495:278:0:o;17679:129::-;17753:4;17777:18;17787:4;17793:1;17777:9;:18::i;:::-;:23;;17679:129;-1:-1:-1;;;17679:129:0:o;69895:462::-;70047:7;;70086:52;:40;70113:12;70086:22;:3;70094:13;70086:22;:7;:22;:::i;:::-;:26;:40;:26;:40;:::i;:::-;:50;:52::i;:::-;70067:71;;70149:12;70164:15;:8;:13;:15::i;:::-;70149:30;;70201:13;70194:4;:20;70190:101;;;70238:41;70275:3;70238:32;70239:20;;;70265:4;70238:32;:26;:32;:::i;:41::-;70231:48;;;;;;70190:101;70308:41;70345:3;70308:32;70309:20;;;70335:4;70308:32;:26;:32;:::i;:41::-;70301:48;69895:462;-1:-1:-1;;;;;;69895:462:0:o;75342:106::-;75400:7;75431:1;75427;:5;:13;;75439:1;75427:13;;;-1:-1:-1;75435:1:0;;75342:106;-1:-1:-1;75342:106:0:o;19185:517::-;19278:14;19324:1;19313:8;:12;19305:68;;;;-1:-1:-1;;;19305:68:0;;;;;;;;;19404:1;19392:9;:13;:31;;;;;19422:1;19409:10;:14;19392:31;19384:84;;;;-1:-1:-1;;;19384:84:0;;;;;;;;;19479:20;19502:17;:8;19515:3;19502:17;:12;:17;:::i;:::-;19479:40;-1:-1:-1;19530:14:0;19547:31;19479:40;19567:10;19547:31;:19;:31;:::i;:::-;19530:48;-1:-1:-1;19589:16:0;19608:40;19632:15;19608:19;:9;19622:4;19608:19;:13;:19;:::i;:::-;:23;:40;:23;:40;:::i;:::-;19589:59;;19683:11;19671:9;:23;;;;;;;19185:517;-1:-1:-1;;;;;;;19185:517:0:o;15576:183::-;15681:11;;:::i;:::-;15717:34;;;;;;;;;15731:10;;15717:34;;15731:17;;15746:1;15731:17;:14;:17;:::i;18221:115::-;18308:10;;18281:7;;18308:20;;14117:6;18308:20;:14;:20;:::i;64583:326::-;64628:6;64655:1;64651;:5;64647:232;;;-1:-1:-1;64677:1:0;64710;64706;64702:5;;:9;64726:92;64737:1;64733;:5;64726:92;;;64763:1;64759:5;;64801:1;64796;64792;64788;:5;;;;;;:9;64787:15;;;;;;64783:19;;64726:92;;;64647:232;;;;64839:6;;64835:44;;-1:-1:-1;64866:1:0;64583:326;;;:::o;8566:181::-;8624:7;8656:5;;;8680:6;;;;8672:46;;;;-1:-1:-1;;;8672:46:0;;;;;;;;76654:6545;;;;;;;;;;;;;;:::o;784:154:-1:-;;891:2;882:6;877:3;873:16;869:25;866:2;;;-1:-1;;897:12;866:2;-1:-1;917:15;859:79;-1:-1;859:79;2231:241;;2335:2;2323:9;2314:7;2310:23;2306:32;2303:2;;;-1:-1;;2341:12;2303:2;85:6;72:20;97:33;124:5;97:33;;2479:263;;2594:2;2582:9;2573:7;2569:23;2565:32;2562:2;;;-1:-1;;2600:12;2562:2;226:6;220:13;238:33;265:5;238:33;;2749:257;;2861:2;2849:9;2840:7;2836:23;2832:32;2829:2;;;-1:-1;;2867:12;2829:2;364:6;358:13;30203:5;26154:13;26147:21;30181:5;30178:32;30168:2;;-1:-1;;30214:12;3609:458;;;3776:2;3764:9;3755:7;3751:23;3747:32;3744:2;;;-1:-1;;3782:12;3744:2;3844:76;3912:7;3888:22;3844:76;;;3834:86;;3975:76;4043:7;3957:2;4023:9;4019:22;3975:76;;;3965:86;;3738:329;;;;;;4074:283;;4199:2;4187:9;4178:7;4174:23;4170:32;4167:2;;;-1:-1;;4205:12;4167:2;1117:20;4199:2;1117:20;;;1881;;1195:75;;-1:-1;1202:16;4161:196;-1:-1;4161:196;4364:435;;;4502:9;4493:7;4489:23;4514:2;4489:23;4485:32;4482:2;;;-1:-1;;4520:12;4482:2;1445:4;1424:19;1420:30;1417:2;;;-1:-1;;1453:12;1417:2;;1481:20;1445:4;1481:20;;;2029:13;;1559:86;;1445:4;4751:22;;358:13;1566:16;;-1:-1;26154:13;;26147:21;30178:32;;30168:2;;-1:-1;;30214:12;30168:2;4712:71;;;;4476:323;;;;;;4806:533;;;;4954:2;4942:9;4933:7;4929:23;4925:32;4922:2;;;-1:-1;;4960:12;4922:2;1757:6;1751:13;1769:33;1796:5;1769:33;;;5123:2;5173:22;;1751:13;5012:74;;-1:-1;1769:33;1751:13;1769:33;;;5242:2;5291:22;;2169:13;5131:74;;-1:-1;26799:10;26788:22;;30850:34;;30840:2;;-1:-1;;30888:12;30840:2;5250:73;;;;4916:423;;;;;;5346:241;;5450:2;5438:9;5429:7;5425:23;5421:32;5418:2;;;-1:-1;;5456:12;5418:2;-1:-1;1881:20;;5412:175;-1:-1;5412:175;5594:263;;5709:2;5697:9;5688:7;5684:23;5680:32;5677:2;;;-1:-1;;5715:12;5677:2;-1:-1;2029:13;;5671:186;-1:-1;5671:186;6244:343;;6386:5;25477:12;25762:6;25757:3;25750:19;-1:-1;29689:101;29703:6;29700:1;29697:13;29689:101;;;25799:4;29770:11;;;;;29764:18;29751:11;;;;;29744:39;29718:10;29689:101;;;29805:6;29802:1;29799:13;29796:2;;;-1:-1;25799:4;29861:6;25794:3;29852:16;;29845:27;29796:2;-1:-1;29977:7;29961:14;-1:-1;;29957:28;6543:39;;;;25799:4;6543:39;;6334:253;-1:-1;;6334:253;14098:213;-1:-1;;;;;26582:54;;;;6084:37;;14216:2;14201:18;;14187:124;14554:340;-1:-1;;;;;26582:54;;;;5943:58;;14880:2;14865:18;;13929:37;14708:2;14693:18;;14679:215;15232:201;26154:13;;26147:21;6198:34;;15344:2;15329:18;;15315:118;17514:301;;17652:2;17673:17;17666:47;17727:78;17652:2;17641:9;17637:18;17791:6;17727:78;;17822:407;18013:2;18027:47;;;17998:18;;;25750:19;8587:34;25790:14;;;8567:55;8641:12;;;17984:245;18236:407;18427:2;18441:47;;;8892:2;18412:18;;;25750:19;-1:-1;;;25790:14;;;8908:43;8970:12;;;18398:245;18650:407;18841:2;18855:47;;;9221:2;18826:18;;;25750:19;9257:34;25790:14;;;9237:55;-1:-1;;;9312:12;;;9305:37;9361:12;;;18812:245;19064:407;19255:2;19269:47;;;9612:2;19240:18;;;25750:19;9648:34;25790:14;;;9628:55;9717:34;9703:12;;;9696:56;-1:-1;;;9772:12;;;9765:31;9815:12;;;19226:245;19478:407;19669:2;19683:47;;;10066:2;19654:18;;;25750:19;10102:29;25790:14;;;10082:50;10151:12;;;19640:245;19892:407;20083:2;20097:47;;;10402:2;20068:18;;;25750:19;10438:34;25790:14;;;10418:55;-1:-1;;;10493:12;;;10486:40;10545:12;;;20054:245;20306:407;20497:2;20511:47;;;10796:2;20482:18;;;25750:19;10832:34;25790:14;;;10812:55;-1:-1;;;10887:12;;;10880:42;10941:12;;;20468:245;20720:407;20911:2;20925:47;;;11192:2;20896:18;;;25750:19;-1:-1;;;25790:14;;;11208:39;11266:12;;;20882:245;21134:407;21325:2;21339:47;;;11517:2;21310:18;;;25750:19;11553:27;25790:14;;;11533:48;11600:12;;;21296:245;21548:407;21739:2;21753:47;;;11851:2;21724:18;;;25750:19;11887:34;25790:14;;;11867:55;-1:-1;;;11942:12;;;11935:32;11986:12;;;21710:245;21962:407;22153:2;22167:47;;;12237:2;22138:18;;;25750:19;12273:34;25790:14;;;12253:55;-1:-1;;;12328:12;;;12321:25;12365:12;;;22124:245;22376:407;22567:2;22581:47;;;12616:2;22552:18;;;25750:19;12652:31;25790:14;;;12632:52;12703:12;;;22538:245;22790:407;22981:2;22995:47;;;12954:2;22966:18;;;25750:19;12990:34;25790:14;;;12970:55;-1:-1;;;13045:12;;;13038:25;13082:12;;;22952:245;23204:407;23395:2;23409:47;;;13333:2;23380:18;;;25750:19;13369:34;25790:14;;;13349:55;-1:-1;;;13424:12;;;13417:35;13471:12;;;23366:245;23618:297;13748:23;;13929:37;;23778:2;23763:18;;23749:166;23922:213;13929:37;;;24040:2;24025:18;;24011:124;24142:324;13929:37;;;24452:2;24437:18;;13929:37;24288:2;24273:18;;24259:207;24473:647;;13959:5;13936:3;13929:37;13959:5;24866:2;24855:9;24851:18;13929:37;26799:10;;26593:42;;;26070:5;26582:54;24957:2;24946:9;24942:18;5943:58;24701:3;24994:2;24983:9;24979:18;24972:48;25034:76;24701:3;24690:9;24686:19;25096:6;25034:76;;25127:256;25189:2;25183:9;25215:17;;;25290:18;25275:34;;25311:22;;;25272:62;25269:2;;;25347:1;;25337:12;25269:2;25189;25356:22;25167:216;;-1:-1;25167:216;29998:117;-1:-1;;;;;26582:54;;30057:35;;30047:2;;30106:1;;30096:12;30544:117;-1:-1;;;;;30631:5;26466:42;30606:5;30603:35;30593:2;;30652:1;;30642:12
Swarm Source
ipfs://931c312c2806cb7b29a3426b169afacc61b9af481ed679a3cff3b0490441bddb
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.