Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 248 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 23756658 | 105 days ago | IN | 0 ETH | 0.00000446 | ||||
| Approve | 22784473 | 241 days ago | IN | 0 ETH | 0.00008177 | ||||
| Approve | 22596360 | 267 days ago | IN | 0 ETH | 0.00031395 | ||||
| Approve | 22307969 | 308 days ago | IN | 0 ETH | 0.00021707 | ||||
| Approve | 22118245 | 334 days ago | IN | 0 ETH | 0.00018341 | ||||
| Approve | 22070586 | 341 days ago | IN | 0 ETH | 0.0002194 | ||||
| Approve | 22058921 | 343 days ago | IN | 0 ETH | 0.00011727 | ||||
| Approve | 22019648 | 348 days ago | IN | 0 ETH | 0.00004457 | ||||
| Approve | 21990016 | 352 days ago | IN | 0 ETH | 0.00006186 | ||||
| Approve | 21982803 | 353 days ago | IN | 0 ETH | 0.00026165 | ||||
| Approve | 21962904 | 356 days ago | IN | 0 ETH | 0.00004876 | ||||
| Approve | 21962269 | 356 days ago | IN | 0 ETH | 0.00017894 | ||||
| Approve | 21940171 | 359 days ago | IN | 0 ETH | 0.00029805 | ||||
| Approve | 21939607 | 359 days ago | IN | 0 ETH | 0.00012145 | ||||
| Approve | 21933802 | 360 days ago | IN | 0 ETH | 0.00012447 | ||||
| Approve | 21925182 | 361 days ago | IN | 0 ETH | 0.00007893 | ||||
| Approve | 21925148 | 361 days ago | IN | 0 ETH | 0.00017622 | ||||
| Approve | 21924877 | 361 days ago | IN | 0 ETH | 0.00033175 | ||||
| Approve | 21924784 | 361 days ago | IN | 0 ETH | 0.00009291 | ||||
| Approve | 21922844 | 362 days ago | IN | 0 ETH | 0.00034433 | ||||
| Approve | 21922819 | 362 days ago | IN | 0 ETH | 0.00032494 | ||||
| Approve | 21922809 | 362 days ago | IN | 0 ETH | 0.00053565 | ||||
| Approve | 21922732 | 362 days ago | IN | 0 ETH | 0.00047478 | ||||
| Approve | 21922707 | 362 days ago | IN | 0 ETH | 0.00032152 | ||||
| Approve | 21922701 | 362 days ago | IN | 0 ETH | 0.00072579 |
Latest 2 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 21915366 | 363 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 21915366 | 363 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Hold_4_Gold
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity Standard Json-Input format)
/*
<<<**Hold_4_Gold**>>>
*/
// SPDX-License-Identifier: No License
pragma solidity 0.8.25;
import {IERC20, ERC20} from "./ERC20.sol";
import {ERC20Burnable} from "./ERC20Burnable.sol";
import {Ownable, Ownable2Step} from "./Ownable2Step.sol";
import {DividendTrackerFunctions} from "./TokenDividendTracker.sol";
import {SafeERC20Remastered} from "./SafeERC20Remastered.sol";
import {Initializable} from "./Initializable.sol";
import "./IUniswapV2Factory.sol";
import "./IUniswapV2Pair.sol";
import "./IUniswapV2Router01.sol";
import "./IUniswapV2Router02.sol";
contract Hold_4_Gold is ERC20, ERC20Burnable, Ownable2Step, DividendTrackerFunctions, Initializable {
using SafeERC20Remastered for IERC20;
uint16 public swapThresholdRatio;
uint256 private _rewardsPending;
uint16[3] public rewardsFees;
mapping (address => bool) public isExcludedFromFees;
uint16[3] public totalFees;
bool private _swapping;
IUniswapV2Router02 public routerV2;
address public pairV2;
mapping (address => bool) public AMMs;
error CannotDepositNativeCoins(address account);
error InvalidSwapThresholdRatio(uint16 swapThresholdRatio);
error CannotExceedMaxTotalFee(uint16 buyFee, uint16 sellFee, uint16 transferFee);
error InvalidAMM(address AMM);
event SwapThresholdUpdated(uint16 swapThresholdRatio);
event RewardsFeesUpdated(uint16 buyFee, uint16 sellFee, uint16 transferFee);
event RewardsSent(uint256 amount);
event ExcludeFromFees(address indexed account, bool isExcluded);
event RouterV2Updated(address indexed routerV2);
event AMMUpdated(address indexed AMM, bool isAMM);
constructor()
ERC20(unicode"Hold 4 Gold", unicode"H4G")
Ownable(msg.sender)
{
assembly { if iszero(extcodesize(caller())) { revert(0, 0) } }
address supplyRecipient = 0xA45C53DC953ae7BC25B223eFc4f540764989cC2a;
updateSwapThreshold(50);
_deployDividendTracker(300, 1000 * (10 ** decimals()) / 10);
gasForProcessingSetup(300000);
rewardsFeesSetup(500, 500, 0);
_excludeFromDividends(supplyRecipient, true);
_excludeFromDividends(address(this), true);
_excludeFromDividends(address(dividendTracker), true);
excludeFromFees(supplyRecipient, true);
excludeFromFees(address(this), true);
_mint(supplyRecipient, 10000000000 * (10 ** decimals()) / 10);
_transferOwnership(0xA45C53DC953ae7BC25B223eFc4f540764989cC2a);
}
/*
This token is not upgradeable. Function afterConstructor finishes post-deployment setup.
*/
function afterConstructor(address _rewardToken, address _router) initializer external {
_setRewardToken(_rewardToken);
_updateRouterV2(_router);
}
function decimals() public pure override returns (uint8) {
return 18;
}
function updateSwapThreshold(uint16 _swapThresholdRatio) public onlyOwner {
if (_swapThresholdRatio == 0 || _swapThresholdRatio > 500) revert InvalidSwapThresholdRatio(_swapThresholdRatio);
swapThresholdRatio = _swapThresholdRatio;
emit SwapThresholdUpdated(_swapThresholdRatio);
}
function getSwapThresholdAmount() public view returns (uint256) {
return balanceOf(pairV2) * swapThresholdRatio / 10000;
}
function getAllPending() public view returns (uint256) {
return 0 + _rewardsPending;
}
function _swapTokensForOtherRewardTokens(uint256 tokenAmount) private {
address[] memory path = new address[](3);
path[0] = address(this);
path[1] = routerV2.WETH();
path[2] = rewardToken;
_approve(address(this), address(routerV2), tokenAmount);
routerV2.swapExactTokensForTokensSupportingFeeOnTransferTokens(tokenAmount, 0, path, address(this), block.timestamp);
}
function _sendDividends(uint256 tokenAmount) private {
_swapTokensForOtherRewardTokens(tokenAmount);
uint256 dividends = IERC20(rewardToken).balanceOf(address(this));
if (dividends > 0) {
IERC20(rewardToken).safeIncreaseAllowance(address(dividendTracker), dividends);
try dividendTracker.distributeDividends(dividends) {
emit RewardsSent(dividends);
} catch {}
}
}
function excludeFromDividends(address account, bool isExcluded) external onlyOwner {
_excludeFromDividends(account, isExcluded);
}
function _excludeFromDividends(address account, bool isExcluded) internal override {
dividendTracker.excludeFromDividends(account, balanceOf(account), isExcluded);
}
function rewardsFeesSetup(uint16 _buyFee, uint16 _sellFee, uint16 _transferFee) public onlyOwner {
totalFees[0] = totalFees[0] - rewardsFees[0] + _buyFee;
totalFees[1] = totalFees[1] - rewardsFees[1] + _sellFee;
totalFees[2] = totalFees[2] - rewardsFees[2] + _transferFee;
if (totalFees[0] > 2500 || totalFees[1] > 2500 || totalFees[2] > 2500) revert CannotExceedMaxTotalFee(totalFees[0], totalFees[1], totalFees[2]);
rewardsFees = [_buyFee, _sellFee, _transferFee];
emit RewardsFeesUpdated(_buyFee, _sellFee, _transferFee);
}
function excludeFromFees(address account, bool isExcluded) public onlyOwner {
isExcludedFromFees[account] = isExcluded;
emit ExcludeFromFees(account, isExcluded);
}
function _updateRouterV2(address router) private {
routerV2 = IUniswapV2Router02(router);
pairV2 = IUniswapV2Factory(routerV2.factory()).createPair(address(this), routerV2.WETH());
_setAMM(router, true);
_setAMM(pairV2, true);
emit RouterV2Updated(router);
}
function setAMM(address AMM, bool isAMM) external onlyOwner {
if (AMM == pairV2 || AMM == address(routerV2)) revert InvalidAMM(AMM);
_setAMM(AMM, isAMM);
}
function _setAMM(address AMM, bool isAMM) private {
AMMs[AMM] = isAMM;
if (isAMM) {
_excludeFromDividends(AMM, true);
}
emit AMMUpdated(AMM, isAMM);
}
function _update(address from, address to, uint256 amount)
internal
override
{
_beforeTokenUpdate(from, to, amount);
if (from != address(0) && to != address(0)) {
if (!_swapping && amount > 0 && !isExcludedFromFees[from] && !isExcludedFromFees[to]) {
uint256 fees = 0;
uint8 txType = 3;
if (AMMs[from] && !AMMs[to]) {
if (totalFees[0] > 0) txType = 0;
}
else if (AMMs[to] && !AMMs[from]) {
if (totalFees[1] > 0) txType = 1;
}
else if (!AMMs[from] && !AMMs[to]) {
if (totalFees[2] > 0) txType = 2;
}
if (txType < 3) {
fees = amount * totalFees[txType] / 10000;
amount -= fees;
_rewardsPending += fees * rewardsFees[txType] / totalFees[txType];
}
if (fees > 0) {
super._update(from, address(this), fees);
}
}
bool canSwap = getAllPending() >= getSwapThresholdAmount() && balanceOf(pairV2) > 0;
if (!_swapping && from != pairV2 && from != address(routerV2) && canSwap) {
_swapping = true;
if (_rewardsPending > 0 && getNumberOfDividendTokenHolders() > 0) {
_sendDividends(_rewardsPending);
_rewardsPending = 0;
}
_swapping = false;
}
}
super._update(from, to, amount);
_afterTokenUpdate(from, to, amount);
if (from != address(0)) dividendTracker.setBalance(from, balanceOf(from));
if (to != address(0)) dividendTracker.setBalance(to, balanceOf(to));
if (!_swapping) try dividendTracker.process(gasForProcessing) {} catch {}
}
function _beforeTokenUpdate(address from, address to, uint256 amount)
internal
view
{
}
function _afterTokenUpdate(address from, address to, uint256 amount)
internal
{
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./IERC20Metadata.sol";
import {Context} from "./Context.sol";
import {IERC20Errors} from "./draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)
pragma solidity ^0.8.20;
import {ERC20} from "./ERC20.sol";
import {Context} from "./Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys a `value` amount of tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 value) public virtual {
_burn(_msgSender(), value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, deducting from
* the caller's allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `value`.
*/
function burnFrom(address account, uint256 value) public virtual {
_spendAllowance(account, _msgSender(), value);
_burn(account, value);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.20;
import {Ownable} from "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is specified at deployment time in the constructor for `Ownable`. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
if (pendingOwner() != sender) {
revert OwnableUnauthorizedAccount(sender);
}
_transferOwnership(sender);
}
}// SPDX-License-Identifier: No License
import {IERC20} from "./IERC20.sol";
import {Ownable, Ownable2Step} from "./Ownable2Step.sol";
import {SafeERC20Remastered} from "./SafeERC20Remastered.sol";
pragma solidity ^0.8.19;
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}
library SafeMathInt {
function toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
contract TruncatedERC20 {
mapping(address => uint256) private _balances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
uint256 accountBalance = _balances[account];
if (accountBalance < amount) {
revert ERC20InsufficientBalance(account, accountBalance, amount);
}
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
}
}
/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
interface DividendPayingTokenInterface {
function dividendOf(address _owner) external view returns (uint256);
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(address _owner) external view returns (uint256);
function withdrawnDividendOf(address _owner) external view returns (uint256);
function accumulativeDividendOf(address _owner) external view returns (uint256);
}
/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
/// to token holders as dividends and allows token holders to withdraw their dividends.
/// Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is TruncatedERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
using SafeMathUint for uint256;
using SafeMathInt for int256;
using SafeERC20Remastered for IERC20;
uint256 constant internal magnitude = 2**128;
uint256 internal magnifiedDividendPerShare;
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
address public rewardToken;
error DividendTrackerNoEligibleAddresses();
constructor(string memory _name, string memory _symbol) TruncatedERC20(_name, _symbol) {}
function distributeDividends(uint256 amount) public {
if (totalSupply() == 0) {
revert DividendTrackerNoEligibleAddresses();
}
uint256 balBefore = IERC20(rewardToken).balanceOf(address(this));
IERC20(rewardToken).safeTransferFrom(msg.sender, address(this), amount);
uint256 received = IERC20(rewardToken).balanceOf(address(this)) - balBefore;
if (received > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare + (received * magnitude / totalSupply());
emit DividendsDistributed(msg.sender, received);
totalDividendsDistributed = totalDividendsDistributed + received;
}
}
function _withdrawDividend(address account) internal returns(uint256) {
uint256 withdrawableDividend = withdrawableDividendOf(account);
if (withdrawableDividend > 0) {
withdrawnDividends[account] = withdrawnDividends[account] + withdrawableDividend;
if (IERC20(rewardToken).safeTransfer_noRevert(account, withdrawableDividend)) {
emit DividendWithdrawn(account, withdrawableDividend);
return withdrawableDividend;
} else {
withdrawnDividends[account] = withdrawnDividends[account] - withdrawableDividend;
}
}
return 0;
}
function dividendOf(address account) public view override returns(uint256) {
return withdrawableDividendOf(account);
}
function withdrawableDividendOf(address account) public view override returns(uint256) {
return accumulativeDividendOf(account) - withdrawnDividends[account];
}
function withdrawnDividendOf(address account) public view override returns(uint256) {
return withdrawnDividends[account];
}
function accumulativeDividendOf(address account) public view override returns(uint256) {
return ((magnifiedDividendPerShare * balanceOf(account)).toInt256Safe() + magnifiedDividendCorrections[account]).toUint256Safe() / magnitude;
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] - (magnifiedDividendPerShare * value).toInt256Safe();
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] + (magnifiedDividendPerShare * value).toInt256Safe();
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) _mint(account, newBalance - currentBalance);
else if (newBalance < currentBalance) _burn(account, currentBalance - newBalance);
}
}
library IterableMapping {
// Iterable mapping from address to uint;
struct Map {
address[] keys;
mapping(address => uint) values;
mapping(address => uint) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) public view returns (uint) {
return map.values[key];
}
function getIndexOfKey(Map storage map, address key) public view returns (int) {
if(!map.inserted[key]) {
return -1;
}
return int(map.indexOf[key]);
}
function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
return map.keys[index];
}
function size(Map storage map) public view returns (uint) {
return map.keys.length;
}
function set(Map storage map, address key, uint val) public {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) public {
if (!map.inserted[key]) {
return;
}
delete map.inserted[key];
delete map.values[key];
uint index = map.indexOf[key];
uint lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
contract DividendTracker is Ownable, DividendPayingToken {
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping(address => bool) public isExcludedFromDividends;
mapping(address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public minimumTokenBalanceForDividends;
error RewardTokenAlreadySet();
error AlreadyExcludedFromDividends(address account);
error AlreadyIncludedInDividends(address account);
error InvalidClaimWait(uint256 claimWait);
event ExcludeFromDividends(address indexed account, bool isExcluded);
event ClaimWaitUpdated(uint256 claimWait);
event ProcessedDividendTracker(uint256 iterations, uint256 claims);
constructor(uint256 _claimWait, uint256 _minimumTokenBalance) DividendPayingToken("DividendTracker", "DividendTracker") Ownable(msg.sender) {
claimWaitSetup(_claimWait);
minimumTokenBalanceForDividends = _minimumTokenBalance;
}
function setRewardToken(address _rewardToken) external onlyOwner {
if (rewardToken != address(0)) revert RewardTokenAlreadySet();
rewardToken = _rewardToken;
}
function excludeFromDividends(address account, uint256 balance, bool isExcluded) external onlyOwner {
if (isExcluded) {
if (isExcludedFromDividends[account]) revert AlreadyExcludedFromDividends(account);
isExcludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
} else {
if (!isExcludedFromDividends[account]) revert AlreadyIncludedInDividends(account);
isExcludedFromDividends[account] = false;
setBalance(account, balance);
}
emit ExcludeFromDividends(account, isExcluded);
}
function claimWaitSetup(uint256 newClaimWait) public onlyOwner {
if (newClaimWait < 60 || newClaimWait > 7 days) revert InvalidClaimWait(newClaimWait);
claimWait = newClaimWait;
emit ClaimWaitUpdated(newClaimWait);
}
function getNumberOfTokenHolders() external view returns (uint256) {
return tokenHoldersMap.keys.length;
}
function getAccountData(address _account) public view returns (
address account,
int256 index,
int256 iterationsUntilProcessed,
uint256 withdrawableDividends,
uint256 totalDividends,
uint256 lastClaimTime,
uint256 nextClaimTime,
uint256 secondsUntilAutoClaimAvailable
)
{
account = _account;
index = tokenHoldersMap.getIndexOfKey(account);
iterationsUntilProcessed = -1;
if (index >= 0) {
if (uint256(index) > lastProcessedIndex) {
iterationsUntilProcessed = index - int256(lastProcessedIndex);
} else {
uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length - lastProcessedIndex : 0;
iterationsUntilProcessed = index + int256(processesUntilEndOfArray);
}
}
withdrawableDividends = withdrawableDividendOf(account);
totalDividends = accumulativeDividendOf(account);
lastClaimTime = lastClaimTimes[account];
nextClaimTime = lastClaimTime > 0 ? lastClaimTime + claimWait : 0;
secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime - block.timestamp : 0;
}
function getAccountDataAtIndex(uint256 index) public view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
if (index >= tokenHoldersMap.size()) return (address(0), -1, -1, 0, 0, 0, 0, 0);
address account = tokenHoldersMap.getKeyAtIndex(index);
return getAccountData(account);
}
function claim(address account) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividend(account);
if (amount > 0) {
lastClaimTimes[account] = block.timestamp;
return true;
}
return false;
}
function _canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if (block.timestamp < lastClaimTime) return false;
return block.timestamp - lastClaimTime >= claimWait;
}
function setBalance(address account, uint256 newBalance) public onlyOwner {
if (!isExcludedFromDividends[account]) {
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
} else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
}
}
function process(uint256 gas) external onlyOwner returns(uint256 iterations, uint256 claims) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) return (0, 0);
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
iterations = 0;
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 (claim(account)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) gasUsed = gasUsed + (gasLeft - newGasLeft);
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
emit ProcessedDividendTracker(iterations, claims);
}
}
abstract contract DividendTrackerFunctions is Ownable2Step {
DividendTracker public dividendTracker;
uint256 public gasForProcessing;
address public rewardToken;
error InvalidGasForProcessing(uint256 gasForProcessing);
event DeployedDividendTracker(address indexed dividendTracker);
event GasForProcessingUpdated(uint256 gasForProcessing);
function _deployDividendTracker(uint256 _claimWait, uint256 _minimumTokenBalance) internal {
dividendTracker = new DividendTracker(_claimWait, _minimumTokenBalance);
emit DeployedDividendTracker(address(dividendTracker));
}
function _setRewardToken(address _rewardToken) internal {
dividendTracker.setRewardToken(_rewardToken);
rewardToken = _rewardToken;
}
function gasForProcessingSetup(uint256 newGasForProcessing) public onlyOwner {
if (newGasForProcessing < 200_000 || newGasForProcessing > 500_000) revert InvalidGasForProcessing(newGasForProcessing);
gasForProcessing = newGasForProcessing;
emit GasForProcessingUpdated(newGasForProcessing);
}
function claimWaitSetup(uint256 claimWait) external onlyOwner {
dividendTracker.claimWaitSetup(claimWait);
}
function _excludeFromDividends(address account, bool isExcluded) internal virtual;
function isExcludedFromDividends(address account) public view returns (bool) {
return dividendTracker.isExcludedFromDividends(account);
}
function claim() external returns(bool) {
return dividendTracker.claim(msg.sender);
}
function getClaimWait() external view returns (uint256) {
return dividendTracker.claimWait();
}
function getTotalDividendsDistributed() external view returns (uint256) {
return dividendTracker.totalDividendsDistributed();
}
function withdrawableDividendOf(address account) public view returns (uint256) {
return dividendTracker.withdrawableDividendOf(account);
}
function dividendTokenBalanceOf(address account) public view returns (uint256) {
return dividendTracker.balanceOf(account);
}
function dividendTokenTotalSupply() public view returns (uint256) {
return dividendTracker.totalSupply();
}
function getAccountDividendsInfo(address account) external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
) {
return dividendTracker.getAccountData(account);
}
function getAccountDividendsInfoAtIndex(uint256 index) external view returns (
address,
int256,
int256,
uint256,
uint256,
uint256,
uint256,
uint256
) {
return dividendTracker.getAccountDataAtIndex(index);
}
function getLastProcessedIndex() external view returns (uint256) {
return dividendTracker.lastProcessedIndex();
}
function getNumberOfDividendTokenHolders() public view returns (uint256) {
return dividendTracker.getNumberOfTokenHolders();
}
function process(uint256 gas) external returns(uint256 iterations, uint256 claims) {
return dividendTracker.process(gas);
}
}// SPDX-License-Identifier: MIT
// Remastered from OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {Address} from "./Address.sol";
library SafeERC20Remastered {
using Address for address;
/**
* @dev An operation with an ERC20 token failed.
*/
error SafeERC20FailedOperation(address token);
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer_noRevert(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
forceApprove(token, spender, oldAllowance + value);
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
* to be set to zero before setting it to a non-zero value, such as USDT.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data);
if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
require(_initializing || !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}pragma solidity >=0.6.2;
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);
}pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
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;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)
pragma solidity ^0.8.20;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev The ETH balance of the account is not enough to perform the operation.
*/
error AddressInsufficientBalance(address account);
/**
* @dev There's no code at `target` (it is not a contract).
*/
error AddressEmptyCode(address target);
/**
* @dev A call to an address target failed. The target may have reverted.
*/
error FailedInnerCall();
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
if (address(this).balance < amount) {
revert AddressInsufficientBalance(address(this));
}
(bool success, ) = recipient.call{value: amount}("");
if (!success) {
revert FailedInnerCall();
}
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason or custom error, it is bubbled
* up by this function (like regular Solidity function calls). However, if
* the call reverted with no returned reason, this function reverts with a
* {FailedInnerCall} error.
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
* was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
* unsuccessful call.
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata
) internal view returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
// only check if target is a contract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
if (returndata.length == 0 && target.code.length == 0) {
revert AddressEmptyCode(target);
}
return returndata;
}
}
/**
* @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
* revert reason or with a default {FailedInnerCall} error.
*/
function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (!success) {
_revert(returndata);
} else {
return returndata;
}
}
/**
* @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
*/
function _revert(bytes memory returndata) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert FailedInnerCall();
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {
"TokenDividendTracker.sol": {
"IterableMapping": "0xB24969123B1DC397B5d470E9dd8ba0B7BC28b6Fa"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"CannotDepositNativeCoins","type":"error"},{"inputs":[{"internalType":"uint16","name":"buyFee","type":"uint16"},{"internalType":"uint16","name":"sellFee","type":"uint16"},{"internalType":"uint16","name":"transferFee","type":"uint16"}],"name":"CannotExceedMaxTotalFee","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"AMM","type":"address"}],"name":"InvalidAMM","type":"error"},{"inputs":[{"internalType":"uint256","name":"gasForProcessing","type":"uint256"}],"name":"InvalidGasForProcessing","type":"error"},{"inputs":[{"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"}],"name":"InvalidSwapThresholdRatio","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"AMM","type":"address"},{"indexed":false,"internalType":"bool","name":"isAMM","type":"bool"}],"name":"AMMUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"dividendTracker","type":"address"}],"name":"DeployedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"gasForProcessing","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"buyFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"sellFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"transferFee","type":"uint16"}],"name":"RewardsFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"routerV2","type":"address"}],"name":"RouterV2Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"swapThresholdRatio","type":"uint16"}],"name":"SwapThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"AMMs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"name":"afterConstructor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"claimWaitSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTokenTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGasForProcessing","type":"uint256"}],"name":"gasForProcessingSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","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":"getAllPending","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapThresholdAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"process","outputs":[{"internalType":"uint256","name":"iterations","type":"uint256"},{"internalType":"uint256","name":"claims","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardsFees","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyFee","type":"uint16"},{"internalType":"uint16","name":"_sellFee","type":"uint16"},{"internalType":"uint16","name":"_transferFee","type":"uint16"}],"name":"rewardsFeesSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routerV2","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"AMM","type":"address"},{"internalType":"bool","name":"isAMM","type":"bool"}],"name":"setAMM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThresholdRatio","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalFees","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_swapThresholdRatio","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50336040518060400160405280600b81526020016a121bdb19080d0811dbdb1960aa1b8152506040518060400160405280600381526020016248344760e81b81525081600390816100619190611696565b50600461006e8282611696565b5050506001600160a01b0381166100a057604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6100a9816101b1565b50333b6100b557600080fd5b73a45c53dc953ae7bc25b223efc4f540764989cc2a6100d460326101cd565b61010261012c600a6100e760128261184f565b6100f3906103e861185e565b6100fd9190611875565b610266565b61010e620493e06102e8565b61011c6101f4806000610359565b610127816001610523565b610132306001610523565b600754610149906001600160a01b03166001610523565b6101548160016105bf565b61015f3060016105bf565b61018e81600a61017060128261184f565b61017f906402540be40061185e565b6101899190611875565b610626565b6101ab73a45c53dc953ae7bc25b223efc4f540764989cc2a6101b1565b50611a3a565b600680546001600160a01b03191690556101ca81610660565b50565b6101d56106b2565b61ffff811615806101eb57506101f48161ffff16115b1561020f57604051631958d05f60e01b815261ffff82166004820152602401610097565b6009805461ffff60b01b1916600160b01b61ffff8416908102919091179091556040519081527fcf1366790fe21e66c9df9dcf67218b1e10acd64d3c99ae8a7429a68de91f1720906020015b60405180910390a150565b818160405161027490611546565b9182526020820152604001604051809103906000f08015801561029b573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b039290921691821790556040517f5a9eee832e9ca9f7d2110f2cee781d010262c4c3d74b9f1e4ca1b8e3861a8d0190600090a25050565b6102f06106b2565b62030d4081108061030357506207a12081115b156103245760405163074242a560e31b815260048101829052602401610097565b60088190556040518181527f1662a2324457a200b9556dfe949641639b99480ee6b448aefcfb97ee61ec24179060200161025b565b6103616106b2565b600b54600d54849161037a9161ffff91821691166118ad565b61038491906118cf565b600d805461ffff191661ffff9283161790819055600b5484926103b49262010000928390048216929004166118ad565b6103be91906118cf565b600d805463ffff000019166201000061ffff938416021790819055600b5483926103f792640100000000928390048216929004166118ad565b61040191906118cf565b600d805461ffff9283166401000000000261ffff60201b19821681179092556109c4908316919092161711806104455750600d546109c46201000090910461ffff16115b806104605750600d546109c464010000000090910461ffff16115b156104a657600d5460405163b7b3de6f60e01b815261ffff8083166004830152620100008304811660248301526401000000009092049091166044820152606401610097565b6040805160608101825261ffff808616825284811660208301528316918101919091526104d790600b906003611553565b506040805161ffff8581168252848116602083015283168183015290517f3ec8f17d924721910a043bef5d818361423756fcd3cc52e2c46a1139acbb76929181900360600190a1505050565b6007546001600160a01b031663d1fbb84e83610554816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015283151560448201526064015b600060405180830381600087803b1580156105a357600080fd5b505af11580156105b7573d6000803e3d6000fd5b505050505050565b6105c76106b2565b6001600160a01b0382166000818152600c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166106505760405163ec442f0560e01b815260006004820152602401610097565b61065c600083836106e1565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b031633146106df5760405163118cdaa760e01b8152336004820152602401610097565b565b6001600160a01b0383161580159061070157506001600160a01b03821615155b15610a6557600e5460ff161580156107195750600081115b801561073e57506001600160a01b0383166000908152600c602052604090205460ff16155b801561076357506001600160a01b0382166000908152600c602052604090205460ff16155b15610993576001600160a01b03831660009081526010602052604081205460039060ff1680156107ac57506001600160a01b03841660009081526010602052604090205460ff16155b156107c657600d5461ffff16156107c1575060005b610885565b6001600160a01b03841660009081526010602052604090205460ff16801561080757506001600160a01b03851660009081526010602052604090205460ff16155b1561082657600d5462010000900461ffff16156107c157506001610885565b6001600160a01b03851660009081526010602052604090205460ff1615801561086857506001600160a01b03841660009081526010602052604090205460ff16155b1561088557600d54640100000000900461ffff1615610885575060025b60038160ff16101561097f57612710600d8260ff16600381106108aa576108aa611897565b601091828204019190066002029054906101000a900461ffff1661ffff16846108d3919061185e565b6108dd9190611875565b91506108e982846118ea565b9250600d8160ff166003811061090157610901611897565b601091828204019190066002029054906101000a900461ffff1661ffff16600b8260ff166003811061093557610935611897565b601091828204019190066002029054906101000a900461ffff1661ffff168361095e919061185e565b6109689190611875565b600a600082825461097991906118fd565b90915550505b811561099057610990853084610c37565b50505b600061099d610d61565b6109a5610da9565b101580156109cb5750600f546001600160a01b0316600090815260208190526040812054115b600e5490915060ff161580156109ef5750600f546001600160a01b03858116911614155b8015610a0e5750600e546001600160a01b038581166101009092041614155b8015610a175750805b15610a6357600e805460ff19166001179055600a5415801590610a4157506000610a3f610dba565b115b15610a5857600a54610a5290610e28565b6000600a555b600e805460ff191690555b505b610a70838383610c37565b6001600160a01b03831615610b0f576007546001600160a01b031663e30443bc84610ab0816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b505050505b6001600160a01b03821615610bae576007546001600160a01b031663e30443bc83610b4f816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050505b600e5460ff16610c32576007546008546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991610bf09160040190815260200190565b60408051808303816000875af1925050508015610c2a575060408051601f3d908101601f19168201909252610c2791810190611910565b60015b15610c325750505b505050565b6001600160a01b038316610c62578060026000828254610c5791906118fd565b90915550610cd49050565b6001600160a01b03831660009081526020819052604090205481811015610cb55760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610097565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610cf057600280548290039055610d0f565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d5491815260200190565b60405180910390a3505050565b600954600f546001600160a01b0316600090815260208190526040812054909161271091610d9a91600160b01b900461ffff169061185e565b610da49190611875565b905090565b6000600a546000610da491906118fd565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da49190611934565b610e3181610f56565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610e7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190611934565b9050801561065c57600754600954610ec3916001600160a01b039182169116836110d0565b600754604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b158015610f0957600080fd5b505af1925050508015610f1a575060015b1561065c576040518181527f1e8f03f716bc104bf7d728131967a0c771e85ab54d09c1e2d6ed9e0bc4e2a16c9060200160405180910390a15050565b60408051600380825260808201909252600091602082016060803683370190505090503081600081518110610f8d57610f8d611897565b60200260200101906001600160a01b031690816001600160a01b031681525050600e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611024919061194d565b8160018151811061103757611037611897565b6001600160a01b03928316602091820292909201015260095482519116908290600290811061106857611068611897565b6001600160a01b039283166020918202929092010152600e5461109391309161010090041684611160565b600e54604051635c11d79560e01b81526101009091046001600160a01b031690635c11d79590610589908590600090869030904290600401611976565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611120573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111449190611934565b905061115a848461115585856118fd565b61116d565b50505050565b610c32838383600161122c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526111c5908590839061130116565b61115a57604080516001600160a01b038516602482015260006044808301919091528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526112229186916113ab16565b61115a84826113ab565b6001600160a01b0384166112565760405163e602df0560e01b815260006004820152602401610097565b6001600160a01b03831661128057604051634a1406b160e11b815260006004820152602401610097565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561115a57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516112f391815260200190565b60405180910390a350505050565b6000806000846001600160a01b03168460405161131e91906119e9565b6000604051808303816000865af19150503d806000811461135b576040519150601f19603f3d011682016040523d82523d6000602084013e611360565b606091505b509150915081801561138a57508051158061138a57508080602001905181019061138a9190611a18565b80156113a057506000856001600160a01b03163b115b925050505b92915050565b60006113c06001600160a01b0384168361140e565b905080516000141580156113e55750808060200190518101906113e39190611a18565b155b15610c3257604051635274afe760e01b81526001600160a01b0384166004820152602401610097565b606061141c83836000611423565b9392505050565b6060814710156114485760405163cd78605960e01b8152306004820152602401610097565b600080856001600160a01b0316848660405161146491906119e9565b60006040518083038185875af1925050503d80600081146114a1576040519150601f19603f3d011682016040523d82523d6000602084013e6114a6565b606091505b5090925090506114b78683836114c1565b9695505050505050565b6060826114d6576114d18261151d565b61141c565b81511580156114ed57506001600160a01b0384163b155b1561151657604051639996b31560e01b81526001600160a01b0385166004820152602401610097565b508061141c565b80511561152d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b611d1a806144c783390190565b6001830191839082156115d95791602002820160005b838211156115a957835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302611569565b80156115d75782816101000a81549061ffff02191690556002016020816001010492830192600103026115a9565b505b506115e59291506115e9565b5090565b5b808211156115e557600081556001016115ea565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061162857607f821691505b60208210810361164857634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610c32576000816000526020600020601f850160051c810160208610156116775750805b601f850160051c820191505b818110156105b757828155600101611683565b81516001600160401b038111156116af576116af6115fe565b6116c3816116bd8454611614565b8461164e565b602080601f8311600181146116f857600084156116e05750858301515b600019600386901b1c1916600185901b1785556105b7565b600085815260208120601f198616915b8281101561172757888601518255948401946001909101908401611708565b50858210156117455787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156117a657816000190482111561178c5761178c611755565b8085161561179957918102915b93841c9390800290611770565b509250929050565b6000826117bd575060016113a5565b816117ca575060006113a5565b81600181146117e057600281146117ea57611806565b60019150506113a5565b60ff8411156117fb576117fb611755565b50506001821b6113a5565b5060208310610133831016604e8410600b8410161715611829575081810a6113a5565b611833838361176b565b806000190482111561184757611847611755565b029392505050565b600061141c60ff8416836117ae565b80820281158282048414176113a5576113a5611755565b60008261189257634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b61ffff8281168282160390808211156118c8576118c8611755565b5092915050565b61ffff8181168382160190808211156118c8576118c8611755565b818103818111156113a5576113a5611755565b808201808211156113a5576113a5611755565b6000806040838503121561192357600080fd5b505080516020909101519092909150565b60006020828403121561194657600080fd5b5051919050565b60006020828403121561195f57600080fd5b81516001600160a01b038116811461141c57600080fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b818110156119c85784516001600160a01b0316835293830193918301916001016119a3565b50506001600160a01b03969096166060850152505050608001529392505050565b6000825160005b81811015611a0a57602081860181015185830152016119f0565b506000920191825250919050565b600060208284031215611a2a57600080fd5b8151801515811461141c57600080fd5b612a7e80611a496000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063ad56c13c116100ce578063e7841ec011610087578063e7841ec01461063d578063f112ba7214610645578063f27fd2541461064d578063f2fde38b14610660578063f7c618c114610673578063ffb2c4791461068657600080fd5b8063ad56c13c1461056d578063c0246668146105c5578063c705c569146105d8578063d9477526146105eb578063dd62ed3e146105f3578063e30c39781461062c57600080fd5b80639c1b8af5116101205780639c1b8af514610510578063a26579ad14610519578063a6ddc42514610521578063a8b9d24014610534578063a9059cbb14610547578063a9d3cd8a1461055a57600080fd5b806379ba5097146104b657806379cc6790146104be5780638062651a146104d15780638da5cb5b146104e45780638fffabed146104f557806395d89b411461050857600080fd5b8063408ccbdf1161020b578063502f7446116101c4578063502f74461461043f57806364b0f653146104575780636843cd841461045f5780636cc9c8f11461047257806370a0823114610485578063715018a6146104ae57600080fd5b8063408ccbdf146103b357806342966c68146103d9578063484db9af146103ec5780634e71d92d146103ff5780634f011b83146104075780634fbee1931461041c57600080fd5b806323b872dd1161025d57806323b872dd14610343578063294aad9c146103565780632c1f52161461035e5780632f267e291461038957806330bb4cff1461039c578063313ce567146103a457600080fd5b80630483f7a0146102a557806306fdde03146102ba578063095ea7b3146102d857806318160ddd146102fb5780631a0e718c1461030d5780631e9fe6c614610320575b600080fd5b6102b86102b3366004612600565b6106ae565b005b6102c26106c4565b6040516102cf919061265d565b60405180910390f35b6102eb6102e6366004612690565b610756565b60405190151581526020016102cf565b6002545b6040519081526020016102cf565b6102b861031b3660046126d3565b610770565b6102eb61032e3660046126ee565b60106020526000908152604090205460ff1681565b6102eb61035136600461270b565b61080e565b6102ff610834565b600754610371906001600160a01b031681565b6040516001600160a01b0390911681526020016102cf565b6102b861039736600461274c565b6108a7565b6102ff610918565b604051601281526020016102cf565b6103c66103c136600461274c565b610962565b60405161ffff90911681526020016102cf565b6102b86103e736600461274c565b610990565b6102b86103fa366004612765565b61099d565b6102eb610a77565b6009546103c690600160b01b900461ffff1681565b6102eb61042a3660046126ee565b600c6020526000908152604090205460ff1681565b600e546103719061010090046001600160a01b031681565b6102ff610ae6565b6102ff61046d3660046126ee565b610b30565b6102b861048036600461274c565b610ba0565b6102ff6104933660046126ee565b6001600160a01b031660009081526020819052604090205490565b6102b8610c09565b6102b8610c1d565b6102b86104cc366004612690565b610c5e565b6102b86104df366004612793565b610c73565b6005546001600160a01b0316610371565b600f54610371906001600160a01b031681565b6102c2610e3e565b6102ff60085481565b6102ff610e4d565b6103c661052f36600461274c565b610e97565b6102ff6105423660046126ee565b610ea7565b6102eb610555366004612690565b610eda565b6102b8610568366004612600565b610ee8565b61058061057b3660046126ee565b610f51565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102cf565b6102b86105d3366004612600565b610fec565b6102eb6105e63660046126ee565b611054565b6102ff6110c3565b6102ff610601366004612765565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6006546001600160a01b0316610371565b6102ff611106565b6102ff611150565b61058061065b36600461274c565b611161565b6102b861066e3660046126ee565b6111a3565b600954610371906001600160a01b031681565b61069961069436600461274c565b611214565b604080519283526020830191909152016102cf565b6106b6611293565b6106c082826112c0565b5050565b6060600380546106d3906127d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106ff906127d6565b801561074c5780601f106107215761010080835404028352916020019161074c565b820191906000526020600020905b81548152906001019060200180831161072f57829003601f168201915b5050505050905090565b60003361076481858561135c565b60019150505b92915050565b610778611293565b61ffff8116158061078e57506101f48161ffff16115b156107b757604051631958d05f60e01b815261ffff821660048201526024015b60405180910390fd5b6009805461ffff60b01b1916600160b01b61ffff8416908102919091179091556040519081527fcf1366790fe21e66c9df9dcf67218b1e10acd64d3c99ae8a7429a68de91f1720906020015b60405180910390a150565b60003361081c858285611369565b6108278585856113e7565b60019150505b9392505050565b600754604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190612810565b905090565b6108af611293565b62030d408110806108c257506207a12081115b156108e35760405163074242a560e31b8152600481018290526024016107ae565b60088190556040518181527f1662a2324457a200b9556dfe949641639b99480ee6b448aefcfb97ee61ec241790602001610803565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b600d816003811061097257600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b61099a3382611446565b50565b600954600160a81b900460ff16806109bf5750600954600160a01b900460ff16155b610a225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107ae565b600954600160a81b900460ff16158015610a4c576009805461ffff60a01b191661010160a01b1790555b610a558361147c565b610a5e826114fe565b8015610a72576009805460ff60a81b191690555b505050565b600754604051630f41a04d60e11b81523360048201526000916001600160a01b031690631e83409a906024016020604051808303816000875af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190612829565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612810565b610ba8611293565b600754604051636cc9c8f160e01b8152600481018390526001600160a01b0390911690636cc9c8f190602401600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b5050505050565b610c11611293565b610c1b600061170c565b565b60065433906001600160a01b03168114610c555760405163118cdaa760e01b81526001600160a01b03821660048201526024016107ae565b61099a8161170c565b610c69823383611369565b6106c08282611446565b610c7b611293565b600b54600d548491610c949161ffff9182169116612872565b610c9e9190612894565b600d805461ffff191661ffff9283161790819055600b548492610cce926201000092839004821692900416612872565b610cd89190612894565b600d805463ffff000019166201000061ffff938416021790819055600b548392610d119264010000000092839004821692900416612872565b610d1b9190612894565b600d805461ffff9283166401000000000265ffff0000000019821681179092556109c490831691909216171180610d605750600d546109c46201000090910461ffff16115b80610d7b5750600d546109c464010000000090910461ffff16115b15610dc157600d5460405163b7b3de6f60e01b815261ffff80831660048301526201000083048116602483015264010000000090920490911660448201526064016107ae565b6040805160608101825261ffff80861682528481166020830152831691810191909152610df290600b906003612532565b506040805161ffff8581168252848116602083015283168183015290517f3ec8f17d924721910a043bef5d818361423756fcd3cc52e2c46a1139acbb76929181900360600190a1505050565b6060600480546106d3906127d6565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b600b816003811061097257600080fd5b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610b5f565b6000336107648185856113e7565b610ef0611293565b600f546001600160a01b0383811691161480610f1e5750600e546001600160a01b0383811661010090920416145b15610f475760405163435eaf7b60e11b81526001600160a01b03831660048201526024016107ae565b6106c08282611725565b600754604051632ebc328760e11b81526001600160a01b0383811660048301526000928392839283928392839283928392911690635d78650e906024015b61010060405180830381865afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd191906128af565b97509750975097509750975097509750919395975091939597565b610ff4611293565b6001600160a01b0382166000818152600c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b60075460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612829565b600954600f546001600160a01b03166000908152602081905260408120549091612710916110fc91600160b01b900461ffff1690612919565b6108a29190612930565b60075460408051633009a60960e01b815290516000926001600160a01b031691633009a6099160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b6000600a5460006108a29190612952565b600754604051632f7541e960e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690632f7541e990602401610f8f565b6111ab611293565b600680546001600160a01b0383166001600160a01b031990911681179091556111dc6005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6007546040516001624d3b8760e01b031981526004810183905260009182916001600160a01b039091169063ffb2c4799060240160408051808303816000875af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190612965565b91509150915091565b6005546001600160a01b03163314610c1b5760405163118cdaa760e01b81523360048201526024016107ae565b6007546001600160a01b031663d1fbb84e836112f1816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015283151560448201526064015b600060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b505050505050565b610a72838383600161179a565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146113e157818110156113d257604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016107ae565b6113e18484848403600061179a565b50505050565b6001600160a01b03831661141157604051634b637e8f60e11b8152600060048201526024016107ae565b6001600160a01b03821661143b5760405163ec442f0560e01b8152600060048201526024016107ae565b610a7283838361186f565b6001600160a01b03821661147057604051634b637e8f60e11b8152600060048201526024016107ae565b6106c08260008361186f565b600754604051638aee812760e01b81526001600160a01b03838116600483015290911690638aee812790602401600060405180830381600087803b1580156114c357600080fd5b505af11580156114d7573d6000803e3d6000fd5b5050600980546001600160a01b0319166001600160a01b0394909416939093179092555050565b80600e60016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600e60019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612989565b6001600160a01b031663c9c6539630600e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190612989565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190612989565b600f80546001600160a01b0319166001600160a01b03929092169190911790556116be816001611725565b600f546116d5906001600160a01b03166001611725565b6040516001600160a01b038216907fbc052db65df144ad4f71f02da93cae3d4401104c30ac374d7cc10d87ee07b60290600090a250565b600680546001600160a01b031916905561099a81611dc3565b6001600160a01b0382166000908152601060205260409020805460ff1916821580159190911790915561175d5761175d8260016112c0565b816001600160a01b03167f2cc8631dda80fe178488d3174721fafacf84b0f194a7eddae85c9bcc599ac78b82604051611048911515815260200190565b6001600160a01b0384166117c45760405163e602df0560e01b8152600060048201526024016107ae565b6001600160a01b0383166117ee57604051634a1406b160e11b8152600060048201526024016107ae565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156113e157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161186191815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061188f57506001600160a01b03821615155b15611bf257600e5460ff161580156118a75750600081115b80156118cc57506001600160a01b0383166000908152600c602052604090205460ff16155b80156118f157506001600160a01b0382166000908152600c602052604090205460ff16155b15611b21576001600160a01b03831660009081526010602052604081205460039060ff16801561193a57506001600160a01b03841660009081526010602052604090205460ff16155b1561195457600d5461ffff161561194f575060005b611a13565b6001600160a01b03841660009081526010602052604090205460ff16801561199557506001600160a01b03851660009081526010602052604090205460ff16155b156119b457600d5462010000900461ffff161561194f57506001611a13565b6001600160a01b03851660009081526010602052604090205460ff161580156119f657506001600160a01b03841660009081526010602052604090205460ff16155b15611a1357600d54640100000000900461ffff1615611a13575060025b60038160ff161015611b0d57612710600d8260ff1660038110611a3857611a38612846565b601091828204019190066002029054906101000a900461ffff1661ffff1684611a619190612919565b611a6b9190612930565b9150611a7782846129a6565b9250600d8160ff1660038110611a8f57611a8f612846565b601091828204019190066002029054906101000a900461ffff1661ffff16600b8260ff1660038110611ac357611ac3612846565b601091828204019190066002029054906101000a900461ffff1661ffff1683611aec9190612919565b611af69190612930565b600a6000828254611b079190612952565b90915550505b8115611b1e57611b1e853084611e15565b50505b6000611b2b6110c3565b611b33611150565b10158015611b595750600f546001600160a01b0316600090815260208190526040812054115b600e5490915060ff16158015611b7d5750600f546001600160a01b03858116911614155b8015611b9c5750600e546001600160a01b038581166101009092041614155b8015611ba55750805b15611bf057600e805460ff19166001179055600a5415801590611bcf57506000611bcd610ae6565b115b15611be557611bdf600a54611f3f565b6000600a555b600e805460ff191690555b505b611bfd838383611e15565b6001600160a01b03831615611c9c576007546001600160a01b031663e30443bc84611c3d816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611c8357600080fd5b505af1158015611c97573d6000803e3d6000fd5b505050505b6001600160a01b03821615611d3b576007546001600160a01b031663e30443bc83611cdc816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b505050505b600e5460ff16610a72576007546008546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611d7d9160040190815260200190565b60408051808303816000875af1925050508015611db7575060408051601f3d908101601f19168201909252611db491810190612965565b60015b15610a72575050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611e40578060026000828254611e359190612952565b90915550611eb29050565b6001600160a01b03831660009081526020819052604090205481811015611e935760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016107ae565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611ece57600280548290039055611eed565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f3291815260200190565b60405180910390a3505050565b611f488161206d565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb59190612810565b905080156106c057600754600954611fda916001600160a01b039182169116836121e7565b600754604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561202057600080fd5b505af1925050508015612031575060015b156106c0576040518181527f1e8f03f716bc104bf7d728131967a0c771e85ab54d09c1e2d6ed9e0bc4e2a16c9060200160405180910390a15050565b604080516003808252608082019092526000916020820160608036833701905050905030816000815181106120a4576120a4612846565b60200260200101906001600160a01b031690816001600160a01b031681525050600e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190612989565b8160018151811061214e5761214e612846565b6001600160a01b03928316602091820292909201015260095482519116908290600290811061217f5761217f612846565b6001600160a01b039283166020918202929092010152600e546121aa9130916101009004168461135c565b600e54604051635c11d79560e01b81526101009091046001600160a01b031690635c11d795906113269085906000908690309042906004016129b9565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b9190612810565b90506113e1848461226c8585612952565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526122bd8482612320565b6113e157604080516001600160a01b038516602482015260006044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526123169085906123c8565b6113e184826123c8565b6000806000846001600160a01b03168460405161233d9190612a2c565b6000604051808303816000865af19150503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b50915091508180156123a95750805115806123a95750808060200190518101906123a99190612829565b80156123bf57506000856001600160a01b03163b115b95945050505050565b60006123dd6001600160a01b0384168361242b565b905080516000141580156124025750808060200190518101906124009190612829565b155b15610a7257604051635274afe760e01b81526001600160a01b03841660048201526024016107ae565b606061082d8383600084600080856001600160a01b031684866040516124519190612a2c565b60006040518083038185875af1925050503d806000811461248e576040519150601f19603f3d011682016040523d82523d6000602084013e612493565b606091505b50915091506124a38683836124ad565b9695505050505050565b6060826124c2576124bd82612509565b61082d565b81511580156124d957506001600160a01b0384163b155b1561250257604051639996b31560e01b81526001600160a01b03851660048201526024016107ae565b508061082d565b8051156125195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001830191839082156125b85791602002820160005b8382111561258857835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302612548565b80156125b65782816101000a81549061ffff0219169055600201602081600101049283019260010302612588565b505b506125c49291506125c8565b5090565b5b808211156125c457600081556001016125c9565b6001600160a01b038116811461099a57600080fd5b801515811461099a57600080fd5b6000806040838503121561261357600080fd5b823561261e816125dd565b9150602083013561262e816125f2565b809150509250929050565b60005b8381101561265457818101518382015260200161263c565b50506000910152565b602081526000825180602084015261267c816040850160208701612639565b601f01601f19169190910160400192915050565b600080604083850312156126a357600080fd5b82356126ae816125dd565b946020939093013593505050565b803561ffff811681146126ce57600080fd5b919050565b6000602082840312156126e557600080fd5b61082d826126bc565b60006020828403121561270057600080fd5b813561082d816125dd565b60008060006060848603121561272057600080fd5b833561272b816125dd565b9250602084013561273b816125dd565b929592945050506040919091013590565b60006020828403121561275e57600080fd5b5035919050565b6000806040838503121561277857600080fd5b8235612783816125dd565b9150602083013561262e816125dd565b6000806000606084860312156127a857600080fd5b6127b1846126bc565b92506127bf602085016126bc565b91506127cd604085016126bc565b90509250925092565b600181811c908216806127ea57607f821691505b60208210810361280a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561282257600080fd5b5051919050565b60006020828403121561283b57600080fd5b815161082d816125f2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b61ffff82811682821603908082111561288d5761288d61285c565b5092915050565b61ffff81811683821601908082111561288d5761288d61285c565b600080600080600080600080610100898b0312156128cc57600080fd5b88516128d7816125dd565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b808202811582820484141761076a5761076a61285c565b60008261294d57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561076a5761076a61285c565b6000806040838503121561297857600080fd5b505080516020909101519092909150565b60006020828403121561299b57600080fd5b815161082d816125dd565b8181038181111561076a5761076a61285c565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612a0b5784516001600160a01b0316835293830193918301916001016129e6565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251612a3e818460208701612639565b919091019291505056fea26469706673582212207100baa53452dd239576a9e2221ac12cae7b75aa87154b81e820f00781a6b1b364736f6c63430008190033608060405234801561001057600080fd5b50604051611d1a380380611d1a83398101604081905261002f916101c5565b604080518082018252600f8082526e2234bb34b232b7322a3930b1b5b2b960891b6020808401829052845180860190955291845290830152908181338061009157604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b61009a816100d1565b5060036100a7838261028a565b5060046100b4828261028a565b50505050506100c88261012160201b60201c565b60125550610349565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610129610196565b603c81108061013a575062093a8081115b1561015b57604051639a60673160e01b815260048101829052602401610088565b60118190556040518181527f4b0a6b82d0dc4407b3359033a4f27efd1e2105e4571b72d6a3b8f1da3e6079dd9060200160405180910390a150565b6000546001600160a01b031633146101c35760405163118cdaa760e01b8152336004820152602401610088565b565b600080604083850312156101d857600080fd5b505080516020909101519092909150565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061021357607f821691505b60208210810361023357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610285576000816000526020600020601f850160051c810160208610156102625750805b601f850160051c820191505b818110156102815782815560010161026e565b5050505b505050565b81516001600160401b038111156102a3576102a36101e9565b6102b7816102b184546101ff565b84610239565b602080601f8311600181146102ec57600084156102d45750858301515b600019600386901b1c1916600185901b178555610281565b600085815260208120601f198616915b8281101561031b578886015182559484019460019091019084016102fc565b50858210156103395787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6119c2806103586000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063aafd847a116100a2578063e30443bc11610071578063e30443bc1461041e578063f2fde38b14610431578063f7c618c114610444578063ffb2c4791461045757600080fd5b8063aafd847a146103b6578063be10b614146103df578063c705c569146103e8578063d1fbb84e1461040b57600080fd5b80638da5cb5b116100de5780638da5cb5b1461036357806391b89fba1461038857806395d89b411461039b578063a8b9d240146103a357600080fd5b8063715018a61461033f57806385a6b3ae146103475780638aee81271461035057600080fd5b80633009a609116101715780635d78650e1161014b5780635d78650e146102e75780636cc9c8f1146102fa5780636f2789ec1461030d57806370a082311461031657600080fd5b80633009a609146102ba578063313ce567146102c35780633243c791146102d257600080fd5b80631e83409a116101ad5780631e83409a1461020c578063226cfa3d1461022f57806327ce01471461024f5780632f7541e91461026257600080fd5b806306fdde03146101d457806309bbedde146101f257806318160ddd14610204575b600080fd5b6101dc61047f565b6040516101e991906116f6565b60405180910390f35b600a545b6040519081526020016101e9565b6002546101f6565b61021f61021a36600461173e565b610511565b60405190151581526020016101e9565b6101f661023d36600461173e565b60106020526000908152604090205481565b6101f661025d36600461173e565b610558565b61027561027036600461175b565b6105bb565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016101e9565b6101f6600e5481565b604051601281526020016101e9565b6102e56102e036600461175b565b61070f565b005b6102756102f536600461173e565b6108b4565b6102e561030836600461175b565b610a1c565b6101f660115481565b6101f661032436600461173e565b6001600160a01b031660009081526001602052604090205490565b6102e5610a96565b6101f660085481565b6102e561035e36600461173e565b610aaa565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101e9565b6101f661039636600461173e565b610afe565b6101dc610b09565b6101f66103b136600461173e565b610b18565b6101f66103c436600461173e565b6001600160a01b031660009081526007602052604090205490565b6101f660125481565b61021f6103f636600461173e565b600f6020526000908152604090205460ff1681565b6102e5610419366004611782565b610b44565b6102e561042c3660046117c4565b610cf4565b6102e561043f36600461173e565b610e15565b600954610370906001600160a01b031681565b61046a61046536600461175b565b610e53565b604080519283526020830191909152016101e9565b60606003805461048e906117f0565b80601f01602080910402602001604051908101604052809291908181526020018280546104ba906117f0565b80156105075780601f106104dc57610100808354040283529160200191610507565b820191906000526020600020905b8154815290600101906020018083116104ea57829003601f168201915b5050505050905090565b600061051b610fa3565b600061052683610fd0565b9050801561054f5750506001600160a01b03166000908152601060205260409020429055600190565b50600092915050565b6001600160a01b0381166000908152600660209081526040808320546001909252822054600160801b916105ab9161059c906005546105979190611840565b6110c8565b6105a69190611857565b6110d8565b6105b5919061187f565b92915050565b600080600080600080600080600a73b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa63deb3d89690916040518263ffffffff1660e01b815260040161060391815260200190565b602060405180830381865af4158015610620573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064491906118a1565b8910610669575060009650600019955085945086935083925082915081905080610704565b6040516368d54f3f60e11b8152600a6004820152602481018a905260009073b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa9063d1aa9e7e90604401602060405180830381865af41580156106c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e791906118ba565b90506106f2816108b4565b98509850985098509850985098509850505b919395975091939597565b6002546000036107325760405163021415c960e31b815260040160405180910390fd5b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561077b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079f91906118a1565b6009549091506107ba906001600160a01b03163330856110eb565b6009546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610807573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061082b91906118a1565b61083591906118d7565b905080156108af5760025461084e600160801b83611840565b610858919061187f565b60055461086591906118ea565b60055560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2806008546108ab91906118ea565b6008555b505050565b6040516317e142d160e01b8152600a60048201526001600160a01b0382166024820152819060009081908190819081908190819073b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa906317e142d190604401602060405180830381865af4158015610924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094891906118a1565b96506000199550600087126109aa57600e5487111561097557600e5461096e90886118fd565b95506109aa565b600e54600a546000911061098a57600061099a565b600e54600a5461099a91906118d7565b90506109a68189611857565b9650505b6109b388610b18565b94506109be88610558565b6001600160a01b0389166000908152601060205260409020549094509250826109e85760006109f5565b6011546109f590846118ea565b9150428211610a05576000610a0f565b610a0f42836118d7565b9050919395975091939597565b610a24610fa3565b603c811080610a35575062093a8081115b15610a5b57604051639a60673160e01b8152600481018290526024015b60405180910390fd5b60118190556040518181527f4b0a6b82d0dc4407b3359033a4f27efd1e2105e4571b72d6a3b8f1da3e6079dd9060200160405180910390a150565b610a9e610fa3565b610aa8600061114b565b565b610ab2610fa3565b6009546001600160a01b031615610adc5760405163b6de9a7160e01b815260040160405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60006105b582610b18565b60606004805461048e906117f0565b6001600160a01b038116600090815260076020526040812054610b3a83610558565b6105b591906118d7565b610b4c610fa3565b8015610c3c576001600160a01b0383166000908152600f602052604090205460ff1615610b97576040516379d3e28d60e11b81526001600160a01b0384166004820152602401610a52565b6001600160a01b0383166000908152600f60205260408120805460ff19166001179055610bc590849061119b565b60405163131836e760e21b8152600a60048201526001600160a01b038416602482015273b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa90634c60db9c9060440160006040518083038186803b158015610c1f57600080fd5b505af4158015610c33573d6000803e3d6000fd5b50505050610caa565b6001600160a01b0383166000908152600f602052604090205460ff16610c805760405163d88ceddd60e01b81526001600160a01b0384166004820152602401610a52565b6001600160a01b0383166000908152600f60205260409020805460ff19169055610caa8383610cf4565b826001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be82604051610ce7911515815260200190565b60405180910390a2505050565b610cfc610fa3565b6001600160a01b0382166000908152600f602052604090205460ff16610e11576012548110610dac57610d2f828261119b565b604051632f0ad01760e21b8152600a60048201526001600160a01b03831660248201526044810182905273b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa9063bc2b405c9060640160006040518083038186803b158015610d9057600080fd5b505af4158015610da4573d6000803e3d6000fd5b505050505050565b610db782600061119b565b60405163131836e760e21b8152600a60048201526001600160a01b038316602482015273b24969123b1dc397b5d470e9dd8ba0b7bc28b6fa90634c60db9c9060440160006040518083038186803b158015610d9057600080fd5b5050565b610e1d610fa3565b6001600160a01b038116610e4757604051631e4fbdf760e01b815260006004820152602401610a52565b610e508161114b565b50565b600080610e5e610fa3565b600a546000819003610e765750600093849350915050565b600e546000805a905060009550600094505b8682108015610e9657508386105b15610f5c5782610ea581611924565b600a5490945084109050610eb857600092505b6000600a6000018481548110610ed057610ed061193d565b60009182526020808320909101546001600160a01b03168083526010909152604090912054909150610f01906111ea565b15610f2257610f0f81610511565b15610f225785610f1e81611924565b9650505b86610f2c81611924565b97505060005a905080831115610f5357610f4681846118d7565b610f5090856118ea565b93505b9150610e889050565b600e83905560408051878152602081018790527ff78a0aac70b15fc744c16ea2c52bba9a167f030b8961e62a1d2c92588f77facf910160405180910390a150505050915091565b6000546001600160a01b03163314610aa85760405163118cdaa760e01b8152336004820152602401610a52565b600080610fdc83610b18565b9050801561054f576001600160a01b0383166000908152600760205260409020546110089082906118ea565b6001600160a01b0380851660009081526007602052604090209190915560095461103491168483611211565b1561108257826001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d8260405161107491815260200190565b60405180910390a292915050565b6001600160a01b0383166000908152600760205260409020546110a69082906118d7565b6001600160a01b03841660009081526007602052604090205550600092915050565b600081818112156105b557600080fd5b6000808212156110e757600080fd5b5090565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611145908590611289565b50505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600090815260016020526040902054808211156111cf576108af836111ca83856118d7565b6112ec565b808210156108af576108af836111e584846118d7565b61134a565b6000814210156111fc57506000919050565b60115461120983426118d7565b101592915050565b600061127f84856001600160a01b031663a9059cbb868660405160240161124d9291906001600160a01b03929092168252602082015260400190565b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611388565b90505b9392505050565b600061129e6001600160a01b03841683611430565b905080516000141580156112c35750808060200190518101906112c19190611953565b155b156108af57604051635274afe760e01b81526001600160a01b0384166004820152602401610a52565b6112f6828261143e565b611307816005546105979190611840565b6001600160a01b03831660009081526006602052604090205461132a91906118fd565b6001600160a01b0390921660009081526006602052604090209190915550565b61135482826114d3565b611365816005546105979190611840565b6001600160a01b03831660009081526006602052604090205461132a9190611857565b6000806000846001600160a01b0316846040516113a59190611970565b6000604051808303816000865af19150503d80600081146113e2576040519150601f19603f3d011682016040523d82523d6000602084013e6113e7565b606091505b50915091508180156114115750805115806114115750808060200190518101906114119190611953565b801561142757506000856001600160a01b03163b115b95945050505050565b6060611282838360006115b0565b6001600160a01b0382166114685760405163ec442f0560e01b815260006004820152602401610a52565b806002600082825461147a91906118ea565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0382166114fd57604051634b637e8f60e11b815260006004820152602401610a52565b6001600160a01b038216600090815260016020526040902054818110156115505760405163391434e360e21b81526001600160a01b03841660048201526024810182905260448101839052606401610a52565b6001600160a01b03831660008181526001602090815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b6060814710156115d55760405163cd78605960e01b8152306004820152602401610a52565b600080856001600160a01b031684866040516115f19190611970565b60006040518083038185875af1925050503d806000811461162e576040519150601f19603f3d011682016040523d82523d6000602084013e611633565b606091505b509150915061164386838361164d565b9695505050505050565b6060826116625761165d826116a9565b611282565b815115801561167957506001600160a01b0384163b155b156116a257604051639996b31560e01b81526001600160a01b0385166004820152602401610a52565b5080611282565b8051156116b95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60005b838110156116ed5781810151838201526020016116d5565b50506000910152565b60208152600082518060208401526117158160408501602087016116d2565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610e5057600080fd5b60006020828403121561175057600080fd5b813561128281611729565b60006020828403121561176d57600080fd5b5035919050565b8015158114610e5057600080fd5b60008060006060848603121561179757600080fd5b83356117a281611729565b92506020840135915060408401356117b981611774565b809150509250925092565b600080604083850312156117d757600080fd5b82356117e281611729565b946020939093013593505050565b600181811c9082168061180457607f821691505b60208210810361182457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176105b5576105b561182a565b80820182811260008312801582168215821617156118775761187761182a565b505092915050565b60008261189c57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156118b357600080fd5b5051919050565b6000602082840312156118cc57600080fd5b815161128281611729565b818103818111156105b5576105b561182a565b808201808211156105b5576105b561182a565b818103600083128015838313168383128216171561191d5761191d61182a565b5092915050565b6000600182016119365761193661182a565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561196557600080fd5b815161128281611774565b600082516119828184602087016116d2565b919091019291505056fea2646970667358221220b955f356a1f093c6d7ac0d6c8303d44d0a13d9747085d9e4154ec1ae7aa6efa164736f6c63430008190033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806379ba509711610167578063ad56c13c116100ce578063e7841ec011610087578063e7841ec01461063d578063f112ba7214610645578063f27fd2541461064d578063f2fde38b14610660578063f7c618c114610673578063ffb2c4791461068657600080fd5b8063ad56c13c1461056d578063c0246668146105c5578063c705c569146105d8578063d9477526146105eb578063dd62ed3e146105f3578063e30c39781461062c57600080fd5b80639c1b8af5116101205780639c1b8af514610510578063a26579ad14610519578063a6ddc42514610521578063a8b9d24014610534578063a9059cbb14610547578063a9d3cd8a1461055a57600080fd5b806379ba5097146104b657806379cc6790146104be5780638062651a146104d15780638da5cb5b146104e45780638fffabed146104f557806395d89b411461050857600080fd5b8063408ccbdf1161020b578063502f7446116101c4578063502f74461461043f57806364b0f653146104575780636843cd841461045f5780636cc9c8f11461047257806370a0823114610485578063715018a6146104ae57600080fd5b8063408ccbdf146103b357806342966c68146103d9578063484db9af146103ec5780634e71d92d146103ff5780634f011b83146104075780634fbee1931461041c57600080fd5b806323b872dd1161025d57806323b872dd14610343578063294aad9c146103565780632c1f52161461035e5780632f267e291461038957806330bb4cff1461039c578063313ce567146103a457600080fd5b80630483f7a0146102a557806306fdde03146102ba578063095ea7b3146102d857806318160ddd146102fb5780631a0e718c1461030d5780631e9fe6c614610320575b600080fd5b6102b86102b3366004612600565b6106ae565b005b6102c26106c4565b6040516102cf919061265d565b60405180910390f35b6102eb6102e6366004612690565b610756565b60405190151581526020016102cf565b6002545b6040519081526020016102cf565b6102b861031b3660046126d3565b610770565b6102eb61032e3660046126ee565b60106020526000908152604090205460ff1681565b6102eb61035136600461270b565b61080e565b6102ff610834565b600754610371906001600160a01b031681565b6040516001600160a01b0390911681526020016102cf565b6102b861039736600461274c565b6108a7565b6102ff610918565b604051601281526020016102cf565b6103c66103c136600461274c565b610962565b60405161ffff90911681526020016102cf565b6102b86103e736600461274c565b610990565b6102b86103fa366004612765565b61099d565b6102eb610a77565b6009546103c690600160b01b900461ffff1681565b6102eb61042a3660046126ee565b600c6020526000908152604090205460ff1681565b600e546103719061010090046001600160a01b031681565b6102ff610ae6565b6102ff61046d3660046126ee565b610b30565b6102b861048036600461274c565b610ba0565b6102ff6104933660046126ee565b6001600160a01b031660009081526020819052604090205490565b6102b8610c09565b6102b8610c1d565b6102b86104cc366004612690565b610c5e565b6102b86104df366004612793565b610c73565b6005546001600160a01b0316610371565b600f54610371906001600160a01b031681565b6102c2610e3e565b6102ff60085481565b6102ff610e4d565b6103c661052f36600461274c565b610e97565b6102ff6105423660046126ee565b610ea7565b6102eb610555366004612690565b610eda565b6102b8610568366004612600565b610ee8565b61058061057b3660046126ee565b610f51565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016102cf565b6102b86105d3366004612600565b610fec565b6102eb6105e63660046126ee565b611054565b6102ff6110c3565b6102ff610601366004612765565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6006546001600160a01b0316610371565b6102ff611106565b6102ff611150565b61058061065b36600461274c565b611161565b6102b861066e3660046126ee565b6111a3565b600954610371906001600160a01b031681565b61069961069436600461274c565b611214565b604080519283526020830191909152016102cf565b6106b6611293565b6106c082826112c0565b5050565b6060600380546106d3906127d6565b80601f01602080910402602001604051908101604052809291908181526020018280546106ff906127d6565b801561074c5780601f106107215761010080835404028352916020019161074c565b820191906000526020600020905b81548152906001019060200180831161072f57829003601f168201915b5050505050905090565b60003361076481858561135c565b60019150505b92915050565b610778611293565b61ffff8116158061078e57506101f48161ffff16115b156107b757604051631958d05f60e01b815261ffff821660048201526024015b60405180910390fd5b6009805461ffff60b01b1916600160b01b61ffff8416908102919091179091556040519081527fcf1366790fe21e66c9df9dcf67218b1e10acd64d3c99ae8a7429a68de91f1720906020015b60405180910390a150565b60003361081c858285611369565b6108278585856113e7565b60019150505b9392505050565b600754604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190612810565b905090565b6108af611293565b62030d408110806108c257506207a12081115b156108e35760405163074242a560e31b8152600481018290526024016107ae565b60088190556040518181527f1662a2324457a200b9556dfe949641639b99480ee6b448aefcfb97ee61ec241790602001610803565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b600d816003811061097257600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b61099a3382611446565b50565b600954600160a81b900460ff16806109bf5750600954600160a01b900460ff16155b610a225760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107ae565b600954600160a81b900460ff16158015610a4c576009805461ffff60a01b191661010160a01b1790555b610a558361147c565b610a5e826114fe565b8015610a72576009805460ff60a81b191690555b505050565b600754604051630f41a04d60e11b81523360048201526000916001600160a01b031690631e83409a906024016020604051808303816000875af1158015610ac2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a29190612829565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015610b7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612810565b610ba8611293565b600754604051636cc9c8f160e01b8152600481018390526001600160a01b0390911690636cc9c8f190602401600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b5050505050565b610c11611293565b610c1b600061170c565b565b60065433906001600160a01b03168114610c555760405163118cdaa760e01b81526001600160a01b03821660048201526024016107ae565b61099a8161170c565b610c69823383611369565b6106c08282611446565b610c7b611293565b600b54600d548491610c949161ffff9182169116612872565b610c9e9190612894565b600d805461ffff191661ffff9283161790819055600b548492610cce926201000092839004821692900416612872565b610cd89190612894565b600d805463ffff000019166201000061ffff938416021790819055600b548392610d119264010000000092839004821692900416612872565b610d1b9190612894565b600d805461ffff9283166401000000000265ffff0000000019821681179092556109c490831691909216171180610d605750600d546109c46201000090910461ffff16115b80610d7b5750600d546109c464010000000090910461ffff16115b15610dc157600d5460405163b7b3de6f60e01b815261ffff80831660048301526201000083048116602483015264010000000090920490911660448201526064016107ae565b6040805160608101825261ffff80861682528481166020830152831691810191909152610df290600b906003612532565b506040805161ffff8581168252848116602083015283168183015290517f3ec8f17d924721910a043bef5d818361423756fcd3cc52e2c46a1139acbb76929181900360600190a1505050565b6060600480546106d3906127d6565b60075460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b600b816003811061097257600080fd5b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401610b5f565b6000336107648185856113e7565b610ef0611293565b600f546001600160a01b0383811691161480610f1e5750600e546001600160a01b0383811661010090920416145b15610f475760405163435eaf7b60e11b81526001600160a01b03831660048201526024016107ae565b6106c08282611725565b600754604051632ebc328760e11b81526001600160a01b0383811660048301526000928392839283928392839283928392911690635d78650e906024015b61010060405180830381865afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd191906128af565b97509750975097509750975097509750919395975091939597565b610ff4611293565b6001600160a01b0382166000818152600c6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df791015b60405180910390a25050565b60075460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa15801561109f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190612829565b600954600f546001600160a01b03166000908152602081905260408120549091612710916110fc91600160b01b900461ffff1690612919565b6108a29190612930565b60075460408051633009a60960e01b815290516000926001600160a01b031691633009a6099160048083019260209291908290030181865afa15801561087e573d6000803e3d6000fd5b6000600a5460006108a29190612952565b600754604051632f7541e960e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690632f7541e990602401610f8f565b6111ab611293565b600680546001600160a01b0383166001600160a01b031990911681179091556111dc6005546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6007546040516001624d3b8760e01b031981526004810183905260009182916001600160a01b039091169063ffb2c4799060240160408051808303816000875af1158015611266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128a9190612965565b91509150915091565b6005546001600160a01b03163314610c1b5760405163118cdaa760e01b81523360048201526024016107ae565b6007546001600160a01b031663d1fbb84e836112f1816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015283151560448201526064015b600060405180830381600087803b15801561134057600080fd5b505af1158015611354573d6000803e3d6000fd5b505050505050565b610a72838383600161179a565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146113e157818110156113d257604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016107ae565b6113e18484848403600061179a565b50505050565b6001600160a01b03831661141157604051634b637e8f60e11b8152600060048201526024016107ae565b6001600160a01b03821661143b5760405163ec442f0560e01b8152600060048201526024016107ae565b610a7283838361186f565b6001600160a01b03821661147057604051634b637e8f60e11b8152600060048201526024016107ae565b6106c08260008361186f565b600754604051638aee812760e01b81526001600160a01b03838116600483015290911690638aee812790602401600060405180830381600087803b1580156114c357600080fd5b505af11580156114d7573d6000803e3d6000fd5b5050600980546001600160a01b0319166001600160a01b0394909416939093179092555050565b80600e60016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600e60019054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612989565b6001600160a01b031663c9c6539630600e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116229190612989565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561166f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116939190612989565b600f80546001600160a01b0319166001600160a01b03929092169190911790556116be816001611725565b600f546116d5906001600160a01b03166001611725565b6040516001600160a01b038216907fbc052db65df144ad4f71f02da93cae3d4401104c30ac374d7cc10d87ee07b60290600090a250565b600680546001600160a01b031916905561099a81611dc3565b6001600160a01b0382166000908152601060205260409020805460ff1916821580159190911790915561175d5761175d8260016112c0565b816001600160a01b03167f2cc8631dda80fe178488d3174721fafacf84b0f194a7eddae85c9bcc599ac78b82604051611048911515815260200190565b6001600160a01b0384166117c45760405163e602df0560e01b8152600060048201526024016107ae565b6001600160a01b0383166117ee57604051634a1406b160e11b8152600060048201526024016107ae565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156113e157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161186191815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061188f57506001600160a01b03821615155b15611bf257600e5460ff161580156118a75750600081115b80156118cc57506001600160a01b0383166000908152600c602052604090205460ff16155b80156118f157506001600160a01b0382166000908152600c602052604090205460ff16155b15611b21576001600160a01b03831660009081526010602052604081205460039060ff16801561193a57506001600160a01b03841660009081526010602052604090205460ff16155b1561195457600d5461ffff161561194f575060005b611a13565b6001600160a01b03841660009081526010602052604090205460ff16801561199557506001600160a01b03851660009081526010602052604090205460ff16155b156119b457600d5462010000900461ffff161561194f57506001611a13565b6001600160a01b03851660009081526010602052604090205460ff161580156119f657506001600160a01b03841660009081526010602052604090205460ff16155b15611a1357600d54640100000000900461ffff1615611a13575060025b60038160ff161015611b0d57612710600d8260ff1660038110611a3857611a38612846565b601091828204019190066002029054906101000a900461ffff1661ffff1684611a619190612919565b611a6b9190612930565b9150611a7782846129a6565b9250600d8160ff1660038110611a8f57611a8f612846565b601091828204019190066002029054906101000a900461ffff1661ffff16600b8260ff1660038110611ac357611ac3612846565b601091828204019190066002029054906101000a900461ffff1661ffff1683611aec9190612919565b611af69190612930565b600a6000828254611b079190612952565b90915550505b8115611b1e57611b1e853084611e15565b50505b6000611b2b6110c3565b611b33611150565b10158015611b595750600f546001600160a01b0316600090815260208190526040812054115b600e5490915060ff16158015611b7d5750600f546001600160a01b03858116911614155b8015611b9c5750600e546001600160a01b038581166101009092041614155b8015611ba55750805b15611bf057600e805460ff19166001179055600a5415801590611bcf57506000611bcd610ae6565b115b15611be557611bdf600a54611f3f565b6000600a555b600e805460ff191690555b505b611bfd838383611e15565b6001600160a01b03831615611c9c576007546001600160a01b031663e30443bc84611c3d816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611c8357600080fd5b505af1158015611c97573d6000803e3d6000fd5b505050505b6001600160a01b03821615611d3b576007546001600160a01b031663e30443bc83611cdc816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d2257600080fd5b505af1158015611d36573d6000803e3d6000fd5b505050505b600e5460ff16610a72576007546008546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611d7d9160040190815260200190565b60408051808303816000875af1925050508015611db7575060408051601f3d908101601f19168201909252611db491810190612965565b60015b15610a72575050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316611e40578060026000828254611e359190612952565b90915550611eb29050565b6001600160a01b03831660009081526020819052604090205481811015611e935760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016107ae565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611ece57600280548290039055611eed565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611f3291815260200190565b60405180910390a3505050565b611f488161206d565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb59190612810565b905080156106c057600754600954611fda916001600160a01b039182169116836121e7565b600754604051633243c79160e01b8152600481018390526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561202057600080fd5b505af1925050508015612031575060015b156106c0576040518181527f1e8f03f716bc104bf7d728131967a0c771e85ab54d09c1e2d6ed9e0bc4e2a16c9060200160405180910390a15050565b604080516003808252608082019092526000916020820160608036833701905050905030816000815181106120a4576120a4612846565b60200260200101906001600160a01b031690816001600160a01b031681525050600e60019054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190612989565b8160018151811061214e5761214e612846565b6001600160a01b03928316602091820292909201015260095482519116908290600290811061217f5761217f612846565b6001600160a01b039283166020918202929092010152600e546121aa9130916101009004168461135c565b600e54604051635c11d79560e01b81526101009091046001600160a01b031690635c11d795906113269085906000908690309042906004016129b9565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061225b9190612810565b90506113e1848461226c8585612952565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526122bd8482612320565b6113e157604080516001600160a01b038516602482015260006044808301919091528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526123169085906123c8565b6113e184826123c8565b6000806000846001600160a01b03168460405161233d9190612a2c565b6000604051808303816000865af19150503d806000811461237a576040519150601f19603f3d011682016040523d82523d6000602084013e61237f565b606091505b50915091508180156123a95750805115806123a95750808060200190518101906123a99190612829565b80156123bf57506000856001600160a01b03163b115b95945050505050565b60006123dd6001600160a01b0384168361242b565b905080516000141580156124025750808060200190518101906124009190612829565b155b15610a7257604051635274afe760e01b81526001600160a01b03841660048201526024016107ae565b606061082d8383600084600080856001600160a01b031684866040516124519190612a2c565b60006040518083038185875af1925050503d806000811461248e576040519150601f19603f3d011682016040523d82523d6000602084013e612493565b606091505b50915091506124a38683836124ad565b9695505050505050565b6060826124c2576124bd82612509565b61082d565b81511580156124d957506001600160a01b0384163b155b1561250257604051639996b31560e01b81526001600160a01b03851660048201526024016107ae565b508061082d565b8051156125195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001830191839082156125b85791602002820160005b8382111561258857835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302612548565b80156125b65782816101000a81549061ffff0219169055600201602081600101049283019260010302612588565b505b506125c49291506125c8565b5090565b5b808211156125c457600081556001016125c9565b6001600160a01b038116811461099a57600080fd5b801515811461099a57600080fd5b6000806040838503121561261357600080fd5b823561261e816125dd565b9150602083013561262e816125f2565b809150509250929050565b60005b8381101561265457818101518382015260200161263c565b50506000910152565b602081526000825180602084015261267c816040850160208701612639565b601f01601f19169190910160400192915050565b600080604083850312156126a357600080fd5b82356126ae816125dd565b946020939093013593505050565b803561ffff811681146126ce57600080fd5b919050565b6000602082840312156126e557600080fd5b61082d826126bc565b60006020828403121561270057600080fd5b813561082d816125dd565b60008060006060848603121561272057600080fd5b833561272b816125dd565b9250602084013561273b816125dd565b929592945050506040919091013590565b60006020828403121561275e57600080fd5b5035919050565b6000806040838503121561277857600080fd5b8235612783816125dd565b9150602083013561262e816125dd565b6000806000606084860312156127a857600080fd5b6127b1846126bc565b92506127bf602085016126bc565b91506127cd604085016126bc565b90509250925092565b600181811c908216806127ea57607f821691505b60208210810361280a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561282257600080fd5b5051919050565b60006020828403121561283b57600080fd5b815161082d816125f2565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b61ffff82811682821603908082111561288d5761288d61285c565b5092915050565b61ffff81811683821601908082111561288d5761288d61285c565b600080600080600080600080610100898b0312156128cc57600080fd5b88516128d7816125dd565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b808202811582820484141761076a5761076a61285c565b60008261294d57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561076a5761076a61285c565b6000806040838503121561297857600080fd5b505080516020909101519092909150565b60006020828403121561299b57600080fd5b815161082d816125dd565b8181038181111561076a5761076a61285c565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612a0b5784516001600160a01b0316835293830193918301916001016129e6565b50506001600160a01b03969096166060850152505050608001529392505050565b60008251612a3e818460208701612639565b919091019291505056fea26469706673582212207100baa53452dd239576a9e2221ac12cae7b75aa87154b81e820f00781a6b1b364736f6c63430008190033
Deployed Bytecode Sourcemap
567:7935:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4367:142;;;;;;:::i;:::-;;:::i;:::-;;2038:89:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4257:186;;;;;;:::i;:::-;;:::i;:::-;;;1801:14:17;;1794:22;1776:41;;1764:2;1749:18;4257:186:2;1636:187:17;3108:97:2;3186:12;;3108:97;;;1974:25:17;;;1962:2;1947:18;3108:97:2;1828:177:17;2912:319:14;;;;;;:::i;:::-;;:::i;1024:37::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5003:244:2;;;;;;:::i;:::-;;:::i;18351:113:15:-;;;:::i;16382:38::-;;;;;-1:-1:-1;;;;;16382:38:15;;;;;;-1:-1:-1;;;;;3264:32:17;;;3246:51;;3234:2;3219:18;16382:38:15;3076:227:17;17064:312:15;;;;;;:::i;:::-;;:::i;17931:133::-;;;:::i;2819:83:14:-;;;2893:2;3635:36:17;;3623:2;3608:18;2819:83:14;3493:184:17;896:26:14;;;;;;:::i;:::-;;:::i;:::-;;;3856:6:17;3844:19;;;3826:38;;3814:2;3799:18;896:26:14;3682:188:17;604:87:3;;;;;;:::i;:::-;;:::i;2646:167:14:-;;;;;;:::i;:::-;;:::i;17731:91:15:-;;;:::i;722:32:14:-;;;;;-1:-1:-1;;;722:32:14;;;;;;838:51;;;;;;:::i;:::-;;;;;;;;;;;;;;;;957:34;;;;;;;;-1:-1:-1;;;;;957:34:14;;;19117:132:15;;;:::i;18216:131::-;;;;;;:::i;:::-;;:::i;17380:114::-;;;;;;:::i;:::-;;:::i;3263:116:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3354:18:2;3328:7;3354:18;;;;;;;;;;;;3263:116;2286:101:11;;;:::i;1761:229:12:-;;;:::i;1007:158:3:-;;;;;;:::i;:::-;;:::i;4698:580:14:-;;;;;;:::i;:::-;;:::i;1631:85:11:-;1703:6;;-1:-1:-1;;;;;1703:6:11;1631:85;;997:21:14;;;;;-1:-1:-1;;;;;997:21:14;;;2240:93:2;;;:::i;16425:31:15:-;;;;;;17826:101;;;:::i;803:28:14:-;;;;;;:::i;:::-;;:::i;18068:144:15:-;;;;;;:::i;:::-;;:::i;3574:178:2:-;;;;;;:::i;:::-;;:::i;5801:176:14:-;;;;;;:::i;:::-;;:::i;18468:254:15:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5401:32:17;;;5383:51;;5465:2;5450:18;;5443:34;;;;5493:18;;;5486:34;;;;5551:2;5536:18;;5529:34;;;;5594:3;5579:19;;5572:35;5421:3;5623:19;;5616:35;5682:3;5667:19;;5660:35;5726:3;5711:19;;5704:35;5370:3;5355:19;18468:254:15;5044:701:17;5284:193:14;;;;;;:::i;:::-;;:::i;17584:143:15:-;;;;;;:::i;:::-;;:::i;3237:134:14:-;;;:::i;3810:140:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3916:18:2;;;3890:7;3916:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3810:140;874:99:12;953:13;;-1:-1:-1;;;;;953:13:12;874:99;;18994:119:15;;;:::i;3377:98:14:-;;;:::i;18726:264:15:-;;;;;;:::i;:::-;;:::i;1166:178:12:-;;;;;;:::i;:::-;;:::i;16461:26:15:-;;;;;-1:-1:-1;;;;;16461:26:15;;;19253:129;;;;;;:::i;:::-;;:::i;:::-;;;;5924:25:17;;;5980:2;5965:18;;5958:34;;;;5897:18;19253:129:15;5750:248:17;4367:142:14;1524:13:11;:11;:13::i;:::-;4460:42:14::1;4482:7;4491:10;4460:21;:42::i;:::-;4367:142:::0;;:::o;2038:89:2:-;2083:13;2115:5;2108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2038:89;:::o;4257:186::-;4330:4;735:10:1;4384:31:2;735:10:1;4400:7:2;4409:5;4384:8;:31::i;:::-;4432:4;4425:11;;;4257:186;;;;;:::o;2912:319:14:-;1524:13:11;:11;:13::i;:::-;3000:24:14::1;::::0;::::1;::::0;;:53:::1;;;3050:3;3028:19;:25;;;3000:53;2996:112;;;3062:46;::::0;-1:-1:-1;;;3062:46:14;;3856:6:17;3844:19;;3062:46:14::1;::::0;::::1;3826:38:17::0;3799:18;;3062:46:14::1;;;;;;;;2996:112;3119:18;:40:::0;;-1:-1:-1;;;;3119:40:14::1;-1:-1:-1::0;;;3119:40:14::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;3183:41:::1;::::0;3826:38:17;;;3183:41:14::1;::::0;3814:2:17;3799:18;3183:41:14::1;;;;;;;;2912:319:::0;:::o;5003:244:2:-;5090:4;735:10:1;5146:37:2;5162:4;735:10:1;5177:5:2;5146:15;:37::i;:::-;5193:26;5203:4;5209:2;5213:5;5193:9;:26::i;:::-;5236:4;5229:11;;;5003:244;;;;;;:::o;18351:113:15:-;18430:15;;:29;;;-1:-1:-1;;;18430:29:15;;;;18408:7;;-1:-1:-1;;;;;18430:15:15;;:27;;:29;;;;;;;;;;;;;;:15;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18423:36;;18351:113;:::o;17064:312::-;1524:13:11;:11;:13::i;:::-;17173:7:15::1;17151:19;:29;:62;;;;17206:7;17184:19;:29;17151:62;17147:119;;;17222:44;::::0;-1:-1:-1;;;17222:44:15;;::::1;::::0;::::1;1974:25:17::0;;;1947:18;;17222:44:15::1;1828:177:17::0;17147:119:15::1;17277:16;:38:::0;;;17327:44:::1;::::0;1974:25:17;;;17327:44:15::1;::::0;1962:2:17;1947:18;17327:44:15::1;1828:177:17::0;17931:133:15;18016:15;;:43;;;-1:-1:-1;;;18016:43:15;;;;17994:7;;-1:-1:-1;;;;;18016:15:15;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;896:26:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;604:87:3:-;658:26;735:10:1;678:5:3;658;:26::i;:::-;604:87;:::o;2646:167:14:-;476:13:10;;-1:-1:-1;;;476:13:10;;;;;:30;;-1:-1:-1;494:12:10;;-1:-1:-1;;;494:12:10;;;;493:13;476:30;468:89;;;;-1:-1:-1;;;468:89:10;;6779:2:17;468:89:10;;;6761:21:17;6818:2;6798:18;;;6791:30;6857:34;6837:18;;;6830:62;-1:-1:-1;;;6908:18:17;;;6901:44;6962:19;;468:89:10;6577:410:17;468:89:10;591:13;;-1:-1:-1;;;591:13:10;;;;590:14;614:98;;;;648:13;:20;;-1:-1:-1;;;;682:19:10;-1:-1:-1;;;682:19:10;;;614:98;2742:29:14::1;2758:12;2742:15;:29::i;:::-;2782:24;2798:7;2782:15;:24::i;:::-;738:14:10::0;734:66;;;768:13;:21;;-1:-1:-1;;;;768:21:10;;;734:66;458:348;2646:167:14;;:::o;17731:91:15:-;17784:15;;:33;;-1:-1:-1;;;17784:33:15;;17806:10;17784:33;;;3246:51:17;17765:4:15;;-1:-1:-1;;;;;17784:15:15;;:21;;3219:18:17;;17784:33:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19117:132::-;19203:15;;:41;;;-1:-1:-1;;;19203:41:15;;;;19181:7;;-1:-1:-1;;;;;19203:15:15;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;18216:131;18308:15;;:34;;-1:-1:-1;;;18308:34:15;;-1:-1:-1;;;;;3264:32:17;;;18308:34:15;;;3246:51:17;18286:7:15;;18308:15;;:25;;3219:18:17;;18308:34:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17380:114::-;1524:13:11;:11;:13::i;:::-;17448:15:15::1;::::0;:41:::1;::::0;-1:-1:-1;;;17448:41:15;;::::1;::::0;::::1;1974:25:17::0;;;-1:-1:-1;;;;;17448:15:15;;::::1;::::0;:30:::1;::::0;1947:18:17;;17448:41:15::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;17380:114:::0;:::o;2286:101:11:-;1524:13;:11;:13::i;:::-;2350:30:::1;2377:1;2350:18;:30::i;:::-;2286:101::o:0;1761:229:12:-;953:13;;735:10:1;;-1:-1:-1;;;;;953:13:12;1856:24;;1852:96;;1903:34;;-1:-1:-1;;;1903:34:12;;-1:-1:-1;;;;;3264:32:17;;1903:34:12;;;3246:51:17;3219:18;;1903:34:12;3076:227:17;1852:96:12;1957:26;1976:6;1957:18;:26::i;1007:158:3:-;1082:45;1098:7;735:10:1;1121:5:3;1082:15;:45::i;:::-;1137:21;1143:7;1152:5;1137;:21::i;4698:580:14:-;1524:13:11;:11;:13::i;:::-;4835:11:14::1;:14:::0;4820:9:::1;:12:::0;4852:7;;4820:29:::1;::::0;4835:14:::1;::::0;;::::1;::::0;4820:12:::1;:29;:::i;:::-;:39;;;;:::i;:::-;4805:9;:54:::0;;-1:-1:-1;;4805:54:14::1;;::::0;;::::1;;::::0;;;;4899:11:::1;:14:::0;4916:8;;4884:29:::1;::::0;4899:14;;;;::::1;::::0;::::1;::::0;4884:12;::::1;;:29;:::i;:::-;:40;;;;:::i;:::-;4869:9;:55:::0;;-1:-1:-1;;4869:55:14::1;::::0;::::1;::::0;;::::1;;;::::0;;;;4964:11:::1;:14:::0;4981:12;;4949:29:::1;::::0;4964:14;;;;::::1;::::0;::::1;::::0;4949:12;::::1;;:29;:::i;:::-;:44;;;;:::i;:::-;4934:9;:59:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;4934:59:14;::::1;::::0;::::1;::::0;;;5022:4:::1;5007:12:::0;;;;;;;;:19:::1;::::0;:42:::1;;-1:-1:-1::0;5030:9:14::1;:12:::0;5045:4:::1;5030:12:::0;;;::::1;;;:19;5007:42;:65;;;-1:-1:-1::0;5053:9:14::1;:12:::0;5068:4:::1;5053:12:::0;;;::::1;;;:19;5007:65;5003:143;;;5105:9;:12:::0;5081:65:::1;::::0;-1:-1:-1;;;5081:65:14;;5105:12:::1;::::0;;::::1;5081:65;::::0;::::1;8076:34:17::0;5119:12:14;;::::1;::::0;::::1;8126:18:17::0;;;8119:43;5133:12:14;;;::::1;::::0;;::::1;8178:18:17::0;;;8171:43;8024:18;;5081:65:14::1;7855:365:17::0;5003:143:14::1;5157:47;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;:11:::1;::::0;:47:::1;;:::i;:::-;-1:-1:-1::0;5220:51:14::1;::::0;;8061:6:17;8094:15;;;8076:34;;8146:15;;;8141:2;8126:18;;8119:43;8198:15;;8178:18;;;8171:43;5220:51:14;;::::1;::::0;;;;8039:2:17;5220:51:14;;::::1;4698:580:::0;;;:::o;2240:93:2:-;2287:13;2319:7;2312:14;;;;;:::i;17826:101:15:-;17895:15;;:27;;;-1:-1:-1;;;17895:27:15;;;;17873:7;;-1:-1:-1;;;;;17895:15:15;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;803:28:14;;;;;;;;;;;18068:144:15;18160:15;;:47;;-1:-1:-1;;;18160:47:15;;-1:-1:-1;;;;;3264:32:17;;;18160:47:15;;;3246:51:17;18138:7:15;;18160:15;;:38;;3219:18:17;;18160:47:15;3076:227:17;3574:178:2;3643:4;735:10:1;3697:27:2;735:10:1;3714:2:2;3718:5;3697:9;:27::i;5801:176:14:-;1524:13:11;:11;:13::i;:::-;5882:6:14::1;::::0;-1:-1:-1;;;;;5875:13:14;;::::1;5882:6:::0;::::1;5875:13;::::0;:41:::1;;-1:-1:-1::0;5907:8:14::1;::::0;-1:-1:-1;;;;;5892:24:14;;::::1;5907:8;::::0;;::::1;;5892:24;5875:41;5871:69;;;5925:15;::::0;-1:-1:-1;;;5925:15:14;;-1:-1:-1;;;;;3264:32:17;;5925:15:14::1;::::0;::::1;3246:51:17::0;3219:18;;5925:15:14::1;3076:227:17::0;5871:69:14::1;5951:19;5959:3;5964:5;5951:7;:19::i;18468:254:15:-:0;18678:15;;:39;;-1:-1:-1;;;18678:39:15;;-1:-1:-1;;;;;3264:32:17;;;18678:39:15;;;3246:51:17;18548:7:15;;;;;;;;;;;;;;;;18678:15;;;:30;;3219:18:17;;18678:39:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18671:46;;;;;;;;;;;;;;;;18468:254;;;;;;;;;:::o;5284:193:14:-;1524:13:11;:11;:13::i;:::-;-1:-1:-1;;;;;5370:27:14;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:40;;-1:-1:-1;;5370:40:14::1;::::0;::::1;;::::0;;::::1;::::0;;;5434:36;;1776:41:17;;;5434:36:14::1;::::0;1749:18:17;5434:36:14::1;;;;;;;;5284:193:::0;;:::o;17584:143:15:-;17674:15;;:48;;-1:-1:-1;;;17674:48:15;;-1:-1:-1;;;;;3264:32:17;;;17674:48:15;;;3246:51:17;17655:4:15;;17674:15;;:39;;3219:18:17;;17674:48:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3237:134:14:-;3338:18;;3328:6;;-1:-1:-1;;;;;3328:6:14;3292:7;3354:18:2;;;;;;;;;;;3292:7:14;;3359:5;;3318:38;;-1:-1:-1;;;3338:18:14;;;;;3318:38;:::i;:::-;:46;;;;:::i;18994:119:15:-;19072:15;;:36;;;-1:-1:-1;;;19072:36:15;;;;19050:7;;-1:-1:-1;;;;;19072:15:15;;:34;;:36;;;;;;;;;;;;;;:15;:36;;;;;;;;;;;;;;3377:98:14;3423:7;3453:15;;3449:1;:19;;;;:::i;18726:264:15:-;18941:15;;:44;;-1:-1:-1;;;18941:44:15;;;;;1974:25:17;;;18811:7:15;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18941:15:15;;;;:37;;1947:18:17;;18941:44:15;1828:177:17;1166:178:12;1524:13:11;:11;:13::i;:::-;1255::12::1;:24:::0;;-1:-1:-1;;;;;1255:24:12;::::1;-1:-1:-1::0;;;;;;1255:24:12;;::::1;::::0;::::1;::::0;;;1319:7:::1;1703:6:11::0;;-1:-1:-1;;;;;1703:6:11;;1631:85;1319:7:12::1;-1:-1:-1::0;;;;;1294:43:12::1;;;;;;;;;;;1166:178:::0;:::o;19253:129:15:-;19349:15;;:28;;-1:-1:-1;;;;;;19349:28:15;;;;;1974:25:17;;;19300:18:15;;;;-1:-1:-1;;;;;19349:15:15;;;;:23;;1947:18:17;;19349:28:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19342:35;;;;19253:129;;;:::o;1789:162:11:-;1703:6;;-1:-1:-1;;;;;1703:6:11;735:10:1;1848:23:11;1844:101;;1894:40;;-1:-1:-1;;;1894:40:11;;735:10:1;1894:40:11;;;3246:51:17;3219:18;;1894:40:11;3076:227:17;4515:177:14;4608:15;;-1:-1:-1;;;;;4608:15:14;:36;4645:7;4654:18;4645:7;-1:-1:-1;;;;;3354:18:2;3328:7;3354:18;;;;;;;;;;;;3263:116;4654:18:14;4608:77;;-1:-1:-1;;;;;;4608:77:14;;;;;;;-1:-1:-1;;;;;9900:32:17;;;4608:77:14;;;9882:51:17;9949:18;;;9942:34;10019:14;;10012:22;9992:18;;;9985:50;9855:18;;4608:77:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4515:177;;:::o;8953:128:2:-;9037:37;9046:5;9053:7;9062:5;9069:4;9037:8;:37::i;10627:477::-;-1:-1:-1;;;;;3916:18:2;;;10726:24;3916:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;10792:37:2;;10788:310;;10868:5;10849:16;:24;10845:130;;;10900:60;;-1:-1:-1;;;10900:60:2;;-1:-1:-1;;;;;10266:32:17;;10900:60:2;;;10248:51:17;10315:18;;;10308:34;;;10358:18;;;10351:34;;;10221:18;;10900:60:2;10046:345:17;10845:130:2;11016:57;11025:5;11032:7;11060:5;11041:16;:24;11067:5;11016:8;:57::i;:::-;10716:388;10627:477;;;:::o;5620:300::-;-1:-1:-1;;;;;5703:18:2;;5699:86;;5744:30;;-1:-1:-1;;;5744:30:2;;5771:1;5744:30;;;3246:51:17;3219:18;;5744:30:2;3076:227:17;5699:86:2;-1:-1:-1;;;;;5798:16:2;;5794:86;;5837:32;;-1:-1:-1;;;5837:32:2;;5866:1;5837:32;;;3246:51:17;3219:18;;5837:32:2;3076:227:17;5794:86:2;5889:24;5897:4;5903:2;5907:5;5889:7;:24::i;8211:206::-;-1:-1:-1;;;;;8281:21:2;;8277:89;;8325:30;;-1:-1:-1;;;8325:30:2;;8352:1;8325:30;;;3246:51:17;3219:18;;8325:30:2;3076:227:17;8277:89:2;8375:35;8383:7;8400:1;8404:5;8375:7;:35::i;16916:144:15:-;16978:15;;:44;;-1:-1:-1;;;16978:44:15;;-1:-1:-1;;;;;3264:32:17;;;16978:44:15;;;3246:51:17;16978:15:15;;;;:30;;3219:18:17;;16978:44:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17029:11:15;:26;;-1:-1:-1;;;;;;17029:26:15;-1:-1:-1;;;;;17029:26:15;;;;;;;;;;;-1:-1:-1;;16916:144:15:o;5483:312:14:-;5572:6;5542:8;;:37;;;;;-1:-1:-1;;;;;5542:37:14;;;;;-1:-1:-1;;;;;5542:37:14;;;;;;5616:8;;;;;;;;;-1:-1:-1;;;;;5616:8:14;-1:-1:-1;;;;;5616:16:14;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;5598:48:14;;5655:4;5662:8;;;;;;;;;-1:-1:-1;;;;;5662:8:14;-1:-1:-1;;;;;5662:13:14;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5598:80;;-1:-1:-1;;;;;;5598:80:14;;;;;;;-1:-1:-1;;;;;10882:15:17;;;5598:80:14;;;10864:34:17;10934:15;;10914:18;;;10907:43;10799:18;;5598:80:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5589:6;:89;;-1:-1:-1;;;;;;5589:89:14;-1:-1:-1;;;;;5589:89:14;;;;;;;;;;5697:21;5705:6;-1:-1:-1;5697:7:14;:21::i;:::-;5736:6;;5728:21;;-1:-1:-1;;;;;5736:6:14;;5728:7;:21::i;:::-;5765:23;;-1:-1:-1;;;;;5765:23:14;;;;;;;;5483:312;:::o;1528:153:12:-;1617:13;1610:20;;-1:-1:-1;;;;;;1610:20:12;;;1640:34;1665:8;1640:24;:34::i;5983:202:14:-;-1:-1:-1;;;;;6043:9:14;;;;;;:4;:9;;;;;:17;;-1:-1:-1;;6043:17:14;;;;;;;;;;;;6071:70;;6097:32;6119:3;6124:4;6097:21;:32::i;:::-;6167:3;-1:-1:-1;;;;;6156:22:14;;6172:5;6156:22;;;;1801:14:17;1794:22;1776:41;;1764:2;1749:18;;1636:187;9913:432:2;-1:-1:-1;;;;;10025:19:2;;10021:89;;10067:32;;-1:-1:-1;;;10067:32:2;;10096:1;10067:32;;;3246:51:17;3219:18;;10067:32:2;3076:227:17;10021:89:2;-1:-1:-1;;;;;10123:21:2;;10119:90;;10167:31;;-1:-1:-1;;;10167:31:2;;10195:1;10167:31;;;3246:51:17;3219:18;;10167:31:2;3076:227:17;10119:90:2;-1:-1:-1;;;;;10218:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;10263:76;;;;10313:7;-1:-1:-1;;;;;10297:31:2;10306:5;-1:-1:-1;;;;;10297:31:2;;10322:5;10297:31;;;;1974:25:17;;1962:2;1947:18;;1828:177;10297:31:2;;;;;;;;9913:432;;;;:::o;6192:2088:14:-;-1:-1:-1;;;;;6358:18:14;;;;;;:38;;-1:-1:-1;;;;;;6380:16:14;;;;6358:38;6354:1563;;;6417:9;;;;6416:10;:24;;;;;6439:1;6430:6;:10;6416:24;:53;;;;-1:-1:-1;;;;;;6445:24:14;;;;;;:18;:24;;;;;;;;6444:25;6416:53;:80;;;;-1:-1:-1;;;;;;6474:22:14;;;;;;:18;:22;;;;;;;;6473:23;6416:80;6412:986;;;-1:-1:-1;;;;;6605:10:14;;6516:12;6605:10;;;:4;:10;;;;;;6565:1;;6605:10;;:23;;;;-1:-1:-1;;;;;;6620:8:14;;;;;;:4;:8;;;;;;;;6619:9;6605:23;6601:351;;;6656:9;:12;;;:16;6652:32;;-1:-1:-1;6683:1:14;6652:32;6601:351;;;-1:-1:-1;;;;;6729:8:14;;;;;;:4;:8;;;;;;;;:23;;;;-1:-1:-1;;;;;;6742:10:14;;;;;;:4;:10;;;;;;;;6741:11;6729:23;6725:227;;;6780:9;:12;;;;;;:16;6776:32;;-1:-1:-1;6807:1:14;6725:227;;;-1:-1:-1;;;;;6854:10:14;;;;;;:4;:10;;;;;;;;6853:11;:24;;;;-1:-1:-1;;;;;;6869:8:14;;;;;;:4;:8;;;;;;;;6868:9;6853:24;6849:103;;;6905:9;:12;;;;;;:16;6901:32;;-1:-1:-1;6932:1:14;6901:32;6999:1;6990:6;:10;;;6986:285;;;7081:5;7061:9;7071:6;7061:17;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7052:26;;:6;:26;;;;:::i;:::-;:34;;;;:::i;:::-;7045:41;-1:-1:-1;7108:14:14;7045:41;7108:14;;:::i;:::-;;;7213:9;7223:6;7213:17;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7184:46;;7191:11;7203:6;7191:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7184:26;;:4;:26;;;;:::i;:::-;:46;;;;:::i;:::-;7165:15;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;6986:285:14;7293:8;;7289:95;;7325:40;7339:4;7353;7360;7325:13;:40::i;:::-;6498:900;;6412:986;7424:12;7458:24;:22;:24::i;:::-;7439:15;:13;:15::i;:::-;:43;;:68;;;;-1:-1:-1;7496:6:14;;-1:-1:-1;;;;;7496:6:14;7506:1;3354:18:2;;;;;;;;;;;7486:21:14;7439:68;7539:9;;7424:83;;-1:-1:-1;7539:9:14;;7538:10;:28;;;;-1:-1:-1;7560:6:14;;-1:-1:-1;;;;;7552:14:14;;;7560:6;;7552:14;;7538:28;:57;;;;-1:-1:-1;7586:8:14;;-1:-1:-1;;;;;7570:25:14;;;7586:8;;;;;7570:25;;7538:57;:68;;;;;7599:7;7538:68;7534:372;;;7626:9;:16;;-1:-1:-1;;7626:16:14;7638:4;7626:16;;;7681:15;;:19;;;;:60;;;7740:1;7704:33;:31;:33::i;:::-;:37;7681:60;7677:179;;;7765:31;7780:15;;7765:14;:31::i;:::-;7836:1;7818:15;:19;7677:179;7874:9;:17;;-1:-1:-1;;7874:17:14;;;7534:372;6398:1519;6354:1563;7927:31;7941:4;7947:2;7951:6;7927:13;:31::i;:::-;-1:-1:-1;;;;;8035:18:14;;;8031:73;;8055:15;;-1:-1:-1;;;;;8055:15:14;:26;8082:4;8088:15;8082:4;-1:-1:-1;;;;;3354:18:2;3328:7;3354:18;;;;;;;;;;;;3263:116;8088:15:14;8055:49;;-1:-1:-1;;;;;;8055:49:14;;;;;;;-1:-1:-1;;;;;11286:32:17;;;8055:49:14;;;11268:51:17;11335:18;;;11328:34;11241:18;;8055:49:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8031:73;-1:-1:-1;;;;;8118:16:14;;;8114:67;;8136:15;;-1:-1:-1;;;;;8136:15:14;:26;8163:2;8167:13;8163:2;-1:-1:-1;;;;;3354:18:2;3328:7;3354:18;;;;;;;;;;;;3263:116;8167:13:14;8136:45;;-1:-1:-1;;;;;;8136:45:14;;;;;;;-1:-1:-1;;;;;11286:32:17;;;8136:45:14;;;11268:51:17;11335:18;;;11328:34;11241:18;;8136:45:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8114:67;8205:9;;;;8200:73;;8220:15;;8244:16;;8220:41;;-1:-1:-1;;;;;;8220:41:14;;-1:-1:-1;;;;;8220:15:14;;;;:23;;:41;;;;1974:25:17;;;1962:2;1947:18;;1828:177;8220:41:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8220:41:14;;;;;;;;-1:-1:-1;;8220:41:14;;;;;;;;;;;;:::i;:::-;;;8216:57;;;;;6192:2088;;;:::o;2905:187:11:-;2997:6;;;-1:-1:-1;;;;;3013:17:11;;;-1:-1:-1;;;;;;3013:17:11;;;;;;;3045:40;;2997:6;;;3013:17;2997:6;;3045:40;;2978:16;;3045:40;2968:124;2905:187;:::o;6235:1107:2:-;-1:-1:-1;;;;;6324:18:2;;6320:540;;6476:5;6460:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;6320:540:2;;-1:-1:-1;6320:540:2;;-1:-1:-1;;;;;6534:15:2;;6512:19;6534:15;;;;;;;;;;;6567:19;;;6563:115;;;6613:50;;-1:-1:-1;;;6613:50:2;;-1:-1:-1;;;;;10266:32:17;;6613:50:2;;;10248:51:17;10315:18;;;10308:34;;;10358:18;;;10351:34;;;10221:18;;6613:50:2;10046:345:17;6563:115:2;-1:-1:-1;;;;;6798:15:2;;:9;:15;;;;;;;;;;6816:19;;;;6798:37;;6320:540;-1:-1:-1;;;;;6874:16:2;;6870:425;;7037:12;:21;;;;;;;6870:425;;;-1:-1:-1;;;;;7248:13:2;;:9;:13;;;;;;;;;;:22;;;;;;6870:425;7325:2;-1:-1:-1;;;;;7310:25:2;7319:4;-1:-1:-1;;;;;7310:25:2;;7329:5;7310:25;;;;1974::17;;1962:2;1947:18;;1828:177;7310:25:2;;;;;;;;6235:1107;;;:::o;3906:455:14:-;3969:44;4001:11;3969:31;:44::i;:::-;4051:11;;4044:44;;-1:-1:-1;;;4044:44:14;;4082:4;4044:44;;;3246:51:17;4024:17:14;;-1:-1:-1;;;;;4051:11:14;;4044:29;;3219:18:17;;4044:44:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4024:64;-1:-1:-1;4103:13:14;;4099:256;;4182:15;;4139:11;;4132:78;;-1:-1:-1;;;;;4139:11:14;;;;4182:15;4200:9;4132:41;:78::i;:::-;4229:15;;:46;;-1:-1:-1;;;4229:46:14;;;;;1974:25:17;;;-1:-1:-1;;;;;4229:15:14;;;;:35;;1947:18:17;;4229:46:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4225:120;;;4299:22;;1974:25:17;;;4299:22:14;;1962:2:17;1947:18;4299:22:14;;;;;;;3959:402;3906:455;:::o;3481:419::-;3585:16;;;3599:1;3585:16;;;;;;;;;3561:21;;3585:16;;;;;;;;;;-1:-1:-1;3585:16:14;3561:40;;3629:4;3611;3616:1;3611:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;3611:23:14;;;-1:-1:-1;;;;;3611:23:14;;;;;3654:8;;;;;;;;;-1:-1:-1;;;;;3654:8:14;-1:-1:-1;;;;;3654:13:14;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3644:4;3649:1;3644:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3644:25:14;;;:7;;;;;;;;;:25;3689:11;;3679:7;;3689:11;;;3679:4;;3684:1;;3679:7;;;;;;:::i;:::-;-1:-1:-1;;;;;3679:21:14;;;:7;;;;;;;;;:21;3743:8;;3711:55;;3728:4;;3743:8;;;;3754:11;3711:8;:55::i;:::-;3777:8;;:116;;-1:-1:-1;;;3777:116:14;;:8;;;;-1:-1:-1;;;;;3777:8:14;;:62;;:116;;3840:11;;3853:1;;3856:4;;3870;;3877:15;;3777:116;;;:::i;1768:225:13:-;1887:39;;-1:-1:-1;;;1887:39:13;;1911:4;1887:39;;;10864:34:17;-1:-1:-1;;;;;10934:15:17;;;10914:18;;;10907:43;1864:20:13;;1887:15;;;;;;10799:18:17;;1887:39:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1864:62;-1:-1:-1;1936:50:13;1949:5;1956:7;1965:20;1980:5;1864:62;1965:20;:::i;:::-;2427:47;;;-1:-1:-1;;;;;11286:32:17;;2427:47:13;;;11268:51:17;11335:18;;;;11328:34;;;2427:47:13;;;;;;;;;;11241:18:17;;;;2427:47:13;;;;;;;;-1:-1:-1;;;;;2427:47:13;-1:-1:-1;;;2427:47:13;;;2490:44;2442:13;2427:47;2490:23;:44::i;:::-;2485:201;;2577:43;;;-1:-1:-1;;;;;11286:32:17;;2577:43:13;;;11268:51:17;2617:1:13;11335:18:17;;;;11328:34;;;;2577:43:13;;;;;;;;;;11241:18:17;;;;2577:43:13;;;;;;;;-1:-1:-1;;;;;2577:43:13;-1:-1:-1;;;2577:43:13;;;2550:71;;2570:5;;2550:19;:71::i;:::-;2635:40;2655:5;2662:12;2635:19;:40::i;4205:578::-;4288:4;4590:12;4604:23;4639:5;-1:-1:-1;;;;;4631:19:13;4651:4;4631:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4589:67;;;;4673:7;:69;;;;-1:-1:-1;4685:17:13;;:22;;:56;;;4722:10;4711:30;;;;;;;;;;;;:::i;:::-;4673:103;;;;;4775:1;4754:5;-1:-1:-1;;;;;4746:26:13;;:30;4673:103;4666:110;4205:578;-1:-1:-1;;;;;4205:578:13:o;3075:629::-;3494:23;3520:33;-1:-1:-1;;;;;3520:27:13;;3548:4;3520:27;:33::i;:::-;3494:59;;3567:10;:17;3588:1;3567:22;;:57;;;;;3605:10;3594:30;;;;;;;;;;;;:::i;:::-;3593:31;3567:57;3563:135;;;3647:40;;-1:-1:-1;;;3647:40:13;;-1:-1:-1;;;;;3264:32:17;;3647:40:13;;;3246:51:17;3219:18;;3647:40:13;3076:227:17;2705:151:0;2780:12;2811:38;2833:6;2841:4;2847:1;2780:12;3421;3435:23;3462:6;-1:-1:-1;;;;;3462:11:0;3481:5;3488:4;3462:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3420:73;;;;3510:55;3537:6;3545:7;3554:10;3510:26;:55::i;:::-;3503:62;3180:392;-1:-1:-1;;;;;;3180:392:0:o;4625:582::-;4769:12;4798:7;4793:408;;4821:19;4829:10;4821:7;:19::i;:::-;4793:408;;;5045:17;;:22;:49;;;;-1:-1:-1;;;;;;5071:18:0;;;:23;5045:49;5041:119;;;5121:24;;-1:-1:-1;;;5121:24:0;;-1:-1:-1;;;;;3264:32:17;;5121:24:0;;;3246:51:17;3219:18;;5121:24:0;3076:227:17;5041:119:0;-1:-1:-1;5180:10:0;5173:17;;5743:516;5874:17;;:21;5870:383;;6102:10;6096:17;6158:15;6145:10;6141:2;6137:19;6130:44;5870:383;6225:17;;-1:-1:-1;;;6225:17:0;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:17;-1:-1:-1;;;;;89:31:17;;79:42;;69:70;;135:1;132;125:12;150:118;236:5;229:13;222:21;215:5;212:32;202:60;;258:1;255;248:12;273:382;338:6;346;399:2;387:9;378:7;374:23;370:32;367:52;;;415:1;412;405:12;367:52;454:9;441:23;473:31;498:5;473:31;:::i;:::-;523:5;-1:-1:-1;580:2:17;565:18;;552:32;593:30;552:32;593:30;:::i;:::-;642:7;632:17;;;273:382;;;;;:::o;660:250::-;745:1;755:113;769:6;766:1;763:13;755:113;;;845:11;;;839:18;826:11;;;819:39;791:2;784:10;755:113;;;-1:-1:-1;;902:1:17;884:16;;877:27;660:250::o;915:396::-;1064:2;1053:9;1046:21;1027:4;1096:6;1090:13;1139:6;1134:2;1123:9;1119:18;1112:34;1155:79;1227:6;1222:2;1211:9;1207:18;1202:2;1194:6;1190:15;1155:79;:::i;:::-;1295:2;1274:15;-1:-1:-1;;1270:29:17;1255:45;;;;1302:2;1251:54;;915:396;-1:-1:-1;;915:396:17:o;1316:315::-;1384:6;1392;1445:2;1433:9;1424:7;1420:23;1416:32;1413:52;;;1461:1;1458;1451:12;1413:52;1500:9;1487:23;1519:31;1544:5;1519:31;:::i;:::-;1569:5;1621:2;1606:18;;;;1593:32;;-1:-1:-1;;;1316:315:17:o;2010:159::-;2077:20;;2137:6;2126:18;;2116:29;;2106:57;;2159:1;2156;2149:12;2106:57;2010:159;;;:::o;2174:184::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:28;2342:9;2324:28;:::i;2363:247::-;2422:6;2475:2;2463:9;2454:7;2450:23;2446:32;2443:52;;;2491:1;2488;2481:12;2443:52;2530:9;2517:23;2549:31;2574:5;2549:31;:::i;2615:456::-;2692:6;2700;2708;2761:2;2749:9;2740:7;2736:23;2732:32;2729:52;;;2777:1;2774;2767:12;2729:52;2816:9;2803:23;2835:31;2860:5;2835:31;:::i;:::-;2885:5;-1:-1:-1;2942:2:17;2927:18;;2914:32;2955:33;2914:32;2955:33;:::i;:::-;2615:456;;3007:7;;-1:-1:-1;;;3061:2:17;3046:18;;;;3033:32;;2615:456::o;3308:180::-;3367:6;3420:2;3408:9;3399:7;3395:23;3391:32;3388:52;;;3436:1;3433;3426:12;3388:52;-1:-1:-1;3459:23:17;;3308:180;-1:-1:-1;3308:180:17:o;3875:388::-;3943:6;3951;4004:2;3992:9;3983:7;3979:23;3975:32;3972:52;;;4020:1;4017;4010:12;3972:52;4059:9;4046:23;4078:31;4103:5;4078:31;:::i;:::-;4128:5;-1:-1:-1;4185:2:17;4170:18;;4157:32;4198:33;4157:32;4198:33;:::i;4503:328::-;4577:6;4585;4593;4646:2;4634:9;4625:7;4621:23;4617:32;4614:52;;;4662:1;4659;4652:12;4614:52;4685:28;4703:9;4685:28;:::i;:::-;4675:38;;4732:37;4765:2;4754:9;4750:18;4732:37;:::i;:::-;4722:47;;4788:37;4821:2;4810:9;4806:18;4788:37;:::i;:::-;4778:47;;4503:328;;;;;:::o;6003:380::-;6082:1;6078:12;;;;6125;;;6146:61;;6200:4;6192:6;6188:17;6178:27;;6146:61;6253:2;6245:6;6242:14;6222:18;6219:38;6216:161;;6299:10;6294:3;6290:20;6287:1;6280:31;6334:4;6331:1;6324:15;6362:4;6359:1;6352:15;6216:161;;6003:380;;;:::o;6388:184::-;6458:6;6511:2;6499:9;6490:7;6486:23;6482:32;6479:52;;;6527:1;6524;6517:12;6479:52;-1:-1:-1;6550:16:17;;6388:184;-1:-1:-1;6388:184:17:o;6992:245::-;7059:6;7112:2;7100:9;7091:7;7087:23;7083:32;7080:52;;;7128:1;7125;7118:12;7080:52;7160:9;7154:16;7179:28;7201:5;7179:28;:::i;7242:127::-;7303:10;7298:3;7294:20;7291:1;7284:31;7334:4;7331:1;7324:15;7358:4;7355:1;7348:15;7374:127;7435:10;7430:3;7426:20;7423:1;7416:31;7466:4;7463:1;7456:15;7490:4;7487:1;7480:15;7506:171;7574:6;7613:10;;;7601;;;7597:27;;7636:12;;;7633:38;;;7651:18;;:::i;:::-;7633:38;7506:171;;;;:::o;7682:168::-;7749:6;7775:10;;;7787;;;7771:27;;7810:11;;;7807:37;;;7824:18;;:::i;8225:681::-;8356:6;8364;8372;8380;8388;8396;8404;8412;8465:3;8453:9;8444:7;8440:23;8436:33;8433:53;;;8482:1;8479;8472:12;8433:53;8514:9;8508:16;8533:31;8558:5;8533:31;:::i;:::-;8583:5;8573:15;;;8628:2;8617:9;8613:18;8607:25;8597:35;;8672:2;8661:9;8657:18;8651:25;8641:35;;8716:2;8705:9;8701:18;8695:25;8685:35;;8760:3;8749:9;8745:19;8739:26;8729:36;;8805:3;8794:9;8790:19;8784:26;8774:36;;8850:3;8839:9;8835:19;8829:26;8819:36;;8895:3;8884:9;8880:19;8874:26;8864:36;;8225:681;;;;;;;;;;;:::o;8911:168::-;8984:9;;;9015;;9032:15;;;9026:22;;9012:37;9002:71;;9053:18;;:::i;9084:217::-;9124:1;9150;9140:132;;9194:10;9189:3;9185:20;9182:1;9175:31;9229:4;9226:1;9219:15;9257:4;9254:1;9247:15;9140:132;-1:-1:-1;9286:9:17;;9084:217::o;9306:125::-;9371:9;;;9392:10;;;9389:36;;;9405:18;;:::i;9436:245::-;9515:6;9523;9576:2;9564:9;9555:7;9551:23;9547:32;9544:52;;;9592:1;9589;9582:12;9544:52;-1:-1:-1;;9615:16:17;;9671:2;9656:18;;;9650:25;9615:16;;9650:25;;-1:-1:-1;9436:245:17:o;10396:251::-;10466:6;10519:2;10507:9;10498:7;10494:23;10490:32;10487:52;;;10535:1;10532;10525:12;10487:52;10567:9;10561:16;10586:31;10611:5;10586:31;:::i;10961:128::-;11028:9;;;11049:11;;;11046:37;;;11063:18;;:::i;11505:980::-;11767:4;11815:3;11804:9;11800:19;11846:6;11835:9;11828:25;11872:2;11910:6;11905:2;11894:9;11890:18;11883:34;11953:3;11948:2;11937:9;11933:18;11926:31;11977:6;12012;12006:13;12043:6;12035;12028:22;12081:3;12070:9;12066:19;12059:26;;12120:2;12112:6;12108:15;12094:29;;12141:1;12151:195;12165:6;12162:1;12159:13;12151:195;;;12230:13;;-1:-1:-1;;;;;12226:39:17;12214:52;;12321:15;;;;12286:12;;;;12262:1;12180:9;12151:195;;;-1:-1:-1;;;;;;;12402:32:17;;;;12397:2;12382:18;;12375:60;-1:-1:-1;;;12466:3:17;12451:19;12444:35;12363:3;11505:980;-1:-1:-1;;;11505:980:17:o;12777:287::-;12906:3;12944:6;12938:13;12960:66;13019:6;13014:3;13007:4;12999:6;12995:17;12960:66;:::i;:::-;13042:16;;;;;12777:287;-1:-1:-1;;12777:287:17:o
Swarm Source
ipfs://b955f356a1f093c6d7ac0d6c8303d44d0a13d9747085d9e4154ec1ae7aa6efa1
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.