Source Code
Overview
GLMR Balance
GLMR Value
$0.18 (@ $0.02/GLMR)Latest 25 from a total of 345 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Recover GAS | 4421649 | 872 days ago | IN | 0 GLMR | 0.00948324 | ||||
| Set Trading | 4421564 | 872 days ago | IN | 0 GLMR | 0.0101537 | ||||
| Cancel Trade | 4421557 | 872 days ago | IN | 0 GLMR | 0.0111549 | ||||
| Cancel Trade | 4421556 | 872 days ago | IN | 0 GLMR | 0.01078652 | ||||
| Cancel Trade | 4421554 | 872 days ago | IN | 0 GLMR | 0.0108495 | ||||
| Cancel Trade | 4421552 | 872 days ago | IN | 0 GLMR | 0.01087604 | ||||
| Cancel Trade | 4421551 | 872 days ago | IN | 0 GLMR | 0.0102715 | ||||
| Open Trade | 4421376 | 872 days ago | IN | 0 GLMR | 0.02704092 | ||||
| Accept Trade | 4421359 | 872 days ago | IN | 0 GLMR | 0.02555021 | ||||
| Open Trade | 4421354 | 872 days ago | IN | 1.1 GLMR | 0.03081775 | ||||
| Cancel Trade | 4421354 | 872 days ago | IN | 0 GLMR | 0.00993454 | ||||
| Cancel Trade | 4421345 | 872 days ago | IN | 0 GLMR | 0.00994207 | ||||
| Accept Trade | 4421316 | 872 days ago | IN | 10 GLMR | 0.0279782 | ||||
| Open Trade | 4421259 | 872 days ago | IN | 1 GLMR | 0.03085599 | ||||
| Open Trade | 4421250 | 872 days ago | IN | 1 GLMR | 0.03081999 | ||||
| Accept Trade | 4420610 | 872 days ago | IN | 0 GLMR | 0.02714467 | ||||
| Open Trade | 4420604 | 872 days ago | IN | 0 GLMR | 0.02856306 | ||||
| Open Trade | 4420602 | 872 days ago | IN | 0 GLMR | 0.0285959 | ||||
| Open Trade | 4417820 | 872 days ago | IN | 0 GLMR | 0.02633187 | ||||
| Open Trade | 4417812 | 872 days ago | IN | 0 GLMR | 0.02633337 | ||||
| Open Trade | 4417805 | 872 days ago | IN | 0 GLMR | 0.02633411 | ||||
| Open Trade | 4417798 | 872 days ago | IN | 0 GLMR | 0.02846937 | ||||
| Open Trade | 4416717 | 873 days ago | IN | 50 GLMR | 0.02911935 | ||||
| Open Trade | 4416275 | 873 days ago | IN | 0 GLMR | 0.02952876 | ||||
| Open Trade | 4416272 | 873 days ago | IN | 0 GLMR | 0.02961987 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 4421649 | 872 days ago | 143.5 GLMR | ||||
| 4421557 | 872 days ago | 20 GLMR | ||||
| 4421556 | 872 days ago | 10 GLMR | ||||
| 4421554 | 872 days ago | 1 GLMR | ||||
| 4421552 | 872 days ago | 1 GLMR | ||||
| 4421551 | 872 days ago | 6 wei | ||||
| 4421359 | 872 days ago | 0.033 GLMR | ||||
| 4421359 | 872 days ago | 0.055 GLMR | ||||
| 4421359 | 872 days ago | 1.012 GLMR | ||||
| 4421354 | 872 days ago | 1 GLMR | ||||
| 4421345 | 872 days ago | 1 GLMR | ||||
| 4421316 | 872 days ago | 0.3 GLMR | ||||
| 4421316 | 872 days ago | 0.5 GLMR | ||||
| 4421316 | 872 days ago | 9.2 GLMR | ||||
| 4420610 | 872 days ago | 1.5 GLMR | ||||
| 4420610 | 872 days ago | 2.5 GLMR | ||||
| 4420610 | 872 days ago | 46 GLMR | ||||
| 4413740 | 873 days ago | 0.525 GLMR | ||||
| 4413740 | 873 days ago | 0.875 GLMR | ||||
| 4413740 | 873 days ago | 16.1 GLMR | ||||
| 4413359 | 873 days ago | 50 GLMR | ||||
| 4412245 | 873 days ago | 2.025 GLMR | ||||
| 4412245 | 873 days ago | 3.375 GLMR | ||||
| 4412245 | 873 days ago | 62.1 GLMR | ||||
| 4412241 | 873 days ago | 0.225 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FungibleBeanieMarketV1
Compiler Version
v0.8.14+commit.80d49f37
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//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);
}// 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);
}{
"optimizer": {
"enabled": true,
"runs": 10000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.18
Net Worth in GLMR
Token Allocations
GLMR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| GLMR | 100.00% | $0.017781 | 10 | $0.177812 |
Loading...
Loading
Loading...
Loading
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.