Source Code
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Swap Exact ETH F... | 18254903 | 881 days ago | 0.00110027 ETH | ||||
| Transfer | 18254903 | 881 days ago | 0.00110027 ETH | ||||
| Transfer | 17727070 | 955 days ago | 0.00110027 ETH | ||||
| Swap Exact ETH F... | 17588521 | 974 days ago | 0.00134261 ETH | ||||
| Transfer | 17588521 | 974 days ago | 0.00134261 ETH | ||||
| Swap Exact ETH F... | 17585116 | 975 days ago | 0.00190034 ETH | ||||
| Transfer | 17585116 | 975 days ago | 0.00190034 ETH | ||||
| Swap Exact ETH F... | 17585114 | 975 days ago | 0.00190034 ETH | ||||
| Transfer | 17585114 | 975 days ago | 0.00190034 ETH | ||||
| Swap Exact ETH F... | 17585114 | 975 days ago | 0.00190034 ETH | ||||
| Transfer | 17585114 | 975 days ago | 0.00190034 ETH | ||||
| Swap Exact ETH F... | 17584222 | 975 days ago | 0.00262099 ETH | ||||
| Transfer | 17584222 | 975 days ago | 0.00262099 ETH | ||||
| Swap Exact ETH F... | 17584200 | 975 days ago | 0.00262099 ETH | ||||
| Transfer | 17584200 | 975 days ago | 0.00262099 ETH | ||||
| Swap Exact ETH F... | 17583968 | 975 days ago | 0.003786 ETH | ||||
| Transfer | 17583968 | 975 days ago | 0.003786 ETH | ||||
| Swap Exact ETH F... | 17583659 | 975 days ago | 0.00539199 ETH | ||||
| Transfer | 17583659 | 975 days ago | 0.00539199 ETH | ||||
| Swap Exact ETH F... | 17583533 | 975 days ago | 0.00862274 ETH | ||||
| Transfer | 17583533 | 975 days ago | 0.00862274 ETH | ||||
| Swap Exact ETH F... | 17583277 | 975 days ago | 0.00600316 ETH | ||||
| Transfer | 17583277 | 975 days ago | 0.00600316 ETH | ||||
| Swap Exact ETH F... | 17583073 | 975 days ago | 0.00714776 ETH | ||||
| Transfer | 17583073 | 975 days ago | 0.00714776 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DividendTracker
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-06-29
*/
// USDC 2.0
// $USDC2.0
// Fair Launched
// 5% USDC Rewards
// 2.5% Max Wallet
// https://t.me/usdc_2point0
// https://twitter.com/usdc2pointzero
// http://usdctwo.org
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _createInitialSupply(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(address _owner, address _rewardToken) external view returns(uint256);
function withdrawnDividendOf(address _owner, address _rewardToken) external view returns(uint256);
function accumulativeDividendOf(address _owner, address _rewardToken) external view returns(uint256);
}
interface DividendPayingTokenInterface {
function dividendOf(address _owner, address _rewardToken) external view returns(uint256);
function distributeDividends() external payable;
function withdrawDividend(address _rewardToken) external;
event DividendsDistributed(
address indexed from,
uint256 weiAmount
);
/// @dev This event MUST emit when an address withdraws their dividend.
/// @param to The address which withdraws ether from this contract.
/// @param weiAmount The amount of withdrawn ether in wei.
event DividendWithdrawn(
address indexed to,
uint256 weiAmount
);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
library SafeMathInt {
int256 private constant MIN_INT256 = int256(1) << 255;
int256 private constant MAX_INT256 = ~(int256(1) << 255);
function mul(int256 a, int256 b) internal pure returns (int256) {
int256 c = a * b;
// Detect overflow when multiplying MIN_INT256 with -1
require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
require((b == 0) || (c / b == a));
return c;
}
function div(int256 a, int256 b) internal pure returns (int256) {
// Prevent overflow when dividing MIN_INT256 by -1
require(b != -1 || a != MIN_INT256);
// Solidity already throws when dividing by 0.
return a / b;
}
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a));
return c;
}
/**
* @dev Adds two int256 variables and fails on overflow.
*/
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a));
return c;
}
function abs(int256 a) internal pure returns (int256) {
require(a != MIN_INT256);
return a < 0 ? -a : a;
}
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
interface IUniswapV2Router01 {
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);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
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;
}
contract DividendPayingToken is DividendPayingTokenInterface, DividendPayingTokenOptionalInterface, Ownable {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
uint256 constant internal magnitude = 2**128;
mapping(address => uint256) internal magnifiedDividendPerShare;
address[] public rewardTokens;
address public nextRewardToken;
uint256 public rewardTokenCounter;
IUniswapV2Router02 public immutable uniswapV2Router;
mapping(address => mapping(address => int256)) internal magnifiedDividendCorrections;
mapping(address => mapping(address => uint256)) internal withdrawnDividends;
mapping (address => uint256) public holderBalance;
uint256 public totalBalance;
mapping(address => uint256) public totalDividendsDistributed;
constructor(){
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // router 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
uniswapV2Router = _uniswapV2Router;
// Mainnet
rewardTokens.push(address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48)); // USDC - 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
nextRewardToken = rewardTokens[0];
}
/// @dev Distributes dividends whenever ether is paid to this contract.
receive() external payable {
distributeDividends();
}
function distributeDividends() public override payable {
require(totalBalance > 0);
uint256 initialBalance = IERC20(nextRewardToken).balanceOf(address(this));
buyTokens(msg.value, nextRewardToken);
uint256 newBalance = IERC20(nextRewardToken).balanceOf(address(this)).sub(initialBalance);
if (newBalance > 0) {
magnifiedDividendPerShare[nextRewardToken] = magnifiedDividendPerShare[nextRewardToken].add(
(newBalance).mul(magnitude) / totalBalance
);
emit DividendsDistributed(msg.sender, newBalance);
totalDividendsDistributed[nextRewardToken] = totalDividendsDistributed[nextRewardToken].add(newBalance);
}
rewardTokenCounter = rewardTokenCounter == rewardTokens.length - 1 ? 0 : rewardTokenCounter + 1;
nextRewardToken = rewardTokens[rewardTokenCounter];
}
// Autopilot
function buyTokens(uint256 bnbAmountInWei, address rewardToken) internal {
// Autopilot
address[] memory path = new address[](2);
path[0] = uniswapV2Router.WETH();
path[1] = rewardToken;
// Autopilot
uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: bnbAmountInWei}(
0, // Autopilot
path,
address(this),
block.timestamp
);
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function withdrawDividend(address _rewardToken) external virtual override {
_withdrawDividendOfUser(payable(msg.sender), _rewardToken);
}
/// @notice Withdraws the ether distributed to the sender.
/// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
function _withdrawDividendOfUser(address payable user, address _rewardToken) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user, _rewardToken);
if (_withdrawableDividend > 0) {
withdrawnDividends[user][_rewardToken] = withdrawnDividends[user][_rewardToken].add(_withdrawableDividend);
emit DividendWithdrawn(user, _withdrawableDividend);
IERC20(_rewardToken).transfer(user, _withdrawableDividend);
return _withdrawableDividend;
}
return 0;
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function dividendOf(address _owner, address _rewardToken) external view override returns(uint256) {
return withdrawableDividendOf(_owner, _rewardToken);
}
/// @notice View the amount of dividend in wei that an address can withdraw.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` can withdraw.
function withdrawableDividendOf(address _owner, address _rewardToken) public view override returns(uint256) {
return accumulativeDividendOf(_owner,_rewardToken).sub(withdrawnDividends[_owner][_rewardToken]);
}
/// @notice View the amount of dividend in wei that an address has withdrawn.
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has withdrawn.
function withdrawnDividendOf(address _owner, address _rewardToken) external view override returns(uint256) {
return withdrawnDividends[_owner][_rewardToken];
}
/// @notice View the amount of dividend in wei that an address has earned in total.
/// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
/// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
/// @param _owner The address of a token holder.
/// @return The amount of dividend in wei that `_owner` has earned in total.
function accumulativeDividendOf(address _owner, address _rewardToken) public view override returns(uint256) {
return magnifiedDividendPerShare[_rewardToken].mul(holderBalance[_owner]).toInt256Safe()
.add(magnifiedDividendCorrections[_rewardToken][_owner]).toUint256Safe() / magnitude;
}
/// @dev Internal function that increases tokens to an account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account that will receive the created tokens.
/// @param value The amount that will be created.
function _increase(address account, uint256 value) internal {
for (uint256 i; i < rewardTokens.length; i++){
magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
.sub((magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe());
}
}
/// @dev Internal function that reduces an amount of the token of a given account.
/// Update magnifiedDividendCorrections to keep dividends unchanged.
/// @param account The account whose tokens will be burnt.
/// @param value The amount that will be burnt.
function _reduce(address account, uint256 value) internal {
for (uint256 i; i < rewardTokens.length; i++){
magnifiedDividendCorrections[rewardTokens[i]][account] = magnifiedDividendCorrections[rewardTokens[i]][account]
.add( (magnifiedDividendPerShare[rewardTokens[i]].mul(value)).toInt256Safe() );
}
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = holderBalance[account];
holderBalance[account] = newBalance;
if(newBalance > currentBalance) {
uint256 increaseAmount = newBalance.sub(currentBalance);
_increase(account, increaseAmount);
totalBalance += increaseAmount;
} else if(newBalance < currentBalance) {
uint256 reduceAmount = currentBalance.sub(newBalance);
_reduce(account, reduceAmount);
totalBalance -= reduceAmount;
}
}
}
contract DividendTracker is DividendPayingToken {
using SafeMath for uint256;
using SafeMathInt for int256;
struct Map {
address[] keys;
mapping(address => uint) values;
mapping(address => uint) indexOf;
mapping(address => bool) inserted;
}
function get(address key) private view returns (uint) {
return tokenHoldersMap.values[key];
}
function getIndexOfKey(address key) private view returns (int) {
if(!tokenHoldersMap.inserted[key]) {
return -1;
}
return int(tokenHoldersMap.indexOf[key]);
}
function getKeyAtIndex(uint index) private view returns (address) {
return tokenHoldersMap.keys[index];
}
function size() private view returns (uint) {
return tokenHoldersMap.keys.length;
}
function set(address key, uint val) private {
if (tokenHoldersMap.inserted[key]) {
tokenHoldersMap.values[key] = val;
} else {
tokenHoldersMap.inserted[key] = true;
tokenHoldersMap.values[key] = val;
tokenHoldersMap.indexOf[key] = tokenHoldersMap.keys.length;
tokenHoldersMap.keys.push(key);
}
}
function remove(address key) private {
if (!tokenHoldersMap.inserted[key]) {
return;
}
delete tokenHoldersMap.inserted[key];
delete tokenHoldersMap.values[key];
uint index = tokenHoldersMap.indexOf[key];
uint lastIndex = tokenHoldersMap.keys.length - 1;
address lastKey = tokenHoldersMap.keys[lastIndex];
tokenHoldersMap.indexOf[lastKey] = index;
delete tokenHoldersMap.indexOf[key];
tokenHoldersMap.keys[index] = lastKey;
tokenHoldersMap.keys.pop();
}
Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping (address => bool) public excludedFromDividends;
mapping (address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public immutable minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event IncludeInDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(address indexed account, uint256 amount, bool indexed automatic);
constructor() {
claimWait = 1200;
minimumTokenBalanceForDividends = 1000 * (10**18);
}
function excludeFromDividends(address account) external onlyOwner {
excludedFromDividends[account] = true;
_setBalance(account, 0);
remove(account);
emit ExcludeFromDividends(account);
}
function includeInDividends(address account) external onlyOwner {
require(excludedFromDividends[account]);
excludedFromDividends[account] = false;
emit IncludeInDividends(account);
}
function updateClaimWait(uint256 newClaimWait) external onlyOwner {
require(newClaimWait >= 1200 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours");
require(newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value");
emit ClaimWaitUpdated(newClaimWait, claimWait);
claimWait = newClaimWait;
}
function getLastProcessedIndex() external view returns(uint256) {
return lastProcessedIndex;
}
function getNumberOfTokenHolders() external view returns(uint256) {
return tokenHoldersMap.keys.length;
}
// Autopilot
function getAccount(address _account, address _rewardToken)
public view returns (
address account,
int256 index,
int256 iterationsUntilProcessed,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilAutoClaimAvailable) {
account = _account;
index = getIndexOfKey(account);
iterationsUntilProcessed = -1;
if(index >= 0) {
if(uint256(index) > lastProcessedIndex) {
iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
}
else {
uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
0;
iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
}
}
withdrawableDividends = withdrawableDividendOf(account, _rewardToken);
totalDividends = accumulativeDividendOf(account, _rewardToken);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ?
lastClaimTime.add(claimWait) :
0;
secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
nextClaimTime.sub(block.timestamp) :
0;
}
function getAccountAtIndex(uint256 index, address _rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
if(index >= size()) {
return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
}
address account = getKeyAtIndex(index);
return getAccount(account, _rewardToken);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if(lastClaimTime > block.timestamp) {
return false;
}
return block.timestamp.sub(lastClaimTime) >= claimWait;
}
function setBalance(address payable account, uint256 newBalance) external onlyOwner {
if(excludedFromDividends[account]) {
return;
}
if(newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
set(account, newBalance);
}
else {
_setBalance(account, 0);
remove(account);
}
processAccount(account, true);
}
function process(uint256 gas) external returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if(numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while(gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if(canAutoClaim(lastClaimTimes[account])) {
if(processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if(gasLeft > newGasLeft) {
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
uint256 amount;
bool paid;
for (uint256 i; i < rewardTokens.length; i++){
amount = _withdrawDividendOfUser(account, rewardTokens[i]);
if(amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
paid = true;
}
}
return paid;
}
}
contract USDC2 is ERC20, Ownable {
using SafeMath for uint256;
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
bool private swapping;
DividendTracker public dividendTracker;
address public operationsWallet;
uint256 public maxTransactionAmount;
uint256 public swapTokensAtAmount;
uint256 public maxWallet;
uint256 public liquidityActiveBlock = 0;
uint256 public tradingActiveBlock = 0;
uint256 public earlyBuyPenaltyEnd;
bool public limitsInEffect = true;
bool public tradingActive = false;
bool public swapEnabled = true;
mapping(address => uint256) private _holderLastTransferTimestamp;
bool public transferDelayEnabled = true;
uint256 public constant feeDivisor = 1000;
uint256 public totalSellFees;
uint256 public rewardsSellFee;
uint256 public operationsSellFee;
uint256 public liquiditySellFee;
uint256 public totalBuyFees;
uint256 public rewardsBuyFee;
uint256 public operationsBuyFee;
uint256 public liquidityBuyFee;
uint256 public tokensForRewards;
uint256 public tokensForOperations;
uint256 public tokensForLiquidity;
uint256 public gasForProcessing = 0;
uint256 public lpWithdrawRequestTimestamp;
uint256 public lpWithdrawRequestDuration = 3 days;
bool public lpWithdrawRequestPending;
uint256 public lpPercToWithDraw;
mapping (address => bool) private _isExcludedFromFees;
mapping (address => bool) public _isExcludedMaxTransactionAmount;
mapping (address => bool) public automatedMarketMakerPairs;
event ExcludeFromFees(address indexed account, bool isExcluded);
event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
event ExcludedMaxTransactionAmount(address indexed account, bool isExcluded);
event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
event OperationsWalletUpdated(address indexed newWallet, address indexed oldWallet);
event DevWalletUpdated(address indexed newWallet, address indexed oldWallet);
event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event SwapAndLiquify(
uint256 tokensSwapped,
uint256 ethReceived,
uint256 tokensIntoLiqudity
);
event SendDividends(
uint256 tokensSwapped,
uint256 amount
);
event ProcessedDividendTracker(
uint256 iterations,
uint256 claims,
uint256 lastProcessedIndex,
bool indexed automatic,
uint256 gas,
address indexed processor
);
event RequestedLPWithdraw();
event WithdrewLPForMigration();
event CanceledLpWithdrawRequest();
constructor() ERC20("USDC 2.0", "USDC2.0") {
uint256 totalSupply = 1_000_000_000 * 1e18;
maxTransactionAmount = 25_000_000 * 1e18;
maxWallet = 25_000_000 * 1e18;
swapTokensAtAmount = (totalSupply * 5) / 10000;
rewardsBuyFee = 5;
operationsBuyFee = 5;
liquidityBuyFee = 0;
totalBuyFees = rewardsBuyFee + operationsBuyFee + liquidityBuyFee;
rewardsSellFee = 5;
operationsSellFee = 15;
liquiditySellFee = 0;
totalSellFees = rewardsSellFee + operationsSellFee + liquiditySellFee;
dividendTracker = new DividendTracker();
operationsWallet = address(msg.sender);
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(this), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
uniswapV2Pair = _uniswapV2Pair;
_setAutomatedMarketMakerPair(_uniswapV2Pair, true);
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(owner());
dividendTracker.excludeFromDividends(address(_uniswapV2Router));
dividendTracker.excludeFromDividends(address(0xdead));
excludeFromFees(owner(), true);
excludeFromFees(address(this), true);
excludeFromFees(address(0xdead), true);
excludeFromMaxTransaction(owner(), true);
excludeFromMaxTransaction(address(this), true);
excludeFromMaxTransaction(address(dividendTracker), true);
excludeFromMaxTransaction(address(_uniswapV2Router), true);
excludeFromMaxTransaction(address(0xdead), true);
_createInitialSupply(address(owner()), totalSupply);
}
receive() external payable {
}
function addPresaleAddressForExclusions(address _presaleAddress) external onlyOwner {
excludeFromFees(_presaleAddress, true);
dividendTracker.excludeFromDividends(_presaleAddress);
excludeFromMaxTransaction(_presaleAddress, true);
}
function disableTransferDelay() external onlyOwner returns (bool){
transferDelayEnabled = false;
return true;
}
// Autopilot
function excludeFromDividends(address account) external onlyOwner {
dividendTracker.excludeFromDividends(account);
}
// Autopilot
function includeInDividends(address account) external onlyOwner {
dividendTracker.includeInDividends(account);
}
// Autopilot
function enableTrading() external onlyOwner {
require(!tradingActive, "Cannot re-enable trading");
tradingActive = true;
swapEnabled = true;
tradingActiveBlock = block.number;
}
// Autopilot
function updateSwapEnabled(bool enabled) external onlyOwner(){
swapEnabled = enabled;
}
function updateMaxAmount(uint256 newNum) external onlyOwner {
require(newNum > (totalSupply() * 1 / 1000)/1e18, "Cannot set maxTransactionAmount lower than 0.1%");
maxTransactionAmount = newNum * (10**18);
}
function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
require(newNum > (totalSupply() * 1 / 100)/1e18, "Cannot set maxWallet lower than 1%");
maxWallet = newNum * (10**18);
}
function updateBuyFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
operationsBuyFee = _operationsFee;
rewardsBuyFee = _rewardsFee;
liquidityBuyFee = _liquidityFee;
totalBuyFees = operationsBuyFee + rewardsBuyFee + liquidityBuyFee;
require(totalBuyFees <= 100, "Must keep fees at 10% or less");
}
function updateSellFees(uint256 _operationsFee, uint256 _rewardsFee, uint256 _liquidityFee) external onlyOwner {
operationsSellFee = _operationsFee;
rewardsSellFee = _rewardsFee;
liquiditySellFee = _liquidityFee;
totalSellFees = operationsSellFee + rewardsSellFee + liquiditySellFee;
require(totalSellFees <= 100, "Must keep fees at 10% or less");
}
function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
_isExcludedMaxTransactionAmount[updAds] = isEx;
emit ExcludedMaxTransactionAmount(updAds, isEx);
}
function excludeFromFees(address account, bool excluded) public onlyOwner {
_isExcludedFromFees[account] = excluded;
emit ExcludeFromFees(account, excluded);
}
function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
for(uint256 i = 0; i < accounts.length; i++) {
_isExcludedFromFees[accounts[i]] = excluded;
}
emit ExcludeMultipleAccountsFromFees(accounts, excluded);
}
function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
require(pair != uniswapV2Pair, "The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");
_setAutomatedMarketMakerPair(pair, value);
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
automatedMarketMakerPairs[pair] = value;
excludeFromMaxTransaction(pair, value);
if(value) {
dividendTracker.excludeFromDividends(pair);
}
emit SetAutomatedMarketMakerPair(pair, value);
}
function updateOperationsWallet(address newOperationsWallet) external onlyOwner {
require(newOperationsWallet != address(0), "may not set to 0 address");
excludeFromFees(newOperationsWallet, true);
emit OperationsWalletUpdated(newOperationsWallet, operationsWallet);
operationsWallet = newOperationsWallet;
}
function updateGasForProcessing(uint256 newValue) external onlyOwner {
require(newValue >= 200000 && newValue <= 500000, " gasForProcessing must be between 200,000 and 500,000");
require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
emit GasForProcessingUpdated(newValue, gasForProcessing);
gasForProcessing = newValue;
}
function updateClaimWait(uint256 claimWait) external onlyOwner {
dividendTracker.updateClaimWait(claimWait);
}
function getClaimWait() external view returns(uint256) {
return dividendTracker.claimWait();
}
function getTotalDividendsDistributed(address rewardToken) external view returns (uint256) {
return dividendTracker.totalDividendsDistributed(rewardToken);
}
function isExcludedFromFees(address account) external view returns(bool) {
return _isExcludedFromFees[account];
}
function withdrawableDividendOf(address account, address rewardToken) external view returns(uint256) {
return dividendTracker.withdrawableDividendOf(account, rewardToken);
}
function dividendTokenBalanceOf(address account) external view returns (uint256) {
return dividendTracker.holderBalance(account);
}
function getAccountDividendsInfo(address account, address rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
return dividendTracker.getAccount(account, rewardToken);
}
function getAccountDividendsInfoAtIndex(uint256 index, address rewardToken)
external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256) {
return dividendTracker.getAccountAtIndex(index, rewardToken);
}
function processDividendTracker(uint256 gas) external {
(uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
}
function claim() external {
dividendTracker.processAccount(payable(msg.sender), false);
}
function getLastProcessedIndex() external view returns(uint256) {
return dividendTracker.getLastProcessedIndex();
}
function getNumberOfDividendTokenHolders() external view returns(uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
function getNumberOfDividends() external view returns(uint256) {
return dividendTracker.totalBalance();
}
// Autopilot
function removeLimits() external onlyOwner returns (bool){
limitsInEffect = false;
transferDelayEnabled = false;
return true;
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
if(amount == 0) {
super._transfer(from, to, 0);
return;
}
if(!tradingActive){
require(_isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active yet.");
}
if(limitsInEffect){
if (
from != owner() &&
to != owner() &&
to != address(0) &&
to != address(0xdead) &&
!swapping
){
// Autopilot
if (transferDelayEnabled){
if (to != address(uniswapV2Router) && to != address(uniswapV2Pair)){
require(_holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed.");
_holderLastTransferTimestamp[tx.origin] = block.number;
}
}
// Autopilot
if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
}
// Autopilot
else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
}
else if(!_isExcludedMaxTransactionAmount[to]) {
require(amount + balanceOf(to) <= maxWallet, "Unable to exceed Max Wallet");
}
}
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if(
canSwap &&
swapEnabled &&
!swapping &&
!automatedMarketMakerPairs[from] &&
!_isExcludedFromFees[from] &&
!_isExcludedFromFees[to]
) {
swapping = true;
swapBack();
swapping = false;
}
bool takeFee = !swapping;
// Autopilot
if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
takeFee = false;
}
uint256 fees = 0;
// Autopilot
if(takeFee){
if(tradingActiveBlock + 1 >= block.number && (automatedMarketMakerPairs[to] || automatedMarketMakerPairs[from])){
fees = amount.mul(99).div(100);
tokensForLiquidity += fees * 33 / 99;
tokensForRewards += fees * 33 / 99;
tokensForOperations += fees * 33 / 99;
}
// Autopilot
else if (automatedMarketMakerPairs[to] && totalSellFees > 0){
fees = amount.mul(totalSellFees).div(feeDivisor);
tokensForRewards += fees * rewardsSellFee / totalSellFees;
tokensForLiquidity += fees * liquiditySellFee / totalSellFees;
tokensForOperations += fees * operationsSellFee / totalSellFees;
}
// Autopilot
else if(automatedMarketMakerPairs[from] && totalBuyFees > 0) {
fees = amount.mul(totalBuyFees).div(feeDivisor);
tokensForRewards += fees * rewardsBuyFee / totalBuyFees;
tokensForLiquidity += fees * liquidityBuyFee / totalBuyFees;
tokensForOperations += fees * operationsBuyFee / totalBuyFees;
}
if(fees > 0){
super._transfer(from, address(this), fees);
}
amount -= fees;
}
super._transfer(from, to, amount);
dividendTracker.setBalance(payable(from), balanceOf(from));
dividendTracker.setBalance(payable(to), balanceOf(to));
if(!swapping && gasForProcessing > 0) {
uint256 gas = gasForProcessing;
try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
}
catch {}
}
}
function swapTokensForEth(uint256 tokenAmount) private {
// Autopilot
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = uniswapV2Router.WETH();
_approve(address(this), address(uniswapV2Router), tokenAmount);
// Autopilot
uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0, // Autopilot
path,
address(this),
block.timestamp
);
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
// Autopilot
_approve(address(this), address(uniswapV2Router), tokenAmount);
// Autopilot
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(this),
tokenAmount,
0, // Autopilot
0, // Autopilot
address(0xdead),
block.timestamp
);
}
function swapBack() private {
uint256 contractBalance = balanceOf(address(this));
uint256 totalTokensToSwap = tokensForLiquidity + tokensForOperations + tokensForRewards;
if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
// Autopilot
uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
uint256 initialETHBalance = address(this).balance;
swapTokensForEth(amountToSwapForETH);
uint256 ethBalance = address(this).balance.sub(initialETHBalance);
uint256 ethForOperations = ethBalance.mul(tokensForOperations).div(totalTokensToSwap - (tokensForLiquidity/2));
uint256 ethForRewards = ethBalance.mul(tokensForRewards).div(totalTokensToSwap - (tokensForLiquidity/2));
uint256 ethForLiquidity = ethBalance - ethForOperations - ethForRewards;
tokensForLiquidity = 0;
tokensForOperations = 0;
tokensForRewards = 0;
if(liquidityTokens > 0 && ethForLiquidity > 0){
addLiquidity(liquidityTokens, ethForLiquidity);
emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
}
// Autopilot
(bool success,) = address(dividendTracker).call{value: ethForRewards}("");
(success,) = address(operationsWallet).call{value: address(this).balance}("");
}
function withdrawStuckEth() external onlyOwner {
(bool success,) = address(msg.sender).call{value: address(this).balance}("");
require(success, "failed to withdraw");
}
function requestToWithdrawLP(uint256 percToWithdraw) external onlyOwner {
require(!lpWithdrawRequestPending, "Cannot request again until first request is over.");
require(percToWithdraw <= 100 && percToWithdraw > 0, "Need to set between 1-100%");
lpWithdrawRequestTimestamp = block.timestamp;
lpWithdrawRequestPending = true;
lpPercToWithDraw = percToWithdraw;
emit RequestedLPWithdraw();
}
function nextAvailableLpWithdrawDate() public view returns (uint256){
if(lpWithdrawRequestPending){
return lpWithdrawRequestTimestamp + lpWithdrawRequestDuration;
}
else {
return 0; // Autopilot
}
}
function withdrawRequestedLP() external onlyOwner {
require(block.timestamp >= nextAvailableLpWithdrawDate() && nextAvailableLpWithdrawDate() > 0, "Must request and wait.");
lpWithdrawRequestTimestamp = 0;
lpWithdrawRequestPending = false;
uint256 amtToWithdraw = IERC20(address(uniswapV2Pair)).balanceOf(address(this)) * lpPercToWithDraw / 100;
lpPercToWithDraw = 0;
IERC20(uniswapV2Pair).transfer(msg.sender, amtToWithdraw);
}
function cancelLPWithdrawRequest() external onlyOwner {
lpWithdrawRequestPending = false;
lpPercToWithDraw = 0;
lpWithdrawRequestTimestamp = 0;
emit CanceledLpWithdrawRequest();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"ClaimWaitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"ExcludeFromDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"IncludeInDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeDividends","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"dividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"getAccount","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"int256","name":"iterationsUntilProcessed","type":"int256"},{"internalType":"uint256","name":"withdrawableDividends","type":"uint256"},{"internalType":"uint256","name":"totalDividends","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"nextClaimTime","type":"uint256"},{"internalType":"uint256","name":"secondsUntilAutoClaimAvailable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"getAccountAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"bool","name":"automatic","type":"bool"}],"name":"processAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardTokenCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"setBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"withdrawDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c060405234801561001057600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d60808190526002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90910180546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905581546100d1576100d1610115565b600091825260209091200154600380546001600160a01b0319166001600160a01b03909216919091179055506104b0601155683635c9adc5dea0000060a05261012b565b634e487b7160e01b600052603260045260246000fd5b60805160a051611f90610165600039600081816104d10152610d3901526000818161022e0152818161121901526113050152611f906000f3fe6080604052600436106101dc5760003560e01c80639c53c0ca11610102578063e30443bc11610095578063e98030c711610064578063e98030c7146105ee578063f2fde38b1461060e578063fd5908471461062e578063ffb2c4791461064e57600080fd5b8063e30443bc14610553578063e6f083f414610573578063e7841ec0146105b9578063e7f4d2c3146105ce57600080fd5b8063be10b614116100d1578063be10b614146104bf578063c0f306ef146104f3578063cb83bcd614610513578063cc5489df1461053357600080fd5b80639c53c0ca1461043c578063ab6ddfa81461045c578063ad7a672f14610489578063bc4c4b371461049f57600080fd5b80634d6e5e021161017a5780637bb7bed1116101495780637bb7bed1146103835780638c503bf5146103a35780638da5cb5b1461040857806393fcfe611461042657600080fd5b80634d6e5e02146102eb5780634e7b827f146103185780636f2789ec14610358578063715018a61461036e57600080fd5b8063204f11a8116101b6578063204f11a814610268578063226cfa3d146102885780633009a609146102b557806331e79db0146102cb57600080fd5b806303c83302146101f057806309bbedde146101f85780631694505e1461021c57600080fd5b366101eb576101e9610689565b005b600080fd5b6101e9610689565b34801561020457600080fd5b50600a545b6040519081526020015b60405180910390f35b34801561022857600080fd5b506102507f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610213565b34801561027457600080fd5b50610209610283366004611bcc565b6108eb565b34801561029457600080fd5b506102096102a3366004611c05565b60106020526000908152604090205481565b3480156102c157600080fd5b50610209600e5481565b3480156102d757600080fd5b506101e96102e6366004611c05565b61092a565b3480156102f757600080fd5b50610209610306366004611c05565b60096020526000908152604090205481565b34801561032457600080fd5b50610348610333366004611c05565b600f6020526000908152604090205460ff1681565b6040519015158152602001610213565b34801561036457600080fd5b5061020960115481565b34801561037a57600080fd5b506101e96109cb565b34801561038f57600080fd5b5061025061039e366004611c22565b610a3f565b3480156103af57600080fd5b506103c36103be366004611c3b565b610a69565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610213565b34801561041457600080fd5b506000546001600160a01b0316610250565b34801561043257600080fd5b5061020960045481565b34801561044857600080fd5b506101e9610457366004611c05565b610ad9565b34801561046857600080fd5b50610209610477366004611c05565b60076020526000908152604090205481565b34801561049557600080fd5b5061020960085481565b3480156104ab57600080fd5b506103486104ba366004611c6e565b610ae7565b3480156104cb57600080fd5b506102097f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ff57600080fd5b506101e961050e366004611c05565b610bd5565b34801561051f57600080fd5b5061020961052e366004611bcc565b610c6d565b34801561053f57600080fd5b5061020961054e366004611bcc565b610c79565b34801561055f57600080fd5b506101e961056e366004611c9c565b610ced565b34801561057f57600080fd5b5061020961058e366004611bcc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156105c557600080fd5b50600e54610209565b3480156105da57600080fd5b50600354610250906001600160a01b031681565b3480156105fa57600080fd5b506101e9610609366004611c22565b610d9b565b34801561061a57600080fd5b506101e9610629366004611c05565b610f04565b34801561063a57600080fd5b506103c3610649366004611bcc565b610fee565b34801561065a57600080fd5b5061066e610669366004611c22565b6110d9565b60408051938452602084019290925290820152606001610213565b60006008541161069857600080fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107059190611cc8565b60035490915061071f9034906001600160a01b03166111f6565b6003546040516370a0823160e01b81523060048201526000916107989184916001600160a01b0316906370a0823190602401602060405180830381865afa15801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190611cc8565b9061137c565b90508015610874576008546107e0906107b583600160801b6113be565b6107bf9190611cf7565b6003546001600160a01b031660009081526001602052604090205490611440565b6003546001600160a01b0316600090815260016020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a26003546001600160a01b03166000908152600960205260409020546108589082611440565b6003546001600160a01b03166000908152600960205260409020555b60025461088390600190611d19565b6004541461089e57600454610899906001611d30565b6108a1565b60005b6004819055506002600454815481106108bc576108bc611d48565b600091825260209091200154600380546001600160a01b0319166001600160a01b039092169190911790555050565b6001600160a01b038083166000908152600660209081526040808320938516835292905290812054610921906107928585610c79565b90505b92915050565b6000546001600160a01b0316331461095d5760405162461bcd60e51b815260040161095490611d5e565b60405180910390fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561098b90829061149f565b61099481611538565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6000546001600160a01b031633146109f55760405162461bcd60e51b815260040161095490611d5e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60028181548110610a4f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600080600080600080600080610a7e600a5490565b8a10610aa3575060009650600019955085945086935083925082915081905080610acc565b6000610aae8b61166b565b9050610aba818b610fee565b98509850985098509850985098509850505b9295985092959890939650565b610ae3338261169e565b5050565b600080546001600160a01b03163314610b125760405162461bcd60e51b815260040161095490611d5e565b60008060005b600254811015610bcc57610b538660028381548110610b3957610b39611d48565b6000918252602090912001546001600160a01b031661169e565b92508215610bba576001600160a01b038616600081815260106020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610bad9087815260200190565b60405180910390a3600191505b80610bc481611d93565b915050610b18565b50949350505050565b6000546001600160a01b03163314610bff5760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b0381166000908152600f602052604090205460ff16610c2457600080fd5b6001600160a01b0381166000818152600f6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b600061092183836108eb565b6001600160a01b03808216600081815260056020908152604080832094871683529381528382205460078252848320549383526001909152928120549092600160801b92610ce392610cde9291610cd891610cd3916113be565b6117cb565b906117db565b611819565b6109219190611cf7565b6000546001600160a01b03163314610d175760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b0382166000908152600f602052604090205460ff16610ae3577f00000000000000000000000000000000000000000000000000000000000000008110610d7757610d68828261149f565b610d72828261182c565b610d8b565b610d8282600061149f565b610d8b82611538565b610d96826001610ae7565b505050565b6000546001600160a01b03163314610dc55760405162461bcd60e51b815260040161095490611d5e565b6104b08110158015610dda5750620151808111155b610e5a5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610954565b6011548103610ed15760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610954565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6000546001600160a01b03163314610f2e5760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b038116610f935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610954565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b816000808080808080611000886118ea565b965060001995506000871261106257600e5487111561102e57600e5461102790889061192f565b9550611062565b600e54600a5460009110611043576000611052565b600e54600a546110529161137c565b905061105e88826117db565b9650505b61106c888a6108eb565b9450611078888a610c79565b6001600160a01b0389166000908152601060205260409020549094509250826110a25760006110b0565b6011546110b0908490611440565b91504282116110c05760006110ca565b6110ca824261137c565b90509295985092959890939650565b600a54600090819081908082036110fb575050600e54600092508291506111ef565b600e546000805a90506000805b898410801561111657508582105b156111de578461112581611d93565b600a549096508610905061113857600094505b6000600a600001868154811061115057611150611d48565b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506111819061196c565b156111a457611191816001610ae7565b156111a457816111a081611d93565b9250505b826111ae81611d93565b93505060005a9050808511156111d5576111d26111cb868361137c565b8790611440565b95505b93506111089050565b600e85905590975095509193505050505b9193909250565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112999190611dac565b816000815181106112ac576112ac611d48565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106112e0576112e0611d48565b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de9590859061134590600090869030904290600401611dc9565b6000604051808303818588803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505050505050565b600061092183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611993565b6000826000036113d057506000610924565b60006113dc8385611e33565b9050826113e98583611cf7565b146109215760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610954565b60008061144d8385611d30565b9050838110156109215760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610954565b6001600160a01b0382166000908152600760205260409020805490829055808211156114fb5760006114d1838361137c565b90506114dd84826119cd565b80600860008282546114ef9190611d30565b90915550610d96915050565b80821015610d9657600061150f828461137c565b905061151b8482611ad6565b806008600082825461152d9190611d19565b909155505050505050565b6001600160a01b0381166000908152600d602052604090205460ff1661155b5750565b6001600160a01b0381166000908152600d60209081526040808320805460ff19169055600b8252808320839055600c909152812054600a549091906115a290600190611d19565b90506000600a60000182815481106115bc576115bc611d48565b60009182526020808320909101546001600160a01b03908116808452600c90925260408084208790559087168352822091909155600a805491925082918590811061160957611609611d48565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600a80548061164357611643611e52565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000600a600001828154811061168357611683611d48565b6000918252602090912001546001600160a01b031692915050565b6000806116ab84846108eb565b905080156117c1576001600160a01b038085166000908152600660209081526040808320938716835292905220546116e39082611440565b6001600160a01b038086166000818152600660209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061173e9084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190611e68565b509050610924565b5060009392505050565b6000818181121561092457600080fd5b6000806117e88385611e85565b9050600083121580156117fb5750838112155b80611810575060008312801561181057508381125b61092157600080fd5b60008082121561182857600080fd5b5090565b6001600160a01b0382166000908152600d602052604090205460ff161561186a576001600160a01b03919091166000908152600b6020526040902055565b6001600160a01b0382166000818152600d60209081526040808320805460ff19166001908117909155600b8352818420869055600a8054600c909452918420839055820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600d602052604081205460ff166119135750600019919050565b506001600160a01b03166000908152600c602052604090205490565b60008061193c8385611ec6565b90506000831215801561194f5750838113155b806118105750600083128015611810575083811361092157600080fd5b60004282111561197e57506000919050565b60115461198b428461137c565b101592915050565b600081848411156119b75760405162461bcd60e51b81526004016109549190611f05565b5060006119c48486611d19565b95945050505050565b60005b600254811015610d9657611a78611a26610cd38460016000600287815481106119fb576119fb611d48565b60009182526020808320909101546001600160a01b03168352820192909252604001902054906113be565b6005600060028581548110611a3d57611a3d611d48565b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182209389168252929092529020549061192f565b6005600060028481548110611a8f57611a8f611d48565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611ace81611d93565b9150506119d0565b60005b600254811015610d9657611b56611b04610cd38460016000600287815481106119fb576119fb611d48565b6005600060028581548110611b1b57611b1b611d48565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938916825292909252902054906117db565b6005600060028481548110611b6d57611b6d611d48565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611bac81611d93565b915050611ad9565b6001600160a01b0381168114611bc957600080fd5b50565b60008060408385031215611bdf57600080fd5b8235611bea81611bb4565b91506020830135611bfa81611bb4565b809150509250929050565b600060208284031215611c1757600080fd5b813561092181611bb4565b600060208284031215611c3457600080fd5b5035919050565b60008060408385031215611c4e57600080fd5b823591506020830135611bfa81611bb4565b8015158114611bc957600080fd5b60008060408385031215611c8157600080fd5b8235611c8c81611bb4565b91506020830135611bfa81611c60565b60008060408385031215611caf57600080fd5b8235611cba81611bb4565b946020939093013593505050565b600060208284031215611cda57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611d1457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d2b57611d2b611ce1565b500390565b60008219821115611d4357611d43611ce1565b500190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611da557611da5611ce1565b5060010190565b600060208284031215611dbe57600080fd5b815161092181611bb4565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611e135784516001600160a01b031683529383019391830191600101611dee565b50506001600160a01b039690961660408501525050506060015292915050565b6000816000190483118215151615611e4d57611e4d611ce1565b500290565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611e7a57600080fd5b815161092181611c60565b600080821280156001600160ff1b0384900385131615611ea757611ea7611ce1565b600160ff1b8390038412811615611ec057611ec0611ce1565b50500190565b60008083128015600160ff1b850184121615611ee457611ee4611ce1565b6001600160ff1b0384018313811615611eff57611eff611ce1565b50500390565b600060208083528351808285015260005b81811015611f3257858101830151858201604001528201611f16565b81811115611f44576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220a75d9febecae0c805685c59886a0a365b895ee396bae0d8187670e520af9c25364736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106101dc5760003560e01c80639c53c0ca11610102578063e30443bc11610095578063e98030c711610064578063e98030c7146105ee578063f2fde38b1461060e578063fd5908471461062e578063ffb2c4791461064e57600080fd5b8063e30443bc14610553578063e6f083f414610573578063e7841ec0146105b9578063e7f4d2c3146105ce57600080fd5b8063be10b614116100d1578063be10b614146104bf578063c0f306ef146104f3578063cb83bcd614610513578063cc5489df1461053357600080fd5b80639c53c0ca1461043c578063ab6ddfa81461045c578063ad7a672f14610489578063bc4c4b371461049f57600080fd5b80634d6e5e021161017a5780637bb7bed1116101495780637bb7bed1146103835780638c503bf5146103a35780638da5cb5b1461040857806393fcfe611461042657600080fd5b80634d6e5e02146102eb5780634e7b827f146103185780636f2789ec14610358578063715018a61461036e57600080fd5b8063204f11a8116101b6578063204f11a814610268578063226cfa3d146102885780633009a609146102b557806331e79db0146102cb57600080fd5b806303c83302146101f057806309bbedde146101f85780631694505e1461021c57600080fd5b366101eb576101e9610689565b005b600080fd5b6101e9610689565b34801561020457600080fd5b50600a545b6040519081526020015b60405180910390f35b34801561022857600080fd5b506102507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610213565b34801561027457600080fd5b50610209610283366004611bcc565b6108eb565b34801561029457600080fd5b506102096102a3366004611c05565b60106020526000908152604090205481565b3480156102c157600080fd5b50610209600e5481565b3480156102d757600080fd5b506101e96102e6366004611c05565b61092a565b3480156102f757600080fd5b50610209610306366004611c05565b60096020526000908152604090205481565b34801561032457600080fd5b50610348610333366004611c05565b600f6020526000908152604090205460ff1681565b6040519015158152602001610213565b34801561036457600080fd5b5061020960115481565b34801561037a57600080fd5b506101e96109cb565b34801561038f57600080fd5b5061025061039e366004611c22565b610a3f565b3480156103af57600080fd5b506103c36103be366004611c3b565b610a69565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610213565b34801561041457600080fd5b506000546001600160a01b0316610250565b34801561043257600080fd5b5061020960045481565b34801561044857600080fd5b506101e9610457366004611c05565b610ad9565b34801561046857600080fd5b50610209610477366004611c05565b60076020526000908152604090205481565b34801561049557600080fd5b5061020960085481565b3480156104ab57600080fd5b506103486104ba366004611c6e565b610ae7565b3480156104cb57600080fd5b506102097f00000000000000000000000000000000000000000000003635c9adc5dea0000081565b3480156104ff57600080fd5b506101e961050e366004611c05565b610bd5565b34801561051f57600080fd5b5061020961052e366004611bcc565b610c6d565b34801561053f57600080fd5b5061020961054e366004611bcc565b610c79565b34801561055f57600080fd5b506101e961056e366004611c9c565b610ced565b34801561057f57600080fd5b5061020961058e366004611bcc565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b3480156105c557600080fd5b50600e54610209565b3480156105da57600080fd5b50600354610250906001600160a01b031681565b3480156105fa57600080fd5b506101e9610609366004611c22565b610d9b565b34801561061a57600080fd5b506101e9610629366004611c05565b610f04565b34801561063a57600080fd5b506103c3610649366004611bcc565b610fee565b34801561065a57600080fd5b5061066e610669366004611c22565b6110d9565b60408051938452602084019290925290820152606001610213565b60006008541161069857600080fd5b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156106e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107059190611cc8565b60035490915061071f9034906001600160a01b03166111f6565b6003546040516370a0823160e01b81523060048201526000916107989184916001600160a01b0316906370a0823190602401602060405180830381865afa15801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190611cc8565b9061137c565b90508015610874576008546107e0906107b583600160801b6113be565b6107bf9190611cf7565b6003546001600160a01b031660009081526001602052604090205490611440565b6003546001600160a01b0316600090815260016020908152604091829020929092555182815233917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511910160405180910390a26003546001600160a01b03166000908152600960205260409020546108589082611440565b6003546001600160a01b03166000908152600960205260409020555b60025461088390600190611d19565b6004541461089e57600454610899906001611d30565b6108a1565b60005b6004819055506002600454815481106108bc576108bc611d48565b600091825260209091200154600380546001600160a01b0319166001600160a01b039092169190911790555050565b6001600160a01b038083166000908152600660209081526040808320938516835292905290812054610921906107928585610c79565b90505b92915050565b6000546001600160a01b0316331461095d5760405162461bcd60e51b815260040161095490611d5e565b60405180910390fd5b6001600160a01b0381166000908152600f60205260408120805460ff1916600117905561098b90829061149f565b61099481611538565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6000546001600160a01b031633146109f55760405162461bcd60e51b815260040161095490611d5e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60028181548110610a4f57600080fd5b6000918252602090912001546001600160a01b0316905081565b600080600080600080600080610a7e600a5490565b8a10610aa3575060009650600019955085945086935083925082915081905080610acc565b6000610aae8b61166b565b9050610aba818b610fee565b98509850985098509850985098509850505b9295985092959890939650565b610ae3338261169e565b5050565b600080546001600160a01b03163314610b125760405162461bcd60e51b815260040161095490611d5e565b60008060005b600254811015610bcc57610b538660028381548110610b3957610b39611d48565b6000918252602090912001546001600160a01b031661169e565b92508215610bba576001600160a01b038616600081815260106020526040908190204290555186151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610bad9087815260200190565b60405180910390a3600191505b80610bc481611d93565b915050610b18565b50949350505050565b6000546001600160a01b03163314610bff5760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b0381166000908152600f602052604090205460ff16610c2457600080fd5b6001600160a01b0381166000818152600f6020526040808220805460ff19169055517f40a78dcf8526b72f2eaf598af1c7e49c8d5fc577f6c8f1bed887f3e4dfa289329190a250565b600061092183836108eb565b6001600160a01b03808216600081815260056020908152604080832094871683529381528382205460078252848320549383526001909152928120549092600160801b92610ce392610cde9291610cd891610cd3916113be565b6117cb565b906117db565b611819565b6109219190611cf7565b6000546001600160a01b03163314610d175760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b0382166000908152600f602052604090205460ff16610ae3577f00000000000000000000000000000000000000000000003635c9adc5dea000008110610d7757610d68828261149f565b610d72828261182c565b610d8b565b610d8282600061149f565b610d8b82611538565b610d96826001610ae7565b505050565b6000546001600160a01b03163314610dc55760405162461bcd60e51b815260040161095490611d5e565b6104b08110158015610dda5750620151808111155b610e5a5760405162461bcd60e51b815260206004820152604560248201527f4469766964656e645f547261636b65723a20636c61696d57616974206d75737460448201527f206265207570646174656420746f206265747765656e203120616e6420323420606482015264686f75727360d81b608482015260a401610954565b6011548103610ed15760405162461bcd60e51b815260206004820152603760248201527f4469766964656e645f547261636b65723a2043616e6e6f74207570646174652060448201527f636c61696d5761697420746f2073616d652076616c75650000000000000000006064820152608401610954565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6000546001600160a01b03163314610f2e5760405162461bcd60e51b815260040161095490611d5e565b6001600160a01b038116610f935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610954565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b816000808080808080611000886118ea565b965060001995506000871261106257600e5487111561102e57600e5461102790889061192f565b9550611062565b600e54600a5460009110611043576000611052565b600e54600a546110529161137c565b905061105e88826117db565b9650505b61106c888a6108eb565b9450611078888a610c79565b6001600160a01b0389166000908152601060205260409020549094509250826110a25760006110b0565b6011546110b0908490611440565b91504282116110c05760006110ca565b6110ca824261137c565b90509295985092959890939650565b600a54600090819081908082036110fb575050600e54600092508291506111ef565b600e546000805a90506000805b898410801561111657508582105b156111de578461112581611d93565b600a549096508610905061113857600094505b6000600a600001868154811061115057611150611d48565b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506111819061196c565b156111a457611191816001610ae7565b156111a457816111a081611d93565b9250505b826111ae81611d93565b93505060005a9050808511156111d5576111d26111cb868361137c565b8790611440565b95505b93506111089050565b600e85905590975095509193505050505b9193909250565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112999190611dac565b816000815181106112ac576112ac611d48565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106112e0576112e0611d48565b6001600160a01b03928316602091820292909201015260405163b6f9de9560e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063b6f9de9590859061134590600090869030904290600401611dc9565b6000604051808303818588803b15801561135e57600080fd5b505af1158015611372573d6000803e3d6000fd5b5050505050505050565b600061092183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611993565b6000826000036113d057506000610924565b60006113dc8385611e33565b9050826113e98583611cf7565b146109215760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610954565b60008061144d8385611d30565b9050838110156109215760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610954565b6001600160a01b0382166000908152600760205260409020805490829055808211156114fb5760006114d1838361137c565b90506114dd84826119cd565b80600860008282546114ef9190611d30565b90915550610d96915050565b80821015610d9657600061150f828461137c565b905061151b8482611ad6565b806008600082825461152d9190611d19565b909155505050505050565b6001600160a01b0381166000908152600d602052604090205460ff1661155b5750565b6001600160a01b0381166000908152600d60209081526040808320805460ff19169055600b8252808320839055600c909152812054600a549091906115a290600190611d19565b90506000600a60000182815481106115bc576115bc611d48565b60009182526020808320909101546001600160a01b03908116808452600c90925260408084208790559087168352822091909155600a805491925082918590811061160957611609611d48565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600a80548061164357611643611e52565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000600a600001828154811061168357611683611d48565b6000918252602090912001546001600160a01b031692915050565b6000806116ab84846108eb565b905080156117c1576001600160a01b038085166000908152600660209081526040808320938716835292905220546116e39082611440565b6001600160a01b038086166000818152600660209081526040808320948916835293905282902092909255517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061173e9084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b0385811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015611795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b99190611e68565b509050610924565b5060009392505050565b6000818181121561092457600080fd5b6000806117e88385611e85565b9050600083121580156117fb5750838112155b80611810575060008312801561181057508381125b61092157600080fd5b60008082121561182857600080fd5b5090565b6001600160a01b0382166000908152600d602052604090205460ff161561186a576001600160a01b03919091166000908152600b6020526040902055565b6001600160a01b0382166000818152600d60209081526040808320805460ff19166001908117909155600b8352818420869055600a8054600c909452918420839055820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790555050565b6001600160a01b0381166000908152600d602052604081205460ff166119135750600019919050565b506001600160a01b03166000908152600c602052604090205490565b60008061193c8385611ec6565b90506000831215801561194f5750838113155b806118105750600083128015611810575083811361092157600080fd5b60004282111561197e57506000919050565b60115461198b428461137c565b101592915050565b600081848411156119b75760405162461bcd60e51b81526004016109549190611f05565b5060006119c48486611d19565b95945050505050565b60005b600254811015610d9657611a78611a26610cd38460016000600287815481106119fb576119fb611d48565b60009182526020808320909101546001600160a01b03168352820192909252604001902054906113be565b6005600060028581548110611a3d57611a3d611d48565b60009182526020808320909101546001600160a01b03908116845283820194909452604092830182209389168252929092529020549061192f565b6005600060028481548110611a8f57611a8f611d48565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611ace81611d93565b9150506119d0565b60005b600254811015610d9657611b56611b04610cd38460016000600287815481106119fb576119fb611d48565b6005600060028581548110611b1b57611b1b611d48565b60009182526020808320909101546001600160a01b0390811684528382019490945260409283018220938916825292909252902054906117db565b6005600060028481548110611b6d57611b6d611d48565b60009182526020808320909101546001600160a01b039081168452838201949094526040928301822093881682529290925290205580611bac81611d93565b915050611ad9565b6001600160a01b0381168114611bc957600080fd5b50565b60008060408385031215611bdf57600080fd5b8235611bea81611bb4565b91506020830135611bfa81611bb4565b809150509250929050565b600060208284031215611c1757600080fd5b813561092181611bb4565b600060208284031215611c3457600080fd5b5035919050565b60008060408385031215611c4e57600080fd5b823591506020830135611bfa81611bb4565b8015158114611bc957600080fd5b60008060408385031215611c8157600080fd5b8235611c8c81611bb4565b91506020830135611bfa81611c60565b60008060408385031215611caf57600080fd5b8235611cba81611bb4565b946020939093013593505050565b600060208284031215611cda57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611d1457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d2b57611d2b611ce1565b500390565b60008219821115611d4357611d43611ce1565b500190565b634e487b7160e01b600052603260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201611da557611da5611ce1565b5060010190565b600060208284031215611dbe57600080fd5b815161092181611bb4565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611e135784516001600160a01b031683529383019391830191600101611dee565b50506001600160a01b039690961660408501525050506060015292915050565b6000816000190483118215151615611e4d57611e4d611ce1565b500290565b634e487b7160e01b600052603160045260246000fd5b600060208284031215611e7a57600080fd5b815161092181611c60565b600080821280156001600160ff1b0384900385131615611ea757611ea7611ce1565b600160ff1b8390038412811615611ec057611ec0611ce1565b50500190565b60008083128015600160ff1b850184121615611ee457611ee4611ce1565b6001600160ff1b0384018313811615611eff57611eff611ce1565b50500390565b600060208083528351808285015260005b81811015611f3257858101830151858201604001528201611f16565b81811115611f44576000604083870101525b50601f01601f191692909201604001939250505056fea2646970667358221220a75d9febecae0c805685c59886a0a365b895ee396bae0d8187670e520af9c25364736f6c634300080d0033
Deployed Bytecode Sourcemap
23415:8219:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17320:21;:19;:21::i;:::-;23415:8219;;;;;17357:841;;;:::i;26933:119::-;;;;;;;;;;-1:-1:-1;27017:15:0;:27;26933:119;;;160:25:1;;;148:2;133:18;26933:119:0;;;;;;;;16370:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;387:32:1;;;369:51;;357:2;342:18;16370:51:0;196:230:1;20297:217:0;;;;;;;;;;-1:-1:-1;20297:217:0;;;;;:::i;:::-;;:::i;25407:50::-;;;;;;;;;;-1:-1:-1;25407:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;25302:33;;;;;;;;;;;;;;;;25958:219;;;;;;;;;;-1:-1:-1;25958:219:0;;;;;:::i;:::-;;:::i;16695:60::-;;;;;;;;;;-1:-1:-1;16695:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;25344:54;;;;;;;;;;-1:-1:-1;25344:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1377:14:1;;1370:22;1352:41;;1340:2;1325:18;25344:54:0;1212:187:1;25466:24:0;;;;;;;;;;;;;;;;9035:148;;;;;;;;;;;;;:::i;16259:29::-;;;;;;;;;;-1:-1:-1;16259:29:0;;;;;:::i;:::-;;:::i;28792:511::-;;;;;;;;;;-1:-1:-1;28792:511:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2474:32:1;;;2456:51;;2538:2;2523:18;;2516:34;;;;2566:18;;;2559:34;;;;2624:2;2609:18;;2602:34;;;;2667:3;2652:19;;2645:35;2494:3;2696:19;;2689:35;2755:3;2740:19;;2733:35;2799:3;2784:19;;2777:35;2443:3;2428:19;28792:511:0;2117:701:1;8821:79:0;;;;;;;;;;-1:-1:-1;8859:7:0;8886:6;-1:-1:-1;;;;;8886:6:0;8821:79;;16328:33;;;;;;;;;;;;;;;;18865:145;;;;;;;;;;-1:-1:-1;18865:145:0;;;;;:::i;:::-;;:::i;16607:49::-;;;;;;;;;;-1:-1:-1;16607:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;16661:27;;;;;;;;;;;;;;;;31136:495;;;;;;;;;;-1:-1:-1;31136:495:0;;;;;:::i;:::-;;:::i;25497:56::-;;;;;;;;;;;;;;;26189:207;;;;;;;;;;-1:-1:-1;26189:207:0;;;;;:::i;:::-;;:::i;19924:162::-;;;;;;;;;;-1:-1:-1;19924:162:0;;;;;:::i;:::-;;:::i;21335:301::-;;;;;;;;;;-1:-1:-1;21335:301:0;;;;;:::i;:::-;;:::i;29538:428::-;;;;;;;;;;-1:-1:-1;29538:428:0;;;;;:::i;:::-;;:::i;20727:167::-;;;;;;;;;;-1:-1:-1;20727:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;20848:26:0;;;20825:7;20848:26;;;:18;:26;;;;;;;;:40;;;;;;;;;;;;;20727:167;26820:105;;;;;;;;;;-1:-1:-1;26899:18:0;;26820:105;;16293:30;;;;;;;;;;-1:-1:-1;16293:30:0;;;;-1:-1:-1;;;;;16293:30:0;;;26404:408;;;;;;;;;;-1:-1:-1;26404:408:0;;;;;:::i;:::-;;:::i;9191:244::-;;;;;;;;;;-1:-1:-1;9191:244:0;;;;;:::i;:::-;;:::i;27080:1704::-;;;;;;;;;;-1:-1:-1;27080:1704:0;;;;;:::i;:::-;;:::i;29978:1150::-;;;;;;;;;;-1:-1:-1;29978:1150:0;;;;;:::i;:::-;;:::i;:::-;;;;3871:25:1;;;3927:2;3912:18;;3905:34;;;;3955:18;;;3948:34;3859:2;3844:18;29978:1150:0;3669:319:1;17357:841:0;17443:1;17428:12;;:16;17420:25;;;;;;17484:15;;17477:48;;-1:-1:-1;;;17477:48:0;;17519:4;17477:48;;;369:51:1;17452:22:0;;-1:-1:-1;;;;;17484:15:0;;17477:33;;342:18:1;;17477:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17553:15;;17452:73;;-1:-1:-1;17532:37:0;;17542:9;;-1:-1:-1;;;;;17553:15:0;17532:9;:37::i;:::-;17604:15;;17597:48;;-1:-1:-1;;;17597:48:0;;17639:4;17597:48;;;369:51:1;17576:18:0;;17597:68;;17650:14;;-1:-1:-1;;;;;17604:15:0;;17597:33;;342:18:1;;17597:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;:68::i;:::-;17576:89;-1:-1:-1;17676:14:0;;17672:362;;17833:12;;17746:108;;17803:27;17804:10;-1:-1:-1;;;17803:16:0;:27::i;:::-;:42;;;;:::i;:::-;17772:15;;-1:-1:-1;;;;;17772:15:0;17746:42;;;;:25;:42;;;;;;;:46;:108::i;:::-;17727:15;;-1:-1:-1;;;;;17727:15:0;17701:42;;;;:25;:42;;;;;;;;;:153;;;;17868:44;160:25:1;;;17889:10:0;;17868:44;;133:18:1;17868:44:0;;;;;;;17994:15;;-1:-1:-1;;;;;17994:15:0;17968:42;;;;:25;:42;;;;;;:58;;18015:10;17968:46;:58::i;:::-;17949:15;;-1:-1:-1;;;;;17949:15:0;17923:42;;;;:25;:42;;;;;:103;17672:362;18083:12;:19;:23;;18105:1;;18083:23;:::i;:::-;18061:18;;:45;:74;;18113:18;;:22;;18134:1;18113:22;:::i;:::-;18061:74;;;18109:1;18061:74;18040:18;:95;;;;18160:12;18173:18;;18160:32;;;;;;;;:::i;:::-;;;;;;;;;;;18142:15;:50;;-1:-1:-1;;;;;;18142:50:0;-1:-1:-1;;;;;18160:32:0;;;18142:50;;;;;;-1:-1:-1;;17357:841:0:o;20297:217::-;-1:-1:-1;;;;;20467:26:0;;;20396:7;20467:26;;;:18;:26;;;;;;;;:40;;;;;;;;;;;;20419:89;;:43;20486:6;20494:12;20419:22;:43::i;:89::-;20412:96;;20297:217;;;;;:::o;25958:219::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;26032:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;:37;;-1:-1:-1;;26032:37:0::1;26065:4;26032:37;::::0;;26079:23:::1;::::0;26054:7;;26079:11:::1;:23::i;:::-;26110:15;26117:7;26110:6;:15::i;:::-;26140:29;::::0;-1:-1:-1;;;;;26140:29:0;::::1;::::0;::::1;::::0;;;::::1;25958:219:::0;:::o;9035:148::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;9142:1:::1;9126:6:::0;;9105:40:::1;::::0;-1:-1:-1;;;;;9126:6:0;;::::1;::::0;9105:40:::1;::::0;9142:1;;9105:40:::1;9173:1;9156:19:::0;;-1:-1:-1;;;;;;9156:19:0::1;::::0;;9035:148::o;16259:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16259:29:0;;-1:-1:-1;16259:29:0;:::o;28792:511::-;28902:7;28924:6;28945;28966:7;28988;29010;29032;29054;29083:6;27017:15;:27;;26933:119;29083:6;29074:5;:15;29071:121;;-1:-1:-1;29114:42:0;;-1:-1:-1;;;29158:2:0;-1:-1:-1;29158:2:0;;-1:-1:-1;29114:42:0;;-1:-1:-1;29114:42:0;;-1:-1:-1;29114:42:0;;-1:-1:-1;29114:42:0;;-1:-1:-1;29114:42:0;29106:74;;29071:121;29204:15;29222:20;29236:5;29222:13;:20::i;:::-;29204:38;;29262:33;29273:7;29282:12;29262:10;:33::i;:::-;29255:40;;;;;;;;;;;;;;;;;28792:511;;;;;;;;;;;;:::o;18865:145::-;18946:58;18978:10;18991:12;18946:23;:58::i;:::-;;18865:145;:::o;31136:495::-;31227:4;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;31244:14:::1;31269:9:::0;31294::::1;31289:313;31309:12;:19:::0;31305:23;::::1;31289:313;;;31358:49;31382:7;31391:12;31404:1;31391:15;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;31391:15:0::1;31358:23;:49::i;:::-;31349:58:::0;-1:-1:-1;31425:10:0;;31422:169:::1;;-1:-1:-1::0;;;;;31450:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;31476:15:::1;31450:41:::0;;31515:33;;::::1;;::::0;31450:23;31515:33:::1;::::0;::::1;::::0;31530:6;160:25:1;;148:2;133:18;;14:177;31515:33:0::1;;;;;;;;31574:4;31567:11;;31422:169;31330:3:::0;::::1;::::0;::::1;:::i;:::-;;;;31289:313;;;-1:-1:-1::0;31619:4:0;31136:495;-1:-1:-1;;;;31136:495:0:o;26189:207::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26269:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;26261:39;;;::::0;::::1;;-1:-1:-1::0;;;;;26308:30:0;::::1;26341:5;26308:30:::0;;;:21:::1;:30;::::0;;;;;:38;;-1:-1:-1;;26308:38:0::1;::::0;;26361:27;::::1;::::0;26341:5;26361:27:::1;26189:207:::0;:::o;19924:162::-;20013:7;20036:44;20059:6;20067:12;20036:22;:44::i;21335:301::-;-1:-1:-1;;;;;21551:42:0;;;21434:7;21551:42;;;:28;:42;;;;;;;;:50;;;;;;;;;;;;21501:13;:21;;;;;;21457:39;;;:25;:39;;;;;;;21434:7;;-1:-1:-1;;;16179:6:0;21457:161;;:145;;21551:50;21457:81;;:66;;:43;:66::i;:::-;:79;:81::i;:::-;:93;;:145::i;:::-;:159;:161::i;:::-;:173;;;;:::i;29538:428::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29633:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;29674:7;29630:59;29715:31;29701:10;:45;29698:222;;29763:32;29775:7;29784:10;29763:11;:32::i;:::-;29804:24;29808:7;29817:10;29804:3;:24::i;:::-;29698:222;;;29864:23;29876:7;29885:1;29864:11;:23::i;:::-;29896:15;29903:7;29896:6;:15::i;:::-;29929:29;29944:7;29953:4;29929:14;:29::i;:::-;;29538:428:::0;;:::o;26404:408::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;26505:4:::1;26489:12;:20;;:45;;;;;26529:5;26513:12;:21;;26489:45;26481:127;;;::::0;-1:-1:-1;;;26481:127:0;;5634:2:1;26481:127:0::1;::::0;::::1;5616:21:1::0;5673:2;5653:18;;;5646:30;5712:34;5692:18;;;5685:62;5783:34;5763:18;;;5756:62;-1:-1:-1;;;5834:19:1;;;5827:36;5880:19;;26481:127:0::1;5432:473:1::0;26481:127:0::1;26643:9;;26627:12;:25:::0;26619:93:::1;;;::::0;-1:-1:-1;;;26619:93:0;;6112:2:1;26619:93:0::1;::::0;::::1;6094:21:1::0;6151:2;6131:18;;;6124:30;6190:34;6170:18;;;6163:62;6261:25;6241:18;;;6234:53;6304:19;;26619:93:0::1;5910:419:1::0;26619:93:0::1;26759:9;::::0;26728:41:::1;::::0;26745:12;;26728:41:::1;::::0;;;::::1;26780:9;:24:::0;26404:408::o;9191:244::-;8948:6;;-1:-1:-1;;;;;8948:6:0;436:10;8948:22;8940:67;;;;-1:-1:-1;;;8940:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9280:22:0;::::1;9272:73;;;::::0;-1:-1:-1;;;9272:73:0;;6536:2:1;9272:73:0::1;::::0;::::1;6518:21:1::0;6575:2;6555:18;;;6548:30;6614:34;6594:18;;;6587:62;-1:-1:-1;;;6665:18:1;;;6658:36;6711:19;;9272:73:0::1;6334:402:1::0;9272:73:0::1;9382:6;::::0;;9361:38:::1;::::0;-1:-1:-1;;;;;9361:38:0;;::::1;::::0;9382:6;::::1;::::0;9361:38:::1;::::0;::::1;9410:6;:17:::0;;-1:-1:-1;;;;;;9410:17:0::1;-1:-1:-1::0;;;;;9410:17:0;;;::::1;::::0;;;::::1;::::0;;9191:244::o;27080:1704::-;27501:8;27184:15;;;;;;;27530:22;27501:8;27530:13;:22::i;:::-;27522:30;;-1:-1:-1;;27565:29:0;;27619:1;27610:5;:10;27607:582;;27657:18;;27648:5;27640:35;27637:541;;;27740:18;;27723:37;;:5;;:9;:37::i;:::-;27696:64;;27637:541;;;27879:18;;27849:15;:27;27814:32;;-1:-1:-1;27849:220:0;;28068:1;27849:220;;;27989:18;;27957:15;:27;:51;;:31;:51::i;:::-;27814:255;-1:-1:-1;28119:43:0;:5;27814:255;28119:9;:43::i;:::-;28092:70;;27795:383;27637:541;28227:45;28250:7;28259:12;28227:22;:45::i;:::-;28203:69;;28300:45;28323:7;28332:12;28300:22;:45::i;:::-;-1:-1:-1;;;;;28374:23:0;;;;;;:14;:23;;;;;;28283:62;;-1:-1:-1;28374:23:0;-1:-1:-1;28426:17:0;:126;;28551:1;28426:126;;;28501:9;;28483:28;;:13;;:17;:28::i;:::-;28410:142;;28614:15;28598:13;:31;:178;;28775:1;28598:178;;;28685:34;:13;28703:15;28685:17;:34::i;:::-;28565:211;;27080:1704;;;;;;;;;;;:::o;29978:1150::-;30092:15;:27;30026:7;;;;;;30132:25;;;30129:81;;-1:-1:-1;;30182:18:0;;30176:1;;-1:-1:-1;30176:1:0;;-1:-1:-1;30168:33:0;;30129:81;30249:18;;30219:27;;30324:9;30306:27;;30343:18;30373:14;30401:613;30417:3;30407:7;:13;:50;;;;;30437:20;30424:10;:33;30407:50;30401:613;;;30468:21;;;;:::i;:::-;30526:15;:27;30468:21;;-1:-1:-1;30503:50:0;;;-1:-1:-1;30500:98:0;;30587:1;30565:23;;30500:98;30608:15;30626;:20;;30647:19;30626:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30626:41:0;30694:23;;;:14;:23;;;;;;;;30626:41;;-1:-1:-1;30681:37:0;;:12;:37::i;:::-;30678:134;;;30733:38;30756:7;30766:4;30733:14;:38::i;:::-;30730:73;;;30784:8;;;;:::i;:::-;;;;30730:73;30822:12;;;;:::i;:::-;;;;30845:18;30866:9;30845:30;;30899:10;30889:7;:20;30886:91;;;30931:36;30943:23;:7;30955:10;30943:11;:23::i;:::-;30931:7;;:11;:36::i;:::-;30921:46;;30886:91;30995:10;-1:-1:-1;30401:613:0;;-1:-1:-1;30401:613:0;;31023:18;:40;;;31081:10;;-1:-1:-1;31093:6:0;-1:-1:-1;31044:19:0;;-1:-1:-1;;;;29978:1150:0;;;;;;:::o;18224:470::-;18354:16;;;18368:1;18354:16;;;;;;;;18330:21;;18354:16;;;;;;;;;;-1:-1:-1;18354:16:0;18330:40;;18391:15;-1:-1:-1;;;;;18391:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18381:4;18386:1;18381:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;18381:32:0;;;-1:-1:-1;;;;;18381:32:0;;;;;18434:11;18424:4;18429:1;18424:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18424:21:0;;;:7;;;;;;;;;:21;18480:206;;-1:-1:-1;;;18480:206:0;;:15;:66;;;;;;18554:14;;18480:206;;18584:1;;18613:4;;18640;;18660:15;;18480:206;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18297:397;18224:470;;:::o;7158:136::-;7216:7;7243:43;7247:1;7250;7243:43;;;;;;;;;;;;;;;;;:3;:43::i;7502:250::-;7560:7;7584:1;7589;7584:6;7580:47;;-1:-1:-1;7614:1:0;7607:8;;7580:47;7639:9;7651:5;7655:1;7651;:5;:::i;:::-;7639:17;-1:-1:-1;7684:1:0;7675:5;7679:1;7639:17;7675:5;:::i;:::-;:10;7667:56;;;;-1:-1:-1;;;7667:56:0;;8417:2:1;7667:56:0;;;8399:21:1;8456:2;8436:18;;;8429:30;8495:34;8475:18;;;8468:62;-1:-1:-1;;;8546:18:1;;;8539:31;8587:19;;7667:56:0;8215:397:1;6969:181:0;7027:7;;7059:5;7063:1;7059;:5;:::i;:::-;7047:17;;7088:1;7083;:6;;7075:46;;;;-1:-1:-1;;;7075:46:0;;8819:2:1;7075:46:0;;;8801:21:1;8858:2;8838:18;;;8831:30;8897:29;8877:18;;;8870:57;8944:18;;7075:46:0;8617:351:1;22863:545:0;-1:-1:-1;;;;;22962:22:0;;22937;22962;;;:13;:22;;;;;;;22991:35;;;;23036:27;;;23033:370;;;23074:22;23099:30;:10;23114:14;23099;:30::i;:::-;23074:55;;23138:34;23148:7;23157:14;23138:9;:34::i;:::-;23197:14;23181:12;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;23033:370:0;;-1:-1:-1;;23033:370:0;;23241:14;23228:10;:27;23225:178;;;23266:20;23289:30;:14;23308:10;23289:18;:30::i;:::-;23266:53;;23328:30;23336:7;23345:12;23328:7;:30::i;:::-;23383:12;23367;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;22930:478:0;22863:545;;:::o;24683:577::-;-1:-1:-1;;;;;24736:29:0;;;;;;:24;:29;;;;;;;;24731:69;;24683:577;:::o;24731:69::-;-1:-1:-1;;;;;24819:29:0;;;;;;:24;:29;;;;;;;;24812:36;;-1:-1:-1;;24812:36:0;;;24866:22;:27;;;;;24859:34;;;24919:23;:28;;;;;;24819:15;24975:27;24919:28;;24819:29;24975:31;;24812:36;;24975:31;:::i;:::-;24958:48;;25017:15;25035;:20;;25056:9;25035:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;25035:31:0;;;25079:32;;;:23;:32;;;;;;;:40;;;25137:28;;;;;;;25130:35;;;;25079:15;25178:27;;25035:31;;-1:-1:-1;25035:31:0;;25114:5;;25178:27;;;;;;:::i;:::-;;;;;;;;;;:37;;-1:-1:-1;;;;;;25178:37:0;-1:-1:-1;;;;;25178:37:0;;;;;;;;;;25226:15;:26;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;25226:26:0;;;;;-1:-1:-1;;;;;;25226:26:0;;;;;;-1:-1:-1;;;;24683:577:0:o;24047:119::-;24104:7;24131:15;:20;;24152:5;24131:27;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24131:27:0;;24047:119;-1:-1:-1;;24047:119:0:o;19179:532::-;19274:7;19290:29;19322:42;19345:4;19351:12;19322:22;:42::i;:::-;19290:74;-1:-1:-1;19375:25:0;;19371:318;;-1:-1:-1;;;;;19452:24:0;;;;;;;:18;:24;;;;;;;;:38;;;;;;;;;;:65;;19495:21;19452:42;:65::i;:::-;-1:-1:-1;;;;;19411:24:0;;;;;;;:18;:24;;;;;;;;:38;;;;;;;;;;;:106;;;;19531:46;;;;;19555:21;160:25:1;;148:2;133:18;;14:177;19531:46:0;;;;;;;;19586:58;;-1:-1:-1;;;19586:58:0;;-1:-1:-1;;;;;9305:32:1;;;19586:58:0;;;9287:51:1;9354:18;;;9347:34;;;19586:29:0;;;;;9260:18:1;;19586:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;19660:21:0;-1:-1:-1;19653:28:0;;19371:318;-1:-1:-1;19704:1:0;;19179:532;-1:-1:-1;;;19179:532:0:o;10923:134::-;10979:6;11012:1;11029:6;;;;11021:15;;;;;10440:176;10496:6;;10526:5;10530:1;10526;:5;:::i;:::-;10515:16;;10556:1;10551;:6;;:16;;;;;10566:1;10561;:6;;10551:16;10550:38;;;;10577:1;10573;:5;:14;;;;;10586:1;10582;:5;10573:14;10542:47;;;;;10763:127;10819:7;10852:1;10847;:6;;10839:15;;;;;;-1:-1:-1;10880:1:0;10763:127::o;24283:392::-;-1:-1:-1;;;;;24342:29:0;;;;;;:24;:29;;;;;;;;24338:330;;;-1:-1:-1;;;;;24388:27:0;;;;;;;;:22;:27;;;;;:33;18865:145::o;24338:330::-;-1:-1:-1;;;;;24454:29:0;;;;;;:24;:29;;;;;;;;:36;;-1:-1:-1;;24454:36:0;24486:4;24454:36;;;;;;24505:22;:27;;;;;:33;;;24454:15;24584:27;;24553:23;:28;;;;;;:58;;;24626:30;;;;;;;;;;;-1:-1:-1;;;;;;24626:30:0;;;;;;24283:392;;:::o;23836:203::-;-1:-1:-1;;;;;23914:29:0;;23894:3;23914:29;;;:24;:29;;;;;;;;23910:71;;-1:-1:-1;;;23967:2:0;23836:203;-1:-1:-1;23836:203:0:o;23910:71::-;-1:-1:-1;;;;;;24002:28:0;;;;;:23;:28;;;;;;;23836:203::o;10176:176::-;10232:6;;10262:5;10266:1;10262;:5;:::i;:::-;10251:16;;10292:1;10287;:6;;:16;;;;;10302:1;10297;:6;;10287:16;10286:38;;;;10313:1;10309;:5;:14;;;;;10322:1;10318;:5;10278:47;;;;;29311:219;29378:4;29411:15;29395:13;:31;29392:67;;;-1:-1:-1;29445:5:0;;29311:219;-1:-1:-1;29311:219:0:o;29392:67::-;29513:9;;29475:34;:15;29495:13;29475:19;:34::i;:::-;:47;;;29311:219;-1:-1:-1;;29311:219:0:o;7302:192::-;7388:7;7424:12;7416:6;;;;7408:29;;;;-1:-1:-1;;;7408:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7448:9:0;7460:5;7464:1;7460;:5;:::i;:::-;7448:17;7302:192;-1:-1:-1;;;;;7302:192:0:o;21906:335::-;21978:9;21973:263;21993:12;:19;21989:23;;21973:263;;;22086:142;22157:70;22158:53;22205:5;22158:25;:42;22184:12;22197:1;22184:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22184:15:0;22158:42;;;;;;;;;;;;;;:46;:53::i;22157:70::-;22086:28;:45;22115:12;22128:1;22115:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22115:15:0;;;22086:45;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;:70;:142::i;:::-;22029:28;:45;22058:12;22071:1;22058:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22058:15:0;;;22029:45;;;;;;;;;;;;;;;:54;;;;;;;;;;;:199;22014:3;;;;:::i;:::-;;;;21973:263;;22518:339;22590:9;22585:267;22605:12;:19;22601:23;;22585:267;;;22698:144;22770:70;22771:53;22818:5;22771:25;:42;22797:12;22810:1;22797:15;;;;;;;;:::i;22770:70::-;22698:28;:45;22727:12;22740:1;22727:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22727:15:0;;;22698:45;;;;;;;;;;;;;;;:54;;;;;;;;;;;;;:70;:144::i;:::-;22641:28;:45;22670:12;22683:1;22670:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;22670:15:0;;;22641:45;;;;;;;;;;;;;;;:54;;;;;;;;;;;:201;22626:3;;;;:::i;:::-;;;;22585:267;;431:131:1;-1:-1:-1;;;;;506:31:1;;496:42;;486:70;;552:1;549;542:12;486:70;431:131;:::o;567:388::-;635:6;643;696:2;684:9;675:7;671:23;667:32;664:52;;;712:1;709;702:12;664:52;751:9;738:23;770:31;795:5;770:31;:::i;:::-;820:5;-1:-1:-1;877:2:1;862:18;;849:32;890:33;849:32;890:33;:::i;:::-;942:7;932:17;;;567:388;;;;;:::o;960:247::-;1019:6;1072:2;1060:9;1051:7;1047:23;1043:32;1040:52;;;1088:1;1085;1078:12;1040:52;1127:9;1114:23;1146:31;1171:5;1146:31;:::i;1404:180::-;1463:6;1516:2;1504:9;1495:7;1491:23;1487:32;1484:52;;;1532:1;1529;1522:12;1484:52;-1:-1:-1;1555:23:1;;1404:180;-1:-1:-1;1404:180:1:o;1797:315::-;1865:6;1873;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1978:9;1965:23;1955:33;;2038:2;2027:9;2023:18;2010:32;2051:31;2076:5;2051:31;:::i;2823:118::-;2909:5;2902:13;2895:21;2888:5;2885:32;2875:60;;2931:1;2928;2921:12;2946:390;3019:6;3027;3080:2;3068:9;3059:7;3055:23;3051:32;3048:52;;;3096:1;3093;3086:12;3048:52;3135:9;3122:23;3154:31;3179:5;3154:31;:::i;:::-;3204:5;-1:-1:-1;3261:2:1;3246:18;;3233:32;3274:30;3233:32;3274:30;:::i;3341:323::-;3417:6;3425;3478:2;3466:9;3457:7;3453:23;3449:32;3446:52;;;3494:1;3491;3484:12;3446:52;3533:9;3520:23;3552:31;3577:5;3552:31;:::i;:::-;3602:5;3654:2;3639:18;;;;3626:32;;-1:-1:-1;;;3341:323:1:o;3993:184::-;4063:6;4116:2;4104:9;4095:7;4091:23;4087:32;4084:52;;;4132:1;4129;4122:12;4084:52;-1:-1:-1;4155:16:1;;3993:184;-1:-1:-1;3993:184:1:o;4182:127::-;4243:10;4238:3;4234:20;4231:1;4224:31;4274:4;4271:1;4264:15;4298:4;4295:1;4288:15;4314:217;4354:1;4380;4370:132;;4424:10;4419:3;4415:20;4412:1;4405:31;4459:4;4456:1;4449:15;4487:4;4484:1;4477:15;4370:132;-1:-1:-1;4516:9:1;;4314:217::o;4536:125::-;4576:4;4604:1;4601;4598:8;4595:34;;;4609:18;;:::i;:::-;-1:-1:-1;4646:9:1;;4536:125::o;4666:128::-;4706:3;4737:1;4733:6;4730:1;4727:13;4724:39;;;4743:18;;:::i;:::-;-1:-1:-1;4779:9:1;;4666:128::o;4799:127::-;4860:10;4855:3;4851:20;4848:1;4841:31;4891:4;4888:1;4881:15;4915:4;4912:1;4905:15;4931:356;5133:2;5115:21;;;5152:18;;;5145:30;5211:34;5206:2;5191:18;;5184:62;5278:2;5263:18;;4931:356::o;5292:135::-;5331:3;5352:17;;;5349:43;;5372:18;;:::i;:::-;-1:-1:-1;5419:1:1;5408:13;;5292:135::o;6873:251::-;6943:6;6996:2;6984:9;6975:7;6971:23;6967:32;6964:52;;;7012:1;7009;7002:12;6964:52;7044:9;7038:16;7063:31;7088:5;7063:31;:::i;7129:908::-;7363:4;7411:3;7400:9;7396:19;7442:6;7431:9;7424:25;7468:2;7506:3;7501:2;7490:9;7486:18;7479:31;7530:6;7565;7559:13;7596:6;7588;7581:22;7634:3;7623:9;7619:19;7612:26;;7673:2;7665:6;7661:15;7647:29;;7694:1;7704:195;7718:6;7715:1;7712:13;7704:195;;;7783:13;;-1:-1:-1;;;;;7779:39:1;7767:52;;7874:15;;;;7839:12;;;;7815:1;7733:9;7704:195;;;-1:-1:-1;;;;;;;7955:32:1;;;;7950:2;7935:18;;7928:60;-1:-1:-1;;;8019:2:1;8004:18;7997:34;7916:3;7129:908;-1:-1:-1;;7129:908:1:o;8042:168::-;8082:7;8148:1;8144;8140:6;8136:14;8133:1;8130:21;8125:1;8118:9;8111:17;8107:45;8104:71;;;8155:18;;:::i;:::-;-1:-1:-1;8195:9:1;;8042:168::o;8973:127::-;9034:10;9029:3;9025:20;9022:1;9015:31;9065:4;9062:1;9055:15;9089:4;9086:1;9079:15;9392:245;9459:6;9512:2;9500:9;9491:7;9487:23;9483:32;9480:52;;;9528:1;9525;9518:12;9480:52;9560:9;9554:16;9579:28;9601:5;9579:28;:::i;9642:265::-;9681:3;9709:9;;;9734:10;;-1:-1:-1;;;;;9753:27:1;;;9746:35;;9730:52;9727:78;;;9785:18;;:::i;:::-;-1:-1:-1;;;9832:19:1;;;9825:27;;9817:36;;9814:62;;;9856:18;;:::i;:::-;-1:-1:-1;;9892:9:1;;9642:265::o;9912:267::-;9951:4;9980:9;;;10005:10;;-1:-1:-1;;;10024:19:1;;10017:27;;10001:44;9998:70;;;10048:18;;:::i;:::-;-1:-1:-1;;;;;10095:27:1;;10088:35;;10080:44;;10077:70;;;10127:18;;:::i;:::-;-1:-1:-1;;10164:9:1;;9912:267::o;10184:597::-;10296:4;10325:2;10354;10343:9;10336:21;10386:6;10380:13;10429:6;10424:2;10413:9;10409:18;10402:34;10454:1;10464:140;10478:6;10475:1;10472:13;10464:140;;;10573:14;;;10569:23;;10563:30;10539:17;;;10558:2;10535:26;10528:66;10493:10;;10464:140;;;10622:6;10619:1;10616:13;10613:91;;;10692:1;10687:2;10678:6;10667:9;10663:22;10659:31;10652:42;10613:91;-1:-1:-1;10765:2:1;10744:15;-1:-1:-1;;10740:29:1;10725:45;;;;10772:2;10721:54;;10184:597;-1:-1:-1;;;10184:597:1:o
Swarm Source
ipfs://a75d9febecae0c805685c59886a0a365b895ee396bae0d8187670e520af9c253
Loading...
Loading
Loading...
Loading
Net Worth in USD
$76.56
Net Worth in ETH
0.038793
Token Allocations
USDC
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.999958 | 76.5611 | $76.56 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.