Source Code
EVM
Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 21039747 | 111 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
StratToken
Compiler Version
v0.8.30+commit.73712a01
Optimization Enabled:
No with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "../interfaces/IUniswapV2Router02.sol";
interface IUniswapV2Factory {
function createPair(
address tokenA,
address tokenB
) external returns (address);
function getPair(
address tokenA,
address tokenB
) external view returns (address);
}
interface IFeeCollector {
function receiveETH() external payable;
}
contract StratToken is ERC20, Ownable, ReentrancyGuard {
// ====== Configuration ======
uint16 public constant MAX_FEE_BPS = 9500; // 95% hard cap
uint16 public constant BPS_DENOM = 10000; // 100% in basis points
uint16 public constant OPS_SHARE_BPS = 2000; // 20% of ETH to ops
uint16 public constant COLLECTOR_SHARE_BPS = 8000; // 80% of ETH to collector
uint16 public totalFeeBps = 9500; // 95% start total fee
address payable public opsWallet;
address payable public coordinator;
address public feeCollector;
address public buybackManager;
IUniswapV2Router02 public router;
address public pair; // Uniswap V2 pair (market)
address public WETH;
bool public tradingEnabled = false;
mapping(address => bool) public feeExempt;
mapping(address => bool) public isMarket; // mark the pair
// swap-back for accumulated tokens
bool public swapEnabled = true;
bool private inSwap;
uint256 public swapThreshold = 200000 * 10 ** 18; // tokens threshold
uint256 public maxSwapAmount = 250000 * 10 ** 18; // tokens max per swap
// anti-whale limits
uint256 public maxWallet; // in token wei
uint256 public maxTx; // in token wei
bool public limitsEnabled = true;
mapping(address => bool) public limitExempt;
// Total fees collected
// Total ETH from fees (in wei)
uint256 public totalETHFromFees;
// ====== Events ======
event FeeTaken(uint256 amount, address from);
event SwapBackExecuted(
uint256 tokensSold,
uint256 ethReceived,
uint256 toOps,
uint256 toCollector
);
event FeesUpdated(uint16 totalFeeBps);
event CoordinatorUpdated(address indexed newCoordinator);
event WalletsUpdated(
address indexed opsWallet,
address indexed feeCollector,
address indexed buybackManager
);
event MarketSet(address indexed account, bool isMarket);
event FeeExemptSet(address indexed account, bool isExempt);
event TradingEnabled();
event SwapSettingsSet(uint256 threshold, uint256 maxSwap, bool enabled);
event LimitsUpdated(uint256 maxTx, uint256 maxWallet, bool enabled);
event LimitExemptSet(address indexed account, bool isExempt);
event SwapErrorDetails(string reason, bytes data);
// ====== Errors ======
error TradingDisabled();
error ZeroAddress();
error FeeTooHigh();
error MaxTxExceeded();
error MaxWalletExceeded();
error SwapFailed();
error InvalidInput();
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
modifier onlyCoordinatorOrOwner() {
require(
msg.sender == owner() || msg.sender == coordinator,
"Not authorized"
);
_;
}
constructor(
string memory name_,
string memory symbol_,
uint256 initialSupply,
address payable opsWallet_,
address feeCollector_,
address buybackManager_,
address router_,
address weth_
) ERC20(name_, symbol_) Ownable(msg.sender) {
if (
opsWallet_ == address(0) ||
feeCollector_ == address(0) ||
router_ == address(0) ||
weth_ == address(0)
) revert ZeroAddress();
opsWallet = opsWallet_;
feeCollector = feeCollector_;
buybackManager = buybackManager_; // Can be zero initially
router = IUniswapV2Router02(router_);
WETH = weth_;
// Create the V2 pair (token <-> WETH)
pair = address(0); // Will be created after deployment
// Mint supply to deployer
_mint(msg.sender, initialSupply);
// Fee exemptions
feeExempt[address(this)] = true;
feeExempt[msg.sender] = true;
feeExempt[opsWallet] = true;
feeExempt[feeCollector] = true;
if (buybackManager_ != address(0)) {
feeExempt[buybackManager_] = true;
}
// Anti-whale limits: 2% max wallet, 1% max tx
maxWallet = (initialSupply * 2) / 100; // 2% of supply
maxTx = (initialSupply * 1) / 100; // 1% of supply
// Limit exemptions
limitExempt[owner()] = true;
limitExempt[address(this)] = true;
limitExempt[opsWallet] = true;
limitExempt[feeCollector] = true;
if (buybackManager_ != address(0)) {
limitExempt[buybackManager_] = true;
}
}
// ====== Core transfer with fees ======
function _update(
address from,
address to,
uint256 amount
) internal override {
// Cache state variables to save gas
bool _tradingEnabled = tradingEnabled;
bool _swapEnabled = swapEnabled;
bool _inSwap = inSwap;
uint16 _totalFeeBps = totalFeeBps;
// Owner can always move pre-launch
if (!_tradingEnabled && from != owner() && to != owner()) {
revert TradingDisabled();
}
bool marketFrom = isMarket[from];
bool marketTo = isMarket[to];
uint256 feeAmount = (amount * _totalFeeBps) / BPS_DENOM;
uint256 transferAmount = amount - feeAmount;
// Apply anti-whale limits first
_enforceTransactionLimits(
from,
to,
transferAmount,
marketFrom,
marketTo
);
// Cache fee exemption status
bool fromExempt = feeExempt[from];
bool toExempt = feeExempt[to];
// Determine if fee should be taken
bool shouldTakeFee = _tradingEnabled &&
!fromExempt &&
!toExempt &&
(marketFrom || marketTo);
// Execute swap-back on sells
if (_swapEnabled && !_inSwap && marketTo && from != address(this)) {
_swapBack();
}
// Process transfer with or without fees
if (!shouldTakeFee) {
super._update(from, to, amount);
return;
}
super._update(from, to, transferAmount);
super._update(from, address(this), feeAmount);
emit FeeTaken(feeAmount, from);
}
/**
* @dev Internal function to swap tokens for ETH via Uniswap
* @param tokenAmount Amount of tokens to swap
* @return ethOut Amount of ETH received from swap
*/
function _internalSwap(
uint256 tokenAmount
) private returns (uint256 ethOut) {
if (inSwap) {
return 0;
}
inSwap = true;
_approve(address(this), address(router), tokenAmount);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
uint256 balanceBefore = address(this).balance;
try
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp + 300
)
{
ethOut = address(this).balance - balanceBefore;
} catch {
ethOut = 0;
}
inSwap = false;
return ethOut;
}
// split ETH to ops n collector
function _distributeETH(uint256 ethAmount) private {
if (ethAmount == 0) return;
// Update total ETH from fees
totalETHFromFees += ethAmount;
uint256 toOps = (ethAmount * OPS_SHARE_BPS) / BPS_DENOM;
uint256 toCoordinator = (toOps * 15) / 100; // 15% from toOps
toOps = toOps - toCoordinator;
uint256 toCollector = ethAmount - toOps - toCoordinator;
// send ETH to ops wallet
if (toOps > 0) {
(bool success, ) = opsWallet.call{value: toOps}("");
if (!success) revert SwapFailed();
}
// send ETH to fee collector
if (toCollector > 0) {
try IFeeCollector(feeCollector).receiveETH{value: toCollector}() {
// Success
} catch {
// Fallback
(bool success, ) = feeCollector.call{value: toCollector}("");
if (!success) revert SwapFailed();
}
}
if (toCoordinator > 0) {
(bool success, ) = coordinator.call{value: toCoordinator}("");
if (!success) revert SwapFailed();
}
}
// ====== Anti-whale limit enforcement ======
function _enforceTransactionLimits(
address from,
address to,
uint256 amount,
bool marketFrom,
bool marketTo
) private view {
// Ignore internal/contract flows to avoid maxTx reverts during swapback
if (inSwap || from == address(this) || to == address(this)) {
return;
}
if (!limitsEnabled || !tradingEnabled) {
return;
}
// Only skip when BOTH sides are exempt (owner<->treasury moves, etc.)
if (limitExempt[from] && limitExempt[to]) {
return;
}
// Check max transaction limit
if (amount > maxTx) revert MaxTxExceeded();
// Check max wallet limit for recipients (except when selling to pair)
if (!marketTo && to != address(0)) {
uint256 potentialFee = 0;
bool hasMarketFee = !feeExempt[from] &&
!feeExempt[to] &&
(marketFrom || marketTo);
if (hasMarketFee) {
potentialFee = (amount * totalFeeBps) / BPS_DENOM;
}
uint256 finalAmount = amount - potentialFee;
if (balanceOf(to) + finalAmount > maxWallet)
revert MaxWalletExceeded();
}
}
// Swap-back
function _swapBack() private lockTheSwap nonReentrant {
if (pair == address(0)) return;
uint256 tokenBal = balanceOf(address(this));
if (tokenBal < swapThreshold) return;
uint256 amountToSwap = tokenBal > maxSwapAmount
? maxSwapAmount
: tokenBal;
// approve router
_approve(address(this), address(router), amountToSwap);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
uint256 pre = address(this).balance;
try
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSwap,
0,
path,
address(this),
block.timestamp + 300
)
{
uint256 got = address(this).balance - pre;
if (got > 0) {
uint256 toOps = (got * OPS_SHARE_BPS) / BPS_DENOM;
uint256 toCollector = got - toOps;
_distributeETH(got);
emit SwapBackExecuted(amountToSwap, got, toOps, toCollector);
}
} catch {
// Swap failed, tokens remain in contract for next attempt
}
}
// ====== Admin Functions ======
/**
* @notice Create Uniswap V2 pair after deployment
* @dev Must be called before enabling trading
*/
function createPair() external onlyOwner {
if (pair != address(0)) revert InvalidInput();
address factory = router.factory();
address existingPair = IUniswapV2Factory(factory).getPair(
address(this),
WETH
);
if (existingPair != address(0)) {
pair = existingPair;
} else {
pair = IUniswapV2Factory(factory).createPair(address(this), WETH);
}
isMarket[pair] = true;
emit MarketSet(pair, true);
}
/**
* @notice Enables trading after initial setup
*/
function enableTrading() external onlyOwner {
tradingEnabled = true;
emit TradingEnabled();
}
/**
* @notice Updates the total transfer fee (basis points)
* @param newTotal New fee in basis points (max 1000)
*/
function setFeeBps(uint16 newTotal) external onlyOwner {
if (newTotal > MAX_FEE_BPS) revert FeeTooHigh();
totalFeeBps = newTotal;
emit FeesUpdated(newTotal);
}
function manualSwap(
uint256 amount
) external onlyCoordinatorOrOwner lockTheSwap nonReentrant {
uint256 bal = balanceOf(address(this));
if (amount == 0 || amount > bal) amount = bal;
if (bal == 0) return;
_approve(address(this), address(router), amount);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
uint256 pre = address(this).balance;
try
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amount,
0,
path,
address(this),
block.timestamp + 300
)
{
uint256 got = address(this).balance - pre;
if (got > 0) {
_distributeETH(got);
}
} catch {
revert SwapFailed();
}
}
function setRouter(address newRouter) external onlyOwner {
if (newRouter == address(0)) revert ZeroAddress();
router = IUniswapV2Router02(newRouter);
WETH = router.WETH();
}
function setCoordinator(address payable newCoordinator) external onlyOwner {
require(newCoordinator != address(0), "Zero address");
coordinator = newCoordinator;
emit CoordinatorUpdated(newCoordinator);
}
// ====== View Functions ======
function getCirculatingSupply() external view returns (uint256) {
return
totalSupply() -
balanceOf(address(0)) -
balanceOf(address(0x000000000000000000000000000000000000dEaD));
}
function isExcludedFromFee(address account) external view returns (bool) {
return feeExempt[account];
}
function isExcludedFromLimit(address account) external view returns (bool) {
return limitExempt[account];
}
function getTokensInContract() external view returns (uint256) {
return balanceOf(address(this));
}
function getTotalETHFromFees() external view returns (uint256) {
return totalETHFromFees;
}
// ====== Receive ETH ======
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/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 ERC-20
* applications.
*/
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}.
*
* Both 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;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
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;
}
/// @inheritdoc IERC20
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}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* 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:
*
* ```solidity
* 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) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IUniswapV2Router02 {
function factory() external pure returns (address);
function WETH() external view returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
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 getAmountsOut(uint amountIn, address[] calldata path)
external view returns (uint[] memory amounts);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external payable returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external returns (uint[] memory amounts);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 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.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 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 ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-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 ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 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);
}{
"remappings": [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
"forge-std/=lib/forge-std/src/",
"halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": false,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address payable","name":"opsWallet_","type":"address"},{"internalType":"address","name":"feeCollector_","type":"address"},{"internalType":"address","name":"buybackManager_","type":"address"},{"internalType":"address","name":"router_","type":"address"},{"internalType":"address","name":"weth_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"FeeTooHigh","type":"error"},{"inputs":[],"name":"InvalidInput","type":"error"},{"inputs":[],"name":"MaxTxExceeded","type":"error"},{"inputs":[],"name":"MaxWalletExceeded","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":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[],"name":"TradingDisabled","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"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":"newCoordinator","type":"address"}],"name":"CoordinatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"FeeExemptSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"FeeTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"totalFeeBps","type":"uint16"}],"name":"FeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"LimitExemptSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"LimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isMarket","type":"bool"}],"name":"MarketSet","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":"uint256","name":"tokensSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toOps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toCollector","type":"uint256"}],"name":"SwapBackExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"SwapErrorDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSwap","type":"uint256"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapSettingsSet","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"opsWallet","type":"address"},{"indexed":true,"internalType":"address","name":"feeCollector","type":"address"},{"indexed":true,"internalType":"address","name":"buybackManager","type":"address"}],"name":"WalletsUpdated","type":"event"},{"inputs":[],"name":"BPS_DENOM","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTOR_SHARE_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPS_SHARE_BPS","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"buybackManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coordinator","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokensInContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalETHFromFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarket","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"limitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opsWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newCoordinator","type":"address"}],"name":"setCoordinator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newTotal","type":"uint16"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalETHFromFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405261251c60075f6101000a81548161ffff021916908361ffff1602179055505f600d60146101000a81548160ff021916908315150217905550600160105f6101000a81548160ff021916908315150217905550692a5a058fc295ed0000006011556934f086f3b33b68400000601255600160155f6101000a81548160ff021916908315150217905550348015610097575f5ffd5b50604051615fae380380615fae83398181016040528101906100b99190611e4c565b33888881600390816100cb919061213c565b5080600490816100db919061213c565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361014e575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610145919061221a565b60405180910390fd5b61015d8161089760201b60201c565b5060016006819055505f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806101cb57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8061020157505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061023757505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1561026e576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84600760026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103ff338761095a60201b60201c565b6001600e5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600e5f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600e5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461061f576001600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b606460028761062e9190612260565b61063891906122ce565b601381905550606460018761064d9190612260565b61065791906122ce565b601481905550600160165f6106706109df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160165f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160165f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160165f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461088a57600160165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b50505050505050506125e1565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109ca575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016109c1919061221a565b60405180910390fd5b6109db5f8383610a0760201b60201c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600d60149054906101000a900460ff1690505f60105f9054906101000a900460ff1690505f601060019054906101000a900460ff1690505f60075f9054906101000a900461ffff16905083158015610a995750610a696109df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b8015610ade5750610aae6109df60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15610b15576040517fbcb8b8fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f61271061ffff168461ffff1689610bc79190612260565b610bd191906122ce565b90505f8189610be091906122fe565b9050610bf58b8b838787610daa60201b60201c565b5f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f8a8015610c9b575082155b8015610ca5575081155b8015610cb657508680610cb55750855b5b9050898015610cc3575088155b8015610ccc5750855b8015610d0457503073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614155b15610d1857610d176110d060201b60201c565b5b80610d3e57610d2e8e8e8e61142f60201b60201c565b5050505050505050505050610da5565b610d4f8e8e8661142f60201b60201c565b610d608e308761142f60201b60201c565b7f0dec4d9696755d06066685c7df867851d2d13a61c8c68e440b7180ff81005758858f604051610d91929190612340565b60405180910390a150505050505050505050505b505050565b601060019054906101000a900460ff1680610df057503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b80610e2657503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6110c95760155f9054906101000a900460ff161580610e525750600d60149054906101000a900460ff16155b6110c95760165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015610ef2575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6110c957601454831115610f32576040517f4db0008c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80158015610f6c57505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b156110c8575f5f90505f600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156110145750600e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015611025575083806110245750825b5b905080156110605761271061ffff1660075f9054906101000a900461ffff1661ffff16866110539190612260565b61105d91906122ce565b91505b5f828661106d91906122fe565b9050601354816110828961164860201b60201c565b61108c9190612367565b11156110c4576040517f2ce93b5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5b5050505050565b6001601060016101000a81548160ff0219169083151502179055506110f961168d60201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160315611405575f61115e3061164860201b60201c565b90506011548110156111705750611405565b5f60125482116111805781611184565b6012545b90506111b830600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836116d360201b60201c565b5f600267ffffffffffffffff8111156111d4576111d3611c60565b5b6040519080825280602002602001820160405280156112025781602001602082028036833780820191505090505b50905030815f815181106112195761121861239a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106112895761128861239a565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f479050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f853061012c426113169190612367565b6040518663ffffffff1660e01b81526004016113369594939291906124b7565b5f604051808303815f87803b15801561134d575f5ffd5b505af192505050801561135e575060015b15611400575f814761137091906122fe565b90505f8111156113fe575f61271061ffff166107d061ffff16836113949190612260565b61139e91906122ce565b90505f81836113ad91906122fe565b90506113be836116eb60201b60201c565b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f868484846040516113f3949392919061250f565b60405180910390a150505b505b505050505b611413611a5e60201b60201c565b5f601060016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361147f578060025f8282546114739190612367565b9250508190555061154d565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611508578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016114ff93929190612552565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611594578060025f82825403925050819055506115de565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161163b9190612587565b60405180910390a3505050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6002600654036116c9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b6116e68383836001611a6860201b60201c565b505050565b5f810315611a5b578060175f8282546117049190612367565b925050819055505f61271061ffff166107d061ffff16836117259190612260565b61172f91906122ce565b90505f6064600f836117419190612260565b61174b91906122ce565b9050808261175991906122fe565b91505f81838561176991906122fe565b61177391906122fe565b90505f831115611840575f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16846040516117c4906125cd565b5f6040518083038185875af1925050503d805f81146117fe576040519150601f19603f3d011682016040523d82523d5f602084013e611803565b606091505b505090508061183e576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f81111561198d5760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ecfd51e826040518263ffffffff1660e01b81526004015f604051808303818588803b1580156118af575f5ffd5b505af1935050505080156118c1575060015b61198b575f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161190b906125cd565b5f6040518083038185875af1925050503d805f8114611945576040519150601f19603f3d011682016040523d82523d5f602084013e61194a565b606091505b5050905080611985576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061198c565b5b5b5f821115611a57575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516119db906125cd565b5f6040518083038185875af1925050503d805f8114611a15576040519150601f19603f3d011682016040523d82523d5f602084013e611a1a565b606091505b5050905080611a55576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5050505b50565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ad8575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611acf919061221a565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b48575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b3f919061221a565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c31578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c289190612587565b60405180910390a35b50505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611c9682611c50565b810181811067ffffffffffffffff82111715611cb557611cb4611c60565b5b80604052505050565b5f611cc7611c37565b9050611cd38282611c8d565b919050565b5f67ffffffffffffffff821115611cf257611cf1611c60565b5b611cfb82611c50565b9050602081019050919050565b8281835e5f83830152505050565b5f611d28611d2384611cd8565b611cbe565b905082815260208101848484011115611d4457611d43611c4c565b5b611d4f848285611d08565b509392505050565b5f82601f830112611d6b57611d6a611c48565b5b8151611d7b848260208601611d16565b91505092915050565b5f819050919050565b611d9681611d84565b8114611da0575f5ffd5b50565b5f81519050611db181611d8d565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611de082611db7565b9050919050565b611df081611dd6565b8114611dfa575f5ffd5b50565b5f81519050611e0b81611de7565b92915050565b5f611e1b82611db7565b9050919050565b611e2b81611e11565b8114611e35575f5ffd5b50565b5f81519050611e4681611e22565b92915050565b5f5f5f5f5f5f5f5f610100898b031215611e6957611e68611c40565b5b5f89015167ffffffffffffffff811115611e8657611e85611c44565b5b611e928b828c01611d57565b985050602089015167ffffffffffffffff811115611eb357611eb2611c44565b5b611ebf8b828c01611d57565b9750506040611ed08b828c01611da3565b9650506060611ee18b828c01611dfd565b9550506080611ef28b828c01611e38565b94505060a0611f038b828c01611e38565b93505060c0611f148b828c01611e38565b92505060e0611f258b828c01611e38565b9150509295985092959890939650565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611f8357607f821691505b602082108103611f9657611f95611f3f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611ff87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611fbd565b6120028683611fbd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61203d61203861203384611d84565b61201a565b611d84565b9050919050565b5f819050919050565b61205683612023565b61206a61206282612044565b848454611fc9565b825550505050565b5f5f905090565b612081612072565b61208c81848461204d565b505050565b5b818110156120af576120a45f82612079565b600181019050612092565b5050565b601f8211156120f4576120c581611f9c565b6120ce84611fae565b810160208510156120dd578190505b6120f16120e985611fae565b830182612091565b50505b505050565b5f82821c905092915050565b5f6121145f19846008026120f9565b1980831691505092915050565b5f61212c8383612105565b9150826002028217905092915050565b61214582611f35565b67ffffffffffffffff81111561215e5761215d611c60565b5b6121688254611f6c565b6121738282856120b3565b5f60209050601f8311600181146121a4575f8415612192578287015190505b61219c8582612121565b865550612203565b601f1984166121b286611f9c565b5f5b828110156121d9578489015182556001820191506020850194506020810190506121b4565b868310156121f657848901516121f2601f891682612105565b8355505b6001600288020188555050505b505050505050565b61221481611e11565b82525050565b5f60208201905061222d5f83018461220b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61226a82611d84565b915061227583611d84565b925082820261228381611d84565b9150828204841483151761229a57612299612233565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6122d882611d84565b91506122e383611d84565b9250826122f3576122f26122a1565b5b828204905092915050565b5f61230882611d84565b915061231383611d84565b925082820390508181111561232b5761232a612233565b5b92915050565b61233a81611d84565b82525050565b5f6040820190506123535f830185612331565b612360602083018461220b565b9392505050565b5f61237182611d84565b915061237c83611d84565b925082820190508082111561239457612393612233565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f6123ea6123e56123e0846123c7565b61201a565b611d84565b9050919050565b6123fa816123d0565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61243281611e11565b82525050565b5f6124438383612429565b60208301905092915050565b5f602082019050919050565b5f61246582612400565b61246f818561240a565b935061247a8361241a565b805f5b838110156124aa5781516124918882612438565b975061249c8361244f565b92505060018101905061247d565b5085935050505092915050565b5f60a0820190506124ca5f830188612331565b6124d760208301876123f1565b81810360408301526124e9818661245b565b90506124f8606083018561220b565b6125056080830184612331565b9695505050505050565b5f6080820190506125225f830187612331565b61252f6020830186612331565b61253c6040830185612331565b6125496060830184612331565b95945050505050565b5f6060820190506125655f83018661220b565b6125726020830185612331565b61257f6040830184612331565b949350505050565b5f60208201905061259a5f830184612331565b92915050565b5f81905092915050565b50565b5f6125b85f836125a0565b91506125c3826125aa565b5f82019050919050565b5f6125d7826125ad565b9150819050919050565b6139c0806125ee5f395ff3fe608060405260043610610280575f3560e01c80638a8c523c1161014e578063c415b95c116100c0578063dd62ed3e11610079578063dd62ed3e14610979578063e3a3b488146109b5578063f2fde38b146109df578063f887ea4014610a07578063f8b45b0514610a31578063fd076d5614610a5b57610287565b8063c415b95c1461086b578063c56f84cf14610895578063cce987d4146108bf578063d50942fb146108e9578063d55be8c614610913578063d94160e01461093d57610287565b80639e78fb4f116101125780639e78fb4f14610775578063a8aa1b311461078b578063a9059cbb146107b5578063ad5c4648146107f1578063b70143c91461081b578063c0d786551461084357610287565b80638a8c523c146106b95780638d32ca8b146106cf5780638da5cb5b146106f95780638ea981171461072357806395d89b411461074b57610287565b8063398daa85116101f257806368db925a116101ab57806368db925a146105ad5780636ddd1713146105d75780636ec934da1461060157806370a082311461063d578063715018a6146106795780637437681e1461068f57610287565b8063398daa851461048d5780633c2f1806146104c95780634ada218b146104f35780635342acb41461051d5780635c3e156c146105595780636637e38c1461058357610287565b806318160ddd1161024457806318160ddd1461036d57806320a8d3fb1461039757806323b872dd146103d35780632b112e491461040f578063313ce567146104395780633582ad231461046357610287565b8063023b1fc91461028b5780630445b667146102b357806306fdde03146102dd578063095ea7b3146103075780630a0090971461034357610287565b3661028757005b5f5ffd5b348015610296575f5ffd5b506102b160048036038101906102ac9190612ff9565b610a85565b005b3480156102be575f5ffd5b506102c7610b27565b6040516102d4919061303c565b60405180910390f35b3480156102e8575f5ffd5b506102f1610b2d565b6040516102fe91906130c5565b60405180910390f35b348015610312575f5ffd5b5061032d60048036038101906103289190613169565b610bbd565b60405161033a91906131c1565b60405180910390f35b34801561034e575f5ffd5b50610357610bdf565b60405161036491906131fa565b60405180910390f35b348015610378575f5ffd5b50610381610c04565b60405161038e919061303c565b60405180910390f35b3480156103a2575f5ffd5b506103bd60048036038101906103b89190613213565b610c0d565b6040516103ca91906131c1565b60405180910390f35b3480156103de575f5ffd5b506103f960048036038101906103f4919061323e565b610c2a565b60405161040691906131c1565b60405180910390f35b34801561041a575f5ffd5b50610423610c58565b604051610430919061303c565b60405180910390f35b348015610444575f5ffd5b5061044d610c8e565b60405161045a91906132a9565b60405180910390f35b34801561046e575f5ffd5b50610477610c96565b60405161048491906131c1565b60405180910390f35b348015610498575f5ffd5b506104b360048036038101906104ae9190613213565b610ca8565b6040516104c091906131c1565b60405180910390f35b3480156104d4575f5ffd5b506104dd610cc5565b6040516104ea919061303c565b60405180910390f35b3480156104fe575f5ffd5b50610507610cd4565b60405161051491906131c1565b60405180910390f35b348015610528575f5ffd5b50610543600480360381019061053e9190613213565b610ce7565b60405161055091906131c1565b60405180910390f35b348015610564575f5ffd5b5061056d610d39565b60405161057a91906132d1565b60405180910390f35b34801561058e575f5ffd5b50610597610d3f565b6040516105a491906132d1565b60405180910390f35b3480156105b8575f5ffd5b506105c1610d45565b6040516105ce91906131fa565b60405180910390f35b3480156105e2575f5ffd5b506105eb610d6b565b6040516105f891906131c1565b60405180910390f35b34801561060c575f5ffd5b5061062760048036038101906106229190613213565b610d7d565b60405161063491906131c1565b60405180910390f35b348015610648575f5ffd5b50610663600480360381019061065e9190613213565b610d9a565b604051610670919061303c565b60405180910390f35b348015610684575f5ffd5b5061068d610ddf565b005b34801561069a575f5ffd5b506106a3610df2565b6040516106b0919061303c565b60405180910390f35b3480156106c4575f5ffd5b506106cd610df8565b005b3480156106da575f5ffd5b506106e3610e49565b6040516106f091906132f9565b60405180910390f35b348015610704575f5ffd5b5061070d610e6e565b60405161071a91906132f9565b60405180910390f35b34801561072e575f5ffd5b506107496004803603810190610744919061333c565b610e96565b005b348015610756575f5ffd5b5061075f610f92565b60405161076c91906130c5565b60405180910390f35b348015610780575f5ffd5b50610789611022565b005b348015610796575f5ffd5b5061079f61141d565b6040516107ac91906132f9565b60405180910390f35b3480156107c0575f5ffd5b506107db60048036038101906107d69190613169565b611442565b6040516107e891906131c1565b60405180910390f35b3480156107fc575f5ffd5b50610805611464565b60405161081291906132f9565b60405180910390f35b348015610826575f5ffd5b50610841600480360381019061083c9190613367565b611489565b005b34801561084e575f5ffd5b5061086960048036038101906108649190613213565b6117fa565b005b348015610876575f5ffd5b5061087f611977565b60405161088c91906132f9565b60405180910390f35b3480156108a0575f5ffd5b506108a961199c565b6040516108b691906132d1565b60405180910390f35b3480156108ca575f5ffd5b506108d36119af565b6040516108e0919061303c565b60405180910390f35b3480156108f4575f5ffd5b506108fd6119b5565b60405161090a919061303c565b60405180910390f35b34801561091e575f5ffd5b506109276119bb565b60405161093491906132d1565b60405180910390f35b348015610948575f5ffd5b50610963600480360381019061095e9190613213565b6119c1565b60405161097091906131c1565b60405180910390f35b348015610984575f5ffd5b5061099f600480360381019061099a9190613392565b611a13565b6040516109ac919061303c565b60405180910390f35b3480156109c0575f5ffd5b506109c9611a95565b6040516109d691906132d1565b60405180910390f35b3480156109ea575f5ffd5b50610a056004803603810190610a009190613213565b611a9b565b005b348015610a12575f5ffd5b50610a1b611b1f565b604051610a28919061342b565b60405180910390f35b348015610a3c575f5ffd5b50610a45611b44565b604051610a52919061303c565b60405180910390f35b348015610a66575f5ffd5b50610a6f611b4a565b604051610a7c919061303c565b60405180910390f35b610a8d611b53565b61251c61ffff168161ffff161115610ad1576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f6101000a81548161ffff021916908361ffff1602179055507fb50f6c85631b448ef50a9b0055afaff00e6d81ec0ebf056cd4bef2d8b32dbbbc81604051610b1c91906132d1565b60405180910390a150565b60115481565b606060038054610b3c90613471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6890613471565b8015610bb35780601f10610b8a57610100808354040283529160200191610bb3565b820191905f5260205f20905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b5f5f610bc7611bda565b9050610bd4818585611be1565b600191505092915050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b6016602052805f5260405f205f915054906101000a900460ff1681565b5f5f610c34611bda565b9050610c41858285611bf3565b610c4c858585611c86565b60019150509392505050565b5f610c6461dead610d9a565b610c6d5f610d9a565b610c75610c04565b610c7f91906134ce565b610c8991906134ce565b905090565b5f6012905090565b60155f9054906101000a900460ff1681565b600e602052805f5260405f205f915054906101000a900460ff1681565b5f610ccf30610d9a565b905090565b600d60149054906101000a900460ff1681565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6107d081565b61271081565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105f9054906101000a900460ff1681565b600f602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610de7611b53565b610df05f611d76565b565b60145481565b610e00611b53565b6001600d60146101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e9e611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061354b565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc258faa9a17ddfdf4130b4acff63a289202e7d5f9e42f366add65368575486bc60405160405180910390a250565b606060048054610fa190613471565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcd90613471565b80156110185780601f10610fef57610100808354040283529160200191611018565b820191905f5260205f20905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b61102a611b53565b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b0576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f919061357d565b90505f8173ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161119e9291906135a8565b602060405180830381865afa1580156111b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111dd919061357d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112575780600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611333565b8173ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016112b39291906135a8565b6020604051808303815f875af11580156112cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f3919061357d565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600f5f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fcc559bf3306c2e36782e6e3a163572adbd7bc62438d65eef8bd35bc76ae6194a600160405161141191906131c1565b60405180910390a25050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f61144c611bda565b9050611459818585611c86565b600191505092915050565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611491610e6e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611516575060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90613619565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550611578611e39565b5f61158230610d9a565b90505f82148061159157508082115b1561159a578091505b5f81036115a757506117d5565b6115d330600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611be1565b5f600267ffffffffffffffff8111156115ef576115ee613637565b5b60405190808252806020026020018201604052801561161d5781602001602082028036833780820191505090505b50905030815f8151811061163457611633613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106116a4576116a3613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f479050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947855f853061012c426117319190613691565b6040518663ffffffff1660e01b81526004016117519594939291906137b4565b5f604051808303815f87803b158015611768575f5ffd5b505af1925050508015611779575060015b6117af576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81476117bc91906134ce565b90505f8111156117d0576117cf81611e7f565b5b505050505b6117dd6121f2565b5f601060016101000a81548160ff02191690831515021790555050565b611802611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611867576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611911573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611935919061357d565b600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900461ffff1681565b60125481565b60175481565b61251c81565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611f4081565b611aa3611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b13575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611b0a91906132f9565b60405180910390fd5b611b1c81611d76565b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135481565b5f601754905090565b611b5b611bda565b73ffffffffffffffffffffffffffffffffffffffff16611b79610e6e565b73ffffffffffffffffffffffffffffffffffffffff1614611bd857611b9c611bda565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611bcf91906132f9565b60405180910390fd5b565b5f33905090565b611bee83838360016121fc565b505050565b5f611bfe8484611a13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611c805781811015611c71578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611c689392919061380c565b60405180910390fd5b611c7f84848484035f6121fc565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cf6575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ced91906132f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d66575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611d5d91906132f9565b60405180910390fd5b611d718383836123cb565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611e75576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f8103156121ef578060175f828254611e989190613691565b925050819055505f61271061ffff166107d061ffff1683611eb99190613841565b611ec391906138af565b90505f6064600f83611ed59190613841565b611edf91906138af565b90508082611eed91906134ce565b91505f818385611efd91906134ce565b611f0791906134ce565b90505f831115611fd4575f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051611f589061390c565b5f6040518083038185875af1925050503d805f8114611f92576040519150601f19603f3d011682016040523d82523d5f602084013e611f97565b606091505b5050905080611fd2576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f8111156121215760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ecfd51e826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612043575f5ffd5b505af193505050508015612055575060015b61211f575f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161209f9061390c565b5f6040518083038185875af1925050503d805f81146120d9576040519150601f19603f3d011682016040523d82523d5f602084013e6120de565b606091505b5050905080612119576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612120565b5b5b5f8211156121eb575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161216f9061390c565b5f6040518083038185875af1925050503d805f81146121a9576040519150601f19603f3d011682016040523d82523d5f602084013e6121ae565b606091505b50509050806121e9576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5050505b50565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361226c575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161226391906132f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122dc575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016122d391906132f9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156123c5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516123bc919061303c565b60405180910390a35b50505050565b5f600d60149054906101000a900460ff1690505f60105f9054906101000a900460ff1690505f601060019054906101000a900460ff1690505f60075f9054906101000a900461ffff169050831580156124575750612427610e6e565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156124965750612466610e6e565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156124cd576040517fbcb8b8fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f61271061ffff168461ffff168961257f9190613841565b61258991906138af565b90505f818961259891906134ce565b90506125a78b8b838787612744565b5f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f8a801561264d575082155b8015612657575081155b8015612668575086806126675750855b5b9050898015612675575088155b801561267e5750855b80156126b657503073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614155b156126c4576126c3612a64565b5b806126e4576126d48e8e8e612da5565b505050505050505050505061273f565b6126ef8e8e86612da5565b6126fa8e3087612da5565b7f0dec4d9696755d06066685c7df867851d2d13a61c8c68e440b7180ff81005758858f60405161272b929190613920565b60405180910390a150505050505050505050505b505050565b601060019054906101000a900460ff168061278a57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806127c057503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b612a5d5760155f9054906101000a900460ff1615806127ec5750600d60149054906101000a900460ff16155b612a5d5760165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561288c575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612a5d576014548311156128cc576040517f4db0008c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561290657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612a5c575f5f90505f600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156129ae5750600e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156129bf575083806129be5750825b5b905080156129fa5761271061ffff1660075f9054906101000a900461ffff1661ffff16866129ed9190613841565b6129f791906138af565b91505b5f8286612a0791906134ce565b905060135481612a1689610d9a565b612a209190613691565b1115612a58576040517f2ce93b5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5b5050505050565b6001601060016101000a81548160ff021916908315150217905550612a87611e39565b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160315612d81575f612ae630610d9a565b9050601154811015612af85750612d81565b5f6012548211612b085781612b0c565b6012545b9050612b3a30600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611be1565b5f600267ffffffffffffffff811115612b5657612b55613637565b5b604051908082528060200260200182016040528015612b845781602001602082028036833780820191505090505b50905030815f81518110612b9b57612b9a613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612c0b57612c0a613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f479050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f853061012c42612c989190613691565b6040518663ffffffff1660e01b8152600401612cb89594939291906137b4565b5f604051808303815f87803b158015612ccf575f5ffd5b505af1925050508015612ce0575060015b15612d7c575f8147612cf291906134ce565b90505f811115612d7a575f61271061ffff166107d061ffff1683612d169190613841565b612d2091906138af565b90505f8183612d2f91906134ce565b9050612d3a83611e7f565b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f86848484604051612d6f9493929190613947565b60405180910390a150505b505b505050505b612d896121f2565b5f601060016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612df5578060025f828254612de99190613691565b92505081905550612ec3565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e7e578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e759392919061380c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f0a578060025f8282540392505081905550612f54565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fb1919061303c565b60405180910390a3505050565b5f5ffd5b5f61ffff82169050919050565b612fd881612fc2565b8114612fe2575f5ffd5b50565b5f81359050612ff381612fcf565b92915050565b5f6020828403121561300e5761300d612fbe565b5b5f61301b84828501612fe5565b91505092915050565b5f819050919050565b61303681613024565b82525050565b5f60208201905061304f5f83018461302d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61309782613055565b6130a1818561305f565b93506130b181856020860161306f565b6130ba8161307d565b840191505092915050565b5f6020820190508181035f8301526130dd818461308d565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61310e826130e5565b9050919050565b61311e81613104565b8114613128575f5ffd5b50565b5f8135905061313981613115565b92915050565b61314881613024565b8114613152575f5ffd5b50565b5f813590506131638161313f565b92915050565b5f5f6040838503121561317f5761317e612fbe565b5b5f61318c8582860161312b565b925050602061319d85828601613155565b9150509250929050565b5f8115159050919050565b6131bb816131a7565b82525050565b5f6020820190506131d45f8301846131b2565b92915050565b5f6131e4826130e5565b9050919050565b6131f4816131da565b82525050565b5f60208201905061320d5f8301846131eb565b92915050565b5f6020828403121561322857613227612fbe565b5b5f6132358482850161312b565b91505092915050565b5f5f5f6060848603121561325557613254612fbe565b5b5f6132628682870161312b565b93505060206132738682870161312b565b925050604061328486828701613155565b9150509250925092565b5f60ff82169050919050565b6132a38161328e565b82525050565b5f6020820190506132bc5f83018461329a565b92915050565b6132cb81612fc2565b82525050565b5f6020820190506132e45f8301846132c2565b92915050565b6132f381613104565b82525050565b5f60208201905061330c5f8301846132ea565b92915050565b61331b816131da565b8114613325575f5ffd5b50565b5f8135905061333681613312565b92915050565b5f6020828403121561335157613350612fbe565b5b5f61335e84828501613328565b91505092915050565b5f6020828403121561337c5761337b612fbe565b5b5f61338984828501613155565b91505092915050565b5f5f604083850312156133a8576133a7612fbe565b5b5f6133b58582860161312b565b92505060206133c68582860161312b565b9150509250929050565b5f819050919050565b5f6133f36133ee6133e9846130e5565b6133d0565b6130e5565b9050919050565b5f613404826133d9565b9050919050565b5f613415826133fa565b9050919050565b6134258161340b565b82525050565b5f60208201905061343e5f83018461341c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061348857607f821691505b60208210810361349b5761349a613444565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134d882613024565b91506134e383613024565b92508282039050818111156134fb576134fa6134a1565b5b92915050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f613535600c8361305f565b915061354082613501565b602082019050919050565b5f6020820190508181035f83015261356281613529565b9050919050565b5f8151905061357781613115565b92915050565b5f6020828403121561359257613591612fbe565b5b5f61359f84828501613569565b91505092915050565b5f6040820190506135bb5f8301856132ea565b6135c860208301846132ea565b9392505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f613603600e8361305f565b915061360e826135cf565b602082019050919050565b5f6020820190508181035f830152613630816135f7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61369b82613024565b91506136a683613024565b92508282019050808211156136be576136bd6134a1565b5b92915050565b5f819050919050565b5f6136e76136e26136dd846136c4565b6133d0565b613024565b9050919050565b6136f7816136cd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61372f81613104565b82525050565b5f6137408383613726565b60208301905092915050565b5f602082019050919050565b5f613762826136fd565b61376c8185613707565b935061377783613717565b805f5b838110156137a757815161378e8882613735565b97506137998361374c565b92505060018101905061377a565b5085935050505092915050565b5f60a0820190506137c75f83018861302d565b6137d460208301876136ee565b81810360408301526137e68186613758565b90506137f560608301856132ea565b613802608083018461302d565b9695505050505050565b5f60608201905061381f5f8301866132ea565b61382c602083018561302d565b613839604083018461302d565b949350505050565b5f61384b82613024565b915061385683613024565b925082820261386481613024565b9150828204841483151761387b5761387a6134a1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138b982613024565b91506138c483613024565b9250826138d4576138d3613882565b5b828204905092915050565b5f81905092915050565b50565b5f6138f75f836138df565b9150613902826138e9565b5f82019050919050565b5f613916826138ec565b9150819050919050565b5f6040820190506139335f83018561302d565b61394060208301846132ea565b9392505050565b5f60808201905061395a5f83018761302d565b613967602083018661302d565b613974604083018561302d565b613981606083018461302d565b9594505050505056fea2646970667358221220d2cae2d379e0d707a776d24060b9096d4fc38571752e56c8b31f0e7cd7e2f10264736f6c634300081e0033000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef894000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef8940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c0000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809000000000000000000000000000000000000000000000000000000000000000a5374726174546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055354524154000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405260043610610280575f3560e01c80638a8c523c1161014e578063c415b95c116100c0578063dd62ed3e11610079578063dd62ed3e14610979578063e3a3b488146109b5578063f2fde38b146109df578063f887ea4014610a07578063f8b45b0514610a31578063fd076d5614610a5b57610287565b8063c415b95c1461086b578063c56f84cf14610895578063cce987d4146108bf578063d50942fb146108e9578063d55be8c614610913578063d94160e01461093d57610287565b80639e78fb4f116101125780639e78fb4f14610775578063a8aa1b311461078b578063a9059cbb146107b5578063ad5c4648146107f1578063b70143c91461081b578063c0d786551461084357610287565b80638a8c523c146106b95780638d32ca8b146106cf5780638da5cb5b146106f95780638ea981171461072357806395d89b411461074b57610287565b8063398daa85116101f257806368db925a116101ab57806368db925a146105ad5780636ddd1713146105d75780636ec934da1461060157806370a082311461063d578063715018a6146106795780637437681e1461068f57610287565b8063398daa851461048d5780633c2f1806146104c95780634ada218b146104f35780635342acb41461051d5780635c3e156c146105595780636637e38c1461058357610287565b806318160ddd1161024457806318160ddd1461036d57806320a8d3fb1461039757806323b872dd146103d35780632b112e491461040f578063313ce567146104395780633582ad231461046357610287565b8063023b1fc91461028b5780630445b667146102b357806306fdde03146102dd578063095ea7b3146103075780630a0090971461034357610287565b3661028757005b5f5ffd5b348015610296575f5ffd5b506102b160048036038101906102ac9190612ff9565b610a85565b005b3480156102be575f5ffd5b506102c7610b27565b6040516102d4919061303c565b60405180910390f35b3480156102e8575f5ffd5b506102f1610b2d565b6040516102fe91906130c5565b60405180910390f35b348015610312575f5ffd5b5061032d60048036038101906103289190613169565b610bbd565b60405161033a91906131c1565b60405180910390f35b34801561034e575f5ffd5b50610357610bdf565b60405161036491906131fa565b60405180910390f35b348015610378575f5ffd5b50610381610c04565b60405161038e919061303c565b60405180910390f35b3480156103a2575f5ffd5b506103bd60048036038101906103b89190613213565b610c0d565b6040516103ca91906131c1565b60405180910390f35b3480156103de575f5ffd5b506103f960048036038101906103f4919061323e565b610c2a565b60405161040691906131c1565b60405180910390f35b34801561041a575f5ffd5b50610423610c58565b604051610430919061303c565b60405180910390f35b348015610444575f5ffd5b5061044d610c8e565b60405161045a91906132a9565b60405180910390f35b34801561046e575f5ffd5b50610477610c96565b60405161048491906131c1565b60405180910390f35b348015610498575f5ffd5b506104b360048036038101906104ae9190613213565b610ca8565b6040516104c091906131c1565b60405180910390f35b3480156104d4575f5ffd5b506104dd610cc5565b6040516104ea919061303c565b60405180910390f35b3480156104fe575f5ffd5b50610507610cd4565b60405161051491906131c1565b60405180910390f35b348015610528575f5ffd5b50610543600480360381019061053e9190613213565b610ce7565b60405161055091906131c1565b60405180910390f35b348015610564575f5ffd5b5061056d610d39565b60405161057a91906132d1565b60405180910390f35b34801561058e575f5ffd5b50610597610d3f565b6040516105a491906132d1565b60405180910390f35b3480156105b8575f5ffd5b506105c1610d45565b6040516105ce91906131fa565b60405180910390f35b3480156105e2575f5ffd5b506105eb610d6b565b6040516105f891906131c1565b60405180910390f35b34801561060c575f5ffd5b5061062760048036038101906106229190613213565b610d7d565b60405161063491906131c1565b60405180910390f35b348015610648575f5ffd5b50610663600480360381019061065e9190613213565b610d9a565b604051610670919061303c565b60405180910390f35b348015610684575f5ffd5b5061068d610ddf565b005b34801561069a575f5ffd5b506106a3610df2565b6040516106b0919061303c565b60405180910390f35b3480156106c4575f5ffd5b506106cd610df8565b005b3480156106da575f5ffd5b506106e3610e49565b6040516106f091906132f9565b60405180910390f35b348015610704575f5ffd5b5061070d610e6e565b60405161071a91906132f9565b60405180910390f35b34801561072e575f5ffd5b506107496004803603810190610744919061333c565b610e96565b005b348015610756575f5ffd5b5061075f610f92565b60405161076c91906130c5565b60405180910390f35b348015610780575f5ffd5b50610789611022565b005b348015610796575f5ffd5b5061079f61141d565b6040516107ac91906132f9565b60405180910390f35b3480156107c0575f5ffd5b506107db60048036038101906107d69190613169565b611442565b6040516107e891906131c1565b60405180910390f35b3480156107fc575f5ffd5b50610805611464565b60405161081291906132f9565b60405180910390f35b348015610826575f5ffd5b50610841600480360381019061083c9190613367565b611489565b005b34801561084e575f5ffd5b5061086960048036038101906108649190613213565b6117fa565b005b348015610876575f5ffd5b5061087f611977565b60405161088c91906132f9565b60405180910390f35b3480156108a0575f5ffd5b506108a961199c565b6040516108b691906132d1565b60405180910390f35b3480156108ca575f5ffd5b506108d36119af565b6040516108e0919061303c565b60405180910390f35b3480156108f4575f5ffd5b506108fd6119b5565b60405161090a919061303c565b60405180910390f35b34801561091e575f5ffd5b506109276119bb565b60405161093491906132d1565b60405180910390f35b348015610948575f5ffd5b50610963600480360381019061095e9190613213565b6119c1565b60405161097091906131c1565b60405180910390f35b348015610984575f5ffd5b5061099f600480360381019061099a9190613392565b611a13565b6040516109ac919061303c565b60405180910390f35b3480156109c0575f5ffd5b506109c9611a95565b6040516109d691906132d1565b60405180910390f35b3480156109ea575f5ffd5b50610a056004803603810190610a009190613213565b611a9b565b005b348015610a12575f5ffd5b50610a1b611b1f565b604051610a28919061342b565b60405180910390f35b348015610a3c575f5ffd5b50610a45611b44565b604051610a52919061303c565b60405180910390f35b348015610a66575f5ffd5b50610a6f611b4a565b604051610a7c919061303c565b60405180910390f35b610a8d611b53565b61251c61ffff168161ffff161115610ad1576040517fcd4e616700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060075f6101000a81548161ffff021916908361ffff1602179055507fb50f6c85631b448ef50a9b0055afaff00e6d81ec0ebf056cd4bef2d8b32dbbbc81604051610b1c91906132d1565b60405180910390a150565b60115481565b606060038054610b3c90613471565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6890613471565b8015610bb35780601f10610b8a57610100808354040283529160200191610bb3565b820191905f5260205f20905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b5f5f610bc7611bda565b9050610bd4818585611be1565b600191505092915050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b6016602052805f5260405f205f915054906101000a900460ff1681565b5f5f610c34611bda565b9050610c41858285611bf3565b610c4c858585611c86565b60019150509392505050565b5f610c6461dead610d9a565b610c6d5f610d9a565b610c75610c04565b610c7f91906134ce565b610c8991906134ce565b905090565b5f6012905090565b60155f9054906101000a900460ff1681565b600e602052805f5260405f205f915054906101000a900460ff1681565b5f610ccf30610d9a565b905090565b600d60149054906101000a900460ff1681565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6107d081565b61271081565b600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105f9054906101000a900460ff1681565b600f602052805f5260405f205f915054906101000a900460ff1681565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610de7611b53565b610df05f611d76565b565b60145481565b610e00611b53565b6001600d60146101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e9e611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f039061354b565b60405180910390fd5b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc258faa9a17ddfdf4130b4acff63a289202e7d5f9e42f366add65368575486bc60405160405180910390a250565b606060048054610fa190613471565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcd90613471565b80156110185780601f10610fef57610100808354040283529160200191611018565b820191905f5260205f20905b815481529060010190602001808311610ffb57829003601f168201915b5050505050905090565b61102a611b53565b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b0576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113f919061357d565b90505f8173ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161119e9291906135a8565b602060405180830381865afa1580156111b9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111dd919061357d565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146112575780600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611333565b8173ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016112b39291906135a8565b6020604051808303815f875af11580156112cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f3919061357d565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6001600f5f600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fcc559bf3306c2e36782e6e3a163572adbd7bc62438d65eef8bd35bc76ae6194a600160405161141191906131c1565b60405180910390a25050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f61144c611bda565b9050611459818585611c86565b600191505092915050565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611491610e6e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611516575060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611555576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154c90613619565b60405180910390fd5b6001601060016101000a81548160ff021916908315150217905550611578611e39565b5f61158230610d9a565b90505f82148061159157508082115b1561159a578091505b5f81036115a757506117d5565b6115d330600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611be1565b5f600267ffffffffffffffff8111156115ef576115ee613637565b5b60405190808252806020026020018201604052801561161d5781602001602082028036833780820191505090505b50905030815f8151811061163457611633613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106116a4576116a3613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f479050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947855f853061012c426117319190613691565b6040518663ffffffff1660e01b81526004016117519594939291906137b4565b5f604051808303815f87803b158015611768575f5ffd5b505af1925050508015611779575060015b6117af576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81476117bc91906134ce565b90505f8111156117d0576117cf81611e7f565b5b505050505b6117dd6121f2565b5f601060016101000a81548160ff02191690831515021790555050565b611802611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611867576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611911573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611935919061357d565b600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900461ffff1681565b60125481565b60175481565b61251c81565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611f4081565b611aa3611b53565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b13575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611b0a91906132f9565b60405180910390fd5b611b1c81611d76565b50565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60135481565b5f601754905090565b611b5b611bda565b73ffffffffffffffffffffffffffffffffffffffff16611b79610e6e565b73ffffffffffffffffffffffffffffffffffffffff1614611bd857611b9c611bda565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611bcf91906132f9565b60405180910390fd5b565b5f33905090565b611bee83838360016121fc565b505050565b5f611bfe8484611a13565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611c805781811015611c71578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611c689392919061380c565b60405180910390fd5b611c7f84848484035f6121fc565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cf6575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ced91906132f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d66575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611d5d91906132f9565b60405180910390fd5b611d718383836123cb565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260065403611e75576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600681905550565b5f8103156121ef578060175f828254611e989190613691565b925050819055505f61271061ffff166107d061ffff1683611eb99190613841565b611ec391906138af565b90505f6064600f83611ed59190613841565b611edf91906138af565b90508082611eed91906134ce565b91505f818385611efd91906134ce565b611f0791906134ce565b90505f831115611fd4575f600760029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051611f589061390c565b5f6040518083038185875af1925050503d805f8114611f92576040519150601f19603f3d011682016040523d82523d5f602084013e611f97565b606091505b5050905080611fd2576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5f8111156121215760095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633ecfd51e826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612043575f5ffd5b505af193505050508015612055575060015b61211f575f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161209f9061390c565b5f6040518083038185875af1925050503d805f81146120d9576040519150601f19603f3d011682016040523d82523d5f602084013e6120de565b606091505b5050905080612119576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50612120565b5b5b5f8211156121eb575f60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161216f9061390c565b5f6040518083038185875af1925050503d805f81146121a9576040519150601f19603f3d011682016040523d82523d5f602084013e6121ae565b606091505b50509050806121e9576040517f81ceff3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5050505b50565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361226c575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161226391906132f9565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036122dc575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016122d391906132f9565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156123c5578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516123bc919061303c565b60405180910390a35b50505050565b5f600d60149054906101000a900460ff1690505f60105f9054906101000a900460ff1690505f601060019054906101000a900460ff1690505f60075f9054906101000a900461ffff169050831580156124575750612427610e6e565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614155b80156124965750612466610e6e565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b156124cd576040517fbcb8b8fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600f5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f61271061ffff168461ffff168961257f9190613841565b61258991906138af565b90505f818961259891906134ce565b90506125a78b8b838787612744565b5f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600e5f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f8a801561264d575082155b8015612657575081155b8015612668575086806126675750855b5b9050898015612675575088155b801561267e5750855b80156126b657503073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614155b156126c4576126c3612a64565b5b806126e4576126d48e8e8e612da5565b505050505050505050505061273f565b6126ef8e8e86612da5565b6126fa8e3087612da5565b7f0dec4d9696755d06066685c7df867851d2d13a61c8c68e440b7180ff81005758858f60405161272b929190613920565b60405180910390a150505050505050505050505b505050565b601060019054906101000a900460ff168061278a57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806127c057503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b612a5d5760155f9054906101000a900460ff1615806127ec5750600d60149054906101000a900460ff16155b612a5d5760165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801561288c575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612a5d576014548311156128cc576040517f4db0008c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8015801561290657505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15612a5c575f5f90505f600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156129ae5750600e5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156129bf575083806129be5750825b5b905080156129fa5761271061ffff1660075f9054906101000a900461ffff1661ffff16866129ed9190613841565b6129f791906138af565b91505b5f8286612a0791906134ce565b905060135481612a1689610d9a565b612a209190613691565b1115612a58576040517f2ce93b5900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505b5b5050505050565b6001601060016101000a81548160ff021916908315150217905550612a87611e39565b5f73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160315612d81575f612ae630610d9a565b9050601154811015612af85750612d81565b5f6012548211612b085781612b0c565b6012545b9050612b3a30600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611be1565b5f600267ffffffffffffffff811115612b5657612b55613637565b5b604051908082528060200260200182016040528015612b845781602001602082028036833780820191505090505b50905030815f81518110612b9b57612b9a613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612c0b57612c0a613664565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f479050600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f853061012c42612c989190613691565b6040518663ffffffff1660e01b8152600401612cb89594939291906137b4565b5f604051808303815f87803b158015612ccf575f5ffd5b505af1925050508015612ce0575060015b15612d7c575f8147612cf291906134ce565b90505f811115612d7a575f61271061ffff166107d061ffff1683612d169190613841565b612d2091906138af565b90505f8183612d2f91906134ce565b9050612d3a83611e7f565b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f86848484604051612d6f9493929190613947565b60405180910390a150505b505b505050505b612d896121f2565b5f601060016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612df5578060025f828254612de99190613691565b92505081905550612ec3565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612e7e578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e759392919061380c565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f0a578060025f8282540392505081905550612f54565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612fb1919061303c565b60405180910390a3505050565b5f5ffd5b5f61ffff82169050919050565b612fd881612fc2565b8114612fe2575f5ffd5b50565b5f81359050612ff381612fcf565b92915050565b5f6020828403121561300e5761300d612fbe565b5b5f61301b84828501612fe5565b91505092915050565b5f819050919050565b61303681613024565b82525050565b5f60208201905061304f5f83018461302d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61309782613055565b6130a1818561305f565b93506130b181856020860161306f565b6130ba8161307d565b840191505092915050565b5f6020820190508181035f8301526130dd818461308d565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61310e826130e5565b9050919050565b61311e81613104565b8114613128575f5ffd5b50565b5f8135905061313981613115565b92915050565b61314881613024565b8114613152575f5ffd5b50565b5f813590506131638161313f565b92915050565b5f5f6040838503121561317f5761317e612fbe565b5b5f61318c8582860161312b565b925050602061319d85828601613155565b9150509250929050565b5f8115159050919050565b6131bb816131a7565b82525050565b5f6020820190506131d45f8301846131b2565b92915050565b5f6131e4826130e5565b9050919050565b6131f4816131da565b82525050565b5f60208201905061320d5f8301846131eb565b92915050565b5f6020828403121561322857613227612fbe565b5b5f6132358482850161312b565b91505092915050565b5f5f5f6060848603121561325557613254612fbe565b5b5f6132628682870161312b565b93505060206132738682870161312b565b925050604061328486828701613155565b9150509250925092565b5f60ff82169050919050565b6132a38161328e565b82525050565b5f6020820190506132bc5f83018461329a565b92915050565b6132cb81612fc2565b82525050565b5f6020820190506132e45f8301846132c2565b92915050565b6132f381613104565b82525050565b5f60208201905061330c5f8301846132ea565b92915050565b61331b816131da565b8114613325575f5ffd5b50565b5f8135905061333681613312565b92915050565b5f6020828403121561335157613350612fbe565b5b5f61335e84828501613328565b91505092915050565b5f6020828403121561337c5761337b612fbe565b5b5f61338984828501613155565b91505092915050565b5f5f604083850312156133a8576133a7612fbe565b5b5f6133b58582860161312b565b92505060206133c68582860161312b565b9150509250929050565b5f819050919050565b5f6133f36133ee6133e9846130e5565b6133d0565b6130e5565b9050919050565b5f613404826133d9565b9050919050565b5f613415826133fa565b9050919050565b6134258161340b565b82525050565b5f60208201905061343e5f83018461341c565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061348857607f821691505b60208210810361349b5761349a613444565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6134d882613024565b91506134e383613024565b92508282039050818111156134fb576134fa6134a1565b5b92915050565b7f5a65726f206164647265737300000000000000000000000000000000000000005f82015250565b5f613535600c8361305f565b915061354082613501565b602082019050919050565b5f6020820190508181035f83015261356281613529565b9050919050565b5f8151905061357781613115565b92915050565b5f6020828403121561359257613591612fbe565b5b5f61359f84828501613569565b91505092915050565b5f6040820190506135bb5f8301856132ea565b6135c860208301846132ea565b9392505050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f613603600e8361305f565b915061360e826135cf565b602082019050919050565b5f6020820190508181035f830152613630816135f7565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f61369b82613024565b91506136a683613024565b92508282019050808211156136be576136bd6134a1565b5b92915050565b5f819050919050565b5f6136e76136e26136dd846136c4565b6133d0565b613024565b9050919050565b6136f7816136cd565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61372f81613104565b82525050565b5f6137408383613726565b60208301905092915050565b5f602082019050919050565b5f613762826136fd565b61376c8185613707565b935061377783613717565b805f5b838110156137a757815161378e8882613735565b97506137998361374c565b92505060018101905061377a565b5085935050505092915050565b5f60a0820190506137c75f83018861302d565b6137d460208301876136ee565b81810360408301526137e68186613758565b90506137f560608301856132ea565b613802608083018461302d565b9695505050505050565b5f60608201905061381f5f8301866132ea565b61382c602083018561302d565b613839604083018461302d565b949350505050565b5f61384b82613024565b915061385683613024565b925082820261386481613024565b9150828204841483151761387b5761387a6134a1565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138b982613024565b91506138c483613024565b9250826138d4576138d3613882565b5b828204905092915050565b5f81905092915050565b50565b5f6138f75f836138df565b9150613902826138e9565b5f82019050919050565b5f613916826138ec565b9150819050919050565b5f6040820190506139335f83018561302d565b61394060208301846132ea565b9392505050565b5f60808201905061395a5f83018761302d565b613967602083018661302d565b613974604083018561302d565b613981606083018461302d565b9594505050505056fea2646970667358221220d2cae2d379e0d707a776d24060b9096d4fc38571752e56c8b31f0e7cd7e2f10264736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000033b2e3c9fd0803ce8000000000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef894000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef8940000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c0000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809000000000000000000000000000000000000000000000000000000000000000a5374726174546f6b656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055354524154000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): StratToken
Arg [1] : symbol_ (string): STRAT
Arg [2] : initialSupply (uint256): 1000000000000000000000000000
Arg [3] : opsWallet_ (address): 0x156C7eE65C5A9e6eFc62CE4645B631c5617EF894
Arg [4] : feeCollector_ (address): 0x156C7eE65C5A9e6eFc62CE4645B631c5617EF894
Arg [5] : buybackManager_ (address): 0x0000000000000000000000000000000000000000
Arg [6] : router_ (address): 0xad1eCa41E6F772bE3cb5A48A6141f9bcc1AF9F7c
Arg [7] : weth_ (address): 0x3439153EB7AF838Ad19d56E1571FBD09333C2809
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [2] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [3] : 000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef894
Arg [4] : 000000000000000000000000156c7ee65c5a9e6efc62ce4645b631c5617ef894
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c
Arg [7] : 0000000000000000000000003439153eb7af838ad19d56e1571fbd09333c2809
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [9] : 5374726174546f6b656e00000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 5354524154000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.