false
true
0

Contract Address Details

0x1dFf9e7626E55D17Fa3f8Ae16Fd267257E71F5D7

Token
Sad Keanu: https://sadkeanu.cc (SadKeanu)
Creator
0x96965e–fe6590 at 0x19e889–bf1a42
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
876 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26072631
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
SadKeanu




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
1000000
EVM Version
default




Verified at
2023-05-23T02:38:43.642927Z

contracts/SadKeanu.sol

/*
 * SPDX-License-Identifier: MIT
 *
 * @title SadKeanu - Sad Keanu Meme Coin
 *
 * Total supply -> 369,369,369,369,369
 * No new tokens can be minted ever.
 * 95% supply in LP and LP tokens burnt!!!!
 * 0.1% of any trade or transfer is burnt forever
 * 0.1% of any trade or transfer is for growth
 */
pragma solidity ^0.8.19;

import "./openzeppelin/token/ERC20/IERC20.sol";
import "./openzeppelin/token/ERC20/extensions/IERC20Metadata.sol";
import "./openzeppelin/utils/Context.sol";
import "./openzeppelin/security/ReentrancyGuard.sol";

contract SadKeanu is Context, IERC20, IERC20Metadata, ReentrancyGuard {
    address public deployer;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) private _balances;
    string private _name = "Sad Keanu: https://sadkeanu.cc";
    string private _symbol = "SadKeanu";
    uint256 private _totalSupply = 369_369_369_369_369_000_000_000_000_000_000;
    uint256 private constant _BIPS = 10000;
    uint256 public _maxWalletToken = (_totalSupply * 3) / 100;
    mapping(address => bool) private _excludedFromAntiWhale;
    uint256 private constant FEE_BIPS = 10;
    uint256 private constant NO_OF_FEES = 2;

    event MaxWalletTokenUpdated(uint256 newMaxWalletToken);
    event AntiWhaleExclusionChanged(address account, bool excluded);
    event Received(address, uint);

    modifier onlyDeployer() {
        _checkDeployer();
        _;
    }

    constructor() {
        require(msg.sender != address(0), "Deployer Zero!");
        deployer = msg.sender;
        _excludedFromAntiWhale[deployer] = true;
        _balances[deployer] += _totalSupply;
        emit Transfer(address(0), deployer, _totalSupply);
    }

    receive() external payable {
        emit Received(msg.sender, msg.value);
    }

    fallback() external payable {
        emit Received(msg.sender, msg.value);
    }

    function _checkDeployer() internal view virtual {
        require(deployer == msg.sender, "Unauthorized");
    }

    function name() external view returns (string memory) {
        return _name;
    }

    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return 18;
    }

    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) external returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= subtractedValue, "Low Allowance");
        _approve(owner, spender, currentAllowance - subtractedValue);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) private {
        if (_skipWhaleCheck(from, to)) {
            require(
                _balances[to] + amount <= _maxWalletToken,
                "Whale Not Allowed"
            );
        }

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "Balance Low");

        uint256 fee;
        uint256 netAmount;
        if (from != deployer && to != deployer) {
            (fee, netAmount) = _calculateFees(amount);
            _balances[from] = fromBalance - amount;
            _balances[to] += netAmount;
            emit Transfer(from, to, netAmount);

            _balances[deployer] += fee;
            emit Transfer(from, deployer, fee);

            _balances[address(0)] += fee;
            emit Transfer(from, address(0), fee);
        } else {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
            emit Transfer(from, to, amount);
        }
    }

    function _calculateFees(
        uint256 amount
    ) private pure returns (uint256 fee, uint256 netAmount) {
        fee = (amount * FEE_BIPS) / _BIPS;
        netAmount = amount - NO_OF_FEES * fee;
        return (fee, netAmount);
    }

    function _skipWhaleCheck(
        address from,
        address to
    ) internal view returns (bool) {
        return (from != deployer &&
            to != deployer &&
            !_excludedFromAntiWhale[to]);
    }

    function _approve(address owner, address spender, uint256 amount) private {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) private {
        uint256 currentAllowance = _allowances[owner][spender];
        if (currentAllowance != type(uint256).max) {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _checkAllowance(
        uint256 currentAllowance
    ) internal pure returns (bool) {
        return (currentAllowance != type(uint256).max);
    }

    function withdraw() external payable nonReentrant {
        uint256 amount = address(this).balance;
        require(amount > 0, "Zero Balance");

        (bool sent, ) = deployer.call{value: amount}("");
        require(sent, "Send Failed");
    }

    function reclaimToken(IERC20 token) external onlyDeployer {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(deployer, balance);
    }

    function setMaxWalletToken(uint256 maxWalletToken) external onlyDeployer {
        require(maxWalletToken <= _totalSupply, "Too High!");
        _maxWalletToken = maxWalletToken;
        emit MaxWalletTokenUpdated(maxWalletToken);
    }

    function excludeFromAntiWhale(address account) external onlyDeployer {
        _excludedFromAntiWhale[account] = true;
        emit AntiWhaleExclusionChanged(account, true);
    }

    function includeInAntiWhale(address account) external onlyDeployer {
        _excludedFromAntiWhale[account] = false;
        emit AntiWhaleExclusionChanged(account, false);
    }

    function burn(uint256 amount) external {
        _balances[msg.sender] = _balances[msg.sender] - amount;
        emit Transfer(msg.sender, address(0), amount);
    }
}
        

contracts/openzeppelin/token/ERC20/extensions/IERC20Metadata.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

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/openzeppelin/security/ReentrancyGuard.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
          

contracts/openzeppelin/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

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/openzeppelin/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":1000000,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWalletToken","inputs":[]},{"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":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","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":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"deployer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromAntiWhale","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInAntiWhale","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"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":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"reclaimToken","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxWalletToken","inputs":[{"type":"uint256","name":"maxWalletToken","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","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":"payable","outputs":[],"name":"withdraw","inputs":[]},{"type":"event","name":"AntiWhaleExclusionChanged","inputs":[{"type":"address","name":"account","indexed":false},{"type":"bool","name":"excluded","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"MaxWalletTokenUpdated","inputs":[{"type":"uint256","name":"newMaxWalletToken","indexed":false}],"anonymous":false},{"type":"event","name":"Received","inputs":[{"type":"address","name":"","indexed":false},{"type":"uint256","name":"","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"receive"},{"type":"fallback"}]
              

Contract Creation Code

0x60c0604052601e60809081527f536164204b65616e753a2068747470733a2f2f7361646b65616e752e6363000060a0526004906200003e908262000248565b506040805180820190915260088152675361644b65616e7560c01b60208201526005906200006d908262000248565b506d123618cd369987c3fc1fe4c40000600655606460065460036200009391906200032a565b6200009f91906200034a565b600755348015620000af57600080fd5b50600160005533620000f85760405162461bcd60e51b815260206004820152600e60248201526d4465706c6f796572205a65726f2160901b604482015260640160405180910390fd5b600180546001600160a01b0319163390811782556000908152600860209081526040808320805460ff19168517905560065493546001600160a01b03168352600390915281208054909190620001509084906200036d565b90915550506001546006546040519081526001600160a01b03909116906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a362000383565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ce57607f821691505b602082108103620001ef57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200024357600081815260208120601f850160051c810160208610156200021e5750805b601f850160051c820191505b818110156200023f578281556001016200022a565b5050505b505050565b81516001600160401b03811115620002645762000264620001a3565b6200027c81620002758454620001b9565b84620001f5565b602080601f831160018114620002b457600084156200029b5750858301515b600019600386901b1c1916600185901b1785556200023f565b600085815260208120601f198616915b82811015620002e557888601518255948401946001909101908401620002c4565b5085821015620003045787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000344576200034462000314565b92915050565b6000826200036857634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000344576200034462000314565b6114d080620003936000396000f3fe6080604052600436106101485760003560e01c80634c658048116100c0578063a457c2d711610074578063bf32371911610059578063bf323719146103cb578063d5f39488146103eb578063dd62ed3e1461043d57610188565b8063a457c2d71461038b578063a9059cbb146103ab57610188565b806378109e54116100a557806378109e541461034057806391d55f411461035657806395d89b411461037657610188565b80634c658048146102dd57806370a08231146102fd57610188565b806323b872dd1161011757806339509351116100fc57806339509351146102955780633ccfd60b146102b557806342966c68146102bd57610188565b806323b872dd14610259578063313ce5671461027957610188565b806306fdde03146101bd578063095ea7b3146101e857806317ffc3201461021857806318160ddd1461023a57610188565b3661018857604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491015b60405180910390a1005b604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910161017e565b3480156101c957600080fd5b506101d2610490565b6040516101df91906111f8565b60405180910390f35b3480156101f457600080fd5b50610208610203366004611289565b610522565b60405190151581526020016101df565b34801561022457600080fd5b506102386102333660046112b5565b61053c565b005b34801561024657600080fd5b506006545b6040519081526020016101df565b34801561026557600080fd5b506102086102743660046112d2565b610679565b34801561028557600080fd5b50604051601281526020016101df565b3480156102a157600080fd5b506102086102b0366004611289565b61069d565b6102386106e9565b3480156102c957600080fd5b506102386102d8366004611313565b610836565b3480156102e957600080fd5b506102386102f83660046112b5565b6108a1565b34801561030957600080fd5b5061024b6103183660046112b5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b34801561034c57600080fd5b5061024b60075481565b34801561036257600080fd5b50610238610371366004611313565b610936565b34801561038257600080fd5b506101d26109df565b34801561039757600080fd5b506102086103a6366004611289565b6109ee565b3480156103b757600080fd5b506102086103c6366004611289565b610a9b565b3480156103d757600080fd5b506102386103e63660046112b5565b610aa9565b3480156103f757600080fd5b506001546104189073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101df565b34801561044957600080fd5b5061024b61045836600461132c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b60606004805461049f90611365565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb90611365565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b5050505050905090565b600033610530818585610b33565b60019150505b92915050565b610544610ba1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d591906113b8565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906113d1565b505050565b600033610687858285610c22565b610692858585610c91565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061053090829086906106e4908790611422565b610b33565b6106f16110ca565b478061075e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f2042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d80600081146107b8576040519150601f19603f3d011682016040523d82523d6000602084013e6107bd565b606091505b5050905080610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53656e64204661696c65640000000000000000000000000000000000000000006044820152606401610755565b50506108346001600055565b565b33600090815260036020526040902054610851908290611435565b336000818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108969085815260200190565b60405180910390a350565b6108a9610ba1565b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558251938452908301527f6967fd9beca531ca64fc6f897b579e9ea3e2e937cf55341df2151665ba43d5ef91015b60405180910390a150565b61093e610ba1565b6006548111156109aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f546f6f20486967682100000000000000000000000000000000000000000000006044820152606401610755565b60078190556040518181527fada23ae66cc6f76e527b8479635662be4c018ffeaac7392934330179340ad3749060200161092b565b60606005805461049f90611365565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4c6f7720416c6c6f77616e6365000000000000000000000000000000000000006044820152606401610755565b61069282866106e48785611435565b600033610530818585610c91565b610ab1610ba1565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260086020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051938452908301919091527f6967fd9beca531ca64fc6f897b579e9ea3e2e937cf55341df2151665ba43d5ef910161092b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610755565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c8b57610c8b84846106e48585611435565b50505050565b610c9b838361113d565b15610d3c5760075473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040902054610cd4908390611422565b1115610d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5768616c65204e6f7420416c6c6f7765640000000000000000000000000000006044820152606401610755565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205481811015610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42616c616e6365204c6f770000000000000000000000000000000000000000006044820152606401610755565b600154600090819073ffffffffffffffffffffffffffffffffffffffff878116911614801590610e17575060015473ffffffffffffffffffffffffffffffffffffffff868116911614155b1561100657610e25846111bf565b9092509050610e348484611435565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600360205260408082209390935590871681529081208054839290610e77908490611422565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610edd91815260200190565b60405180910390a360015473ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604081208054849290610f1c908490611422565b909155505060015460405183815273ffffffffffffffffffffffffffffffffffffffff918216918816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3600080805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff8054849290610fae908490611422565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36110c2565b6110108484611435565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600360205260408082209390935590871681529081208054869290611053908490611422565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110b991815260200190565b60405180910390a35b505050505050565b600260005403611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610755565b6002600055565b60015460009073ffffffffffffffffffffffffffffffffffffffff848116911614801590611186575060015473ffffffffffffffffffffffffffffffffffffffff838116911614155b80156111b8575073ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff16155b9392505050565b6000806127106111d0600a85611448565b6111da919061145f565b91506111e7826002611448565b6111f19084611435565b9050915091565b600060208083528351808285015260005b8181101561122557858101830151858201604001528201611209565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461128657600080fd5b50565b6000806040838503121561129c57600080fd5b82356112a781611264565b946020939093013593505050565b6000602082840312156112c757600080fd5b81356111b881611264565b6000806000606084860312156112e757600080fd5b83356112f281611264565b9250602084013561130281611264565b929592945050506040919091013590565b60006020828403121561132557600080fd5b5035919050565b6000806040838503121561133f57600080fd5b823561134a81611264565b9150602083013561135a81611264565b809150509250929050565b600181811c9082168061137957607f821691505b6020821081036113b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156113ca57600080fd5b5051919050565b6000602082840312156113e357600080fd5b815180151581146111b857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610536576105366113f3565b81810381811115610536576105366113f3565b8082028115828204841417610536576105366113f3565b600082611495577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea26469706673582212204a5f80eb4681c3fe0de6125a8ad7395dc82f0c9434543264677ec0b5a9a96d7d64736f6c63430008130033

Deployed ByteCode

0x6080604052600436106101485760003560e01c80634c658048116100c0578063a457c2d711610074578063bf32371911610059578063bf323719146103cb578063d5f39488146103eb578063dd62ed3e1461043d57610188565b8063a457c2d71461038b578063a9059cbb146103ab57610188565b806378109e54116100a557806378109e541461034057806391d55f411461035657806395d89b411461037657610188565b80634c658048146102dd57806370a08231146102fd57610188565b806323b872dd1161011757806339509351116100fc57806339509351146102955780633ccfd60b146102b557806342966c68146102bd57610188565b806323b872dd14610259578063313ce5671461027957610188565b806306fdde03146101bd578063095ea7b3146101e857806317ffc3201461021857806318160ddd1461023a57610188565b3661018857604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587491015b60405180910390a1005b604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910161017e565b3480156101c957600080fd5b506101d2610490565b6040516101df91906111f8565b60405180910390f35b3480156101f457600080fd5b50610208610203366004611289565b610522565b60405190151581526020016101df565b34801561022457600080fd5b506102386102333660046112b5565b61053c565b005b34801561024657600080fd5b506006545b6040519081526020016101df565b34801561026557600080fd5b506102086102743660046112d2565b610679565b34801561028557600080fd5b50604051601281526020016101df565b3480156102a157600080fd5b506102086102b0366004611289565b61069d565b6102386106e9565b3480156102c957600080fd5b506102386102d8366004611313565b610836565b3480156102e957600080fd5b506102386102f83660046112b5565b6108a1565b34801561030957600080fd5b5061024b6103183660046112b5565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b34801561034c57600080fd5b5061024b60075481565b34801561036257600080fd5b50610238610371366004611313565b610936565b34801561038257600080fd5b506101d26109df565b34801561039757600080fd5b506102086103a6366004611289565b6109ee565b3480156103b757600080fd5b506102086103c6366004611289565b610a9b565b3480156103d757600080fd5b506102386103e63660046112b5565b610aa9565b3480156103f757600080fd5b506001546104189073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101df565b34801561044957600080fd5b5061024b61045836600461132c565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205490565b60606004805461049f90611365565b80601f01602080910402602001604051908101604052809291908181526020018280546104cb90611365565b80156105185780601f106104ed57610100808354040283529160200191610518565b820191906000526020600020905b8154815290600101906020018083116104fb57829003601f168201915b5050505050905090565b600033610530818585610b33565b60019150505b92915050565b610544610ba1565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa1580156105b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d591906113b8565b6001546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526024810183905291925083169063a9059cbb906044016020604051808303816000875af1158015610650573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067491906113d1565b505050565b600033610687858285610c22565b610692858585610c91565b506001949350505050565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061053090829086906106e4908790611422565b610b33565b6106f16110ca565b478061075e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f5a65726f2042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d80600081146107b8576040519150601f19603f3d011682016040523d82523d6000602084013e6107bd565b606091505b5050905080610828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f53656e64204661696c65640000000000000000000000000000000000000000006044820152606401610755565b50506108346001600055565b565b33600090815260036020526040902054610851908290611435565b336000818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108969085815260200190565b60405180910390a350565b6108a9610ba1565b73ffffffffffffffffffffffffffffffffffffffff811660008181526008602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558251938452908301527f6967fd9beca531ca64fc6f897b579e9ea3e2e937cf55341df2151665ba43d5ef91015b60405180910390a150565b61093e610ba1565b6006548111156109aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f546f6f20486967682100000000000000000000000000000000000000000000006044820152606401610755565b60078190556040518181527fada23ae66cc6f76e527b8479635662be4c018ffeaac7392934330179340ad3749060200161092b565b60606005805461049f90611365565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610a8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4c6f7720416c6c6f77616e6365000000000000000000000000000000000000006044820152606401610755565b61069282866106e48785611435565b600033610530818585610c91565b610ab1610ba1565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260086020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690558051938452908301919091527f6967fd9beca531ca64fc6f897b579e9ea3e2e937cf55341df2151665ba43d5ef910161092b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401610755565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600260209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c8b57610c8b84846106e48585611435565b50505050565b610c9b838361113d565b15610d3c5760075473ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040902054610cd4908390611422565b1115610d3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5768616c65204e6f7420416c6c6f7765640000000000000000000000000000006044820152606401610755565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604090205481811015610dcc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42616c616e6365204c6f770000000000000000000000000000000000000000006044820152606401610755565b600154600090819073ffffffffffffffffffffffffffffffffffffffff878116911614801590610e17575060015473ffffffffffffffffffffffffffffffffffffffff868116911614155b1561100657610e25846111bf565b9092509050610e348484611435565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600360205260408082209390935590871681529081208054839290610e77908490611422565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610edd91815260200190565b60405180910390a360015473ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604081208054849290610f1c908490611422565b909155505060015460405183815273ffffffffffffffffffffffffffffffffffffffff918216918816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3600080805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff8054849290610fae908490611422565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36110c2565b6110108484611435565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152600360205260408082209390935590871681529081208054869290611053908490611422565b925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110b991815260200190565b60405180910390a35b505050505050565b600260005403611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610755565b6002600055565b60015460009073ffffffffffffffffffffffffffffffffffffffff848116911614801590611186575060015473ffffffffffffffffffffffffffffffffffffffff838116911614155b80156111b8575073ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff16155b9392505050565b6000806127106111d0600a85611448565b6111da919061145f565b91506111e7826002611448565b6111f19084611435565b9050915091565b600060208083528351808285015260005b8181101561122557858101830151858201604001528201611209565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461128657600080fd5b50565b6000806040838503121561129c57600080fd5b82356112a781611264565b946020939093013593505050565b6000602082840312156112c757600080fd5b81356111b881611264565b6000806000606084860312156112e757600080fd5b83356112f281611264565b9250602084013561130281611264565b929592945050506040919091013590565b60006020828403121561132557600080fd5b5035919050565b6000806040838503121561133f57600080fd5b823561134a81611264565b9150602083013561135a81611264565b809150509250929050565b600181811c9082168061137957607f821691505b6020821081036113b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156113ca57600080fd5b5051919050565b6000602082840312156113e357600080fd5b815180151581146111b857600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610536576105366113f3565b81810381811115610536576105366113f3565b8082028115828204841417610536576105366113f3565b600082611495577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea26469706673582212204a5f80eb4681c3fe0de6125a8ad7395dc82f0c9434543264677ec0b5a9a96d7d64736f6c63430008130033