Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 5 from a total of 5 transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NFTingOffer
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "../interface/INFTingConfig.sol";
import "./NFTingBase.sol";
contract NFTingOffer is NFTingBase {
using Counters for Counters.Counter;
enum NFTingOfferState {
ACTIVE,
CANCELED,
ACCEPTED,
DECLINED
}
struct Offer {
NFTingOfferState state;
address nftAddress;
uint256 tokenId;
uint256 amount;
uint256 price;
address payable buyer;
address payable seller;
}
Counters.Counter private currentOfferId;
mapping(uint256 => Offer) internal offers;
event OfferCreated(
uint256 _offerId,
address indexed _nftAddress,
uint256 _tokenId,
uint256 _amount,
address indexed _buyer,
uint256 _price,
address indexed _seller
);
event OfferUpdated(uint256 _offerId, uint256 _newPrice);
event OfferAccepted(uint256 _offerId);
event OfferDeclined(uint256 _offerId);
event OfferCancelled(uint256 _offerId);
modifier isValidOffer(uint256 _offerId) {
Offer storage offer = offers[_offerId];
if (offer.seller == address(0)) {
revert NotExistingOffer(_offerId);
}
_;
}
function makeOffer(
address _nftAddress,
uint256 _tokenId,
uint256 _amount,
address _seller
)
external
payable
onlyNFT(_nftAddress)
isTokenOwnerOrApproved(_nftAddress, _tokenId, _amount, _seller)
{
if (_seller == msg.sender) {
revert InvalidAddressProvided(_seller);
} else if (msg.value == 0) {
revert PriceMustBeAboveZero(msg.value);
} else if (
_amount == 0 ||
(_amount > 1 &&
_supportsInterface(_nftAddress, INTERFACE_ID_ERC721))
) {
revert InvalidAmountOfTokens(_amount);
}
currentOfferId.increment();
uint256 offerId = currentOfferId.current();
Offer storage newOffer = offers[offerId];
newOffer.nftAddress = _nftAddress;
newOffer.tokenId = _tokenId;
newOffer.amount = _amount;
newOffer.buyer = payable(_msgSender());
newOffer.price = msg.value;
newOffer.seller = payable(_seller);
newOffer.state = NFTingOfferState.ACTIVE;
emit OfferCreated(
offerId,
_nftAddress,
_tokenId,
_amount,
_msgSender(),
msg.value,
_seller
);
}
function updateOffer(uint256 _offerId, uint256 _newPrice)
external
payable
nonReentrant
isValidOffer(_offerId)
{
Offer memory offer = offers[_offerId];
offers[_offerId].price = _newPrice;
if (offer.buyer != _msgSender()) {
revert PermissionDenied();
} else if (offer.state != NFTingOfferState.ACTIVE) {
revert InvalidOfferState();
} else if (_newPrice > offer.price) {
if (msg.value < _newPrice - offer.price) {
revert InsufficientETHProvided(msg.value);
}
} else if (_newPrice == 0) {
revert PriceMustBeAboveZero(msg.value);
} else if (_newPrice == offer.price) {
revert PriceMustBeDifferent(_newPrice);
} else if (_newPrice < offer.price) {
offer.buyer.transfer(offer.price - _newPrice);
}
emit OfferUpdated(_offerId, _newPrice);
}
function acceptOffer(uint256 _offerId)
external
payable
nonReentrant
isValidOffer(_offerId)
isApprovedMarketplace(
offers[_offerId].nftAddress,
offers[_offerId].tokenId,
offers[_offerId].seller
)
{
Offer memory offer = offers[_offerId];
if (offer.seller != _msgSender()) {
revert PermissionDenied();
} else if (offer.state != NFTingOfferState.ACTIVE) {
revert InvalidOfferState();
}
offers[_offerId].state = NFTingOfferState.ACCEPTED;
_transfer721And1155(
_msgSender(),
offer.buyer,
offer.nftAddress,
offer.tokenId,
offer.amount
);
uint256 rest = _payFee(offer.nftAddress, offer.tokenId, offer.price);
offer.seller.transfer(rest);
emit OfferAccepted(_offerId);
}
function declineOffer(uint256 _offerId)
external
nonReentrant
isValidOffer(_offerId)
{
Offer memory offer = offers[_offerId];
if (offer.seller != _msgSender()) {
revert PermissionDenied();
} else if (offer.state != NFTingOfferState.ACTIVE) {
revert InvalidOfferState();
}
offers[_offerId].state = NFTingOfferState.DECLINED;
offer.buyer.transfer(offer.price);
emit OfferDeclined(_offerId);
}
function cancelOffer(uint256 _offerId)
external
nonReentrant
isValidOffer(_offerId)
{
Offer memory offer = offers[_offerId];
if (offer.buyer != _msgSender()) {
revert PermissionDenied();
} else if (offer.state != NFTingOfferState.ACTIVE) {
revert InvalidOfferState();
}
offers[_offerId].state = NFTingOfferState.CANCELED;
offer.buyer.transfer(offer.price);
emit OfferCancelled(_offerId);
}
function getOfferDetailsById(uint256 _offerId)
external
view
isValidOffer(_offerId)
returns (
address nftAddress,
uint256 tokenId,
uint256 amount,
address buyer,
uint256 price,
address seller
)
{
return (
offers[_offerId].nftAddress,
offers[_offerId].tokenId,
offers[_offerId].amount,
offers[_offerId].buyer,
offers[_offerId].price,
offers[_offerId].seller
);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;
interface INFTingConfig {
function buyFee() external view returns (uint256);
function sellFee() external view returns (uint256);
function maxFee() external view returns (uint256);
function maxRoyaltyFee() external view returns (uint256);
function treasury() external view returns (address);
function updateFee(uint256 newBuyFee, uint256 newSellFee) external;
function updateTreasury(address newTreasury) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/interfaces/IERC2981.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "../interface/INFTingConfig.sol";
import "../utilities/NFTingErrors.sol";
contract NFTingBase is
Context,
Ownable,
IERC721Receiver,
IERC1155Receiver,
ReentrancyGuard
{
bytes4 internal constant INTERFACE_ID_ERC721 = 0x80ac58cd;
bytes4 internal constant INTERFACE_ID_ERC1155 = 0xd9b67a26;
bytes4 internal constant INTERFACE_ID_ERC2981 = 0x2a55205a;
INFTingConfig config;
uint256 feesCollected;
modifier onlyNFT(address _addr) {
if (
!_supportsInterface(_addr, INTERFACE_ID_ERC1155) &&
!_supportsInterface(_addr, INTERFACE_ID_ERC721)
) {
revert InvalidAddressProvided(_addr);
}
_;
}
modifier isTokenOwnerOrApproved(
address _nftAddress,
uint256 _tokenId,
uint256 _amount,
address _addr
) {
if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC1155)) {
if (
IERC1155(_nftAddress).balanceOf(_addr, _tokenId) < _amount &&
!IERC1155(_nftAddress).isApprovedForAll(_addr, _msgSender())
) {
revert NotTokenOwnerOrInsufficientAmount();
}
_;
} else if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC721)) {
if (
IERC721(_nftAddress).ownerOf(_tokenId) != _addr &&
IERC721(_nftAddress).getApproved(_tokenId) != _addr
) {
revert NotTokenOwnerOrInsufficientAmount();
}
_;
} else {
revert InvalidAddressProvided(_nftAddress);
}
}
modifier isApprovedMarketplace(
address _nftAddress,
uint256 _tokenId,
address _owner
) {
if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC1155)) {
if (
!IERC1155(_nftAddress).isApprovedForAll(_owner, address(this))
) {
revert NotApprovedMarketplace();
}
_;
} else if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC721)) {
if (
!IERC721(_nftAddress).isApprovedForAll(_owner, address(this)) &&
IERC721(_nftAddress).getApproved(_tokenId) != address(this)
) {
revert NotApprovedMarketplace();
}
_;
} else {
revert InvalidAddressProvided(_nftAddress);
}
}
function _transfer721And1155(
address _from,
address _to,
address _nftAddress,
uint256 _tokenId,
uint256 _amount
) internal virtual {
if (_amount == 0) {
revert ZeroAmountTransfer();
}
if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC1155)) {
IERC1155(_nftAddress).safeTransferFrom(
_from,
_to,
_tokenId,
_amount,
""
);
} else if (_supportsInterface(_nftAddress, INTERFACE_ID_ERC721)) {
IERC721(_nftAddress).safeTransferFrom(_from, _to, _tokenId);
} else {
revert InvalidAddressProvided(_nftAddress);
}
}
function _supportsInterface(address _addr, bytes4 _interface)
internal
view
returns (bool)
{
return IERC165(_addr).supportsInterface(_interface);
}
function checkRoyalties(address _contract) internal view returns (bool) {
return IERC165(_contract).supportsInterface(INTERFACE_ID_ERC2981);
}
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual override returns (bytes4) {
return
bytes4(
keccak256("onERC721Received(address,address,uint256,bytes)")
);
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external virtual override returns (bytes4) {
return
bytes4(
keccak256(
"onERC1155Received(address,address,uint256,uint256,bytes)"
)
);
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external virtual override returns (bytes4) {
return
bytes4(
keccak256(
"onERC1155Received(address,address,uint256[],uint256[],bytes)"
)
);
}
function supportsInterface(bytes4 _interfaceId)
public
view
virtual
override
returns (bool)
{
return
type(IERC1155Receiver).interfaceId == _interfaceId ||
type(IERC721Receiver).interfaceId == _interfaceId;
}
function setConfig(address newConfig) external onlyOwner {
if (newConfig == address(0)) {
revert ZeroAddress();
}
config = INFTingConfig(newConfig);
}
function _addBuyFee(uint256 price) internal view returns (uint256) {
return price += (price * config.buyFee()) / 10000;
}
function _payFee(
address token,
uint256 tokenId,
uint256 price
) internal returns (uint256 rest) {
// Cut buy fee
uint256 listedPrice = (price * 10000) / (10000 + config.buyFee());
uint256 buyFee = price - listedPrice;
// If the NFT was created on our marketplace, pay creator fee
uint256 royaltyFee;
if (checkRoyalties(token)) {
(address creator, uint256 royaltyAmount) = IERC2981(token)
.royaltyInfo(tokenId, listedPrice);
payable(creator).transfer(royaltyAmount);
royaltyFee = royaltyAmount;
}
// Cut sell fee and creator fee
uint256 sellFee = (listedPrice * config.sellFee()) / 10000;
rest = listedPrice - sellFee - royaltyFee;
if (config.treasury() != address(0)) {
payable(config.treasury()).transfer(buyFee + sellFee);
} else {
feesCollected += (buyFee + sellFee);
}
}
function withdraw() external onlyOwner {
if (config.treasury() == address(0)) {
revert ZeroAddress();
}
payable(config.treasury()).transfer(feesCollected);
feesCollected = 0;
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// 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 pragma solidity ^0.8.4; // Common Errors error ZeroAddress(); error WithdrawalFailed(); error NoTrailingSlash(string _uri); error InvalidArgumentsProvided(); error PriceMustBeAboveZero(uint256 _price); error PermissionDenied(); error InvalidTokenId(uint256 _tokenId); // NFTing Base Contract error NotTokenOwnerOrInsufficientAmount(); error NotApprovedMarketplace(); error ZeroAmountTransfer(); error TransactionError(); error InvalidAddressProvided(address _invalidAddress); // PreAuthorization Contract error NoAuthorizedOperator(); // Auction Contract error NotExistingAuction(uint256 _auctionId); error NotExistingBidder(address _bidder); error NotEnoughPriceToBid(); error SelfBid(); error ExpiredAuction(uint256 _auctionId); error RunningAuction(uint256 _auctionId); error NotAuctionCreatorOrOwner(); error InvalidAmountOfTokens(uint256 _amount); error AlreadyWithdrawn(uint256 _auctionId, address _bidder); error NotBidder(uint256 _auctionId, address _bidder); // Offer Contract error NotExistingOffer(uint256 _offerId); error PriceMustBeDifferent(uint256 _price); error InsufficientETHProvided(uint256 _value); error InvalidOfferState(); // Marketplace Contract error NotListed(); error NotEnoughEthProvided(uint256 providedEth, uint256 requiredEth); error NotTokenOwner(); error NotTokenSeller(); error TokenSeller(); error InvalidBasisProvided(uint256 _newBasis); // NFTing Single Token Contract error MaxBatchMintLimitExceeded(); error AlreadyExistentToken(); error NotApprovedOrOwner(); error MaxMintLimitExceeded(); // NFTing Token Manager Contract error AlreadyRegisteredAddress(); // NFTingSignature error HashUsed(bytes32 _hash); error SignatureFailed(address _signatureAddress, address _signer);
// 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 (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/Counters.sol)
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
function reset(Counter storage counter) internal {
counter._value = 0;
}
}// 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 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.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155Receiver is IERC165 {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// 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);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"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":"uint256","name":"_value","type":"uint256"}],"name":"InsufficientETHProvided","type":"error"},{"inputs":[{"internalType":"address","name":"_invalidAddress","type":"address"}],"name":"InvalidAddressProvided","type":"error"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"InvalidAmountOfTokens","type":"error"},{"inputs":[],"name":"InvalidOfferState","type":"error"},{"inputs":[],"name":"NotApprovedMarketplace","type":"error"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"NotExistingOffer","type":"error"},{"inputs":[],"name":"NotTokenOwnerOrInsufficientAmount","type":"error"},{"inputs":[],"name":"PermissionDenied","type":"error"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PriceMustBeAboveZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PriceMustBeDifferent","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmountTransfer","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"OfferAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_offerId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"OfferDeclined","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"OfferUpdated","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"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"acceptOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"declineOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"getOfferDetailsById","outputs":[{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"seller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_nftAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_seller","type":"address"}],"name":"makeOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newConfig","type":"address"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"},{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"updateOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b5061001a33610023565b60018055610073565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120a8806100826000396000f3fe6080604052600436106100ec5760003560e01c80638da5cb5b1161008a578063c815729d11610059578063c815729d146102e9578063ef706adf146102fc578063f23a6e611461031c578063f2fde38b1461036257600080fd5b80638da5cb5b14610246578063a9da5f061461026e578063bc197c811461028e578063c14e8e7f146102d657600080fd5b806320e3dbd4116100c657806320e3dbd4146101a05780633ccfd60b146101c0578063715018a6146101d557806376f54a10146101ea57600080fd5b806301ffc9a7146100f85780630b7b925b1461012d578063150b7a021461014257600080fd5b366100f357005b600080fd5b34801561010457600080fd5b50610118610113366004611c05565b610382565b60405190151581526020015b60405180910390f35b61014061013b366004611c2f565b6103b9565b005b34801561014e57600080fd5b5061018761015d366004611caf565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610124565b3480156101ac57600080fd5b506101406101bb366004611d22565b610669565b3480156101cc57600080fd5b506101406106ba565b3480156101e157600080fd5b50610140610810565b3480156101f657600080fd5b5061020a610205366004611d3f565b610824565b604080516001600160a01b03978816815260208101969096528501939093529084166060840152608083015290911660a082015260c001610124565b34801561025257600080fd5b506000546040516001600160a01b039091168152602001610124565b34801561027a57600080fd5b50610140610289366004611d3f565b6108c1565b34801561029a57600080fd5b506101876102a9366004611d9d565b7fc690df554309250a278186339f107582200b4b254ae59248cb85e8eaa675b80898975050505050505050565b6101406102e4366004611e5c565b610aab565b6101406102f7366004611d3f565b610f20565b34801561030857600080fd5b50610140610317366004611d3f565b61135f565b34801561032857600080fd5b50610187610337366004611ea6565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561036e57600080fd5b5061014061037d366004611d22565b61154e565b6000630271189760e51b6001600160e01b0319831614806103b35750630a85bd0160e11b6001600160e01b03198316145b92915050565b6002600154036103e45760405162461bcd60e51b81526004016103db90611f22565b60405180910390fd5b60026001556000828152600560208190526040909120908101548391906001600160a01b031661042a576040516325aae4b560e21b8152600481018390526024016103db565b600084815260056020526040808220815160e081019092528054829060ff16600381111561045a5761045a611f59565b600381111561046b5761046b611f59565b8152815461010090046001600160a01b0390811660208084019190915260018401546040808501919091526002850154606085015260038086015460808601526004860154841660a086015260059586015490931660c09094019390935260008a81529390529120018590559050336001600160a01b03168160a001516001600160a01b03161461050f57604051630782484160e21b815260040160405180910390fd5b60008151600381111561052457610524611f59565b1461054257604051634549250760e01b815260040160405180910390fd5b806080015184111561058457608081015161055d9085611f85565b34101561057f5760405163305e470760e21b81523460048201526024016103db565b610625565b836000036105a75760405163a63e884b60e01b81523460048201526024016103db565b806080015184036105ce5760405163552d4ab560e11b8152600481018590526024016103db565b8060800151841015610625578060a001516001600160a01b03166108fc8583608001516105fb9190611f85565b6040518115909202916000818181858888f19350505050158015610623573d6000803e3d6000fd5b505b60408051868152602081018690527f63259830931e406791f7755ad50d816251e755d53951772775a94f2bf0e54fde910160405180910390a1505060018055505050565b6106716115c7565b6001600160a01b0381166106985760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6106c26115c7565b600254604080516361d027b360e01b815290516000926001600160a01b0316916361d027b39160048083019260209291908290030181865afa15801561070c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107309190611f98565b6001600160a01b0316036107575760405163d92e233d60e01b815260040160405180910390fd5b600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce9190611f98565b6001600160a01b03166108fc6003549081150290604051600060405180830381858888f19350505050158015610808573d6000803e3d6000fd5b506000600355565b6108186115c7565b6108226000611621565b565b60008181526005602081905260408220908101548291829182918291829188916001600160a01b031661086d576040516325aae4b560e21b8152600481018390526024016103db565b505050600095865250506005602081905260409094208054600182015460028301546004840154600385015494909801546001600160a01b0361010090940484169992989197509083169550929350911690565b6002600154036108e35760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b0316610929576040516325aae4b560e21b8152600481018390526024016103db565b600083815260056020526040808220815160e081019092528054829060ff16600381111561095957610959611f59565b600381111561096a5761096a611f59565b815281546001600160a01b03610100909104811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a0830152600590920154821660c0918201528201519192501633146109e157604051630782484160e21b815260040160405180910390fd5b6000815160038111156109f6576109f6611f59565b14610a1457604051634549250760e01b815260040160405180910390fd5b600084815260056020526040808220805460ff1916600317905560a0830151608084015191516001600160a01b039091169282156108fc02929190818181858888f19350505050158015610a6c573d6000803e3d6000fd5b506040518481527f182dfd46ae476cf0729df4b0a6099804dca70c9ca8def99af97f113470ec3f2b906020015b60405180910390a15050600180555050565b83610abd81636cdb3d1360e11b611671565b158015610ad85750610ad6816380ac58cd60e01b611671565b155b15610b0157604051634369193560e01b81526001600160a01b03821660048201526024016103db565b84848484610b1684636cdb3d1360e11b611671565b15610dc657604051627eeac760e11b81526001600160a01b0382811660048301526024820185905283919086169062fdd58e90604401602060405180830381865afa158015610b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8d9190611fb5565b108015610c1757506001600160a01b03841663e985e9c582336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c159190611fce565b155b15610c35576040516318b247cb60e01b815260040160405180910390fd5b336001600160a01b03871603610c6957604051634369193560e01b81526001600160a01b03871660048201526024016103db565b34600003610c8c5760405163a63e884b60e01b81523460048201526024016103db565b861580610cb05750600187118015610cb05750610cb0896380ac58cd60e01b611671565b15610cd157604051634e62113160e11b8152600481018890526024016103db565b610cdf600480546001019055565b6000610cea60045490565b60008181526005602052604090208054610100600160a81b0319166101006001600160a01b038e1602178155600181018b9055600281018a9055909150336004820180546001600160a01b039283166001600160a01b031991821617909155346003840155600583018054928b169290911682179055815460ff191682553360408051858152602081018e90529081018c90523460608201526001600160a01b03918216918e16907f09ba80f80b4fef060deb2330d0d0e0fe652327aa19e24dae07b4e075b41935b49060800160405180910390a45050610f15565b610dd7846380ac58cd60e01b611671565b15610ef1576040516331a9108f60e11b8152600481018490526001600160a01b038083169190861690636352211e90602401602060405180830381865afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a9190611f98565b6001600160a01b031614158015610c17575060405163020604bf60e21b8152600481018490526001600160a01b03808316919086169063081812fc90602401602060405180830381865afa158015610ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eca9190611f98565b6001600160a01b031614610c35576040516318b247cb60e01b815260040160405180910390fd5b604051634369193560e01b81526001600160a01b03851660048201526024016103db565b505050505050505050565b600260015403610f425760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b0316610f88576040516325aae4b560e21b8152600481018390526024016103db565b60008381526005602081905260409091208054600182015491909201546001600160a01b0361010090930483169216610fc883636cdb3d1360e11b611671565b1561120c5760405163e985e9c560e01b81526001600160a01b03828116600483015230602483015284169063e985e9c590604401602060405180830381865afa158015611019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d9190611fce565b61105a576040516376dd504960e11b815260040160405180910390fd5b600086815260056020526040808220815160e081019092528054829060ff16600381111561108a5761108a611f59565b600381111561109b5761109b611f59565b815281546001600160a01b03610100909104811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a0830152600590920154821660c09182015282015191925016331461111257604051630782484160e21b815260040160405180910390fd5b60008151600381111561112757611127611f59565b1461114557604051634549250760e01b815260040160405180910390fd5b6000878152600560205260409020805460ff1916600217905561117b338260a001518360200151846040015185606001516116ed565b6000611194826020015183604001518460800151611803565b60c08301516040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156111d1573d6000803e3d6000fd5b506040518881527f9bd6b4fd288008520fd788a93304e5688a401aea817ea8140ecf1fb8648f31919060200160405180910390a15050611353565b61121d836380ac58cd60e01b611671565b1561132f5760405163e985e9c560e01b81526001600160a01b03828116600483015230602483015284169063e985e9c590604401602060405180830381865afa15801561126e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112929190611fce565b158015611311575060405163020604bf60e21b81526004810183905230906001600160a01b0385169063081812fc90602401602060405180830381865afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113059190611f98565b6001600160a01b031614155b1561105a576040516376dd504960e11b815260040160405180910390fd5b604051634369193560e01b81526001600160a01b03841660048201526024016103db565b50506001805550505050565b6002600154036113815760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b03166113c7576040516325aae4b560e21b8152600481018390526024016103db565b600083815260056020526040808220815160e081019092528054829060ff1660038111156113f7576113f7611f59565b600381111561140857611408611f59565b8152815461010090046001600160a01b0390811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a083015260059092015490911660c0909101529050336001600160a01b03168160a001516001600160a01b03161461149257604051630782484160e21b815260040160405180910390fd5b6000815160038111156114a7576114a7611f59565b146114c557604051634549250760e01b815260040160405180910390fd5b600084815260056020526040808220805460ff1916600117905560a0830151608084015191516001600160a01b039091169282156108fc02929190818181858888f1935050505015801561151d573d6000803e3d6000fd5b506040518481527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610a99565b6115566115c7565b6001600160a01b0381166115bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103db565b6115c481611621565b50565b6000546001600160a01b031633146108225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103db565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a790602401602060405180830381865afa1580156116c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e69190611fce565b9392505050565b8060000361170e576040516308343ac160e01b815260040160405180910390fd5b61171f83636cdb3d1360e11b611671565b156117a957604051637921219560e11b81526001600160a01b0386811660048301528581166024830152604482018490526064820183905260a06084830152600060a483015284169063f242432a9060c4015b600060405180830381600087803b15801561178c57600080fd5b505af11580156117a0573d6000803e3d6000fd5b505050506117fc565b6117ba836380ac58cd60e01b611671565b1561132f57604051632142170760e11b81526001600160a01b0386811660048301528581166024830152604482018490528416906342842e0e90606401611772565b5050505050565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190611fb5565b61188990612710611ff0565b61189584612710612003565b61189f9190612022565b905060006118ad8285611f85565b905060006118ba87611b93565b156119735760405163152a902d60e11b8152600481018790526024810184905260009081906001600160a01b038a1690632a55205a906044016040805180830381865afa15801561190f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119339190612044565b60405191935091506001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561196e573d6000803e3d6000fd5b509150505b6000612710600260009054906101000a90046001600160a01b03166001600160a01b0316632b14ca566040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef9190611fb5565b6119f99086612003565b611a039190612022565b905081611a108286611f85565b611a1a9190611f85565b945060006001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190611f98565b6001600160a01b031614611b6757600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190611f98565b6001600160a01b03166108fc611b398386611ff0565b6040518115909202916000818181858888f19350505050158015611b61573d6000803e3d6000fd5b50611b88565b611b718184611ff0565b60036000828254611b829190611ff0565b90915550505b505050509392505050565b6040516301ffc9a760e01b815263152a902d60e11b60048201526000906001600160a01b038316906301ffc9a790602401602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b39190611fce565b600060208284031215611c1757600080fd5b81356001600160e01b0319811681146116e657600080fd5b60008060408385031215611c4257600080fd5b50508035926020909101359150565b6001600160a01b03811681146115c457600080fd5b60008083601f840112611c7857600080fd5b50813567ffffffffffffffff811115611c9057600080fd5b602083019150836020828501011115611ca857600080fd5b9250929050565b600080600080600060808688031215611cc757600080fd5b8535611cd281611c51565b94506020860135611ce281611c51565b935060408601359250606086013567ffffffffffffffff811115611d0557600080fd5b611d1188828901611c66565b969995985093965092949392505050565b600060208284031215611d3457600080fd5b81356116e681611c51565b600060208284031215611d5157600080fd5b5035919050565b60008083601f840112611d6a57600080fd5b50813567ffffffffffffffff811115611d8257600080fd5b6020830191508360208260051b8501011115611ca857600080fd5b60008060008060008060008060a0898b031215611db957600080fd5b8835611dc481611c51565b97506020890135611dd481611c51565b9650604089013567ffffffffffffffff80821115611df157600080fd5b611dfd8c838d01611d58565b909850965060608b0135915080821115611e1657600080fd5b611e228c838d01611d58565b909650945060808b0135915080821115611e3b57600080fd5b50611e488b828c01611c66565b999c989b5096995094979396929594505050565b60008060008060808587031215611e7257600080fd5b8435611e7d81611c51565b935060208501359250604085013591506060850135611e9b81611c51565b939692955090935050565b60008060008060008060a08789031215611ebf57600080fd5b8635611eca81611c51565b95506020870135611eda81611c51565b94506040870135935060608701359250608087013567ffffffffffffffff811115611f0457600080fd5b611f1089828a01611c66565b979a9699509497509295939492505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156103b3576103b3611f6f565b600060208284031215611faa57600080fd5b81516116e681611c51565b600060208284031215611fc757600080fd5b5051919050565b600060208284031215611fe057600080fd5b815180151581146116e657600080fd5b808201808211156103b3576103b3611f6f565b600081600019048311821515161561201d5761201d611f6f565b500290565b60008261203f57634e487b7160e01b600052601260045260246000fd5b500490565b6000806040838503121561205757600080fd5b825161206281611c51565b602093909301519294929350505056fea2646970667358221220ccbc8d49cdad6e0f2773bf4626d1e1ad206fbb9a707899e9cb745ee0f711b07b64736f6c63430008100033
Deployed Bytecode
0x6080604052600436106100ec5760003560e01c80638da5cb5b1161008a578063c815729d11610059578063c815729d146102e9578063ef706adf146102fc578063f23a6e611461031c578063f2fde38b1461036257600080fd5b80638da5cb5b14610246578063a9da5f061461026e578063bc197c811461028e578063c14e8e7f146102d657600080fd5b806320e3dbd4116100c657806320e3dbd4146101a05780633ccfd60b146101c0578063715018a6146101d557806376f54a10146101ea57600080fd5b806301ffc9a7146100f85780630b7b925b1461012d578063150b7a021461014257600080fd5b366100f357005b600080fd5b34801561010457600080fd5b50610118610113366004611c05565b610382565b60405190151581526020015b60405180910390f35b61014061013b366004611c2f565b6103b9565b005b34801561014e57600080fd5b5061018761015d366004611caf565b7f150b7a023d4804d13e8c85fb27262cb750cf6ba9f9dd3bb30d90f482ceeb4b1f95945050505050565b6040516001600160e01b03199091168152602001610124565b3480156101ac57600080fd5b506101406101bb366004611d22565b610669565b3480156101cc57600080fd5b506101406106ba565b3480156101e157600080fd5b50610140610810565b3480156101f657600080fd5b5061020a610205366004611d3f565b610824565b604080516001600160a01b03978816815260208101969096528501939093529084166060840152608083015290911660a082015260c001610124565b34801561025257600080fd5b506000546040516001600160a01b039091168152602001610124565b34801561027a57600080fd5b50610140610289366004611d3f565b6108c1565b34801561029a57600080fd5b506101876102a9366004611d9d565b7fc690df554309250a278186339f107582200b4b254ae59248cb85e8eaa675b80898975050505050505050565b6101406102e4366004611e5c565b610aab565b6101406102f7366004611d3f565b610f20565b34801561030857600080fd5b50610140610317366004611d3f565b61135f565b34801561032857600080fd5b50610187610337366004611ea6565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561036e57600080fd5b5061014061037d366004611d22565b61154e565b6000630271189760e51b6001600160e01b0319831614806103b35750630a85bd0160e11b6001600160e01b03198316145b92915050565b6002600154036103e45760405162461bcd60e51b81526004016103db90611f22565b60405180910390fd5b60026001556000828152600560208190526040909120908101548391906001600160a01b031661042a576040516325aae4b560e21b8152600481018390526024016103db565b600084815260056020526040808220815160e081019092528054829060ff16600381111561045a5761045a611f59565b600381111561046b5761046b611f59565b8152815461010090046001600160a01b0390811660208084019190915260018401546040808501919091526002850154606085015260038086015460808601526004860154841660a086015260059586015490931660c09094019390935260008a81529390529120018590559050336001600160a01b03168160a001516001600160a01b03161461050f57604051630782484160e21b815260040160405180910390fd5b60008151600381111561052457610524611f59565b1461054257604051634549250760e01b815260040160405180910390fd5b806080015184111561058457608081015161055d9085611f85565b34101561057f5760405163305e470760e21b81523460048201526024016103db565b610625565b836000036105a75760405163a63e884b60e01b81523460048201526024016103db565b806080015184036105ce5760405163552d4ab560e11b8152600481018590526024016103db565b8060800151841015610625578060a001516001600160a01b03166108fc8583608001516105fb9190611f85565b6040518115909202916000818181858888f19350505050158015610623573d6000803e3d6000fd5b505b60408051868152602081018690527f63259830931e406791f7755ad50d816251e755d53951772775a94f2bf0e54fde910160405180910390a1505060018055505050565b6106716115c7565b6001600160a01b0381166106985760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6106c26115c7565b600254604080516361d027b360e01b815290516000926001600160a01b0316916361d027b39160048083019260209291908290030181865afa15801561070c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107309190611f98565b6001600160a01b0316036107575760405163d92e233d60e01b815260040160405180910390fd5b600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce9190611f98565b6001600160a01b03166108fc6003549081150290604051600060405180830381858888f19350505050158015610808573d6000803e3d6000fd5b506000600355565b6108186115c7565b6108226000611621565b565b60008181526005602081905260408220908101548291829182918291829188916001600160a01b031661086d576040516325aae4b560e21b8152600481018390526024016103db565b505050600095865250506005602081905260409094208054600182015460028301546004840154600385015494909801546001600160a01b0361010090940484169992989197509083169550929350911690565b6002600154036108e35760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b0316610929576040516325aae4b560e21b8152600481018390526024016103db565b600083815260056020526040808220815160e081019092528054829060ff16600381111561095957610959611f59565b600381111561096a5761096a611f59565b815281546001600160a01b03610100909104811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a0830152600590920154821660c0918201528201519192501633146109e157604051630782484160e21b815260040160405180910390fd5b6000815160038111156109f6576109f6611f59565b14610a1457604051634549250760e01b815260040160405180910390fd5b600084815260056020526040808220805460ff1916600317905560a0830151608084015191516001600160a01b039091169282156108fc02929190818181858888f19350505050158015610a6c573d6000803e3d6000fd5b506040518481527f182dfd46ae476cf0729df4b0a6099804dca70c9ca8def99af97f113470ec3f2b906020015b60405180910390a15050600180555050565b83610abd81636cdb3d1360e11b611671565b158015610ad85750610ad6816380ac58cd60e01b611671565b155b15610b0157604051634369193560e01b81526001600160a01b03821660048201526024016103db565b84848484610b1684636cdb3d1360e11b611671565b15610dc657604051627eeac760e11b81526001600160a01b0382811660048301526024820185905283919086169062fdd58e90604401602060405180830381865afa158015610b69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8d9190611fb5565b108015610c1757506001600160a01b03841663e985e9c582336040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015610bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c159190611fce565b155b15610c35576040516318b247cb60e01b815260040160405180910390fd5b336001600160a01b03871603610c6957604051634369193560e01b81526001600160a01b03871660048201526024016103db565b34600003610c8c5760405163a63e884b60e01b81523460048201526024016103db565b861580610cb05750600187118015610cb05750610cb0896380ac58cd60e01b611671565b15610cd157604051634e62113160e11b8152600481018890526024016103db565b610cdf600480546001019055565b6000610cea60045490565b60008181526005602052604090208054610100600160a81b0319166101006001600160a01b038e1602178155600181018b9055600281018a9055909150336004820180546001600160a01b039283166001600160a01b031991821617909155346003840155600583018054928b169290911682179055815460ff191682553360408051858152602081018e90529081018c90523460608201526001600160a01b03918216918e16907f09ba80f80b4fef060deb2330d0d0e0fe652327aa19e24dae07b4e075b41935b49060800160405180910390a45050610f15565b610dd7846380ac58cd60e01b611671565b15610ef1576040516331a9108f60e11b8152600481018490526001600160a01b038083169190861690636352211e90602401602060405180830381865afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a9190611f98565b6001600160a01b031614158015610c17575060405163020604bf60e21b8152600481018490526001600160a01b03808316919086169063081812fc90602401602060405180830381865afa158015610ea6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eca9190611f98565b6001600160a01b031614610c35576040516318b247cb60e01b815260040160405180910390fd5b604051634369193560e01b81526001600160a01b03851660048201526024016103db565b505050505050505050565b600260015403610f425760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b0316610f88576040516325aae4b560e21b8152600481018390526024016103db565b60008381526005602081905260409091208054600182015491909201546001600160a01b0361010090930483169216610fc883636cdb3d1360e11b611671565b1561120c5760405163e985e9c560e01b81526001600160a01b03828116600483015230602483015284169063e985e9c590604401602060405180830381865afa158015611019573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103d9190611fce565b61105a576040516376dd504960e11b815260040160405180910390fd5b600086815260056020526040808220815160e081019092528054829060ff16600381111561108a5761108a611f59565b600381111561109b5761109b611f59565b815281546001600160a01b03610100909104811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a0830152600590920154821660c09182015282015191925016331461111257604051630782484160e21b815260040160405180910390fd5b60008151600381111561112757611127611f59565b1461114557604051634549250760e01b815260040160405180910390fd5b6000878152600560205260409020805460ff1916600217905561117b338260a001518360200151846040015185606001516116ed565b6000611194826020015183604001518460800151611803565b60c08301516040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156111d1573d6000803e3d6000fd5b506040518881527f9bd6b4fd288008520fd788a93304e5688a401aea817ea8140ecf1fb8648f31919060200160405180910390a15050611353565b61121d836380ac58cd60e01b611671565b1561132f5760405163e985e9c560e01b81526001600160a01b03828116600483015230602483015284169063e985e9c590604401602060405180830381865afa15801561126e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112929190611fce565b158015611311575060405163020604bf60e21b81526004810183905230906001600160a01b0385169063081812fc90602401602060405180830381865afa1580156112e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113059190611f98565b6001600160a01b031614155b1561105a576040516376dd504960e11b815260040160405180910390fd5b604051634369193560e01b81526001600160a01b03841660048201526024016103db565b50506001805550505050565b6002600154036113815760405162461bcd60e51b81526004016103db90611f22565b60026001556000818152600560208190526040909120908101548291906001600160a01b03166113c7576040516325aae4b560e21b8152600481018390526024016103db565b600083815260056020526040808220815160e081019092528054829060ff1660038111156113f7576113f7611f59565b600381111561140857611408611f59565b8152815461010090046001600160a01b0390811660208301526001830154604083015260028301546060830152600383015460808301526004830154811660a083015260059092015490911660c0909101529050336001600160a01b03168160a001516001600160a01b03161461149257604051630782484160e21b815260040160405180910390fd5b6000815160038111156114a7576114a7611f59565b146114c557604051634549250760e01b815260040160405180910390fd5b600084815260056020526040808220805460ff1916600117905560a0830151608084015191516001600160a01b039091169282156108fc02929190818181858888f1935050505015801561151d573d6000803e3d6000fd5b506040518481527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610a99565b6115566115c7565b6001600160a01b0381166115bb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103db565b6115c481611621565b50565b6000546001600160a01b031633146108225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103db565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a790602401602060405180830381865afa1580156116c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116e69190611fce565b9392505050565b8060000361170e576040516308343ac160e01b815260040160405180910390fd5b61171f83636cdb3d1360e11b611671565b156117a957604051637921219560e11b81526001600160a01b0386811660048301528581166024830152604482018490526064820183905260a06084830152600060a483015284169063f242432a9060c4015b600060405180830381600087803b15801561178c57600080fd5b505af11580156117a0573d6000803e3d6000fd5b505050506117fc565b6117ba836380ac58cd60e01b611671565b1561132f57604051632142170760e11b81526001600160a01b0386811660048301528581166024830152604482018490528416906342842e0e90606401611772565b5050505050565b600080600260009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187d9190611fb5565b61188990612710611ff0565b61189584612710612003565b61189f9190612022565b905060006118ad8285611f85565b905060006118ba87611b93565b156119735760405163152a902d60e11b8152600481018790526024810184905260009081906001600160a01b038a1690632a55205a906044016040805180830381865afa15801561190f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119339190612044565b60405191935091506001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561196e573d6000803e3d6000fd5b509150505b6000612710600260009054906101000a90046001600160a01b03166001600160a01b0316632b14ca566040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119ef9190611fb5565b6119f99086612003565b611a039190612022565b905081611a108286611f85565b611a1a9190611f85565b945060006001600160a01b0316600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190611f98565b6001600160a01b031614611b6757600260009054906101000a90046001600160a01b03166001600160a01b03166361d027b36040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b239190611f98565b6001600160a01b03166108fc611b398386611ff0565b6040518115909202916000818181858888f19350505050158015611b61573d6000803e3d6000fd5b50611b88565b611b718184611ff0565b60036000828254611b829190611ff0565b90915550505b505050509392505050565b6040516301ffc9a760e01b815263152a902d60e11b60048201526000906001600160a01b038316906301ffc9a790602401602060405180830381865afa158015611be1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b39190611fce565b600060208284031215611c1757600080fd5b81356001600160e01b0319811681146116e657600080fd5b60008060408385031215611c4257600080fd5b50508035926020909101359150565b6001600160a01b03811681146115c457600080fd5b60008083601f840112611c7857600080fd5b50813567ffffffffffffffff811115611c9057600080fd5b602083019150836020828501011115611ca857600080fd5b9250929050565b600080600080600060808688031215611cc757600080fd5b8535611cd281611c51565b94506020860135611ce281611c51565b935060408601359250606086013567ffffffffffffffff811115611d0557600080fd5b611d1188828901611c66565b969995985093965092949392505050565b600060208284031215611d3457600080fd5b81356116e681611c51565b600060208284031215611d5157600080fd5b5035919050565b60008083601f840112611d6a57600080fd5b50813567ffffffffffffffff811115611d8257600080fd5b6020830191508360208260051b8501011115611ca857600080fd5b60008060008060008060008060a0898b031215611db957600080fd5b8835611dc481611c51565b97506020890135611dd481611c51565b9650604089013567ffffffffffffffff80821115611df157600080fd5b611dfd8c838d01611d58565b909850965060608b0135915080821115611e1657600080fd5b611e228c838d01611d58565b909650945060808b0135915080821115611e3b57600080fd5b50611e488b828c01611c66565b999c989b5096995094979396929594505050565b60008060008060808587031215611e7257600080fd5b8435611e7d81611c51565b935060208501359250604085013591506060850135611e9b81611c51565b939692955090935050565b60008060008060008060a08789031215611ebf57600080fd5b8635611eca81611c51565b95506020870135611eda81611c51565b94506040870135935060608701359250608087013567ffffffffffffffff811115611f0457600080fd5b611f1089828a01611c66565b979a9699509497509295939492505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156103b3576103b3611f6f565b600060208284031215611faa57600080fd5b81516116e681611c51565b600060208284031215611fc757600080fd5b5051919050565b600060208284031215611fe057600080fd5b815180151581146116e657600080fd5b808201808211156103b3576103b3611f6f565b600081600019048311821515161561201d5761201d611f6f565b500290565b60008261203f57634e487b7160e01b600052601260045260246000fd5b500490565b6000806040838503121561205757600080fd5b825161206281611c51565b602093909301519294929350505056fea2646970667358221220ccbc8d49cdad6e0f2773bf4626d1e1ad206fbb9a707899e9cb745ee0f711b07b64736f6c63430008100033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.