Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 28 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Put NFT For Sell | 2698122 | 94 days ago | IN | 0 ETH | 0.00011841 | ||||
Return NFT | 2698079 | 94 days ago | IN | 0 ETH | 0.00005768 | ||||
Put NFT For Sell | 2698049 | 94 days ago | IN | 0 ETH | 0.00013085 | ||||
Make Offer | 2697875 | 94 days ago | IN | 0 ETH | 0.00007198 | ||||
Put NFT For Sell | 2697567 | 94 days ago | IN | 0 ETH | 0.00016899 | ||||
Put NFT For Sell | 2697234 | 94 days ago | IN | 0 ETH | 0.0001063 | ||||
Buy NFT | 2697223 | 94 days ago | IN | 0.000001 ETH | 0.00005465 | ||||
Put NFT For Sell | 2697218 | 94 days ago | IN | 0 ETH | 0.00008469 | ||||
Make Offer | 2697056 | 94 days ago | IN | 0 ETH | 0.00005067 | ||||
Put NFT For Sell | 2697042 | 94 days ago | IN | 0 ETH | 0.00009279 | ||||
Make Offer | 2691907 | 95 days ago | IN | 0 ETH | 0.00003098 | ||||
Put NFT For Sell | 2691898 | 95 days ago | IN | 0 ETH | 0.00005503 | ||||
Put NFT For Sell | 2691725 | 95 days ago | IN | 0 ETH | 0.00005701 | ||||
Buy Part NFT | 2691705 | 95 days ago | IN | 0.000552 ETH | 0.00017969 | ||||
Buy NFT | 2691458 | 95 days ago | IN | 0.0012 ETH | 0.0000382 | ||||
Put NFT For Sell | 2691411 | 95 days ago | IN | 0 ETH | 0.00005152 | ||||
Buy NFT | 2691304 | 95 days ago | IN | 0.0012 ETH | 0.00004449 | ||||
Put NFT For Sell | 2691296 | 95 days ago | IN | 0 ETH | 0.00006 | ||||
Put NFT For Sell | 2691247 | 95 days ago | IN | 0 ETH | 0.00006185 | ||||
Make Offer | 2691150 | 95 days ago | IN | 0 ETH | 0.00003914 | ||||
Put NFT For Sell | 2691132 | 95 days ago | IN | 0 ETH | 0.00007025 | ||||
Buy NFT | 2685545 | 96 days ago | IN | 0.00000001 ETH | 0.00005426 | ||||
Put NFT For Sell | 2685486 | 96 days ago | IN | 0 ETH | 0.00008365 | ||||
Put NFT For Sell | 2684403 | 96 days ago | IN | 0 ETH | 0.00009241 | ||||
Put NFT For Sell | 2684101 | 96 days ago | IN | 0 ETH | 0.00011437 |
Latest 9 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
2697223 | 94 days ago | 0.000001 ETH | ||||
2691705 | 95 days ago | 0.000184 ETH | ||||
2691705 | 95 days ago | 0.000368 ETH | ||||
2691458 | 95 days ago | 0.0004 ETH | ||||
2691458 | 95 days ago | 0.0008 ETH | ||||
2691304 | 95 days ago | 0.0004 ETH | ||||
2691304 | 95 days ago | 0.0008 ETH | ||||
2685545 | 96 days ago | 0.00000001 ETH | ||||
2684052 | 96 days ago | 0.000001 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
NFTMarketplace
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.26; import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IOffer} from "./interface/IOffer.sol"; import {IOfferFactory} from "./interface/IOfferFactory.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; error NotCorrectValue( uint256 value, uint256 price, uint256 commission, uint256 discount ); error NotCorrectCommission(uint256 value, uint256 commission, uint256 discount); error NotCorrectPercent(); error AlreadyReturned(); error SaleNotExists(); error OfferNotExists(); error AlreadyBought(); error NotSeller(); error NotPartialSell(); error NotForSeller(); error NotForFullSell(); error NotCorrectAmount(uint256 availableAmount); contract NFTMarketplace is ERC721Holder, Ownable { /********************************************************* ========================= Events ========================= *********************************************************/ /** * @param sellerAddress Address of NFT seller * @param nftAddress Address of NFT contract * @param price Price in wei * @param nftId Id of NFT * @param saleId Id of sale * @param tokensAmount Amount of tokens for sell that receives NFT owner */ event NFTSaleCreated( address sellerAddress, address nftAddress, uint256 price, uint256 nftId, uint256 saleId, uint256 tokensAmount ); /** * @param buyer Address of NFT buyer * @param nftAddress Address of NFT contract * @param nftId Id of NFT * @param saleId Id of sale */ event NFTBoughtFromMarketplace( address buyer, address nftAddress, uint256 nftId, uint256 saleId, uint256 sellerRefferalsProfit, uint256 buyerRefferalsProfit ); /** * @param offerId Id of offer * @param saleId Id of sale * @param tokensAmount Amount of tokens * @param bidder Address of user that makes offer */ event OfferMade( uint256 offerId, uint256 saleId, uint256 tokensAmount, address bidder ); /** * @param nftAddress Address of NFT contract * @param nftId Id of NFT * @param saleId Id of sale */ event NFTReturnedFromMarketplace( address nftAddress, uint256 nftId, uint256 saleId ); /** * @param buyerAddress Address of NFT buyer * @param sellerAddress Address of NFT seller * @param saleId Id of sale * @param buyerNFTId Id of new NFT for buyer * @param sellerNFTId Id of new NFT for seller */ event PartialNFTSold( address buyerAddress, address sellerAddress, uint256 saleId, uint256 buyerNFTId, uint256 sellerNFTId, uint256 sellerRefferalsProfit, uint256 buyerRefferalsProfit ); /** * @param offerId Id of offer * @param saleId Id of sale */ event OfferApproved( uint256 offerId, uint256 saleId, uint256 sellerRefferalsProfit, uint256 buyerRefferalsProfit ); /********************************************************** ========================= Structs ========================= **********************************************************/ /** * @param price Price in wei * @param nftId Id of NFT * @param nftAddress Address of NFT contract * @param sellerAddress Address of NFT seller * @param tokensAmount Amount of tokens for sell that receives NFT owner (NFT buyer) * @param availableTokensAmount Available amount of ERC20 tokens of trade lot * @param isWithdrawed Flag indicates is sale withdrawed */ struct NFTSaleInfo { uint256 price; uint256 nftId; address nftAddress; address sellerAddress; uint256 tokensAmount; uint256 availableTokensAmount; bool isWithdrawed; } /** * @param saleId Id of sale * @param tokensAmount Amount of tokens for sell that receives NFT owner * @param bidder Address of user that makes offer */ struct OfferInfo { uint256 saleId; uint256 tokensAmount; address bidder; } /************************************************************ ========================= Constants ========================= ************************************************************/ /// @notice Percent amount of discount of commission uint8 constant COMMISSION_DISCOUNT = 10; /************************************************************ ========================= Variables ========================= ************************************************************/ /// @notice Address of WETH // Holesky address constant WETH_ADDRESS = 0x94373a4919B3240D86eA41593D5eBa789FEF3848; // Mainnet // address constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; uint8 constant PERCENT_DIVIDER = 100; /// @notice Amount representing percent amount uint16 constant MULTIPLIER = 1000; /// @notice Id of next sale uint256 private saleId = 1; /// @notice Id of next offer uint256 private offerId = 1; /// @notice Address for commssion transfer address withdrawalSCAddress; /// @notice Address of factory address address immutable factoryAddress; /*********************************************************** ========================= Mappings ========================= ***********************************************************/ /// @notice List of nftSales (saleId => NFTSaleInfo) mapping(uint256 => NFTSaleInfo) public nftSales; /// @notice List of offers (offerId => OfferInfo) mapping(uint256 => OfferInfo) public offers; constructor( address _withdrawalSCAddress, address initialOwner ) payable Ownable(initialOwner) { withdrawalSCAddress = _withdrawalSCAddress; } /************************************************************ ========================= Functions ========================= ************************************************************/ /** * @notice Function for creating NFT sale and receiving NFT from `msg.sender` * @notice Need msg.sender approve * @param price Price in wei * @param nftId Id of NFT * @param nftAddress Address of NFT contract */ function putNFTForSell( uint256 price, uint256 nftId, address nftAddress, uint256 tokensAmount ) public { uint256 availableAmount = IOffer(nftAddress).nftIdToTokensAmount(nftId); if (tokensAmount == 0) revert NotCorrectAmount(availableAmount); if (tokensAmount > availableAmount) revert NotCorrectAmount(availableAmount); IERC721(nftAddress).safeTransferFrom(msg.sender, address(this), nftId); nftSales[saleId] = NFTSaleInfo( price, nftId, nftAddress, msg.sender, tokensAmount, availableAmount, false ); emit NFTSaleCreated( msg.sender, nftAddress, price, nftId, saleId, tokensAmount ); ++saleId; } /** * @notice Function for purchase NFT * @param _saleId Id of NFT sale */ function buyNFT(uint256 _saleId) public payable { NFTSaleInfo memory nftSaleInfo = nftSales[_saleId]; if (nftSaleInfo.tokensAmount != nftSaleInfo.availableTokensAmount) revert NotForFullSell(); ( uint256 sellerCommission, uint256 sellerDiscount, uint256 sellerRefferalsProfit, uint16 sellerProfitPercent, address sellerInfluencer, uint256 buyerCommission, uint256 buyerDiscount, uint256 buyerRefferalsProfit, uint16 buyerProfitPercent, address buyerInfluencer ) = getBuyerSellerCommisionInfo( nftSaleInfo.price, nftSaleInfo.nftAddress, nftSaleInfo.sellerAddress, msg.sender ); buyNFTCheck( nftSaleInfo.isWithdrawed, nftSaleInfo.sellerAddress, nftSaleInfo.price, nftSaleInfo.nftAddress ); nftSales[_saleId].isWithdrawed = true; payable(nftSaleInfo.sellerAddress).transfer( nftSaleInfo.price - sellerCommission ); // Calculating commission for withdrawalSC uint256 calculatedSellerCommission = sellerCommission - sellerDiscount - sellerRefferalsProfit; uint256 calculatedBuyerCommission = buyerCommission - buyerDiscount - buyerRefferalsProfit; payable(withdrawalSCAddress).transfer( calculatedSellerCommission + calculatedBuyerCommission ); // Sending profit for influencers if (sellerProfitPercent > 0) payable(sellerInfluencer).transfer(sellerRefferalsProfit); if (buyerProfitPercent > 0) payable(buyerInfluencer).transfer(buyerRefferalsProfit); IERC721(nftSaleInfo.nftAddress).safeTransferFrom( address(this), msg.sender, nftSaleInfo.nftId ); emit NFTBoughtFromMarketplace( msg.sender, nftSaleInfo.nftAddress, nftSaleInfo.nftId, _saleId, sellerRefferalsProfit, buyerRefferalsProfit ); } /** * @notice Function for purchase part of NFT * @param _saleId Id of NFT sale */ function buyPartNFT(uint256 _saleId) public payable { NFTSaleInfo memory nftSaleInfo = nftSales[_saleId]; uint256 percentPart = (nftSaleInfo.tokensAmount * PERCENT_DIVIDER) / nftSaleInfo.availableTokensAmount; uint256 priceOfPart = (nftSaleInfo.price * percentPart) / PERCENT_DIVIDER; ( uint256 sellerCommission, uint256 sellerDiscount, uint256 sellerRefferalsProfit, uint16 sellerProfitPercent, address sellerInfluencer, uint256 buyerCommission, uint256 buyerDiscount, uint256 buyerRefferalsProfit, uint16 buyerProfitPercent, address buyerInfluencer ) = getBuyerSellerCommisionInfo( priceOfPart, nftSaleInfo.nftAddress, nftSaleInfo.sellerAddress, msg.sender ); if (nftSaleInfo.tokensAmount == nftSaleInfo.availableTokensAmount) revert NotPartialSell(); buyNFTCheck( nftSaleInfo.isWithdrawed, nftSaleInfo.sellerAddress, priceOfPart, nftSaleInfo.nftAddress ); nftSales[_saleId].isWithdrawed = true; payable(nftSaleInfo.sellerAddress).transfer( priceOfPart - sellerCommission - sellerDiscount ); // Calculating commission for withdrawalSC uint256 calculatedSellerCommission = sellerCommission - sellerDiscount - sellerRefferalsProfit; uint256 calculatedBuyerCommission = buyerCommission - buyerDiscount - buyerRefferalsProfit; payable(withdrawalSCAddress).transfer( calculatedSellerCommission + calculatedBuyerCommission ); // Sending profit for influencers if (sellerProfitPercent > 0) payable(sellerInfluencer).transfer(sellerRefferalsProfit); if (buyerProfitPercent > 0) payable(buyerInfluencer).transfer(buyerRefferalsProfit); (uint256 buyerNFTId, uint256 sellerNFTId) = IOffer( nftSaleInfo.nftAddress ).splitNFT( nftSaleInfo.nftId, nftSaleInfo.tokensAmount, msg.sender, nftSaleInfo.sellerAddress ); emit PartialNFTSold( msg.sender, nftSaleInfo.sellerAddress, _saleId, buyerNFTId, sellerNFTId, sellerRefferalsProfit, buyerRefferalsProfit ); } function makeOffer(uint256 _saleId, uint256 tokenAmount) public { NFTSaleInfo memory nftSale = nftSales[_saleId]; if (nftSale.nftId == 0) revert SaleNotExists(); if (nftSale.isWithdrawed) revert AlreadyReturned(); uint256 availableAmount = getTokensAmount( nftSale.nftId, nftSale.nftAddress ); if (tokenAmount == 0) revert NotCorrectAmount(availableAmount); if (tokenAmount >= availableAmount) revert NotCorrectAmount(availableAmount); offers[offerId] = OfferInfo(_saleId, tokenAmount, msg.sender); emit OfferMade(offerId, _saleId, tokenAmount, msg.sender); ++offerId; } /** * @notice Function for approving * @notice Need buyer's approve on WETH contract * @param _offerId Id of offer */ function approveOffer(uint256 _offerId) public payable { OfferInfo memory offerInfo = offers[_offerId]; NFTSaleInfo memory nftSaleInfo = nftSales[offerInfo.saleId]; uint256 percentPart = (offerInfo.tokensAmount * PERCENT_DIVIDER) / nftSaleInfo.availableTokensAmount; uint256 priceOfPart = (nftSaleInfo.price * percentPart) / PERCENT_DIVIDER; ( uint256 sellerCommission, uint256 sellerDiscount, uint256 sellerRefferalsProfit, uint16 sellerProfitPercent, address sellerInfluencer, uint256 buyerCommission, uint256 buyerDiscount, uint256 buyerRefferalsProfit, uint16 buyerProfitPercent, address buyerInfluencer ) = getBuyerSellerCommisionInfo( priceOfPart, nftSaleInfo.nftAddress, msg.sender, offerInfo.bidder ); if (msg.sender != nftSaleInfo.sellerAddress) revert NotSeller(); if (nftSaleInfo.isWithdrawed) revert AlreadyBought(); if (msg.value != sellerCommission - sellerDiscount) revert NotCorrectCommission( msg.value, sellerCommission, sellerDiscount ); IERC20 wETH = IERC20(WETH_ADDRESS); // transfer value to seller wETH.transferFrom( offerInfo.bidder, nftSaleInfo.sellerAddress, priceOfPart ); // transfer WETH (commission from buyer) wETH.transferFrom( offerInfo.bidder, withdrawalSCAddress, buyerCommission - buyerDiscount - buyerRefferalsProfit ); // sending profit to buyer influencer if (buyerProfitPercent > 0) wETH.transferFrom( offerInfo.bidder, buyerInfluencer, buyerRefferalsProfit ); // transfer native ETH (commission from seller) payable(withdrawalSCAddress).transfer( sellerCommission - sellerDiscount - sellerRefferalsProfit ); // sending profit to seller influencer if (sellerProfitPercent > 0) payable(sellerInfluencer).transfer(sellerRefferalsProfit); // update state nftSales[offerInfo.saleId].isWithdrawed = true; IOffer(nftSaleInfo.nftAddress).splitNFT( nftSaleInfo.nftId, nftSaleInfo.tokensAmount, offerInfo.bidder, nftSaleInfo.sellerAddress ); emit OfferApproved( _offerId, offerInfo.saleId, sellerRefferalsProfit, buyerRefferalsProfit ); } /** * @notice Function for returning NFT * @param _saleId Id of sale */ function returnNFT(uint256 _saleId) public { NFTSaleInfo memory info = nftSales[_saleId]; if (info.isWithdrawed) revert AlreadyReturned(); if (msg.sender != info.sellerAddress) revert NotSeller(); nftSales[_saleId].isWithdrawed = true; IERC721(info.nftAddress).safeTransferFrom( address(this), info.sellerAddress, info.nftId ); emit NFTReturnedFromMarketplace(info.nftAddress, info.nftId, _saleId); } function buyNFTCheck( bool isWithdrawed, address sellerAddress, uint256 price, address nftAddress ) private { (uint256 commission, uint256 discount) = getCommissionAmount( price, nftAddress, msg.sender ); if (isWithdrawed) revert AlreadyBought(); if (sellerAddress == address(0)) revert SaleNotExists(); if (msg.sender == sellerAddress) revert NotForSeller(); if (msg.value != price + (commission - discount)) revert NotCorrectValue(msg.value, price, commission, discount); } /** * @notice Function for getting amount of commission * @param price Price of tokens * @param nftAddress Address of NFT contract * @param userAddress Address of user */ function getCommissionAmount( uint256 price, address nftAddress, address userAddress ) internal view returns (uint256, uint256) { uint256 commissionPercent = IOffer(nftAddress).commissionPercent(); uint256 commission = (price * commissionPercent) / MULTIPLIER; uint256 discountValueFromFactory = IOfferFactory(withdrawalSCAddress) .discount(); address influencer = IOfferFactory(withdrawalSCAddress) .refferalToInfluencer(userAddress); uint256 discount = influencer != address(0) ? (commission * discountValueFromFactory) / PERCENT_DIVIDER : 0; return (commission, discount); } /** * @notice Function for calculating profit from refferal and getting influencer * @param commission Value of commission */ function getRefferalsInfo( uint256 commission, address userAddress ) internal view returns (uint256, uint16, address) { IOfferFactory factory = IOfferFactory(withdrawalSCAddress); address influencer = factory.refferalToInfluencer(userAddress); uint16 influencerProfitPercent = factory.influencerProfitPercents( influencer ); uint256 profit = (commission * influencerProfitPercent) / MULTIPLIER; return (profit, influencerProfitPercent, influencer); } function getBuyerSellerCommisionInfo( uint256 _priceOfPart, address _nftAddress, address _sellerAddress, address _buyerAddress ) private view returns ( uint256, uint256, uint256, uint16, address, uint256, uint256, uint256, uint16, address ) { ( uint256 sellerCommission, uint256 sellerDiscount ) = getCommissionAmount(_priceOfPart, _nftAddress, _sellerAddress); ( uint256 sellerRefferalsProfit, uint16 sellerProfitPercent, address sellerInfluencer ) = getRefferalsInfo(sellerCommission, _sellerAddress); (uint256 buyerCommission, uint256 buyerDiscount) = getCommissionAmount( _priceOfPart, _nftAddress, _buyerAddress ); ( uint256 buyerRefferalsProfit, uint16 buyerProfitPercent, address buyerInfluencer ) = getRefferalsInfo(buyerCommission, _buyerAddress); return ( sellerCommission, sellerDiscount, sellerRefferalsProfit, sellerProfitPercent, sellerInfluencer, buyerCommission, buyerDiscount, buyerRefferalsProfit, buyerProfitPercent, buyerInfluencer ); } function getTokensAmount( uint256 nftId, address nftAddress ) internal view returns (uint256) { return IOffer(nftAddress).nftIdToTokensAmount(nftId); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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 v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 address zero. * * 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 v5.0.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.20; import {IERC721Receiver} from "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or * {IERC721-setApprovalForAll}. */ abstract contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @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); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.26; interface IOffer { function splitNFT( uint256 _nftId, uint256 amountForBuyer, address nftBuyer, address nftSeller ) external returns(uint256, uint256); function nftIdToTokensAmount(uint256 nftId) external view returns (uint256); function commissionPercent() external view returns (uint256); }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.26; interface IOfferFactory { function refferalToInfluencer(address _refferal) external view returns (address); function influencerProfitPercents(address _influencer) external view returns (uint16); function discount() external view returns (uint16); }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1000000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"_withdrawalSCAddress","type":"address"},{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"AlreadyBought","type":"error"},{"inputs":[],"name":"AlreadyReturned","type":"error"},{"inputs":[{"internalType":"uint256","name":"availableAmount","type":"uint256"}],"name":"NotCorrectAmount","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"commission","type":"uint256"},{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"NotCorrectCommission","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"commission","type":"uint256"},{"internalType":"uint256","name":"discount","type":"uint256"}],"name":"NotCorrectValue","type":"error"},{"inputs":[],"name":"NotForFullSell","type":"error"},{"inputs":[],"name":"NotForSeller","type":"error"},{"inputs":[],"name":"NotPartialSell","type":"error"},{"inputs":[],"name":"NotSeller","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"SaleNotExists","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerRefferalsProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyerRefferalsProfit","type":"uint256"}],"name":"NFTBoughtFromMarketplace","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"}],"name":"NFTReturnedFromMarketplace","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sellerAddress","type":"address"},{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"NFTSaleCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerRefferalsProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyerRefferalsProfit","type":"uint256"}],"name":"OfferApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyerAddress","type":"address"},{"indexed":false,"internalType":"address","name":"sellerAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"saleId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyerNFTId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerNFTId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerRefferalsProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyerRefferalsProfit","type":"uint256"}],"name":"PartialNFTSold","type":"event"},{"inputs":[{"internalType":"uint256","name":"_offerId","type":"uint256"}],"name":"approveOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleId","type":"uint256"}],"name":"buyNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleId","type":"uint256"}],"name":"buyPartNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleId","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftSales","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"address","name":"sellerAddress","type":"address"},{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"uint256","name":"availableTokensAmount","type":"uint256"},{"internalType":"bool","name":"isWithdrawed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"uint256","name":"saleId","type":"uint256"},{"internalType":"uint256","name":"tokensAmount","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokensAmount","type":"uint256"}],"name":"putNFTForSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_saleId","type":"uint256"}],"name":"returnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0601f61248938819003918201601f19168301916001600160401b038311848410176100fc5780849260409485528339810103126100f75761004181610112565b906001600160a01b039061005790602001610112565b169081156100e157600080546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36001808055600255600380546001600160a01b0319166001600160a01b039290921691909117905561236290816101278239608051815050f35b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100f75756fe60a080604052600436101561001d575b50361561001b57600080fd5b005b60006080526080513560e01c90816305b7cdd31461199557508063150b7a021461187057806334c1d5ef1461153e57806344432bfc1461148057806351ed82881461105c578063715018a614610fba5780638a72ea6a14610f415780638da5cb5b14610eed578063a5d7c10a146108cc578063b0cd2aa014610645578063d11357fc146101b45763f2fde38b146100b4573861000f565b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5773ffffffffffffffffffffffffffffffffffffffff610100611c33565b610108611f50565b16801561017c5760805180547fffffffffffffffffffffffff000000000000000000000000000000000000000081168317825573ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360805180f35b7f1e4fbdf700000000000000000000000000000000000000000000000000000000608051526080516004526024608051fd5b60805180fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576004356080515260046020526102e36040608051206040519061020082611c7e565b805482526001810154602083015273ffffffffffffffffffffffffffffffffffffffff600282015416604083015273ffffffffffffffffffffffffffffffffffffffff6003820154166060830152606461029361028c610284600485015480608088015260ff600660058801549760a08a01988952015416151560c0880152611d9c565b845190611dc5565b8451611db2565b60408401516060850151929091049273ffffffffffffffffffffffffffffffffffffffff9283169290916102d691166102cd848287611fe5565b929094856121f4565b9391989092339088611fe5565b6102f092919233846121f4565b989199909760808c01519051146106195761038c846103878473ffffffffffffffffffffffffffffffffffffffff8f8061034060c060609301511515898585850151168660408601511692611e2c565b60043560805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501511694611d82565b611d82565b60805191811561060f575b60805192839283928392f115610566576103876103c6926103c08d6103876103e5978e96611d82565b95611d82565b73ffffffffffffffffffffffffffffffffffffffff6003541692611d8f565b608051918115610605575b60805192839283928392f1156105665761ffff166105bc575b5061ffff16610573575b506040828101516020840151608080860151606087015185517fe5e03c840000000000000000000000000000000000000000000000000000000081526004810194909452602484019190915233604484015273ffffffffffffffffffffffffffffffffffffffff908116606484015290519194939285926084928492165af1938415610566577fc90266c443ed87d39323ca7295afbe1c5962592e9176f17a213685404e1b41989460e0946080519460805192610517575b50606073ffffffffffffffffffffffffffffffffffffffff910151169360405194338652602086015260043560408601526060850152608084015260a083015260c0820152a160805180f35b6060955073ffffffffffffffffffffffffffffffffffffffff9192506105549060403d60401161055f575b61054c8183611ce5565b810190611e16565b9590959291506104cb565b503d610542565b6040513d608051823e3d90fd5b6080519082156105b2575b6080519160805191846080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665783610413565b6108fc915061057e565b6080519086156105fb575b6080519160805191886080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665785610409565b6108fc91506105c7565b6108fc92506103f0565b6108fc9250610397565b7f13a1d59d00000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576004358060805152600460205260406080512060405161069381611c7e565b815481526001820154916020820192835260c073ffffffffffffffffffffffffffffffffffffffff600283015416926040810193845260ff600673ffffffffffffffffffffffffffffffffffffffff600386015416946060840195865260048101546080850152600581015460a0850152015416151591829101526108a05773ffffffffffffffffffffffffffffffffffffffff8151163303610874578360805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff808351169151168351823b156101ae576040517f42842e0e00000000000000000000000000000000000000000000000000000000815260805130600483015273ffffffffffffffffffffffffffffffffffffffff909316602482015260448101919091529182908180606481010391608051905af1801561056657610857575b7f517d843c6a9bb1fdeaf690730b10760d1cc1cf82c528e488c0e926bfc0bf906d6060848673ffffffffffffffffffffffffffffffffffffffff865116915160405192835260208301526040820152a160805180f35b60805191929161086691611ce5565b6080516101ae579083610801565b7f5ec8235100000000000000000000000000000000000000000000000000000000608051526004608051fd5b7f6d6a4f9f00000000000000000000000000000000000000000000000000000000608051526004608051fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526005602052600673ffffffffffffffffffffffffffffffffffffffff6060604060805120610a166040519161093183611cc9565b805480845285600260018401549360208701948552015416604085015260805152600460205260646109d66109cf6040608051206109c760ff6040519b8c9361097985611c7e565b80548552600181015460208601528c60028201541660408601528c6003820154168c8601526004810154608086015260a0600582015495019485520154169560c08c01961515875251611d9c565b905190611dc5565b8851611db2565b60408881015190860151881697908116939288928a92610a1f929091046109fe338883611fe5565b959096610a0b33896121f4565b9b919e909a85611fe5565b959092836121f4565b95919d909701511633036108745751610ec157610a3c8688611d82565b3403610e895760408a81015160608f015191517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152911660248201526044810192909252602082806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af1918215610566578b61038773ffffffffffffffffffffffffffffffffffffffff60408e610b199560209860805150610e6e575b500151169673ffffffffffffffffffffffffffffffffffffffff6003541694611d82565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9586166004820152949091166024850152604484015282806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af18015610566578a938a9361ffff92610e51575b5016610d86575b5050610387610bce9273ffffffffffffffffffffffffffffffffffffffff6003541694611d82565b608051918115610d7c575b60805192839283928392f1156105665761ffff16610d33575b508051608080519190915260046020818152825160409081902060060180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055878101519188015188850151828701516060909a015183517fe5e03c8400000000000000000000000000000000000000000000000000000000815295860192909252602485015273ffffffffffffffffffffffffffffffffffffffff9889166044850152881660648401529251919687926084928492165af1908115610566577fc9147cd202e914669895ebeda10ccd8978cf9aded12889e0cc5b92fba907c4fd94610d0c92610d15575b505191604051938493600435859094939260609260808301968352602083015260408201520152565b0390a160805180f35b610d2d9060403d60401161055f5761054c8183611ce5565b50610ce3565b608051908415610d72575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665784610bf2565b6108fc9150610d3e565b6108fc9250610bd9565b60408881015190517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116602482015260448101919091529050602081806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af1801561056657610bce92899261038792610e22575b5092889150610ba6565b610e439060203d602011610e4a575b610e3b8183611ce5565b810190611dfe565b508b610e18565b503d610e31565b610e699060203d602011610e4a57610e3b8183611ce5565b610b9f565b610e8490893d8b11610e4a57610e3b8183611ce5565b610af5565b85877fa7c240730000000000000000000000000000000000000000000000000000000060805152346004526024526044526064608051fd5b7f0b3465c200000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae576080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57602073ffffffffffffffffffffffffffffffffffffffff6080515416604051908152f35b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526005602052606060406080512080549073ffffffffffffffffffffffffffffffffffffffff60026001830154920154169060405192835260208301526040820152f35b346101ae576080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57610ff2611f50565b60805180547fffffffffffffffffffffffff00000000000000000000000000000000000000008116825573ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360805180f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526004602052604060805120604051906110a582611c7e565b805482526001810154602083015273ffffffffffffffffffffffffffffffffffffffff600282015416604083015273ffffffffffffffffffffffffffffffffffffffff6003820154166060830152600481015480608084015260ff60066005840154938460a0870152015416151560c0840152036114545780519073ffffffffffffffffffffffffffffffffffffffff6040820151169161117173ffffffffffffffffffffffffffffffffffffffff60608401511661117d611168828786611fe5565b939092836121f4565b92919590973391611fe5565b969061118933826121f4565b96919990956111d760c08b015115158b73ffffffffffffffffffffffffffffffffffffffff60608201511673ffffffffffffffffffffffffffffffffffffffff604083519301511692611e2c565b60043560805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff60608b01511661123b828c51611d82565b60805191811561144a575b60805192839283928392f115610566576103876103c6926103c08b6103878f959761127098611d82565b608051918115611440575b60805192839283928392f1156105665761ffff166113f7575b5061ffff166113ae575b5073ffffffffffffffffffffffffffffffffffffffff6040830151166020830151813b156101ae576040517f42842e0e00000000000000000000000000000000000000000000000000000000815260808051306004840152336024840152604483019390935251909283916064918391905af1801561056657611395575b50604082810151602093840151825133815273ffffffffffffffffffffffffffffffffffffffff90921694820194909452908101929092526004356060830152608082015260a08101919091527f717d06d30997e89eef967a42478791fa9d1b26d0243c0209d549851e5c307cf3908060c08101610d0c565b6080516113a191611ce5565b6080516101ae578361131c565b6080519084156113ed575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f115610566578361129e565b6108fc91506113b9565b608051908415611436575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665785611294565b6108fc9150611402565b6108fc925061127b565b6108fc9250611246565b7ff60085b100000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5760043560805152600460205260e060406080512080549060018101549073ffffffffffffffffffffffffffffffffffffffff60028201541673ffffffffffffffffffffffffffffffffffffffff60038301541660048301549160ff600660058601549501541694604051968752602087015260408601526060850152608084015260a0830152151560c0820152f35b346101ae5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5760443573ffffffffffffffffffffffffffffffffffffffff811690602435906004358382036101ae5760643591604051927f9a06b0b1000000000000000000000000000000000000000000000000000000008452846004850152602084602481895afa938415610566576080519461183c575b50801561180c5783811161180c57853b156101ae576040517f42842e0e0000000000000000000000000000000000000000000000000000000081526080513360048301523060248301526044820187905290919082806064810103816080518b5af19687156105665760067f2fee70c317c7ecaeff2d718d52c77a658fa4eb6943f4ca16cc6a8d2ce1821159966117e9946117f19a6117fa575b506040519061168882611c7e565b87825260208201938a85526040830190815273ffffffffffffffffffffffffffffffffffffffff6060840133815281608086019389855260a0870195865260c08701986080518a52600154608051526004602052604060805120975188555160018801555116826002870191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055511673ffffffffffffffffffffffffffffffffffffffff6003850191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055516004830155516005820155019051151560ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600154809660405195869533879273ffffffffffffffffffffffffffffffffffffffff60a09592989796938160c087019a1686521660208501526040840152606083015260808201520152565b0390a1611d26565b60015560805180f35b60805161180691611ce5565b8a61167a565b837f69ff0f0c00000000000000000000000000000000000000000000000000000000608051526004526024608051fd5b9093506020813d602011611868575b8161185860209383611ce5565b810103126101ae575192866115e0565b3d915061184b565b346101ae5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576118a7611c33565b506118b0611c5b565b5060643567ffffffffffffffff81116101ae57366023820112156101ae5780600401359067ffffffffffffffff8211611964576040519161191960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611ce5565b80835236602482840101116101ae5780602460209301838501376080519201015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b7f4e487b71000000000000000000000000000000000000000000000000000000006080515260416004526024608051fd5b346101ae5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435906024359082608051526004602052604060805120906119e681611c7e565b81548152600182015490602081019180835260c060ff600673ffffffffffffffffffffffffffffffffffffffff600288015416966040860197885273ffffffffffffffffffffffffffffffffffffffff600382015416606087015260048101546080870152600581015460a08701520154169201911515825215611c0757516108a05773ffffffffffffffffffffffffffffffffffffffff60209151925116916024604051809481937f9a06b0b100000000000000000000000000000000000000000000000000000000835260048301525afa9081156105665760805191611bd5575b508115611ba65780821015611ba657507f9acbe117161a06df774887046f66a09c3dffa69c80a9984f2e303e1939b1b0336080611b9d93604051611b0c81611cc9565b81815273ffffffffffffffffffffffffffffffffffffffff600281602084018881526040850190338252835488515260056020526040885120955186555160018601555116920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600254936040519185835260208301526040820152336060820152a1611d26565b60025560805180f35b7f69ff0f0c00000000000000000000000000000000000000000000000000000000608051526004526024608051fd5b90506020813d602011611bff575b81611bf060209383611ce5565b810103126101ae575183611ac9565b3d9150611be3565b7f2128d12000000000000000000000000000000000000000000000000000000000608051526004608051fd5b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611c5657565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611c5657565b60e0810190811067ffffffffffffffff821117611c9a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117611c9a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c9a57604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d535760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611d5357565b91908201809211611d5357565b90606482029180830460641490151715611d5357565b81810292918115918404141715611d5357565b8115611dcf570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90816020910312611c5657518015158103611c565790565b9190826040910312611c56576020825192015190565b92611e3990339084611fe5565b919093611f265773ffffffffffffffffffffffffffffffffffffffff168015611efc573314611ed257611e75611e6f8285611d82565b83611d8f565b3403611e8057505050565b611ece906040519384937f42d45f7800000000000000000000000000000000000000000000000000000000855234600486019094939260609260808301968352602083015260408201520152565b0390fd5b7fccdbee850000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2128d1200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0b3465c20000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff600054163303611f7157565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b90816020910312611c56575161ffff81168103611c565790565b90816020910312611c56575173ffffffffffffffffffffffffffffffffffffffff81168103611c565790565b90602073ffffffffffffffffffffffffffffffffffffffff919493946004604051809481937f77d3550b000000000000000000000000000000000000000000000000000000008352165afa908115612169576000916121c0575b5061204d906103e892611db2565b049173ffffffffffffffffffffffffffffffffffffffff60035416604051917f6b6f4a9d000000000000000000000000000000000000000000000000000000008352602083600481855afa92831561216957600093612175575b5073ffffffffffffffffffffffffffffffffffffffff602460209260405194859384927f23f6f9680000000000000000000000000000000000000000000000000000000084521660048301525afa80156121695773ffffffffffffffffffffffffffffffffffffffff9160009161213a575b5016156121345761213061ffff6064921684611db2565b0490565b50600090565b61215c915060203d602011612162575b6121548183611ce5565b810190611fb9565b38612119565b503d61214a565b6040513d6000823e3d90fd5b602091935060246121b073ffffffffffffffffffffffffffffffffffffffff92843d86116121b9575b6121a88183611ce5565b810190611f9f565b949250506120a7565b503d61219e565b90506020813d6020116121ec575b816121db60209383611ce5565b81010312611c5657516103e861203f565b3d91506121ce565b909173ffffffffffffffffffffffffffffffffffffffff600354169173ffffffffffffffffffffffffffffffffffffffff604051947f23f6f968000000000000000000000000000000000000000000000000000000008652166004850152602084602481865afa9283156121695760249460009461230a575b50602090604051958680927f5d8162b000000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff881660048301525afa938415612169576000946122e1575b506122db6103e89161ffff861690611db2565b04929190565b6103e89194506123026122db9160203d6020116121b9576121a88183611ce5565b9491506122c8565b602091945061232590823d8411612162576121548183611ce5565b939061226d56fea264697066735822122033220585122a7ad474175aa3e7f2ac52fda9066e095cd3b4a08fe9ddee66bbc164736f6c634300081a0033000000000000000000000000d4a82dcbc25dea923c0fd0ac59b9c7fca4f4a92a000000000000000000000000c946cb236481c159f460b212b34ab246dac37fcd
Deployed Bytecode
0x60a080604052600436101561001d575b50361561001b57600080fd5b005b60006080526080513560e01c90816305b7cdd31461199557508063150b7a021461187057806334c1d5ef1461153e57806344432bfc1461148057806351ed82881461105c578063715018a614610fba5780638a72ea6a14610f415780638da5cb5b14610eed578063a5d7c10a146108cc578063b0cd2aa014610645578063d11357fc146101b45763f2fde38b146100b4573861000f565b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5773ffffffffffffffffffffffffffffffffffffffff610100611c33565b610108611f50565b16801561017c5760805180547fffffffffffffffffffffffff000000000000000000000000000000000000000081168317825573ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360805180f35b7f1e4fbdf700000000000000000000000000000000000000000000000000000000608051526080516004526024608051fd5b60805180fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576004356080515260046020526102e36040608051206040519061020082611c7e565b805482526001810154602083015273ffffffffffffffffffffffffffffffffffffffff600282015416604083015273ffffffffffffffffffffffffffffffffffffffff6003820154166060830152606461029361028c610284600485015480608088015260ff600660058801549760a08a01988952015416151560c0880152611d9c565b845190611dc5565b8451611db2565b60408401516060850151929091049273ffffffffffffffffffffffffffffffffffffffff9283169290916102d691166102cd848287611fe5565b929094856121f4565b9391989092339088611fe5565b6102f092919233846121f4565b989199909760808c01519051146106195761038c846103878473ffffffffffffffffffffffffffffffffffffffff8f8061034060c060609301511515898585850151168660408601511692611e2c565b60043560805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501511694611d82565b611d82565b60805191811561060f575b60805192839283928392f115610566576103876103c6926103c08d6103876103e5978e96611d82565b95611d82565b73ffffffffffffffffffffffffffffffffffffffff6003541692611d8f565b608051918115610605575b60805192839283928392f1156105665761ffff166105bc575b5061ffff16610573575b506040828101516020840151608080860151606087015185517fe5e03c840000000000000000000000000000000000000000000000000000000081526004810194909452602484019190915233604484015273ffffffffffffffffffffffffffffffffffffffff908116606484015290519194939285926084928492165af1938415610566577fc90266c443ed87d39323ca7295afbe1c5962592e9176f17a213685404e1b41989460e0946080519460805192610517575b50606073ffffffffffffffffffffffffffffffffffffffff910151169360405194338652602086015260043560408601526060850152608084015260a083015260c0820152a160805180f35b6060955073ffffffffffffffffffffffffffffffffffffffff9192506105549060403d60401161055f575b61054c8183611ce5565b810190611e16565b9590959291506104cb565b503d610542565b6040513d608051823e3d90fd5b6080519082156105b2575b6080519160805191846080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665783610413565b6108fc915061057e565b6080519086156105fb575b6080519160805191886080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665785610409565b6108fc91506105c7565b6108fc92506103f0565b6108fc9250610397565b7f13a1d59d00000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576004358060805152600460205260406080512060405161069381611c7e565b815481526001820154916020820192835260c073ffffffffffffffffffffffffffffffffffffffff600283015416926040810193845260ff600673ffffffffffffffffffffffffffffffffffffffff600386015416946060840195865260048101546080850152600581015460a0850152015416151591829101526108a05773ffffffffffffffffffffffffffffffffffffffff8151163303610874578360805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff808351169151168351823b156101ae576040517f42842e0e00000000000000000000000000000000000000000000000000000000815260805130600483015273ffffffffffffffffffffffffffffffffffffffff909316602482015260448101919091529182908180606481010391608051905af1801561056657610857575b7f517d843c6a9bb1fdeaf690730b10760d1cc1cf82c528e488c0e926bfc0bf906d6060848673ffffffffffffffffffffffffffffffffffffffff865116915160405192835260208301526040820152a160805180f35b60805191929161086691611ce5565b6080516101ae579083610801565b7f5ec8235100000000000000000000000000000000000000000000000000000000608051526004608051fd5b7f6d6a4f9f00000000000000000000000000000000000000000000000000000000608051526004608051fd5b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526005602052600673ffffffffffffffffffffffffffffffffffffffff6060604060805120610a166040519161093183611cc9565b805480845285600260018401549360208701948552015416604085015260805152600460205260646109d66109cf6040608051206109c760ff6040519b8c9361097985611c7e565b80548552600181015460208601528c60028201541660408601528c6003820154168c8601526004810154608086015260a0600582015495019485520154169560c08c01961515875251611d9c565b905190611dc5565b8851611db2565b60408881015190860151881697908116939288928a92610a1f929091046109fe338883611fe5565b959096610a0b33896121f4565b9b919e909a85611fe5565b959092836121f4565b95919d909701511633036108745751610ec157610a3c8688611d82565b3403610e895760408a81015160608f015191517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152911660248201526044810192909252602082806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af1918215610566578b61038773ffffffffffffffffffffffffffffffffffffffff60408e610b199560209860805150610e6e575b500151169673ffffffffffffffffffffffffffffffffffffffff6003541694611d82565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9586166004820152949091166024850152604484015282806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af18015610566578a938a9361ffff92610e51575b5016610d86575b5050610387610bce9273ffffffffffffffffffffffffffffffffffffffff6003541694611d82565b608051918115610d7c575b60805192839283928392f1156105665761ffff16610d33575b508051608080519190915260046020818152825160409081902060060180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055878101519188015188850151828701516060909a015183517fe5e03c8400000000000000000000000000000000000000000000000000000000815295860192909252602485015273ffffffffffffffffffffffffffffffffffffffff9889166044850152881660648401529251919687926084928492165af1908115610566577fc9147cd202e914669895ebeda10ccd8978cf9aded12889e0cc5b92fba907c4fd94610d0c92610d15575b505191604051938493600435859094939260609260808301968352602083015260408201520152565b0390a160805180f35b610d2d9060403d60401161055f5761054c8183611ce5565b50610ce3565b608051908415610d72575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665784610bf2565b6108fc9150610d3e565b6108fc9250610bd9565b60408881015190517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201529116602482015260448101919091529050602081806064810103816080517394373a4919b3240d86ea41593d5eba789fef38485af1801561056657610bce92899261038792610e22575b5092889150610ba6565b610e439060203d602011610e4a575b610e3b8183611ce5565b810190611dfe565b508b610e18565b503d610e31565b610e699060203d602011610e4a57610e3b8183611ce5565b610b9f565b610e8490893d8b11610e4a57610e3b8183611ce5565b610af5565b85877fa7c240730000000000000000000000000000000000000000000000000000000060805152346004526024526044526064608051fd5b7f0b3465c200000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae576080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57602073ffffffffffffffffffffffffffffffffffffffff6080515416604051908152f35b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526005602052606060406080512080549073ffffffffffffffffffffffffffffffffffffffff60026001830154920154169060405192835260208301526040820152f35b346101ae576080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57610ff2611f50565b60805180547fffffffffffffffffffffffff00000000000000000000000000000000000000008116825573ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a360805180f35b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435608051526004602052604060805120604051906110a582611c7e565b805482526001810154602083015273ffffffffffffffffffffffffffffffffffffffff600282015416604083015273ffffffffffffffffffffffffffffffffffffffff6003820154166060830152600481015480608084015260ff60066005840154938460a0870152015416151560c0840152036114545780519073ffffffffffffffffffffffffffffffffffffffff6040820151169161117173ffffffffffffffffffffffffffffffffffffffff60608401511661117d611168828786611fe5565b939092836121f4565b92919590973391611fe5565b969061118933826121f4565b96919990956111d760c08b015115158b73ffffffffffffffffffffffffffffffffffffffff60608201511673ffffffffffffffffffffffffffffffffffffffff604083519301511692611e2c565b60043560805152600460205260066040608051200160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff60608b01511661123b828c51611d82565b60805191811561144a575b60805192839283928392f115610566576103876103c6926103c08b6103878f959761127098611d82565b608051918115611440575b60805192839283928392f1156105665761ffff166113f7575b5061ffff166113ae575b5073ffffffffffffffffffffffffffffffffffffffff6040830151166020830151813b156101ae576040517f42842e0e00000000000000000000000000000000000000000000000000000000815260808051306004840152336024840152604483019390935251909283916064918391905af1801561056657611395575b50604082810151602093840151825133815273ffffffffffffffffffffffffffffffffffffffff90921694820194909452908101929092526004356060830152608082015260a08101919091527f717d06d30997e89eef967a42478791fa9d1b26d0243c0209d549851e5c307cf3908060c08101610d0c565b6080516113a191611ce5565b6080516101ae578361131c565b6080519084156113ed575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f115610566578361129e565b6108fc91506113b9565b608051908415611436575b6080519160805191866080519273ffffffffffffffffffffffffffffffffffffffff608051931690f1156105665785611294565b6108fc9150611402565b6108fc925061127b565b6108fc9250611246565b7ff60085b100000000000000000000000000000000000000000000000000000000608051526004608051fd5b346101ae5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5760043560805152600460205260e060406080512080549060018101549073ffffffffffffffffffffffffffffffffffffffff60028201541673ffffffffffffffffffffffffffffffffffffffff60038301541660048301549160ff600660058601549501541694604051968752602087015260408601526060850152608084015260a0830152151560c0820152f35b346101ae5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae5760443573ffffffffffffffffffffffffffffffffffffffff811690602435906004358382036101ae5760643591604051927f9a06b0b1000000000000000000000000000000000000000000000000000000008452846004850152602084602481895afa938415610566576080519461183c575b50801561180c5783811161180c57853b156101ae576040517f42842e0e0000000000000000000000000000000000000000000000000000000081526080513360048301523060248301526044820187905290919082806064810103816080518b5af19687156105665760067f2fee70c317c7ecaeff2d718d52c77a658fa4eb6943f4ca16cc6a8d2ce1821159966117e9946117f19a6117fa575b506040519061168882611c7e565b87825260208201938a85526040830190815273ffffffffffffffffffffffffffffffffffffffff6060840133815281608086019389855260a0870195865260c08701986080518a52600154608051526004602052604060805120975188555160018801555116826002870191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055511673ffffffffffffffffffffffffffffffffffffffff6003850191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055516004830155516005820155019051151560ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008354169116179055600154809660405195869533879273ffffffffffffffffffffffffffffffffffffffff60a09592989796938160c087019a1686521660208501526040840152606083015260808201520152565b0390a1611d26565b60015560805180f35b60805161180691611ce5565b8a61167a565b837f69ff0f0c00000000000000000000000000000000000000000000000000000000608051526004526024608051fd5b9093506020813d602011611868575b8161185860209383611ce5565b810103126101ae575192866115e0565b3d915061184b565b346101ae5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae576118a7611c33565b506118b0611c5b565b5060643567ffffffffffffffff81116101ae57366023820112156101ae5780600401359067ffffffffffffffff8211611964576040519161191960207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184611ce5565b80835236602482840101116101ae5780602460209301838501376080519201015260206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b7f4e487b71000000000000000000000000000000000000000000000000000000006080515260416004526024608051fd5b346101ae5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ae57600435906024359082608051526004602052604060805120906119e681611c7e565b81548152600182015490602081019180835260c060ff600673ffffffffffffffffffffffffffffffffffffffff600288015416966040860197885273ffffffffffffffffffffffffffffffffffffffff600382015416606087015260048101546080870152600581015460a08701520154169201911515825215611c0757516108a05773ffffffffffffffffffffffffffffffffffffffff60209151925116916024604051809481937f9a06b0b100000000000000000000000000000000000000000000000000000000835260048301525afa9081156105665760805191611bd5575b508115611ba65780821015611ba657507f9acbe117161a06df774887046f66a09c3dffa69c80a9984f2e303e1939b1b0336080611b9d93604051611b0c81611cc9565b81815273ffffffffffffffffffffffffffffffffffffffff600281602084018881526040850190338252835488515260056020526040885120955186555160018601555116920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600254936040519185835260208301526040820152336060820152a1611d26565b60025560805180f35b7f69ff0f0c00000000000000000000000000000000000000000000000000000000608051526004526024608051fd5b90506020813d602011611bff575b81611bf060209383611ce5565b810103126101ae575183611ac9565b3d9150611be3565b7f2128d12000000000000000000000000000000000000000000000000000000000608051526004608051fd5b6004359073ffffffffffffffffffffffffffffffffffffffff82168203611c5657565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff82168203611c5657565b60e0810190811067ffffffffffffffff821117611c9a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff821117611c9a57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611c9a57604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d535760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211611d5357565b91908201809211611d5357565b90606482029180830460641490151715611d5357565b81810292918115918404141715611d5357565b8115611dcf570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b90816020910312611c5657518015158103611c565790565b9190826040910312611c56576020825192015190565b92611e3990339084611fe5565b919093611f265773ffffffffffffffffffffffffffffffffffffffff168015611efc573314611ed257611e75611e6f8285611d82565b83611d8f565b3403611e8057505050565b611ece906040519384937f42d45f7800000000000000000000000000000000000000000000000000000000855234600486019094939260609260808301968352602083015260408201520152565b0390fd5b7fccdbee850000000000000000000000000000000000000000000000000000000060005260046000fd5b7f2128d1200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0b3465c20000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff600054163303611f7157565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b90816020910312611c56575161ffff81168103611c565790565b90816020910312611c56575173ffffffffffffffffffffffffffffffffffffffff81168103611c565790565b90602073ffffffffffffffffffffffffffffffffffffffff919493946004604051809481937f77d3550b000000000000000000000000000000000000000000000000000000008352165afa908115612169576000916121c0575b5061204d906103e892611db2565b049173ffffffffffffffffffffffffffffffffffffffff60035416604051917f6b6f4a9d000000000000000000000000000000000000000000000000000000008352602083600481855afa92831561216957600093612175575b5073ffffffffffffffffffffffffffffffffffffffff602460209260405194859384927f23f6f9680000000000000000000000000000000000000000000000000000000084521660048301525afa80156121695773ffffffffffffffffffffffffffffffffffffffff9160009161213a575b5016156121345761213061ffff6064921684611db2565b0490565b50600090565b61215c915060203d602011612162575b6121548183611ce5565b810190611fb9565b38612119565b503d61214a565b6040513d6000823e3d90fd5b602091935060246121b073ffffffffffffffffffffffffffffffffffffffff92843d86116121b9575b6121a88183611ce5565b810190611f9f565b949250506120a7565b503d61219e565b90506020813d6020116121ec575b816121db60209383611ce5565b81010312611c5657516103e861203f565b3d91506121ce565b909173ffffffffffffffffffffffffffffffffffffffff600354169173ffffffffffffffffffffffffffffffffffffffff604051947f23f6f968000000000000000000000000000000000000000000000000000000008652166004850152602084602481865afa9283156121695760249460009461230a575b50602090604051958680927f5d8162b000000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff881660048301525afa938415612169576000946122e1575b506122db6103e89161ffff861690611db2565b04929190565b6103e89194506123026122db9160203d6020116121b9576121a88183611ce5565b9491506122c8565b602091945061232590823d8411612162576121548183611ce5565b939061226d56fea264697066735822122033220585122a7ad474175aa3e7f2ac52fda9066e095cd3b4a08fe9ddee66bbc164736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d4a82dcbc25dea923c0fd0ac59b9c7fca4f4a92a000000000000000000000000c946cb236481c159f460b212b34ab246dac37fcd
-----Decoded View---------------
Arg [0] : _withdrawalSCAddress (address): 0xD4A82dCbc25DEA923C0Fd0ac59B9C7fcA4F4a92a
Arg [1] : initialOwner (address): 0xC946cB236481C159F460b212b34AB246daC37FcD
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d4a82dcbc25dea923c0fd0ac59b9c7fca4f4a92a
Arg [1] : 000000000000000000000000c946cb236481c159f460b212b34ab246dac37fcd
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.