ETH Price: $3,470.93 (+4.61%)

Token

ERC837 (ERC837)
 

Overview

Max Total Supply

10,000 ERC837

Holders

206

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
4.566759043 ERC837

Value
$0.00
0xb3eabfdd364b27036039b2a6122b381a0ca9f84a
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ERC837

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : erc837.sol
// SPDX-License-Identifier: MIT

/*
ERC-837 is a new standard enabling users to place bets directly within ERC-20 token smart contracts, adding a fresh layer to decentralized betting. 
Try out the betting system through our DApp or interact directly with the smart contract!

Website: https://837.finance/
Github: https://github.com/ERC837/ERC-837
Medium: https://medium.com/@837finance/erc-837-revolutionizing-decentralized-betting-1eae2708d8e6
Telegram: https://t.me/ERC837
X: https://x.com/ERC_837

*/


pragma solidity 0.8.27;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }

}

contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

}

interface IUniswapV2Factory {
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function factory() external pure returns (address);
    function WETH() 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);
}

contract ERC837 is Context, IERC20, Ownable {

    using Counters for Counters.Counter;
    using SafeMath for uint256;

    // ======================================================================== [ STORAGE ] ======================================================================== //

    // The struct handling the bets.
    struct Bet {
        address initializer; // @notice The address that initializes the bet.
        string title; // @notice The title of the bet.
        uint256 deadlineBlock; // @notice The block that closes the bet.
        string[] options; // @notice The available options to bet on.
        address[] walletsBets; // @notice This array keeps track of all the wallets that bet.
        mapping(address => uint256) chosenBet; // @notice This mapping keeps track of the option the wallet bet on.
        mapping(address => uint256) balanceBet; // @notice This mapping keeps track of the bets balance placed by every wallet.
        uint256 balance; // @notice The balance stored in the bet.
        bool closed; // @notice If the bet was closed by the initializer.
    }

    Counters.Counter public atBet; // @notice Counter that keeps track of the last bet.
    mapping(uint256 => Bet) public allBets; // @notice Mapping that stores all the bets.
    uint256 public MIN_DEADLINE_DURATION = 300; // @notice The minimum deadline value for the bets.
    uint256 public MAX_BET_OPTIONS = 3; // @notice The maximum amount of options available per bet.
    uint256 public CLOSING_FEE = 5; // @notice The fee kept by the contract in tokens on bet closing. (%)

    /**
     * @notice Event emitted when a new bet is created.
     * @param betId The returned ID of the bet.
     * @param initializer The address of the initializer.
     * @param title The title of the bet.
     * @param options The available options the users can bet on.
     * @param deadlineBlock The block number at which betting will end.
     */
    event BetCreated(uint256 indexed betId, address initializer, string title, string[] options, uint256 deadlineBlock);

    /**
     * @notice Event emitted when a bet is closed.
     * @param betId The ID of the bet.
     * @param initializer The address of the initializer that closes the bet.
     * @param winningOption The option that won the bet.
     */
    event BetClosed(uint256 indexed betId, address initializer, uint256 winningOption);

    
    /**
     * @notice Event emitted when a bet is placed by an user.
     * @param betId The ID of the bet.
     * @param wallet The address of the user that places the bet.
     * @param option The user's betting option.
     */
    event BetPlaced(uint256 indexed betId, address wallet, uint256 option);

    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) private _isExcludedFromFee;
    mapping (address => bool) private bots;
    address payable private _taxWallet;
    string private constant _name = unicode'ERC837';
    string private constant _symbol = unicode'ERC837';

    uint256 private _initialBuyTax=17;
    uint256 private _initialSellTax=19;
    uint256 private _finalBuyTax=0;
    uint256 private _finalSellTax=0;
    uint256 private _reduceBuyTaxAt=25;
    uint256 private _reduceSellTaxAt=25;
    uint256 private _preventSwapBefore=36;
    uint256 private _buyCount=0;

    uint8 private constant _decimals = 9;
    uint256 private constant _tTotal = 10000 * 10**_decimals;
    uint256 public _maxTxAmount = 200 * 10**_decimals;
    uint256 public _maxWalletSize = 200 * 10**_decimals;
    uint256 public _taxSwapThreshold= 100 * 10**_decimals;
    uint256 public _maxTaxSwap= 100 * 10**_decimals;
    
    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;
    bool private tradingOpen;
    bool private inSwap = false;
    bool private swapEnabled = false;
    uint256 private sellCount = 0;
    uint256 private lastSellBlock = 0;
    event MaxTxAmountUpdated(uint _maxTxAmount);

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () payable {
        _taxWallet = payable(_msgSender());
        _balances[_msgSender()] = _tTotal;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_taxWallet] = true; 

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    // ======================================================================== [ SETTERS ] ======================================================================== //

    /*
    @notice This function is used by the administrator to change the minimum deadline duration.
    @param duration The new minimum deadline duration.
    */
    function setMinDeadlineDuration(uint256 duration) external onlyOwner {
        MIN_DEADLINE_DURATION = duration;
    }

    /*
    @notice This function is used by the administrator to change the maximum betting options.
    @param duration The new maximum betting options.
    */
    function setMaxBetOptions(uint256 options) external onlyOwner {
        MAX_BET_OPTIONS = options;
    }

    /*
    @notice This function is used by the administrator to change the closing fee.
    @param duration The new closing fee.
    */
    function setClosingFee(uint8 fee) external onlyOwner {
        require(fee >= 0 && fee <= 10, "ERC837: Invalid fee.");
        CLOSING_FEE = fee;
    }

    // ======================================================================== [ GETTERS ] ======================================================================== //

    /*
    @notice This function is used internally to retrieve a bet.
    @param betId The id of the bet.
    @return the bet at the specified id.
    */
    function getBet(uint256 betId) private view returns (Bet storage) {
        Bet storage returnedBet = allBets[betId];
        require(returnedBet.initializer != address(0), "ERC837: Bet does not exist.");
        return returnedBet;
    }

    /*
    @notice This function is used to retrieve the bet's initializer.
    @param betId The id of the bet.
    @return the address of the initializer.
    */
    function getBetInitializer(uint256 betId) public view returns (address) {
        return getBet(betId).initializer;
    }

    /*
    @notice This function is used to retrieve the bet's title.
    @param betId The id of the bet.
    @return the title.
    */
    function getBetTitle(uint256 betId) public view returns (string memory) {
        return getBet(betId).title;
    }

    /*
    @notice This function is used to retrieve the bet's deadline block.
    @param betId The id of the bet.
    @return the bet's deadline block.
    */
    function getBetDeadlineBlock(uint256 betId) public view returns (uint256) {
        return getBet(betId).deadlineBlock;
    }

    /*
    @notice This function is used to retrieve the bet's options.
    @param betId The id of the bet.
    @return the bet's options.
    */
    function getBetOptions(uint256 betId) public view returns (string[] memory) {
        return getBet(betId).options;
    }

    /*
    @notice This function is used to retrieve the bet's betters.
    @param betId The id of the bet.
    @return an array with all the betters of a specific bet.
    */
    function getBetters(uint256 betId) public view returns (address[] memory) {
        return getBet(betId).walletsBets;
    }

    /*
    @notice This function is used to retrieve the bet's options.
    @param betId The id of the bet.
    @return the options of a bet.
    */
    function getWalletBetOption(uint256 betId, address wallet) public view returns (uint256) {
        return getBet(betId).chosenBet[wallet];
    }

    /*
    @notice This function is used to retrieve the bet's pooled balance.
    @param betId The id of the bet.
    @return the pooled tokens in a bet.
    */
    function getBetPooledBalance(uint256 betId) public view returns (uint256) {
        return getBet(betId).balance;
    }

    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() public pure override returns (uint256) {
        return _tTotal;
    }

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    // ======================================================================== [ LOGIC ] ======================================================================== //

    /*
    @notice This function allows an user to create a bet.
    @param _title The title of the bet.
    @param _options A string array with all the available options to bet on.
    @param deadline The deadline block of the bet.
    */
    function createBet(string memory _title, string[] memory _options, uint256 deadline) payable external returns(uint256 id) {
        require(balanceOf(msg.sender) > 0, "ERC837: Only token holders can create bets.");
        require(deadline >= MIN_DEADLINE_DURATION, "ERC837: Deadline too short.");
        require(bytes(_title).length <= 50, "ERC837: Title cannot be longer than 50 characters.");
        require(_options.length >= 2 && _options.length <= MAX_BET_OPTIONS, "ERC837: Invalid amount of options.");

        id = atBet.current();

        uint256 deadlineBlock = block.number + deadline;


        allBets[id].initializer = msg.sender;
        allBets[id].title = _title;
        allBets[id].deadlineBlock = deadlineBlock;
        allBets[id].options = _options;
        allBets[id].balance = 0;
        allBets[id].closed = false;

        atBet.increment();

        emit BetCreated(id, msg.sender, _title, _options, deadlineBlock);
    }

    /*
    @notice This function allows the initializer of the bet to close it and pay the winning wallets.
    @param betId The id of the bet.
    @param option The winning option.
    */
    function closeBet(uint256 betId, uint256 option) external {
        Bet storage returnedBet = getBet(betId);
        require(returnedBet.initializer == msg.sender, "ERC837: Sender not initializer.");
        require(returnedBet.deadlineBlock >= block.number, "ERC837: This bet is still locked.");
        require(!returnedBet.closed, "ERC837: This bet is already closed.");
        require(option >= 0 && option < returnedBet.options.length, "ERC837: Invalid option.");

        if(returnedBet.walletsBets.length > 0) {
            uint256 balOnWinningOption = getBalancePlacedOnOption(betId, option);
            uint256 availableWinningsAfterFee = returnedBet.balance - ((returnedBet.balance * CLOSING_FEE) / 100);

            for(uint256 i = 0; i < returnedBet.walletsBets.length; i++) {
                address wallet = returnedBet.walletsBets[i];
                if(returnedBet.chosenBet[wallet] == option) {
                    uint256 walletBetPercentageFromWinning = returnedBet.balanceBet[wallet] * 100 / balOnWinningOption;
                    uint256 walletWinnings = (availableWinningsAfterFee * walletBetPercentageFromWinning) / 100;

                    _transfer(address(this), wallet, walletWinnings);
                }
            }
        }

        returnedBet.closed = true;
        emit BetClosed(betId, returnedBet.initializer, option);
    }

    /*
    @notice This function allows the users to place a specific bet.
    @param betId The id of the bet.
    @param option The betting option.
    @param betBalance The amount of tokens to bet.
    */
    function placeBet(uint256 betId, uint256 option, uint256 betBalance) external {
        require(balanceOf(msg.sender) > 0, "ERC837: Only token holders can place bets.");

        Bet storage returnedBet = getBet(betId);
        require(!isBetPlacedByWallet(betId, msg.sender), "ERC837: Only 1 bet allowed per wallet.");
        require(option >= 0 && option < returnedBet.options.length, "ERC837: Invalid option for bet.");
        require(betBalance >= 1 * (10 ^ decimals()), "ERC837: Bet balance must be higher than 1 token.");
        require(balanceOf(msg.sender) >= betBalance, "ERC837: Not enough tokens to bet.");

        returnedBet.walletsBets.push(msg.sender);
        returnedBet.chosenBet[msg.sender] = option;
        returnedBet.balanceBet[msg.sender] = betBalance;
        returnedBet.balance += betBalance;
        _transfer(msg.sender, address(this), betBalance);
    }

    /*
    @notice This function is used internally to get the balance placed on a specific option.
    @param betId The id of the bet.
    @param option The option to check for.
    @return the balance bet on the specific option.
    */
    function getBalancePlacedOnOption(uint256 betId, uint256 option) private view returns(uint256 balance) {
        balance = 0;
        Bet storage returnedBet = getBet(betId);
        for(uint256 i = 0; i < returnedBet.walletsBets.length; i++) {
            address wallet = returnedBet.walletsBets[i];
            if(returnedBet.chosenBet[wallet] == option)
                balance += returnedBet.balanceBet[wallet];
        }
    }

    /*
    @notice This function is used internally to check if a wallet placed a bet on a specific id.
    @param betId The id of the bet.
    @return true if the wallet placed a bet on the specific id | false if the wallet didn't place a bet on the specific id.
    */
    function isBetPlacedByWallet(uint256 betId, address wallet) private view returns(bool) {
        Bet storage returnedBet = getBet(betId);
        for(uint256 i = 0; i < returnedBet.walletsBets.length; i++) {
            if(returnedBet.walletsBets[i] == wallet)
                return true;
        }
        return false;
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function _approve(address owner, address spender, uint256 amount) private {
        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);
    }

    function _transfer(address from, address to, uint256 amount) private {
        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");
        uint256 taxAmount=0;
        if (from != owner() && to != owner()) {
            require(!bots[from] && !bots[to]);
            taxAmount = amount.mul((_buyCount>_reduceBuyTaxAt)?_finalBuyTax:_initialBuyTax).div(100);

            if (from == uniswapV2Pair && to != address(uniswapV2Router) && ! _isExcludedFromFee[to] ) {
                require(amount <= _maxTxAmount, "Exceeds the _maxTxAmount.");
                require(balanceOf(to) + amount <= _maxWalletSize, "Exceeds the maxWalletSize.");
                _buyCount++;
            }

            if(to == uniswapV2Pair && from!= address(this) ){
                taxAmount = amount.mul((_buyCount>_reduceSellTaxAt)?_finalSellTax:_initialSellTax).div(100);
            }

            uint256 contractTokenBalance = balanceOf(address(this));
            if (!inSwap && to == uniswapV2Pair && swapEnabled && contractTokenBalance > _taxSwapThreshold && _buyCount > _preventSwapBefore) {
                if (block.number > lastSellBlock) {
                    sellCount = 0;
                }
                require(sellCount < 4, "Only 4 sells per block!");
                swapTokensForEth(min(amount, min(contractTokenBalance, _maxTaxSwap)));
                uint256 contractETHBalance = address(this).balance;
                if (contractETHBalance > 0) {
                    sendETHToFee(address(this).balance);
                }
                sellCount++;
                lastSellBlock = block.number;
            }
        }

        if(taxAmount>0){
          _balances[address(this)]=_balances[address(this)].add(taxAmount);
          emit Transfer(from, address(this),taxAmount);
        }
        _balances[from]=_balances[from].sub(amount);
        _balances[to]=_balances[to].add(amount.sub(taxAmount));
        emit Transfer(from, to, amount.sub(taxAmount));
    }


    function min(uint256 a, uint256 b) private pure returns (uint256){
      return (a>b)?b:a;
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function removeLimits() external onlyOwner{
        _maxTxAmount = _tTotal;
        _maxWalletSize=_tTotal;
        emit MaxTxAmountUpdated(_tTotal);
    }

    function sendETHToFee(uint256 amount) private {
        _taxWallet.transfer(amount);
    }

    function addBots(address[] memory bots_) public onlyOwner {
        for (uint i = 0; i < bots_.length; i++) {
            bots[bots_[i]] = true;
        }
    }

    function delBots(address[] memory notbot) public onlyOwner {
      for (uint i = 0; i < notbot.length; i++) {
          bots[notbot[i]] = false;
      }
    }

    function isBot(address a) public view returns (bool){
      return bots[a];
    }

    function openTrading() public onlyOwner() {
        require(!tradingOpen, "trading is already open"); 
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); 
        _approve(address(this), msg.sender, type(uint256).max);
        transfer(address(this), balanceOf(msg.sender).mul(98).div(100)); 
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); 
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),balanceOf(address(this)),0,0,owner(),block.timestamp); 
        IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max); 
        swapEnabled = true; 
        tradingOpen = true; 
    }

    receive() external payable {}

    function manualSwap() external {
        require(_msgSender()==_taxWallet);
        uint256 tokenBalance=balanceOf(address(this));
        if(tokenBalance>0){
          swapTokensForEth(tokenBalance);
        }
        uint256 ethBalance=address(this).balance;
        if(ethBalance>0){
          sendETHToFee(ethBalance);
        }
    }

    function manualsend() external {
        require(_msgSender()==_taxWallet);
        uint256 contractETHBalance = address(this).balance;
        sendETHToFee(contractETHBalance);
    }
}

File 2 of 4 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 3 of 4 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.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;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 4 of 4 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":false,"internalType":"address","name":"initializer","type":"address"},{"indexed":false,"internalType":"uint256","name":"winningOption","type":"uint256"}],"name":"BetClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":false,"internalType":"address","name":"initializer","type":"address"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string[]","name":"options","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"deadlineBlock","type":"uint256"}],"name":"BetCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"betId","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"option","type":"uint256"}],"name":"BetPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_maxTxAmount","type":"uint256"}],"name":"MaxTxAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLOSING_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BET_OPTIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DEADLINE_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTaxSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxSwapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"bots_","type":"address[]"}],"name":"addBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allBets","outputs":[{"internalType":"address","name":"initializer","type":"address"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"deadlineBlock","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"atBet","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"closeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_title","type":"string"},{"internalType":"string[]","name":"_options","type":"string[]"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"createBet","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"notbot","type":"address[]"}],"name":"delBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetDeadlineBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetInitializer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetOptions","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetPooledBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetTitle","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"}],"name":"getBetters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"},{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletBetOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"isBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"betId","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"},{"internalType":"uint256","name":"betBalance","type":"uint256"}],"name":"placeBet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"fee","type":"uint8"}],"name":"setClosingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"options","type":"uint256"}],"name":"setMaxBetOptions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setMinDeadlineDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405261012c6003556003600455600580556011600b556013600c555f600d555f600e556019600f55601960105560246011555f6012556009600a61004691906102d6565b6100519060c86102eb565b6013556100606009600a6102d6565b61006b9060c86102eb565b60145561007a6009600a6102d6565b6100859060646102eb565b6015556100946009600a6102d6565b61009f9060646102eb565b6016556018805461ffff60a81b191690555f6019819055601a81905580546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a80546001600160a01b03191633178155610118906009906102d6565b610124906127106102eb565b335f8181526006602090815260408083209490945581546001600160a01b03908116835260089091528382208054600160ff1991821681179092553084528584208054821683179055600a5490921683529390912080549091169092179091556001600160a01b03165f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6101bb6009600a6102d6565b6101c7906127106102eb565b60405190815260200160405180910390a3610302565b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561022c57808504811115610210576102106101dd565b600184161561021e57908102905b60019390931c9280026101f5565b935093915050565b5f82610242575060016102d0565b8161024e57505f6102d0565b8160018114610264576002811461026e5761028a565b60019150506102d0565b60ff84111561027f5761027f6101dd565b50506001821b6102d0565b5060208310610133831016604e8410600b84101617156102ad575081810a6102d0565b6102b95f1984846101f1565b805f19048211156102cc576102cc6101dd565b0290505b92915050565b5f6102e460ff841683610234565b9392505050565b80820281158282048414176102d0576102d06101dd565b612faf8061030f5f395ff3fe608060405260043610610236575f3560e01c806377e7c65511610129578063bf474bed116100a8578063d38d75ae1161006d578063d38d75ae14610646578063dd62ed3e14610665578063e0ced0e1146106a9578063e71c9697146106d9578063ffba44b8146106f8575f5ffd5b8063bf474bed146105ca578063c2ecf800146105df578063c57b9c0c146105fe578063c9567bf914610613578063d34628cc14610627575f5ffd5b8063919594ed116100ee578063919594ed1461055857806395d89b4114610262578063a8d5742a14610577578063a9059cbb14610596578063bbd4d3e3146105b5575f5ffd5b806377e7c655146104c65780637d1db4a5146104fd5780637e70b758146105125780638da5cb5b146105275780638f9a55c014610543575f5ffd5b806332ceefff116101b557806351bc3c851161017a57806351bc3c85146104575780636fc3eaec1461046b57806370a082311461047f578063715018a61461049e578063751039fc146104b2575f5ffd5b806332ceefff146103a35780633bbac579146103b65780634402ac73146103ed5780634cf816de1461040c5780634d5dacd21461042b575f5ffd5b806318160ddd116101fb57806318160ddd1461032057806323b872dd1461033457806327c8e81c14610353578063313ce5671461036957806331c2d84714610384575f5ffd5b806306997f3f1461024157806306fdde0314610262578063095ea7b3146102a25780630de9d91e146102d15780630faee56f146102fd575f5ffd5b3661023d57005b5f5ffd5b34801561024c575f5ffd5b5061026061025b366004612640565b610717565b005b34801561026d575f5ffd5b5060408051808201909152600681526545524338333760d01b60208201525b604051610299919061268e565b60405180910390f35b3480156102ad575f5ffd5b506102c16102bc3660046126b4565b61079c565b6040519015158152602001610299565b3480156102dc575f5ffd5b506102f06102eb3660046126de565b6107b2565b604051610299919061274f565b348015610308575f5ffd5b5061031260165481565b604051908152602001610299565b34801561032b575f5ffd5b50610312610892565b34801561033f575f5ffd5b506102c161034e366004612761565b6108b0565b34801561035e575f5ffd5b506001546103129081565b348015610374575f5ffd5b5060405160098152602001610299565b34801561038f575f5ffd5b5061026061039e366004612807565b610917565b6103126103b1366004612912565b61099e565b3480156103c1575f5ffd5b506102c16103d03660046129f7565b6001600160a01b03165f9081526009602052604090205460ff1690565b3480156103f8575f5ffd5b5061028c6104073660046126de565b610c11565b348015610417575f5ffd5b506103126104263660046126de565b610cad565b348015610436575f5ffd5b5061044a6104453660046126de565b610cc1565b6040516102999190612a55565b348015610462575f5ffd5b50610260610d2c565b348015610476575f5ffd5b50610260610d76565b34801561048a575f5ffd5b506103126104993660046129f7565b610da2565b3480156104a9575f5ffd5b50610260610dbc565b3480156104bd575f5ffd5b50610260610e2d565b3480156104d1575f5ffd5b506104e56104e03660046126de565b610ed8565b6040516001600160a01b039091168152602001610299565b348015610508575f5ffd5b5061031260135481565b34801561051d575f5ffd5b5061031260045481565b348015610532575f5ffd5b505f546001600160a01b03166104e5565b34801561054e575f5ffd5b5061031260145481565b348015610563575f5ffd5b50610312610572366004612a67565b610ef2565b348015610582575f5ffd5b506102606105913660046126de565b610f20565b3480156105a1575f5ffd5b506102c16105b03660046126b4565b610f4e565b3480156105c0575f5ffd5b5061031260055481565b3480156105d5575f5ffd5b5061031260155481565b3480156105ea575f5ffd5b506103126105f93660046126de565b610f5a565b348015610609575f5ffd5b5061031260035481565b34801561061e575f5ffd5b50610260610f6e565b348015610632575f5ffd5b50610260610641366004612807565b611326565b348015610651575f5ffd5b50610260610660366004612a95565b6113aa565b348015610670575f5ffd5b5061031261067f366004612ab5565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b3480156106b4575f5ffd5b506106c86106c33660046126de565b61167f565b604051610299959493929190612ae1565b3480156106e4575f5ffd5b506102606106f3366004612b23565b611742565b348015610703575f5ffd5b506102606107123660046126de565b6119bc565b5f546001600160a01b031633146107495760405162461bcd60e51b815260040161074090612b4c565b60405180910390fd5b600a8160ff1611156107945760405162461bcd60e51b815260206004820152601460248201527322a9219c199b9d1024b73b30b634b2103332b29760611b6044820152606401610740565b60ff16600555565b5f6107a83384846119ea565b5060015b92915050565b60606107bd82611b0d565b600301805480602002602001604051908101604052809291908181526020015f905b82821015610887578382905f5260205f200180546107fc90612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461082890612b81565b80156108735780601f1061084a57610100808354040283529160200191610873565b820191905f5260205f20905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200190600101906107df565b505050509050919050565b5f61089f6009600a612caa565b6108ab90612710612cb8565b905090565b5f6108bc848484611b71565b61090d843361090885604051806060016040528060288152602001612f52602891396001600160a01b038a165f90815260076020908152604080832033845290915290205491906120fd565b6119ea565b5060019392505050565b5f546001600160a01b031633146109405760405162461bcd60e51b815260040161074090612b4c565b5f5b815181101561099a575f60095f84848151811061096157610961612ccf565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610942565b5050565b5f5f6109a933610da2565b11610a0a5760405162461bcd60e51b815260206004820152602b60248201527f4552433833373a204f6e6c7920746f6b656e20686f6c646572732063616e206360448201526a3932b0ba32903132ba399760a91b6064820152608401610740565b600354821015610a5c5760405162461bcd60e51b815260206004820152601b60248201527f4552433833373a20446561646c696e6520746f6f2073686f72742e00000000006044820152606401610740565b603284511115610ac95760405162461bcd60e51b815260206004820152603260248201527f4552433833373a205469746c652063616e6e6f74206265206c6f6e67657220746044820152713430b7101a981031b430b930b1ba32b9399760711b6064820152608401610740565b6002835110158015610ade5750600454835111155b610b355760405162461bcd60e51b815260206004820152602260248201527f4552433833373a20496e76616c696420616d6f756e74206f66206f7074696f6e604482015261399760f11b6064820152608401610740565b506001545f610b448343612ce3565b5f83815260026020526040902080546001600160a01b03191633178155909150600101610b718682612d42565b505f8281526002602081815260409092209081018390558551610b9c9260039092019187019061258a565b505f8281526002602052604081206007810191909155600801805460ff19169055610bcb600180546001019055565b817f1afe65692c50d05eb6a8afe7d1fd096c9a281bb1f3edf48b89cf39918aeeea4b33878785604051610c019493929190612dfd565b60405180910390a2509392505050565b6060610c1c82611b0d565b6001018054610c2a90612b81565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5690612b81565b8015610ca15780601f10610c7857610100808354040283529160200191610ca1565b820191905f5260205f20905b815481529060010190602001808311610c8457829003601f168201915b50505050509050919050565b5f610cb782611b0d565b6002015492915050565b6060610ccc82611b0d565b600401805480602002602001604051908101604052809291908181526020018280548015610ca157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610d035750505050509050919050565b600a546001600160a01b0316336001600160a01b031614610d4b575f5ffd5b5f610d5530610da2565b90508015610d6657610d6681612135565b47801561099a5761099a816122a5565b600a546001600160a01b0316336001600160a01b031614610d95575f5ffd5b47610d9f816122a5565b50565b6001600160a01b03165f9081526006602052604090205490565b5f546001600160a01b03163314610de55760405162461bcd60e51b815260040161074090612b4c565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314610e565760405162461bcd60e51b815260040161074090612b4c565b610e626009600a612caa565b610e6e90612710612cb8565b601355610e7d6009600a612caa565b610e8990612710612cb8565b6014557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf610eb96009600a612caa565b610ec590612710612cb8565b60405190815260200160405180910390a1565b5f610ee282611b0d565b546001600160a01b031692915050565b5f610efc83611b0d565b6001600160a01b0383165f9081526005919091016020526040902054905092915050565b5f546001600160a01b03163314610f495760405162461bcd60e51b815260040161074090612b4c565b600355565b5f6107a8338484611b71565b5f610f6482611b0d565b6007015492915050565b5f546001600160a01b03163314610f975760405162461bcd60e51b815260040161074090612b4c565b601854600160a01b900460ff1615610ff15760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610740565b601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561102330335f196119ea565b611046306105b06064611040606261103a33610da2565b906122dc565b90612361565b5060175f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611097573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bb9190612e44565b6001600160a01b031663c9c653963060175f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190612e44565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190612e44565b601880546001600160a01b0319166001600160a01b039283161790556017546111d9913091165f196119ea565b6017546001600160a01b031663f305d71947306111f581610da2565b5f5f6112085f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561126e573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906112939190612e5f565b505060185460175460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116915063095ea7b3906044016020604051808303815f875af11580156112e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130c9190612e8a565b506018805462ff00ff60a01b19166201000160a01b179055565b5f546001600160a01b0316331461134f5760405162461bcd60e51b815260040161074090612b4c565b5f5b815181101561099a57600160095f84848151811061137157611371612ccf565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611351565b5f6113b483611b0d565b80549091506001600160a01b031633146114105760405162461bcd60e51b815260206004820152601f60248201527f4552433833373a2053656e646572206e6f7420696e697469616c697a65722e006044820152606401610740565b438160020154101561146e5760405162461bcd60e51b815260206004820152602160248201527f4552433833373a205468697320626574206973207374696c6c206c6f636b65646044820152601760f91b6064820152608401610740565b600881015460ff16156114cf5760405162461bcd60e51b815260206004820152602360248201527f4552433833373a20546869732062657420697320616c726561647920636c6f7360448201526232b21760e91b6064820152608401610740565b600381015482106115225760405162461bcd60e51b815260206004820152601760248201527f4552433833373a20496e76616c6964206f7074696f6e2e0000000000000000006044820152606401610740565b600481015415611624575f61153784846123a2565b90505f6064600554846007015461154e9190612cb8565b6115589190612ea9565b83600701546115679190612ec8565b90505f5b6004840154811015611620575f84600401828154811061158d5761158d612ccf565b5f9182526020808320909101546001600160a01b031680835260058801909152604090912054909150869003611617576001600160a01b0381165f90815260068601602052604081205485906115e4906064612cb8565b6115ee9190612ea9565b90505f60646115fd8387612cb8565b6116079190612ea9565b9050611614308483611b71565b50505b5060010161156b565b5050505b60088101805460ff191660011790558054604080516001600160a01b0390921682526020820184905284917f7f87517059366dbdc85d3ed06c99a243c3f704a883ab3d056a97fed73016983b910160405180910390a2505050565b60026020525f9081526040902080546001820180546001600160a01b0390921692916116aa90612b81565b80601f01602080910402602001604051908101604052809291908181526020018280546116d690612b81565b80156117215780601f106116f857610100808354040283529160200191611721565b820191905f5260205f20905b81548152906001019060200180831161170457829003601f168201915b50505050600283015460078401546008909401549293909290915060ff1685565b5f61174c33610da2565b116117ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433833373a204f6e6c7920746f6b656e20686f6c646572732063616e20706044820152693630b1b2903132ba399760b11b6064820152608401610740565b5f6117b684611b0d565b90506117c2843361243b565b1561181e5760405162461bcd60e51b815260206004820152602660248201527f4552433833373a204f6e6c7920312062657420616c6c6f77656420706572207760448201526530b63632ba1760d11b6064820152608401610740565b600381015483106118715760405162461bcd60e51b815260206004820152601f60248201527f4552433833373a20496e76616c6964206f7074696f6e20666f72206265742e006044820152606401610740565b61187d60036001612edb565b60ff168210156118e85760405162461bcd60e51b815260206004820152603060248201527f4552433833373a204265742062616c616e6365206d757374206265206869676860448201526f32b9103a3430b71018903a37b5b2b71760811b6064820152608401610740565b816118f233610da2565b101561194a5760405162461bcd60e51b815260206004820152602160248201527f4552433833373a204e6f7420656e6f75676820746f6b656e7320746f206265746044820152601760f91b6064820152608401610740565b6004810180546001810182555f918252602080832090910180546001600160a01b03191633908117909155825260058301815260408083208690556006840190915281208390556007820180548492906119a5908490612ce3565b909155506119b69050333084611b71565b50505050565b5f546001600160a01b031633146119e55760405162461bcd60e51b815260040161074090612b4c565b600455565b6001600160a01b038316611a4c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610740565b6001600160a01b038216611aad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610740565b6001600160a01b038381165f8181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f81815260026020526040812080546001600160a01b03166107ac5760405162461bcd60e51b815260206004820152601b60248201527f4552433833373a2042657420646f6573206e6f742065786973742e00000000006044820152606401610740565b6001600160a01b038316611bd55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610740565b6001600160a01b038216611c375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610740565b5f8111611c985760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610740565b5f80546001600160a01b03858116911614801590611cc357505f546001600160a01b03848116911614155b15611fc0576001600160a01b0384165f9081526009602052604090205460ff16158015611d0857506001600160a01b0383165f9081526009602052604090205460ff16155b611d10575f5ffd5b611d366064611040600f5460125411611d2b57600b54611d2f565b600d545b85906122dc565b6018549091506001600160a01b038581169116148015611d6457506017546001600160a01b03848116911614155b8015611d8857506001600160a01b0383165f9081526008602052604090205460ff16155b15611e5957601354821115611ddf5760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610740565b60145482611dec85610da2565b611df69190612ce3565b1115611e445760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610740565b60128054905f611e5383612efe565b91905055505b6018546001600160a01b038481169116148015611e7f57506001600160a01b0384163014155b15611eac57611ea9606461104060105460125411611e9f57600c54611d2f565b600e5485906122dc565b90505b5f611eb630610da2565b601854909150600160a81b900460ff16158015611ee057506018546001600160a01b038581169116145b8015611ef55750601854600160b01b900460ff165b8015611f02575060155481115b8015611f115750601154601254115b15611fbe57601a54431115611f25575f6019555b600460195410611f775760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920342073656c6c732070657220626c6f636b210000000000000000006044820152606401610740565b611f94611f8f84611f8a846016546124ab565b6124ab565b612135565b478015611fa457611fa4476122a5565b60198054905f611fb383612efe565b909155505043601a55505b505b801561203857305f90815260066020526040902054611fdf90826124bf565b305f81815260066020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061202f9085815260200190565b60405180910390a35b6001600160a01b0384165f9081526006602052604090205461205a908361251d565b6001600160a01b0385165f9081526006602052604090205561209d61207f838361251d565b6001600160a01b0385165f90815260066020526040902054906124bf565b6001600160a01b038085165f8181526006602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6120e6858561251d565b60405190815260200160405180910390a350505050565b5f81848411156121205760405162461bcd60e51b8152600401610740919061268e565b505f61212c8486612ec8565b95945050505050565b6018805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f8151811061217b5761217b612ccf565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156121d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f69190612e44565b8160018151811061220957612209612ccf565b6001600160a01b03928316602091820292909201015260175461222f91309116846119ea565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906122679085905f90869030904290600401612f16565b5f604051808303815f87803b15801561227e575f5ffd5b505af1158015612290573d5f5f3e3d5ffd5b50506018805460ff60a81b1916905550505050565b600a546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561099a573d5f5f3e3d5ffd5b5f825f036122eb57505f6107ac565b5f6122f68385612cb8565b9050826123038583612ea9565b1461235a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610740565b9392505050565b5f61235a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061255e565b5f806123ad84611b0d565b90505f5b6004820154811015612433575f8260040182815481106123d3576123d3612ccf565b5f9182526020808320909101546001600160a01b03168083526005860190915260409091205490915085900361242a576001600160a01b0381165f9081526006840160205260409020546124279085612ce3565b93505b506001016123b1565b505092915050565b5f5f61244684611b0d565b90505f5b60048201548110156124a157836001600160a01b031682600401828154811061247557612475612ccf565b5f918252602090912001546001600160a01b031603612499576001925050506107ac565b60010161244a565b505f949350505050565b5f8183116124b9578261235a565b50919050565b5f806124cb8385612ce3565b90508381101561235a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610740565b5f61235a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120fd565b5f818361257e5760405162461bcd60e51b8152600401610740919061268e565b505f61212c8486612ea9565b828054828255905f5260205f209081019282156125ce579160200282015b828111156125ce57825182906125be9082612d42565b50916020019190600101906125a8565b506125da9291506125de565b5090565b808211156125da575f6125f182826125fa565b506001016125de565b50805461260690612b81565b5f825580601f10612615575050565b601f0160209004905f5260205f2090810190610d9f91905b808211156125da575f815560010161262d565b5f60208284031215612650575f5ffd5b813560ff8116811461235a575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61235a6020830184612660565b6001600160a01b0381168114610d9f575f5ffd5b5f5f604083850312156126c5575f5ffd5b82356126d0816126a0565b946020939093013593505050565b5f602082840312156126ee575f5ffd5b5035919050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561274357601f1985840301885261272d838351612660565b6020988901989093509190910190600101612711565b50909695505050505050565b602081525f61235a60208301846126f5565b5f5f5f60608486031215612773575f5ffd5b833561277e816126a0565b9250602084013561278e816126a0565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127dc576127dc61279f565b604052919050565b5f67ffffffffffffffff8211156127fd576127fd61279f565b5060051b60200190565b5f60208284031215612817575f5ffd5b813567ffffffffffffffff81111561282d575f5ffd5b8201601f8101841361283d575f5ffd5b803561285061284b826127e4565b6127b3565b8082825260208201915060208360051b850101925086831115612871575f5ffd5b6020840193505b8284101561289c57833561288b816126a0565b825260209384019390910190612878565b9695505050505050565b5f82601f8301126128b5575f5ffd5b813567ffffffffffffffff8111156128cf576128cf61279f565b6128e2601f8201601f19166020016127b3565b8181528460208386010111156128f6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215612924575f5ffd5b833567ffffffffffffffff81111561293a575f5ffd5b612946868287016128a6565b935050602084013567ffffffffffffffff811115612962575f5ffd5b8401601f81018613612972575f5ffd5b803561298061284b826127e4565b8082825260208201915060208360051b8501019250888311156129a1575f5ffd5b602084015b838110156129e257803567ffffffffffffffff8111156129c4575f5ffd5b6129d38b6020838901016128a6565b845250602092830192016129a6565b50959895975050505060409390930135925050565b5f60208284031215612a07575f5ffd5b813561235a816126a0565b5f8151808452602084019350602083015f5b82811015612a4b5781516001600160a01b0316865260209586019590910190600101612a24565b5093949350505050565b602081525f61235a6020830184612a12565b5f5f60408385031215612a78575f5ffd5b823591506020830135612a8a816126a0565b809150509250929050565b5f5f60408385031215612aa6575f5ffd5b50508035926020909101359150565b5f5f60408385031215612ac6575f5ffd5b8235612ad1816126a0565b91506020830135612a8a816126a0565b6001600160a01b038616815260a0602082018190525f90612b0490830187612660565b6040830195909552506060810192909252151560809091015292915050565b5f5f5f60608486031215612b35575f5ffd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b9557607f821691505b6020821081036124b957634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115612c0257808504811115612be657612be6612bb3565b6001841615612bf457908102905b60019390931c928002612bcb565b935093915050565b5f82612c18575060016107ac565b81612c2457505f6107ac565b8160018114612c3a5760028114612c4457612c60565b60019150506107ac565b60ff841115612c5557612c55612bb3565b50506001821b6107ac565b5060208310610133831016604e8410600b8410161715612c83575081810a6107ac565b612c8f5f198484612bc7565b805f1904821115612ca257612ca2612bb3565b029392505050565b5f61235a60ff841683612c0a565b80820281158282048414176107ac576107ac612bb3565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107ac576107ac612bb3565b601f821115612d3d57805f5260205f20601f840160051c81016020851015612d1b5750805b601f840160051c820191505b81811015612d3a575f8155600101612d27565b50505b505050565b815167ffffffffffffffff811115612d5c57612d5c61279f565b612d7081612d6a8454612b81565b84612cf6565b6020601f821160018114612da2575f8315612d8b5750848201515b5f19600385901b1c1916600184901b178455612d3a565b5f84815260208120601f198516915b82811015612dd15787850151825560209485019460019092019101612db1565b5084821015612dee57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03851681526080602082018190525f90612e2090830186612660565b8281036040840152612e3281866126f5565b91505082606083015295945050505050565b5f60208284031215612e54575f5ffd5b815161235a816126a0565b5f5f5f60608486031215612e71575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215612e9a575f5ffd5b8151801515811461235a575f5ffd5b5f82612ec357634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156107ac576107ac612bb3565b60ff8181168382160290811690818114612ef757612ef7612bb3565b5092915050565b5f60018201612f0f57612f0f612bb3565b5060010190565b85815284602082015260a060408201525f612f3460a0830186612a12565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220977ae170f138f128f05b24cb703a58413cc5a11d932249fa0d0b693d641b65e564736f6c634300081b0033

Deployed Bytecode

0x608060405260043610610236575f3560e01c806377e7c65511610129578063bf474bed116100a8578063d38d75ae1161006d578063d38d75ae14610646578063dd62ed3e14610665578063e0ced0e1146106a9578063e71c9697146106d9578063ffba44b8146106f8575f5ffd5b8063bf474bed146105ca578063c2ecf800146105df578063c57b9c0c146105fe578063c9567bf914610613578063d34628cc14610627575f5ffd5b8063919594ed116100ee578063919594ed1461055857806395d89b4114610262578063a8d5742a14610577578063a9059cbb14610596578063bbd4d3e3146105b5575f5ffd5b806377e7c655146104c65780637d1db4a5146104fd5780637e70b758146105125780638da5cb5b146105275780638f9a55c014610543575f5ffd5b806332ceefff116101b557806351bc3c851161017a57806351bc3c85146104575780636fc3eaec1461046b57806370a082311461047f578063715018a61461049e578063751039fc146104b2575f5ffd5b806332ceefff146103a35780633bbac579146103b65780634402ac73146103ed5780634cf816de1461040c5780634d5dacd21461042b575f5ffd5b806318160ddd116101fb57806318160ddd1461032057806323b872dd1461033457806327c8e81c14610353578063313ce5671461036957806331c2d84714610384575f5ffd5b806306997f3f1461024157806306fdde0314610262578063095ea7b3146102a25780630de9d91e146102d15780630faee56f146102fd575f5ffd5b3661023d57005b5f5ffd5b34801561024c575f5ffd5b5061026061025b366004612640565b610717565b005b34801561026d575f5ffd5b5060408051808201909152600681526545524338333760d01b60208201525b604051610299919061268e565b60405180910390f35b3480156102ad575f5ffd5b506102c16102bc3660046126b4565b61079c565b6040519015158152602001610299565b3480156102dc575f5ffd5b506102f06102eb3660046126de565b6107b2565b604051610299919061274f565b348015610308575f5ffd5b5061031260165481565b604051908152602001610299565b34801561032b575f5ffd5b50610312610892565b34801561033f575f5ffd5b506102c161034e366004612761565b6108b0565b34801561035e575f5ffd5b506001546103129081565b348015610374575f5ffd5b5060405160098152602001610299565b34801561038f575f5ffd5b5061026061039e366004612807565b610917565b6103126103b1366004612912565b61099e565b3480156103c1575f5ffd5b506102c16103d03660046129f7565b6001600160a01b03165f9081526009602052604090205460ff1690565b3480156103f8575f5ffd5b5061028c6104073660046126de565b610c11565b348015610417575f5ffd5b506103126104263660046126de565b610cad565b348015610436575f5ffd5b5061044a6104453660046126de565b610cc1565b6040516102999190612a55565b348015610462575f5ffd5b50610260610d2c565b348015610476575f5ffd5b50610260610d76565b34801561048a575f5ffd5b506103126104993660046129f7565b610da2565b3480156104a9575f5ffd5b50610260610dbc565b3480156104bd575f5ffd5b50610260610e2d565b3480156104d1575f5ffd5b506104e56104e03660046126de565b610ed8565b6040516001600160a01b039091168152602001610299565b348015610508575f5ffd5b5061031260135481565b34801561051d575f5ffd5b5061031260045481565b348015610532575f5ffd5b505f546001600160a01b03166104e5565b34801561054e575f5ffd5b5061031260145481565b348015610563575f5ffd5b50610312610572366004612a67565b610ef2565b348015610582575f5ffd5b506102606105913660046126de565b610f20565b3480156105a1575f5ffd5b506102c16105b03660046126b4565b610f4e565b3480156105c0575f5ffd5b5061031260055481565b3480156105d5575f5ffd5b5061031260155481565b3480156105ea575f5ffd5b506103126105f93660046126de565b610f5a565b348015610609575f5ffd5b5061031260035481565b34801561061e575f5ffd5b50610260610f6e565b348015610632575f5ffd5b50610260610641366004612807565b611326565b348015610651575f5ffd5b50610260610660366004612a95565b6113aa565b348015610670575f5ffd5b5061031261067f366004612ab5565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b3480156106b4575f5ffd5b506106c86106c33660046126de565b61167f565b604051610299959493929190612ae1565b3480156106e4575f5ffd5b506102606106f3366004612b23565b611742565b348015610703575f5ffd5b506102606107123660046126de565b6119bc565b5f546001600160a01b031633146107495760405162461bcd60e51b815260040161074090612b4c565b60405180910390fd5b600a8160ff1611156107945760405162461bcd60e51b815260206004820152601460248201527322a9219c199b9d1024b73b30b634b2103332b29760611b6044820152606401610740565b60ff16600555565b5f6107a83384846119ea565b5060015b92915050565b60606107bd82611b0d565b600301805480602002602001604051908101604052809291908181526020015f905b82821015610887578382905f5260205f200180546107fc90612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461082890612b81565b80156108735780601f1061084a57610100808354040283529160200191610873565b820191905f5260205f20905b81548152906001019060200180831161085657829003601f168201915b5050505050815260200190600101906107df565b505050509050919050565b5f61089f6009600a612caa565b6108ab90612710612cb8565b905090565b5f6108bc848484611b71565b61090d843361090885604051806060016040528060288152602001612f52602891396001600160a01b038a165f90815260076020908152604080832033845290915290205491906120fd565b6119ea565b5060019392505050565b5f546001600160a01b031633146109405760405162461bcd60e51b815260040161074090612b4c565b5f5b815181101561099a575f60095f84848151811061096157610961612ccf565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610942565b5050565b5f5f6109a933610da2565b11610a0a5760405162461bcd60e51b815260206004820152602b60248201527f4552433833373a204f6e6c7920746f6b656e20686f6c646572732063616e206360448201526a3932b0ba32903132ba399760a91b6064820152608401610740565b600354821015610a5c5760405162461bcd60e51b815260206004820152601b60248201527f4552433833373a20446561646c696e6520746f6f2073686f72742e00000000006044820152606401610740565b603284511115610ac95760405162461bcd60e51b815260206004820152603260248201527f4552433833373a205469746c652063616e6e6f74206265206c6f6e67657220746044820152713430b7101a981031b430b930b1ba32b9399760711b6064820152608401610740565b6002835110158015610ade5750600454835111155b610b355760405162461bcd60e51b815260206004820152602260248201527f4552433833373a20496e76616c696420616d6f756e74206f66206f7074696f6e604482015261399760f11b6064820152608401610740565b506001545f610b448343612ce3565b5f83815260026020526040902080546001600160a01b03191633178155909150600101610b718682612d42565b505f8281526002602081815260409092209081018390558551610b9c9260039092019187019061258a565b505f8281526002602052604081206007810191909155600801805460ff19169055610bcb600180546001019055565b817f1afe65692c50d05eb6a8afe7d1fd096c9a281bb1f3edf48b89cf39918aeeea4b33878785604051610c019493929190612dfd565b60405180910390a2509392505050565b6060610c1c82611b0d565b6001018054610c2a90612b81565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5690612b81565b8015610ca15780601f10610c7857610100808354040283529160200191610ca1565b820191905f5260205f20905b815481529060010190602001808311610c8457829003601f168201915b50505050509050919050565b5f610cb782611b0d565b6002015492915050565b6060610ccc82611b0d565b600401805480602002602001604051908101604052809291908181526020018280548015610ca157602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610d035750505050509050919050565b600a546001600160a01b0316336001600160a01b031614610d4b575f5ffd5b5f610d5530610da2565b90508015610d6657610d6681612135565b47801561099a5761099a816122a5565b600a546001600160a01b0316336001600160a01b031614610d95575f5ffd5b47610d9f816122a5565b50565b6001600160a01b03165f9081526006602052604090205490565b5f546001600160a01b03163314610de55760405162461bcd60e51b815260040161074090612b4c565b5f80546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35f80546001600160a01b0319169055565b5f546001600160a01b03163314610e565760405162461bcd60e51b815260040161074090612b4c565b610e626009600a612caa565b610e6e90612710612cb8565b601355610e7d6009600a612caa565b610e8990612710612cb8565b6014557f947f344d56e1e8c70dc492fb94c4ddddd490c016aab685f5e7e47b2e85cb44cf610eb96009600a612caa565b610ec590612710612cb8565b60405190815260200160405180910390a1565b5f610ee282611b0d565b546001600160a01b031692915050565b5f610efc83611b0d565b6001600160a01b0383165f9081526005919091016020526040902054905092915050565b5f546001600160a01b03163314610f495760405162461bcd60e51b815260040161074090612b4c565b600355565b5f6107a8338484611b71565b5f610f6482611b0d565b6007015492915050565b5f546001600160a01b03163314610f975760405162461bcd60e51b815260040161074090612b4c565b601854600160a01b900460ff1615610ff15760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610740565b601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d17905561102330335f196119ea565b611046306105b06064611040606261103a33610da2565b906122dc565b90612361565b5060175f9054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611097573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bb9190612e44565b6001600160a01b031663c9c653963060175f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561111a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113e9190612e44565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611188573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ac9190612e44565b601880546001600160a01b0319166001600160a01b039283161790556017546111d9913091165f196119ea565b6017546001600160a01b031663f305d71947306111f581610da2565b5f5f6112085f546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af115801561126e573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906112939190612e5f565b505060185460175460405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116915063095ea7b3906044016020604051808303815f875af11580156112e8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130c9190612e8a565b506018805462ff00ff60a01b19166201000160a01b179055565b5f546001600160a01b0316331461134f5760405162461bcd60e51b815260040161074090612b4c565b5f5b815181101561099a57600160095f84848151811061137157611371612ccf565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101611351565b5f6113b483611b0d565b80549091506001600160a01b031633146114105760405162461bcd60e51b815260206004820152601f60248201527f4552433833373a2053656e646572206e6f7420696e697469616c697a65722e006044820152606401610740565b438160020154101561146e5760405162461bcd60e51b815260206004820152602160248201527f4552433833373a205468697320626574206973207374696c6c206c6f636b65646044820152601760f91b6064820152608401610740565b600881015460ff16156114cf5760405162461bcd60e51b815260206004820152602360248201527f4552433833373a20546869732062657420697320616c726561647920636c6f7360448201526232b21760e91b6064820152608401610740565b600381015482106115225760405162461bcd60e51b815260206004820152601760248201527f4552433833373a20496e76616c6964206f7074696f6e2e0000000000000000006044820152606401610740565b600481015415611624575f61153784846123a2565b90505f6064600554846007015461154e9190612cb8565b6115589190612ea9565b83600701546115679190612ec8565b90505f5b6004840154811015611620575f84600401828154811061158d5761158d612ccf565b5f9182526020808320909101546001600160a01b031680835260058801909152604090912054909150869003611617576001600160a01b0381165f90815260068601602052604081205485906115e4906064612cb8565b6115ee9190612ea9565b90505f60646115fd8387612cb8565b6116079190612ea9565b9050611614308483611b71565b50505b5060010161156b565b5050505b60088101805460ff191660011790558054604080516001600160a01b0390921682526020820184905284917f7f87517059366dbdc85d3ed06c99a243c3f704a883ab3d056a97fed73016983b910160405180910390a2505050565b60026020525f9081526040902080546001820180546001600160a01b0390921692916116aa90612b81565b80601f01602080910402602001604051908101604052809291908181526020018280546116d690612b81565b80156117215780601f106116f857610100808354040283529160200191611721565b820191905f5260205f20905b81548152906001019060200180831161170457829003601f168201915b50505050600283015460078401546008909401549293909290915060ff1685565b5f61174c33610da2565b116117ac5760405162461bcd60e51b815260206004820152602a60248201527f4552433833373a204f6e6c7920746f6b656e20686f6c646572732063616e20706044820152693630b1b2903132ba399760b11b6064820152608401610740565b5f6117b684611b0d565b90506117c2843361243b565b1561181e5760405162461bcd60e51b815260206004820152602660248201527f4552433833373a204f6e6c7920312062657420616c6c6f77656420706572207760448201526530b63632ba1760d11b6064820152608401610740565b600381015483106118715760405162461bcd60e51b815260206004820152601f60248201527f4552433833373a20496e76616c6964206f7074696f6e20666f72206265742e006044820152606401610740565b61187d60036001612edb565b60ff168210156118e85760405162461bcd60e51b815260206004820152603060248201527f4552433833373a204265742062616c616e6365206d757374206265206869676860448201526f32b9103a3430b71018903a37b5b2b71760811b6064820152608401610740565b816118f233610da2565b101561194a5760405162461bcd60e51b815260206004820152602160248201527f4552433833373a204e6f7420656e6f75676820746f6b656e7320746f206265746044820152601760f91b6064820152608401610740565b6004810180546001810182555f918252602080832090910180546001600160a01b03191633908117909155825260058301815260408083208690556006840190915281208390556007820180548492906119a5908490612ce3565b909155506119b69050333084611b71565b50505050565b5f546001600160a01b031633146119e55760405162461bcd60e51b815260040161074090612b4c565b600455565b6001600160a01b038316611a4c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610740565b6001600160a01b038216611aad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610740565b6001600160a01b038381165f8181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f81815260026020526040812080546001600160a01b03166107ac5760405162461bcd60e51b815260206004820152601b60248201527f4552433833373a2042657420646f6573206e6f742065786973742e00000000006044820152606401610740565b6001600160a01b038316611bd55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610740565b6001600160a01b038216611c375760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610740565b5f8111611c985760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610740565b5f80546001600160a01b03858116911614801590611cc357505f546001600160a01b03848116911614155b15611fc0576001600160a01b0384165f9081526009602052604090205460ff16158015611d0857506001600160a01b0383165f9081526009602052604090205460ff16155b611d10575f5ffd5b611d366064611040600f5460125411611d2b57600b54611d2f565b600d545b85906122dc565b6018549091506001600160a01b038581169116148015611d6457506017546001600160a01b03848116911614155b8015611d8857506001600160a01b0383165f9081526008602052604090205460ff16155b15611e5957601354821115611ddf5760405162461bcd60e51b815260206004820152601960248201527f4578636565647320746865205f6d61785478416d6f756e742e000000000000006044820152606401610740565b60145482611dec85610da2565b611df69190612ce3565b1115611e445760405162461bcd60e51b815260206004820152601a60248201527f4578636565647320746865206d617857616c6c657453697a652e0000000000006044820152606401610740565b60128054905f611e5383612efe565b91905055505b6018546001600160a01b038481169116148015611e7f57506001600160a01b0384163014155b15611eac57611ea9606461104060105460125411611e9f57600c54611d2f565b600e5485906122dc565b90505b5f611eb630610da2565b601854909150600160a81b900460ff16158015611ee057506018546001600160a01b038581169116145b8015611ef55750601854600160b01b900460ff165b8015611f02575060155481115b8015611f115750601154601254115b15611fbe57601a54431115611f25575f6019555b600460195410611f775760405162461bcd60e51b815260206004820152601760248201527f4f6e6c7920342073656c6c732070657220626c6f636b210000000000000000006044820152606401610740565b611f94611f8f84611f8a846016546124ab565b6124ab565b612135565b478015611fa457611fa4476122a5565b60198054905f611fb383612efe565b909155505043601a55505b505b801561203857305f90815260066020526040902054611fdf90826124bf565b305f81815260066020526040908190209290925590516001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061202f9085815260200190565b60405180910390a35b6001600160a01b0384165f9081526006602052604090205461205a908361251d565b6001600160a01b0385165f9081526006602052604090205561209d61207f838361251d565b6001600160a01b0385165f90815260066020526040902054906124bf565b6001600160a01b038085165f8181526006602052604090209290925585167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6120e6858561251d565b60405190815260200160405180910390a350505050565b5f81848411156121205760405162461bcd60e51b8152600401610740919061268e565b505f61212c8486612ec8565b95945050505050565b6018805460ff60a81b1916600160a81b1790556040805160028082526060820183525f9260208301908036833701905050905030815f8151811061217b5761217b612ccf565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156121d2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f69190612e44565b8160018151811061220957612209612ccf565b6001600160a01b03928316602091820292909201015260175461222f91309116846119ea565b60175460405163791ac94760e01b81526001600160a01b039091169063791ac947906122679085905f90869030904290600401612f16565b5f604051808303815f87803b15801561227e575f5ffd5b505af1158015612290573d5f5f3e3d5ffd5b50506018805460ff60a81b1916905550505050565b600a546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561099a573d5f5f3e3d5ffd5b5f825f036122eb57505f6107ac565b5f6122f68385612cb8565b9050826123038583612ea9565b1461235a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610740565b9392505050565b5f61235a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061255e565b5f806123ad84611b0d565b90505f5b6004820154811015612433575f8260040182815481106123d3576123d3612ccf565b5f9182526020808320909101546001600160a01b03168083526005860190915260409091205490915085900361242a576001600160a01b0381165f9081526006840160205260409020546124279085612ce3565b93505b506001016123b1565b505092915050565b5f5f61244684611b0d565b90505f5b60048201548110156124a157836001600160a01b031682600401828154811061247557612475612ccf565b5f918252602090912001546001600160a01b031603612499576001925050506107ac565b60010161244a565b505f949350505050565b5f8183116124b9578261235a565b50919050565b5f806124cb8385612ce3565b90508381101561235a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610740565b5f61235a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506120fd565b5f818361257e5760405162461bcd60e51b8152600401610740919061268e565b505f61212c8486612ea9565b828054828255905f5260205f209081019282156125ce579160200282015b828111156125ce57825182906125be9082612d42565b50916020019190600101906125a8565b506125da9291506125de565b5090565b808211156125da575f6125f182826125fa565b506001016125de565b50805461260690612b81565b5f825580601f10612615575050565b601f0160209004905f5260205f2090810190610d9f91905b808211156125da575f815560010161262d565b5f60208284031215612650575f5ffd5b813560ff8116811461235a575f5ffd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f61235a6020830184612660565b6001600160a01b0381168114610d9f575f5ffd5b5f5f604083850312156126c5575f5ffd5b82356126d0816126a0565b946020939093013593505050565b5f602082840312156126ee575f5ffd5b5035919050565b5f82825180855260208501945060208160051b830101602085015f5b8381101561274357601f1985840301885261272d838351612660565b6020988901989093509190910190600101612711565b50909695505050505050565b602081525f61235a60208301846126f5565b5f5f5f60608486031215612773575f5ffd5b833561277e816126a0565b9250602084013561278e816126a0565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156127dc576127dc61279f565b604052919050565b5f67ffffffffffffffff8211156127fd576127fd61279f565b5060051b60200190565b5f60208284031215612817575f5ffd5b813567ffffffffffffffff81111561282d575f5ffd5b8201601f8101841361283d575f5ffd5b803561285061284b826127e4565b6127b3565b8082825260208201915060208360051b850101925086831115612871575f5ffd5b6020840193505b8284101561289c57833561288b816126a0565b825260209384019390910190612878565b9695505050505050565b5f82601f8301126128b5575f5ffd5b813567ffffffffffffffff8111156128cf576128cf61279f565b6128e2601f8201601f19166020016127b3565b8181528460208386010111156128f6575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f5f60608486031215612924575f5ffd5b833567ffffffffffffffff81111561293a575f5ffd5b612946868287016128a6565b935050602084013567ffffffffffffffff811115612962575f5ffd5b8401601f81018613612972575f5ffd5b803561298061284b826127e4565b8082825260208201915060208360051b8501019250888311156129a1575f5ffd5b602084015b838110156129e257803567ffffffffffffffff8111156129c4575f5ffd5b6129d38b6020838901016128a6565b845250602092830192016129a6565b50959895975050505060409390930135925050565b5f60208284031215612a07575f5ffd5b813561235a816126a0565b5f8151808452602084019350602083015f5b82811015612a4b5781516001600160a01b0316865260209586019590910190600101612a24565b5093949350505050565b602081525f61235a6020830184612a12565b5f5f60408385031215612a78575f5ffd5b823591506020830135612a8a816126a0565b809150509250929050565b5f5f60408385031215612aa6575f5ffd5b50508035926020909101359150565b5f5f60408385031215612ac6575f5ffd5b8235612ad1816126a0565b91506020830135612a8a816126a0565b6001600160a01b038616815260a0602082018190525f90612b0490830187612660565b6040830195909552506060810192909252151560809091015292915050565b5f5f5f60608486031215612b35575f5ffd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612b9557607f821691505b6020821081036124b957634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001815b6001841115612c0257808504811115612be657612be6612bb3565b6001841615612bf457908102905b60019390931c928002612bcb565b935093915050565b5f82612c18575060016107ac565b81612c2457505f6107ac565b8160018114612c3a5760028114612c4457612c60565b60019150506107ac565b60ff841115612c5557612c55612bb3565b50506001821b6107ac565b5060208310610133831016604e8410600b8410161715612c83575081810a6107ac565b612c8f5f198484612bc7565b805f1904821115612ca257612ca2612bb3565b029392505050565b5f61235a60ff841683612c0a565b80820281158282048414176107ac576107ac612bb3565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107ac576107ac612bb3565b601f821115612d3d57805f5260205f20601f840160051c81016020851015612d1b5750805b601f840160051c820191505b81811015612d3a575f8155600101612d27565b50505b505050565b815167ffffffffffffffff811115612d5c57612d5c61279f565b612d7081612d6a8454612b81565b84612cf6565b6020601f821160018114612da2575f8315612d8b5750848201515b5f19600385901b1c1916600184901b178455612d3a565b5f84815260208120601f198516915b82811015612dd15787850151825560209485019460019092019101612db1565b5084821015612dee57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03851681526080602082018190525f90612e2090830186612660565b8281036040840152612e3281866126f5565b91505082606083015295945050505050565b5f60208284031215612e54575f5ffd5b815161235a816126a0565b5f5f5f60608486031215612e71575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215612e9a575f5ffd5b8151801515811461235a575f5ffd5b5f82612ec357634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156107ac576107ac612bb3565b60ff8181168382160290811690818114612ef757612ef7612bb3565b5092915050565b5f60018201612f0f57612f0f612bb3565b5060010190565b85815284602082015260a060408201525f612f3460a0830186612a12565b6001600160a01b039490941660608301525060800152939250505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a2646970667358221220977ae170f138f128f05b24cb703a58413cc5a11d932249fa0d0b693d641b65e564736f6c634300081b0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.