ETH Price: $2,422.91 (+1.89%)

Contract

0x8AedB297FED4b6884b808ee61fAf0837713670d0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve208663362024-09-30 22:03:234 days ago1727733803IN
0x8AedB297...7713670d0
0 ETH0.0003486814.42584561
Approve187563622023-12-10 14:19:47299 days ago1702217987IN
0x8AedB297...7713670d0
0 ETH0.0006564622.62176426
Approve187563482023-12-10 14:16:59299 days ago1702217819IN
0x8AedB297...7713670d0
0 ETH0.0005987922.8487946
Approve187563382023-12-10 14:14:59299 days ago1702217699IN
0x8AedB297...7713670d0
0 ETH0.0011892525.79330719
Approve178197422023-08-01 11:06:11431 days ago1690887971IN
0x8AedB297...7713670d0
0 ETH0.0008478818.36086445
Approve178197052023-08-01 10:58:47431 days ago1690887527IN
0x8AedB297...7713670d0
0 ETH0.0010326722.39144314
Approve177294542023-07-19 19:55:59443 days ago1689796559IN
0x8AedB297...7713670d0
0 ETH0.0012712327.36490511
Approve174474112023-06-10 4:29:59483 days ago1686371399IN
0x8AedB297...7713670d0
0 ETH0.01018594219.54827237
Transfer170939522023-04-21 9:42:47533 days ago1682070167IN
0x8AedB297...7713670d0
0 ETH0.0017642637.80617592
Approve170119532023-04-09 16:37:23544 days ago1681058243IN
0x8AedB297...7713670d0
0 ETH0.0006320226.14814765
Approve165791422023-02-07 19:59:23605 days ago1675799963IN
0x8AedB297...7713670d0
0 ETH0.0020252843.59678299
Approve158324752022-10-26 13:13:59709 days ago1666790039IN
0x8AedB297...7713670d0
0 ETH0.0008657218.63567556
Burn Tokens And ...156139482022-09-26 0:24:11740 days ago1664151851IN
0x8AedB297...7713670d0
0 ETH0.000702765.27301561
Transfer153035042022-08-08 19:40:14788 days ago1659987614IN
0x8AedB297...7713670d0
0 ETH0.0010164421.78128985
Transfer152761682022-08-04 13:32:19792 days ago1659619939IN
0x8AedB297...7713670d0
0 ETH0.0005154915
Burn Tokens And ...150667232022-07-03 1:56:04825 days ago1656813364IN
0x8AedB297...7713670d0
0 ETH0.000964126.98260674
Burn Tokens And ...150666702022-07-03 1:47:38825 days ago1656812858IN
0x8AedB297...7713670d0
0 ETH0.0015078511.31389816
Deposit Cards An...150666332022-07-03 1:39:42825 days ago1656812382IN
0x8AedB297...7713670d0
0 ETH0.0021211810.1704229
Approve142465552022-02-21 1:45:53957 days ago1645407953IN
0x8AedB297...7713670d0
0 ETH0.00300387114.7787521
Approve142465552022-02-21 1:45:53957 days ago1645407953IN
0x8AedB297...7713670d0
0 ETH0.00277431114.7787521
Burn Tokens And ...138806872021-12-26 12:00:511014 days ago1640520051IN
0x8AedB297...7713670d0
0 ETH0.0119392836.61727476
Burn Tokens And ...138806752021-12-26 11:58:341014 days ago1640519914IN
0x8AedB297...7713670d0
0 ETH0.0140078742.96157077
Burn Tokens And ...138806372021-12-26 11:50:301014 days ago1640519430IN
0x8AedB297...7713670d0
0 ETH0.0117832536.13873286
Burn Tokens And ...138806012021-12-26 11:44:561014 days ago1640519096IN
0x8AedB297...7713670d0
0 ETH0.0168064944.19376668
Burn Tokens And ...137766182021-12-10 9:39:121030 days ago1639129152IN
0x8AedB297...7713670d0
0 ETH0.0052133344.46682095
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WrappedMarbleCard

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-06
*/

pragma solidity ^0.5.10;

/// @title Interface for interacting with the MarbleCards Core contract created by the fine folks at Marble.Cards.
contract CardCore {
    function approve(address _approved, uint256 _tokenId) external payable;
    function ownerOf(uint256 _tokenId) public view returns (address owner);
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function getApproved(uint256 _tokenId) external view returns (address);
}






/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a `Transfer` event.
     */
    function transfer(address recipient, 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.
     *
     * > 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 `sender` to `recipient` 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 sender, address recipient, 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);
}



/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

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

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

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

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        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`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is 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:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, 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
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}



/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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 onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}



/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor() public {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

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



/// @title Main contract for WrappedMarbleCards. Heavily inspired by the fine work of the WrappedKitties team
///  (https://wrappedkitties.com/) This contract converts MarbleCards between the ERC721 standard and the
///  ERC20 standard by locking marble.cards into the contract and minting 1:1 backed ERC20 tokens, that
///  can then be redeemed for marble cards when desired.
/// @notice When wrapping a marble card you get a generic WMC token. Since the WMC token is generic, it has no
///  no information about what marble card you submitted, so you will most likely not receive the same card
///  back when redeeming the token unless you specify that card's ID. The token only entitles you to receive
///  *a* marble card in return, not necessarily the *same* marblecard in return. A different user can submit
///  their own WMC tokens to the contract and withdraw the card that you originally deposited. WMC tokens have
///  no information about which card was originally deposited to mint WMC - this is due to the very nature of
///  the ERC20 standard being fungible, and the ERC721 standard being nonfungible.
contract WrappedMarbleCard is ERC20, Ownable, ReentrancyGuard {

    // OpenZeppelin's SafeMath library is used for all arithmetic operations to avoid overflows/underflows.
    using SafeMath for uint256;

    /* ****** */
    /* EVENTS */
    /* ****** */

    /// @dev This event is fired when a user deposits marblecards into the contract in exchange
    ///  for an equal number of WMC ERC20 tokens.
    /// @param cardId  The card id of the marble card that was deposited into the contract.
    event DepositCardAndMintToken(
        uint256 cardId
    );

    /// @dev This event is fired when a user deposits WMC ERC20 tokens into the contract in exchange
    ///  for an equal number of locked marblecards.
    /// @param cardId  The marblecard id of the card that was withdrawn from the contract.
    event BurnTokenAndWithdrawCard(
        uint256 cardId
    );

    /* ******* */
    /* STORAGE */
    /* ******* */

    /// @dev An Array containing all of the marblecards that are locked in the contract, backing
    ///  WMC ERC20 tokens 1:1
    /// @notice Some of the cards in this array were indeed deposited to the contract, but they
    ///  are no longer held by the contract. This is because withdrawSpecificCard() allows a
    ///  user to withdraw a card "out of order". Since it would be prohibitively expensive to
    ///  shift the entire array once we've withdrawn a single element, we instead maintain this
    ///  mapping to determine whether an element is still contained in the contract or not.
    uint256[] private depositedCardsArray;

    /// @dev Mapping to track whether a card is in the contract and it's place in the index
    mapping (uint256 => DepositedCard) private cardsInIndex;

    /// A data structure for tracking whether a card is in the contract and it's location in the array.
    struct DepositedCard {
        bool inContract;
        uint256 cardIndex;
    }

    /* ********* */
    /* CONSTANTS */
    /* ********* */

    /// @dev The metadata details about the "Wrapped MarbleCards" WMC ERC20 token.
    uint8 constant public decimals = 18;
    string constant public name = "Wrapped MarbleCards";
    string constant public symbol = "WMC";
    uint256 constant internal cardInWei = uint256(10)**decimals;

    /// @dev The address of official MarbleCards contract that stores the metadata about each card.
    /// @notice The owner is not capable of changing the address of the MarbleCards Core contract
    ///  once the contract has been deployed.
    /// Ropsten Testnet
    // address public cardCoreAddress = 0x5bb5Ce2EAa21375407F05FcA36b0b04F115efE7d;
    /// Mainnet
    address public cardCoreAddress = 0x1d963688FE2209A98dB35C67A041524822Cf04ff;
    CardCore cardCore;

    /* ********* */
    /* FUNCTIONS */
    /* ********* */


    /// @notice Allows a user to lock marblecards in the contract in exchange for an equal number
    ///  of WMC ERC20 tokens.
    /// @param _cardIds  The ids of the marblecards that will be locked into the contract.
    /// @notice The user must first call approve() in the MarbleCards Core contract on each card
    ///  that they wish to deposit before calling depositCardsAndMintTokens(). There is no danger
    ///  of this contract overreaching its approval, since the MarbleCards Core contract's approve()
    ///  function only approves this contract for a single marble card. Calling approve() allows this
    ///  contract to transfer the specified card in the depositCardsAndMintTokens() function.
    function depositCardsAndMintTokens(uint256[] calldata _cardIds) external nonReentrant {
        require(_cardIds.length > 0, 'you must submit an array with at least one element');
        for(uint i = 0; i < _cardIds.length; i++){
            uint256 cardToDeposit = _cardIds[i];
            require(msg.sender == cardCore.ownerOf(cardToDeposit), 'you do not own this card');
            require(cardCore.getApproved(cardToDeposit) == address(this), 'you must approve() this contract to give it permission to withdraw this card before you can deposit a card');
            cardCore.transferFrom(msg.sender, address(this), cardToDeposit);
            _pushCard(cardToDeposit);
            emit DepositCardAndMintToken(cardToDeposit);
        }
        _mint(msg.sender, (_cardIds.length).mul(cardInWei));
    }


    /// @notice Allows a user to burn WMC ERC20 tokens in exchange for an equal number of locked
    ///  marblecards.
    /// @param _cardIds  The IDs of the cards that the user wishes to withdraw. If the user submits 0
    ///  as the ID for any card, the contract uses the last card in the array for that card.
    /// @param _destinationAddresses  The addresses that the withdrawn cards will be sent to (this allows
    ///  anyone to "airdrop" cards to addresses that they do not own in a single transaction).
    function burnTokensAndWithdrawCards(uint256[] calldata _cardIds, address[] calldata _destinationAddresses) external nonReentrant {
        require(_cardIds.length == _destinationAddresses.length, 'you did not provide a destination address for each of the cards you wish to withdraw');
        require(_cardIds.length > 0, 'you must submit an array with at least one element');

        uint256 numTokensToBurn = _cardIds.length;
        require(balanceOf(msg.sender) >= numTokensToBurn.mul(cardInWei), 'you do not own enough tokens to withdraw this many ERC721 cards');
        _burn(msg.sender, numTokensToBurn.mul(cardInWei));

        for(uint i = 0; i < numTokensToBurn; i++){
            uint256 cardToWithdraw = _cardIds[i];
            if(cardToWithdraw == 0){
                cardToWithdraw = _popCard();
            } else {
                require(isCardInDeck(cardToWithdraw), 'this card is not in the deck');
                require(address(this) == cardCore.ownerOf(cardToWithdraw), 'the contract does not own this card');
                _removeFromDeck(cardToWithdraw);
            }
            cardCore.transferFrom(address(this), _destinationAddresses[i], cardToWithdraw);
            emit BurnTokenAndWithdrawCard(cardToWithdraw);
        }
    }

    /// @notice Adds a locked marblecard to the end of the array
    /// @param _cardId  The id of the marblecard that will be locked into the contract.
    function _pushCard(uint256 _cardId) internal {
        // push() returns the new array length, sub 1 to get the index
        uint256 index = depositedCardsArray.push(_cardId) - 1;
        DepositedCard memory _card = DepositedCard(true, index);
        cardsInIndex[_cardId] = _card;
    }

    /// @notice Removes an unlocked marblecard from the end of the array
    /// @return  The id of the marblecard that will be unlocked from the contract.
    function _popCard() internal returns(uint256) {
        require(depositedCardsArray.length > 0, 'there are no cards in the array');
        uint256 cardId = depositedCardsArray[depositedCardsArray.length - 1];
        _removeFromDeck(cardId);
        return cardId;
    }

    /// @notice The owner is not capable of changing the address of the MarbleCards Core
    ///  contract once the contract has been deployed.
    constructor() public {
        cardCore = CardCore(cardCoreAddress);
    }

    /// @dev We leave the fallback function payable in case the current State Rent proposals require
    ///  us to send funds to this contract to keep it alive on mainnet.
    function() external payable {}

    /// @dev If any eth is accidentally sent to this contract it can be withdrawn by the owner rather than letting
    ///   it get locked up forever. Don't send ETH to the contract, but if you do, the developer will consider it a tip.
    function extractAccidentalPayableEth() public onlyOwner returns (bool) {
        require(address(this).balance > 0);
        address(uint160(owner())).transfer(address(this).balance);
        return true;
    }

    /// @dev Gets the index of the card in the deck
    function _getCardIndex(uint256 _cardId) internal view returns (uint256) {
        require(isCardInDeck(_cardId));
        return cardsInIndex[_cardId].cardIndex;
    }

    /// @dev Will return true if the cardId is a card that is in the deck.
    function isCardInDeck(uint256 _cardId) public view returns (bool) {
        return cardsInIndex[_cardId].inContract;
    }

    /// @dev Remove a card by switching the place in the array
    function _removeFromDeck(uint256 _cardId) internal {
        // Get the index of the card passed above
        uint256 index = _getCardIndex(_cardId);
        // Get the last element of the existing array
        uint256 cardToMove = depositedCardsArray[depositedCardsArray.length - 1];
        // Move the card at the end of the array to the location
        //   of the card we want to void.
        depositedCardsArray[index] = cardToMove;
        // Move the card we are voiding to the end of the index
        cardsInIndex[cardToMove].cardIndex = index;
        // Trim the last card from the index
        delete cardsInIndex[_cardId];
        depositedCardsArray.length--;
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_cardIds","type":"uint256[]"}],"name":"depositCardsAndMintTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_cardId","type":"uint256"}],"name":"isCardInDeck","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cardCoreAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_cardIds","type":"uint256[]"},{"name":"_destinationAddresses","type":"address[]"}],"name":"burnTokensAndWithdrawCards","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"extractAccidentalPayableEth","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cardId","type":"uint256"}],"name":"DepositCardAndMintToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"cardId","type":"uint256"}],"name":"BurnTokenAndWithdrawCard","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

6080604052600780546001600160a01b031916731d963688fe2209a98db35c67a041524822cf04ff17905534801561003657600080fd5b50600380546001600160a01b0319163317908190556040516001600160a01b0391909116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600455600754600880546001600160a01b0319166001600160a01b0390921691909117905561203b806100b96000396000f3fe60806040526004361061015f5760003560e01c806370a08231116100c057806395d89b4111610074578063a9059cbb11610059578063a9059cbb146105d0578063dd62ed3e14610616578063f2fde38b1461065e5761015f565b806395d89b4114610575578063a457c2d71461058a5761015f565b80637b2f7217116100a55780637b2f7217146105365780638da5cb5b1461054b5780638f32d59b146105605761015f565b806370a08231146104e1578063715018a6146105215761015f565b80633950935111610117578063458bc1e1116100fc578063458bc1e1146103aa5780634e63e534146103d45780635fbc72a0146104125761015f565b806339509351146102e75780633d732a421461032d5761015f565b806318160ddd1161014857806318160ddd1461024557806323b872dd1461026c578063313ce567146102bc5761015f565b806306fdde0314610161578063095ea7b3146101eb575b005b34801561016d57600080fd5b5061017661069e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b0578181015183820152602001610198565b50505050905090810190601f1680156101dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101f757600080fd5b506102316004803603604081101561020e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106d7565b604080519115158252519081900360200190f35b34801561025157600080fd5b5061025a6106ee565b60408051918252519081900360200190f35b34801561027857600080fd5b506102316004803603606081101561028f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356106f5565b3480156102c857600080fd5b506102d1610759565b6040805160ff9092168252519081900360200190f35b3480156102f357600080fd5b506102316004803603604081101561030a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561075e565b34801561033957600080fd5b5061015f6004803603602081101561035057600080fd5b81019060208101813564010000000081111561036b57600080fd5b82018360208201111561037d57600080fd5b8035906020019184602083028401116401000000008311171561039f57600080fd5b5090925090506107a7565b3480156103b657600080fd5b50610231600480360360208110156103cd57600080fd5b5035610b66565b3480156103e057600080fd5b506103e9610b7b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561041e57600080fd5b5061015f6004803603604081101561043557600080fd5b81019060208101813564010000000081111561045057600080fd5b82018360208201111561046257600080fd5b8035906020019184602083028401116401000000008311171561048457600080fd5b9193909290916020810190356401000000008111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460208302840111640100000000831117156104d657600080fd5b509092509050610b97565b3480156104ed57600080fd5b5061025a6004803603602081101561050457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ffd565b34801561052d57600080fd5b5061015f611025565b34801561054257600080fd5b50610231611107565b34801561055757600080fd5b506103e96111dc565b34801561056c57600080fd5b506102316111f8565b34801561058157600080fd5b50610176611216565b34801561059657600080fd5b50610231600480360360408110156105ad57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561124f565b3480156105dc57600080fd5b50610231600480360360408110156105f357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611298565b34801561062257600080fd5b5061025a6004803603604081101561063957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166112a5565b34801561066a57600080fd5b5061015f6004803603602081101561068157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166112dd565b6040518060400160405280601381526020017f57726170706564204d6172626c6543617264730000000000000000000000000081525081565b60006106e433848461135c565b5060015b92915050565b6002545b90565b60006107028484846114a3565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203380855292529091205461074f91869161074a908663ffffffff61165a16565b61135c565b5060019392505050565b601281565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916106e491859061074a908663ffffffff6116d116565b600480546001019081905581610808576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611ebd6032913960400191505060405180910390fd5b60005b82811015610b3157600084848381811061082157fe5b600854604080517f6352211e0000000000000000000000000000000000000000000000000000000081526020938402959095013560048601819052905190955073ffffffffffffffffffffffffffffffffffffffff90911693636352211e93506024808201939291829003018186803b15801561089d57600080fd5b505afa1580156108b1573d6000803e3d6000fd5b505050506040513d60208110156108c757600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461094c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f796f7520646f206e6f74206f776e207468697320636172640000000000000000604482015290519081900360640190fd5b600854604080517f081812fc000000000000000000000000000000000000000000000000000000008152600481018490529051309273ffffffffffffffffffffffffffffffffffffffff169163081812fc916024808301926020929190829003018186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252606a815260200180611f10606a913960800191505060405180910390fd5b600854604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101849052905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd9160648082019260009290919082900301818387803b158015610ad457600080fd5b505af1158015610ae8573d6000803e3d6000fd5b50505050610af58161174c565b6040805182815290517f7f8043293ead2c236a951ae4011be0edcdcd864d016587dadb6ac7cbbfb38c109181900360200190a15060010161080b565b50610b5333610b4e84670de0b6b3a764000063ffffffff6117e116565b611854565b6004548114610b6157600080fd5b505050565b60009081526006602052604090205460ff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b6004805460010190819055838214610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526054815260200180611e696054913960600191505060405180910390fd5b83610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611ebd6032913960400191505060405180910390fd5b83610c6981670de0b6b3a764000063ffffffff6117e116565b610c7233610ffd565b1015610cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180611e2a603f913960400191505060405180910390fd5b610cea33610ce583670de0b6b3a764000063ffffffff6117e116565b611985565b60005b81811015610fe6576000878783818110610d0357fe5b9050602002013590508060001415610d2457610d1d611a9f565b9050610eac565b610d2d81610b66565b610d9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f746869732063617264206973206e6f7420696e20746865206465636b00000000604482015290519081900360640190fd5b600854604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff90921691636352211e91602480820192602092909190829003018186803b158015610e0a57600080fd5b505afa158015610e1e573d6000803e3d6000fd5b505050506040513d6020811015610e3457600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163014610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611fe46023913960400191505060405180910390fd5b610eac81611b5f565b60085473ffffffffffffffffffffffffffffffffffffffff166323b872dd30888886818110610ed757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b50506040805184815290517ffc963017b132eb136cb8bad178fe91f3ac2ab68ec47672613607a5209edb87a09350908190036020019150a150600101610ced565b50506004548114610ff657600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61102d6111f8565b61109857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60035460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006111116111f8565b61117c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b303161118757600080fd5b61118f6111dc565b60405173ffffffffffffffffffffffffffffffffffffffff9190911690303180156108fc02916000818181858888f193505050501580156111d4573d6000803e3d6000fd5b506001905090565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b60035473ffffffffffffffffffffffffffffffffffffffff16331490565b6040518060400160405280600381526020017f574d43000000000000000000000000000000000000000000000000000000000081525081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916106e491859061074a908663ffffffff61165a16565b60006106e43384846114a3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6112e56111f8565b61135057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61135981611c46565b50565b73ffffffffffffffffffffffffffffffffffffffff83166113c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611fc06024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611434576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611e086022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661150f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611f9b6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611dbf6023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020546115b1908263ffffffff61165a16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822093909355908416815220546115f3908263ffffffff6116d116565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156116cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561174557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0810182905561178a611d6a565b506040805180820182526001808252602080830194855260009586526006905291909320925183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169015151783559051910155565b6000826117f0575060006106e8565b828202828482816117fd57fe5b0414611745576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611eef6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118d657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546118e9908263ffffffff6116d116565b60025573ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054611922908263ffffffff6116d116565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff82166119f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611f7a6021913960400191505060405180910390fd5b600254611a04908263ffffffff61165a16565b60025573ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054611a3d908263ffffffff61165a16565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600554600090611b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f746865726520617265206e6f20636172647320696e2074686520617272617900604482015290519081900360640190fd5b60058054600091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110611b4457fe5b90600052602060002001549050611b5a81611b5f565b905090565b6000611b6a82611d40565b600580549192506000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110611ba057fe5b906000526020600020015490508060058381548110611bbb57fe5b600091825260208083209091019290925582815260069091526040808220600190810185905585835290822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016815501556005805490611c40907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301611d81565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611de26026913960400191505060405180910390fd5b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611d4b82610b66565b611d5457600080fd5b5060009081526006602052604090206001015490565b604080518082019091526000808252602082015290565b815481835581811115610b6157600083815260209020610b619181019083016106f291905b80821115611dba5760008155600101611da6565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373796f7520646f206e6f74206f776e20656e6f75676820746f6b656e7320746f2077697468647261772074686973206d616e7920455243373231206361726473796f7520646964206e6f742070726f7669646520612064657374696e6174696f6e206164647265737320666f722065616368206f662074686520636172647320796f75207769736820746f207769746864726177796f75206d757374207375626d697420616e2061727261792077697468206174206c65617374206f6e6520656c656d656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77796f75206d75737420617070726f76652829207468697320636f6e747261637420746f2067697665206974207065726d697373696f6e20746f20776974686472617720746869732063617264206265666f726520796f752063616e206465706f7369742061206361726445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737374686520636f6e747261637420646f6573206e6f74206f776e20746869732063617264a265627a7a7230582057c221e25583a0788550690cef5d1fec993b51ca5241c39dfe608a4087ed0d8b64736f6c634300050a0032

Deployed Bytecode

0x60806040526004361061015f5760003560e01c806370a08231116100c057806395d89b4111610074578063a9059cbb11610059578063a9059cbb146105d0578063dd62ed3e14610616578063f2fde38b1461065e5761015f565b806395d89b4114610575578063a457c2d71461058a5761015f565b80637b2f7217116100a55780637b2f7217146105365780638da5cb5b1461054b5780638f32d59b146105605761015f565b806370a08231146104e1578063715018a6146105215761015f565b80633950935111610117578063458bc1e1116100fc578063458bc1e1146103aa5780634e63e534146103d45780635fbc72a0146104125761015f565b806339509351146102e75780633d732a421461032d5761015f565b806318160ddd1161014857806318160ddd1461024557806323b872dd1461026c578063313ce567146102bc5761015f565b806306fdde0314610161578063095ea7b3146101eb575b005b34801561016d57600080fd5b5061017661069e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101b0578181015183820152602001610198565b50505050905090810190601f1680156101dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101f757600080fd5b506102316004803603604081101561020e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106d7565b604080519115158252519081900360200190f35b34801561025157600080fd5b5061025a6106ee565b60408051918252519081900360200190f35b34801561027857600080fd5b506102316004803603606081101561028f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001356106f5565b3480156102c857600080fd5b506102d1610759565b6040805160ff9092168252519081900360200190f35b3480156102f357600080fd5b506102316004803603604081101561030a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561075e565b34801561033957600080fd5b5061015f6004803603602081101561035057600080fd5b81019060208101813564010000000081111561036b57600080fd5b82018360208201111561037d57600080fd5b8035906020019184602083028401116401000000008311171561039f57600080fd5b5090925090506107a7565b3480156103b657600080fd5b50610231600480360360208110156103cd57600080fd5b5035610b66565b3480156103e057600080fd5b506103e9610b7b565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561041e57600080fd5b5061015f6004803603604081101561043557600080fd5b81019060208101813564010000000081111561045057600080fd5b82018360208201111561046257600080fd5b8035906020019184602083028401116401000000008311171561048457600080fd5b9193909290916020810190356401000000008111156104a257600080fd5b8201836020820111156104b457600080fd5b803590602001918460208302840111640100000000831117156104d657600080fd5b509092509050610b97565b3480156104ed57600080fd5b5061025a6004803603602081101561050457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ffd565b34801561052d57600080fd5b5061015f611025565b34801561054257600080fd5b50610231611107565b34801561055757600080fd5b506103e96111dc565b34801561056c57600080fd5b506102316111f8565b34801561058157600080fd5b50610176611216565b34801561059657600080fd5b50610231600480360360408110156105ad57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561124f565b3480156105dc57600080fd5b50610231600480360360408110156105f357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611298565b34801561062257600080fd5b5061025a6004803603604081101561063957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166112a5565b34801561066a57600080fd5b5061015f6004803603602081101561068157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166112dd565b6040518060400160405280601381526020017f57726170706564204d6172626c6543617264730000000000000000000000000081525081565b60006106e433848461135c565b5060015b92915050565b6002545b90565b60006107028484846114a3565b73ffffffffffffffffffffffffffffffffffffffff841660009081526001602090815260408083203380855292529091205461074f91869161074a908663ffffffff61165a16565b61135c565b5060019392505050565b601281565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916106e491859061074a908663ffffffff6116d116565b600480546001019081905581610808576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611ebd6032913960400191505060405180910390fd5b60005b82811015610b3157600084848381811061082157fe5b600854604080517f6352211e0000000000000000000000000000000000000000000000000000000081526020938402959095013560048601819052905190955073ffffffffffffffffffffffffffffffffffffffff90911693636352211e93506024808201939291829003018186803b15801561089d57600080fd5b505afa1580156108b1573d6000803e3d6000fd5b505050506040513d60208110156108c757600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461094c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f796f7520646f206e6f74206f776e207468697320636172640000000000000000604482015290519081900360640190fd5b600854604080517f081812fc000000000000000000000000000000000000000000000000000000008152600481018490529051309273ffffffffffffffffffffffffffffffffffffffff169163081812fc916024808301926020929190829003018186803b1580156109bd57600080fd5b505afa1580156109d1573d6000803e3d6000fd5b505050506040513d60208110156109e757600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1614610a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252606a815260200180611f10606a913960800191505060405180910390fd5b600854604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101849052905173ffffffffffffffffffffffffffffffffffffffff909216916323b872dd9160648082019260009290919082900301818387803b158015610ad457600080fd5b505af1158015610ae8573d6000803e3d6000fd5b50505050610af58161174c565b6040805182815290517f7f8043293ead2c236a951ae4011be0edcdcd864d016587dadb6ac7cbbfb38c109181900360200190a15060010161080b565b50610b5333610b4e84670de0b6b3a764000063ffffffff6117e116565b611854565b6004548114610b6157600080fd5b505050565b60009081526006602052604090205460ff1690565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b6004805460010190819055838214610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526054815260200180611e696054913960600191505060405180910390fd5b83610c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180611ebd6032913960400191505060405180910390fd5b83610c6981670de0b6b3a764000063ffffffff6117e116565b610c7233610ffd565b1015610cc9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f815260200180611e2a603f913960400191505060405180910390fd5b610cea33610ce583670de0b6b3a764000063ffffffff6117e116565b611985565b60005b81811015610fe6576000878783818110610d0357fe5b9050602002013590508060001415610d2457610d1d611a9f565b9050610eac565b610d2d81610b66565b610d9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f746869732063617264206973206e6f7420696e20746865206465636b00000000604482015290519081900360640190fd5b600854604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101849052905173ffffffffffffffffffffffffffffffffffffffff90921691636352211e91602480820192602092909190829003018186803b158015610e0a57600080fd5b505afa158015610e1e573d6000803e3d6000fd5b505050506040513d6020811015610e3457600080fd5b505173ffffffffffffffffffffffffffffffffffffffff163014610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611fe46023913960400191505060405180910390fd5b610eac81611b5f565b60085473ffffffffffffffffffffffffffffffffffffffff166323b872dd30888886818110610ed757fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015610f9157600080fd5b505af1158015610fa5573d6000803e3d6000fd5b50506040805184815290517ffc963017b132eb136cb8bad178fe91f3ac2ab68ec47672613607a5209edb87a09350908190036020019150a150600101610ced565b50506004548114610ff657600080fd5b5050505050565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61102d6111f8565b61109857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60035460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006111116111f8565b61117c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b303161118757600080fd5b61118f6111dc565b60405173ffffffffffffffffffffffffffffffffffffffff9190911690303180156108fc02916000818181858888f193505050501580156111d4573d6000803e3d6000fd5b506001905090565b60035473ffffffffffffffffffffffffffffffffffffffff1690565b60035473ffffffffffffffffffffffffffffffffffffffff16331490565b6040518060400160405280600381526020017f574d43000000000000000000000000000000000000000000000000000000000081525081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916106e491859061074a908663ffffffff61165a16565b60006106e43384846114a3565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6112e56111f8565b61135057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61135981611c46565b50565b73ffffffffffffffffffffffffffffffffffffffff83166113c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180611fc06024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216611434576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180611e086022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff831661150f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180611f9b6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661157b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180611dbf6023913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020546115b1908263ffffffff61165a16565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526020819052604080822093909355908416815220546115f3908263ffffffff6116d116565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156116cb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561174557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600580546001810182556000919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0810182905561178a611d6a565b506040805180820182526001808252602080830194855260009586526006905291909320925183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169015151783559051910155565b6000826117f0575060006106e8565b828202828482816117fd57fe5b0414611745576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611eef6021913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166118d657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546118e9908263ffffffff6116d116565b60025573ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054611922908263ffffffff6116d116565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff82166119f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180611f7a6021913960400191505060405180910390fd5b600254611a04908263ffffffff61165a16565b60025573ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054611a3d908263ffffffff61165a16565b73ffffffffffffffffffffffffffffffffffffffff8316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b600554600090611b1057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f746865726520617265206e6f20636172647320696e2074686520617272617900604482015290519081900360640190fd5b60058054600091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110611b4457fe5b90600052602060002001549050611b5a81611b5f565b905090565b6000611b6a82611d40565b600580549192506000917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110611ba057fe5b906000526020600020015490508060058381548110611bbb57fe5b600091825260208083209091019290925582815260069091526040808220600190810185905585835290822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016815501556005805490611c40907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301611d81565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8116611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180611de26026913960400191505060405180910390fd5b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611d4b82610b66565b611d5457600080fd5b5060009081526006602052604090206001015490565b604080518082019091526000808252602082015290565b815481835581811115610b6157600083815260209020610b619181019083016106f291905b80821115611dba5760008155600101611da6565b509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373796f7520646f206e6f74206f776e20656e6f75676820746f6b656e7320746f2077697468647261772074686973206d616e7920455243373231206361726473796f7520646964206e6f742070726f7669646520612064657374696e6174696f6e206164647265737320666f722065616368206f662074686520636172647320796f75207769736820746f207769746864726177796f75206d757374207375626d697420616e2061727261792077697468206174206c65617374206f6e6520656c656d656e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77796f75206d75737420617070726f76652829207468697320636f6e747261637420746f2067697665206974207065726d697373696f6e20746f20776974686472617720746869732063617264206265666f726520796f752063616e206465706f7369742061206361726445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737374686520636f6e747261637420646f6573206e6f74206f776e20746869732063617264a265627a7a7230582057c221e25583a0788550690cef5d1fec993b51ca5241c39dfe608a4087ed0d8b64736f6c634300050a0032

Deployed Bytecode Sourcemap

19490:9245:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21644:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21644:51:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;21644:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9338:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9338:148:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9338:148:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8361:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8361:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;9957:256;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9957:256:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9957:256:0;;;;;;;;;;;;;;;;;;:::i;21602:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21602:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10622:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10622:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10622:206:0;;;;;;;;;:::i;23082:820::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23082:820:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23082:820:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;23082:820:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23082:820:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;23082:820:0;;-1:-1:-1;23082:820:0;-1:-1:-1;23082:820:0;:::i;27836:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27836:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27836:124:0;;:::i;22188:75::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22188:75:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24433:1285;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24433:1285:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24433:1285:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;24433:1285:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24433:1285:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;24433:1285:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;24433:1285:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;24433:1285:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;24433:1285:0;;-1:-1:-1;24433:1285:0;-1:-1:-1;24433:1285:0;:::i;8515:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8515:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8515:110:0;;;;:::i;16477:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16477:140:0;;;:::i;27307:214::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27307:214:0;;;:::i;15666:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15666:79:0;;;:::i;16032:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16032:92:0;;;:::i;21702:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21702:37:0;;;:::i;11331:216::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11331:216:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11331:216:0;;;;;;;;;:::i;8838:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8838:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8838:156:0;;;;;;;;;:::i;9057:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9057:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9057:134:0;;;;;;;;;;;:::i;16772:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16772:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16772:109:0;;;;:::i;21644:51::-;;;;;;;;;;;;;;;;;;;:::o;9338:148::-;9403:4;9420:36;9429:10;9441:7;9450:5;9420:8;:36::i;:::-;-1:-1:-1;9474:4:0;9338:148;;;;;:::o;8361:91::-;8432:12;;8361:91;;:::o;9957:256::-;10046:4;10063:36;10073:6;10081:9;10092:6;10063:9;:36::i;:::-;10139:19;;;;;;;:11;:19;;;;;;;;10127:10;10139:31;;;;;;;;;10110:73;;10119:6;;10139:43;;10175:6;10139:43;:35;:43;:::i;:::-;10110:8;:73::i;:::-;-1:-1:-1;10201:4:0;9957:256;;;;;:::o;21602:35::-;21635:2;21602:35;:::o;10622:206::-;10728:10;10702:4;10749:23;;;:11;:23;;;;;;;;;:32;;;;;;;;;;10702:4;;10719:79;;10740:7;;10749:48;;10786:10;10749:48;:36;:48;:::i;23082:820::-;18216:13;:18;;18233:1;18216:18;;;;;23187:19;23179:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23276:6;23272:561;23288:19;;;23272:561;;;23328:21;23352:8;;23361:1;23352:11;;;;;;;23400:8;;:31;;;;;;23352:11;;;;;;;;;23400:31;;;;;;;;23352:11;;-1:-1:-1;23400:8:0;;;;;:16;;-1:-1:-1;23400:31:0;;;;;23352:11;23400:31;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;23400:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23400:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23400:31:0;23386:45;;:10;:45;23378:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23483:8;;:35;;;;;;;;;;;;;;23530:4;;23483:52;:8;;:20;;:35;;;;;;;;;;;;;;:8;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;23483:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23483:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23483:35:0;:52;;;23475:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23661:8;;:63;;;;;;23683:10;23661:63;;;;23703:4;23661:63;;;;;;;;;;;;:8;;;;;:21;;:63;;;;;:8;;:63;;;;;;;;:8;;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;23661:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23661:63:0;;;;23739:24;23749:13;23739:9;:24::i;:::-;23783:38;;;;;;;;;;;;;;;;;-1:-1:-1;23309:3:0;;23272:561;;;-1:-1:-1;23843:51:0;23849:10;23861:32;23862:8;21784:21;23861:32;:21;:32;:::i;:::-;23843:5;:51::i;:::-;18328:13;;18312:12;:29;18304:38;;;;;;23082:820;;;:::o;27836:124::-;27896:4;27920:21;;;:12;:21;;;;;:32;;;;27836:124::o;22188:75::-;;;;;;:::o;24433:1285::-;18216:13;:18;;18233:1;18216:18;;;;;24581:47;;;24573:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24736:19;24728:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24849:8;24908:30;24849:8;21784:21;24908:30;:19;:30;:::i;:::-;24883:21;24893:10;24883:9;:21::i;:::-;:55;;24875:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25017:49;25023:10;25035:30;:15;21784:21;25035:30;:19;:30;:::i;:::-;25017:5;:49::i;:::-;25083:6;25079:632;25099:15;25095:1;:19;25079:632;;;25135:22;25160:8;;25169:1;25160:11;;;;;;;;;;;;;25135:36;;25189:14;25207:1;25189:19;25186:361;;;25245:10;:8;:10::i;:::-;25228:27;;25186:361;;;25304:28;25317:14;25304:12;:28::i;:::-;25296:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25409:8;;:32;;;;;;;;;;;;;;:8;;;;;:16;;:32;;;;;;;;;;;;;;;:8;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;25409:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25409:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25409:32:0;25392:49;;25400:4;25392:49;25384:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25500:31;25516:14;25500:15;:31::i;:::-;25561:8;;;;:21;25591:4;25598:21;;25620:1;25598:24;;;;;;;;;;;;;;;25624:14;25561:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25561:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;25659:40:0;;;;;;;;;;-1:-1:-1;25659:40:0;;;;;;;-1:-1:-1;25659:40:0;-1:-1:-1;25116:3:0;;25079:632;;;;18292:1;18328:13;;18312:12;:29;18304:38;;;;;;24433:1285;;;;;:::o;8515:110::-;8599:18;;8572:7;8599:18;;;;;;;;;;;;8515:110::o;16477:140::-;15878:9;:7;:9::i;:::-;15870:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16560:6;;16539:40;;16576:1;;16539:40;16560:6;;16539:40;;16576:1;;16539:40;16590:6;:19;;;;;;16477:140::o;27307:214::-;27372:4;15878:9;:7;:9::i;:::-;15870:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27405:4;27397:21;27389:34;;;;;;27450:7;:5;:7::i;:::-;27434:57;;:34;;;;;;27477:4;27469:21;27434:57;;;;;;;;;27469:21;27434:34;:57;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27434:57:0;27509:4;27502:11;;27307:214;:::o;15666:79::-;15731:6;;;;15666:79;:::o;16032:92::-;16110:6;;;;16096:10;:20;;16032:92::o;21702:37::-;;;;;;;;;;;;;;;;;;;:::o;11331:216::-;11442:10;11416:4;11463:23;;;:11;:23;;;;;;;;;:32;;;;;;;;;;11416:4;;11433:84;;11454:7;;11463:53;;11500:15;11463:53;:36;:53;:::i;8838:156::-;8907:4;8924:40;8934:10;8946:9;8957:6;8924:9;:40::i;9057:134::-;9156:18;;;;9129:7;9156:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9057:134::o;16772:109::-;15878:9;:7;:9::i;:::-;15870:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16845:28;16864:8;16845:18;:28::i;:::-;16772:109;:::o;14133:335::-;14226:19;;;14218:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14305:21;;;14297:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14378:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;14429:31;;;;;;;;;;;;;;;;;14133:335;;;:::o;12037:429::-;12135:20;;;12127:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12216:23;;;12208:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12312:17;;;:9;:17;;;;;;;;;;;:29;;12334:6;12312:29;:21;:29;:::i;:::-;12292:17;;;;:9;:17;;;;;;;;;;;:49;;;;12375:20;;;;;;;:32;;12400:6;12375:32;:24;:32;:::i;:::-;12352:20;;;;:9;:20;;;;;;;;;;;;:55;;;;12423:35;;;;;;;12352:20;;12423:35;;;;;;;;;;;;;12037:429;;;:::o;4571:184::-;4629:7;4662:1;4657;:6;;4649:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4721:5:0;;;4571:184::o;4115:181::-;4173:7;4205:5;;;4229:6;;;;4221:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4287:1;4115:181;-1:-1:-1;;;4115:181:0:o;25881:295::-;26025:19;27:10:-1;;26061:1:0;23:18:-1;;45:23;;26009:13:0;26025:33;;;;;;;;;;26073:26;;:::i;:::-;-1:-1:-1;26102:26:0;;;;;;;;26116:4;26102:26;;;;;;;;;;-1:-1:-1;26139:21:0;;;:12;:21;;;;;;:29;;;;;;;;;;;;;;;;;25881:295::o;5006:470::-;5064:7;5308:6;5304:47;;-1:-1:-1;5338:1:0;5331:8;;5304:47;5375:5;;;5379:1;5375;:5;:1;5399:5;;;;;:10;5391:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12747:308;12823:21;;;12815:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12908:12;;:24;;12925:6;12908:24;:16;:24;:::i;:::-;12893:12;:39;12964:18;;;:9;:18;;;;;;;;;;;:30;;12987:6;12964:30;:22;:30;:::i;:::-;12943:18;;;:9;:18;;;;;;;;;;;:51;;;;13010:37;;;;;;;12943:18;;:9;;13010:37;;;;;;;;;;12747:308;;:::o;13387:306::-;13462:21;;;13454:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13549:12;;:23;;13566:5;13549:23;:16;:23;:::i;:::-;13534:12;:38;13604:18;;;:9;:18;;;;;;;;;;;:29;;13627:5;13604:29;:22;:29;:::i;:::-;13583:18;;;:9;:18;;;;;;;;;;;:50;;;;13649:36;;;;;;;13583:9;;13649:36;;;;;;;;;;;13387:306;;:::o;26342:276::-;26407:19;:26;26379:7;;26399:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26501:19;26521:26;;26484:14;;26501:19;26521:30;;;;26501:51;;;;;;;;;;;;;;26484:68;;26563:23;26579:6;26563:15;:23::i;:::-;26604:6;-1:-1:-1;26342:276:0;:::o;28032:698::-;28145:13;28161:22;28175:7;28161:13;:22::i;:::-;28270:19;28290:26;;28145:38;;-1:-1:-1;28249:18:0;;28290:30;;;;28270:51;;;;;;;;;;;;;;28249:72;;28470:10;28441:19;28461:5;28441:26;;;;;;;;;;;;;;;;;;;:39;;;;28556:24;;;:12;:24;;;;;;;:34;;;;:42;;;28662:21;;;;;;28655:28;;;;;;;;28694:19;:28;;;;;-1:-1:-1;28694:28:0;;;:::i;:::-;;28032:698;;;:::o;16987:229::-;17061:22;;;17053:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17163:6;;17142:38;;;;;;;17163:6;;17142:38;;17163:6;;17142:38;17191:6;:17;;;;;;;;;;;;;;;16987:229::o;27582:170::-;27645:7;27673:21;27686:7;27673:12;:21::i;:::-;27665:30;;;;;;-1:-1:-1;27713:21:0;;;;:12;:21;;;;;:31;;;;27582:170::o;19490:9245::-;;;;;;;;;;-1:-1:-1;19490:9245:0;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://57c221e25583a0788550690cef5d1fec993b51ca5241c39dfe608a4087ed0d8b

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.