ETH Price: $2,072.00 (-8.83%)

Token

Beat Token (BEAT)
 

Overview

Max Total Supply

500,000 BEAT

Holders

202

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
11.3 BEAT

Value
$0.00
0xe07bd6731415eeea731c65a70497c1cfbe9b929c
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:
BeatToken

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : beat.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

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

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

interface IERC20 {
    /**
     * @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);

    /**
     * @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
    );
}

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);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(
        address owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 amount
    ) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(
            fromBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "ERC20: insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;
    mapping(address => bool) public addressAdmin;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    function addAdmin(address _address) external onlyOwner {
        addressAdmin[_address] = true;
    }

    function removeAdmin(address _address) external onlyOwner {
        addressAdmin[_address] = false;
    }

    modifier admin() {
        require(
            addressAdmin[msg.sender] == true || owner() == _msgSender(),
            "You do not have auth to do this"
        );
        _;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    // modifier onlyOwner() {
    //     require(owner() == _msgSender() || addressAdmin[msg.sender] == true, "Ownable: caller is not the owner");
    //     _;
    // }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract BeatToken is ERC20, Ownable {
    uint256 public initialTotalSupply;
    mapping(address => uint256) public stakes;
    mapping(address => bool) public proposerAddress;
    uint256 public totalStaked;
    address public surexTokenAddress;
    uint256 public burnedSureX;
    mapping(uint => Reward) public rewards;
    mapping(uint => Proposal) public proposals;
    mapping(address => mapping(uint => uint256)) public userRewards;
    uint public proposalSum;
    uint[] public proposalIds;

    struct Reward {
        uint256 rewardId;
        address rewardTokenAddress;
        uint256 rewardAmount;
        uint256 claimDueDate;
    }

    struct Proposal {
        uint256 proposalId;
        uint256 yesCount;
        uint256 noCount;
        uint256 dueDate;
        address[] yesAddresses;
        address[] noAddresses;
    }

    constructor(address _surexTokenAddress , address coreTeamAddress,
        address techTeamAddress,
        address devFundAddress) ERC20("Beat Token", "BEAT") {
        initialTotalSupply = 500000 * 10 ** 18;
        _mint(address(this), initialTotalSupply);
        surexTokenAddress = _surexTokenAddress;

        // Allocate tokens
        _transfer(
            address(this),
            coreTeamAddress,
            (initialTotalSupply * 5) / 100
        ); // 5%
        _transfer(
            address(this),
            techTeamAddress,
            (initialTotalSupply * 3) / 100
        ); // 3%
        _transfer(
            address(this),
            devFundAddress,
            (initialTotalSupply * 2) / 100
        ); // 2%
    }

    //Update surexToken address
    function updateSTAddr(address _surexTokenAddress) external admin {
        surexTokenAddress = _surexTokenAddress;
    }

    function BurnAndMint(address adminAddr) external admin {
        IERC20 surexToken = IERC20(surexTokenAddress);
        IERC20 beatToken = IERC20(address(this));

        // 1. Check if admin has approved at least 1*10**8 surexToken for this contract
        uint256 approvedAmount = surexToken.allowance(adminAddr, address(this));
        require(
            approvedAmount >= 1 * 10 ** 8 * 10 ** 18,
            "Not enough surexToken approved"
        );

        // 2. Transfer 1*10**8 surexToken from admin to this contract
        surexToken.transferFrom(
            adminAddr,
            address(this),
            1 * 10 ** 8 * 10 ** 18
        );

        // 3. Transfer 50000 BEAT tokens from this contract to admin's address
        uint256 contractBalance = balanceOf(address(this));
        require(
            contractBalance >= 50000 * 10 ** 18,
            "Contract balance not enough"
        );
        beatToken.transfer(adminAddr, 50000 * 10 ** 18);
    }

    // AddProposer and RemoveProposer
    modifier onlyProposer() {
        require(proposerAddress[_msgSender()] == true, "Not a proposer");
        _;
    }

    function addProposer(address _proposer) external admin {
        proposerAddress[_proposer] = true;
    }

    function removeProposer(address _proposer) external admin {
        proposerAddress[_proposer] = false;
    }

    //submit proposal
    function submitProposal(
        uint256 proposal_id,
        uint256 proposal_due_time
    ) external onlyProposer {
        proposals[proposal_id] = Proposal(
            proposal_id,
            0,
            0,
            proposal_due_time,
            new address[](0),
            new address[](0)
        );
        proposalSum += 1;
        proposalIds.push(proposal_id);
    }

    //vote proposal
    // Define the event outside the function
    event UserVoted(
        address indexed user,
        uint256 indexed voteTime,
        bool indexed choice
    );

    function voteProposal(uint proposal_id, bool choice) external {
        Proposal storage p = proposals[proposal_id];

        // 1. Check if proposal is still valid (not outdated)
        require(p.dueDate > block.timestamp, "Proposal outdate");

        // 2. Check if user has already voted
        require(!hasVoted(_msgSender(), p), "You've voted before");

        if (choice) {
            p.yesCount++;
            p.yesAddresses.push(_msgSender());
        } else {
            p.noCount++;
            p.noAddresses.push(_msgSender());
        }

        // Emit the UserVoted event
        emit UserVoted(_msgSender(), block.timestamp, choice);
    }

    // Helper function to check if a user has already voted
    function hasVoted(
        address user,
        Proposal storage p
    ) internal view returns (bool) {
        for (uint i = 0; i < p.yesAddresses.length; i++) {
            if (p.yesAddresses[i] == user) {
                return true;
            }
        }
        for (uint i = 0; i < p.noAddresses.length; i++) {
            if (p.noAddresses[i] == user) {
                return true;
            }
        }
        return false;
    }

    //Stake beat
    event Staked(
        address indexed user,
        uint256 indexed amount,
        uint256 indexed stakeTime
    );

    function stakeBeat(uint256 amount) external {
        require(amount > 0, "Amount should be greater than 0");
        require(
            balanceOf(_msgSender()) - stakes[_msgSender()] >= amount,
            "Insufficient balance"
        );

        // Update the staked amount for the user and the total staked amount
        stakes[_msgSender()] += amount;
        totalStaked += amount;

        // Emit the Staked event
        emit Staked(_msgSender(), amount, block.timestamp);
    }

    function _beforeTokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual override {
        super._beforeTokenTransfer(sender, recipient, amount); // Call the parent contract's version of _beforeTokenTransfer
        if (sender != address(this) && sender != address(0)) {
            require(
                amount <= balanceOf(sender) - stakes[sender],
                "You can only transfer unstaked tokens"
            );
        }
    }

    // UnstakeBeat
    event Unstaked(
        address indexed user,
        uint256 indexed amount,
        uint256 indexed stakeTime
    );

    function unstakeBeat() external {
        require(stakes[_msgSender()] > 0, "No staked amount");

        // Check for active votes
        require(
            !hasActiveVote(_msgSender()),
            "You have an active vote and cannot unstake until the vote ends."
        );

        uint256 amountToUnstake = stakes[_msgSender()];
        stakes[_msgSender()] = 0;
        totalStaked -= amountToUnstake;

        // Emit the Unstaked event
        emit Unstaked(_msgSender(), amountToUnstake, block.timestamp);
    }

    // Helper function to check if a user has an active vote
    function hasActiveVote(address user) internal view returns (bool) {
        for (uint i = 0; i < proposalSum; i++) {
            Proposal storage p = proposals[proposalIds[i]];
            for (uint j = 0; j < p.yesAddresses.length; j++) {
                if (p.yesAddresses[j] == user && p.dueDate > block.timestamp) {
                    return true;
                }
            }
            for (uint j = 0; j < p.noAddresses.length; j++) {
                if (p.noAddresses[j] == user && p.dueDate > block.timestamp) {
                    return true;
                }
            }
        }
        return false;
    }

    //Add distribute address and distribute amount
    function addDistributeAddress(
        uint256 reward_id,
        address[] memory address_list,
        uint[] memory amount_list
    ) external admin {
        // 1. Check the lengths of address_list and amount_list
        require(
            address_list.length == amount_list.length,
            "Address list and amount list must have the same length"
        );

        // 2. Record each reward for each address
        for (uint i = 0; i < address_list.length; i++) {
            address user = address_list[i];
            uint256 amount = amount_list[i];
            userRewards[user][reward_id] = amount; // Record the reward amount for the user and rewardId
        }
    }

    //For user to check how much rewards in their account of exact reward id
    function getRewardAmount(
        address user,
        uint rewardId
    ) external view returns (uint256) {
        return userRewards[user][rewardId];
    }

    //New reward distribution
    function newRewardDistribution(
        uint256 reward_id,
        address token_address,
        uint256 reward_amount,
        uint256 claim_due_date
    ) external admin {
        // Ensure that the reward_id is unique and hasn't been used before
        require(rewards[reward_id].rewardId == 0, "Reward ID already exists");

        // Construct a new Reward struct with the provided data
        Reward memory newReward = Reward({
            rewardId: reward_id,
            rewardTokenAddress: token_address,
            rewardAmount: reward_amount,
            claimDueDate: claim_due_date
        });

        // Store the newReward in the rewards mapping
        rewards[reward_id] = newReward;
    }

    //claim reward
    function claimReward(uint256 reward_id) external {
        // Ensure the reward exists
        require(rewards[reward_id].rewardId != 0, "Reward does not exist");

        // Check the reward's due time
        require(
            rewards[reward_id].claimDueDate > block.timestamp,
            "Claim period has ended"
        );

        // Get the reward amount for the user
        uint256 rewardAmount = userRewards[msg.sender][reward_id];
        // Get the balance of the reward token in this contract
        uint256 contractBalance = IERC20(rewards[reward_id].rewardTokenAddress)
            .balanceOf(address(this));
        require(rewardAmount > 0, "No reward to claim for this user");
        require(
            rewardAmount <= contractBalance,
            "Contract's reward balance is not enough"
        );
        require(
            rewardAmount <= rewards[reward_id].rewardAmount,
            "Exceed this reward's max limitation"
        );
        require(
            rewards[reward_id].rewardAmount > 0,
            "This reward has been claimed out"
        );

        // Reset the user's reward to 0 to prevent double claiming
        userRewards[msg.sender][reward_id] = 0;
        rewards[reward_id].rewardAmount -= rewardAmount;
        // Transfer the token to the user's address
        IERC20(rewards[reward_id].rewardTokenAddress).transfer(
            msg.sender,
            rewardAmount
        );
    }

    //Release unclaimed reward
    function releaseUnclaimedReward(uint256 reward_id) external onlyOwner {
        // Ensure the reward exists
        require(rewards[reward_id].rewardId != 0, "Reward does not exist");

        // Check that the reward's claimDueDate has passed
        require(
            rewards[reward_id].claimDueDate < block.timestamp,
            "Claim period not ended yet"
        );

        // Get the balance of the reward token in this contract
        uint256 contractBalance = IERC20(rewards[reward_id].rewardTokenAddress)
            .balanceOf(address(this));

        require(
            rewards[reward_id].rewardAmount <= contractBalance,
            "Contract's balance is not enough"
        );

        // Transfer the remaining balance to the owner
        IERC20(rewards[reward_id].rewardTokenAddress).transfer(
            msg.sender,
            rewards[reward_id].rewardAmount
        );
    }

    function withdrawTokens(
        address tokenAddress,
        uint256 amount
    ) external onlyOwner {
        IERC20 token = IERC20(tokenAddress);
        require(
            token.balanceOf(address(this)) >= amount,
            "Insufficient token balance"
        );
        token.transfer(owner(), amount);
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_surexTokenAddress","type":"address"},{"internalType":"address","name":"coreTeamAddress","type":"address"},{"internalType":"address","name":"techTeamAddress","type":"address"},{"internalType":"address","name":"devFundAddress","type":"address"}],"stateMutability":"nonpayable","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":"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":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeTime","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"stakeTime","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"voteTime","type":"uint256"},{"indexed":true,"internalType":"bool","name":"choice","type":"bool"}],"name":"UserVoted","type":"event"},{"inputs":[{"internalType":"address","name":"adminAddr","type":"address"}],"name":"BurnAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward_id","type":"uint256"},{"internalType":"address[]","name":"address_list","type":"address[]"},{"internalType":"uint256[]","name":"amount_list","type":"uint256[]"}],"name":"addDistributeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposer","type":"address"}],"name":"addProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressAdmin","outputs":[{"internalType":"bool","name":"","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedSureX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward_id","type":"uint256"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"rewardId","type":"uint256"}],"name":"getRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward_id","type":"uint256"},{"internalType":"address","name":"token_address","type":"address"},{"internalType":"uint256","name":"reward_amount","type":"uint256"},{"internalType":"uint256","name":"claim_due_date","type":"uint256"}],"name":"newRewardDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint256","name":"yesCount","type":"uint256"},{"internalType":"uint256","name":"noCount","type":"uint256"},{"internalType":"uint256","name":"dueDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"proposerAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reward_id","type":"uint256"}],"name":"releaseUnclaimedReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proposer","type":"address"}],"name":"removeProposer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"rewardId","type":"uint256"},{"internalType":"address","name":"rewardTokenAddress","type":"address"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"claimDueDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeBeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal_id","type":"uint256"},{"internalType":"uint256","name":"proposal_due_time","type":"uint256"}],"name":"submitProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"surexTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeBeat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_surexTokenAddress","type":"address"}],"name":"updateSTAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposal_id","type":"uint256"},{"internalType":"bool","name":"choice","type":"bool"}],"name":"voteProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620030dc380380620030dc833981016040819052620000349162000554565b6040518060400160405280600a8152602001692132b0ba102a37b5b2b760b11b815250604051806040016040528060048152602001631091505560e21b815250816003908162000085919062000655565b50600462000094828262000655565b505050620000b1620000ab6200015360201b60201c565b62000157565b6969e10de76676d08000006007819055620000ce903090620001a9565b600b80546001600160a01b0319166001600160a01b0386161790556007546200011790309085906064906200010590600562000737565b62000111919062000757565b6200028f565b6200013030836064600754600362000105919062000737565b6200014930826064600754600262000105919062000737565b50505050620007a6565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002055760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620002136000838362000463565b80600260008282546200022791906200077a565b90915550506001600160a01b03821660009081526020819052604081208054839290620002569084906200077a565b90915550506040518181526001600160a01b03831690600090600080516020620030bc8339815191529060200160405180910390a35050565b6001600160a01b038316620002f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401620001fc565b6001600160a01b038216620003595760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401620001fc565b6200036683838362000463565b6001600160a01b03831660009081526020819052604090205481811015620003e05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401620001fc565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290620004199084906200077a565b92505081905550826001600160a01b0316846001600160a01b0316600080516020620030bc833981519152846040516200045591815260200190565b60405180910390a350505050565b6200047b8383836200053260201b62001ce51760201c565b6001600160a01b03831630148015906200049d57506001600160a01b03831615155b1562000532576001600160a01b0383166000908152600860209081526040808320549183905290912054620004d3919062000790565b811115620005325760405162461bcd60e51b815260206004820152602560248201527f596f752063616e206f6e6c79207472616e7366657220756e7374616b656420746044820152646f6b656e7360d81b6064820152608401620001fc565b505050565b80516001600160a01b03811681146200054f57600080fd5b919050565b600080600080608085870312156200056b57600080fd5b620005768562000537565b9350620005866020860162000537565b9250620005966040860162000537565b9150620005a66060860162000537565b905092959194509250565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620005dc57607f821691505b602082108103620005fd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200053257600081815260208120601f850160051c810160208610156200062c5750805b601f850160051c820191505b818110156200064d5782815560010162000638565b505050505050565b81516001600160401b03811115620006715762000671620005b1565b6200068981620006828454620005c7565b8462000603565b602080601f831160018114620006c15760008415620006a85750858301515b600019600386901b1c1916600185901b1785556200064d565b600085815260208120601f198616915b82811015620006f257888601518255948401946001909101908401620006d1565b5085821015620007115787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141762000751576200075162000721565b92915050565b6000826200077557634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000751576200075162000721565b8181038181111562000751576200075162000721565b61290680620007b66000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80637048027511610151578063ae169a50116100c3578063dd62ed3e11610087578063dd62ed3e146105d1578063e97282811461060a578063f2fde38b1461061d578063f301af4214610630578063f795be6414610697578063f8f109b6146106aa57600080fd5b8063ae169a501461054f578063b03cd41814610562578063b82df5ba14610575578063bcfb9b6114610588578063da4e85561461059b57600080fd5b80638da5cb5b116101155780638da5cb5b146104ea57806395d80808146104fb57806395d89b411461050e5780639b644a2314610516578063a457c2d714610529578063a9059cbb1461053c57600080fd5b8063704802751461049557806370a08231146104a8578063715018a6146104d1578063817b1cd2146104d95780638af9a206146104e257600080fd5b806326502306116101ea5780633b89614c116101ae5780633b89614c146103fe5780633ccfd60b146104115780634e7f93b214610419578063541b2adf1461042c57806363c2a20a1461043f578063698885051461046a57600080fd5b806326502306146103a75780632c62fa81146103ca578063311028af146103d3578063313ce567146103dc57806339509351146103eb57600080fd5b806309d632d31161023157806309d632d31461033857806316934fc41461034b5780631785f53c1461037957806318160ddd1461038c57806323b872dd1461039457600080fd5b8063013cf08b1461026e57806303d7e558146102c857806306b091f9146102fb57806306fdde0314610310578063095ea7b314610325575b600080fd5b6102a361027c36600461240f565b600e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080015b60405180910390f35b6102eb6102d6366004612444565b60096020526000908152604090205460ff1681565b60405190151581526020016102bf565b61030e610309366004612466565b6106b3565b005b610318610839565b6040516102bf9190612490565b6102eb610333366004612466565b6108cb565b61030e610346366004612444565b6108e5565b61036b610359366004612444565b60086020526000908152604090205481565b6040519081526020016102bf565b61030e610387366004612444565b61094f565b60025461036b565b6102eb6103a23660046124de565b61099a565b6102eb6103b5366004612444565b60066020526000908152604090205460ff1681565b61036b600c5481565b61036b60075481565b604051601281526020016102bf565b6102eb6103f9366004612466565b6109be565b61030e61040c36600461240f565b6109fd565b61030e610b26565b61030e61042736600461251a565b610b8c565b61030e61043a36600461262b565b610c97565b61036b61044d366004612466565b600f60209081526000928352604080842090915290825290205481565b600b5461047d906001600160a01b031681565b6040516001600160a01b0390911681526020016102bf565b61030e6104a3366004612444565b610dd1565b61036b6104b6366004612444565b6001600160a01b031660009081526020819052604090205490565b61030e610e1f565b61036b600a5481565b61030e610e55565b6005546001600160a01b031661047d565b61030e610509366004612444565b610f7f565b610318610fea565b61036b61052436600461240f565b610ff9565b6102eb610537366004612466565b61101a565b6102eb61054a366004612466565b6110ac565b61030e61055d36600461240f565b6110ba565b61030e610570366004612444565b6113fa565b61030e610583366004612444565b611467565b61030e610596366004612704565b6116fa565b61036b6105a9366004612466565b6001600160a01b03919091166000908152600f60209081526040808320938352929052205490565b61036b6105df366004612734565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61030e610618366004612767565b611859565b61030e61062b366004612444565b611a04565b61066f61063e36600461240f565b600d60205260009081526040902080546001820154600283015460039093015491926001600160a01b039091169184565b604080519485526001600160a01b0390931660208501529183015260608201526080016102bf565b61030e6106a536600461240f565b611a9c565b61036b60105481565b6005546001600160a01b031633146106e65760405162461bcd60e51b81526004016106dd90612789565b60405180910390fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa15801561072e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075291906127be565b10156107a05760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e636500000000000060448201526064016106dd565b806001600160a01b031663a9059cbb6107c16005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044015b6020604051808303816000875af115801561080f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083391906127d7565b50505050565b606060038054610848906127f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610874906127f4565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b6000336108d9818585611cea565b60019150505b92915050565b3360009081526006602052604090205460ff1615156001148061091257506005546001600160a01b031633145b61092e5760405162461bcd60e51b81526004016106dd9061282e565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6005546001600160a01b031633146109795760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000336109a8858285611e0e565b6109b3858585611e9a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906108d990829086906109f890879061287b565b611cea565b60008111610a4d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e20300060448201526064016106dd565b336000818152600860205260409020548291610a68906104b6565b610a72919061288e565b1015610ab75760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106dd565b3360009081526008602052604081208054839290610ad690849061287b565b9250508190555080600a6000828254610aef919061287b565b90915550506040514290829033907f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9090600090a450565b6005546001600160a01b03163314610b505760405162461bcd60e51b81526004016106dd90612789565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b89573d6000803e3d6000fd5b50565b3360009081526006602052604090205460ff16151560011480610bb957506005546001600160a01b031633145b610bd55760405162461bcd60e51b81526004016106dd9061282e565b6000848152600d602052604090205415610c315760405162461bcd60e51b815260206004820152601860248201527f52657761726420494420616c726561647920657869737473000000000000000060448201526064016106dd565b604080516080810182528581526001600160a01b039485166020808301918252828401958652606083019485526000978852600d90529190952094518555516001850180546001600160a01b031916919094161790925551600283015551600390910155565b3360009081526006602052604090205460ff16151560011480610cc457506005546001600160a01b031633145b610ce05760405162461bcd60e51b81526004016106dd9061282e565b8051825114610d505760405162461bcd60e51b815260206004820152603660248201527f41646472657373206c69737420616e6420616d6f756e74206c697374206d75736044820152750e840d0c2ecca40e8d0ca40e6c2daca40d8cadccee8d60531b60648201526084016106dd565b60005b8251811015610833576000838281518110610d7057610d706128a1565b602002602001015190506000838381518110610d8e57610d8e6128a1565b6020908102919091018101516001600160a01b039093166000908152600f8252604080822089835290925220919091555080610dc9816128b7565b915050610d53565b6005546001600160a01b03163314610dfb5760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6005546001600160a01b03163314610e495760405162461bcd60e51b81526004016106dd90612789565b610e536000612073565b565b33600090815260086020526040902054610ea45760405162461bcd60e51b815260206004820152601060248201526f139bc81cdd185ad95908185b5bdd5b9d60821b60448201526064016106dd565b610ead336120c5565b15610f205760405162461bcd60e51b815260206004820152603f60248201527f596f75206861766520616e2061637469766520766f746520616e642063616e6e60448201527f6f7420756e7374616b6520756e74696c2074686520766f746520656e64732e0060648201526084016106dd565b336000908152600860205260408120805490829055600a805491928392610f4890849061288e565b90915550506040514290829033907f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e90600090a450565b3360009081526006602052604090205460ff16151560011480610fac57506005546001600160a01b031633145b610fc85760405162461bcd60e51b81526004016106dd9061282e565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610848906127f4565b6011818154811061100957600080fd5b600091825260209091200154905081565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561109f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106dd565b6109b38286868403611cea565b6000336108d9818585611e9a565b6000818152600d6020526040812054900361110f5760405162461bcd60e51b815260206004820152601560248201527414995dd85c9908191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016106dd565b6000818152600d602052604090206003015442106111685760405162461bcd60e51b815260206004820152601660248201527510db185a5b481c195c9a5bd9081a185cc8195b99195960521b60448201526064016106dd565b336000908152600f60209081526040808320848452825280832054600d9092528083206001015490516370a0823160e01b81523060048201529192916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906127be565b90506000821161124c5760405162461bcd60e51b815260206004820181905260248201527f4e6f2072657761726420746f20636c61696d20666f722074686973207573657260448201526064016106dd565b808211156112ac5760405162461bcd60e51b815260206004820152602760248201527f436f6e74726163742773207265776172642062616c616e6365206973206e6f74604482015266040cadcdeeaced60cb1b60648201526084016106dd565b6000838152600d60205260409020600201548211156113195760405162461bcd60e51b815260206004820152602360248201527f4578636565642074686973207265776172642773206d6178206c696d6974617460448201526234b7b760e91b60648201526084016106dd565b6000838152600d60205260409020600201546113775760405162461bcd60e51b815260206004820181905260248201527f546869732072657761726420686173206265656e20636c61696d6564206f757460448201526064016106dd565b336000908152600f602090815260408083208684528252808320839055600d909152812060020180548492906113ae90849061288e565b90915550506000838152600d60205260409081902060010154905163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016107f0565b3360009081526006602052604090205460ff1615156001148061142757506005546001600160a01b031633145b6114435760405162461bcd60e51b81526004016106dd9061282e565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b3360009081526006602052604090205460ff1615156001148061149457506005546001600160a01b031633145b6114b05760405162461bcd60e51b81526004016106dd9061282e565b600b54604051636eb1769f60e11b81526001600160a01b038381166004830152306024830181905292169190600090839063dd62ed3e90604401602060405180830381865afa158015611507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152b91906127be565b90506a52b7d2dcc80cd2e40000008110156115885760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768207375726578546f6b656e20617070726f766564000060448201526064016106dd565b6040516323b872dd60e01b81526001600160a01b0385811660048301523060248301526a52b7d2dcc80cd2e400000060448301528416906323b872dd906064016020604051808303816000875af11580156115e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160b91906127d7565b5030600090815260208190526040902054690a968163f0a57b4000008110156116765760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726163742062616c616e6365206e6f7420656e6f756768000000000060448201526064016106dd565b60405163a9059cbb60e01b81526001600160a01b038681166004830152690a968163f0a57b400000602483015284169063a9059cbb906044016020604051808303816000875af11580156116ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f291906127d7565b505050505050565b6000828152600e602052604090206003810154421061174e5760405162461bcd60e51b815260206004820152601060248201526f50726f706f73616c206f75746461746560801b60448201526064016106dd565b6117583382612210565b1561179b5760405162461bcd60e51b8152602060048201526013602482015272596f7527766520766f746564206265666f726560681b60448201526064016106dd565b81156117e4576001810180549060006117b3836128b7565b9091555050600481018054600181018255600091825260209091200180546001600160a01b03191633179055611823565b6002810180549060006117f6836128b7565b9091555050600581018054600181018255600091825260209091200180546001600160a01b031916331790555b60405182151590429033907f047d1f78088af0de45c6023951114b384642d837bd0eaa541521dcd844f7aa3b90600090a4505050565b3360009081526009602052604090205460ff1615156001146118ae5760405162461bcd60e51b815260206004820152600e60248201526d2737ba103090383937b837b9b2b960911b60448201526064016106dd565b6040518060c001604052808381526020016000815260200160008152602001828152602001600067ffffffffffffffff8111156118ed576118ed612555565b604051908082528060200260200182016040528015611916578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015611947578160200160208202803683370190505b5090526000838152600e60209081526040918290208351815583820151600182015591830151600283015560608301516003830155608083015180516119939260048501920190612395565b5060a082015180516119af916005840191602090910190612395565b509050506001601060008282546119c6919061287b565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68019190915550565b6005546001600160a01b03163314611a2e5760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b038116611a935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106dd565b610b8981612073565b6005546001600160a01b03163314611ac65760405162461bcd60e51b81526004016106dd90612789565b6000818152600d60205260408120549003611b1b5760405162461bcd60e51b815260206004820152601560248201527414995dd85c9908191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016106dd565b6000818152600d60205260409020600301544211611b7b5760405162461bcd60e51b815260206004820152601a60248201527f436c61696d20706572696f64206e6f7420656e6465642079657400000000000060448201526064016106dd565b6000818152600d60205260408082206001015490516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf691906127be565b6000838152600d6020526040902060020154909150811015611c5a5760405162461bcd60e51b815260206004820181905260248201527f436f6e747261637427732062616c616e6365206973206e6f7420656e6f75676860448201526064016106dd565b6000828152600d6020526040908190206001810154600290910154915163a9059cbb60e01b815233600482015260248101929092526001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce591906127d7565b505050565b6001600160a01b038316611d4c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106dd565b6001600160a01b038216611dad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146108335781811015611e8d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106dd565b6108338484848403611cea565b6001600160a01b038316611efe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106dd565b6001600160a01b038216611f605760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106dd565b611f6b8383836122e4565b6001600160a01b03831660009081526020819052604090205481811015611fe35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106dd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061201a90849061287b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206691815260200190565b60405180910390a3610833565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b601054811015612207576000600e6000601184815481106120ec576120ec6128a1565b90600052602060002001548152602001908152602001600020905060005b600482015481101561217c57846001600160a01b0316826004018281548110612135576121356128a1565b6000918252602090912001546001600160a01b031614801561215a5750428260030154115b1561216a57506001949350505050565b80612174816128b7565b91505061210a565b5060005b60058201548110156121f257846001600160a01b03168260050182815481106121ab576121ab6128a1565b6000918252602090912001546001600160a01b03161480156121d05750428260030154115b156121e057506001949350505050565b806121ea816128b7565b915050612180565b505080806121ff906128b7565b9150506120c9565b50600092915050565b6000805b600483015481101561227557836001600160a01b031683600401828154811061223f5761223f6128a1565b6000918252602090912001546001600160a01b0316036122635760019150506108df565b8061226d816128b7565b915050612214565b5060005b60058301548110156122da57836001600160a01b03168360050182815481106122a4576122a46128a1565b6000918252602090912001546001600160a01b0316036122c85760019150506108df565b806122d2816128b7565b915050612279565b5060009392505050565b6001600160a01b038316301480159061230557506001600160a01b03831615155b15611ce5576001600160a01b0383166000908152600860209081526040808320549183905290912054612338919061288e565b811115611ce55760405162461bcd60e51b815260206004820152602560248201527f596f752063616e206f6e6c79207472616e7366657220756e7374616b656420746044820152646f6b656e7360d81b60648201526084016106dd565b8280548282559060005260206000209081019282156123ea579160200282015b828111156123ea57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123b5565b506123f69291506123fa565b5090565b5b808211156123f657600081556001016123fb565b60006020828403121561242157600080fd5b5035919050565b80356001600160a01b038116811461243f57600080fd5b919050565b60006020828403121561245657600080fd5b61245f82612428565b9392505050565b6000806040838503121561247957600080fd5b61248283612428565b946020939093013593505050565b600060208083528351808285015260005b818110156124bd578581018301518582016040015282016124a1565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806000606084860312156124f357600080fd5b6124fc84612428565b925061250a60208501612428565b9150604084013590509250925092565b6000806000806080858703121561253057600080fd5b8435935061254060208601612428565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561259457612594612555565b604052919050565b600067ffffffffffffffff8211156125b6576125b6612555565b5060051b60200190565b600082601f8301126125d157600080fd5b813560206125e66125e18361259c565b61256b565b82815260059290921b8401810191818101908684111561260557600080fd5b8286015b848110156126205780358352918301918301612609565b509695505050505050565b60008060006060848603121561264057600080fd5b8335925060208085013567ffffffffffffffff8082111561266057600080fd5b818701915087601f83011261267457600080fd5b81356126826125e18261259c565b81815260059190911b8301840190848101908a8311156126a157600080fd5b938501935b828510156126c6576126b785612428565b825293850193908501906126a6565b9650505060408701359250808311156126de57600080fd5b50506126ec868287016125c0565b9150509250925092565b8015158114610b8957600080fd5b6000806040838503121561271757600080fd5b823591506020830135612729816126f6565b809150509250929050565b6000806040838503121561274757600080fd5b61275083612428565b915061275e60208401612428565b90509250929050565b6000806040838503121561277a57600080fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156127d057600080fd5b5051919050565b6000602082840312156127e957600080fd5b815161245f816126f6565b600181811c9082168061280857607f821691505b60208210810361282857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f596f7520646f206e6f742068617665206175746820746f20646f207468697300604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156108df576108df612865565b818103818111156108df576108df612865565b634e487b7160e01b600052603260045260246000fd5b6000600182016128c9576128c9612865565b506001019056fea2646970667358221220cc319f915e9c857f773b2d5843855fd7f58e09cc3daefb2aa1563a094dc324e764736f6c63430008120033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000276138dfe8f58df0a1cb0ed8c609e5f8877734900000000000000000000000001b96126d6bffeefba682e3c04d404585122e392a0000000000000000000000001a6e4e6adef4bc0eada2f8464195a6507b41df7c000000000000000000000000de6c14a61831b39f8c683ca7701d53b9ad15b07f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c80637048027511610151578063ae169a50116100c3578063dd62ed3e11610087578063dd62ed3e146105d1578063e97282811461060a578063f2fde38b1461061d578063f301af4214610630578063f795be6414610697578063f8f109b6146106aa57600080fd5b8063ae169a501461054f578063b03cd41814610562578063b82df5ba14610575578063bcfb9b6114610588578063da4e85561461059b57600080fd5b80638da5cb5b116101155780638da5cb5b146104ea57806395d80808146104fb57806395d89b411461050e5780639b644a2314610516578063a457c2d714610529578063a9059cbb1461053c57600080fd5b8063704802751461049557806370a08231146104a8578063715018a6146104d1578063817b1cd2146104d95780638af9a206146104e257600080fd5b806326502306116101ea5780633b89614c116101ae5780633b89614c146103fe5780633ccfd60b146104115780634e7f93b214610419578063541b2adf1461042c57806363c2a20a1461043f578063698885051461046a57600080fd5b806326502306146103a75780632c62fa81146103ca578063311028af146103d3578063313ce567146103dc57806339509351146103eb57600080fd5b806309d632d31161023157806309d632d31461033857806316934fc41461034b5780631785f53c1461037957806318160ddd1461038c57806323b872dd1461039457600080fd5b8063013cf08b1461026e57806303d7e558146102c857806306b091f9146102fb57806306fdde0314610310578063095ea7b314610325575b600080fd5b6102a361027c36600461240f565b600e6020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080015b60405180910390f35b6102eb6102d6366004612444565b60096020526000908152604090205460ff1681565b60405190151581526020016102bf565b61030e610309366004612466565b6106b3565b005b610318610839565b6040516102bf9190612490565b6102eb610333366004612466565b6108cb565b61030e610346366004612444565b6108e5565b61036b610359366004612444565b60086020526000908152604090205481565b6040519081526020016102bf565b61030e610387366004612444565b61094f565b60025461036b565b6102eb6103a23660046124de565b61099a565b6102eb6103b5366004612444565b60066020526000908152604090205460ff1681565b61036b600c5481565b61036b60075481565b604051601281526020016102bf565b6102eb6103f9366004612466565b6109be565b61030e61040c36600461240f565b6109fd565b61030e610b26565b61030e61042736600461251a565b610b8c565b61030e61043a36600461262b565b610c97565b61036b61044d366004612466565b600f60209081526000928352604080842090915290825290205481565b600b5461047d906001600160a01b031681565b6040516001600160a01b0390911681526020016102bf565b61030e6104a3366004612444565b610dd1565b61036b6104b6366004612444565b6001600160a01b031660009081526020819052604090205490565b61030e610e1f565b61036b600a5481565b61030e610e55565b6005546001600160a01b031661047d565b61030e610509366004612444565b610f7f565b610318610fea565b61036b61052436600461240f565b610ff9565b6102eb610537366004612466565b61101a565b6102eb61054a366004612466565b6110ac565b61030e61055d36600461240f565b6110ba565b61030e610570366004612444565b6113fa565b61030e610583366004612444565b611467565b61030e610596366004612704565b6116fa565b61036b6105a9366004612466565b6001600160a01b03919091166000908152600f60209081526040808320938352929052205490565b61036b6105df366004612734565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61030e610618366004612767565b611859565b61030e61062b366004612444565b611a04565b61066f61063e36600461240f565b600d60205260009081526040902080546001820154600283015460039093015491926001600160a01b039091169184565b604080519485526001600160a01b0390931660208501529183015260608201526080016102bf565b61030e6106a536600461240f565b611a9c565b61036b60105481565b6005546001600160a01b031633146106e65760405162461bcd60e51b81526004016106dd90612789565b60405180910390fd5b6040516370a0823160e01b8152306004820152829082906001600160a01b038316906370a0823190602401602060405180830381865afa15801561072e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075291906127be565b10156107a05760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e636500000000000060448201526064016106dd565b806001600160a01b031663a9059cbb6107c16005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018590526044015b6020604051808303816000875af115801561080f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083391906127d7565b50505050565b606060038054610848906127f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610874906127f4565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b6000336108d9818585611cea565b60019150505b92915050565b3360009081526006602052604090205460ff1615156001148061091257506005546001600160a01b031633145b61092e5760405162461bcd60e51b81526004016106dd9061282e565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6005546001600160a01b031633146109795760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6000336109a8858285611e0e565b6109b3858585611e9a565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091906108d990829086906109f890879061287b565b611cea565b60008111610a4d5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e742073686f756c642062652067726561746572207468616e20300060448201526064016106dd565b336000818152600860205260409020548291610a68906104b6565b610a72919061288e565b1015610ab75760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106dd565b3360009081526008602052604081208054839290610ad690849061287b565b9250508190555080600a6000828254610aef919061287b565b90915550506040514290829033907f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9090600090a450565b6005546001600160a01b03163314610b505760405162461bcd60e51b81526004016106dd90612789565b6005546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b89573d6000803e3d6000fd5b50565b3360009081526006602052604090205460ff16151560011480610bb957506005546001600160a01b031633145b610bd55760405162461bcd60e51b81526004016106dd9061282e565b6000848152600d602052604090205415610c315760405162461bcd60e51b815260206004820152601860248201527f52657761726420494420616c726561647920657869737473000000000000000060448201526064016106dd565b604080516080810182528581526001600160a01b039485166020808301918252828401958652606083019485526000978852600d90529190952094518555516001850180546001600160a01b031916919094161790925551600283015551600390910155565b3360009081526006602052604090205460ff16151560011480610cc457506005546001600160a01b031633145b610ce05760405162461bcd60e51b81526004016106dd9061282e565b8051825114610d505760405162461bcd60e51b815260206004820152603660248201527f41646472657373206c69737420616e6420616d6f756e74206c697374206d75736044820152750e840d0c2ecca40e8d0ca40e6c2daca40d8cadccee8d60531b60648201526084016106dd565b60005b8251811015610833576000838281518110610d7057610d706128a1565b602002602001015190506000838381518110610d8e57610d8e6128a1565b6020908102919091018101516001600160a01b039093166000908152600f8252604080822089835290925220919091555080610dc9816128b7565b915050610d53565b6005546001600160a01b03163314610dfb5760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b6005546001600160a01b03163314610e495760405162461bcd60e51b81526004016106dd90612789565b610e536000612073565b565b33600090815260086020526040902054610ea45760405162461bcd60e51b815260206004820152601060248201526f139bc81cdd185ad95908185b5bdd5b9d60821b60448201526064016106dd565b610ead336120c5565b15610f205760405162461bcd60e51b815260206004820152603f60248201527f596f75206861766520616e2061637469766520766f746520616e642063616e6e60448201527f6f7420756e7374616b6520756e74696c2074686520766f746520656e64732e0060648201526084016106dd565b336000908152600860205260408120805490829055600a805491928392610f4890849061288e565b90915550506040514290829033907f7fc4727e062e336010f2c282598ef5f14facb3de68cf8195c2f23e1454b2b74e90600090a450565b3360009081526006602052604090205460ff16151560011480610fac57506005546001600160a01b031633145b610fc85760405162461bcd60e51b81526004016106dd9061282e565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610848906127f4565b6011818154811061100957600080fd5b600091825260209091200154905081565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561109f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106dd565b6109b38286868403611cea565b6000336108d9818585611e9a565b6000818152600d6020526040812054900361110f5760405162461bcd60e51b815260206004820152601560248201527414995dd85c9908191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016106dd565b6000818152600d602052604090206003015442106111685760405162461bcd60e51b815260206004820152601660248201527510db185a5b481c195c9a5bd9081a185cc8195b99195960521b60448201526064016106dd565b336000908152600f60209081526040808320848452825280832054600d9092528083206001015490516370a0823160e01b81523060048201529192916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906127be565b90506000821161124c5760405162461bcd60e51b815260206004820181905260248201527f4e6f2072657761726420746f20636c61696d20666f722074686973207573657260448201526064016106dd565b808211156112ac5760405162461bcd60e51b815260206004820152602760248201527f436f6e74726163742773207265776172642062616c616e6365206973206e6f74604482015266040cadcdeeaced60cb1b60648201526084016106dd565b6000838152600d60205260409020600201548211156113195760405162461bcd60e51b815260206004820152602360248201527f4578636565642074686973207265776172642773206d6178206c696d6974617460448201526234b7b760e91b60648201526084016106dd565b6000838152600d60205260409020600201546113775760405162461bcd60e51b815260206004820181905260248201527f546869732072657761726420686173206265656e20636c61696d6564206f757460448201526064016106dd565b336000908152600f602090815260408083208684528252808320839055600d909152812060020180548492906113ae90849061288e565b90915550506000838152600d60205260409081902060010154905163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016107f0565b3360009081526006602052604090205460ff1615156001148061142757506005546001600160a01b031633145b6114435760405162461bcd60e51b81526004016106dd9061282e565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b3360009081526006602052604090205460ff1615156001148061149457506005546001600160a01b031633145b6114b05760405162461bcd60e51b81526004016106dd9061282e565b600b54604051636eb1769f60e11b81526001600160a01b038381166004830152306024830181905292169190600090839063dd62ed3e90604401602060405180830381865afa158015611507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152b91906127be565b90506a52b7d2dcc80cd2e40000008110156115885760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420656e6f756768207375726578546f6b656e20617070726f766564000060448201526064016106dd565b6040516323b872dd60e01b81526001600160a01b0385811660048301523060248301526a52b7d2dcc80cd2e400000060448301528416906323b872dd906064016020604051808303816000875af11580156115e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160b91906127d7565b5030600090815260208190526040902054690a968163f0a57b4000008110156116765760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726163742062616c616e6365206e6f7420656e6f756768000000000060448201526064016106dd565b60405163a9059cbb60e01b81526001600160a01b038681166004830152690a968163f0a57b400000602483015284169063a9059cbb906044016020604051808303816000875af11580156116ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f291906127d7565b505050505050565b6000828152600e602052604090206003810154421061174e5760405162461bcd60e51b815260206004820152601060248201526f50726f706f73616c206f75746461746560801b60448201526064016106dd565b6117583382612210565b1561179b5760405162461bcd60e51b8152602060048201526013602482015272596f7527766520766f746564206265666f726560681b60448201526064016106dd565b81156117e4576001810180549060006117b3836128b7565b9091555050600481018054600181018255600091825260209091200180546001600160a01b03191633179055611823565b6002810180549060006117f6836128b7565b9091555050600581018054600181018255600091825260209091200180546001600160a01b031916331790555b60405182151590429033907f047d1f78088af0de45c6023951114b384642d837bd0eaa541521dcd844f7aa3b90600090a4505050565b3360009081526009602052604090205460ff1615156001146118ae5760405162461bcd60e51b815260206004820152600e60248201526d2737ba103090383937b837b9b2b960911b60448201526064016106dd565b6040518060c001604052808381526020016000815260200160008152602001828152602001600067ffffffffffffffff8111156118ed576118ed612555565b604051908082528060200260200182016040528015611916578160200160208202803683370190505b5081526020016000604051908082528060200260200182016040528015611947578160200160208202803683370190505b5090526000838152600e60209081526040918290208351815583820151600182015591830151600283015560608301516003830155608083015180516119939260048501920190612395565b5060a082015180516119af916005840191602090910190612395565b509050506001601060008282546119c6919061287b565b9091555050601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68019190915550565b6005546001600160a01b03163314611a2e5760405162461bcd60e51b81526004016106dd90612789565b6001600160a01b038116611a935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106dd565b610b8981612073565b6005546001600160a01b03163314611ac65760405162461bcd60e51b81526004016106dd90612789565b6000818152600d60205260408120549003611b1b5760405162461bcd60e51b815260206004820152601560248201527414995dd85c9908191bd95cc81b9bdd08195e1a5cdd605a1b60448201526064016106dd565b6000818152600d60205260409020600301544211611b7b5760405162461bcd60e51b815260206004820152601a60248201527f436c61696d20706572696f64206e6f7420656e6465642079657400000000000060448201526064016106dd565b6000818152600d60205260408082206001015490516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611bd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf691906127be565b6000838152600d6020526040902060020154909150811015611c5a5760405162461bcd60e51b815260206004820181905260248201527f436f6e747261637427732062616c616e6365206973206e6f7420656e6f75676860448201526064016106dd565b6000828152600d6020526040908190206001810154600290910154915163a9059cbb60e01b815233600482015260248101929092526001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce591906127d7565b505050565b6001600160a01b038316611d4c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106dd565b6001600160a01b038216611dad5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106dd565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146108335781811015611e8d5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106dd565b6108338484848403611cea565b6001600160a01b038316611efe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106dd565b6001600160a01b038216611f605760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106dd565b611f6b8383836122e4565b6001600160a01b03831660009081526020819052604090205481811015611fe35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106dd565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061201a90849061287b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161206691815260200190565b60405180910390a3610833565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000805b601054811015612207576000600e6000601184815481106120ec576120ec6128a1565b90600052602060002001548152602001908152602001600020905060005b600482015481101561217c57846001600160a01b0316826004018281548110612135576121356128a1565b6000918252602090912001546001600160a01b031614801561215a5750428260030154115b1561216a57506001949350505050565b80612174816128b7565b91505061210a565b5060005b60058201548110156121f257846001600160a01b03168260050182815481106121ab576121ab6128a1565b6000918252602090912001546001600160a01b03161480156121d05750428260030154115b156121e057506001949350505050565b806121ea816128b7565b915050612180565b505080806121ff906128b7565b9150506120c9565b50600092915050565b6000805b600483015481101561227557836001600160a01b031683600401828154811061223f5761223f6128a1565b6000918252602090912001546001600160a01b0316036122635760019150506108df565b8061226d816128b7565b915050612214565b5060005b60058301548110156122da57836001600160a01b03168360050182815481106122a4576122a46128a1565b6000918252602090912001546001600160a01b0316036122c85760019150506108df565b806122d2816128b7565b915050612279565b5060009392505050565b6001600160a01b038316301480159061230557506001600160a01b03831615155b15611ce5576001600160a01b0383166000908152600860209081526040808320549183905290912054612338919061288e565b811115611ce55760405162461bcd60e51b815260206004820152602560248201527f596f752063616e206f6e6c79207472616e7366657220756e7374616b656420746044820152646f6b656e7360d81b60648201526084016106dd565b8280548282559060005260206000209081019282156123ea579160200282015b828111156123ea57825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123b5565b506123f69291506123fa565b5090565b5b808211156123f657600081556001016123fb565b60006020828403121561242157600080fd5b5035919050565b80356001600160a01b038116811461243f57600080fd5b919050565b60006020828403121561245657600080fd5b61245f82612428565b9392505050565b6000806040838503121561247957600080fd5b61248283612428565b946020939093013593505050565b600060208083528351808285015260005b818110156124bd578581018301518582016040015282016124a1565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806000606084860312156124f357600080fd5b6124fc84612428565b925061250a60208501612428565b9150604084013590509250925092565b6000806000806080858703121561253057600080fd5b8435935061254060208601612428565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561259457612594612555565b604052919050565b600067ffffffffffffffff8211156125b6576125b6612555565b5060051b60200190565b600082601f8301126125d157600080fd5b813560206125e66125e18361259c565b61256b565b82815260059290921b8401810191818101908684111561260557600080fd5b8286015b848110156126205780358352918301918301612609565b509695505050505050565b60008060006060848603121561264057600080fd5b8335925060208085013567ffffffffffffffff8082111561266057600080fd5b818701915087601f83011261267457600080fd5b81356126826125e18261259c565b81815260059190911b8301840190848101908a8311156126a157600080fd5b938501935b828510156126c6576126b785612428565b825293850193908501906126a6565b9650505060408701359250808311156126de57600080fd5b50506126ec868287016125c0565b9150509250925092565b8015158114610b8957600080fd5b6000806040838503121561271757600080fd5b823591506020830135612729816126f6565b809150509250929050565b6000806040838503121561274757600080fd5b61275083612428565b915061275e60208401612428565b90509250929050565b6000806040838503121561277a57600080fd5b50508035926020909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156127d057600080fd5b5051919050565b6000602082840312156127e957600080fd5b815161245f816126f6565b600181811c9082168061280857607f821691505b60208210810361282857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f596f7520646f206e6f742068617665206175746820746f20646f207468697300604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156108df576108df612865565b818103818111156108df576108df612865565b634e487b7160e01b600052603260045260246000fd5b6000600182016128c9576128c9612865565b506001019056fea2646970667358221220cc319f915e9c857f773b2d5843855fd7f58e09cc3daefb2aa1563a094dc324e764736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000276138dfe8f58df0a1cb0ed8c609e5f8877734900000000000000000000000001b96126d6bffeefba682e3c04d404585122e392a0000000000000000000000001a6e4e6adef4bc0eada2f8464195a6507b41df7c000000000000000000000000de6c14a61831b39f8c683ca7701d53b9ad15b07f

-----Decoded View---------------
Arg [0] : _surexTokenAddress (address): 0x276138Dfe8F58DF0A1Cb0ed8C609E5F887773490
Arg [1] : coreTeamAddress (address): 0x1b96126d6bFFeEFBA682E3c04D404585122E392a
Arg [2] : techTeamAddress (address): 0x1a6E4e6adef4Bc0eAdA2F8464195a6507b41DF7C
Arg [3] : devFundAddress (address): 0xDE6C14A61831b39f8C683CA7701d53b9ad15B07F

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000276138dfe8f58df0a1cb0ed8c609e5f887773490
Arg [1] : 0000000000000000000000001b96126d6bffeefba682e3c04d404585122e392a
Arg [2] : 0000000000000000000000001a6e4e6adef4bc0eada2f8464195a6507b41df7c
Arg [3] : 000000000000000000000000de6c14a61831b39f8c683ca7701d53b9ad15b07f


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.