Source Code
EVM
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,741 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 37485203 | 2 hrs ago | IN | 0 ETH | 0.00001301 | ||||
| Transfer | 37423035 | 9 hrs ago | IN | 0 ETH | 0.0000175 | ||||
| Transfer | 37396011 | 12 hrs ago | IN | 0 ETH | 0.00001302 | ||||
| Approve | 37280403 | 23 hrs ago | IN | 0 ETH | 0.00000681 | ||||
| Approve | 37256926 | 26 hrs ago | IN | 0 ETH | 0.00000635 | ||||
| Transfer | 36660294 | 4 days ago | IN | 0 ETH | 0.00001303 | ||||
| Manual Swap | 36633831 | 4 days ago | IN | 0 ETH | 0.00002178 | ||||
| Approve | 36631042 | 4 days ago | IN | 0 ETH | 0.00000611 | ||||
| Transfer | 36507426 | 4 days ago | IN | 0 ETH | 0.00001067 | ||||
| Transfer | 36507375 | 4 days ago | IN | 0 ETH | 0.00001301 | ||||
| Manual Swap | 36489900 | 5 days ago | IN | 0 ETH | 0.00002345 | ||||
| Manual Swap | 36305072 | 6 days ago | IN | 0 ETH | 0.00002345 | ||||
| Manual Swap | 36191682 | 6 days ago | IN | 0 ETH | 0.00002403 | ||||
| Transfer | 36127574 | 7 days ago | IN | 0 ETH | 0.00001302 | ||||
| Approve | 35924070 | 8 days ago | IN | 0 ETH | 0.00000591 | ||||
| Manual Swap | 35853680 | 9 days ago | IN | 0 ETH | 0.00002178 | ||||
| Approve | 35853657 | 9 days ago | IN | 0 ETH | 0.00000617 | ||||
| Manual Swap | 35843895 | 9 days ago | IN | 0 ETH | 0.00002178 | ||||
| Manual Swap | 35823580 | 9 days ago | IN | 0 ETH | 0.00002178 | ||||
| Manual Swap | 35821678 | 9 days ago | IN | 0 ETH | 0.00002178 | ||||
| Approve | 35821644 | 9 days ago | IN | 0 ETH | 0.00000757 | ||||
| Approve | 35768168 | 9 days ago | IN | 0 ETH | 0.00000948 | ||||
| Approve | 35702188 | 10 days ago | IN | 0 ETH | 0.00000682 | ||||
| Manual Swap | 35628097 | 10 days ago | IN | 0 ETH | 0.00002178 | ||||
| Manual Swap | 35537386 | 11 days ago | IN | 0 ETH | 0.00002145 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 37423224 | 9 hrs ago | 0.00009444 ETH | ||||
| 37423224 | 9 hrs ago | 0.00037777 ETH | ||||
| 37423224 | 9 hrs ago | 0.00047222 ETH | ||||
| 37293855 | 22 hrs ago | 0.00009537 ETH | ||||
| 37293855 | 22 hrs ago | 0.00038149 ETH | ||||
| 37293855 | 22 hrs ago | 0.00047686 ETH | ||||
| 37256984 | 26 hrs ago | 0.00009605 ETH | ||||
| 37256984 | 26 hrs ago | 0.0003842 ETH | ||||
| 37256984 | 26 hrs ago | 0.00048026 ETH | ||||
| 36633831 | 4 days ago | 0.00003725 ETH | ||||
| 36633831 | 4 days ago | 0.00014902 ETH | ||||
| 36633831 | 4 days ago | 0.00018628 ETH | ||||
| 36633825 | 4 days ago | 0.0000961 ETH | ||||
| 36633825 | 4 days ago | 0.00038443 ETH | ||||
| 36633825 | 4 days ago | 0.00048053 ETH | ||||
| 36631069 | 4 days ago | 0.00009612 ETH | ||||
| 36631069 | 4 days ago | 0.00038451 ETH | ||||
| 36631069 | 4 days ago | 0.00048063 ETH | ||||
| 36489900 | 5 days ago | 0.00012766 ETH | ||||
| 36489900 | 5 days ago | 0.00051067 ETH | ||||
| 36489900 | 5 days ago | 0.00063834 ETH | ||||
| 36305072 | 6 days ago | 0.00039572 ETH | ||||
| 36305072 | 6 days ago | 0.0015829 ETH | ||||
| 36305072 | 6 days ago | 0.00197863 ETH | ||||
| 36191682 | 6 days ago | 0.00550536 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
V2FeeToken
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/**
*
* PudgyStrategy
* $PDGYSTR
* Website: https://pudgystrategy.net/
* Twitter: https://x.com/PDGYSTRG
*
* Features:
* - 10% fee on DEX trades (configurable)
* - 80/20 split to treasury/dev wallets
* - Anti-whale limits (max tx/wallet)
* - Auto swap-back on sells
* - Manual swap control
*/
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
interface IUniswapV2Router02 {
function factory() external view returns (address);
function WETH() external view returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline
) external;
}
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address);
}
contract V2FeeToken is ERC20, Ownable {
// ====== Config ======
uint16 public constant MAX_FEE_BPS = 1000; // 10% hard cap
uint16 public constant BPS_DENOM = 10000; // 100% in basis points
uint16 public totalFeeBps = 1000; // 10% default
uint16 public treasuryShareBps = 8000; // 80% of ETH to treasury (rest to dev)
address payable public treasury;
address payable public devWallet;
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 (or more if needed)
// swap-back
bool public swapEnabled = true;
bool private inSwap;
uint256 public swapThreshold; // in token units
uint256 public maxSwapAmount; // cap 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;
// ====== Events ======
event FeesUpdated(uint16 totalFeeBps, uint16 treasuryShareBps);
event WalletsUpdated(address indexed treasury, address indexed dev);
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 SwapBackExecuted(uint256 tokensSold, uint256 ethReceived, uint256 toTreasury, uint256 toDev);
event LimitsUpdated(uint256 maxTx, uint256 maxWallet, bool enabled);
event LimitExemptSet(address indexed account, bool isExempt);
event FeeSplitUpdated(uint16 treasuryShareBps);
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
constructor(
string memory name_,
string memory symbol_,
uint256 initialSupply, // e.g. 1_000_000_000 * 1e18
address payable treasury_,
address payable dev_,
address router_ // Abstract: Mainnet 0xad1eCa41E6F772bE3cb5A48A6141f9bcc1AF9F7c
) ERC20(name_, symbol_) Ownable(msg.sender) {
require(treasury_ != address(0) && dev_ != address(0), "zero wallet");
treasury = treasury_;
devWallet = dev_;
router = IUniswapV2Router02(router_);
WETH = router.WETH();
// Create the V2 pair (token <-> WETH)
pair = IUniswapV2Factory(router.factory()).createPair(address(this), WETH);
isMarket[pair] = true;
// Mint supply to deployer
_mint(msg.sender, initialSupply);
// Fee exemptions
feeExempt[address(this)] = true;
feeExempt[msg.sender] = true;
feeExempt[treasury] = true;
feeExempt[devWallet] = true;
// Swap settings: 1 token threshold, 1 token max swap
swapThreshold = 1000 * 10**18; // 1 token
maxSwapAmount = 1000000 * 10**18; // 1 token
// Anti-whale limits: 3% max wallet, 1% max tx
maxWallet = (initialSupply * 3) / 100; // 3% of supply
maxTx = (initialSupply * 1) / 100; // 1% of supply
// Limit exemptions (DO NOT exempt the pair)
limitExempt[owner()] = true;
limitExempt[address(this)] = true;
limitExempt[treasury] = true;
limitExempt[devWallet] = true;
}
// ====== Core transfer with fees ======
function _update(address from, address to, uint256 amount) internal override {
// owner can always move pre-launch
if (!tradingEnabled && from != owner() && to != owner()) {
revert("Trading disabled");
}
bool marketFrom = isMarket[from];
bool marketTo = isMarket[to];
// Apply anti-whale limits first
_enforceTransactionLimits(from, to, amount, marketFrom, marketTo);
// Determine if fee should be taken
bool shouldTakeFee = tradingEnabled
&& !feeExempt[from]
&& !feeExempt[to]
&& (marketFrom || marketTo);
// Execute swap-back on sells (simple and reliable)
if (swapEnabled && !inSwap && marketTo && from != address(this)) {
_swapBack();
}
// Process transfer with or without fees
if (!shouldTakeFee) {
super._update(from, to, amount);
return;
}
uint256 feeAmount = (amount * totalFeeBps) / BPS_DENOM;
uint256 transferAmount = amount - feeAmount;
// Transfer fee to contract and net amount to recipient
super._update(from, address(this), feeAmount);
super._update(from, to, transferAmount);
}
// ====== 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
require(amount <= maxTx, "max tx");
// Check max wallet limit for recipients (except when selling to pair)
if (!marketTo) {
uint256 potentialFee = 0;
bool hasMarketFee = !feeExempt[from] && !feeExempt[to] && (marketFrom || marketTo);
if (hasMarketFee) {
potentialFee = (amount * totalFeeBps) / BPS_DENOM;
}
uint256 finalAmount = amount - potentialFee;
require(balanceOf(to) + finalAmount <= maxWallet, "max wallet");
}
}
// ====== Swap-back: sell tokens -> ETH and split ======
function _swapBack() private lockTheSwap {
uint256 tokenBal = balanceOf(address(this));
if (tokenBal < swapThreshold) return;
uint256 amountToSwap = tokenBal > maxSwapAmount ? maxSwapAmount : tokenBal;
// approve router once (gas-optimized to skip if already enough)
_approve(address(this), address(router), amountToSwap);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = WETH;
uint256 pre = address(this).balance;
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amountToSwap, 0, path, address(this), block.timestamp
);
uint256 got = address(this).balance - pre;
if (got == 0) return;
// split 80/20 of the ETH received
uint256 toTreasury = (got * treasuryShareBps) / BPS_DENOM;
uint256 toDev = got - toTreasury;
(bool s1,) = treasury.call{value: toTreasury}("");
(bool s2,) = devWallet.call{value: toDev}("");
require(s1 && s2, "payout failed");
emit SwapBackExecuted(amountToSwap, got, toTreasury, toDev);
}
// ====== Admin ======
function enableTrading() external onlyOwner {
tradingEnabled = true;
emit TradingEnabled();
}
function setFeeBps(uint16 newTotal) external onlyOwner {
require(newTotal <= MAX_FEE_BPS, "fee too high");
totalFeeBps = newTotal;
emit FeesUpdated(newTotal, treasuryShareBps);
}
function setFeeSplit(uint16 newTreasuryShareBps) external onlyOwner {
require(newTreasuryShareBps <= BPS_DENOM, "bad split");
treasuryShareBps = newTreasuryShareBps;
emit FeeSplitUpdated(newTreasuryShareBps);
}
function setWallets(address payable newTreasury, address payable newDev) external onlyOwner {
require(newTreasury != address(0) && newDev != address(0), "zero");
treasury = newTreasury;
devWallet = newDev;
feeExempt[newTreasury] = true;
feeExempt[newDev] = true;
emit WalletsUpdated(newTreasury, newDev);
}
function setMarket(address account, bool v) external onlyOwner {
isMarket[account] = v;
emit MarketSet(account, v);
}
function setFeeExempt(address account, bool v) external onlyOwner {
feeExempt[account] = v;
emit FeeExemptSet(account, v);
}
function setSwapSettings(uint256 threshold, uint256 maxAmt, bool enabled) external onlyOwner {
swapThreshold = threshold;
maxSwapAmount = maxAmt;
swapEnabled = enabled;
emit SwapSettingsSet(threshold, maxAmt, enabled);
}
function setLimits(uint256 newMaxTx, uint256 newMaxWallet, bool enabled) external onlyOwner {
require(newMaxTx > 0 && newMaxWallet > 0, "zero");
require(newMaxWallet >= newMaxTx, "wallet<tx");
maxTx = newMaxTx;
maxWallet = newMaxWallet;
limitsEnabled = enabled;
emit LimitsUpdated(newMaxTx, newMaxWallet, enabled);
}
function setLimitExempt(address account, bool v) external onlyOwner {
limitExempt[account] = v;
emit LimitExemptSet(account, v);
}
function manualSwap(uint256 amount) external onlyOwner lockTheSwap {
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;
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
amount, 0, path, address(this), block.timestamp
);
uint256 got = address(this).balance - pre;
if (got > 0) {
uint256 toTreasury = (got * treasuryShareBps) / BPS_DENOM;
uint256 toDev = got - toTreasury;
(bool s1,) = treasury.call{value: toTreasury}("");
(bool s2,) = devWallet.call{value: toDev}("");
require(s1 && s2, "payout failed");
}
}
function setRouter(address newRouter) external onlyOwner {
router = IUniswapV2Router02(newRouter);
WETH = router.WETH();
// NOTE: pair stays the same unless you recreate it; you can create & mark additional markets if needed
}
// rescue
function rescueETH(uint256 amount) external onlyOwner {
(bool ok,) = owner().call{value: amount}("");
require(ok, "rescue fail");
}
function rescueToken(address token, uint256 amount) external onlyOwner {
require(token != address(this), "no");
ERC20(token).transfer(owner(), amount);
}
receive() external payable {}
}// 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.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.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @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);
}// 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) (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.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);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}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":"treasury_","type":"address"},{"internalType":"address payable","name":"dev_","type":"address"},{"internalType":"address","name":"router_","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"FeeExemptSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"treasuryShareBps","type":"uint16"}],"name":"FeeSplitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"totalFeeBps","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"treasuryShareBps","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":"toTreasury","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toDev","type":"uint256"}],"name":"SwapBackExecuted","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":"treasury","type":"address"},{"indexed":true,"internalType":"address","name":"dev","type":"address"}],"name":"WalletsUpdated","type":"event"},{"inputs":[],"name":"BPS_DENOM","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":"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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeExempt","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":"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newTotal","type":"uint16"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"v","type":"bool"}],"name":"setFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newTreasuryShareBps","type":"uint16"}],"name":"setFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"v","type":"bool"}],"name":"setLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTx","type":"uint256"},{"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"v","type":"bool"}],"name":"setMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"maxAmt","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newTreasury","type":"address"},{"internalType":"address payable","name":"newDev","type":"address"}],"name":"setWallets","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":"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"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryShareBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526103e8600560146101000a81548161ffff021916908361ffff160217905550611f40600560166101000a81548161ffff021916908361ffff1602179055505f600a60146101000a81548160ff0219169083151502179055506001600d5f6101000a81548160ff021916908315150217905550600160125f6101000a81548160ff0219169083151502179055503480156200009c575f80fd5b50604051620063d0380380620063d08339818101604052810190620000c2919062001c8b565b3386868160039081620000d6919062001f8f565b508060049081620000e8919062001f8f565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200015e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000155919062002084565b60405180910390fd5b6200016f816200095160201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620001d957505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6200021b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021290620020fd565b60405180910390fd5b8260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000346573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200036c91906200211d565b600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000416573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200043c91906200211d565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401620004999291906200214d565b6020604051808303815f875af1158015620004b6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004dc91906200211d565b60095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550620005a3338562000a1460201b60201c565b6001600b5f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550683635c9adc5dea00000600e8190555069d3c21bcecceda1000000600f8190555060646003856200076b9190620021a5565b6200077791906200221c565b60108190555060646001856200078e9190620021a5565b6200079a91906200221c565b601181905550600160135f620007b562000a9e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160135f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050505050506200270f565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000a87575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040162000a7e919062002084565b60405180910390fd5b62000a9a5f838362000ac660201b60201c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60149054906101000a900460ff1615801562000b1f575062000aef62000a9e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801562000b67575062000b3762000a9e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1562000baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ba190620022a1565b60405180910390fd5b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905062000c59858585858562000e4660201b60201c565b5f600a60149054906101000a900460ff16801562000cbe5750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000d125750600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b801562000d255750828062000d245750815b5b9050600d5f9054906101000a900460ff16801562000d505750600d60019054906101000a900460ff16155b801562000d5a5750815b801562000d9357503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1562000daa5762000da96200115e60201b60201c565b5b8062000dcc5762000dc3868686620015d060201b60201c565b50505062000e41565b5f61271061ffff16600560149054906101000a900461ffff1661ffff168662000df69190620021a5565b62000e0291906200221c565b90505f818662000e139190620022c1565b905062000e28883084620015d060201b60201c565b62000e3b888883620015d060201b60201c565b50505050505b505050565b600d60019054906101000a900460ff168062000e8d57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8062000ec457503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b620011575760125f9054906101000a900460ff16158062000ef25750600a60149054906101000a900460ff16155b620011575760135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16801562000f94575060135f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b620011575760115483111562000fe1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000fd89062002349565b60405180910390fd5b8062001156575f80600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16158015620010885750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156200109b575083806200109a5750825b5b90508015620010dc5761271061ffff16600560149054906101000a900461ffff1661ffff1686620010cd9190620021a5565b620010d991906200221c565b91505b5f8286620010eb9190620022c1565b9050601054816200110289620017f460201b60201c565b6200110e919062002369565b111562001152576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200114990620023f1565b60405180910390fd5b5050505b5b5050505050565b6001600d60016101000a81548160ff0219169083151502179055505f6200118b30620017f460201b60201c565b9050600e548110156200119f5750620015b4565b5f600f548211620011b15781620011b5565b600f545b9050620011eb3060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836200183960201b60201c565b5f600267ffffffffffffffff8111156200120a576200120962001a54565b5b604051908082528060200260200182016040528015620012395781602001602082028036833780820191505090505b50905030815f8151811062001253576200125262002411565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110620012c657620012c562002411565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f47905060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8530426040518663ffffffff1660e01b81526004016200136895949392919062002557565b5f604051808303815f87803b15801562001380575f80fd5b505af115801562001393573d5f803e3d5ffd5b505050505f8147620013a69190620022c1565b90505f8103620013bb575050505050620015b4565b5f61271061ffff16600560169054906101000a900461ffff1661ffff1683620013e59190620021a5565b620013f191906200221c565b90505f8183620014029190620022c1565b90505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16836040516200144c90620025ea565b5f6040518083038185875af1925050503d805f811462001488576040519150601f19603f3d011682016040523d82523d5f602084013e6200148d565b606091505b505090505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051620014d990620025ea565b5f6040518083038185875af1925050503d805f811462001515576040519150601f19603f3d011682016040523d82523d5f602084013e6200151a565b606091505b50509050818015620015295750805b6200156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001562906200264e565b60405180910390fd5b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f88868686604051620015a294939291906200266e565b60405180910390a15050505050505050505b5f600d60016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001624578060025f82825462001617919062002369565b92505081905550620016f5565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015620016b0578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620016a793929190620026b9565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200173e578060025f828254039250508190555062001788565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620017e79190620026f4565b60405180910390a3505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6200184e83838360016200185360201b60201c565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620018c6575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401620018bd919062002084565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001939575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162001930919062002084565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801562001a25578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162001a1c9190620026f4565b60405180910390a35b50505050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b62001a8c8262001a44565b810181811067ffffffffffffffff8211171562001aae5762001aad62001a54565b5b80604052505050565b5f62001ac262001a2b565b905062001ad0828262001a81565b919050565b5f67ffffffffffffffff82111562001af25762001af162001a54565b5b62001afd8262001a44565b9050602081019050919050565b5f5b8381101562001b2957808201518184015260208101905062001b0c565b5f8484015250505050565b5f62001b4a62001b448462001ad5565b62001ab7565b90508281526020810184848401111562001b695762001b6862001a40565b5b62001b7684828562001b0a565b509392505050565b5f82601f83011262001b955762001b9462001a3c565b5b815162001ba784826020860162001b34565b91505092915050565b5f819050919050565b62001bc48162001bb0565b811462001bcf575f80fd5b50565b5f8151905062001be28162001bb9565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62001c138262001be8565b9050919050565b62001c258162001c07565b811462001c30575f80fd5b50565b5f8151905062001c438162001c1a565b92915050565b5f62001c558262001be8565b9050919050565b62001c678162001c49565b811462001c72575f80fd5b50565b5f8151905062001c858162001c5c565b92915050565b5f805f805f8060c0878903121562001ca85762001ca762001a34565b5b5f87015167ffffffffffffffff81111562001cc85762001cc762001a38565b5b62001cd689828a0162001b7e565b965050602087015167ffffffffffffffff81111562001cfa5762001cf962001a38565b5b62001d0889828a0162001b7e565b955050604062001d1b89828a0162001bd2565b945050606062001d2e89828a0162001c33565b935050608062001d4189828a0162001c33565b92505060a062001d5489828a0162001c75565b9150509295509295509295565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062001db057607f821691505b60208210810362001dc65762001dc562001d6b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262001e2a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001ded565b62001e36868362001ded565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62001e7762001e7162001e6b8462001bb0565b62001e4e565b62001bb0565b9050919050565b5f819050919050565b62001e928362001e57565b62001eaa62001ea18262001e7e565b84845462001df9565b825550505050565b5f90565b62001ec062001eb2565b62001ecd81848462001e87565b505050565b5b8181101562001ef45762001ee85f8262001eb6565b60018101905062001ed3565b5050565b601f82111562001f435762001f0d8162001dcc565b62001f188462001dde565b8101602085101562001f28578190505b62001f4062001f378562001dde565b83018262001ed2565b50505b505050565b5f82821c905092915050565b5f62001f655f198460080262001f48565b1980831691505092915050565b5f62001f7f838362001f54565b9150826002028217905092915050565b62001f9a8262001d61565b67ffffffffffffffff81111562001fb65762001fb562001a54565b5b62001fc2825462001d98565b62001fcf82828562001ef8565b5f60209050601f83116001811462002005575f841562001ff0578287015190505b62001ffc858262001f72565b8655506200206b565b601f198416620020158662001dcc565b5f5b828110156200203e5784890151825560018201915060208501945060208101905062002017565b868310156200205e57848901516200205a601f89168262001f54565b8355505b6001600288020188555050505b505050505050565b6200207e8162001c49565b82525050565b5f602082019050620020995f83018462002073565b92915050565b5f82825260208201905092915050565b7f7a65726f2077616c6c65740000000000000000000000000000000000000000005f82015250565b5f620020e5600b836200209f565b9150620020f282620020af565b602082019050919050565b5f6020820190508181035f8301526200211681620020d7565b9050919050565b5f6020828403121562002135576200213462001a34565b5b5f620021448482850162001c75565b91505092915050565b5f604082019050620021625f83018562002073565b62002171602083018462002073565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f620021b18262001bb0565b9150620021be8362001bb0565b9250828202620021ce8162001bb0565b91508282048414831517620021e857620021e762002178565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620022288262001bb0565b9150620022358362001bb0565b925082620022485762002247620021ef565b5b828204905092915050565b7f54726164696e672064697361626c6564000000000000000000000000000000005f82015250565b5f620022896010836200209f565b9150620022968262002253565b602082019050919050565b5f6020820190508181035f830152620022ba816200227b565b9050919050565b5f620022cd8262001bb0565b9150620022da8362001bb0565b9250828203905081811115620022f557620022f462002178565b5b92915050565b7f6d617820747800000000000000000000000000000000000000000000000000005f82015250565b5f620023316006836200209f565b91506200233e82620022fb565b602082019050919050565b5f6020820190508181035f830152620023628162002323565b9050919050565b5f620023758262001bb0565b9150620023828362001bb0565b92508282019050808211156200239d576200239c62002178565b5b92915050565b7f6d61782077616c6c6574000000000000000000000000000000000000000000005f82015250565b5f620023d9600a836200209f565b9150620023e682620023a3565b602082019050919050565b5f6020820190508181035f8301526200240a81620023cb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b620024498162001bb0565b82525050565b5f819050919050565b5f62002478620024726200246c846200244f565b62001e4e565b62001bb0565b9050919050565b6200248a8162002458565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b620024c48162001c49565b82525050565b5f620024d78383620024b9565b60208301905092915050565b5f602082019050919050565b5f620024fb8262002490565b6200250781856200249a565b93506200251483620024aa565b805f5b838110156200254a5781516200252e8882620024ca565b97506200253b83620024e3565b92505060018101905062002517565b5085935050505092915050565b5f60a0820190506200256c5f8301886200243e565b6200257b60208301876200247f565b81810360408301526200258f8186620024ef565b9050620025a0606083018562002073565b620025af60808301846200243e565b9695505050505050565b5f81905092915050565b50565b5f620025d35f83620025b9565b9150620025e082620025c3565b5f82019050919050565b5f620025f682620025c6565b9150819050919050565b7f7061796f7574206661696c6564000000000000000000000000000000000000005f82015250565b5f62002636600d836200209f565b9150620026438262002600565b602082019050919050565b5f6020820190508181035f830152620026678162002628565b9050919050565b5f608082019050620026835f8301876200243e565b6200269260208301866200243e565b620026a160408301856200243e565b620026b060608301846200243e565b95945050505050565b5f606082019050620026ce5f83018662002073565b620026dd60208301856200243e565b620026ec60408301846200243e565b949350505050565b5f602082019050620027095f8301846200243e565b92915050565b613cb3806200271d5f395ff3fe60806040526004361061026a575f3560e01c80637437681e11610143578063b70143c9116100b5578063d55be8c611610079578063d55be8c6146108f1578063dd62ed3e1461091b578063f2fde38b14610957578063f5736d4b1461097f578063f887ea40146109a7578063f8b45b05146109d157610271565b8063b70143c914610825578063c0d786551461084d578063c56f84cf14610875578063cce987d41461089f578063d3f6a157146108c957610271565b806395d89b411161010757806395d89b411461071b5780639e252f0014610745578063a467aa931461076d578063a8aa1b3114610795578063a9059cbb146107bf578063ad5c4648146107fb57610271565b80637437681e1461065f5780638a8c523c146106895780638da5cb5b1461069f5780638ea5220f146106c95780638ebfc796146106f357610271565b80633582ad23116101dc57806361d027b3116101a057806361d027b3146105535780636637e38c1461057d5780636ddd1713146105a75780636ec934da146105d157806370a082311461060d578063715018a61461064957610271565b80633582ad2314610473578063398daa851461049d57806340a24e6c146104d9578063468c07a0146105015780634ada218b1461052957610271565b806318160ddd1161022e57806318160ddd1461035557806320a8d3fb1461037f57806323b872dd146103bb57806330654a47146103f7578063313ce5671461042157806333f3d6281461044b57610271565b8063023b1fc9146102755780630445b6671461029d57806306fdde03146102c7578063095ea7b3146102f157806315bcf9b71461032d57610271565b3661027157005b5f80fd5b348015610280575f80fd5b5061029b60048036038101906102969190612e53565b6109fb565b005b3480156102a8575f80fd5b506102b1610ab9565b6040516102be9190612e96565b60405180910390f35b3480156102d2575f80fd5b506102db610abf565b6040516102e89190612f39565b60405180910390f35b3480156102fc575f80fd5b5061031760048036038101906103129190612fdd565b610b4f565b6040516103249190613035565b60405180910390f35b348015610338575f80fd5b50610353600480360381019061034e9190613078565b610b71565b005b348015610360575f80fd5b50610369610c1f565b6040516103769190612e96565b60405180910390f35b34801561038a575f80fd5b506103a560048036038101906103a091906130b6565b610c28565b6040516103b29190613035565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc91906130e1565b610c45565b6040516103ee9190613035565b60405180910390f35b348015610402575f80fd5b5061040b610c73565b6040516104189190613140565b60405180910390f35b34801561042c575f80fd5b50610435610c87565b6040516104429190613174565b60405180910390f35b348015610456575f80fd5b50610471600480360381019061046c9190612fdd565b610c8f565b005b34801561047e575f80fd5b50610487610d8c565b6040516104949190613035565b60405180910390f35b3480156104a8575f80fd5b506104c360048036038101906104be91906130b6565b610d9e565b6040516104d09190613035565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa9190613078565b610dbb565b005b34801561050c575f80fd5b5061052760048036038101906105229190612e53565b610e69565b005b348015610534575f80fd5b5061053d610f15565b60405161054a9190613035565b60405180910390f35b34801561055e575f80fd5b50610567610f28565b60405161057491906131ad565b60405180910390f35b348015610588575f80fd5b50610591610f4d565b60405161059e9190613140565b60405180910390f35b3480156105b2575f80fd5b506105bb610f53565b6040516105c89190613035565b60405180910390f35b3480156105dc575f80fd5b506105f760048036038101906105f291906130b6565b610f65565b6040516106049190613035565b60405180910390f35b348015610618575f80fd5b50610633600480360381019061062e91906130b6565b610f82565b6040516106409190612e96565b60405180910390f35b348015610654575f80fd5b5061065d610fc7565b005b34801561066a575f80fd5b50610673610fda565b6040516106809190612e96565b60405180910390f35b348015610694575f80fd5b5061069d610fe0565b005b3480156106aa575f80fd5b506106b3611031565b6040516106c091906131d5565b60405180910390f35b3480156106d4575f80fd5b506106dd611059565b6040516106ea91906131ad565b60405180910390f35b3480156106fe575f80fd5b5061071960048036038101906107149190613078565b61107e565b005b348015610726575f80fd5b5061072f61112c565b60405161073c9190612f39565b60405180910390f35b348015610750575f80fd5b5061076b600480360381019061076691906131ee565b6111bc565b005b348015610778575f80fd5b50610793600480360381019061078e9190613219565b611277565b005b3480156107a0575f80fd5b506107a96112e6565b6040516107b691906131d5565b60405180910390f35b3480156107ca575f80fd5b506107e560048036038101906107e09190612fdd565b61130b565b6040516107f29190613035565b60405180910390f35b348015610806575f80fd5b5061080f61132d565b60405161081c91906131d5565b60405180910390f35b348015610830575f80fd5b5061084b600480360381019061084691906131ee565b611352565b005b348015610858575f80fd5b50610873600480360381019061086e91906130b6565b61174a565b005b348015610880575f80fd5b50610889611862565b6040516108969190613140565b60405180910390f35b3480156108aa575f80fd5b506108b3611876565b6040516108c09190612e96565b60405180910390f35b3480156108d4575f80fd5b506108ef60048036038101906108ea9190613293565b61187c565b005b3480156108fc575f80fd5b50610905611ab3565b6040516109129190613140565b60405180910390f35b348015610926575f80fd5b50610941600480360381019061093c91906132d1565b611ab9565b60405161094e9190612e96565b60405180910390f35b348015610962575f80fd5b5061097d600480360381019061097891906130b6565b611b3b565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613219565b611bbf565b005b3480156109b2575f80fd5b506109bb611cbe565b6040516109c8919061336a565b60405180910390f35b3480156109dc575f80fd5b506109e5611ce3565b6040516109f29190612e96565b60405180910390f35b610a03611ce9565b6103e861ffff168161ffff161115610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a47906133cd565b60405180910390fd5b80600560146101000a81548161ffff021916908361ffff1602179055507f2ac80c14c28700f7b5e36f947d572149fe2e3947bac32c3a8c098f3e03722c1181600560169054906101000a900461ffff16604051610aae9291906133eb565b60405180910390a150565b600e5481565b606060038054610ace9061343f565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061343f565b8015610b455780601f10610b1c57610100808354040283529160200191610b45565b820191905f5260205f20905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b5f80610b59611d70565b9050610b66818585611d77565b600191505092915050565b610b79611ce9565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcc559bf3306c2e36782e6e3a163572adbd7bc62438d65eef8bd35bc76ae6194a82604051610c139190613035565b60405180910390a25050565b5f600254905090565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f80610c4f611d70565b9050610c5c858285611d89565b610c67858585611e1c565b60019150509392505050565b600560169054906101000a900461ffff1681565b5f6012905090565b610c97611ce9565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc906134b9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d29611031565b836040518363ffffffff1660e01b8152600401610d479291906134d7565b6020604051808303815f875af1158015610d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d879190613512565b505050565b60125f9054906101000a900460ff1681565b600b602052805f5260405f205f915054906101000a900460ff1681565b610dc3611ce9565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4aed8b8a26c8d87da818b50361f1273864d5b7008289379caa0aa8b7be56a36682604051610e5d9190613035565b60405180910390a25050565b610e71611ce9565b61271061ffff168161ffff161115610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590613587565b60405180910390fd5b80600560166101000a81548161ffff021916908361ffff1602179055507f162e127e7e09bc2916fa57420663da274b23787c878792d6582965d3b7a3a38981604051610f0a9190613140565b60405180910390a150565b600a60149054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b600d5f9054906101000a900460ff1681565b600c602052805f5260405f205f915054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fcf611ce9565b610fd85f611f0c565b565b60115481565b610fe8611ce9565b6001600a60146101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611086611ce9565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f5a8cf666a272afd6dec6788d33967c676fffa92e289eee1b38172982c4b4914d826040516111209190613035565b60405180910390a25050565b60606004805461113b9061343f565b80601f01602080910402602001604051908101604052809291908181526020018280546111679061343f565b80156111b25780601f10611189576101008083540402835291602001916111b2565b820191905f5260205f20905b81548152906001019060200180831161119557829003601f168201915b5050505050905090565b6111c4611ce9565b5f6111cd611031565b73ffffffffffffffffffffffffffffffffffffffff16826040516111f0906135d2565b5f6040518083038185875af1925050503d805f811461122a576040519150601f19603f3d011682016040523d82523d5f602084013e61122f565b606091505b5050905080611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613630565b60405180910390fd5b5050565b61127f611ce9565b82600e8190555081600f8190555080600d5f6101000a81548160ff0219169083151502179055507faa199f5aab08ad4ddee0140c8e7d13a4bebb822550aeb3d16e5f7bc485fba0f98383836040516112d99392919061364e565b60405180910390a1505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80611315611d70565b9050611322818585611e1c565b600191505092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61135a611ce9565b6001600d60016101000a81548160ff0219169083151502179055505f61137f30610f82565b90505f82148061138e57508082115b15611397578091505b5f81036113a4575061172d565b6113d03060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d77565b5f600267ffffffffffffffff8111156113ec576113eb613683565b5b60405190808252806020026020018201604052801561141a5781602001602082028036833780820191505090505b50905030815f81518110611431576114306136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106114a1576114a06136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f47905060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b81526004016115419594939291906137cd565b5f604051808303815f87803b158015611558575f80fd5b505af115801561156a573d5f803e3d5ffd5b505050505f814761157b9190613852565b90505f811115611728575f61271061ffff16600560169054906101000a900461ffff1661ffff16836115ad9190613885565b6115b791906138f3565b90505f81836115c69190613852565b90505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161160e906135d2565b5f6040518083038185875af1925050503d805f8114611648576040519150601f19603f3d011682016040523d82523d5f602084013e61164d565b606091505b505090505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051611697906135d2565b5f6040518083038185875af1925050503d805f81146116d1576040519150601f19603f3d011682016040523d82523d5f602084013e6116d6565b606091505b505090508180156116e45750805b611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a9061396d565b60405180910390fd5b505050505b505050505b5f600d60016101000a81548160ff02191690831515021790555050565b611752611ce9565b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611820919061399f565b600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560149054906101000a900461ffff1681565b600f5481565b611884611ce9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118ec57505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613a14565b60405180910390fd5b8160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35050565b6103e881565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b43611ce9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bb3575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611baa91906131d5565b60405180910390fd5b611bbc81611f0c565b50565b611bc7611ce9565b5f83118015611bd557505f82115b611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613a14565b60405180910390fd5b82821015611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90613a7c565b60405180910390fd5b82601181905550816010819055508060125f6101000a81548160ff0219169083151502179055507fc3e35da80dd50e2a487eb09d9fd3dcfb815ed597fedfcbc93588da440b2d45a3838383604051611cb19392919061364e565b60405180910390a1505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b611cf1611d70565b73ffffffffffffffffffffffffffffffffffffffff16611d0f611031565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e57611d32611d70565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d6591906131d5565b60405180910390fd5b565b5f33905090565b611d848383836001611fcf565b505050565b5f611d948484611ab9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611e165781811015611e07578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611dfe93929190613a9a565b60405180910390fd5b611e1584848484035f611fcf565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e8c575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611e8391906131d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611efc575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611ef391906131d5565b60405180910390fd5b611f0783838361219e565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361203f575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161203691906131d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120af575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016120a691906131d5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612198578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161218f9190612e96565b60405180910390a35b50505050565b600a60149054906101000a900460ff161580156121ee57506121be611031565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561222d57506121fd611031565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490613b19565b60405180910390fd5b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905061231485858585856124d1565b5f600a60149054906101000a900460ff1680156123785750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156123cb5750600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156123dc575082806123db5750815b5b9050600d5f9054906101000a900460ff1680156124065750600d60019054906101000a900460ff16155b801561240f5750815b801561244757503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612455576124546127c7565b5b8061246d57612465868686612bff565b5050506124cc565b5f61271061ffff16600560149054906101000a900461ffff1661ffff16866124959190613885565b61249f91906138f3565b90505f81866124ae9190613852565b90506124bb883084612bff565b6124c6888883612bff565b50505050505b505050565b600d60019054906101000a900460ff168061251757503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8061254d57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6127c05760125f9054906101000a900460ff1615806125795750600a60149054906101000a900460ff16155b6127c05760135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612619575060135f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6127c057601154831115612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265990613b81565b60405180910390fd5b806127bf575f80600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156127075750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612718575083806127175750825b5b905080156127545761271061ffff16600560149054906101000a900461ffff1661ffff16866127479190613885565b61275191906138f3565b91505b5f82866127619190613852565b90506010548161277089610f82565b61277a9190613b9f565b11156127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b290613c1c565b60405180910390fd5b5050505b5b5050505050565b6001600d60016101000a81548160ff0219169083151502179055505f6127ec30610f82565b9050600e548110156127fe5750612be3565b5f600f54821161280e5781612812565b600f545b90506128403060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611d77565b5f600267ffffffffffffffff81111561285c5761285b613683565b5b60405190808252806020026020018201604052801561288a5781602001602082028036833780820191505090505b50905030815f815181106128a1576128a06136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612911576129106136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f47905060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8530426040518663ffffffff1660e01b81526004016129b19594939291906137cd565b5f604051808303815f87803b1580156129c8575f80fd5b505af11580156129da573d5f803e3d5ffd5b505050505f81476129eb9190613852565b90505f81036129fe575050505050612be3565b5f61271061ffff16600560169054906101000a900461ffff1661ffff1683612a269190613885565b612a3091906138f3565b90505f8183612a3f9190613852565b90505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051612a87906135d2565b5f6040518083038185875af1925050503d805f8114612ac1576040519150601f19603f3d011682016040523d82523d5f602084013e612ac6565b606091505b505090505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051612b10906135d2565b5f6040518083038185875af1925050503d805f8114612b4a576040519150601f19603f3d011682016040523d82523d5f602084013e612b4f565b606091505b50509050818015612b5d5750805b612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b939061396d565b60405180910390fd5b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f88868686604051612bd19493929190613c3a565b60405180910390a15050505050505050505b5f600d60016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c4f578060025f828254612c439190613b9f565b92505081905550612d1d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612cd8578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612ccf93929190613a9a565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d64578060025f8282540392505081905550612dae565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e0b9190612e96565b60405180910390a3505050565b5f80fd5b5f61ffff82169050919050565b612e3281612e1c565b8114612e3c575f80fd5b50565b5f81359050612e4d81612e29565b92915050565b5f60208284031215612e6857612e67612e18565b5b5f612e7584828501612e3f565b91505092915050565b5f819050919050565b612e9081612e7e565b82525050565b5f602082019050612ea95f830184612e87565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ee6578082015181840152602081019050612ecb565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0b82612eaf565b612f158185612eb9565b9350612f25818560208601612ec9565b612f2e81612ef1565b840191505092915050565b5f6020820190508181035f830152612f518184612f01565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612f8282612f59565b9050919050565b612f9281612f78565b8114612f9c575f80fd5b50565b5f81359050612fad81612f89565b92915050565b612fbc81612e7e565b8114612fc6575f80fd5b50565b5f81359050612fd781612fb3565b92915050565b5f8060408385031215612ff357612ff2612e18565b5b5f61300085828601612f9f565b925050602061301185828601612fc9565b9150509250929050565b5f8115159050919050565b61302f8161301b565b82525050565b5f6020820190506130485f830184613026565b92915050565b6130578161301b565b8114613061575f80fd5b50565b5f813590506130728161304e565b92915050565b5f806040838503121561308e5761308d612e18565b5b5f61309b85828601612f9f565b92505060206130ac85828601613064565b9150509250929050565b5f602082840312156130cb576130ca612e18565b5b5f6130d884828501612f9f565b91505092915050565b5f805f606084860312156130f8576130f7612e18565b5b5f61310586828701612f9f565b935050602061311686828701612f9f565b925050604061312786828701612fc9565b9150509250925092565b61313a81612e1c565b82525050565b5f6020820190506131535f830184613131565b92915050565b5f60ff82169050919050565b61316e81613159565b82525050565b5f6020820190506131875f830184613165565b92915050565b5f61319782612f59565b9050919050565b6131a78161318d565b82525050565b5f6020820190506131c05f83018461319e565b92915050565b6131cf81612f78565b82525050565b5f6020820190506131e85f8301846131c6565b92915050565b5f6020828403121561320357613202612e18565b5b5f61321084828501612fc9565b91505092915050565b5f805f606084860312156132305761322f612e18565b5b5f61323d86828701612fc9565b935050602061324e86828701612fc9565b925050604061325f86828701613064565b9150509250925092565b6132728161318d565b811461327c575f80fd5b50565b5f8135905061328d81613269565b92915050565b5f80604083850312156132a9576132a8612e18565b5b5f6132b68582860161327f565b92505060206132c78582860161327f565b9150509250929050565b5f80604083850312156132e7576132e6612e18565b5b5f6132f485828601612f9f565b925050602061330585828601612f9f565b9150509250929050565b5f819050919050565b5f61333261332d61332884612f59565b61330f565b612f59565b9050919050565b5f61334382613318565b9050919050565b5f61335482613339565b9050919050565b6133648161334a565b82525050565b5f60208201905061337d5f83018461335b565b92915050565b7f66656520746f6f206869676800000000000000000000000000000000000000005f82015250565b5f6133b7600c83612eb9565b91506133c282613383565b602082019050919050565b5f6020820190508181035f8301526133e4816133ab565b9050919050565b5f6040820190506133fe5f830185613131565b61340b6020830184613131565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061345657607f821691505b60208210810361346957613468613412565b5b50919050565b7f6e6f0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6134a3600283612eb9565b91506134ae8261346f565b602082019050919050565b5f6020820190508181035f8301526134d081613497565b9050919050565b5f6040820190506134ea5f8301856131c6565b6134f76020830184612e87565b9392505050565b5f8151905061350c8161304e565b92915050565b5f6020828403121561352757613526612e18565b5b5f613534848285016134fe565b91505092915050565b7f6261642073706c697400000000000000000000000000000000000000000000005f82015250565b5f613571600983612eb9565b915061357c8261353d565b602082019050919050565b5f6020820190508181035f83015261359e81613565565b9050919050565b5f81905092915050565b50565b5f6135bd5f836135a5565b91506135c8826135af565b5f82019050919050565b5f6135dc826135b2565b9150819050919050565b7f726573637565206661696c0000000000000000000000000000000000000000005f82015250565b5f61361a600b83612eb9565b9150613625826135e6565b602082019050919050565b5f6020820190508181035f8301526136478161360e565b9050919050565b5f6060820190506136615f830186612e87565b61366e6020830185612e87565b61367b6040830184613026565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f6137006136fb6136f6846136dd565b61330f565b612e7e565b9050919050565b613710816136e6565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61374881612f78565b82525050565b5f613759838361373f565b60208301905092915050565b5f602082019050919050565b5f61377b82613716565b6137858185613720565b935061379083613730565b805f5b838110156137c05781516137a7888261374e565b97506137b283613765565b925050600181019050613793565b5085935050505092915050565b5f60a0820190506137e05f830188612e87565b6137ed6020830187613707565b81810360408301526137ff8186613771565b905061380e60608301856131c6565b61381b6080830184612e87565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61385c82612e7e565b915061386783612e7e565b925082820390508181111561387f5761387e613825565b5b92915050565b5f61388f82612e7e565b915061389a83612e7e565b92508282026138a881612e7e565b915082820484148315176138bf576138be613825565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138fd82612e7e565b915061390883612e7e565b925082613918576139176138c6565b5b828204905092915050565b7f7061796f7574206661696c6564000000000000000000000000000000000000005f82015250565b5f613957600d83612eb9565b915061396282613923565b602082019050919050565b5f6020820190508181035f8301526139848161394b565b9050919050565b5f8151905061399981612f89565b92915050565b5f602082840312156139b4576139b3612e18565b5b5f6139c18482850161398b565b91505092915050565b7f7a65726f000000000000000000000000000000000000000000000000000000005f82015250565b5f6139fe600483612eb9565b9150613a09826139ca565b602082019050919050565b5f6020820190508181035f830152613a2b816139f2565b9050919050565b7f77616c6c65743c747800000000000000000000000000000000000000000000005f82015250565b5f613a66600983612eb9565b9150613a7182613a32565b602082019050919050565b5f6020820190508181035f830152613a9381613a5a565b9050919050565b5f606082019050613aad5f8301866131c6565b613aba6020830185612e87565b613ac76040830184612e87565b949350505050565b7f54726164696e672064697361626c6564000000000000000000000000000000005f82015250565b5f613b03601083612eb9565b9150613b0e82613acf565b602082019050919050565b5f6020820190508181035f830152613b3081613af7565b9050919050565b7f6d617820747800000000000000000000000000000000000000000000000000005f82015250565b5f613b6b600683612eb9565b9150613b7682613b37565b602082019050919050565b5f6020820190508181035f830152613b9881613b5f565b9050919050565b5f613ba982612e7e565b9150613bb483612e7e565b9250828201905080821115613bcc57613bcb613825565b5b92915050565b7f6d61782077616c6c6574000000000000000000000000000000000000000000005f82015250565b5f613c06600a83612eb9565b9150613c1182613bd2565b602082019050919050565b5f6020820190508181035f830152613c3381613bfa565b9050919050565b5f608082019050613c4d5f830187612e87565b613c5a6020830186612e87565b613c676040830185612e87565b613c746060830184612e87565b9594505050505056fea264697066735822122092f0e23d0ec744d99111b9b61bdc55cf8f47ef0176a42af148e60572638502ae64736f6c6343000814003300000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000004b550aad15f5d28179e5bc6918113bf64181621c0000000000000000000000009ef87811e160fb95735ca3325ee29d2330e3d69e000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c000000000000000000000000000000000000000000000000000000000000000d507564677953747261746567790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075044475953545200000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061026a575f3560e01c80637437681e11610143578063b70143c9116100b5578063d55be8c611610079578063d55be8c6146108f1578063dd62ed3e1461091b578063f2fde38b14610957578063f5736d4b1461097f578063f887ea40146109a7578063f8b45b05146109d157610271565b8063b70143c914610825578063c0d786551461084d578063c56f84cf14610875578063cce987d41461089f578063d3f6a157146108c957610271565b806395d89b411161010757806395d89b411461071b5780639e252f0014610745578063a467aa931461076d578063a8aa1b3114610795578063a9059cbb146107bf578063ad5c4648146107fb57610271565b80637437681e1461065f5780638a8c523c146106895780638da5cb5b1461069f5780638ea5220f146106c95780638ebfc796146106f357610271565b80633582ad23116101dc57806361d027b3116101a057806361d027b3146105535780636637e38c1461057d5780636ddd1713146105a75780636ec934da146105d157806370a082311461060d578063715018a61461064957610271565b80633582ad2314610473578063398daa851461049d57806340a24e6c146104d9578063468c07a0146105015780634ada218b1461052957610271565b806318160ddd1161022e57806318160ddd1461035557806320a8d3fb1461037f57806323b872dd146103bb57806330654a47146103f7578063313ce5671461042157806333f3d6281461044b57610271565b8063023b1fc9146102755780630445b6671461029d57806306fdde03146102c7578063095ea7b3146102f157806315bcf9b71461032d57610271565b3661027157005b5f80fd5b348015610280575f80fd5b5061029b60048036038101906102969190612e53565b6109fb565b005b3480156102a8575f80fd5b506102b1610ab9565b6040516102be9190612e96565b60405180910390f35b3480156102d2575f80fd5b506102db610abf565b6040516102e89190612f39565b60405180910390f35b3480156102fc575f80fd5b5061031760048036038101906103129190612fdd565b610b4f565b6040516103249190613035565b60405180910390f35b348015610338575f80fd5b50610353600480360381019061034e9190613078565b610b71565b005b348015610360575f80fd5b50610369610c1f565b6040516103769190612e96565b60405180910390f35b34801561038a575f80fd5b506103a560048036038101906103a091906130b6565b610c28565b6040516103b29190613035565b60405180910390f35b3480156103c6575f80fd5b506103e160048036038101906103dc91906130e1565b610c45565b6040516103ee9190613035565b60405180910390f35b348015610402575f80fd5b5061040b610c73565b6040516104189190613140565b60405180910390f35b34801561042c575f80fd5b50610435610c87565b6040516104429190613174565b60405180910390f35b348015610456575f80fd5b50610471600480360381019061046c9190612fdd565b610c8f565b005b34801561047e575f80fd5b50610487610d8c565b6040516104949190613035565b60405180910390f35b3480156104a8575f80fd5b506104c360048036038101906104be91906130b6565b610d9e565b6040516104d09190613035565b60405180910390f35b3480156104e4575f80fd5b506104ff60048036038101906104fa9190613078565b610dbb565b005b34801561050c575f80fd5b5061052760048036038101906105229190612e53565b610e69565b005b348015610534575f80fd5b5061053d610f15565b60405161054a9190613035565b60405180910390f35b34801561055e575f80fd5b50610567610f28565b60405161057491906131ad565b60405180910390f35b348015610588575f80fd5b50610591610f4d565b60405161059e9190613140565b60405180910390f35b3480156105b2575f80fd5b506105bb610f53565b6040516105c89190613035565b60405180910390f35b3480156105dc575f80fd5b506105f760048036038101906105f291906130b6565b610f65565b6040516106049190613035565b60405180910390f35b348015610618575f80fd5b50610633600480360381019061062e91906130b6565b610f82565b6040516106409190612e96565b60405180910390f35b348015610654575f80fd5b5061065d610fc7565b005b34801561066a575f80fd5b50610673610fda565b6040516106809190612e96565b60405180910390f35b348015610694575f80fd5b5061069d610fe0565b005b3480156106aa575f80fd5b506106b3611031565b6040516106c091906131d5565b60405180910390f35b3480156106d4575f80fd5b506106dd611059565b6040516106ea91906131ad565b60405180910390f35b3480156106fe575f80fd5b5061071960048036038101906107149190613078565b61107e565b005b348015610726575f80fd5b5061072f61112c565b60405161073c9190612f39565b60405180910390f35b348015610750575f80fd5b5061076b600480360381019061076691906131ee565b6111bc565b005b348015610778575f80fd5b50610793600480360381019061078e9190613219565b611277565b005b3480156107a0575f80fd5b506107a96112e6565b6040516107b691906131d5565b60405180910390f35b3480156107ca575f80fd5b506107e560048036038101906107e09190612fdd565b61130b565b6040516107f29190613035565b60405180910390f35b348015610806575f80fd5b5061080f61132d565b60405161081c91906131d5565b60405180910390f35b348015610830575f80fd5b5061084b600480360381019061084691906131ee565b611352565b005b348015610858575f80fd5b50610873600480360381019061086e91906130b6565b61174a565b005b348015610880575f80fd5b50610889611862565b6040516108969190613140565b60405180910390f35b3480156108aa575f80fd5b506108b3611876565b6040516108c09190612e96565b60405180910390f35b3480156108d4575f80fd5b506108ef60048036038101906108ea9190613293565b61187c565b005b3480156108fc575f80fd5b50610905611ab3565b6040516109129190613140565b60405180910390f35b348015610926575f80fd5b50610941600480360381019061093c91906132d1565b611ab9565b60405161094e9190612e96565b60405180910390f35b348015610962575f80fd5b5061097d600480360381019061097891906130b6565b611b3b565b005b34801561098a575f80fd5b506109a560048036038101906109a09190613219565b611bbf565b005b3480156109b2575f80fd5b506109bb611cbe565b6040516109c8919061336a565b60405180910390f35b3480156109dc575f80fd5b506109e5611ce3565b6040516109f29190612e96565b60405180910390f35b610a03611ce9565b6103e861ffff168161ffff161115610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a47906133cd565b60405180910390fd5b80600560146101000a81548161ffff021916908361ffff1602179055507f2ac80c14c28700f7b5e36f947d572149fe2e3947bac32c3a8c098f3e03722c1181600560169054906101000a900461ffff16604051610aae9291906133eb565b60405180910390a150565b600e5481565b606060038054610ace9061343f565b80601f0160208091040260200160405190810160405280929190818152602001828054610afa9061343f565b8015610b455780601f10610b1c57610100808354040283529160200191610b45565b820191905f5260205f20905b815481529060010190602001808311610b2857829003601f168201915b5050505050905090565b5f80610b59611d70565b9050610b66818585611d77565b600191505092915050565b610b79611ce9565b80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167fcc559bf3306c2e36782e6e3a163572adbd7bc62438d65eef8bd35bc76ae6194a82604051610c139190613035565b60405180910390a25050565b5f600254905090565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f80610c4f611d70565b9050610c5c858285611d89565b610c67858585611e1c565b60019150509392505050565b600560169054906101000a900461ffff1681565b5f6012905090565b610c97611ce9565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfc906134b9565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610d29611031565b836040518363ffffffff1660e01b8152600401610d479291906134d7565b6020604051808303815f875af1158015610d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d879190613512565b505050565b60125f9054906101000a900460ff1681565b600b602052805f5260405f205f915054906101000a900460ff1681565b610dc3611ce9565b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f4aed8b8a26c8d87da818b50361f1273864d5b7008289379caa0aa8b7be56a36682604051610e5d9190613035565b60405180910390a25050565b610e71611ce9565b61271061ffff168161ffff161115610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590613587565b60405180910390fd5b80600560166101000a81548161ffff021916908361ffff1602179055507f162e127e7e09bc2916fa57420663da274b23787c878792d6582965d3b7a3a38981604051610f0a9190613140565b60405180910390a150565b600a60149054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61271081565b600d5f9054906101000a900460ff1681565b600c602052805f5260405f205f915054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610fcf611ce9565b610fd85f611f0c565b565b60115481565b610fe8611ce9565b6001600a60146101000a81548160ff0219169083151502179055507f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c760405160405180910390a1565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611086611ce9565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f5a8cf666a272afd6dec6788d33967c676fffa92e289eee1b38172982c4b4914d826040516111209190613035565b60405180910390a25050565b60606004805461113b9061343f565b80601f01602080910402602001604051908101604052809291908181526020018280546111679061343f565b80156111b25780601f10611189576101008083540402835291602001916111b2565b820191905f5260205f20905b81548152906001019060200180831161119557829003601f168201915b5050505050905090565b6111c4611ce9565b5f6111cd611031565b73ffffffffffffffffffffffffffffffffffffffff16826040516111f0906135d2565b5f6040518083038185875af1925050503d805f811461122a576040519150601f19603f3d011682016040523d82523d5f602084013e61122f565b606091505b5050905080611273576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126a90613630565b60405180910390fd5b5050565b61127f611ce9565b82600e8190555081600f8190555080600d5f6101000a81548160ff0219169083151502179055507faa199f5aab08ad4ddee0140c8e7d13a4bebb822550aeb3d16e5f7bc485fba0f98383836040516112d99392919061364e565b60405180910390a1505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80611315611d70565b9050611322818585611e1c565b600191505092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61135a611ce9565b6001600d60016101000a81548160ff0219169083151502179055505f61137f30610f82565b90505f82148061138e57508082115b15611397578091505b5f81036113a4575061172d565b6113d03060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611d77565b5f600267ffffffffffffffff8111156113ec576113eb613683565b5b60405190808252806020026020018201604052801561141a5781602001602082028036833780820191505090505b50905030815f81518110611431576114306136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106114a1576114a06136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f47905060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947855f8530426040518663ffffffff1660e01b81526004016115419594939291906137cd565b5f604051808303815f87803b158015611558575f80fd5b505af115801561156a573d5f803e3d5ffd5b505050505f814761157b9190613852565b90505f811115611728575f61271061ffff16600560169054906101000a900461ffff1661ffff16836115ad9190613885565b6115b791906138f3565b90505f81836115c69190613852565b90505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161160e906135d2565b5f6040518083038185875af1925050503d805f8114611648576040519150601f19603f3d011682016040523d82523d5f602084013e61164d565b606091505b505090505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051611697906135d2565b5f6040518083038185875af1925050503d805f81146116d1576040519150601f19603f3d011682016040523d82523d5f602084013e6116d6565b606091505b505090508180156116e45750805b611723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171a9061396d565b60405180910390fd5b505050505b505050505b5f600d60016101000a81548160ff02191690831515021790555050565b611752611ce9565b8060085f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117fc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611820919061399f565b600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600560149054906101000a900461ffff1681565b600f5481565b611884611ce9565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156118ec57505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290613a14565b60405180910390fd5b8160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f316af92955f23ddbd4c570a5f8cda8a10b192f24d8f58524deb2fcb03a8bc79460405160405180910390a35050565b6103e881565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b43611ce9565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bb3575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611baa91906131d5565b60405180910390fd5b611bbc81611f0c565b50565b611bc7611ce9565b5f83118015611bd557505f82115b611c14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0b90613a14565b60405180910390fd5b82821015611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90613a7c565b60405180910390fd5b82601181905550816010819055508060125f6101000a81548160ff0219169083151502179055507fc3e35da80dd50e2a487eb09d9fd3dcfb815ed597fedfcbc93588da440b2d45a3838383604051611cb19392919061364e565b60405180910390a1505050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b611cf1611d70565b73ffffffffffffffffffffffffffffffffffffffff16611d0f611031565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e57611d32611d70565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611d6591906131d5565b60405180910390fd5b565b5f33905090565b611d848383836001611fcf565b505050565b5f611d948484611ab9565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015611e165781811015611e07578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611dfe93929190613a9a565b60405180910390fd5b611e1584848484035f611fcf565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611e8c575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611e8391906131d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611efc575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611ef391906131d5565b60405180910390fd5b611f0783838361219e565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361203f575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161203691906131d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120af575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016120a691906131d5565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612198578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161218f9190612e96565b60405180910390a35b50505050565b600a60149054906101000a900460ff161580156121ee57506121be611031565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b801561222d57506121fd611031565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561226d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226490613b19565b60405180910390fd5b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1690505f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905061231485858585856124d1565b5f600a60149054906101000a900460ff1680156123785750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156123cb5750600b5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b80156123dc575082806123db5750815b5b9050600d5f9054906101000a900460ff1680156124065750600d60019054906101000a900460ff16155b801561240f5750815b801561244757503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b15612455576124546127c7565b5b8061246d57612465868686612bff565b5050506124cc565b5f61271061ffff16600560149054906101000a900461ffff1661ffff16866124959190613885565b61249f91906138f3565b90505f81866124ae9190613852565b90506124bb883084612bff565b6124c6888883612bff565b50505050505b505050565b600d60019054906101000a900460ff168061251757503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8061254d57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b6127c05760125f9054906101000a900460ff1615806125795750600a60149054906101000a900460ff16155b6127c05760135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168015612619575060135f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b6127c057601154831115612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265990613b81565b60405180910390fd5b806127bf575f80600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161580156127075750600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612718575083806127175750825b5b905080156127545761271061ffff16600560149054906101000a900461ffff1661ffff16866127479190613885565b61275191906138f3565b91505b5f82866127619190613852565b90506010548161277089610f82565b61277a9190613b9f565b11156127bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b290613c1c565b60405180910390fd5b5050505b5b5050505050565b6001600d60016101000a81548160ff0219169083151502179055505f6127ec30610f82565b9050600e548110156127fe5750612be3565b5f600f54821161280e5781612812565b600f545b90506128403060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611d77565b5f600267ffffffffffffffff81111561285c5761285b613683565b5b60405190808252806020026020018201604052801561288a5781602001602082028036833780820191505090505b50905030815f815181106128a1576128a06136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612911576129106136b0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f47905060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947845f8530426040518663ffffffff1660e01b81526004016129b19594939291906137cd565b5f604051808303815f87803b1580156129c8575f80fd5b505af11580156129da573d5f803e3d5ffd5b505050505f81476129eb9190613852565b90505f81036129fe575050505050612be3565b5f61271061ffff16600560169054906101000a900461ffff1661ffff1683612a269190613885565b612a3091906138f3565b90505f8183612a3f9190613852565b90505f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051612a87906135d2565b5f6040518083038185875af1925050503d805f8114612ac1576040519150601f19603f3d011682016040523d82523d5f602084013e612ac6565b606091505b505090505f60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683604051612b10906135d2565b5f6040518083038185875af1925050503d805f8114612b4a576040519150601f19603f3d011682016040523d82523d5f602084013e612b4f565b606091505b50509050818015612b5d5750805b612b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b939061396d565b60405180910390fd5b7fa784084d89a471321177859c54b5a997327e57e23e5c8d15167418fba7d1dc7f88868686604051612bd19493929190613c3a565b60405180910390a15050505050505050505b5f600d60016101000a81548160ff021916908315150217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c4f578060025f828254612c439190613b9f565b92505081905550612d1d565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015612cd8578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612ccf93929190613a9a565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d64578060025f8282540392505081905550612dae565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e0b9190612e96565b60405180910390a3505050565b5f80fd5b5f61ffff82169050919050565b612e3281612e1c565b8114612e3c575f80fd5b50565b5f81359050612e4d81612e29565b92915050565b5f60208284031215612e6857612e67612e18565b5b5f612e7584828501612e3f565b91505092915050565b5f819050919050565b612e9081612e7e565b82525050565b5f602082019050612ea95f830184612e87565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ee6578082015181840152602081019050612ecb565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0b82612eaf565b612f158185612eb9565b9350612f25818560208601612ec9565b612f2e81612ef1565b840191505092915050565b5f6020820190508181035f830152612f518184612f01565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612f8282612f59565b9050919050565b612f9281612f78565b8114612f9c575f80fd5b50565b5f81359050612fad81612f89565b92915050565b612fbc81612e7e565b8114612fc6575f80fd5b50565b5f81359050612fd781612fb3565b92915050565b5f8060408385031215612ff357612ff2612e18565b5b5f61300085828601612f9f565b925050602061301185828601612fc9565b9150509250929050565b5f8115159050919050565b61302f8161301b565b82525050565b5f6020820190506130485f830184613026565b92915050565b6130578161301b565b8114613061575f80fd5b50565b5f813590506130728161304e565b92915050565b5f806040838503121561308e5761308d612e18565b5b5f61309b85828601612f9f565b92505060206130ac85828601613064565b9150509250929050565b5f602082840312156130cb576130ca612e18565b5b5f6130d884828501612f9f565b91505092915050565b5f805f606084860312156130f8576130f7612e18565b5b5f61310586828701612f9f565b935050602061311686828701612f9f565b925050604061312786828701612fc9565b9150509250925092565b61313a81612e1c565b82525050565b5f6020820190506131535f830184613131565b92915050565b5f60ff82169050919050565b61316e81613159565b82525050565b5f6020820190506131875f830184613165565b92915050565b5f61319782612f59565b9050919050565b6131a78161318d565b82525050565b5f6020820190506131c05f83018461319e565b92915050565b6131cf81612f78565b82525050565b5f6020820190506131e85f8301846131c6565b92915050565b5f6020828403121561320357613202612e18565b5b5f61321084828501612fc9565b91505092915050565b5f805f606084860312156132305761322f612e18565b5b5f61323d86828701612fc9565b935050602061324e86828701612fc9565b925050604061325f86828701613064565b9150509250925092565b6132728161318d565b811461327c575f80fd5b50565b5f8135905061328d81613269565b92915050565b5f80604083850312156132a9576132a8612e18565b5b5f6132b68582860161327f565b92505060206132c78582860161327f565b9150509250929050565b5f80604083850312156132e7576132e6612e18565b5b5f6132f485828601612f9f565b925050602061330585828601612f9f565b9150509250929050565b5f819050919050565b5f61333261332d61332884612f59565b61330f565b612f59565b9050919050565b5f61334382613318565b9050919050565b5f61335482613339565b9050919050565b6133648161334a565b82525050565b5f60208201905061337d5f83018461335b565b92915050565b7f66656520746f6f206869676800000000000000000000000000000000000000005f82015250565b5f6133b7600c83612eb9565b91506133c282613383565b602082019050919050565b5f6020820190508181035f8301526133e4816133ab565b9050919050565b5f6040820190506133fe5f830185613131565b61340b6020830184613131565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061345657607f821691505b60208210810361346957613468613412565b5b50919050565b7f6e6f0000000000000000000000000000000000000000000000000000000000005f82015250565b5f6134a3600283612eb9565b91506134ae8261346f565b602082019050919050565b5f6020820190508181035f8301526134d081613497565b9050919050565b5f6040820190506134ea5f8301856131c6565b6134f76020830184612e87565b9392505050565b5f8151905061350c8161304e565b92915050565b5f6020828403121561352757613526612e18565b5b5f613534848285016134fe565b91505092915050565b7f6261642073706c697400000000000000000000000000000000000000000000005f82015250565b5f613571600983612eb9565b915061357c8261353d565b602082019050919050565b5f6020820190508181035f83015261359e81613565565b9050919050565b5f81905092915050565b50565b5f6135bd5f836135a5565b91506135c8826135af565b5f82019050919050565b5f6135dc826135b2565b9150819050919050565b7f726573637565206661696c0000000000000000000000000000000000000000005f82015250565b5f61361a600b83612eb9565b9150613625826135e6565b602082019050919050565b5f6020820190508181035f8301526136478161360e565b9050919050565b5f6060820190506136615f830186612e87565b61366e6020830185612e87565b61367b6040830184613026565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f819050919050565b5f6137006136fb6136f6846136dd565b61330f565b612e7e565b9050919050565b613710816136e6565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61374881612f78565b82525050565b5f613759838361373f565b60208301905092915050565b5f602082019050919050565b5f61377b82613716565b6137858185613720565b935061379083613730565b805f5b838110156137c05781516137a7888261374e565b97506137b283613765565b925050600181019050613793565b5085935050505092915050565b5f60a0820190506137e05f830188612e87565b6137ed6020830187613707565b81810360408301526137ff8186613771565b905061380e60608301856131c6565b61381b6080830184612e87565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61385c82612e7e565b915061386783612e7e565b925082820390508181111561387f5761387e613825565b5b92915050565b5f61388f82612e7e565b915061389a83612e7e565b92508282026138a881612e7e565b915082820484148315176138bf576138be613825565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6138fd82612e7e565b915061390883612e7e565b925082613918576139176138c6565b5b828204905092915050565b7f7061796f7574206661696c6564000000000000000000000000000000000000005f82015250565b5f613957600d83612eb9565b915061396282613923565b602082019050919050565b5f6020820190508181035f8301526139848161394b565b9050919050565b5f8151905061399981612f89565b92915050565b5f602082840312156139b4576139b3612e18565b5b5f6139c18482850161398b565b91505092915050565b7f7a65726f000000000000000000000000000000000000000000000000000000005f82015250565b5f6139fe600483612eb9565b9150613a09826139ca565b602082019050919050565b5f6020820190508181035f830152613a2b816139f2565b9050919050565b7f77616c6c65743c747800000000000000000000000000000000000000000000005f82015250565b5f613a66600983612eb9565b9150613a7182613a32565b602082019050919050565b5f6020820190508181035f830152613a9381613a5a565b9050919050565b5f606082019050613aad5f8301866131c6565b613aba6020830185612e87565b613ac76040830184612e87565b949350505050565b7f54726164696e672064697361626c6564000000000000000000000000000000005f82015250565b5f613b03601083612eb9565b9150613b0e82613acf565b602082019050919050565b5f6020820190508181035f830152613b3081613af7565b9050919050565b7f6d617820747800000000000000000000000000000000000000000000000000005f82015250565b5f613b6b600683612eb9565b9150613b7682613b37565b602082019050919050565b5f6020820190508181035f830152613b9881613b5f565b9050919050565b5f613ba982612e7e565b9150613bb483612e7e565b9250828201905080821115613bcc57613bcb613825565b5b92915050565b7f6d61782077616c6c6574000000000000000000000000000000000000000000005f82015250565b5f613c06600a83612eb9565b9150613c1182613bd2565b602082019050919050565b5f6020820190508181035f830152613c3381613bfa565b9050919050565b5f608082019050613c4d5f830187612e87565b613c5a6020830186612e87565b613c676040830185612e87565b613c746060830184612e87565b9594505050505056fea264697066735822122092f0e23d0ec744d99111b9b61bdc55cf8f47ef0176a42af148e60572638502ae64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000004b550aad15f5d28179e5bc6918113bf64181621c0000000000000000000000009ef87811e160fb95735ca3325ee29d2330e3d69e000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c000000000000000000000000000000000000000000000000000000000000000d507564677953747261746567790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075044475953545200000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): PudgyStrategy
Arg [1] : symbol_ (string): PDGYSTR
Arg [2] : initialSupply (uint256): 1000000000000000000000000000
Arg [3] : treasury_ (address): 0x4B550Aad15F5D28179e5Bc6918113bf64181621c
Arg [4] : dev_ (address): 0x9EF87811e160Fb95735cA3325EE29d2330E3d69e
Arg [5] : router_ (address): 0xad1eCa41E6F772bE3cb5A48A6141f9bcc1AF9F7c
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000033b2e3c9fd0803ce8000000
Arg [3] : 0000000000000000000000004b550aad15f5d28179e5bc6918113bf64181621c
Arg [4] : 0000000000000000000000009ef87811e160fb95735ca3325ee29d2330e3d69e
Arg [5] : 000000000000000000000000ad1eca41e6f772be3cb5a48a6141f9bcc1af9f7c
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [7] : 5075646779537472617465677900000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 5044475953545200000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1.59
Net Worth in ETH
0.000568
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ABSTRACT | 100.00% | $2,811.15 | 0.00056691 | $1.59 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.