Contract 0x069895fda566d0364abec6e290bee3d565c55666

 
 
Txn Hash
Method
Block
From
To
Value [Txn Fee]
0xd1cbfb324bf688049153044b39047212bbbcba5356f2d549c0b8dad2b617daa6Add Free Session...196746942021-09-30 9:16:51618 days 15 hrs agoAnimoca: Deployer IN  0x069895fda566d0364abec6e290bee3d565c556660 MATIC0.0000293460291.000001
0xea7eac77fabfce71e4bbc787b5a00b9187644c3d312804ad8c92ef9d7e7f4862Set Session Pric...178621682021-08-11 8:43:47668 days 15 hrs agoAnimoca: Deployer IN  0x069895fda566d0364abec6e290bee3d565c556660 MATIC0.000464910
0xb09e8b3063a7c49338b7a5579589564eccf86c34640d14d39e9fce0dec342fe6Add Free Session...178245282021-08-10 8:17:59669 days 16 hrs agoAnimoca: Deployer IN  0x069895fda566d0364abec6e290bee3d565c556660 MATIC0.000232235
0xf6a36a856f0a4ac8d1a2c14418562dd522ed9d9cdc76fd2193679d8fea8663500x60a06040178245232021-08-10 8:17:49669 days 16 hrs agoAnimoca: Deployer IN  Create: SessionsManager0 MATIC0.0052924355
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SessionsManager

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at polygonscan.com on 2021-08-10
*/

/**
 *Submitted for verification at polygonscan.com on 2021-07-28
*/

// Sources flattened with hardhat v2.4.3 https://hardhat.org

// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/types/[email protected]

// SPDX-License-Identifier: MIT

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/metatx/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/*
 * Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


// File @animoca/ethereum-contracts-core-1.1.1/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is ManagedIdentity, IERC173 {
    address internal _owner;

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;



abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/payment/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
    @title PayoutWallet
    @dev adds support for a payout wallet
    Note: .
 */
abstract contract PayoutWallet is ManagedIdentity, Ownable {
    event PayoutWalletSet(address payoutWallet_);

    address payable public payoutWallet;

    constructor(address owner, address payable payoutWallet_) Ownable(owner) {
        require(payoutWallet_ != address(0), "Payout: zero address");
        payoutWallet = payoutWallet_;
        emit PayoutWalletSet(payoutWallet_);
    }

    function setPayoutWallet(address payable payoutWallet_) public {
        _requireOwnership(_msgSender());
        require(payoutWallet_ != address(0), "Payout: zero address");
        payoutWallet = payoutWallet_;
        emit PayoutWalletSet(payoutWallet);
    }
}


// File @animoca/ethereum-contracts-core-1.1.1/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20 Token Standard, Receiver
 * See https://eips.ethereum.org/EIPS/eip-20
 * Note: the ERC-165 identifier for this interface is 0x4fc35859.
 */
interface IERC20Receiver {
    /**
     * Handles the receipt of ERC20 tokens.
     * @param sender The initiator of the transfer.
     * @param from The address which transferred the tokens.
     * @param value The amount of tokens transferred.
     * @param data Optional additional data with no specified format.
     * @return bytes4 `bytes4(keccak256("onERC20Received(address,address,uint256,bytes)"))`
     */
    function onERC20Received(
        address sender,
        address from,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets-1.1.3/contracts/token/ERC20/[email protected]

pragma solidity >=0.7.6 <0.8.0;


abstract contract ERC20Receiver is IERC20Receiver, IERC165 {
    bytes4 internal constant _ERC20_RECEIVED = type(IERC20Receiver).interfaceId;
    bytes4 internal constant _ERC20_REJECTED = 0xffffffff;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId || interfaceId == type(IERC20Receiver).interfaceId;
    }
}


// File contracts/payment/SessionsManager.sol

pragma solidity >=0.7.6 <0.8.0;




/**
 * @title SessionsManager, a contract to register game sessions in REVV Racing.
 */
contract SessionsManager is Recoverable, ERC20Receiver, PayoutWallet {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Event emitted when a game session has been submitted.
     * @param account the address of the account which entered the session.
     * @param sessionId the session identifier provided by the server.
     * @param amount the amount of REVV paid for the session: 0 for a free session, the current session price otherwise.
     */
    event Admission(address account, string sessionId, uint256 amount);

    IWrappedERC20 public immutable revvToken;

    uint256 public freeSessions; // the total number of free sessions for each account.
    uint256 public sessionPrice; // the current price for a single session.

    mapping(address => uint256) public freeSessionsUsed; // the number of free sessions used by account.

    constructor(IWrappedERC20 revvToken_, address payable payoutWallet) PayoutWallet(msg.sender, payoutWallet) {
        revvToken = revvToken_;
    }

    /**
     * Adds `amount` of free sessions.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if the number of free sessions overflows.
     * @param amount the number of additional free sessions.
     */
    function addFreeSessions(uint256 amount) external {
        _requireOwnership(_msgSender());
        uint256 freeSessions_ = freeSessions;
        uint256 newFreeSessions = freeSessions_ + amount;
        require(newFreeSessions > freeSessions, "Sessions: sessions overflow");
        freeSessions = newFreeSessions;
    }

    /**
     * Sets `price` as the new session price. Setting a zero price will prevent any session to be admitted.
     * @dev Reverts if the sender is not the contract owner.
     * @param price the new session price.
     */
    function setSessionPrice(uint256 price) external {
        _requireOwnership(_msgSender());
        sessionPrice = price;
    }

    /**
     * Registers a user to a game session.
     * This function is the entry point when doing a PolygonREVV `safeTransfer` or `safeTransferFrom` to this contract.
     * @dev Reverts if the function is called from another address than the PolygonREVV contract address.
     * @dev Reverts if the session price has not been set yet.
     * @dev Reverts if the received value is incorrect: must be the session price, or zero in case of a free session.
     * @dev Emits an `Admission` event.
     * @param from the initiator of the transfer.
     * @param value the amount of PolygonREVV received.
     * @param data ABI-encoded string representing the session id6.
     */
    function onERC20Received(
        address, /*sender*/
        address from,
        uint256 value,
        bytes calldata data
    ) external override returns (bytes4) {
        require(_msgSender() == address(revvToken), "Sessions: wrong token");
        uint256 price = sessionPrice;
        require(price != 0, "Sessions: price not set");
        uint256 userFreeSessions = freeSessionsUsed[from];
        if (userFreeSessions < freeSessions) {
            require(value == 0, "Sessions: session is free");
            freeSessionsUsed[from] = userFreeSessions + 1; // cannot overflow as user free sessions can never reach max uint256
        } else {
            require(value == price, "Sessions: wrong price");
            revvToken.wrappedTransfer(payoutWallet, value);
        }

        emit Admission(from, abi.decode(data, (string)), value);

        return _ERC20_RECEIVED;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IWrappedERC20","name":"revvToken_","type":"address"},{"internalType":"address payable","name":"payoutWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"string","name":"sessionId","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Admission","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"payoutWallet_","type":"address"}],"name":"PayoutWalletSet","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addFreeSessions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeSessions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeSessionsUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC20Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revvToken","outputs":[{"internalType":"contract IWrappedERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sessionPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"payoutWallet_","type":"address"}],"name":"setPayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setSessionPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561001057600080fd5b506040516112c03803806112c08339818101604052604081101561003357600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918391839182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b0381166100dc576040805162461bcd60e51b815260206004820152601460248201527f5061796f75743a207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f8559181900360200190a1505050606081901b6001600160601b0319166080526001600160a01b031661115461016c600039806105ee52806107cc5280610d9e52506111546000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638488bb4e1161008c578063c3666c3611610066578063c3666c36146103d4578063dd8c6478146104e8578063f2fde38b14610505578063f4b8c30d1461052b576100ea565b80638488bb4e1461038b5780638da5cb5b146103af578063b605d27d146103b7576100ea565b806321eef09c116100c857806321eef09c146101645780634fc358591461018a5780636b8f9c431461024f57806373c8a95814610277576100ea565b806301ffc9a7146100ef578063177f071a14610142578063213537981461015c575b600080fd5b61012e6004803603602081101561010557600080fd5b50357fffffffff0000000000000000000000000000000000000000000000000000000016610533565b604080519115158252519081900360200190f35b61014a6105cc565b60408051918252519081900360200190f35b61014a6105d2565b61014a6004803603602081101561017a57600080fd5b50356001600160a01b03166105d8565b61021a600480360360808110156101a057600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156101db57600080fd5b8201836020820111156101ed57600080fd5b8035906020019184600183028401116401000000008311171561020f57600080fd5b5090925090506105ea565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6102756004803603602081101561026557600080fd5b50356001600160a01b031661097f565b005b6102756004803603606081101561028d57600080fd5b8101906020810181356401000000008111156102a857600080fd5b8201836020820111156102ba57600080fd5b803590602001918460208302840111640100000000831117156102dc57600080fd5b9193909290916020810190356401000000008111156102fa57600080fd5b82018360208201111561030c57600080fd5b8035906020019184602083028401116401000000008311171561032e57600080fd5b91939092909160208101903564010000000081111561034c57600080fd5b82018360208201111561035e57600080fd5b8035906020019184602083028401116401000000008311171561038057600080fd5b509092509050610a5c565b610393610b49565b604080516001600160a01b039092168252519081900360200190f35b610393610b58565b610275600480360360208110156103cd57600080fd5b5035610b67565b610275600480360360608110156103ea57600080fd5b81019060208101813564010000000081111561040557600080fd5b82018360208201111561041757600080fd5b8035906020019184602083028401116401000000008311171561043957600080fd5b91939092909160208101903564010000000081111561045757600080fd5b82018360208201111561046957600080fd5b8035906020019184602083028401116401000000008311171561048b57600080fd5b9193909290916020810190356401000000008111156104a957600080fd5b8201836020820111156104bb57600080fd5b803590602001918460208302840111640100000000831117156104dd57600080fd5b509092509050610b77565b610275600480360360208110156104fe57600080fd5b5035610cbf565b6102756004803603602081101561051b57600080fd5b50356001600160a01b0316610d2b565b610393610d9c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806105c657507fffffffff0000000000000000000000000000000000000000000000000000000082167f4fc3585900000000000000000000000000000000000000000000000000000000145b92915050565b60035481565b60025481565b60046020526000908152604090205481565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661061e610dc0565b6001600160a01b031614610679576040805162461bcd60e51b815260206004820152601560248201527f53657373696f6e733a2077726f6e6720746f6b656e0000000000000000000000604482015290519081900360640190fd5b600354806106ce576040805162461bcd60e51b815260206004820152601760248201527f53657373696f6e733a207072696365206e6f7420736574000000000000000000604482015290519081900360640190fd5b6001600160a01b038616600090815260046020526040902054600254811015610767578515610744576040805162461bcd60e51b815260206004820152601960248201527f53657373696f6e733a2073657373696f6e206973206672656500000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526004602052604090206001820190556107f5565b8186146107bb576040805162461bcd60e51b815260206004820152601560248201527f53657373696f6e733a2077726f6e672070726963650000000000000000000000604482015290519081900360640190fd5b6001546107f5906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911688610dc4565b7f4f6002f4105a164111bc48653a45996d2fee50168d529f765f5604c82f327d8a878686602081101561082757600080fd5b81019060208101813564010000000081111561084257600080fd5b82018360208201111561085457600080fd5b8035906020019184600183028401116401000000008311171561087657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050508860405180846001600160a01b0316815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b838110156109165781810151838201526020016108fe565b50505050905090810190601f1680156109435780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1507f4fc3585900000000000000000000000000000000000000000000000000000000979650505050505050565b61098f61098a610dc0565b610e49565b6001600160a01b0381166109ea576040805162461bcd60e51b815260206004820152601460248201527f5061796f75743a207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03838116919091179182905560408051929091168252517fdd880d24a789958a6398c99c2e54ce31bc10a638cbc42f7dd34285479ae0f855916020908290030190a150565b610a6761098a610dc0565b848381148015610a7657508082145b610ac7576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114610b3f57610b37888883818110610ae057fe5b905060200201356001600160a01b0316858584818110610afc57fe5b90506020020135888885818110610b0f57fe5b905060200201356001600160a01b03166001600160a01b0316610dc49092919063ffffffff16565b600101610aca565b5050505050505050565b6001546001600160a01b031681565b6000546001600160a01b031690565b610b7261098a610dc0565b600355565b610b8261098a610dc0565b848381148015610b9157508082145b610be2576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b818114610b3f57858582818110610bf857fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110610c2357fe5b905060200201356001600160a01b0316878786818110610c3f57fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015610c9c57600080fd5b505af1158015610cb0573d6000803e3d6000fd5b50505050806001019050610be5565b610cca61098a610dc0565b600254818101818111610d24576040805162461bcd60e51b815260206004820152601b60248201527f53657373696f6e733a2073657373696f6e73206f766572666c6f770000000000604482015290519081900360640190fd5b6002555050565b610d3661098a610dc0565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b7f000000000000000000000000000000000000000000000000000000000000000081565b3390565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610e44908490610f10565b505050565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8257600080fd5b505afa158015610e96573d6000803e3d6000fd5b505050506040513d6020811015610eac57600080fd5b50516001600160a01b03828116911614610f0d576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b50565b81610f236001600160a01b038216611118565b610f74576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b60208310610fcf57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610f92565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611031576040519150601f19603f3d011682016040523d82523d6000602084013e611036565b606091505b509150915081156110b5578051156110b05780806020019051602081101561105d57600080fd5b50516110b0576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b611111565b8051611108576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b5050505050565b3b15159056fea2646970667358221220ac48185e77e2655c0fb76586b5cdcbe381e8d9fdb28d6066681b33e10b4623c864736f6c6343000706003300000000000000000000000070c006878a5a50ed185ac4c87d837633923de296000000000000000000000000090bbf17f57760293bb87d8d6c65ad886430a55f

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

00000000000000000000000070c006878a5a50ed185ac4c87d837633923de296000000000000000000000000090bbf17f57760293bb87d8d6c65ad886430a55f

-----Decoded View---------------
Arg [0] : revvToken_ (address): 0x70c006878a5a50ed185ac4c87d837633923de296
Arg [1] : payoutWallet (address): 0x090bbf17f57760293bb87d8d6c65ad886430a55f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000070c006878a5a50ed185ac4c87d837633923de296
Arg [1] : 000000000000000000000000090bbf17f57760293bb87d8d6c65ad886430a55f


Deployed ByteCode Sourcemap

14001:3586:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13603:208;;;;;;;;;;;;;;;;-1:-1:-1;13603:208:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14686:27;;;:::i;:::-;;;;;;;;;;;;;;;;14597;;;:::i;14765:51::-;;;;;;;;;;;;;;;;-1:-1:-1;14765:51:0;-1:-1:-1;;;;;14765:51:0;;:::i;16672:912::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16672:912:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16672:912:0;;-1:-1:-1;16672:912:0;-1:-1:-1;16672:912:0;:::i;:::-;;;;;;;;;;;;;;;;;;;11312:268;;;;;;;;;;;;;;;;-1:-1:-1;11312:268:0;-1:-1:-1;;;;;11312:268:0;;:::i;:::-;;8623:492;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8623:492:0;;-1:-1:-1;8623:492:0;-1:-1:-1;8623:492:0;:::i;11023:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;11023:35:0;;;;;;;;;;;;;;6762:96;;;:::i;15843:130::-;;;;;;;;;;;;;;;;-1:-1:-1;15843:130:0;;:::i;9941:522::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9941:522:0;;-1:-1:-1;9941:522:0;-1:-1:-1;9941:522:0;:::i;15274:328::-;;;;;;;;;;;;;;;;-1:-1:-1;15274:328:0;;:::i;7105:201::-;;;;;;;;;;;;;;;;-1:-1:-1;7105:201:0;-1:-1:-1;;;;;7105:201:0;;:::i;14548:40::-;;;:::i;13603:208::-;13688:4;13712:40;;;13727:25;13712:40;;:91;;-1:-1:-1;13756:47:0;;;13771:32;13756:47;13712:91;13705:98;13603:208;-1:-1:-1;;13603:208:0:o;14686:27::-;;;;:::o;14597:::-;;;;:::o;14765:51::-;;;;;;;;;;;;;:::o;16672:912::-;16837:6;16888:9;-1:-1:-1;;;;;16864:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;16864:34:0;;16856:68;;;;;-1:-1:-1;;;16856:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16951:12;;16982:10;16974:46;;;;;-1:-1:-1;;;16974:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17058:22:0;;17031:24;17058:22;;;:16;:22;;;;;;17114:12;;17095:31;;17091:383;;;17151:10;;17143:48;;;;;-1:-1:-1;;;17143:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17206:22:0;;;;;;:16;:22;;;;;17250:1;17231:20;;17206:45;;17091:383;;;17370:5;17361;:14;17353:48;;;;;-1:-1:-1;;;17353:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17442:12;;17416:46;;-1:-1:-1;;;;;17416:9:0;:25;;;17442:12;17456:5;17416:25;:46::i;:::-;17491:50;17501:4;17518;;17507:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17535:5;17491:50;;;;-1:-1:-1;;;;;17491:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13438:32:0;;16672:912;-1:-1:-1;;;;;;;16672:912:0:o;11312:268::-;11386:31;11404:12;:10;:12::i;:::-;11386:17;:31::i;:::-;-1:-1:-1;;;;;11436:27:0;;11428:60;;;;;-1:-1:-1;;;11428:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11499:12;:28;;;;-1:-1:-1;;;;;11499:28:0;;;;;;;;;;;11543:29;;;11559:12;;;;11543:29;;;;;;;;;;;;;11312:268;:::o;8623:492::-;8792:31;8810:12;:10;:12::i;8792:31::-;8851:8;8885:23;;;:51;;;;-1:-1:-1;8912:24:0;;;8885:51;8877:90;;;;;-1:-1:-1;;;8877:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8983:9;8978:130;9003:6;8998:1;:11;8978:130;;9031:65;9072:8;;9081:1;9072:11;;;;;;;;;;;;;-1:-1:-1;;;;;9072:11:0;9085:7;;9093:1;9085:10;;;;;;;;;;;;;9045:6;;9052:1;9045:9;;;;;;;;;;;;;-1:-1:-1;;;;;9045:9:0;-1:-1:-1;;;;;9031:40:0;;;:65;;;;;:::i;:::-;9011:3;;8978:130;;;;8623:492;;;;;;;:::o;11023:35::-;;;-1:-1:-1;;;;;11023:35:0;;:::o;6762:96::-;6817:7;6844:6;-1:-1:-1;;;;;6844:6:0;6762:96;:::o;15843:130::-;15903:31;15921:12;:10;:12::i;15903:31::-;15945:12;:20;15843:130::o;9941:522::-;10115:31;10133:12;:10;:12::i;10115:31::-;10174:8;10208:26;;;:55;;;;-1:-1:-1;10238:25:0;;;10208:55;10200:94;;;;;-1:-1:-1;;;10200:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10310:9;10305:151;10330:6;10325:1;:11;10305:151;;10377:9;;10387:1;10377:12;;;;;;;;;;;;;-1:-1:-1;;;;;10377:12:0;-1:-1:-1;;;;;10358:45:0;;10412:4;10419:8;;10428:1;10419:11;;;;;;;;;;;;;-1:-1:-1;;;;;10419:11:0;10432:8;;10441:1;10432:11;;;;;;;;;;;;;10358:86;;;;;;;;;;;;;-1:-1:-1;;;;;10358:86:0;;;;;;-1:-1:-1;;;;;10358:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10338:3;;;;;10305:151;;15274:328;15335:31;15353:12;:10;:12::i;15335:31::-;15401:12;;15450:22;;;15491:30;;;15483:70;;;;;-1:-1:-1;;;15483:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15564:12;:30;-1:-1:-1;;15274:328:0:o;7105:201::-;7185:31;7203:12;:10;:12::i;7185:31::-;7227:6;:17;;;;-1:-1:-1;;;;;7227:17:0;;;;;;;;;7260:38;;7227:17;;7281:6;;;7260:38;;7227:6;7260:38;7105:201;:::o;14548:40::-;;;:::o;4392:106::-;4480:10;4392:106;:::o;1993:229::-;2155:58;;;-1:-1:-1;;;;;2155:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2178:23;2155:58;;;2120:94;;2148:5;;2120:27;:94::i;:::-;1993:229;;;:::o;7437:138::-;7528:4;-1:-1:-1;;;;;7528:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7528:12:0;-1:-1:-1;;;;;7517:23:0;;;;;;7509:58;;;;;-1:-1:-1;;;7509:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7437:138;:::o;2749:892::-;2875:5;2900:19;-1:-1:-1;;;;;2900:17:0;;;:19::i;:::-;2892:58;;;;;-1:-1:-1;;;2892:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3024:12;3038:17;3059:6;-1:-1:-1;;;;;3059:11:0;3071:8;3059:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3023:57;;;;3095:7;3091:543;;;3123:11;;:16;3119:124;;3179:4;3168:24;;;;;;;;;;;;;;;-1:-1:-1;3168:24:0;3160:67;;;;;-1:-1:-1;;;3160:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3091:543;;;3334:11;;3330:97;;3371:40;;;-1:-1:-1;;;3371:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;3330:97;3558:4;3552:11;3603:4;3596;3592:2;3588:13;3581:27;3521:102;2749:892;;;;;:::o;1180:387::-;1503:20;1551:8;;;1180:387::o

Swarm Source

ipfs://ac48185e77e2655c0fb76586b5cdcbe381e8d9fdb28d6066681b33e10b4623c8
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.