GLMR Price: $0.017781 (-3.67%)

Contract

0x9Ff0cF19F66ab00774DE20b311825b7F65f23972

Overview

GLMR Balance

Moonbeam Chain LogoMoonbeam Chain LogoMoonbeam Chain Logo9.999999999999999993 GLMR

GLMR Value

$0.18 (@ $0.02/GLMR)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Recover GAS44216492023-09-12 22:11:36872 days ago1694556696IN
0x9Ff0cF19...F65f23972
0 GLMR0.00948324126.51076643
Set Trading44215642023-09-12 21:54:24872 days ago1694555664IN
0x9Ff0cF19...F65f23972
0 GLMR0.0101537136.76125
Cancel Trade44215572023-09-12 21:53:00872 days ago1694555580IN
0x9Ff0cF19...F65f23972
0 GLMR0.0111549135.73417532
Cancel Trade44215562023-09-12 21:52:48872 days ago1694555568IN
0x9Ff0cF19...F65f23972
0 GLMR0.01078652135.73417532
Cancel Trade44215542023-09-12 21:52:24872 days ago1694555544IN
0x9Ff0cF19...F65f23972
0 GLMR0.0108495135.73417532
Cancel Trade44215522023-09-12 21:52:00872 days ago1694555520IN
0x9Ff0cF19...F65f23972
0 GLMR0.01087604136.06616012
Cancel Trade44215512023-09-12 21:51:48872 days ago1694555508IN
0x9Ff0cF19...F65f23972
0 GLMR0.0102715125
Open Trade44213762023-09-12 21:16:36872 days ago1694553396IN
0x9Ff0cF19...F65f23972
0 GLMR0.02704092125.28225593
Accept Trade44213592023-09-12 21:13:06872 days ago1694553186IN
0x9Ff0cF19...F65f23972
0 GLMR0.02555021125.01327815
Open Trade44213542023-09-12 21:12:06872 days ago1694553126IN
0x9Ff0cF19...F65f23972
1.1 GLMR0.03081775125.01320979
Cancel Trade44213542023-09-12 21:12:06872 days ago1694553126IN
0x9Ff0cF19...F65f23972
0 GLMR0.00993454125.01320979
Cancel Trade44213452023-09-12 21:10:18872 days ago1694553018IN
0x9Ff0cF19...F65f23972
0 GLMR0.00994207125.10795257
Accept Trade44213162023-09-12 21:04:12872 days ago1694552652IN
0x9Ff0cF19...F65f23972
10 GLMR0.0279782137.11849744
Open Trade44212592023-09-12 20:52:42872 days ago1694551962IN
0x9Ff0cF19...F65f23972
1 GLMR0.03085599125.16834054
Open Trade44212502023-09-12 20:50:48872 days ago1694551848IN
0x9Ff0cF19...F65f23972
1 GLMR0.03081999125.02230065
Accept Trade44206102023-09-12 18:41:54872 days ago1694544114IN
0x9Ff0cF19...F65f23972
0 GLMR0.02714467132.81473379
Open Trade44206042023-09-12 18:40:42872 days ago1694544042IN
0x9Ff0cF19...F65f23972
0 GLMR0.02856306132.33443613
Open Trade44206022023-09-12 18:40:18872 days ago1694544018IN
0x9Ff0cF19...F65f23972
0 GLMR0.0285959132.48657627
Open Trade44178202023-09-12 9:16:18872 days ago1694510178IN
0x9Ff0cF19...F65f23972
0 GLMR0.02633187125
Open Trade44178122023-09-12 9:14:42872 days ago1694510082IN
0x9Ff0cF19...F65f23972
0 GLMR0.02633337125
Open Trade44178052023-09-12 9:13:18872 days ago1694509998IN
0x9Ff0cF19...F65f23972
0 GLMR0.02633411125.0106133
Open Trade44177982023-09-12 9:11:54872 days ago1694509914IN
0x9Ff0cF19...F65f23972
0 GLMR0.02846937125
Open Trade44167172023-09-12 5:32:48873 days ago1694496768IN
0x9Ff0cF19...F65f23972
50 GLMR0.02911935137.15099786
Open Trade44162752023-09-12 4:03:42873 days ago1694491422IN
0x9Ff0cF19...F65f23972
0 GLMR0.02952876136.80099626
Open Trade44162722023-09-12 4:03:06873 days ago1694491386IN
0x9Ff0cF19...F65f23972
0 GLMR0.02961987137.21546654
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
44216492023-09-12 22:11:36872 days ago1694556696
0x9Ff0cF19...F65f23972
143.5 GLMR
44215572023-09-12 21:53:00872 days ago1694555580
0x9Ff0cF19...F65f23972
20 GLMR
44215562023-09-12 21:52:48872 days ago1694555568
0x9Ff0cF19...F65f23972
10 GLMR
44215542023-09-12 21:52:24872 days ago1694555544
0x9Ff0cF19...F65f23972
1 GLMR
44215522023-09-12 21:52:00872 days ago1694555520
0x9Ff0cF19...F65f23972
1 GLMR
44215512023-09-12 21:51:48872 days ago1694555508
0x9Ff0cF19...F65f23972
6 wei
44213592023-09-12 21:13:06872 days ago1694553186
0x9Ff0cF19...F65f23972
0.033 GLMR
44213592023-09-12 21:13:06872 days ago1694553186
0x9Ff0cF19...F65f23972
0.055 GLMR
44213592023-09-12 21:13:06872 days ago1694553186
0x9Ff0cF19...F65f23972
1.012 GLMR
44213542023-09-12 21:12:06872 days ago1694553126
0x9Ff0cF19...F65f23972
1 GLMR
44213452023-09-12 21:10:18872 days ago1694553018
0x9Ff0cF19...F65f23972
1 GLMR
44213162023-09-12 21:04:12872 days ago1694552652
0x9Ff0cF19...F65f23972
0.3 GLMR
44213162023-09-12 21:04:12872 days ago1694552652
0x9Ff0cF19...F65f23972
0.5 GLMR
44213162023-09-12 21:04:12872 days ago1694552652
0x9Ff0cF19...F65f23972
9.2 GLMR
44206102023-09-12 18:41:54872 days ago1694544114
0x9Ff0cF19...F65f23972
1.5 GLMR
44206102023-09-12 18:41:54872 days ago1694544114
0x9Ff0cF19...F65f23972
2.5 GLMR
44206102023-09-12 18:41:54872 days ago1694544114
0x9Ff0cF19...F65f23972
46 GLMR
44137402023-09-11 19:31:06873 days ago1694460666
0x9Ff0cF19...F65f23972
0.525 GLMR
44137402023-09-11 19:31:06873 days ago1694460666
0x9Ff0cF19...F65f23972
0.875 GLMR
44137402023-09-11 19:31:06873 days ago1694460666
0x9Ff0cF19...F65f23972
16.1 GLMR
44133592023-09-11 18:14:30873 days ago1694456070
0x9Ff0cF19...F65f23972
50 GLMR
44122452023-09-11 14:29:24873 days ago1694442564
0x9Ff0cF19...F65f23972
2.025 GLMR
44122452023-09-11 14:29:24873 days ago1694442564
0x9Ff0cF19...F65f23972
3.375 GLMR
44122452023-09-11 14:29:24873 days ago1694442564
0x9Ff0cF19...F65f23972
62.1 GLMR
44122412023-09-11 14:28:36873 days ago1694442516
0x9Ff0cF19...F65f23972
0.225 GLMR
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FungibleBeanieMarketV1

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 11 : FungibleBeanieMarketV1.sol
//Custom NFT Marketplace Contract. From your favorite beans around - MoonBeans!

pragma solidity ^0.8.9;
// SPDX-License-Identifier: MIT

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "./BeanUtils.sol";

import "./interface/IWETH.sol";
import "./interface/IBeanFeeProcessor.sol";

// General
error BEAN_NotOwnerOrAdmin();
error BEAN_TradingPaused();
error BEAN_CollectionNotEnabled();

// Trade Creation
error BEAN_NoEscrowedSell();
error BEAN_ZeroPrice();
error BEAN_BuyerAccountUnderfunded();
error BEAN_EscrowCurrencyUnderfunded();
error BEAN_SellAssetBalanceLow();
error BEAN_ContractNotApproved();
error BEAN_PaymentTokenNotApproved();

// Trade Fulfillment
error BEAN_OrderExpired();
error BEAN_OrderDoesNotExist();
error BEAN_NotAuthorized();
error BEAN_TradeNotPartialFill();
error BEAN_NotEnoughTokensToFulfillBuy();
error BEAN_NotEnoughInEscrow();
error BEAN_NotEnoughSellerAllowance();
error BEAN_NotEnoughMakerFunds();
error BEAN_AmountOverQuantity();
error BEAN_NotEnoughTokensToFulfill();
error BEAN_SellFulfillUnderfunded();
error BEAN_BuyOrderWithValue();
error BEAN_TransferFailed();

// Escrow
error BEAN_EscrowOverWithdraw();
error BEAN_WithdrawNotEnabled();

// Util
error BEAN_IntegerOverFlow();

contract FungibleBeanieMarketV1 is ReentrancyGuard, Ownable {
    using BeanUtils for bytes32[];

    event TradeOpened( bytes32 indexed tradeId, address indexed token, uint256 indexed tokenId, uint256 quantity, uint256 price, address maker, uint256 expiry, uint256 timestamp, TradeFlags tradeFlags);
    event TradeAccepted(bytes32 indexed tradeId, address indexed token, uint256 indexed tokenId, uint256 quantity, uint256 price, address oldOwner, address newOwner, TradeType tradeType, uint256 expiry, uint256 timestamp);
    event TradeCancelled( bytes32 indexed tradeId, address indexed token,  uint256 indexed tokenId, uint256 quantity, uint256 price, address maker, uint256 expiry, uint256 timestamp, TradeFlags tradeFlags);
    event EscrowReturned(address indexed user, uint256 indexed price);
    event CollectionModified(address indexed token, bool indexed enabled, address indexed owner, uint256 collectionOwnerFee, uint256 timestamp);

    uint256 constant MAX_INT = ~uint256(0);
    uint128 constant SMOL_MAX_INT = ~uint128(0);
    uint128 constant SMOLLER_MAX_INT = ~uint64(0);

    // Fees are out of 10000, to allow for 0.1% stepped fees.
    uint256 public defaultCollectionOwnerFee; //0%
    uint256 public totalEscrowedAmount;
    uint256 public nonce = 1;

    IWETH public TOKEN; //WETH
    IBeanFeeProcessor public BeanFeeProcessor;

    //
    enum TradeType { BUY, SELL }

    struct TradeFlags {
        TradeType tradeType;
        bool allowPartialFills;
        bool isEscrowed;
    }

    struct Trade {
        uint256 tokenId;
        uint256 quantity;
        uint128 price;
        uint64 expiry;
        uint64 posInUserRegister;
        address ca;
        address maker;
        TradeFlags tradeFlags;
    }

    // Admin flags
    bool public tradingPaused = false;
    bool public feesOn = true;
    bool public collectionOwnersCanSetRoyalties = true;
    bool public usersCanWithdrawEscrow = false; // admin controlled manual escape hatch. users can always withdraw by cancelling offers.

    // Collection / Order / Escrow / Admin data storage 
    mapping(address => bool) public collectionTradingEnabled;
    mapping(address => address) public collectionOwners;
    mapping(address => uint256) public collectionOwnerFees;
    mapping(address => uint256) public totalInEscrow;
    mapping(address => bool) public administrators;
    mapping(bytes32 => Trade) public trades;
    mapping(address => bytes32[]) sellOrdersByUser;
    mapping(address => bytes32[]) buyOrdersByUser;

    function getSellOrdersByUser(address user) external view returns(bytes32[] memory orderHashes) {
        orderHashes = sellOrdersByUser[user];
    }

    function getBuyOrdersByUser(address user) external view returns(bytes32[] memory orderHashes) {
        orderHashes = buyOrdersByUser[user];
    }

    constructor(address _token, address _beanFeeProcessor) {
        TOKEN = IWETH(_token);
        BeanFeeProcessor = IBeanFeeProcessor(_beanFeeProcessor);
        administrators[msg.sender] = true;
    }

    modifier onlyAdmins() {
        if (!(administrators[_msgSender()] || owner() == _msgSender()))
            revert BEAN_NotOwnerOrAdmin();
        _;
    }

    //---------------------------------
    //
    //            TRADES
    //
    //---------------------------------
    /**
     * @dev Opens a buy or sell order
     * @param ca Contract address of 1155 to list
     * @param tokenId `tokenId` of 1155 on `ca` to list
     * @param quantity quantity of `tokenId` to list
     * @param price price per token, where price for the entire listing equals `price` * `quantity`
     * @param expiry timestamp for order expiry
     * @param tradeFlags tradeflag struct to determine trade type (buy/sell), allow partial fills
     *        flag, and whether or not the trade is escrowed (requires submission of ETH, only for
     *        open buy orders)
     */
    function openTrade(address ca, uint256 tokenId, uint256 quantity, uint256 price, uint256 expiry, TradeFlags calldata tradeFlags) external payable nonReentrant {
        // Common checks
        if (tradingPaused) revert BEAN_TradingPaused();
        if (!collectionTradingEnabled[ca]) revert BEAN_CollectionNotEnabled();
        if (expiry != 0 && expiry < block.timestamp) revert BEAN_OrderExpired();
        if (price == 0) revert BEAN_ZeroPrice();
        if (price > SMOL_MAX_INT || expiry > SMOLLER_MAX_INT) revert BEAN_IntegerOverFlow();

        // Validate for buy or sell
        if (tradeFlags.tradeType == TradeType.BUY) {
            uint256 totalPrice = price * quantity;
            _validateBuyOrder(totalPrice, tradeFlags);
            if (tradeFlags.isEscrowed) {
                totalEscrowedAmount += totalPrice;
                totalInEscrow[msg.sender] += totalPrice;
            }
        } else {
            _validateSellOrder(ca, msg.sender, tokenId, quantity, tradeFlags);
        }

        bytes32 tradeId = _buildTradeId(msg.sender);
        uint256 posInRegister;

        if (tradeFlags.tradeType == TradeType.BUY) {
            posInRegister = buyOrdersByUser[msg.sender].length;
            buyOrdersByUser[msg.sender].push(tradeId);
        } else {
            posInRegister = sellOrdersByUser[msg.sender].length;
            sellOrdersByUser[msg.sender].push(tradeId);
        }

        trades[tradeId] = Trade(tokenId, quantity, uint128(price), uint64(expiry), uint64(posInRegister), ca, msg.sender, tradeFlags);
        emit TradeOpened(tradeId, ca, tokenId, quantity, price, msg.sender, expiry, block.timestamp, tradeFlags);
    }

    // Cancel a trade that the sender initiated. 
    function cancelTrade(bytes32 tradeId) external nonReentrant {
        // Validate that trade can be cancelled.
        Trade memory _trade = trades[tradeId];
        if (_trade.price == 0) revert BEAN_OrderDoesNotExist();

        // If this is an escrowed offer, we want to limit who can cancel it to the trade creator and admins, for unexpected-eth-pushing-is-bad security reasons.
        // If it's not escrowed (and won't cause eth to go flying around), then the public can cancel offers that have expired.
        bool privilegedDeletoooor = _trade.maker == msg.sender || administrators[msg.sender];
        bool expiredNonEscrowedTrade = !_trade.tradeFlags.isEscrowed && (_trade.expiry != 0 && _trade.expiry < block.timestamp);
        if (!privilegedDeletoooor && !expiredNonEscrowedTrade) revert BEAN_NotAuthorized(); 

        uint256 totalPrice = _trade.price * _trade.quantity;

        // Check if valid return of escrowed funds
        if ((_trade.tradeFlags.isEscrowed) && (totalInEscrow[_trade.maker] < totalPrice || totalEscrowedAmount < totalPrice) ) revert BEAN_EscrowOverWithdraw();

        // Cleanup data structures
        delete trades[tradeId];
        if (_trade.tradeFlags.tradeType == TradeType.BUY) {
            buyOrdersByUser[_trade.maker].swapPop(_trade.posInUserRegister);
        } else if (_trade.tradeFlags.tradeType == TradeType.SELL) {
            sellOrdersByUser[_trade.maker].swapPop(_trade.posInUserRegister);
        }

        //Return escrowed funds if necessary. `_trade.tradeFlags.isEscrowed` should never have a value if the order type is a sell.
        if (_trade.tradeFlags.isEscrowed) _returnEscrow(_trade.maker, totalPrice);

        emit TradeCancelled(tradeId, _trade.ca, _trade.tokenId, _trade.quantity, _trade.price, _trade.maker, _trade.expiry, block.timestamp, _trade.tradeFlags);
    }

    // Called to accept any open, valid, unexpired trade, whether it's a buy or a sell.
    function acceptTrade(bytes32 tradeId, uint256 amount) external payable nonReentrant {
        if (tradingPaused) revert BEAN_TradingPaused();

        Trade memory _trade = trades[tradeId];

        if (!collectionTradingEnabled[_trade.ca]) revert BEAN_CollectionNotEnabled();
        if (_trade.price == 0) revert BEAN_OrderDoesNotExist();
        if (_trade.expiry != 0 && _trade.expiry < block.timestamp) revert BEAN_OrderExpired();
        if (!_trade.tradeFlags.allowPartialFills && amount != _trade.quantity) revert BEAN_TradeNotPartialFill();
        if (amount > _trade.quantity) revert BEAN_AmountOverQuantity();

        uint256 totalPrice = _trade.price * amount;

        // Depending on whether this was initially a buy or sell order, set the seller and purchaser accordingly.
        (address seller, address purchaser) = (_trade.tradeFlags.tradeType == TradeType.SELL) ? (_trade.maker, msg.sender) : (msg.sender, _trade.maker);

        if (_trade.tradeFlags.tradeType == TradeType.SELL) {
            _fulfillSellOrder(tradeId, _trade, seller, purchaser, totalPrice, amount);
        } else if (_trade.tradeFlags.tradeType == TradeType.BUY) {
            _fulfillBuyOrder(tradeId, _trade, seller, purchaser, totalPrice, amount);
        } else {
            revert("Trade in invalid state.");
        }

        emit TradeAccepted(tradeId, _trade.ca, _trade.tokenId, amount, _trade.price, seller, purchaser, _trade.tradeFlags.tradeType, _trade.expiry, block.timestamp);
    }

    function _validateSellOrder(address ca, address maker, uint256 tokenId, uint256 quantity, TradeFlags memory tradeFlags) internal view {
        if (IERC1155(ca).balanceOf(maker, tokenId) < quantity) revert BEAN_SellAssetBalanceLow(); // Non Fungible? Ser those are non-existent.
        if (!IERC1155(ca).isApprovedForAll(maker, address(this))) revert BEAN_ContractNotApproved(); // Need a lil' trust in this working relationship.
        if (tradeFlags.isEscrowed) revert BEAN_NoEscrowedSell(); // We don't tokens out of your wallet. Screw that.
    }

    function _validateBuyOrder(uint256 totalPrice, TradeFlags memory tradeFlags ) internal view {
        // Escrowed bid - didn't send enough ETH for requested quantity.
        if (tradeFlags.isEscrowed && msg.value < totalPrice) revert BEAN_EscrowCurrencyUnderfunded();
        // Non-escrowed bid - didn't set allowance for marketplace contract.
        if (!tradeFlags.isEscrowed && TOKEN.allowance(msg.sender, address(this)) < totalPrice) revert BEAN_PaymentTokenNotApproved();
        // Non-escrowed bid - ur a broke boi or non-boi.
        if (!tradeFlags.isEscrowed && TOKEN.balanceOf(msg.sender) < totalPrice) revert BEAN_BuyerAccountUnderfunded();
    }

    function _buildTradeId(address user) internal returns (bytes32 tradeId) {
      unchecked {++nonce;}
      tradeId = keccak256(
          abi.encodePacked(user, block.timestamp, nonce)
      );
    }

    function _processFees( address ca,  uint256 amount, address oldOwner) private {
        if (feesOn) {
            (uint256 totalAdminFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = _calculateAmounts(ca, amount);
            _sendEth(oldOwner, remainder);
            if (collectionOwnerFeeAmount != 0) _sendEth(collectionOwners[ca], collectionOwnerFeeAmount);
            if (totalAdminFeeAmount != 0) _sendEth(address(BeanFeeProcessor), totalAdminFeeAmount);
        } else {
            _sendEth(oldOwner, amount);
        }
    }

    //---------------------------------
    //
    //      PUBLIC GETTERS + ESCROW
    //
    //---------------------------------
    function addMoneyToEscrow() external payable nonReentrant {
        if (!usersCanWithdrawEscrow) revert BEAN_WithdrawNotEnabled();
        totalEscrowedAmount += msg.value;
        totalInEscrow[msg.sender] += msg.value;
    }

    function withdrawMoneyFromEscrow(uint256 amount) external nonReentrant {
        if (!usersCanWithdrawEscrow) revert BEAN_WithdrawNotEnabled();
        if (totalInEscrow[msg.sender] < amount) revert BEAN_EscrowOverWithdraw();
        _returnEscrow(msg.sender, amount);
    }

    function getEscrowedAmount(address user) external view returns (uint256) {
        return totalInEscrow[user];
    }

    function getCollectionOwner(address ca) external view returns (address) {
        return collectionOwners[ca];
    }

    function computeOrderHash(address user, address token, uint256 tokenId, uint256 userNonce) public view returns (bytes32 offerHash) {
        return keccak256(abi.encode(user, token, tokenId, userNonce, block.timestamp));
    }

    function totalAdminFees() public view returns(uint256 totalFee) {
        totalFee = BeanFeeProcessor.totalFee();
    }

    function checkEscrowAmount(address user) external view returns (uint256) {
        return totalInEscrow[user];
    }

    function isCollectionTrading(address ca) external view returns (bool) {
        return collectionTradingEnabled[ca];
    }

    function getCollectionFee(address ca) external view returns (uint256) {
        return collectionOwnerFees[ca];
    }

    function getTrade(bytes32 tradeID) public view returns (Trade memory) {
        return trades[tradeID];
    }

    function isValidTrade(bytes32 tradeID) external view returns (bool validTrade) {
        Trade memory trade = getTrade(tradeID);
        IERC1155 token = IERC1155(trade.ca);
        //if selling tokens, valid if seller has approved tokens for sale
        bool tokenApproved = trade.tradeFlags.tradeType == TradeType.SELL ? token.isApprovedForAll(trade.maker, address(this)) : true;
        bool tokenBalance = trade.tradeFlags.tradeType == TradeType.SELL ? token.balanceOf(trade.maker, trade.tokenId) >= trade.quantity : true;
        validTrade = (trade.expiry > block.timestamp || trade.expiry == 0) && tokenApproved && tokenBalance;
    }

    //---------------------------------
    //
    //        ADMIN FUNCTIONS
    //
    //---------------------------------
    function setAdmin(address admin, bool value) external onlyOwner {
        administrators[admin] = value;
    }

    function setTrading(bool value) external onlyOwner {
        require(tradingPaused != value, "Already set to that value.");
        tradingPaused = value;
    }

    function setCollectionTrading(address ca, bool value) external onlyAdmins {
        require(collectionTradingEnabled[ca] != value, "Already set to that value.");
        collectionTradingEnabled[ca] = value;
    }

    function setCollectionOwner(address ca, address _owner) external onlyAdmins {
        collectionOwners[ca] = _owner;
    }

    function setCollectionOwnerFee(address ca, uint256 fee) external {
        bool verifiedCollectionOwner = collectionOwnersCanSetRoyalties && (_msgSender() == collectionOwners[ca]);
        require(_msgSender() == owner() || verifiedCollectionOwner);
        require(fee <= 1000, "Max 10% fee");
        collectionOwnerFees[ca] = fee;
    }

    // Convenience function for listing / ~Partially~ implements EIP2981
    function listCollection(address ca, bool tradingEnabled, address _royaltyWallet, uint256 _fee) external onlyAdmins {
        uint256 fee = _fee;
        address royaltyWallet = _royaltyWallet;
        if (IERC165(ca).supportsInterface(0x2a55205a)) {
            (address receiver, uint256 royaltyAmount) = IERC2981(ca).royaltyInfo(1, 1 ether);
            royaltyWallet = receiver;
            fee = (10000 * royaltyAmount / 1 ether) >= 1000 ? 1000 : 10000 * royaltyAmount / 1 ether;
        }

        collectionTradingEnabled[ca] = tradingEnabled;
        collectionOwners[ca] = royaltyWallet;
        collectionOwnerFees[ca] = fee;
        emit CollectionModified(ca, tradingEnabled, _royaltyWallet, _fee, block.timestamp);
    }

    function setDefaultCollectionOwnerFee(uint256 fee) external onlyOwner {
        require(fee <= 1000, "Max 10% fee");
        defaultCollectionOwnerFee = fee;
    }

    function setFeesOn(bool _value) external onlyOwner {
        feesOn = _value;
    }

    function setCollectionOwnersCanSetRoyalties(bool _value) external onlyOwner {
        collectionOwnersCanSetRoyalties = _value;
    }

    // Emergency only - Recover Tokens
    function recoverToken(address _token, uint256 amount) external onlyOwner {
        IERC20(_token).transfer(owner(), amount);
    }

    // Emergency only - Recover 1155s
    function recover1155(address _token, uint256 tokenId, uint256 amount) external onlyOwner {
        IERC1155(_token).safeTransferFrom(address(this), owner(), tokenId, amount, "");
    }

    // Emergency only - Recover ETH/MOVR/GLMR/WHATEVER
    function recoverGAS(address to, uint256 amount) external onlyOwner {
        _sendEth(to, amount);
    }

    //---------------------------------
    //
    //        PRIVATE HELPERS
    //
    //---------------------------------

    function _fulfillSellOrder(bytes32 tradeId, Trade memory _trade, address seller, address purchaser, uint256 totalPrice, uint256 amount) internal {
        // Check allowance and balance of token seller and verify that buyer sent enough ETH.
        if (!IERC1155(_trade.ca).isApprovedForAll(seller, address(this))) revert BEAN_ContractNotApproved();
        if (IERC1155(_trade.ca).balanceOf(seller, _trade.tokenId) < amount) revert BEAN_NotEnoughTokensToFulfill();
        if (msg.value < totalPrice) revert BEAN_SellFulfillUnderfunded();

        // We validate that amount < quantity in acceptTrade.
        uint256 remainingQuantity = _trade.quantity - amount;

        if (remainingQuantity == 0) {
            sellOrdersByUser[_trade.maker].swapPop(_trade.posInUserRegister);
            delete trades[tradeId];
        } else {
            trades[tradeId].quantity -= amount;
        }

        IERC1155(_trade.ca).safeTransferFrom(seller, purchaser, _trade.tokenId, amount, "");
        _processFees(_trade.ca, totalPrice, seller);
    }

    // Could use a future refactor to make escrow and non-escrow arms less interwoven.
    function _fulfillBuyOrder(bytes32 tradeId, Trade memory _trade, address seller, address purchaser, uint256 totalPrice, uint256 amount) internal {
        // Check allowance and balance of token seller and buy order fultiller (trade maker).
        if (msg.value > 0) revert BEAN_BuyOrderWithValue();
        if (!IERC1155(_trade.ca).isApprovedForAll(seller, address(this))) revert BEAN_ContractNotApproved();
        if (IERC1155(_trade.ca).balanceOf(seller, _trade.tokenId) < amount) revert BEAN_NotEnoughTokensToFulfill();

        if (_trade.tradeFlags.isEscrowed) {
            // Escrow only logic - validate that trade maker either has enough escrowed funds. 
            if (totalInEscrow[_trade.maker] < totalPrice) revert BEAN_NotEnoughInEscrow();
            totalEscrowedAmount -= totalPrice;
            totalInEscrow[purchaser] -= totalPrice;
        } else {
            // Non-Escrowed checks - validated that trademaker has enough WETH and the marketplace has a sufficient WETH allowance.
            if (TOKEN.balanceOf(_trade.maker) < totalPrice) revert BEAN_NotEnoughMakerFunds();
            if (TOKEN.allowance(_trade.maker, address(this)) < totalPrice) revert BEAN_NotEnoughSellerAllowance();
        }

        uint256 remainingQuantity = _trade.quantity - amount;

        if (remainingQuantity == 0) {
            buyOrdersByUser[_trade.maker].swapPop(_trade.posInUserRegister);
            delete trades[tradeId];
        } else {
            trades[tradeId].quantity -= amount;
        }

        IERC1155(_trade.ca).safeTransferFrom(seller, purchaser, _trade.tokenId, amount, "");
        
        if (_trade.tradeFlags.isEscrowed) {
            _processFees(_trade.ca, totalPrice, seller);
        } else {
            bool success = TOKEN.transferFrom(purchaser, address(this), totalPrice);
            if (!success) revert BEAN_TransferFailed();
            TOKEN.withdraw(totalPrice);
            _processFees(_trade.ca, totalPrice, seller);
        }
    }

    // I love you, you love me, we're a happy fee-mily
    function _calculateAmounts(address ca, uint256 amount) private view returns (uint256, uint256, uint256) {
        uint256 _collectionOwnerFee = collectionOwnerFees[ca] == 0
            ? defaultCollectionOwnerFee
            : collectionOwnerFees[ca];

        uint256 totalAdminFee = (amount * totalAdminFees()) / 10000;
        uint256 collectionOwnerFeeAmount = (amount * _collectionOwnerFee) / 10000;
        uint256 remainder = amount - (totalAdminFee + collectionOwnerFeeAmount);
        return (totalAdminFee, collectionOwnerFeeAmount, remainder);
    }

    function _returnEscrow(address user, uint256 amount) private {
        totalEscrowedAmount -= amount;
        totalInEscrow[user] -= amount;
        _sendEth(user, amount);
        emit EscrowReturned(user, amount);
    }

    function _sendEth(address _address, uint256 _amount) private {
        (bool success, ) = _address.call{value: _amount}("");
        require(success, "Transfer failed.");
    }

    // Required in order to receive MOVR/GLMR.
    receive() external payable {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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 Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 4 of 11 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
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);
}

pragma solidity ^0.8.14;

library BeanUtils {
    function swapPop(bytes32[] storage self, uint256 index) internal {
        self[index] = self[self.length-1];
        self.pop();
    }

    function swapPop(address[] storage self, uint256 index) internal {
        self[index] = self[self.length-1];
        self.pop();
    }
}

pragma solidity ^0.8.0;

interface IBeanFeeProcessor {
    function devFee() external view returns(uint256);
    function beanieHolderFee() external view returns(uint256);
    function beanBuybackFee() external view returns(uint256);
    function totalFee() external view returns(uint256);
}

pragma solidity >=0.4.18;

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256) external;
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address src, address dst, uint wad) external returns (bool);
    function balanceOf(address) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_beanFeeProcessor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BEAN_AmountOverQuantity","type":"error"},{"inputs":[],"name":"BEAN_BuyOrderWithValue","type":"error"},{"inputs":[],"name":"BEAN_BuyerAccountUnderfunded","type":"error"},{"inputs":[],"name":"BEAN_CollectionNotEnabled","type":"error"},{"inputs":[],"name":"BEAN_ContractNotApproved","type":"error"},{"inputs":[],"name":"BEAN_EscrowCurrencyUnderfunded","type":"error"},{"inputs":[],"name":"BEAN_EscrowOverWithdraw","type":"error"},{"inputs":[],"name":"BEAN_IntegerOverFlow","type":"error"},{"inputs":[],"name":"BEAN_NoEscrowedSell","type":"error"},{"inputs":[],"name":"BEAN_NotAuthorized","type":"error"},{"inputs":[],"name":"BEAN_NotEnoughInEscrow","type":"error"},{"inputs":[],"name":"BEAN_NotEnoughMakerFunds","type":"error"},{"inputs":[],"name":"BEAN_NotEnoughSellerAllowance","type":"error"},{"inputs":[],"name":"BEAN_NotEnoughTokensToFulfill","type":"error"},{"inputs":[],"name":"BEAN_NotOwnerOrAdmin","type":"error"},{"inputs":[],"name":"BEAN_OrderDoesNotExist","type":"error"},{"inputs":[],"name":"BEAN_OrderExpired","type":"error"},{"inputs":[],"name":"BEAN_PaymentTokenNotApproved","type":"error"},{"inputs":[],"name":"BEAN_SellAssetBalanceLow","type":"error"},{"inputs":[],"name":"BEAN_SellFulfillUnderfunded","type":"error"},{"inputs":[],"name":"BEAN_TradeNotPartialFill","type":"error"},{"inputs":[],"name":"BEAN_TradingPaused","type":"error"},{"inputs":[],"name":"BEAN_TransferFailed","type":"error"},{"inputs":[],"name":"BEAN_WithdrawNotEnabled","type":"error"},{"inputs":[],"name":"BEAN_ZeroPrice","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectionOwnerFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CollectionModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EscrowReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"tradeId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"},{"indexed":false,"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradeAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"tradeId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"internalType":"bool","name":"allowPartialFills","type":"bool"},{"internalType":"bool","name":"isEscrowed","type":"bool"}],"indexed":false,"internalType":"struct FungibleBeanieMarketV1.TradeFlags","name":"tradeFlags","type":"tuple"}],"name":"TradeCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"tradeId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"components":[{"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"internalType":"bool","name":"allowPartialFills","type":"bool"},{"internalType":"bool","name":"isEscrowed","type":"bool"}],"indexed":false,"internalType":"struct FungibleBeanieMarketV1.TradeFlags","name":"tradeFlags","type":"tuple"}],"name":"TradeOpened","type":"event"},{"inputs":[],"name":"BeanFeeProcessor","outputs":[{"internalType":"contract IBeanFeeProcessor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tradeId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"acceptTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"addMoneyToEscrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tradeId","type":"bytes32"}],"name":"cancelTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkEscrowAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionOwnerFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionOwners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionOwnersCanSetRoyalties","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"collectionTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"userNonce","type":"uint256"}],"name":"computeOrderHash","outputs":[{"internalType":"bytes32","name":"offerHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultCollectionOwnerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBuyOrdersByUser","outputs":[{"internalType":"bytes32[]","name":"orderHashes","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getSellOrdersByUser","outputs":[{"internalType":"bytes32[]","name":"orderHashes","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tradeID","type":"bytes32"}],"name":"getTrade","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"expiry","type":"uint64"},{"internalType":"uint64","name":"posInUserRegister","type":"uint64"},{"internalType":"address","name":"ca","type":"address"},{"internalType":"address","name":"maker","type":"address"},{"components":[{"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"internalType":"bool","name":"allowPartialFills","type":"bool"},{"internalType":"bool","name":"isEscrowed","type":"bool"}],"internalType":"struct FungibleBeanieMarketV1.TradeFlags","name":"tradeFlags","type":"tuple"}],"internalType":"struct FungibleBeanieMarketV1.Trade","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"isCollectionTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tradeID","type":"bytes32"}],"name":"isValidTrade","outputs":[{"internalType":"bool","name":"validTrade","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"bool","name":"tradingEnabled","type":"bool"},{"internalType":"address","name":"_royaltyWallet","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"listCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"components":[{"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"internalType":"bool","name":"allowPartialFills","type":"bool"},{"internalType":"bool","name":"isEscrowed","type":"bool"}],"internalType":"struct FungibleBeanieMarketV1.TradeFlags","name":"tradeFlags","type":"tuple"}],"name":"openTrade","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recover1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverGAS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"setCollectionOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCollectionOwnerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setCollectionOwnersCanSetRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setCollectionTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setDefaultCollectionOwnerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setFeesOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAdminFees","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalInEscrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"trades","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint64","name":"expiry","type":"uint64"},{"internalType":"uint64","name":"posInUserRegister","type":"uint64"},{"internalType":"address","name":"ca","type":"address"},{"internalType":"address","name":"maker","type":"address"},{"components":[{"internalType":"enum FungibleBeanieMarketV1.TradeType","name":"tradeType","type":"uint8"},{"internalType":"bool","name":"allowPartialFills","type":"bool"},{"internalType":"bool","name":"isEscrowed","type":"bool"}],"internalType":"struct FungibleBeanieMarketV1.TradeFlags","name":"tradeFlags","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usersCanWithdrawEscrow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMoneyFromEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260016004556006805463ffffffff60a01b191661010160a81b1790553480156200002d57600080fd5b50604051620046d4380380620046d483398101604081905262000050916200011b565b60016000556200006033620000ac565b600580546001600160a01b039384166001600160a01b03199182161790915560068054929093169116179055336000908152600b60205260409020805460ff1916600117905562000153565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200011657600080fd5b919050565b600080604083850312156200012f57600080fd5b6200013a83620000fe565b91506200014a60208401620000fe565b90509250929050565b61457180620001636000396000f3fe6080604052600436106103005760003560e01c80637cfb41b81161018f578063b29a8140116100e1578063d3810e241161008a578063e4c8be8c11610064578063e4c8be8c1461099a578063e721152c146109ba578063f2fde38b146109da57600080fd5b8063d3810e241461093d578063dd3cfd3214610953578063ddaa54371461098757600080fd5b8063c8d70062116100bb578063c8d70062146108bd578063cbde6405146108ea578063cd653ee61461090a57600080fd5b8063b29a814014610847578063b3a4f97b14610867578063c62fc6771461089d57600080fd5b80638da5cb5b11610143578063a3b137991161011d578063a3b13799146107f1578063ab00a98e1461081e578063affed0e01461083157600080fd5b80638da5cb5b1461079d5780638f70ccf7146107bb5780639011f8fe146107db57600080fd5b806382ff441c1161017457806382ff441c14610744578063846f45a01461054c5780638a6169ae1461076457600080fd5b80637cfb41b81461070457806382bfefc81461072457600080fd5b80633fd9d6ff1161025357806361feacff116101fc578063715018a6116101d6578063715018a614610686578063745b69ca1461069b57806376be1585146106d457600080fd5b806361feacff14610631578063675ef65c146106465780636b872a961461066657600080fd5b806353e23e2e1161022d57806353e23e2e146105aa5780635674cdae146105dc578063599b0a401461061157600080fd5b80633fd9d6ff1461054c5780634a5c213c146105825780634b0bddd21461058a57600080fd5b80631fbfce18116102b557806324f377641161028f57806324f37764146104ec5780632581b05c1461050c5780632ef0a6c21461052c57600080fd5b80631fbfce181461047d57806320184b11146104aa5780632288739b146104cc57600080fd5b80631cbad4db116102e65780631cbad4db146103895780631dfbbe08146103c45780631e02778f1461042f57600080fd5b80621624201461030c5780631bb768781461034957600080fd5b3661030757005b600080fd5b34801561031857600080fd5b5061032c610327366004613d42565b6109fa565b604051610340989796959493929190613de9565b60405180910390f35b34801561035557600080fd5b50610379610364366004613e6e565b60076020526000908152604090205460ff1681565b6040519015158152602001610340565b34801561039557600080fd5b506103b66103a4366004613e6e565b600a6020526000908152604090205481565b604051908152602001610340565b3480156103d057600080fd5b506103b66103df366004613e92565b604080516001600160a01b039586166020808301919091529490951685820152606085019290925260808401524260a0808501919091528151808503909101815260c09093019052815191012090565b34801561043b57600080fd5b5061046561044a366004613e6e565b6008602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610340565b34801561048957600080fd5b506103b6610498366004613e6e565b60096020526000908152604090205481565b3480156104b657600080fd5b506104ca6104c5366004613ed8565b610aec565b005b3480156104d857600080fd5b50600654610465906001600160a01b031681565b3480156104f857600080fd5b506104ca610507366004613ed8565b610be1565b34801561051857600080fd5b50610379610527366004613d42565b610bf7565b34801561053857600080fd5b506104ca610547366004613f12565b610dd5565b34801561055857600080fd5b506103b6610567366004613e6e565b6001600160a01b03166000908152600a602052604090205490565b6104ca61109a565b34801561059657600080fd5b506104ca6105a5366004613f63565b61118a565b3480156105b657600080fd5b506006546103799074010000000000000000000000000000000000000000900460ff1681565b3480156105e857600080fd5b506006546103799077010000000000000000000000000000000000000000000000900460ff1681565b34801561061d57600080fd5b506104ca61062c366004613f9c565b6111db565b34801561063d57600080fd5b506103b661122f565b34801561065257600080fd5b506104ca610661366004613f9c565b6112bb565b34801561067257600080fd5b506104ca610681366004613d42565b61130e565b34801561069257600080fd5b506104ca611417565b3480156106a757600080fd5b506104656106b6366004613e6e565b6001600160a01b039081166000908152600860205260409020541690565b3480156106e057600080fd5b506103796106ef366004613e6e565b600b6020526000908152604090205460ff1681565b34801561071057600080fd5b506104ca61071f366004613d42565b61142b565b34801561073057600080fd5b50600554610465906001600160a01b031681565b34801561075057600080fd5b506104ca61075f366004613f63565b6118f1565b34801561077057600080fd5b5061037961077f366004613e6e565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156107a957600080fd5b506001546001600160a01b0316610465565b3480156107c757600080fd5b506104ca6107d6366004613f9c565b611a08565b3480156107e757600080fd5b506103b660035481565b3480156107fd57600080fd5b5061081161080c366004613d42565b611abc565b6040516103409190613fb9565b6104ca61082c366004614057565b611c37565b34801561083d57600080fd5b506103b660045481565b34801561085357600080fd5b506104ca610862366004613ed8565b612271565b34801561087357600080fd5b506103b6610882366004613e6e565b6001600160a01b031660009081526009602052604090205490565b3480156108a957600080fd5b506104ca6108b83660046140db565b612328565b3480156108c957600080fd5b506108dd6108d8366004613e6e565b6123eb565b6040516103409190614110565b3480156108f657600080fd5b506104ca610905366004614154565b612457565b34801561091657600080fd5b50600654610379907501000000000000000000000000000000000000000000900460ff1681565b34801561094957600080fd5b506103b660025481565b34801561095f57600080fd5b5060065461037990760100000000000000000000000000000000000000000000900460ff1681565b6104ca610995366004614182565b6124fb565b3480156109a657600080fd5b506104ca6109b5366004613d42565b6129d9565b3480156109c657600080fd5b506108dd6109d5366004613e6e565b612a38565b3480156109e657600080fd5b506104ca6109f5366004613e6e565b612aa2565b600c60205260009081526040908190208054600180830154600284015460038501546004860154875160608101909852600587018054969894976fffffffffffffffffffffffffffffffff85169767ffffffffffffffff7001000000000000000000000000000000008704811698780100000000000000000000000000000000000000000000000090970416966001600160a01b039586169694909516949193919291839160ff1690811115610ab257610ab2613d5b565b6001811115610ac357610ac3613d5b565b8152905460ff610100820481161515602084015262010000909104161515604090910152905088565b600654600090760100000000000000000000000000000000000000000000900460ff168015610b3457506001600160a01b038381166000908152600860205260409020541633145b9050610b486001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610b645750805b610b6d57600080fd5b6103e8821115610bc45760405162461bcd60e51b815260206004820152600b60248201527f4d6178203130252066656500000000000000000000000000000000000000000060448201526064015b60405180910390fd5b506001600160a01b03909116600090815260096020526040902055565b610be9612b32565b610bf38282612b8c565b5050565b600080610c0383611abc565b60a08101519091506000600160e0840151516001811115610c2657610c26613d5b565b14610c32576001610cc1565b60c08301516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201523060248201529083169063e985e9c590604401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906141a4565b90506000600160e0850151516001811115610cde57610cde613d5b565b14610cea576001610d8f565b602084015160c085015185516040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169262fdd58e92610d4b926004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c91906141c1565b10155b905042846060015167ffffffffffffffff161180610db95750606084015167ffffffffffffffff16155b8015610dc25750815b8015610dcb5750805b9695505050505050565b336000908152600b602052604090205460ff1680610dfd57506001546001600160a01b031633145b610e33576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f2a55205a000000000000000000000000000000000000000000000000000000006004820152819083906001600160a01b038716906301ffc9a790602401602060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed891906141a4565b15610fce576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260016004820152670de0b6b3a7640000602482015260009081906001600160a01b03891690632a55205a906044016040805180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7191906141da565b90935083925090506103e8670de0b6b3a7640000610f9183612710614237565b610f9b9190614274565b1015610fc557670de0b6b3a7640000610fb682612710614237565b610fc09190614274565b610fc9565b6103e85b935050505b6001600160a01b03868116600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168b15159081179091556008835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888816179055600983529281902087905580518881524292810192909252938816939192917f3ecb245e4afa53e8cddb2d4454c162ddda6c50309dc53e13fe646054f3112ad5910160405180910390a4505050505050565b6002600054036110ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065477010000000000000000000000000000000000000000000000900460ff16611148576040517fee9552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346003600082825461115a91906142af565b9091555050336000908152600a60205260408120805434929061117e9084906142af565b90915550506001600055565b611192612b32565b6001600160a01b03919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6111e3612b32565b60068054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600654604080517f1df4ccfc00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691631df4ccfc9160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906141c1565b905090565b6112c3612b32565b600680549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6002600054036113605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065477010000000000000000000000000000000000000000000000900460ff166113bc576040517fee9552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020526040902054811115611405576040517f9ee0f36100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61140f3382612c2f565b506001600055565b61141f612b32565b6114296000612cb8565b565b60026000540361147d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b60026000818155828152600c602090815260408083208151610100810183528154815260018083015494820194909452948101546fffffffffffffffffffffffffffffffff81168684015267ffffffffffffffff70010000000000000000000000000000000082048116606080890191909152780100000000000000000000000000000000000000000000000090920416608087015260038201546001600160a01b0390811660a088015260048301541660c08701528251908101909252600581018054949594919360e086019392839160ff9091169081111561156357611563613d5b565b600181111561157457611574613d5b565b8152905460ff6101008204811615156020840152620100009091041615156040918201529152820151919250506fffffffffffffffffffffffffffffffff166000036115ec576040517fbfe73a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c08101516000906001600160a01b03163314806116195750336000908152600b602052604090205460ff165b905060008260e00151604001511580156116585750606083015167ffffffffffffffff1615801590611658575042836060015167ffffffffffffffff16105b905081158015611666575080155b1561169d576040517f7f1cb4d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836020015184604001516fffffffffffffffffffffffffffffffff166116c59190614237565b90508360e00151604001518015611702575060c08401516001600160a01b03166000908152600a6020526040902054811180611702575080600354105b15611739576040517f9ee0f36100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600c6020526040812081815560018101829055600281018290556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905560e08501515160018111156117d0576117d0613d5b565b0361180e57608084015160c08501516001600160a01b03166000908152600e602052604090206118099167ffffffffffffffff16612d22565b611860565b600160e085015151600181111561182757611827613d5b565b0361186057608084015160c08501516001600160a01b03166000908152600d602052604090206118609167ffffffffffffffff16612d22565b8360e00151604001511561187c5761187c8460c0015182612c2f565b83600001518460a001516001600160a01b0316867f10ef23d623cfc3113d40783c42c2705b0cf96ddb56cca58b0da7f3923c1f4def876020015188604001518960c001518a60600151428c60e001516040516118dd969594939291906142c7565b60405180910390a450506001600055505050565b336000908152600b602052604090205460ff168061191957506001546001600160a01b031633145b61194f576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036119bf5760405162461bcd60e51b815260206004820152601a60248201527f416c72656164792073657420746f20746861742076616c75652e0000000000006044820152606401610bbb565b6001600160a01b0391909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611a10612b32565b801515600660149054906101000a900460ff16151503611a725760405162461bcd60e51b815260206004820152601a60248201527f416c72656164792073657420746f20746861742076616c75652e0000000000006044820152606401610bbb565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b611b1760408051610100810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905284519081018552828152908101829052928301529060e082015290565b6000828152600c6020908152604091829020825161010081018452815481526001808301549382019390935260028201546fffffffffffffffffffffffffffffffff81168286015267ffffffffffffffff70010000000000000000000000000000000082048116606080850191909152780100000000000000000000000000000000000000000000000090920416608083015260038301546001600160a01b0390811660a084015260048401541660c083015284519081019094526005820180549194929360e086019392839160ff90911690811115611bf957611bf9613d5b565b6001811115611c0a57611c0a613d5b565b8152905460ff61010082048116151560208401526201000090910416151560409091015290525092915050565b600260005403611c895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065474010000000000000000000000000000000000000000900460ff1615611ce3576040517fc8786f1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861660009081526007602052604090205460ff16611d35576040517f7994525d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115801590611d4357504282105b15611d7a576040517f31d2b9d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611db4576040517f3c7243d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff831180611dd9575067ffffffffffffffff82115b15611e10576040517fb2cce0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1f6020830183614339565b6001811115611e3057611e30613d5b565b03611eb2576000611e418585614237565b9050611e5b81611e5636859003850185614354565b612d97565b611e6b6060830160408401613f9c565b15611eac578060036000828254611e8291906142af565b9091555050336000908152600a602052604081208054839290611ea69084906142af565b90915550505b50611ecd565b611ecd86338787611ec836879003870187614354565b612f7a565b6000611f3e3360048054600101908190556040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201524260348201526054810191909152600090607401604051602081830303815290604052805190602001209050919050565b9050600080611f506020850185614339565b6001811115611f6157611f61613d5b565b03611f8f5750336000908152600e602090815260408220805460018101825590835291208101829055611fb4565b50336000908152600d6020908152604082208054600181018255908352912081018290555b604051806101000160405280888152602001878152602001866fffffffffffffffffffffffffffffffff1681526020018567ffffffffffffffff1681526020018267ffffffffffffffff168152602001896001600160a01b03168152602001336001600160a01b03168152602001848036038101906120339190614354565b90526000838152600c6020908152604091829020835181559083015160018083019190915591830151600282018054606086015160808701516fffffffffffffffffffffffffffffffff9094167fffffffffffffffff0000000000000000000000000000000000000000000000009092169190911770010000000000000000000000000000000067ffffffffffffffff928316021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000919093160291909117905560a08301516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161790915560c0850151600484018054909216921691909117905560e0830151805160058301805493949293909283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169083818111156121a4576121a4613d5b565b021790555060208201518154604093840151151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff92151561010002929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90911617179055518992506001600160a01b038b16915084907f461f1226d03bc6efc5d70cccfc92b7d5b029a296257c471a5afe67aafc1823f39061225a908b908b9033908c9042908d906143eb565b60405180910390a450506001600055505050505050565b612279612b32565b816001600160a01b031663a9059cbb61229a6001546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156122ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232391906141a4565b505050565b612330612b32565b826001600160a01b031663f242432a306123526001546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018590526064810184905260a06084820152600060a482015260c401600060405180830381600087803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b50505050505050565b6001600160a01b0381166000908152600d602090815260409182902080548351818402810184019094528084526060939283018282801561244b57602002820191906000526020600020905b815481526020019060010190808311612437575b50505050509050919050565b336000908152600b602052604090205460ff168061247f57506001546001600160a01b031633145b6124b5576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03918216600090815260086020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b60026000540361254d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065474010000000000000000000000000000000000000000900460ff16156125a7576040517fc8786f1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600c60209081526040808320815161010081018352815481526001808301549482019490945260028201546fffffffffffffffffffffffffffffffff81168285015267ffffffffffffffff70010000000000000000000000000000000082048116606080850191909152780100000000000000000000000000000000000000000000000090920416608083015260038301546001600160a01b0390811660a084015260048401541660c083015283519081019093526005820180549194929360e08601939092839160ff9091169081111561268957612689613d5b565b600181111561269a5761269a613d5b565b8152905460ff61010082048116151560208085019190915262010000909204811615156040938401529290935260a08501516001600160a01b03166000908152600790935290912054929350919091169050612722576040517f7994525d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604001516fffffffffffffffffffffffffffffffff16600003612772576040517fbfe73a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015167ffffffffffffffff161580159061279c575042816060015167ffffffffffffffff16105b156127d3576040517f31d2b9d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060e00151602001511580156127ed575080602001518214155b15612824576040517fd3503e7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060200151821115612862576040517f9286936000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008282604001516fffffffffffffffffffffffffffffffff166128869190614237565b9050600080600160e08501515160018111156128a4576128a4613d5b565b146128b457338460c001516128bb565b8360c00151335b9092509050600160e08501515160018111156128d9576128d9613d5b565b036128f1576128ec86858484878a61313f565b612965565b600060e085015151600181111561290a5761290a613d5b565b0361291d576128ec86858484878a6134c3565b60405162461bcd60e51b815260206004820152601760248201527f547261646520696e20696e76616c69642073746174652e0000000000000000006044820152606401610bbb565b83600001518460a001516001600160a01b0316877f1c4216aeda1e79aa1a63f9187b049c4bd3edc14993105c6b5da49f9ef6948ed188886040015187878b60e00151600001518c60600151426040516129c49796959493929190614464565b60405180910390a45050600160005550505050565b6129e1612b32565b6103e8811115612a335760405162461bcd60e51b815260206004820152600b60248201527f4d617820313025206665650000000000000000000000000000000000000000006044820152606401610bbb565b600255565b6001600160a01b0381166000908152600e602090815260409182902080548351818402810184019094528084526060939283018282801561244b57602002820191906000526020600020908154815260200190600101908083116124375750505050509050919050565b612aaa612b32565b6001600160a01b038116612b265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bbb565b612b2f81612cb8565b50565b6001546001600160a01b031633146114295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612bd9576040519150601f19603f3d011682016040523d82523d6000602084013e612bde565b606091505b50509050806123235760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610bbb565b8060036000828254612c4191906144c6565b90915550506001600160a01b0382166000908152600a602052604081208054839290612c6e9084906144c6565b90915550612c7e90508282612b8c565b60405181906001600160a01b038416907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d90600090a35050565b600180546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b81548290612d32906001906144c6565b81548110612d4257612d426144dd565b9060005260206000200154828281548110612d5f57612d5f6144dd565b906000526020600020018190555081805480612d7d57612d7d61450c565b600190038181906000526020600020016000905590555050565b80604001518015612da757508134105b15612dde576040517f94a34d5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060400151158015612e7857506005546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015283916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015612e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7691906141c1565b105b15612eaf576040517f7c1042ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060400151158015612f4357506005546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4191906141c1565b105b15610bf3576040517f82e26b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820185905283919087169062fdd58e90604401602060405180830381865afa158015612fe1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300591906141c1565b101561303d576040517f3a6e75da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015230602483015286169063e985e9c590604401602060405180830381865afa1580156130a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c691906141a4565b6130fc576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015115613138576040517fe365db0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60a08501516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce91906141a4565b613204576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a085015185516040517efdd58e00000000000000000000000000000000000000000000000000000000815283926001600160a01b03169162fdd58e916132639189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141c1565b10156132dc576040517f69a687a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81341015613316576040517fea10f23700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081866020015161332891906144c6565b9050806000036133ec57608086015160c08701516001600160a01b03166000908152600d602052604090206133669167ffffffffffffffff16612d22565b6000878152600c602052604081208181556001810182905560028101919091556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000169055613413565b6000878152600c60205260408120600101805484929061340d9084906144c6565b90915550505b60a08681015187516040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301526044820192909252606481018690526084810193909352600060a4840152169063f242432a9060c401600060405180830381600087803b15801561349c57600080fd5b505af11580156134b0573d6000803e3d6000fd5b505050506123e28660a001518487613bfa565b34156134fb576040517ff5402ff900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a08501516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063e985e9c590604401602060405180830381865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a91906141a4565b6135c0576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a085015185516040517efdd58e00000000000000000000000000000000000000000000000000000000815283926001600160a01b03169162fdd58e9161361f9189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa15801561363c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366091906141c1565b1015613698576040517f69a687a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460e0015160400151156137465760c08501516001600160a01b03166000908152600a60205260409020548211156136fc576040517f5a36e74900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816003600082825461370e91906144c6565b90915550506001600160a01b0383166000908152600a60205260408120805484929061373b9084906144c6565b909155506138da9050565b60055460c08601516040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152849291909116906370a0823190602401602060405180830381865afa1580156137b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d591906141c1565b101561380d576040517f51ad550100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460c08601516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa15801561387e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a291906141c1565b10156138da576040517f08cd56d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008186602001516138ec91906144c6565b9050806000036139b057608086015160c08701516001600160a01b03166000908152600e6020526040902061392a9167ffffffffffffffff16612d22565b6000878152600c602052604081208181556001810182905560028101919091556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001690556139d7565b6000878152600c6020526040812060010180548492906139d19084906144c6565b90915550505b60a08681015187516040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301526044820192909252606481018690526084810193909352600060a4840152169063f242432a9060c401600060405180830381600087803b158015613a6057600080fd5b505af1158015613a74573d6000803e3d6000fd5b505050508560e001516040015115613a9a57613a958660a001518487613bfa565b6123e2565b6005546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301526044820186905260009216906323b872dd906064016020604051808303816000875af1158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3191906141a4565b905080613b6a576040517fc22170a400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015613bc957600080fd5b505af1158015613bdd573d6000803e3d6000fd5b50505050613bf08760a001518588613bfa565b5050505050505050565b6006547501000000000000000000000000000000000000000000900460ff1615613c8c576000806000613c2d8686613c96565b925092509250613c3d8482612b8c565b8115613c68576001600160a01b03808716600090815260086020526040902054613c68911683612b8c565b8215613c8457600654613c84906001600160a01b031684612b8c565b505050505050565b6123238183612b8c565b6001600160a01b03821660009081526009602052604081205481908190819015613cd8576001600160a01b038616600090815260096020526040902054613cdc565b6002545b90506000612710613ceb61122f565b613cf59088614237565b613cff9190614274565b90506000612710613d108489614237565b613d1a9190614274565b90506000613d2882846142af565b613d3290896144c6565b9299919850919650945050505050565b600060208284031215613d5457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613dc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b613dd0828251613d8a565b6020818101511515908301526040908101511515910152565b888152602081018890526fffffffffffffffffffffffffffffffff8716604082015267ffffffffffffffff8681166060830152851660808201526001600160a01b0384811660a0830152831660c08201526101408101613e4c60e0830184613dc5565b9998505050505050505050565b6001600160a01b0381168114612b2f57600080fd5b600060208284031215613e8057600080fd5b8135613e8b81613e59565b9392505050565b60008060008060808587031215613ea857600080fd5b8435613eb381613e59565b93506020850135613ec381613e59565b93969395505050506040820135916060013590565b60008060408385031215613eeb57600080fd5b8235613ef681613e59565b946020939093013593505050565b8015158114612b2f57600080fd5b60008060008060808587031215613f2857600080fd5b8435613f3381613e59565b93506020850135613f4381613f04565b92506040850135613f5381613e59565b9396929550929360600135925050565b60008060408385031215613f7657600080fd5b8235613f8181613e59565b91506020830135613f9181613f04565b809150509250929050565b600060208284031215613fae57600080fd5b8135613e8b81613f04565b60006101408201905082518252602083015160208301526fffffffffffffffffffffffffffffffff6040840151166040830152606083015167ffffffffffffffff808216606085015280608086015116608085015250506001600160a01b0360a08401511660a083015260c083015161403d60c08401826001600160a01b03169052565b5060e083015161405060e0840182613dc5565b5092915050565b60008060008060008086880361010081121561407257600080fd5b873561407d81613e59565b965060208801359550604088013594506060808901359450608089013593507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60820112156140ca57600080fd5b5060a0870190509295509295509295565b6000806000606084860312156140f057600080fd5b83356140fb81613e59565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b818110156141485783518352928401929184019160010161412c565b50909695505050505050565b6000806040838503121561416757600080fd5b823561417281613e59565b91506020830135613f9181613e59565b6000806040838503121561419557600080fd5b50508035926020909101359150565b6000602082840312156141b657600080fd5b8151613e8b81613f04565b6000602082840312156141d357600080fd5b5051919050565b600080604083850312156141ed57600080fd5b82516141f881613e59565b6020939093015192949293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426f5761426f614208565b500290565b6000826142aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082198211156142c2576142c2614208565b500190565b8681526fffffffffffffffffffffffffffffffff861660208201526001600160a01b038516604082015267ffffffffffffffff8416606082015260808101839052610100810161431a60a0830184613dc5565b979650505050505050565b80356002811061433457600080fd5b919050565b60006020828403121561434b57600080fd5b613e8b82614325565b60006060828403121561436657600080fd5b6040516060810181811067ffffffffffffffff821117156143b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040526143bc83614325565b815260208301356143cc81613f04565b602082015260408301356143df81613f04565b60408201529392505050565b6000610100820190508782528660208301526001600160a01b038616604083015284606083015283608083015261442d60a0830161442885614325565b613d8a565b602083013561443b81613f04565b151560c0830152604083013561445081613f04565b80151560e084015250979650505050505050565b8781526fffffffffffffffffffffffffffffffff871660208201526001600160a01b0386811660408301528516606082015260e081016144a76080830186613d8a565b67ffffffffffffffff9390931660a082015260c0015295945050505050565b6000828210156144d8576144d8614208565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207592d96cccc879b4ee244b380eea79fe34d366b2197a11c37a737b3f8031803964736f6c634300080e0033000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000089b280ccd5bc535a7d8257b0f8f03bb6b9b71361

Deployed Bytecode

0x6080604052600436106103005760003560e01c80637cfb41b81161018f578063b29a8140116100e1578063d3810e241161008a578063e4c8be8c11610064578063e4c8be8c1461099a578063e721152c146109ba578063f2fde38b146109da57600080fd5b8063d3810e241461093d578063dd3cfd3214610953578063ddaa54371461098757600080fd5b8063c8d70062116100bb578063c8d70062146108bd578063cbde6405146108ea578063cd653ee61461090a57600080fd5b8063b29a814014610847578063b3a4f97b14610867578063c62fc6771461089d57600080fd5b80638da5cb5b11610143578063a3b137991161011d578063a3b13799146107f1578063ab00a98e1461081e578063affed0e01461083157600080fd5b80638da5cb5b1461079d5780638f70ccf7146107bb5780639011f8fe146107db57600080fd5b806382ff441c1161017457806382ff441c14610744578063846f45a01461054c5780638a6169ae1461076457600080fd5b80637cfb41b81461070457806382bfefc81461072457600080fd5b80633fd9d6ff1161025357806361feacff116101fc578063715018a6116101d6578063715018a614610686578063745b69ca1461069b57806376be1585146106d457600080fd5b806361feacff14610631578063675ef65c146106465780636b872a961461066657600080fd5b806353e23e2e1161022d57806353e23e2e146105aa5780635674cdae146105dc578063599b0a401461061157600080fd5b80633fd9d6ff1461054c5780634a5c213c146105825780634b0bddd21461058a57600080fd5b80631fbfce18116102b557806324f377641161028f57806324f37764146104ec5780632581b05c1461050c5780632ef0a6c21461052c57600080fd5b80631fbfce181461047d57806320184b11146104aa5780632288739b146104cc57600080fd5b80631cbad4db116102e65780631cbad4db146103895780631dfbbe08146103c45780631e02778f1461042f57600080fd5b80621624201461030c5780631bb768781461034957600080fd5b3661030757005b600080fd5b34801561031857600080fd5b5061032c610327366004613d42565b6109fa565b604051610340989796959493929190613de9565b60405180910390f35b34801561035557600080fd5b50610379610364366004613e6e565b60076020526000908152604090205460ff1681565b6040519015158152602001610340565b34801561039557600080fd5b506103b66103a4366004613e6e565b600a6020526000908152604090205481565b604051908152602001610340565b3480156103d057600080fd5b506103b66103df366004613e92565b604080516001600160a01b039586166020808301919091529490951685820152606085019290925260808401524260a0808501919091528151808503909101815260c09093019052815191012090565b34801561043b57600080fd5b5061046561044a366004613e6e565b6008602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610340565b34801561048957600080fd5b506103b6610498366004613e6e565b60096020526000908152604090205481565b3480156104b657600080fd5b506104ca6104c5366004613ed8565b610aec565b005b3480156104d857600080fd5b50600654610465906001600160a01b031681565b3480156104f857600080fd5b506104ca610507366004613ed8565b610be1565b34801561051857600080fd5b50610379610527366004613d42565b610bf7565b34801561053857600080fd5b506104ca610547366004613f12565b610dd5565b34801561055857600080fd5b506103b6610567366004613e6e565b6001600160a01b03166000908152600a602052604090205490565b6104ca61109a565b34801561059657600080fd5b506104ca6105a5366004613f63565b61118a565b3480156105b657600080fd5b506006546103799074010000000000000000000000000000000000000000900460ff1681565b3480156105e857600080fd5b506006546103799077010000000000000000000000000000000000000000000000900460ff1681565b34801561061d57600080fd5b506104ca61062c366004613f9c565b6111db565b34801561063d57600080fd5b506103b661122f565b34801561065257600080fd5b506104ca610661366004613f9c565b6112bb565b34801561067257600080fd5b506104ca610681366004613d42565b61130e565b34801561069257600080fd5b506104ca611417565b3480156106a757600080fd5b506104656106b6366004613e6e565b6001600160a01b039081166000908152600860205260409020541690565b3480156106e057600080fd5b506103796106ef366004613e6e565b600b6020526000908152604090205460ff1681565b34801561071057600080fd5b506104ca61071f366004613d42565b61142b565b34801561073057600080fd5b50600554610465906001600160a01b031681565b34801561075057600080fd5b506104ca61075f366004613f63565b6118f1565b34801561077057600080fd5b5061037961077f366004613e6e565b6001600160a01b031660009081526007602052604090205460ff1690565b3480156107a957600080fd5b506001546001600160a01b0316610465565b3480156107c757600080fd5b506104ca6107d6366004613f9c565b611a08565b3480156107e757600080fd5b506103b660035481565b3480156107fd57600080fd5b5061081161080c366004613d42565b611abc565b6040516103409190613fb9565b6104ca61082c366004614057565b611c37565b34801561083d57600080fd5b506103b660045481565b34801561085357600080fd5b506104ca610862366004613ed8565b612271565b34801561087357600080fd5b506103b6610882366004613e6e565b6001600160a01b031660009081526009602052604090205490565b3480156108a957600080fd5b506104ca6108b83660046140db565b612328565b3480156108c957600080fd5b506108dd6108d8366004613e6e565b6123eb565b6040516103409190614110565b3480156108f657600080fd5b506104ca610905366004614154565b612457565b34801561091657600080fd5b50600654610379907501000000000000000000000000000000000000000000900460ff1681565b34801561094957600080fd5b506103b660025481565b34801561095f57600080fd5b5060065461037990760100000000000000000000000000000000000000000000900460ff1681565b6104ca610995366004614182565b6124fb565b3480156109a657600080fd5b506104ca6109b5366004613d42565b6129d9565b3480156109c657600080fd5b506108dd6109d5366004613e6e565b612a38565b3480156109e657600080fd5b506104ca6109f5366004613e6e565b612aa2565b600c60205260009081526040908190208054600180830154600284015460038501546004860154875160608101909852600587018054969894976fffffffffffffffffffffffffffffffff85169767ffffffffffffffff7001000000000000000000000000000000008704811698780100000000000000000000000000000000000000000000000090970416966001600160a01b039586169694909516949193919291839160ff1690811115610ab257610ab2613d5b565b6001811115610ac357610ac3613d5b565b8152905460ff610100820481161515602084015262010000909104161515604090910152905088565b600654600090760100000000000000000000000000000000000000000000900460ff168015610b3457506001600160a01b038381166000908152600860205260409020541633145b9050610b486001546001600160a01b031690565b6001600160a01b0316336001600160a01b03161480610b645750805b610b6d57600080fd5b6103e8821115610bc45760405162461bcd60e51b815260206004820152600b60248201527f4d6178203130252066656500000000000000000000000000000000000000000060448201526064015b60405180910390fd5b506001600160a01b03909116600090815260096020526040902055565b610be9612b32565b610bf38282612b8c565b5050565b600080610c0383611abc565b60a08101519091506000600160e0840151516001811115610c2657610c26613d5b565b14610c32576001610cc1565b60c08301516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201523060248201529083169063e985e9c590604401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906141a4565b90506000600160e0850151516001811115610cde57610cde613d5b565b14610cea576001610d8f565b602084015160c085015185516040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b0387169262fdd58e92610d4b926004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8c91906141c1565b10155b905042846060015167ffffffffffffffff161180610db95750606084015167ffffffffffffffff16155b8015610dc25750815b8015610dcb5750805b9695505050505050565b336000908152600b602052604090205460ff1680610dfd57506001546001600160a01b031633145b610e33576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f2a55205a000000000000000000000000000000000000000000000000000000006004820152819083906001600160a01b038716906301ffc9a790602401602060405180830381865afa158015610eb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed891906141a4565b15610fce576040517f2a55205a00000000000000000000000000000000000000000000000000000000815260016004820152670de0b6b3a7640000602482015260009081906001600160a01b03891690632a55205a906044016040805180830381865afa158015610f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7191906141da565b90935083925090506103e8670de0b6b3a7640000610f9183612710614237565b610f9b9190614274565b1015610fc557670de0b6b3a7640000610fb682612710614237565b610fc09190614274565b610fc9565b6103e85b935050505b6001600160a01b03868116600081815260076020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168b15159081179091556008835281842080547fffffffffffffffffffffffff000000000000000000000000000000000000000016888816179055600983529281902087905580518881524292810192909252938816939192917f3ecb245e4afa53e8cddb2d4454c162ddda6c50309dc53e13fe646054f3112ad5910160405180910390a4505050505050565b6002600054036110ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065477010000000000000000000000000000000000000000000000900460ff16611148576040517fee9552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b346003600082825461115a91906142af565b9091555050336000908152600a60205260408120805434929061117e9084906142af565b90915550506001600055565b611192612b32565b6001600160a01b03919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6111e3612b32565b60068054911515760100000000000000000000000000000000000000000000027fffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffff909216919091179055565b600654604080517f1df4ccfc00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691631df4ccfc9160048083019260209291908290030181865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906141c1565b905090565b6112c3612b32565b600680549115157501000000000000000000000000000000000000000000027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff909216919091179055565b6002600054036113605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065477010000000000000000000000000000000000000000000000900460ff166113bc576040517fee9552e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600a6020526040902054811115611405576040517f9ee0f36100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61140f3382612c2f565b506001600055565b61141f612b32565b6114296000612cb8565b565b60026000540361147d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b60026000818155828152600c602090815260408083208151610100810183528154815260018083015494820194909452948101546fffffffffffffffffffffffffffffffff81168684015267ffffffffffffffff70010000000000000000000000000000000082048116606080890191909152780100000000000000000000000000000000000000000000000090920416608087015260038201546001600160a01b0390811660a088015260048301541660c08701528251908101909252600581018054949594919360e086019392839160ff9091169081111561156357611563613d5b565b600181111561157457611574613d5b565b8152905460ff6101008204811615156020840152620100009091041615156040918201529152820151919250506fffffffffffffffffffffffffffffffff166000036115ec576040517fbfe73a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c08101516000906001600160a01b03163314806116195750336000908152600b602052604090205460ff165b905060008260e00151604001511580156116585750606083015167ffffffffffffffff1615801590611658575042836060015167ffffffffffffffff16105b905081158015611666575080155b1561169d576040517f7f1cb4d200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836020015184604001516fffffffffffffffffffffffffffffffff166116c59190614237565b90508360e00151604001518015611702575060c08401516001600160a01b03166000908152600a6020526040902054811180611702575080600354105b15611739576040517f9ee0f36100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000858152600c6020526040812081815560018101829055600281018290556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016905560e08501515160018111156117d0576117d0613d5b565b0361180e57608084015160c08501516001600160a01b03166000908152600e602052604090206118099167ffffffffffffffff16612d22565b611860565b600160e085015151600181111561182757611827613d5b565b0361186057608084015160c08501516001600160a01b03166000908152600d602052604090206118609167ffffffffffffffff16612d22565b8360e00151604001511561187c5761187c8460c0015182612c2f565b83600001518460a001516001600160a01b0316867f10ef23d623cfc3113d40783c42c2705b0cf96ddb56cca58b0da7f3923c1f4def876020015188604001518960c001518a60600151428c60e001516040516118dd969594939291906142c7565b60405180910390a450506001600055505050565b336000908152600b602052604090205460ff168061191957506001546001600160a01b031633145b61194f576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821660009081526007602052604090205481151560ff9091161515036119bf5760405162461bcd60e51b815260206004820152601a60248201527f416c72656164792073657420746f20746861742076616c75652e0000000000006044820152606401610bbb565b6001600160a01b0391909116600090815260076020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611a10612b32565b801515600660149054906101000a900460ff16151503611a725760405162461bcd60e51b815260206004820152601a60248201527f416c72656164792073657420746f20746861742076616c75652e0000000000006044820152606401610bbb565b6006805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b611b1760408051610100810182526000808252602080830182905282840182905260608084018390526080840183905260a0840183905260c0840183905284519081018552828152908101829052928301529060e082015290565b6000828152600c6020908152604091829020825161010081018452815481526001808301549382019390935260028201546fffffffffffffffffffffffffffffffff81168286015267ffffffffffffffff70010000000000000000000000000000000082048116606080850191909152780100000000000000000000000000000000000000000000000090920416608083015260038301546001600160a01b0390811660a084015260048401541660c083015284519081019094526005820180549194929360e086019392839160ff90911690811115611bf957611bf9613d5b565b6001811115611c0a57611c0a613d5b565b8152905460ff61010082048116151560208401526201000090910416151560409091015290525092915050565b600260005403611c895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065474010000000000000000000000000000000000000000900460ff1615611ce3576040517fc8786f1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03861660009081526007602052604090205460ff16611d35576040517f7994525d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115801590611d4357504282105b15611d7a576040517f31d2b9d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611db4576040517f3c7243d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6fffffffffffffffffffffffffffffffff831180611dd9575067ffffffffffffffff82115b15611e10576040517fb2cce0ba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611e1f6020830183614339565b6001811115611e3057611e30613d5b565b03611eb2576000611e418585614237565b9050611e5b81611e5636859003850185614354565b612d97565b611e6b6060830160408401613f9c565b15611eac578060036000828254611e8291906142af565b9091555050336000908152600a602052604081208054839290611ea69084906142af565b90915550505b50611ecd565b611ecd86338787611ec836879003870187614354565b612f7a565b6000611f3e3360048054600101908190556040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084901b1660208201524260348201526054810191909152600090607401604051602081830303815290604052805190602001209050919050565b9050600080611f506020850185614339565b6001811115611f6157611f61613d5b565b03611f8f5750336000908152600e602090815260408220805460018101825590835291208101829055611fb4565b50336000908152600d6020908152604082208054600181018255908352912081018290555b604051806101000160405280888152602001878152602001866fffffffffffffffffffffffffffffffff1681526020018567ffffffffffffffff1681526020018267ffffffffffffffff168152602001896001600160a01b03168152602001336001600160a01b03168152602001848036038101906120339190614354565b90526000838152600c6020908152604091829020835181559083015160018083019190915591830151600282018054606086015160808701516fffffffffffffffffffffffffffffffff9094167fffffffffffffffff0000000000000000000000000000000000000000000000009092169190911770010000000000000000000000000000000067ffffffffffffffff928316021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000919093160291909117905560a08301516003820180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b039384161790915560c0850151600484018054909216921691909117905560e0830151805160058301805493949293909283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169083818111156121a4576121a4613d5b565b021790555060208201518154604093840151151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff92151561010002929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff90911617179055518992506001600160a01b038b16915084907f461f1226d03bc6efc5d70cccfc92b7d5b029a296257c471a5afe67aafc1823f39061225a908b908b9033908c9042908d906143eb565b60405180910390a450506001600055505050505050565b612279612b32565b816001600160a01b031663a9059cbb61229a6001546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af11580156122ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061232391906141a4565b505050565b612330612b32565b826001600160a01b031663f242432a306123526001546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018590526064810184905260a06084820152600060a482015260c401600060405180830381600087803b1580156123ce57600080fd5b505af11580156123e2573d6000803e3d6000fd5b50505050505050565b6001600160a01b0381166000908152600d602090815260409182902080548351818402810184019094528084526060939283018282801561244b57602002820191906000526020600020905b815481526020019060010190808311612437575b50505050509050919050565b336000908152600b602052604090205460ff168061247f57506001546001600160a01b031633145b6124b5576040517f06ebaeee00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03918216600090815260086020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909216179055565b60026000540361254d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610bbb565b600260005560065474010000000000000000000000000000000000000000900460ff16156125a7576040517fc8786f1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600c60209081526040808320815161010081018352815481526001808301549482019490945260028201546fffffffffffffffffffffffffffffffff81168285015267ffffffffffffffff70010000000000000000000000000000000082048116606080850191909152780100000000000000000000000000000000000000000000000090920416608083015260038301546001600160a01b0390811660a084015260048401541660c083015283519081019093526005820180549194929360e08601939092839160ff9091169081111561268957612689613d5b565b600181111561269a5761269a613d5b565b8152905460ff61010082048116151560208085019190915262010000909204811615156040938401529290935260a08501516001600160a01b03166000908152600790935290912054929350919091169050612722576040517f7994525d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80604001516fffffffffffffffffffffffffffffffff16600003612772576040517fbfe73a8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606081015167ffffffffffffffff161580159061279c575042816060015167ffffffffffffffff16105b156127d3576040517f31d2b9d400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060e00151602001511580156127ed575080602001518214155b15612824576040517fd3503e7b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060200151821115612862576040517f9286936000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008282604001516fffffffffffffffffffffffffffffffff166128869190614237565b9050600080600160e08501515160018111156128a4576128a4613d5b565b146128b457338460c001516128bb565b8360c00151335b9092509050600160e08501515160018111156128d9576128d9613d5b565b036128f1576128ec86858484878a61313f565b612965565b600060e085015151600181111561290a5761290a613d5b565b0361291d576128ec86858484878a6134c3565b60405162461bcd60e51b815260206004820152601760248201527f547261646520696e20696e76616c69642073746174652e0000000000000000006044820152606401610bbb565b83600001518460a001516001600160a01b0316877f1c4216aeda1e79aa1a63f9187b049c4bd3edc14993105c6b5da49f9ef6948ed188886040015187878b60e00151600001518c60600151426040516129c49796959493929190614464565b60405180910390a45050600160005550505050565b6129e1612b32565b6103e8811115612a335760405162461bcd60e51b815260206004820152600b60248201527f4d617820313025206665650000000000000000000000000000000000000000006044820152606401610bbb565b600255565b6001600160a01b0381166000908152600e602090815260409182902080548351818402810184019094528084526060939283018282801561244b57602002820191906000526020600020908154815260200190600101908083116124375750505050509050919050565b612aaa612b32565b6001600160a01b038116612b265760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610bbb565b612b2f81612cb8565b50565b6001546001600160a01b031633146114295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610bbb565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612bd9576040519150601f19603f3d011682016040523d82523d6000602084013e612bde565b606091505b50509050806123235760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e000000000000000000000000000000006044820152606401610bbb565b8060036000828254612c4191906144c6565b90915550506001600160a01b0382166000908152600a602052604081208054839290612c6e9084906144c6565b90915550612c7e90508282612b8c565b60405181906001600160a01b038416907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d90600090a35050565b600180546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b81548290612d32906001906144c6565b81548110612d4257612d426144dd565b9060005260206000200154828281548110612d5f57612d5f6144dd565b906000526020600020018190555081805480612d7d57612d7d61450c565b600190038181906000526020600020016000905590555050565b80604001518015612da757508134105b15612dde576040517f94a34d5200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060400151158015612e7857506005546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015283916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015612e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7691906141c1565b105b15612eaf576040517f7c1042ab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060400151158015612f4357506005546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015612f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f4191906141c1565b105b15610bf3576040517f82e26b5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517efdd58e0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526024820185905283919087169062fdd58e90604401602060405180830381865afa158015612fe1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300591906141c1565b101561303d576040517f3a6e75da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015230602483015286169063e985e9c590604401602060405180830381865afa1580156130a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130c691906141a4565b6130fc576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015115613138576040517fe365db0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60a08501516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063e985e9c590604401602060405180830381865afa1580156131aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ce91906141a4565b613204576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a085015185516040517efdd58e00000000000000000000000000000000000000000000000000000000815283926001600160a01b03169162fdd58e916132639189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015613280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132a491906141c1565b10156132dc576040517f69a687a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81341015613316576040517fea10f23700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081866020015161332891906144c6565b9050806000036133ec57608086015160c08701516001600160a01b03166000908152600d602052604090206133669167ffffffffffffffff16612d22565b6000878152600c602052604081208181556001810182905560028101919091556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000169055613413565b6000878152600c60205260408120600101805484929061340d9084906144c6565b90915550505b60a08681015187516040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301526044820192909252606481018690526084810193909352600060a4840152169063f242432a9060c401600060405180830381600087803b15801561349c57600080fd5b505af11580156134b0573d6000803e3d6000fd5b505050506123e28660a001518487613bfa565b34156134fb576040517ff5402ff900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a08501516040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301529091169063e985e9c590604401602060405180830381865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a91906141a4565b6135c0576040517fa20d0c2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60a085015185516040517efdd58e00000000000000000000000000000000000000000000000000000000815283926001600160a01b03169162fdd58e9161361f9189916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa15801561363c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366091906141c1565b1015613698576040517f69a687a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460e0015160400151156137465760c08501516001600160a01b03166000908152600a60205260409020548211156136fc576040517f5a36e74900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816003600082825461370e91906144c6565b90915550506001600160a01b0383166000908152600a60205260408120805484929061373b9084906144c6565b909155506138da9050565b60055460c08601516040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152849291909116906370a0823190602401602060405180830381865afa1580156137b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137d591906141c1565b101561380d576040517f51ad550100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055460c08601516040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa15801561387e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a291906141c1565b10156138da576040517f08cd56d600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008186602001516138ec91906144c6565b9050806000036139b057608086015160c08701516001600160a01b03166000908152600e6020526040902061392a9167ffffffffffffffff16612d22565b6000878152600c602052604081208181556001810182905560028101919091556003810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600482018054909116905560050180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001690556139d7565b6000878152600c6020526040812060010180548492906139d19084906144c6565b90915550505b60a08681015187516040517ff242432a0000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301526044820192909252606481018690526084810193909352600060a4840152169063f242432a9060c401600060405180830381600087803b158015613a6057600080fd5b505af1158015613a74573d6000803e3d6000fd5b505050508560e001516040015115613a9a57613a958660a001518487613bfa565b6123e2565b6005546040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301523060248301526044820186905260009216906323b872dd906064016020604051808303816000875af1158015613b0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3191906141a4565b905080613b6a576040517fc22170a400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015613bc957600080fd5b505af1158015613bdd573d6000803e3d6000fd5b50505050613bf08760a001518588613bfa565b5050505050505050565b6006547501000000000000000000000000000000000000000000900460ff1615613c8c576000806000613c2d8686613c96565b925092509250613c3d8482612b8c565b8115613c68576001600160a01b03808716600090815260086020526040902054613c68911683612b8c565b8215613c8457600654613c84906001600160a01b031684612b8c565b505050505050565b6123238183612b8c565b6001600160a01b03821660009081526009602052604081205481908190819015613cd8576001600160a01b038616600090815260096020526040902054613cdc565b6002545b90506000612710613ceb61122f565b613cf59088614237565b613cff9190614274565b90506000612710613d108489614237565b613d1a9190614274565b90506000613d2882846142af565b613d3290896144c6565b9299919850919650945050505050565b600060208284031215613d5457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110613dc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b613dd0828251613d8a565b6020818101511515908301526040908101511515910152565b888152602081018890526fffffffffffffffffffffffffffffffff8716604082015267ffffffffffffffff8681166060830152851660808201526001600160a01b0384811660a0830152831660c08201526101408101613e4c60e0830184613dc5565b9998505050505050505050565b6001600160a01b0381168114612b2f57600080fd5b600060208284031215613e8057600080fd5b8135613e8b81613e59565b9392505050565b60008060008060808587031215613ea857600080fd5b8435613eb381613e59565b93506020850135613ec381613e59565b93969395505050506040820135916060013590565b60008060408385031215613eeb57600080fd5b8235613ef681613e59565b946020939093013593505050565b8015158114612b2f57600080fd5b60008060008060808587031215613f2857600080fd5b8435613f3381613e59565b93506020850135613f4381613f04565b92506040850135613f5381613e59565b9396929550929360600135925050565b60008060408385031215613f7657600080fd5b8235613f8181613e59565b91506020830135613f9181613f04565b809150509250929050565b600060208284031215613fae57600080fd5b8135613e8b81613f04565b60006101408201905082518252602083015160208301526fffffffffffffffffffffffffffffffff6040840151166040830152606083015167ffffffffffffffff808216606085015280608086015116608085015250506001600160a01b0360a08401511660a083015260c083015161403d60c08401826001600160a01b03169052565b5060e083015161405060e0840182613dc5565b5092915050565b60008060008060008086880361010081121561407257600080fd5b873561407d81613e59565b965060208801359550604088013594506060808901359450608089013593507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60820112156140ca57600080fd5b5060a0870190509295509295509295565b6000806000606084860312156140f057600080fd5b83356140fb81613e59565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b818110156141485783518352928401929184019160010161412c565b50909695505050505050565b6000806040838503121561416757600080fd5b823561417281613e59565b91506020830135613f9181613e59565b6000806040838503121561419557600080fd5b50508035926020909101359150565b6000602082840312156141b657600080fd5b8151613e8b81613f04565b6000602082840312156141d357600080fd5b5051919050565b600080604083850312156141ed57600080fd5b82516141f881613e59565b6020939093015192949293505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561426f5761426f614208565b500290565b6000826142aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082198211156142c2576142c2614208565b500190565b8681526fffffffffffffffffffffffffffffffff861660208201526001600160a01b038516604082015267ffffffffffffffff8416606082015260808101839052610100810161431a60a0830184613dc5565b979650505050505050565b80356002811061433457600080fd5b919050565b60006020828403121561434b57600080fd5b613e8b82614325565b60006060828403121561436657600080fd5b6040516060810181811067ffffffffffffffff821117156143b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040526143bc83614325565b815260208301356143cc81613f04565b602082015260408301356143df81613f04565b60408201529392505050565b6000610100820190508782528660208301526001600160a01b038616604083015284606083015283608083015261442d60a0830161442885614325565b613d8a565b602083013561443b81613f04565b151560c0830152604083013561445081613f04565b80151560e084015250979650505050505050565b8781526fffffffffffffffffffffffffffffffff871660208201526001600160a01b0386811660408301528516606082015260e081016144a76080830186613d8a565b67ffffffffffffffff9390931660a082015260c0015295945050505050565b6000828210156144d8576144d8614208565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212207592d96cccc879b4ee244b380eea79fe34d366b2197a11c37a737b3f8031803964736f6c634300080e0033

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

000000000000000000000000acc15dc74880c9944775448304b263d191c6077f00000000000000000000000089b280ccd5bc535a7d8257b0f8f03bb6b9b71361

-----Decoded View---------------
Arg [0] : _token (address): 0xAcc15dC74880C9944775448304B263D191c6077F
Arg [1] : _beanFeeProcessor (address): 0x89b280cCD5Bc535A7D8257b0f8F03BB6B9b71361

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Arg [1] : 00000000000000000000000089b280ccd5bc535a7d8257b0f8f03bb6b9b71361


Block Transaction Gas Used Reward
view all blocks collator

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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  ]
[ 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.