Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- symbioToken
- Optimization enabled
- true
- Compiler version
- v0.8.24+commit.e11b9ed9
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2024-03-17T23:19:40.047454Z
Constructor Arguments
0x000000000000000000000000e242baa9d181d132f31ac48f59b38c84e3260709000000000000000000000000dae9dd3d1a52cfce9d5f2fac7fde164d500e50f7
Arg [0] (address) : 0xe242baa9d181d132f31ac48f59b38c84e3260709
Arg [1] (address) : 0xdae9dd3d1a52cfce9d5f2fac7fde164d500e50f7
contracts/symbioToken.sol
pragma solidity ^0.8.2;
// SPDX-License-Identifier: Unlicensed
import "./Ownable.sol";
import "./ERC20.sol";
import "./SafeMath.sol";
import "./IPulseX.sol";
interface IStaking {
function updatePool(uint256 amount) external;
}
contract symbioToken is Ownable, ERC20 {
using SafeMath for uint256;
mapping(address => uint256) public rOwned;
mapping(address => uint256) public tOwned;
mapping(address => uint256) public totalSend;
mapping(address => uint256) public totalReceived;
mapping(address => uint256) public lockedAmount;
mapping(address => bool) public isExcludedFromFee;
mapping(address => bool) public isExcludedFromMaxBuyPerWallet;
mapping(address => bool) public isExcludedFromReward;
mapping(address => bool) public isAutomatedMarketMakerPairs;
mapping(address => bool) public isHolder;
address[] private _excluded;
address public burnWallet;
address public DAOContract;
IStaking public stakingContract;
uint256 private constant MAX = ~uint256(0);
uint256 private constant _tTotal = 333333333333 * (10 ** 18);
uint256 private _rTotal = (MAX - (MAX % _tTotal));
uint256 private _tFeeTotal;
uint256 public liquidityFeeTotal;
uint256 public DAOFeeTotal;
uint256 public holders;
uint256[] public liquidityFee;
uint256[] public DAOFee;
uint256[] public reflectionFee;
uint256[] public stakingFee;
uint256[] public burnFee;
uint256 private _liquidityFee;
uint256 private _DAOFee;
uint256 private _reflectionFee;
uint256 private _stakingFee;
uint256 private _burnFee;
IPulseXRouter public pulseXRouter;
address public pulseXPair;
bool private swapping;
uint256 public swapTokensAtAmount;
uint256 public maxBuyPerWallet;
event LockToken(uint256 amount, address user);
event UnLockToken(uint256 amount, address user);
event SwapTokensAmountUpdated(uint256 amount);
constructor(
address owner,
address _routerAddress
) ERC20("xSymbio Token", "XSMBT") {
rOwned[owner] = _rTotal;
pulseXRouter = IPulseXRouter(_routerAddress);
// pulseXRouter = IPulseXRouter(0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02); @audit - newer address available
pulseXPair = IPulseXFactory(pulseXRouter.factory()).createPair(
address(this),
pulseXRouter.WPLS()
);
burnWallet = address(0x0000000000000000000000000000000000000369);
swapTokensAtAmount = 33333333 * (10 ** 18);
maxBuyPerWallet = 6666666666 * (10 ** 18);
isExcludedFromFee[owner] = true;
isExcludedFromFee[address(this)] = true;
isExcludedFromMaxBuyPerWallet[address(pulseXPair)] = true;
isExcludedFromMaxBuyPerWallet[address(this)] = true;
isExcludedFromMaxBuyPerWallet[owner] = true;
DAOFee.push(200);
DAOFee.push(200);
DAOFee.push(200);
reflectionFee.push(100);
reflectionFee.push(100);
reflectionFee.push(100);
stakingFee.push(100);
stakingFee.push(100);
stakingFee.push(100);
burnFee.push(50);
burnFee.push(50);
burnFee.push(50);
liquidityFee.push(50);
liquidityFee.push(50);
liquidityFee.push(50);
_excludeFromReward(address(burnWallet));
_excludeFromReward(address(pulseXPair));
_excludeFromReward(address(this));
_setAutomatedMarketMakerPair(pulseXPair, true);
isHolder[owner] = true;
holders += 1;
totalReceived[owner] += _tTotal;
emit Transfer(address(0), owner, _tTotal);
}
receive() external payable {}
function excludeFromLimit(address account, bool status) external onlyOwner {
isExcludedFromMaxBuyPerWallet[address(account)] = status;
isExcludedFromFee[address(account)] = status;
}
function updateAutomatedMarketMakerPair(
address pair,
bool value
) external onlyOwner {
require(pair != address(0), "Zero address");
_setAutomatedMarketMakerPair(pair, value);
if (value) {
_excludeFromReward(address(pair));
isExcludedFromMaxBuyPerWallet[address(pair)] = true;
} else {
_includeInReward(address(pair));
isExcludedFromMaxBuyPerWallet[address(pair)] = false;
}
}
function totalSupply() public pure override returns (uint256) {
return _tTotal;
}
function balanceOf(address account) public view override returns (uint256) {
if (isExcludedFromReward[account]) return tOwned[account];
return tokenFromReflection(rOwned[account]);
}
function tokenFromReflection(
uint256 rAmount
) public view returns (uint256) {
require(
rAmount <= _rTotal,
"Amount must be less than total reflections"
);
uint256 currentRate = _getRate();
return rAmount.div(currentRate);
}
function _excludeFromReward(address account) internal {
if (rOwned[account] > 0) {
tOwned[account] = tokenFromReflection(rOwned[account]);
}
isExcludedFromReward[account] = true;
_excluded.push(account);
}
function _includeInReward(address account) internal {
for (uint256 i = 0; i < _excluded.length; i++) {
if (_excluded[i] == account) {
_excluded[i] = _excluded[_excluded.length - 1];
tOwned[account] = 0;
isExcludedFromReward[account] = false;
_excluded.pop();
break;
}
}
}
function _setAutomatedMarketMakerPair(address pair, bool value) private {
require(
isAutomatedMarketMakerPairs[pair] != value,
"Automated market maker pair is already set to that value"
);
isAutomatedMarketMakerPairs[pair] = value;
}
function setStakingContract(IStaking contractAddress) external onlyOwner {
require(address(contractAddress) != address(0), "Zero address");
require(
address(stakingContract) == address(0),
"Staking contract already set"
);
stakingContract = IStaking(contractAddress);
_excludeFromReward(address(stakingContract));
isExcludedFromFee[address(stakingContract)] = true;
}
function setDAOContract(address wallet) external onlyOwner {
require(address(wallet) != address(0), "Zero address");
require(address(DAOContract) == address(0), "DAO contract already set");
DAOContract = wallet;
_excludeFromReward(address(DAOContract));
isExcludedFromFee[address(DAOContract)] = true;
}
function lockToken(uint256 amount, address user) external {
require(msg.sender == address(stakingContract), "sender not allowed");
uint256 unlockBalance = balanceOf(user) - lockedAmount[user];
require(unlockBalance >= amount, "locking amount exceeds balance");
lockedAmount[user] += amount;
emit LockToken(amount, user);
}
function unlockToken(uint256 amount, address user) external {
require(msg.sender == address(stakingContract), "sender not allowed");
require(lockedAmount[user] >= amount, "amount is not correct");
lockedAmount[user] -= amount;
emit UnLockToken(amount, user);
}
function unlockSend(uint256 amount, address user) external {
require(msg.sender == address(stakingContract), "sender not allowed");
require(lockedAmount[user] >= amount, "amount is not correct");
lockedAmount[user] -= amount;
IERC20(address(this)).transferFrom(
address(user),
address(stakingContract),
amount
);
emit UnLockToken(amount, user);
}
function airdropToken(uint256 amount) external {
require(amount > 0, "Transfer amount must be greater than zero");
require(
balanceOf(msg.sender) - lockedAmount[msg.sender] >= amount,
"transfer amount exceeds balance"
);
_tokenTransfer(msg.sender, address(this), amount, true, true);
}
function _reflectFee(uint256 rFee, uint256 tFee) private {
_rTotal = _rTotal.sub(rFee);
_tFeeTotal = _tFeeTotal.add(tFee);
}
function _getValues(
uint256 tAmount
)
private
view
returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256)
{
(
uint256 tTransferAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO
) = _getTValues(tAmount);
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
tAmount,
tFee,
tLiquidity,
tDAO,
_getRate()
);
return (
rAmount,
rTransferAmount,
rFee,
tTransferAmount,
tFee,
tLiquidity,
tDAO
);
}
function _getTValues(
uint256 tAmount
) private view returns (uint256, uint256, uint256, uint256) {
uint256 tFee = calculateReflectionFee(tAmount);
uint256 tLiquidity = calculateLiquidityFee(tAmount);
uint256 tDAO = calculateDAOFee(tAmount);
uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity).sub(tDAO);
return (tTransferAmount, tFee, tLiquidity, tDAO);
}
function _getRValues(
uint256 tAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO,
uint256 currentRate
) private pure returns (uint256, uint256, uint256) {
uint256 rAmount = tAmount.mul(currentRate);
uint256 rFee = tFee.mul(currentRate);
uint256 rLiquidity = tLiquidity.mul(currentRate);
uint256 rDAO = tDAO.mul(currentRate);
uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity).sub(rDAO);
return (rAmount, rTransferAmount, rFee);
}
function _getRate() private view returns (uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply.div(tSupply);
}
function _getCurrentSupply() private view returns (uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
for (uint256 i = 0; i < _excluded.length; i++) {
if (
rOwned[_excluded[i]] > rSupply || tOwned[_excluded[i]] > tSupply
) return (_rTotal, _tTotal);
rSupply = rSupply.sub(rOwned[_excluded[i]]);
tSupply = tSupply.sub(tOwned[_excluded[i]]);
}
if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
return (rSupply, tSupply);
}
function _takeLiquidity(uint256 tLiquidity) private {
uint256 currentRate = _getRate();
uint256 rLiquidity = tLiquidity.mul(currentRate);
rOwned[address(this)] = rOwned[address(this)].add(rLiquidity);
if (isExcludedFromReward[address(this)])
tOwned[address(this)] = tOwned[address(this)].add(tLiquidity);
}
function _takeDAO(uint256 tDAO) private {
uint256 currentRate = _getRate();
uint256 rDAO = tDAO.mul(currentRate);
rOwned[address(this)] = rOwned[address(this)].add(rDAO);
if (isExcludedFromReward[address(this)])
tOwned[address(this)] = tOwned[address(this)].add(tDAO);
}
function _takeStaking(uint256 tStaking) private {
uint256 currentRate = _getRate();
uint256 rStaking = tStaking.mul(currentRate);
rOwned[address(stakingContract)] = rOwned[address(stakingContract)].add(
rStaking
);
if (isExcludedFromReward[address(stakingContract)])
tOwned[address(stakingContract)] = tOwned[address(stakingContract)]
.add(tStaking);
}
function _takeBurn(uint256 tBurn) private {
uint256 currentRate = _getRate();
uint256 rBurn = tBurn.mul(currentRate);
rOwned[burnWallet] = rOwned[burnWallet].add(rBurn);
if (isExcludedFromReward[burnWallet])
tOwned[burnWallet] = tOwned[burnWallet].add(tBurn);
}
function calculateReflectionFee(
uint256 _amount
) private view returns (uint256) {
return _amount.mul(_reflectionFee).div(10000);
}
function calculateDAOFee(uint256 _amount) private view returns (uint256) {
return _amount.mul(_DAOFee).div(10000);
}
function calculateStakingFee(
uint256 _amount
) private view returns (uint256) {
return _amount.mul(_stakingFee).div(10000);
}
function calculateLiquidityFee(
uint256 _amount
) private view returns (uint256) {
return _amount.mul(_liquidityFee).div(10000);
}
function calculateBurnFee(uint256 _amount) private view returns (uint256) {
return _amount.mul(_burnFee).div(10000);
}
function removeAllFee() private {
_reflectionFee = 0;
_stakingFee = 0;
_DAOFee = 0;
_liquidityFee = 0;
_burnFee = 0;
}
function applyBuyFee() private {
_reflectionFee = reflectionFee[0];
_stakingFee = stakingFee[0];
_DAOFee = DAOFee[0];
_liquidityFee = liquidityFee[0];
_burnFee = burnFee[0];
}
function applySellFee() private {
_reflectionFee = reflectionFee[1];
_stakingFee = stakingFee[1];
_DAOFee = DAOFee[1];
_liquidityFee = liquidityFee[1];
_burnFee = burnFee[1];
}
function applyP2PFee() private {
_reflectionFee = reflectionFee[2];
_stakingFee = stakingFee[2];
_DAOFee = DAOFee[2];
_liquidityFee = liquidityFee[2];
_burnFee = burnFee[2];
}
function applyAirdropFee() private {
_reflectionFee = 10000;
_stakingFee = 0;
_DAOFee = 0;
_liquidityFee = 0;
_burnFee = 0;
}
function _transfer(
address from,
address to,
uint256 amount
) internal override {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
require(amount > 0, "Transfer amount must be greater than zero");
require(
balanceOf(from) - lockedAmount[from] >= amount,
"transfer amount exceeds balance"
);
if (!isHolder[address(to)]) {
isHolder[to] = true;
holders += 1;
}
if ((balanceOf(from) - amount) == 0) {
isHolder[from] = false;
holders -= 1;
}
if (
!isExcludedFromMaxBuyPerWallet[to] &&
isAutomatedMarketMakerPairs[from]
) {
uint256 balanceRecepient = balanceOf(to);
require(
balanceRecepient + amount <= maxBuyPerWallet,
"Exceeds maximum buy per wallet limit"
);
}
uint256 contractTokenBalance = balanceOf(address(this));
bool canSwap = contractTokenBalance >= swapTokensAtAmount;
if (canSwap && !swapping && isAutomatedMarketMakerPairs[to]) {
uint256 tokenToLiqudity = liquidityFeeTotal.div(2);
uint256 tokenToDAO = DAOFeeTotal;
uint256 tokenToSwap = tokenToLiqudity.add(tokenToDAO);
if (tokenToSwap >= swapTokensAtAmount) {
swapping = true;
swapTokensForPLS(swapTokensAtAmount);
uint256 PLSBalance = address(this).balance;
uint256 liqudityPart = PLSBalance.mul(tokenToLiqudity).div(
tokenToSwap
);
uint256 DAOPart = PLSBalance - liqudityPart;
if (liqudityPart > 0) {
uint256 liqudityToken = swapTokensAtAmount
.mul(tokenToLiqudity)
.div(tokenToSwap);
addLiquidity(liqudityToken, liqudityPart);
liquidityFeeTotal = liquidityFeeTotal
.sub(liqudityToken)
.sub(liqudityToken);
}
if (DAOPart > 0) {
(bool sent, ) = DAOContract.call{value: DAOPart}("");
DAOFeeTotal = DAOFeeTotal.sub(
swapTokensAtAmount.mul(tokenToDAO).div(tokenToSwap)
);
}
swapping = false;
}
}
bool takeFee = true;
if (isExcludedFromFee[from] || isExcludedFromFee[to]) {
takeFee = false;
} else {
if (!isHolder[address(this)]) {
isHolder[address(this)] = true;
holders += 1;
}
if (!isHolder[address(stakingContract)]) {
isHolder[address(stakingContract)] = true;
holders += 1;
}
if (!isHolder[address(burnWallet)]) {
isHolder[address(burnWallet)] = true;
holders += 1;
}
}
_tokenTransfer(from, to, amount, takeFee, false);
}
function _tokenTransfer(
address sender,
address recipient,
uint256 amount,
bool takeFee,
bool airdrop
) private {
totalSend[sender] += amount;
if (!takeFee) {
removeAllFee();
} else if (airdrop) {
applyAirdropFee();
} else if (
!isAutomatedMarketMakerPairs[sender] &&
!isAutomatedMarketMakerPairs[recipient]
) {
applyP2PFee();
} else if (isAutomatedMarketMakerPairs[recipient]) {
applySellFee();
} else {
applyBuyFee();
}
uint256 _totalFee = _reflectionFee +
_stakingFee +
_DAOFee +
_liquidityFee +
_burnFee;
if (_totalFee > 0) {
uint256 _feeAmount = amount.mul(_totalFee).div(10000);
totalReceived[recipient] += amount.sub(_feeAmount);
} else {
totalReceived[recipient] += amount;
}
uint256 tBurn = calculateBurnFee(amount);
if (tBurn > 0) {
_takeBurn(tBurn);
emit Transfer(sender, address(burnWallet), tBurn);
}
uint256 tStaking = calculateStakingFee(amount);
if (tStaking > 0) {
_takeStaking(tStaking);
stakingContract.updatePool(tStaking);
emit Transfer(sender, address(stakingContract), tStaking);
}
if (isExcludedFromReward[sender] && !isExcludedFromReward[recipient]) {
_transferFromExcluded(sender, recipient, amount, tStaking, tBurn);
} else if (
!isExcludedFromReward[sender] && isExcludedFromReward[recipient]
) {
_transferToExcluded(sender, recipient, amount, tStaking, tBurn);
} else if (
!isExcludedFromReward[sender] && !isExcludedFromReward[recipient]
) {
_transferStandard(sender, recipient, amount, tStaking, tBurn);
} else if (
isExcludedFromReward[sender] && isExcludedFromReward[recipient]
) {
_transferBothExcluded(sender, recipient, amount, tStaking, tBurn);
} else {
_transferStandard(sender, recipient, amount, tStaking, tBurn);
}
}
function _transferStandard(
address sender,
address recipient,
uint256 tAmount,
uint256 tStaking,
uint256 tBurn
) private {
(
uint256 rAmount,
uint256 rTransferAmount,
uint256 rFee,
uint256 tTransferAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO
) = _getValues(tAmount);
tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(
tBurn.mul(_getRate())
);
rOwned[sender] = rOwned[sender].sub(rAmount);
rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_takeDAO(tDAO);
_reflectFee(rFee, tFee);
liquidityFeeTotal += tLiquidity;
DAOFeeTotal += tDAO;
if (tDAO.add(tLiquidity) > 0) {
emit Transfer(sender, address(this), tDAO.add(tLiquidity));
}
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferToExcluded(
address sender,
address recipient,
uint256 tAmount,
uint256 tStaking,
uint256 tBurn
) private {
(
uint256 rAmount,
uint256 rTransferAmount,
uint256 rFee,
uint256 tTransferAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO
) = _getValues(tAmount);
tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(
tBurn.mul(_getRate())
);
rOwned[sender] = rOwned[sender].sub(rAmount);
tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_takeDAO(tDAO);
_reflectFee(rFee, tFee);
liquidityFeeTotal += tLiquidity;
DAOFeeTotal += tDAO;
if (tDAO.add(tLiquidity) > 0) {
emit Transfer(sender, address(this), tDAO.add(tLiquidity));
}
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferFromExcluded(
address sender,
address recipient,
uint256 tAmount,
uint256 tStaking,
uint256 tBurn
) private {
(
uint256 rAmount,
uint256 rTransferAmount,
uint256 rFee,
uint256 tTransferAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO
) = _getValues(tAmount);
tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(
tBurn.mul(_getRate())
);
tOwned[sender] = tOwned[sender].sub(tAmount);
rOwned[sender] = rOwned[sender].sub(rAmount);
rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_takeDAO(tDAO);
_reflectFee(rFee, tFee);
liquidityFeeTotal += tLiquidity;
DAOFeeTotal += tDAO;
if (tDAO.add(tLiquidity) > 0) {
emit Transfer(sender, address(this), tDAO.add(tLiquidity));
}
emit Transfer(sender, recipient, tTransferAmount);
}
function _transferBothExcluded(
address sender,
address recipient,
uint256 tAmount,
uint256 tStaking,
uint256 tBurn
) private {
(
uint256 rAmount,
uint256 rTransferAmount,
uint256 rFee,
uint256 tTransferAmount,
uint256 tFee,
uint256 tLiquidity,
uint256 tDAO
) = _getValues(tAmount);
tTransferAmount = tTransferAmount.sub(tStaking).sub(tBurn);
rTransferAmount = rTransferAmount.sub(tStaking.mul(_getRate())).sub(
tBurn.mul(_getRate())
);
tOwned[sender] = tOwned[sender].sub(tAmount);
rOwned[sender] = rOwned[sender].sub(rAmount);
tOwned[recipient] = tOwned[recipient].add(tTransferAmount);
rOwned[recipient] = rOwned[recipient].add(rTransferAmount);
_takeLiquidity(tLiquidity);
_takeDAO(tDAO);
_reflectFee(rFee, tFee);
liquidityFeeTotal += tLiquidity;
DAOFeeTotal += tDAO;
if (tDAO.add(tLiquidity) > 0) {
emit Transfer(sender, address(this), tDAO.add(tLiquidity));
}
emit Transfer(sender, recipient, tTransferAmount);
}
function swapTokensForPLS(uint256 tokenAmount) private {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = pulseXRouter.WPLS();
_approve(address(this), address(pulseXRouter), tokenAmount);
pulseXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
tokenAmount,
0,
path,
address(this),
block.timestamp
);
}
function addLiquidity(uint256 tokenAmount, uint256 PLSAmount) private {
_approve(address(this), address(pulseXRouter), tokenAmount);
pulseXRouter.addLiquidityETH{value: PLSAmount}(
address(this),
tokenAmount,
0,
0,
address(this),
block.timestamp
);
}
}
contracts/Context.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
contracts/ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.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}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override 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 value {ERC20} uses, unless this function is
* 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 override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override 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 `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` 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 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `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.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` 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.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
contracts/IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
contracts/IERC20Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
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);
}
contracts/IPulseX.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;
interface IPulseXFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IPulseXRouter {
function factory() external pure returns (address);
function WPLS() external pure returns (address);
function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
}
contracts/Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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 {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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 {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_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);
}
}
contracts/SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
Compiler Settings
{"viaIR":false,"remappings":["eth-gas-reporter/=node_modules/eth-gas-reporter/","forge-std/=lib/forge-std/src/","hardhat/=node_modules/hardhat/"],"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"_routerAddress","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"user","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapTokensAmountUpdated","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"UnLockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"address","name":"user","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DAOContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DAOFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DAOFeeTotal","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdropToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"burnWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromLimit","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"holders","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAutomatedMarketMakerPairs","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromMaxBuyPerWallet","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHolder","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeTotal","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockedAmount","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxBuyPerWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pulseXPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseXRouter"}],"name":"pulseXRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"rOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDAOContract","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setStakingContract","inputs":[{"type":"address","name":"contractAddress","internalType":"contract IStaking"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IStaking"}],"name":"stakingContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakingFee","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapTokensAtAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tOwned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReceived","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSend","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlockSend","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlockToken","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateAutomatedMarketMakerPair","inputs":[{"type":"address","name":"pair","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040526200001f6c04350edef012dc12678834000060001962000a32565b6200002d9060001962000a5f565b6014553480156200003d57600080fd5b50604051620040f2380380620040f2833981016040819052620000609162000a92565b6040518060400160405280600d81526020016c3c29bcb6b134b7902a37b5b2b760991b815250604051806040016040528060058152602001641614d3509560da1b815250620000be620000b8620005b060201b60201c565b620005b4565b6004620000cc838262000b71565b506005620000db828262000b71565b50506014546001600160a01b0384811660009081526006602090815260409182902093909355602380546001600160a01b0319169286169283179055805163c45a015560e01b8152905191935063c45a01559260048083019391928290030181865afa15801562000150573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000176919062000c3d565b6001600160a01b031663c9c6539630602360009054906101000a90046001600160a01b03166001600160a01b031663ef8ef56f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ff919062000c3d565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200024d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000273919062000c3d565b602480546001600160a01b039283166001600160a01b0319918216178255601180549091166103691781556a1b929b9a4d1cb5143400006025556b158a8994202d87c8f06800006026558483166000818152600b60209081526040808320805460ff199081166001908117909255308086528386208054831684179055975489168552600c9093528184208054841682179055958352808320805483168717905592825291812080549092168417909155601a8054808501825560c87f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e9182018190558254808701845582018190558254808701909355910155601b8054808501825560647f3ad8aa4f87544323a9d1e5dd902f40c356527a7955687113db5f9a85ad579dc191820181905582548087018455820181905582548087019093559101819055601c805480860182557f0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a21190810183905581548087018355810183905581548087019092550155601d8054808501825560327f6d4407e7be21f808e6509aa9fa9143369579dd7d760fe20a2c09680fc146134f91820181905582548087018455820181905582548087019093559101819055601980548086018255928190527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96959283018290558054808601825583018290558054948501905592019190915554620004a3911662000604565b602454620004ba906001600160a01b031662000604565b620004c53062000604565b602454620004de906001600160a01b03166001620006c7565b6001600160a01b0382166000908152600f60205260408120805460ff1916600190811790915560188054919290916200051990849062000c5b565b90915550506001600160a01b038216600090815260096020526040812080546c04350edef012dc12678834000092906200055590849062000c5b565b90915550506040516c04350edef012dc12678834000081526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505062000c9e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381166000908152600660205260409020541562000661576001600160a01b03811660009081526006602052604090205462000647906200078e565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503620007635760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084015b60405180910390fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6000601454821115620007f75760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016200075a565b60006200080362000818565b90506200081183826200083e565b9392505050565b600080806200082662000855565b90925090506200083782826200083e565b9250505090565b60006200084c828462000c71565b90505b92915050565b60145460009081906c04350edef012dc126788340000825b601054811015620009c65782600660006010848154811062000893576200089362000c88565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620009025750816007600060108481548110620008db57620008db62000c88565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1562000923575050601454936c04350edef012dc1267883400009350915050565b6200096e600660006010848154811062000941576200094162000c88565b60009182526020808320909101546001600160a01b03168352820192909252604001902054849062000a0e565b9250620009bb60076000601084815481106200098e576200098e62000c88565b60009182526020808320909101546001600160a01b03168352820192909252604001902054839062000a0e565b91506001016200086d565b50601454620009e3906c04350edef012dc1267883400006200083e565b82101562000a05575050601454926c04350edef012dc12678834000092509050565b90939092509050565b60006200084c828462000a5f565b634e487b7160e01b600052601260045260246000fd5b60008262000a445762000a4462000a1c565b500690565b634e487b7160e01b600052601160045260246000fd5b818103818111156200084f576200084f62000a49565b80516001600160a01b038116811462000a8d57600080fd5b919050565b6000806040838503121562000aa657600080fd5b62000ab18362000a75565b915062000ac16020840162000a75565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000af557607f821691505b60208210810362000b1657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b6c576000816000526020600020601f850160051c8101602086101562000b475750805b601f850160051c820191505b8181101562000b685782815560010162000b53565b5050505b505050565b81516001600160401b0381111562000b8d5762000b8d62000aca565b62000ba58162000b9e845462000ae0565b8462000b1c565b602080601f83116001811462000bdd576000841562000bc45750858301515b600019600386901b1c1916600185901b17855562000b68565b600085815260208120601f198616915b8281101562000c0e5788860151825594840194600190910190840162000bed565b508582101562000c2d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c5057600080fd5b6200084c8262000a75565b808201808211156200084f576200084f62000a49565b60008262000c835762000c8362000a1c565b500490565b634e487b7160e01b600052603260045260246000fd5b6134448062000cae6000396000f3fe6080604052600436106102975760003560e01c806382f2a18a1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e1461086f578063e2f456051461088f578063ee99205c146108a5578063f2fde38b146108c5578063fcef8867146108e5578063fe3f52f41461090557600080fd5b8063a9059cbb14610792578063aec9b6f4146107b2578063b377f8ae146107d2578063c64a041b146107f2578063cec1460b1461081f578063d4d7b19a1461083f57600080fd5b806395d89b411161011357806395d89b41146106c35780639dd373b9146106d8578063a046bc78146106f8578063a08dbe7b14610718578063a153e70814610745578063a457c2d71461077257600080fd5b806382f2a18a146105fc57806388a06f8b1461061c57806388f82020146106495780638cadf61d146106795780638da5cb5b1461068f5780638fc97b81146106ad57600080fd5b806349ae028a116101fe5780636ba5b8b8116101b75780636ba5b8b81461055b57806370a0823114610571578063715018a6146105915780637326afe0146105a65780638188f71c146105c657806381905bf8146105dc57600080fd5b806349ae028a1461047e5780634df9cfb31461049e5780634ead1ef6146104cb5780634ec27aac146104eb5780635342acb41461050b57806357afa4c71461053b57600080fd5b8063255fe84711610250578063255fe847146103a05780632d838119146103d0578063313ce567146103f0578063371974a31461040c578063395093511461043c578063425d512a1461045c57600080fd5b806306228749146102a357806306fdde03146102e0578063095ea7b31461030257806313317aa01461033257806318160ddd1461036057806323b872dd1461038057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506011546102c3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ec57600080fd5b506102f5610925565b6040516102d79190612ffc565b34801561030e57600080fd5b5061032261031d366004613060565b6109b7565b60405190151581526020016102d7565b34801561033e57600080fd5b5061035261034d36600461308c565b6109d1565b6040519081526020016102d7565b34801561036c57600080fd5b506c04350edef012dc126788340000610352565b34801561038c57600080fd5b5061032261039b3660046130a5565b6109f2565b3480156103ac57600080fd5b506103226103bb3660046130e6565b600e6020526000908152604090205460ff1681565b3480156103dc57600080fd5b506103526103eb36600461308c565b610a16565b3480156103fc57600080fd5b50604051601281526020016102d7565b34801561041857600080fd5b506103226104273660046130e6565b600c6020526000908152604090205460ff1681565b34801561044857600080fd5b50610322610457366004613060565b610a9f565b34801561046857600080fd5b5061047c6104773660046130e6565b610ac1565b005b34801561048a57600080fd5b5061035261049936600461308c565b610b97565b3480156104aa57600080fd5b506103526104b93660046130e6565b60096020526000908152604090205481565b3480156104d757600080fd5b506103526104e636600461308c565b610ba7565b3480156104f757600080fd5b5061047c610506366004613111565b610bb7565b34801561051757600080fd5b506103226105263660046130e6565b600b6020526000908152604090205460ff1681565b34801561054757600080fd5b5061047c61055636600461308c565b610c53565b34801561056757600080fd5b5061035260165481565b34801561057d57600080fd5b5061035261058c3660046130e6565b610cf7565b34801561059d57600080fd5b5061047c610d56565b3480156105b257600080fd5b5061047c6105c136600461314a565b610d6a565b3480156105d257600080fd5b5061035260185481565b3480156105e857600080fd5b5061047c6105f7366004613111565b610e67565b34801561060857600080fd5b5061047c61061736600461314a565b610ead565b34801561062857600080fd5b506103526106373660046130e6565b60066020526000908152604090205481565b34801561065557600080fd5b506103226106643660046130e6565b600d6020526000908152604090205460ff1681565b34801561068557600080fd5b5061035260265481565b34801561069b57600080fd5b506000546001600160a01b03166102c3565b3480156106b957600080fd5b5061035260175481565b3480156106cf57600080fd5b506102f5611020565b3480156106e457600080fd5b5061047c6106f33660046130e6565b61102f565b34801561070457600080fd5b5061035261071336600461308c565b611105565b34801561072457600080fd5b506103526107333660046130e6565b60076020526000908152604090205481565b34801561075157600080fd5b506103526107603660046130e6565b600a6020526000908152604090205481565b34801561077e57600080fd5b5061032261078d366004613060565b611115565b34801561079e57600080fd5b506103226107ad366004613060565b611190565b3480156107be57600080fd5b506023546102c3906001600160a01b031681565b3480156107de57600080fd5b506012546102c3906001600160a01b031681565b3480156107fe57600080fd5b5061035261080d3660046130e6565b60086020526000908152604090205481565b34801561082b57600080fd5b5061047c61083a36600461314a565b61119e565b34801561084b57600080fd5b5061032261085a3660046130e6565b600f6020526000908152604090205460ff1681565b34801561087b57600080fd5b5061035261088a36600461316f565b6112b9565b34801561089b57600080fd5b5061035260255481565b3480156108b157600080fd5b506013546102c3906001600160a01b031681565b3480156108d157600080fd5b5061047c6108e03660046130e6565b6112e4565b3480156108f157600080fd5b5061035261090036600461308c565b61135a565b34801561091157600080fd5b506024546102c3906001600160a01b031681565b6060600480546109349061319d565b80601f01602080910402602001604051908101604052809291908181526020018280546109609061319d565b80156109ad5780601f10610982576101008083540402835291602001916109ad565b820191906000526020600020905b81548152906001019060200180831161099057829003601f168201915b5050505050905090565b6000336109c581858561136a565b60019150505b92915050565b601a81815481106109e157600080fd5b600091825260209091200154905081565b600033610a0085828561148e565b610a0b858585611508565b506001949350505050565b6000601454821115610a825760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a8c611b07565b9050610a988382611b2a565b9392505050565b6000336109c5818585610ab283836112b9565b610abc91906131ed565b61136a565b610ac9611b36565b6001600160a01b038116610aef5760405162461bcd60e51b8152600401610a7990613200565b6012546001600160a01b031615610b485760405162461bcd60e51b815260206004820152601860248201527f44414f20636f6e747261637420616c72656164792073657400000000000000006044820152606401610a79565b601280546001600160a01b0319166001600160a01b038316908117909155610b6f90611b90565b506012546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601d81815481106109e157600080fd5b601c81815481106109e157600080fd5b610bbf611b36565b6001600160a01b038216610be55760405162461bcd60e51b8152600401610a7990613200565b610bef8282611c50565b8015610c2557610bfe82611b90565b6001600160a01b0382166000908152600c60205260409020805460ff191660011790555050565b610c2e82611d11565b6001600160a01b0382166000908152600c60205260409020805460ff191690555b5050565b60008111610c735760405162461bcd60e51b8152600401610a7990613226565b336000818152600a60205260409020548291610c8e90610cf7565b610c98919061326f565b1015610ce65760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a79565b610cf4333083600180611e27565b50565b6001600160a01b0381166000908152600d602052604081205460ff1615610d3457506001600160a01b031660009081526007602052604090205490565b6001600160a01b0382166000908152600660205260409020546109cb90610a16565b610d5e611b36565b610d68600061224a565b565b6013546001600160a01b03163314610d945760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a6020526040902054821115610df45760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a79565b6001600160a01b0381166000908152600a602052604081208054849290610e1c90849061326f565b9091555050604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b91015b60405180910390a15050565b610e6f611b36565b6001600160a01b039091166000908152600c60209081526040808320805494151560ff199586168117909155600b9092529091208054909216179055565b6013546001600160a01b03163314610ed75760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a6020526040902054821115610f375760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a79565b6001600160a01b0381166000908152600a602052604081208054849290610f5f90849061326f565b90915550506013546040516323b872dd60e01b81526001600160a01b03808416600483015290911660248201526044810183905230906323b872dd906064016020604051808303816000875af1158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe191906132ae565b50604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b9101610e5b565b6060600580546109349061319d565b611037611b36565b6001600160a01b03811661105d5760405162461bcd60e51b8152600401610a7990613200565b6013546001600160a01b0316156110b65760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610a79565b601380546001600160a01b0319166001600160a01b0383169081179091556110dd90611b90565b506013546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601981815481106109e157600080fd5b6000338161112382866112b9565b9050838110156111835760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a79565b610a0b828686840361136a565b6000336109c5818585611508565b6013546001600160a01b031633146111c85760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a60205260408120546111ea83610cf7565b6111f4919061326f565b9050828110156112465760405162461bcd60e51b815260206004820152601e60248201527f6c6f636b696e6720616d6f756e7420657863656564732062616c616e636500006044820152606401610a79565b6001600160a01b0382166000908152600a60205260408120805485929061126e9084906131ed565b9091555050604080518481526001600160a01b03841660208201527f73984e8db8b28e5bddacc2944750532e661c7b013e2cb7995f2e27cf54bb24d2910160405180910390a1505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6112ec611b36565b6001600160a01b0381166113515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610cf48161224a565b601b81815481106109e157600080fd5b6001600160a01b0383166113cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a79565b6001600160a01b03821661142d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a79565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061149a84846112b9565b9050600019811461150257818110156114f55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a79565b611502848484840361136a565b50505050565b6001600160a01b03831661156c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a79565b6001600160a01b0382166115ce5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a79565b600081116115ee5760405162461bcd60e51b8152600401610a7990613226565b6001600160a01b0383166000908152600a6020526040902054819061161285610cf7565b61161c919061326f565b101561166a5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a79565b6001600160a01b0382166000908152600f602052604090205460ff166116c9576001600160a01b0382166000908152600f60205260408120805460ff1916600190811790915560188054919290916116c39084906131ed565b90915550505b806116d384610cf7565b6116dd919061326f565b60000361171d576001600160a01b0383166000908152600f60205260408120805460ff19169055601880546001929061171790849061326f565b90915550505b6001600160a01b0382166000908152600c602052604090205460ff1615801561175e57506001600160a01b0383166000908152600e602052604090205460ff165b156117da57600061176e83610cf7565b60265490915061177e83836131ed565b11156117d85760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d20627579207065722077616c6c6574206c6044820152631a5b5a5d60e21b6064820152608401610a79565b505b60006117e530610cf7565b602554909150811080159081906118065750602454600160a01b900460ff16155b801561182a57506001600160a01b0384166000908152600e602052604090205460ff165b1561198f57601654600090611840906002611b2a565b6017549091506000611852838361229a565b9050602554811061198b576024805460ff60a01b1916600160a01b17905560255461187c906122a6565b4760006118938361188d84886123f8565b90611b2a565b905060006118a1828461326f565b905081156118f45760006118c48561188d896025546123f890919063ffffffff16565b90506118d08184612404565b6118ef816118e9836016546124b590919063ffffffff16565b906124b5565b601655505b801561197a576012546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611947576040519150601f19603f3d011682016040523d82523d6000602084013e61194c565b606091505b5050905061197561196c8661188d896025546123f890919063ffffffff16565b601754906124b5565b601755505b50506024805460ff60a01b19169055505b5050505b6001600160a01b0385166000908152600b602052604090205460019060ff16806119d157506001600160a01b0385166000908152600b602052604090205460ff165b156119de57506000611af1565b306000908152600f602052604090205460ff16611a2b57306000908152600f60205260408120805460ff191660019081179091556018805491929091611a259084906131ed565b90915550505b6013546001600160a01b03166000908152600f602052604090205460ff16611a8e576013546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611a889084906131ed565b90915550505b6011546001600160a01b03166000908152600f602052604090205460ff16611af1576011546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611aeb9084906131ed565b90915550505b611aff868686846000611e27565b505050505050565b6000806000611b146124c1565b9092509050611b238282611b2a565b9250505090565b6000610a9882846132cb565b6000546001600160a01b03163314610d685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a79565b6001600160a01b03811660009081526006602052604090205415611bea576001600160a01b038116600090815260066020526040902054611bd090610a16565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503611ce65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a79565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b60005b601054811015610c4f57816001600160a01b031660108281548110611d3b57611d3b6132ed565b6000918252602090912001546001600160a01b031603611e1f5760108054611d659060019061326f565b81548110611d7557611d756132ed565b600091825260209091200154601080546001600160a01b039092169183908110611da157611da16132ed565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600d90925220805460ff191690556010805480611df957611df9613303565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b600101611d14565b6001600160a01b03851660009081526008602052604081208054859290611e4f9084906131ed565b90915550829050611e7d57611e78600060208190556021819055601f819055601e819055602255565b611f22565b8015611ea257611e7861271060205560006021819055601f819055601e819055602255565b6001600160a01b0385166000908152600e602052604090205460ff16158015611ee457506001600160a01b0384166000908152600e602052604090205460ff16155b15611ef157611e78612663565b6001600160a01b0384166000908152600e602052604090205460ff1615611f1a57611e7861271c565b611f226127c4565b6000602254601e54601f54602154602054611f3d91906131ed565b611f4791906131ed565b611f5191906131ed565b611f5b91906131ed565b90508015611fb5576000611f7561271061188d87856123f8565b9050611f8185826124b5565b6001600160a01b03871660009081526009602052604081208054909190611fa99084906131ed565b90915550611fe3915050565b6001600160a01b03851660009081526009602052604081208054869290611fdd9084906131ed565b90915550505b6000611fee8561286c565b9050801561203357611fff81612889565b6011546040518281526001600160a01b03918216918916906000805160206133ef8339815191529060200160405180910390a35b600061203e86612949565b905080156120e25761204f81612966565b6013546040516328f582d360e11b8152600481018390526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561209557600080fd5b505af11580156120a9573d6000803e3d6000fd5b50506013546040518481526001600160a01b039182169350908b1691506000805160206133ef8339815191529060200160405180910390a35b6001600160a01b0388166000908152600d602052604090205460ff16801561212357506001600160a01b0387166000908152600d602052604090205460ff16155b1561213a576121358888888486612a25565b612240565b6001600160a01b0388166000908152600d602052604090205460ff1615801561217b57506001600160a01b0387166000908152600d602052604090205460ff165b1561218d576121358888888486612c0c565b6001600160a01b0388166000908152600d602052604090205460ff161580156121cf57506001600160a01b0387166000908152600d602052604090205460ff16155b156121e1576121358888888486612ce0565b6001600160a01b0388166000908152600d602052604090205460ff16801561222157506001600160a01b0387166000908152600d602052604090205460ff165b15612233576121358888888486612d4f565b6122408888888486612ce0565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610a9882846131ed565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122db576122db6132ed565b6001600160a01b039283166020918202929092018101919091526023546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa158015612334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123589190613319565b8160018151811061236b5761236b6132ed565b6001600160a01b039283166020918202929092010152602354612391913091168461136a565b60235460405163791ac94760e01b81526001600160a01b039091169063791ac947906123ca908590600090869030904290600401613336565b600060405180830381600087803b1580156123e457600080fd5b505af1158015611aff573d6000803e3d6000fd5b6000610a9882846133a9565b60235461241c9030906001600160a01b03168461136a565b60235460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612489573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124ae91906133c0565b5050505050565b6000610a98828461326f565b60145460009081906c04350edef012dc126788340000825b60105481101561261e578260066000601084815481106124fb576124fb6132ed565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612566575081600760006010848154811061253f5761253f6132ed565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612586575050601454936c04350edef012dc1267883400009350915050565b6125cc60066000601084815481106125a0576125a06132ed565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906124b5565b925061261460076000601084815481106125e8576125e86132ed565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906124b5565b91506001016124d9565b50601454612639906c04350edef012dc126788340000611b2a565b82101561265a575050601454926c04350edef012dc12678834000092509050565b90939092509050565b601b600281548110612677576126776132ed565b9060005260206000200154602081905550601c60028154811061269c5761269c6132ed565b9060005260206000200154602181905550601a6002815481106126c1576126c16132ed565b9060005260206000200154601f8190555060196002815481106126e6576126e66132ed565b9060005260206000200154601e81905550601d60028154811061270b5761270b6132ed565b600091825260209091200154602255565b601b600181548110612730576127306132ed565b9060005260206000200154602081905550601c600181548110612755576127556132ed565b9060005260206000200154602181905550601a60018154811061277a5761277a6132ed565b9060005260206000200154601f81905550601960018154811061279f5761279f6132ed565b9060005260206000200154601e81905550601d60018154811061270b5761270b6132ed565b601b6000815481106127d8576127d86132ed565b9060005260206000200154602081905550601c6000815481106127fd576127fd6132ed565b9060005260206000200154602181905550601a600081548110612822576128226132ed565b9060005260206000200154601f819055506019600081548110612847576128476132ed565b9060005260206000200154601e81905550601d60008154811061270b5761270b6132ed565b60006109cb61271061188d602254856123f890919063ffffffff16565b6000612893611b07565b905060006128a183836123f8565b6011546001600160a01b03166000908152600660205260409020549091506128c9908261229a565b601180546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612944576011546001600160a01b0316600090815260076020526040902054612928908461229a565b6011546001600160a01b03166000908152600760205260409020555b505050565b60006109cb61271061188d602154856123f890919063ffffffff16565b6000612970611b07565b9050600061297e83836123f8565b6013546001600160a01b03166000908152600660205260409020549091506129a6908261229a565b601380546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612944576013546001600160a01b0316600090815260076020526040902054612a05908461229a565b6013546001600160a01b0316600090815260076020526040902055505050565b6000806000806000806000612a398a612ded565b9650965096509650965096509650612a5e886118e98b876124b590919063ffffffff16565b9350612a91612a75612a6e611b07565b8a906123f8565b6118e9612a8a612a83611b07565b8d906123f8565b89906124b5565b6001600160a01b038d16600090815260076020526040902054909650612ab7908b6124b5565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612ae690886124b5565b6001600160a01b03808e1660009081526006602052604080822093909355908d1681522054612b15908761229a565b6001600160a01b038c16600090815260066020526040902055612b3782612e48565b612b4081612e48565b612b4a8584612ed0565b8160166000828254612b5c91906131ed565b925050819055508060176000828254612b7591906131ed565b9091555060009050612b87828461229a565b1115612bc357306001600160a01b038d166000805160206133ef833981519152612bb1848661229a565b60405190815260200160405180910390a35b8a6001600160a01b03168c6001600160a01b03166000805160206133ef83398151915286604051612bf691815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612c208a612ded565b9650965096509650965096509650612c45886118e98b876124b590919063ffffffff16565b9350612c55612a75612a6e611b07565b6001600160a01b038d16600090815260066020526040902054909650612c7b90886124b5565b6001600160a01b03808e16600090815260066020908152604080832094909455918e16815260079091522054612cb1908561229a565b6001600160a01b038c16600090815260076020908152604080832093909355600690522054612b15908761229a565b6000806000806000806000612cf48a612ded565b9650965096509650965096509650612d19886118e98b876124b590919063ffffffff16565b9350612d29612a75612a6e611b07565b6001600160a01b038d16600090815260066020526040902054909650612ae690886124b5565b6000806000806000806000612d638a612ded565b9650965096509650965096509650612d88886118e98b876124b590919063ffffffff16565b9350612d98612a75612a6e611b07565b6001600160a01b038d16600090815260076020526040902054909650612dbe908b6124b5565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612c7b90886124b5565b6000806000806000806000806000806000612e078c612ef4565b93509350935093506000806000612e288f878787612e23611b07565b612f43565b919f509d509b509599509397509195509350505050919395979092949650565b6000612e52611b07565b90506000612e6083836123f8565b30600090815260066020526040902054909150612e7d908261229a565b30600090815260066020908152604080832093909355600d9052205460ff16156129445730600090815260076020526040902054612ebb908461229a565b30600090815260076020526040902055505050565b601454612edd90836124b5565b601455601554612eed908261229a565b6015555050565b6000806000806000612f0586612fa5565b90506000612f1287612fc2565b90506000612f1f88612fdf565b90506000612f33826118e985818d896124b5565b9993985091965094509092505050565b6000808080612f5289866123f8565b90506000612f6089876123f8565b90506000612f6e89886123f8565b90506000612f7c89896123f8565b90506000612f90826118e9858189896124b5565b949d949c50929a509298505050505050505050565b60006109cb61271061188d602054856123f890919063ffffffff16565b60006109cb61271061188d601e54856123f890919063ffffffff16565b60006109cb61271061188d601f54856123f890919063ffffffff16565b60006020808352835180602085015260005b8181101561302a5785810183015185820160400152820161300e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610cf457600080fd5b6000806040838503121561307357600080fd5b823561307e8161304b565b946020939093013593505050565b60006020828403121561309e57600080fd5b5035919050565b6000806000606084860312156130ba57600080fd5b83356130c58161304b565b925060208401356130d58161304b565b929592945050506040919091013590565b6000602082840312156130f857600080fd5b8135610a988161304b565b8015158114610cf457600080fd5b6000806040838503121561312457600080fd5b823561312f8161304b565b9150602083013561313f81613103565b809150509250929050565b6000806040838503121561315d57600080fd5b82359150602083013561313f8161304b565b6000806040838503121561318257600080fd5b823561318d8161304b565b9150602083013561313f8161304b565b600181811c908216806131b157607f821691505b6020821081036131d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109cb576109cb6131d7565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b818103818111156109cb576109cb6131d7565b6020808252601290820152711cd95b99195c881b9bdd08185b1b1bddd95960721b604082015260600190565b6000602082840312156132c057600080fd5b8151610a9881613103565b6000826132e857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006020828403121561332b57600080fd5b8151610a988161304b565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b818110156133885784516001600160a01b031683529383019391830191600101613363565b50506001600160a01b03969096166060850152505050608001529392505050565b80820281158282048414176109cb576109cb6131d7565b6000806000606084860312156133d557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f60bf250932b92020dccedeb24a88c39dd1ad13a932e81eaf21a3c5c3df407be64736f6c63430008180033000000000000000000000000e242baa9d181d132f31ac48f59b38c84e3260709000000000000000000000000dae9dd3d1a52cfce9d5f2fac7fde164d500e50f7
Deployed ByteCode
0x6080604052600436106102975760003560e01c806382f2a18a1161015a578063a9059cbb116100c1578063dd62ed3e1161007a578063dd62ed3e1461086f578063e2f456051461088f578063ee99205c146108a5578063f2fde38b146108c5578063fcef8867146108e5578063fe3f52f41461090557600080fd5b8063a9059cbb14610792578063aec9b6f4146107b2578063b377f8ae146107d2578063c64a041b146107f2578063cec1460b1461081f578063d4d7b19a1461083f57600080fd5b806395d89b411161011357806395d89b41146106c35780639dd373b9146106d8578063a046bc78146106f8578063a08dbe7b14610718578063a153e70814610745578063a457c2d71461077257600080fd5b806382f2a18a146105fc57806388a06f8b1461061c57806388f82020146106495780638cadf61d146106795780638da5cb5b1461068f5780638fc97b81146106ad57600080fd5b806349ae028a116101fe5780636ba5b8b8116101b75780636ba5b8b81461055b57806370a0823114610571578063715018a6146105915780637326afe0146105a65780638188f71c146105c657806381905bf8146105dc57600080fd5b806349ae028a1461047e5780634df9cfb31461049e5780634ead1ef6146104cb5780634ec27aac146104eb5780635342acb41461050b57806357afa4c71461053b57600080fd5b8063255fe84711610250578063255fe847146103a05780632d838119146103d0578063313ce567146103f0578063371974a31461040c578063395093511461043c578063425d512a1461045c57600080fd5b806306228749146102a357806306fdde03146102e0578063095ea7b31461030257806313317aa01461033257806318160ddd1461036057806323b872dd1461038057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506011546102c3906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ec57600080fd5b506102f5610925565b6040516102d79190612ffc565b34801561030e57600080fd5b5061032261031d366004613060565b6109b7565b60405190151581526020016102d7565b34801561033e57600080fd5b5061035261034d36600461308c565b6109d1565b6040519081526020016102d7565b34801561036c57600080fd5b506c04350edef012dc126788340000610352565b34801561038c57600080fd5b5061032261039b3660046130a5565b6109f2565b3480156103ac57600080fd5b506103226103bb3660046130e6565b600e6020526000908152604090205460ff1681565b3480156103dc57600080fd5b506103526103eb36600461308c565b610a16565b3480156103fc57600080fd5b50604051601281526020016102d7565b34801561041857600080fd5b506103226104273660046130e6565b600c6020526000908152604090205460ff1681565b34801561044857600080fd5b50610322610457366004613060565b610a9f565b34801561046857600080fd5b5061047c6104773660046130e6565b610ac1565b005b34801561048a57600080fd5b5061035261049936600461308c565b610b97565b3480156104aa57600080fd5b506103526104b93660046130e6565b60096020526000908152604090205481565b3480156104d757600080fd5b506103526104e636600461308c565b610ba7565b3480156104f757600080fd5b5061047c610506366004613111565b610bb7565b34801561051757600080fd5b506103226105263660046130e6565b600b6020526000908152604090205460ff1681565b34801561054757600080fd5b5061047c61055636600461308c565b610c53565b34801561056757600080fd5b5061035260165481565b34801561057d57600080fd5b5061035261058c3660046130e6565b610cf7565b34801561059d57600080fd5b5061047c610d56565b3480156105b257600080fd5b5061047c6105c136600461314a565b610d6a565b3480156105d257600080fd5b5061035260185481565b3480156105e857600080fd5b5061047c6105f7366004613111565b610e67565b34801561060857600080fd5b5061047c61061736600461314a565b610ead565b34801561062857600080fd5b506103526106373660046130e6565b60066020526000908152604090205481565b34801561065557600080fd5b506103226106643660046130e6565b600d6020526000908152604090205460ff1681565b34801561068557600080fd5b5061035260265481565b34801561069b57600080fd5b506000546001600160a01b03166102c3565b3480156106b957600080fd5b5061035260175481565b3480156106cf57600080fd5b506102f5611020565b3480156106e457600080fd5b5061047c6106f33660046130e6565b61102f565b34801561070457600080fd5b5061035261071336600461308c565b611105565b34801561072457600080fd5b506103526107333660046130e6565b60076020526000908152604090205481565b34801561075157600080fd5b506103526107603660046130e6565b600a6020526000908152604090205481565b34801561077e57600080fd5b5061032261078d366004613060565b611115565b34801561079e57600080fd5b506103226107ad366004613060565b611190565b3480156107be57600080fd5b506023546102c3906001600160a01b031681565b3480156107de57600080fd5b506012546102c3906001600160a01b031681565b3480156107fe57600080fd5b5061035261080d3660046130e6565b60086020526000908152604090205481565b34801561082b57600080fd5b5061047c61083a36600461314a565b61119e565b34801561084b57600080fd5b5061032261085a3660046130e6565b600f6020526000908152604090205460ff1681565b34801561087b57600080fd5b5061035261088a36600461316f565b6112b9565b34801561089b57600080fd5b5061035260255481565b3480156108b157600080fd5b506013546102c3906001600160a01b031681565b3480156108d157600080fd5b5061047c6108e03660046130e6565b6112e4565b3480156108f157600080fd5b5061035261090036600461308c565b61135a565b34801561091157600080fd5b506024546102c3906001600160a01b031681565b6060600480546109349061319d565b80601f01602080910402602001604051908101604052809291908181526020018280546109609061319d565b80156109ad5780601f10610982576101008083540402835291602001916109ad565b820191906000526020600020905b81548152906001019060200180831161099057829003601f168201915b5050505050905090565b6000336109c581858561136a565b60019150505b92915050565b601a81815481106109e157600080fd5b600091825260209091200154905081565b600033610a0085828561148e565b610a0b858585611508565b506001949350505050565b6000601454821115610a825760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084015b60405180910390fd5b6000610a8c611b07565b9050610a988382611b2a565b9392505050565b6000336109c5818585610ab283836112b9565b610abc91906131ed565b61136a565b610ac9611b36565b6001600160a01b038116610aef5760405162461bcd60e51b8152600401610a7990613200565b6012546001600160a01b031615610b485760405162461bcd60e51b815260206004820152601860248201527f44414f20636f6e747261637420616c72656164792073657400000000000000006044820152606401610a79565b601280546001600160a01b0319166001600160a01b038316908117909155610b6f90611b90565b506012546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601d81815481106109e157600080fd5b601c81815481106109e157600080fd5b610bbf611b36565b6001600160a01b038216610be55760405162461bcd60e51b8152600401610a7990613200565b610bef8282611c50565b8015610c2557610bfe82611b90565b6001600160a01b0382166000908152600c60205260409020805460ff191660011790555050565b610c2e82611d11565b6001600160a01b0382166000908152600c60205260409020805460ff191690555b5050565b60008111610c735760405162461bcd60e51b8152600401610a7990613226565b336000818152600a60205260409020548291610c8e90610cf7565b610c98919061326f565b1015610ce65760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a79565b610cf4333083600180611e27565b50565b6001600160a01b0381166000908152600d602052604081205460ff1615610d3457506001600160a01b031660009081526007602052604090205490565b6001600160a01b0382166000908152600660205260409020546109cb90610a16565b610d5e611b36565b610d68600061224a565b565b6013546001600160a01b03163314610d945760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a6020526040902054821115610df45760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a79565b6001600160a01b0381166000908152600a602052604081208054849290610e1c90849061326f565b9091555050604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b91015b60405180910390a15050565b610e6f611b36565b6001600160a01b039091166000908152600c60209081526040808320805494151560ff199586168117909155600b9092529091208054909216179055565b6013546001600160a01b03163314610ed75760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a6020526040902054821115610f375760405162461bcd60e51b8152602060048201526015602482015274185b5bdd5b9d081a5cc81b9bdd0818dbdc9c9958dd605a1b6044820152606401610a79565b6001600160a01b0381166000908152600a602052604081208054849290610f5f90849061326f565b90915550506013546040516323b872dd60e01b81526001600160a01b03808416600483015290911660248201526044810183905230906323b872dd906064016020604051808303816000875af1158015610fbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe191906132ae565b50604080518381526001600160a01b03831660208201527f07f21a7b10dec6539c8130232c54cd2c270dfae3458016c8ddb4d29ac9d0a82b9101610e5b565b6060600580546109349061319d565b611037611b36565b6001600160a01b03811661105d5760405162461bcd60e51b8152600401610a7990613200565b6013546001600160a01b0316156110b65760405162461bcd60e51b815260206004820152601c60248201527f5374616b696e6720636f6e747261637420616c726561647920736574000000006044820152606401610a79565b601380546001600160a01b0319166001600160a01b0383169081179091556110dd90611b90565b506013546001600160a01b03166000908152600b60205260409020805460ff19166001179055565b601981815481106109e157600080fd5b6000338161112382866112b9565b9050838110156111835760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a79565b610a0b828686840361136a565b6000336109c5818585611508565b6013546001600160a01b031633146111c85760405162461bcd60e51b8152600401610a7990613282565b6001600160a01b0381166000908152600a60205260408120546111ea83610cf7565b6111f4919061326f565b9050828110156112465760405162461bcd60e51b815260206004820152601e60248201527f6c6f636b696e6720616d6f756e7420657863656564732062616c616e636500006044820152606401610a79565b6001600160a01b0382166000908152600a60205260408120805485929061126e9084906131ed565b9091555050604080518481526001600160a01b03841660208201527f73984e8db8b28e5bddacc2944750532e661c7b013e2cb7995f2e27cf54bb24d2910160405180910390a1505050565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6112ec611b36565b6001600160a01b0381166113515760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a79565b610cf48161224a565b601b81815481106109e157600080fd5b6001600160a01b0383166113cc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a79565b6001600160a01b03821661142d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a79565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600061149a84846112b9565b9050600019811461150257818110156114f55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a79565b611502848484840361136a565b50505050565b6001600160a01b03831661156c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a79565b6001600160a01b0382166115ce5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a79565b600081116115ee5760405162461bcd60e51b8152600401610a7990613226565b6001600160a01b0383166000908152600a6020526040902054819061161285610cf7565b61161c919061326f565b101561166a5760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657220616d6f756e7420657863656564732062616c616e6365006044820152606401610a79565b6001600160a01b0382166000908152600f602052604090205460ff166116c9576001600160a01b0382166000908152600f60205260408120805460ff1916600190811790915560188054919290916116c39084906131ed565b90915550505b806116d384610cf7565b6116dd919061326f565b60000361171d576001600160a01b0383166000908152600f60205260408120805460ff19169055601880546001929061171790849061326f565b90915550505b6001600160a01b0382166000908152600c602052604090205460ff1615801561175e57506001600160a01b0383166000908152600e602052604090205460ff165b156117da57600061176e83610cf7565b60265490915061177e83836131ed565b11156117d85760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d20627579207065722077616c6c6574206c6044820152631a5b5a5d60e21b6064820152608401610a79565b505b60006117e530610cf7565b602554909150811080159081906118065750602454600160a01b900460ff16155b801561182a57506001600160a01b0384166000908152600e602052604090205460ff165b1561198f57601654600090611840906002611b2a565b6017549091506000611852838361229a565b9050602554811061198b576024805460ff60a01b1916600160a01b17905560255461187c906122a6565b4760006118938361188d84886123f8565b90611b2a565b905060006118a1828461326f565b905081156118f45760006118c48561188d896025546123f890919063ffffffff16565b90506118d08184612404565b6118ef816118e9836016546124b590919063ffffffff16565b906124b5565b601655505b801561197a576012546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611947576040519150601f19603f3d011682016040523d82523d6000602084013e61194c565b606091505b5050905061197561196c8661188d896025546123f890919063ffffffff16565b601754906124b5565b601755505b50506024805460ff60a01b19169055505b5050505b6001600160a01b0385166000908152600b602052604090205460019060ff16806119d157506001600160a01b0385166000908152600b602052604090205460ff165b156119de57506000611af1565b306000908152600f602052604090205460ff16611a2b57306000908152600f60205260408120805460ff191660019081179091556018805491929091611a259084906131ed565b90915550505b6013546001600160a01b03166000908152600f602052604090205460ff16611a8e576013546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611a889084906131ed565b90915550505b6011546001600160a01b03166000908152600f602052604090205460ff16611af1576011546001600160a01b03166000908152600f60205260408120805460ff191660019081179091556018805491929091611aeb9084906131ed565b90915550505b611aff868686846000611e27565b505050505050565b6000806000611b146124c1565b9092509050611b238282611b2a565b9250505090565b6000610a9882846132cb565b6000546001600160a01b03163314610d685760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a79565b6001600160a01b03811660009081526006602052604090205415611bea576001600160a01b038116600090815260066020526040902054611bd090610a16565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600d60205260408120805460ff191660019081179091556010805491820181559091527f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319169091179055565b6001600160a01b0382166000908152600e602052604090205481151560ff909116151503611ce65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610a79565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b60005b601054811015610c4f57816001600160a01b031660108281548110611d3b57611d3b6132ed565b6000918252602090912001546001600160a01b031603611e1f5760108054611d659060019061326f565b81548110611d7557611d756132ed565b600091825260209091200154601080546001600160a01b039092169183908110611da157611da16132ed565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600d90925220805460ff191690556010805480611df957611df9613303565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b600101611d14565b6001600160a01b03851660009081526008602052604081208054859290611e4f9084906131ed565b90915550829050611e7d57611e78600060208190556021819055601f819055601e819055602255565b611f22565b8015611ea257611e7861271060205560006021819055601f819055601e819055602255565b6001600160a01b0385166000908152600e602052604090205460ff16158015611ee457506001600160a01b0384166000908152600e602052604090205460ff16155b15611ef157611e78612663565b6001600160a01b0384166000908152600e602052604090205460ff1615611f1a57611e7861271c565b611f226127c4565b6000602254601e54601f54602154602054611f3d91906131ed565b611f4791906131ed565b611f5191906131ed565b611f5b91906131ed565b90508015611fb5576000611f7561271061188d87856123f8565b9050611f8185826124b5565b6001600160a01b03871660009081526009602052604081208054909190611fa99084906131ed565b90915550611fe3915050565b6001600160a01b03851660009081526009602052604081208054869290611fdd9084906131ed565b90915550505b6000611fee8561286c565b9050801561203357611fff81612889565b6011546040518281526001600160a01b03918216918916906000805160206133ef8339815191529060200160405180910390a35b600061203e86612949565b905080156120e25761204f81612966565b6013546040516328f582d360e11b8152600481018390526001600160a01b03909116906351eb05a690602401600060405180830381600087803b15801561209557600080fd5b505af11580156120a9573d6000803e3d6000fd5b50506013546040518481526001600160a01b039182169350908b1691506000805160206133ef8339815191529060200160405180910390a35b6001600160a01b0388166000908152600d602052604090205460ff16801561212357506001600160a01b0387166000908152600d602052604090205460ff16155b1561213a576121358888888486612a25565b612240565b6001600160a01b0388166000908152600d602052604090205460ff1615801561217b57506001600160a01b0387166000908152600d602052604090205460ff165b1561218d576121358888888486612c0c565b6001600160a01b0388166000908152600d602052604090205460ff161580156121cf57506001600160a01b0387166000908152600d602052604090205460ff16155b156121e1576121358888888486612ce0565b6001600160a01b0388166000908152600d602052604090205460ff16801561222157506001600160a01b0387166000908152600d602052604090205460ff165b15612233576121358888888486612d4f565b6122408888888486612ce0565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610a9882846131ed565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106122db576122db6132ed565b6001600160a01b039283166020918202929092018101919091526023546040805163ef8ef56f60e01b81529051919093169263ef8ef56f9260048083019391928290030181865afa158015612334573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123589190613319565b8160018151811061236b5761236b6132ed565b6001600160a01b039283166020918202929092010152602354612391913091168461136a565b60235460405163791ac94760e01b81526001600160a01b039091169063791ac947906123ca908590600090869030904290600401613336565b600060405180830381600087803b1580156123e457600080fd5b505af1158015611aff573d6000803e3d6000fd5b6000610a9882846133a9565b60235461241c9030906001600160a01b03168461136a565b60235460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015612489573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124ae91906133c0565b5050505050565b6000610a98828461326f565b60145460009081906c04350edef012dc126788340000825b60105481101561261e578260066000601084815481106124fb576124fb6132ed565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612566575081600760006010848154811061253f5761253f6132ed565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612586575050601454936c04350edef012dc1267883400009350915050565b6125cc60066000601084815481106125a0576125a06132ed565b60009182526020808320909101546001600160a01b0316835282019290925260400190205484906124b5565b925061261460076000601084815481106125e8576125e86132ed565b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906124b5565b91506001016124d9565b50601454612639906c04350edef012dc126788340000611b2a565b82101561265a575050601454926c04350edef012dc12678834000092509050565b90939092509050565b601b600281548110612677576126776132ed565b9060005260206000200154602081905550601c60028154811061269c5761269c6132ed565b9060005260206000200154602181905550601a6002815481106126c1576126c16132ed565b9060005260206000200154601f8190555060196002815481106126e6576126e66132ed565b9060005260206000200154601e81905550601d60028154811061270b5761270b6132ed565b600091825260209091200154602255565b601b600181548110612730576127306132ed565b9060005260206000200154602081905550601c600181548110612755576127556132ed565b9060005260206000200154602181905550601a60018154811061277a5761277a6132ed565b9060005260206000200154601f81905550601960018154811061279f5761279f6132ed565b9060005260206000200154601e81905550601d60018154811061270b5761270b6132ed565b601b6000815481106127d8576127d86132ed565b9060005260206000200154602081905550601c6000815481106127fd576127fd6132ed565b9060005260206000200154602181905550601a600081548110612822576128226132ed565b9060005260206000200154601f819055506019600081548110612847576128476132ed565b9060005260206000200154601e81905550601d60008154811061270b5761270b6132ed565b60006109cb61271061188d602254856123f890919063ffffffff16565b6000612893611b07565b905060006128a183836123f8565b6011546001600160a01b03166000908152600660205260409020549091506128c9908261229a565b601180546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612944576011546001600160a01b0316600090815260076020526040902054612928908461229a565b6011546001600160a01b03166000908152600760205260409020555b505050565b60006109cb61271061188d602154856123f890919063ffffffff16565b6000612970611b07565b9050600061297e83836123f8565b6013546001600160a01b03166000908152600660205260409020549091506129a6908261229a565b601380546001600160a01b0390811660009081526006602090815260408083209590955592549091168152600d909152205460ff1615612944576013546001600160a01b0316600090815260076020526040902054612a05908461229a565b6013546001600160a01b0316600090815260076020526040902055505050565b6000806000806000806000612a398a612ded565b9650965096509650965096509650612a5e886118e98b876124b590919063ffffffff16565b9350612a91612a75612a6e611b07565b8a906123f8565b6118e9612a8a612a83611b07565b8d906123f8565b89906124b5565b6001600160a01b038d16600090815260076020526040902054909650612ab7908b6124b5565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612ae690886124b5565b6001600160a01b03808e1660009081526006602052604080822093909355908d1681522054612b15908761229a565b6001600160a01b038c16600090815260066020526040902055612b3782612e48565b612b4081612e48565b612b4a8584612ed0565b8160166000828254612b5c91906131ed565b925050819055508060176000828254612b7591906131ed565b9091555060009050612b87828461229a565b1115612bc357306001600160a01b038d166000805160206133ef833981519152612bb1848661229a565b60405190815260200160405180910390a35b8a6001600160a01b03168c6001600160a01b03166000805160206133ef83398151915286604051612bf691815260200190565b60405180910390a3505050505050505050505050565b6000806000806000806000612c208a612ded565b9650965096509650965096509650612c45886118e98b876124b590919063ffffffff16565b9350612c55612a75612a6e611b07565b6001600160a01b038d16600090815260066020526040902054909650612c7b90886124b5565b6001600160a01b03808e16600090815260066020908152604080832094909455918e16815260079091522054612cb1908561229a565b6001600160a01b038c16600090815260076020908152604080832093909355600690522054612b15908761229a565b6000806000806000806000612cf48a612ded565b9650965096509650965096509650612d19886118e98b876124b590919063ffffffff16565b9350612d29612a75612a6e611b07565b6001600160a01b038d16600090815260066020526040902054909650612ae690886124b5565b6000806000806000806000612d638a612ded565b9650965096509650965096509650612d88886118e98b876124b590919063ffffffff16565b9350612d98612a75612a6e611b07565b6001600160a01b038d16600090815260076020526040902054909650612dbe908b6124b5565b6001600160a01b038d16600090815260076020908152604080832093909355600690522054612c7b90886124b5565b6000806000806000806000806000806000612e078c612ef4565b93509350935093506000806000612e288f878787612e23611b07565b612f43565b919f509d509b509599509397509195509350505050919395979092949650565b6000612e52611b07565b90506000612e6083836123f8565b30600090815260066020526040902054909150612e7d908261229a565b30600090815260066020908152604080832093909355600d9052205460ff16156129445730600090815260076020526040902054612ebb908461229a565b30600090815260076020526040902055505050565b601454612edd90836124b5565b601455601554612eed908261229a565b6015555050565b6000806000806000612f0586612fa5565b90506000612f1287612fc2565b90506000612f1f88612fdf565b90506000612f33826118e985818d896124b5565b9993985091965094509092505050565b6000808080612f5289866123f8565b90506000612f6089876123f8565b90506000612f6e89886123f8565b90506000612f7c89896123f8565b90506000612f90826118e9858189896124b5565b949d949c50929a509298505050505050505050565b60006109cb61271061188d602054856123f890919063ffffffff16565b60006109cb61271061188d601e54856123f890919063ffffffff16565b60006109cb61271061188d601f54856123f890919063ffffffff16565b60006020808352835180602085015260005b8181101561302a5785810183015185820160400152820161300e565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610cf457600080fd5b6000806040838503121561307357600080fd5b823561307e8161304b565b946020939093013593505050565b60006020828403121561309e57600080fd5b5035919050565b6000806000606084860312156130ba57600080fd5b83356130c58161304b565b925060208401356130d58161304b565b929592945050506040919091013590565b6000602082840312156130f857600080fd5b8135610a988161304b565b8015158114610cf457600080fd5b6000806040838503121561312457600080fd5b823561312f8161304b565b9150602083013561313f81613103565b809150509250929050565b6000806040838503121561315d57600080fd5b82359150602083013561313f8161304b565b6000806040838503121561318257600080fd5b823561318d8161304b565b9150602083013561313f8161304b565b600181811c908216806131b157607f821691505b6020821081036131d157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156109cb576109cb6131d7565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b60208082526029908201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206040820152687468616e207a65726f60b81b606082015260800190565b818103818111156109cb576109cb6131d7565b6020808252601290820152711cd95b99195c881b9bdd08185b1b1bddd95960721b604082015260600190565b6000602082840312156132c057600080fd5b8151610a9881613103565b6000826132e857634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60006020828403121561332b57600080fd5b8151610a988161304b565b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b818110156133885784516001600160a01b031683529383019391830191600101613363565b50506001600160a01b03969096166060850152505050608001529392505050565b80820281158282048414176109cb576109cb6131d7565b6000806000606084860312156133d557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220f60bf250932b92020dccedeb24a88c39dd1ad13a932e81eaf21a3c5c3df407be64736f6c63430008180033