More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Bid | 7119961 | 2221 days ago | IN | 0.025 ETH | 0.00174041 | ||||
Bid | 7119958 | 2221 days ago | IN | 0 ETH | 0.00176518 | ||||
Bid | 6899016 | 2260 days ago | IN | 0.025 ETH | 0.00069616 | ||||
Bid | 6721403 | 2289 days ago | IN | 0 ETH | 0.00101476 | ||||
Bid | 6564940 | 2314 days ago | IN | 0 ETH | 0.00169102 | ||||
Bid | 6564938 | 2314 days ago | IN | 0 ETH | 0.00169127 | ||||
Bid | 6564925 | 2314 days ago | IN | 0 ETH | 0.00176602 | ||||
Bid | 6440757 | 2335 days ago | IN | 0.00458802 ETH | 0.00385313 | ||||
Set Listener | 6424562 | 2337 days ago | IN | 0 ETH | 0.00042597 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SaleClockAuction
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-09-30 */ pragma solidity ^0.4.25; /// @title ERC-721 Non-Fungible Token Standard /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x80ac58cd. interface ERC721 /* is ERC165 */ { /// @dev This emits when ownership of any NFT changes by any mechanism. /// This event emits when NFTs are created (`from` == 0) and destroyed /// (`to` == 0). Exception: during contract creation, any number of NFTs /// may be created and assigned without emitting Transfer. At the time of /// any transfer, the approved address for that NFT (if any) is reset to none. /// /// MOVED THIS TO CSportsBase because of how class structure is derived. /// event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); /// @dev This emits when the approved address for an NFT is changed or /// reaffirmed. The zero address indicates there is no approved address. /// When a Transfer event emits, this also indicates that the approved /// address for that NFT (if any) is reset to none. event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); /// @dev This emits when an operator is enabled or disabled for an owner. /// The operator can manage all NFTs of the owner. event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /// @notice Count all NFTs assigned to an owner /// @dev NFTs assigned to the zero address are considered invalid, and this /// function throws for queries about the zero address. /// @param _owner An address for whom to query the balance /// @return The number of NFTs owned by `_owner`, possibly zero function balanceOf(address _owner) external view returns (uint256); /// @notice Find the owner of an NFT /// @dev NFTs assigned to zero address are considered invalid, and queries /// about them do throw. /// @param _tokenId The identifier for an NFT /// @return The address of the owner of the NFT function ownerOf(uint256 _tokenId) external view returns (address); /// @notice Transfers the ownership of an NFT from one address to another address /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. When transfer is complete, this function /// checks if `_to` is a smart contract (code size > 0). If so, it calls /// `onERC721Received` on `_to` and throws if the return value is not /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer /// @param data Additional data with no specified format, sent in call to `_to` function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; /// @notice Transfers the ownership of an NFT from one address to another address /// @dev This works identically to the other function with an extra data parameter, /// except this function just sets data to "". /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE /// TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE /// THEY MAY BE PERMANENTLY LOST /// @dev Throws unless `msg.sender` is the current owner, an authorized /// operator, or the approved address for this NFT. Throws if `_from` is /// not the current owner. Throws if `_to` is the zero address. Throws if /// `_tokenId` is not a valid NFT. /// @param _from The current owner of the NFT /// @param _to The new owner /// @param _tokenId The NFT to transfer function transferFrom(address _from, address _to, uint256 _tokenId) external payable; /// @notice Change or reaffirm the approved address for an NFT /// @dev The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized /// operator of the current owner. /// @param _approved The new approved NFT controller /// @param _tokenId The NFT to approve function approve(address _approved, uint256 _tokenId) external payable; /// @notice Enable or disable approval for a third party ("operator") to manage /// all of `msg.sender`'s assets /// @dev Emits the ApprovalForAll event. The contract MUST allow /// multiple operators per owner. /// @param _operator Address to add to the set of authorized operators /// @param _approved True if the operator is approved, false to revoke approval function setApprovalForAll(address _operator, bool _approved) external; /// @notice Get the approved address for a single NFT /// @dev Throws if `_tokenId` is not a valid NFT. /// @param _tokenId The NFT to find the approved address for /// @return The approved address for this NFT, or the zero address if there is none function getApproved(uint256 _tokenId) external view returns (address); /// @notice Query if an address is an authorized operator for another address /// @param _owner The address that owns the NFTs /// @param _operator The address that acts on behalf of the owner /// @return True if `_operator` is an approved operator for `_owner`, false otherwise function isApprovedForAll(address _owner, address _operator) external view returns (bool); } /// @title ERC-721 Non-Fungible Token Standard, optional metadata extension /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x5b5e139f. interface ERC721Metadata /* is ERC721 */ { /// @notice A descriptive name for a collection of NFTs in this contract function name() external view returns (string _name); /// @notice An abbreviated name for NFTs in this contract function symbol() external view returns (string _symbol); /// @notice A distinct Uniform Resource Identifier (URI) for a given asset. /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC /// 3986. The URI may point to a JSON file that conforms to the "ERC721 /// Metadata JSON Schema". function tokenURI(uint256 _tokenId) external view returns (string); } /// @title ERC-721 Non-Fungible Token Standard, optional enumeration extension /// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md /// Note: the ERC-165 identifier for this interface is 0x780e9d63. interface ERC721Enumerable /* is ERC721 */ { /// @notice Count NFTs tracked by this contract /// @return A count of valid NFTs tracked by this contract, where each one of /// them has an assigned and queryable owner not equal to the zero address function totalSupply() external view returns (uint256); /// @notice Enumerate valid NFTs /// @dev Throws if `_index` >= `totalSupply()`. /// @param _index A counter less than `totalSupply()` /// @return The token identifier for the `_index`th NFT, /// (sort order not specified) function tokenByIndex(uint256 _index) external view returns (uint256); /// @notice Enumerate NFTs assigned to an owner /// @dev Throws if `_index` >= `balanceOf(_owner)` or if /// `_owner` is the zero address, representing invalid NFTs. /// @param _owner An address where we are interested in NFTs owned by them /// @param _index A counter less than `balanceOf(_owner)` /// @return The token identifier for the `_index`th NFT assigned to `_owner`, /// (sort order not specified) function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256); } /// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02. interface ERC721TokenReceiver { /// @notice Handle the receipt of an NFT /// @dev The ERC721 smart contract calls this function on the recipient /// after a `transfer`. This function MAY throw to revert and reject the /// transfer. Return of other than the magic value MUST result in the /// transaction being reverted. /// Note: the contract address is always the message sender. /// @param _operator The address which called `safeTransferFrom` function /// @param _from The address which previously owned the token /// @param _tokenId The NFT identifier which is being transferred /// @param _data Additional data with no specified format /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` /// unless throwing function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4); } interface ERC165 { /// @notice Query if a contract implements an interface /// @param interfaceID The interface identifier, as specified in ERC-165 /// @dev Interface identification is specified in ERC-165. This function /// uses less than 30,000 gas. /// @return `true` if the contract implements `interfaceID` and /// `interfaceID` is not 0xffffffff, `false` otherwise function supportsInterface(bytes4 interfaceID) external view returns (bool); } /// @title Auction Core /// @dev Contains models, variables, and internal methods for the auction. contract TimeAuctionBase { // Represents an auction on an NFT struct Auction { // Current owner of NFT address seller; // Price (in wei) at beginning of auction uint128 startingPrice; // Price (in wei) at end of auction uint128 endingPrice; // Duration (in seconds) of auction uint64 duration; // Time when auction started // NOTE: 0 if this auction has been concluded uint64 startedAt; } // Reference to contract tracking NFT ownership ERC721 public nonFungibleContract; // Cut owner takes on each auction, measured in basis points (1/100 of a percent). // Values 0-10,000 map to 0%-100% uint256 public ownerCut; // Map from token ID to their corresponding auction. mapping (uint256 => Auction) tokenIdToAuction; event AuctionCreated(uint256 tokenId, address seller, uint256 startingPrice, uint256 endingPrice, uint256 duration); event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner); event AuctionCancelled(uint256 tokenId); event AuctionSettled(uint256 tokenId, uint256 price, uint256 sellerProceeds, address seller, address buyer); event AuctionRepriced(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint64 duration, uint64 startedAt); /// @dev DON'T give me your money. function() external {} // Modifiers to check that inputs can be safely stored with a certain // number of bits. We use constants and multiple modifiers to save gas. modifier canBeStoredWith32Bits(uint256 _value) { require(_value <= 4294967295); _; } // Modifiers to check that inputs can be safely stored with a certain // number of bits. We use constants and multiple modifiers to save gas. modifier canBeStoredWith64Bits(uint256 _value) { require(_value <= 18446744073709551615); _; } modifier canBeStoredWith128Bits(uint256 _value) { require(_value < 340282366920938463463374607431768211455); _; } /// @dev Returns true if the claimant owns the token. /// @param _claimant - Address claiming to own the token. /// @param _tokenId - ID of token whose ownership to verify. function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) { return (nonFungibleContract.ownerOf(_tokenId) == _claimant); } /// @dev Escrows the NFT, assigning ownership to this contract. /// Throws if the escrow fails. /// @param _owner - Current owner address of token to escrow. /// @param _tokenId - ID of token whose approval to verify. function _escrow(address _owner, uint256 _tokenId) internal { // it will throw if transfer fails nonFungibleContract.transferFrom(_owner, this, _tokenId); } /// @dev Transfers an NFT owned by this contract to another address. /// Returns true if the transfer succeeds. /// @param _receiver - Address to transfer NFT to. /// @param _tokenId - ID of token to transfer. function _transfer(address _receiver, uint256 _tokenId) internal { // it will throw if transfer fails nonFungibleContract.approve(_receiver, _tokenId); nonFungibleContract.transferFrom(address(this), _receiver, _tokenId); } /// @dev Adds an auction to the list of open auctions. Also fires the /// AuctionCreated event. /// @param _tokenId The ID of the token to be put on auction. /// @param _auction Auction to add. function _addAuction(uint256 _tokenId, Auction _auction) internal { // Require that all auctions have a duration of // at least one minute. (Keeps our math from getting hairy!) require(_auction.duration >= 1 minutes); tokenIdToAuction[_tokenId] = _auction; emit AuctionCreated( uint256(_tokenId), address(_auction.seller), uint256(_auction.startingPrice), uint256(_auction.endingPrice), uint256(_auction.duration) ); } /// @dev Cancels an auction unconditionally. function _cancelAuction(uint256 _tokenId, address _seller) internal { _removeAuction(_tokenId); _transfer(_seller, _tokenId); emit AuctionCancelled(_tokenId); } /// @dev Computes the price and transfers winnings. /// Does NOT transfer ownership of token. function _bid(uint256 _tokenId, uint256 _bidAmount) internal returns (uint256) { // Get a reference to the auction struct Auction storage auction = tokenIdToAuction[_tokenId]; // Explicitly check that this auction is currently live. // (Because of how Ethereum mappings work, we can't just count // on the lookup above failing. An invalid _tokenId will just // return an auction object that is all zeros.) require(_isOnAuction(auction)); // Check that the incoming bid is higher than the current // price uint256 price = _currentPrice(auction); require(_bidAmount >= price); // Grab a reference to the seller before the auction struct // gets deleted. address seller = auction.seller; // The bid is good! Remove the auction before sending the fees // to the sender so we can't have a reentrancy attack. _removeAuction(_tokenId); // Transfer proceeds to seller (if there are any!) if (price > 0) { // Calculate the auctioneer's cut. // (NOTE: _computeCut() is guaranteed to return a // value <= price, so this subtraction can't go negative.) uint256 auctioneerCut = _computeCut(price); uint256 sellerProceeds = price - auctioneerCut; // NOTE: Doing a transfer() in the middle of a complex // method like this is generally discouraged because of // reentrancy attacks and DoS attacks if the seller is // a contract with an invalid fallback function. We explicitly // guard against reentrancy attacks by removing the auction // before calling transfer(), and the only thing the seller // can DoS is the sale of their own asset! (And if it's an // accident, they can call cancelAuction(). ) seller.transfer(sellerProceeds); emit AuctionSettled(_tokenId, price, sellerProceeds, seller, msg.sender); } // Tell the world! emit AuctionSuccessful(_tokenId, price, msg.sender); return price; } /// @dev Removes an auction from the list of open auctions. /// @param _tokenId - ID of NFT on auction. function _removeAuction(uint256 _tokenId) internal { delete tokenIdToAuction[_tokenId]; } /// @dev Returns true if the NFT is on auction. /// @param _auction - Auction to check. function _isOnAuction(Auction storage _auction) internal view returns (bool) { return (_auction.startedAt > 0); } /// @dev Returns current price of an NFT on auction. Broken into two /// functions (this one, that computes the duration from the auction /// structure, and the other that does the price computation) so we /// can easily test that the price computation works correctly. function _currentPrice(Auction storage _auction) internal view returns (uint256) { uint256 secondsPassed = 0; // A bit of insurance against negative values (or wraparound). // Probably not necessary (since Ethereum guarnatees that the // now variable doesn't ever go backwards). if (now > _auction.startedAt) { secondsPassed = now - _auction.startedAt; } return _computeCurrentPrice( _auction.startingPrice, _auction.endingPrice, _auction.duration, secondsPassed ); } /// @dev Computes the current price of an auction. Factored out /// from _currentPrice so we can run extensive unit tests. /// When testing, make this function public and turn on /// `Current price computation` test suite. function _computeCurrentPrice( uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, uint256 _secondsPassed ) internal pure returns (uint256) { // NOTE: We don't use SafeMath (or similar) in this function because // all of our public functions carefully cap the maximum values for // time (at 64-bits) and currency (at 128-bits). _duration is // also known to be non-zero (see the require() statement in // _addAuction()) if (_secondsPassed >= _duration) { // We've reached the end of the dynamic pricing portion // of the auction, just return the end price. return _endingPrice; } else { // Starting price can be higher than ending price (and often is!), so // this delta can be negative. int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice); // This multiplication can't overflow, _secondsPassed will easily fit within // 64-bits, and totalPriceChange will easily fit within 128-bits, their product // will always fit within 256-bits. int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration); // currentPriceChange can be negative, but if so, will have a magnitude // less that _startingPrice. Thus, this result will always end up positive. int256 currentPrice = int256(_startingPrice) + currentPriceChange; return uint256(currentPrice); } } /// @dev Computes owner's cut of a sale. /// @param _price - Sale price of NFT. function _computeCut(uint256 _price) internal view returns (uint256) { // NOTE: We don't use SafeMath (or similar) in this function because // all of our entry functions carefully cap the maximum values for // currency (at 128-bits), and ownerCut <= 10000 (see the require() // statement in the TimeAuction constructor). The result of this // function is always guaranteed to be <= _price. return _price * ownerCut / 10000; } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is Ownable { event Pause(); event Unpause(); bool public paused = false; /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() onlyOwner whenNotPaused public { paused = true; emit Pause(); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() onlyOwner whenPaused public { paused = false; emit Unpause(); } } /// @title Clock auction for non-fungible tokens. contract TimeAuction is Pausable, TimeAuctionBase { /// @dev Constructor creates a reference to the NFT ownership contract /// and verifies the owner cut is in the valid range. /// @param _nftAddress - address of a deployed contract implementing /// the Nonfungible Interface. /// @param _cut - 100*(percent cut) the owner takes on each auction, must be /// between 0-10,000. constructor(address _nftAddress, uint256 _cut) public { require(_cut <= 10000); ownerCut = _cut; ERC721 candidateContract = ERC721(_nftAddress); nonFungibleContract = candidateContract; } /// @dev Remove all Ether from the contract, which is the owner's cuts /// as well as any Ether sent directly to the contract address. /// Always transfers to the NFT contract, and can only be called from /// the NFT contract. function withdrawBalance() external { address nftAddress = address(nonFungibleContract); require(msg.sender == nftAddress); nftAddress.transfer(address(this).balance); } /// @dev Creates and begins a new auction. /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of time to move between starting /// price and ending price (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller ) public whenNotPaused canBeStoredWith128Bits(_startingPrice) canBeStoredWith128Bits(_endingPrice) canBeStoredWith64Bits(_duration) { require(_owns(msg.sender, _tokenId)); _escrow(msg.sender, _tokenId); Auction memory auction = Auction( _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(now) ); _addAuction(_tokenId, auction); } /// @dev Bids on an open auction, completing the auction and transferring /// ownership of the NFT if enough Ether is supplied. /// @param _tokenId - ID of token to bid on. function bid(uint256 _tokenId) public payable whenNotPaused { // _bid will throw if the bid or funds transfer fails _bid(_tokenId, msg.value); _transfer(msg.sender, _tokenId); } /// @dev Cancels an auction that hasn't been won yet. /// Returns the NFT to original owner. /// @notice This is a state-modifying function that can /// be called while the contract is paused. An auction can /// only be cancelled by the seller. /// @param _tokenId - ID of token on auction function cancelAuction(uint256 _tokenId) public { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); address seller = auction.seller; require(msg.sender == seller); _cancelAuction(_tokenId, seller); } /// @dev Cancels an auction when the contract is paused. /// Only the owner (account that created the contract) /// may do this, and NFTs are returned to /// the seller. This should only be used in emergencies. /// @param _tokenId - ID of the NFT on auction to cancel. function cancelAuctionWhenPaused(uint256 _tokenId) whenPaused onlyOwner public { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); _cancelAuction(_tokenId, auction.seller); } /// @dev Returns auction info for an NFT on auction. /// @param _tokenId - ID of NFT on auction. function getAuction(uint256 _tokenId) public view returns ( address seller, uint256 startingPrice, uint256 endingPrice, uint256 currentPrice, uint256 duration, uint256 startedAt ) { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); uint256 price = _currentPrice(auction); return ( auction.seller, auction.startingPrice, auction.endingPrice, price, auction.duration, auction.startedAt ); } /// @dev Returns current auction prices for up to 50 auctions /// @param _tokenIds - up to 50 IDs of NFT on auction that we want the prices of function getCurrentAuctionPrices(uint128[] _tokenIds) public view returns (uint128[50]) { require (_tokenIds.length <= 50); /// @dev A fixed array we can return current auction price information in. uint128[50] memory currentPricesArray; for (uint8 i = 0; i < _tokenIds.length; i++) { Auction storage auction = tokenIdToAuction[_tokenIds[i]]; if (_isOnAuction(auction)) { uint256 price = _currentPrice(auction); currentPricesArray[i] = uint128(price); } } return currentPricesArray; } /// @dev Returns the current price of an auction. /// @param _tokenId - ID of the token price we are checking. function getCurrentPrice(uint256 _tokenId) public view returns (uint256) { Auction storage auction = tokenIdToAuction[_tokenId]; require(_isOnAuction(auction)); return _currentPrice(auction); } } /// @title Interface to allow a contract to listen to auction events. contract SaleClockAuctionListener { function implementsSaleClockAuctionListener() public pure returns (bool); function auctionCreated(uint256 tokenId, address seller, uint128 startingPrice, uint128 endingPrice, uint64 duration) public; function auctionSuccessful(uint256 tokenId, uint128 totalPrice, address seller, address buyer) public; function auctionCancelled(uint256 tokenId, address seller) public; } /// @title Clock auction modified for sale of kitties contract SaleClockAuction is TimeAuction { // @dev A listening contract that wants notifications of auction creation, // completion, and cancellation SaleClockAuctionListener public listener; // Delegate constructor constructor(address _nftAddr, uint256 _cut) public TimeAuction(_nftAddr, _cut) { } /// @dev Sanity check that allows us to ensure that we are pointing to the /// right auction in our setSaleAuctionAddress() call. function isSaleClockAuction() public pure returns (bool) { return true; } // @dev Method used to add a listener for auction events. This can only be called // if the listener has not already been set (i.e. once). This limitation is in place to prevent // malicious attempt to hijack the listening contract and perhaps try to do // something bad (like throw). Since the listener methods are called inline with our // createAuction(...), bid(...), and cancelAuction(...) methods, we need to make // sure none of the listener methods causes a revert/throw/out of gas/etc. // @param _listener - Address of a SaleClockAuctionListener compatible contract function setListener(address _listener) public { require(listener == address(0)); SaleClockAuctionListener candidateContract = SaleClockAuctionListener(_listener); require(candidateContract.implementsSaleClockAuctionListener()); listener = candidateContract; } /// @dev Creates and begins a new auction. We override the base class /// so we can add the listener capability. /// /// CALLABLE ONLY BY NFT CONTRACT /// /// @param _tokenId - ID of token to auction, sender must be owner. /// @param _startingPrice - Price of item (in wei) at beginning of auction. /// @param _endingPrice - Price of item (in wei) at end of auction. /// @param _duration - Length of auction (in seconds). /// @param _seller - Seller, if not the message sender function createAuction( uint256 _tokenId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration, address _seller ) public canBeStoredWith128Bits(_startingPrice) canBeStoredWith128Bits(_endingPrice) canBeStoredWith64Bits(_duration) { require(msg.sender == address(nonFungibleContract)); _escrow(_seller, _tokenId); Auction memory auction = Auction( _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration), uint64(now) ); _addAuction(_tokenId, auction); if (listener != address(0)) { listener.auctionCreated(_tokenId, _seller, uint128(_startingPrice), uint128(_endingPrice), uint64(_duration)); } } /// @dev Reprices (and updates duration) of an array of tokens that are currently /// being auctioned by this contract. /// /// CALLABLE ONLY BY NFT CONTRACT /// /// @param _tokenIds Array of tokenIds corresponding to auctions being updated /// @param _startingPrices New starting prices /// @param _endingPrices New ending prices /// @param _duration New duration /// @param _seller Address of the seller in all specified auctions to be updated function repriceAuctions( uint256[] _tokenIds, uint256[] _startingPrices, uint256[] _endingPrices, uint256 _duration, address _seller ) public canBeStoredWith64Bits(_duration) { require(msg.sender == address(nonFungibleContract)); uint64 timeNow = uint64(now); for (uint32 i = 0; i < _tokenIds.length; i++) { uint256 _tokenId = _tokenIds[i]; uint256 _startingPrice = _startingPrices[i]; uint256 _endingPrice = _endingPrices[i]; // Must be able to be stored in 128 bits require(_startingPrice < 340282366920938463463374607431768211455); require(_endingPrice < 340282366920938463463374607431768211455); Auction storage auction = tokenIdToAuction[_tokenId]; // Here is where we make sure the seller in the auction is correct. // Since this method can only be called by the NFT, the NFT controls // what happens here by passing in the _seller we are to require. if (auction.seller == _seller) { // Update the auction parameters auction.startingPrice = uint128(_startingPrice); auction.endingPrice = uint128(_endingPrice); auction.duration = uint64(_duration); auction.startedAt = timeNow; emit AuctionRepriced(_tokenId, _startingPrice, _endingPrice, uint64(_duration), timeNow); } } } /// @dev Place a bid to purchase multiple tokens in a single call. /// @param _tokenIds Array of IDs of tokens to bid on. function batchBid(uint256[] _tokenIds) public payable whenNotPaused { // Check to make sure the bid amount is sufficient to purchase // all of the auctions specified. uint256 totalPrice = 0; for (uint32 i = 0; i < _tokenIds.length; i++) { uint256 _tokenId = _tokenIds[i]; Auction storage auction = tokenIdToAuction[_tokenId]; totalPrice += _currentPrice(auction); } require(msg.value >= totalPrice); // Loop through auctions, placing bids to buy // for (i = 0; i < _tokenIds.length; i++) { _tokenId = _tokenIds[i]; auction = tokenIdToAuction[_tokenId]; // Need to store this before the _bid & _transfer calls // so we can fire our auctionSuccessful events address seller = auction.seller; uint256 bid = _currentPrice(auction); uint256 price = _bid(_tokenId, bid); _transfer(msg.sender, _tokenId); if (listener != address(0)) { listener.auctionSuccessful(_tokenId, uint128(price), seller, msg.sender); } } } /// @dev Does exactly what the parent does, but also notifies any /// listener of the successful bid. /// @param _tokenId - ID of token to bid on. function bid(uint256 _tokenId) public payable whenNotPaused { Auction storage auction = tokenIdToAuction[_tokenId]; // Need to store this before the _bid & _transfer calls // so we can fire our auctionSuccessful events address seller = auction.seller; // _bid will throw if the bid or funds transfer fails uint256 price = _bid(_tokenId, msg.value); _transfer(msg.sender, _tokenId); if (listener != address(0)) { listener.auctionSuccessful(_tokenId, uint128(price), seller, msg.sender); } } /// @dev Cancels an auction that hasn't been won yet by calling /// the super(...) and then notifying any listener. /// @param _tokenId - ID of token on auction function cancelAuction(uint256 _tokenId) public { super.cancelAuction(_tokenId); if (listener != address(0)) { listener.auctionCancelled(_tokenId, msg.sender); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"}],"name":"batchBid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"},{"name":"_seller","type":"address"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenIds","type":"uint128[]"}],"name":"getCurrentAuctionPrices","outputs":[{"name":"","type":"uint128[50]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"bid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getAuction","outputs":[{"name":"seller","type":"address"},{"name":"startingPrice","type":"uint256"},{"name":"endingPrice","type":"uint256"},{"name":"currentPrice","type":"uint256"},{"name":"duration","type":"uint256"},{"name":"startedAt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerCut","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isSaleClockAuction","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"cancelAuctionWhenPaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listener","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"cancelAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenIds","type":"uint256[]"},{"name":"_startingPrices","type":"uint256[]"},{"name":"_endingPrices","type":"uint256[]"},{"name":"_duration","type":"uint256"},{"name":"_seller","type":"address"}],"name":"repriceAuctions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_listener","type":"address"}],"name":"setListener","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getCurrentPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nonFungibleContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_nftAddr","type":"address"},{"name":"_cut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"startingPrice","type":"uint256"},{"indexed":false,"name":"endingPrice","type":"uint256"},{"indexed":false,"name":"duration","type":"uint256"}],"name":"AuctionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"totalPrice","type":"uint256"},{"indexed":false,"name":"winner","type":"address"}],"name":"AuctionSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"}],"name":"AuctionCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"price","type":"uint256"},{"indexed":false,"name":"sellerProceeds","type":"uint256"},{"indexed":false,"name":"seller","type":"address"},{"indexed":false,"name":"buyer","type":"address"}],"name":"AuctionSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"startingPrice","type":"uint256"},{"indexed":false,"name":"endingPrice","type":"uint256"},{"indexed":false,"name":"duration","type":"uint64"},{"indexed":false,"name":"startedAt","type":"uint64"}],"name":"AuctionRepriced","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040526000805460a060020a60ff021916905534801561002057600080fd5b506040516040806117c183398101604052805160209091015160008054600160a060020a031916331781558290829061271082111561005e57600080fd5b5060025560018054600160a060020a03909216600160a060020a0319909216919091179055505061172d806100946000396000f3006080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166309e0a9eb811461012057806327ebe40a1461016a5780633eedf7d8146101975780633f4ba83a14610225578063454a2ab31461023a5780635c975abb146102455780635fd8c7101461026e57806378bd79351461028357806383b5ff8b146102d85780638456cb59146102ff57806385b8618814610314578063878eb368146103295780638da5cb5b146103415780639551dd581461037257806396b5a755146103875780639decde191461039f578063adcd905b14610477578063c55d0f5614610498578063dd1b7a0f146104b0578063f2fde38b146104c5575b34801561011d57600080fd5b50005b60408051602060048035808201358381028086018501909652808552610168953695939460249493850192918291850190849080828437509497506104e69650505050505050565b005b34801561017657600080fd5b50610168600435602435604435606435600160a060020a03608435166106b3565b3480156101a357600080fd5b50604080516020600480358082013583810280860185019096528085526101ec953695939460249493850192918291850190849080828437509497506108459650505050505050565b604051808261064080838360005b838110156102125781810151838201526020016101fa565b5050505090500191505060405180910390f35b34801561023157600080fd5b50610168610906565b61016860043561097c565b34801561025157600080fd5b5061025a610a78565b604080519115158252519081900360200190f35b34801561027a57600080fd5b50610168610a88565b34801561028f57600080fd5b5061029b600435610ada565b60408051600160a060020a0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156102e457600080fd5b506102ed610b78565b60408051918252519081900360200190f35b34801561030b57600080fd5b50610168610b7e565b34801561032057600080fd5b5061025a610bf9565b34801561033557600080fd5b50610168600435610bfe565b34801561034d57600080fd5b50610356610c67565b60408051600160a060020a039092168252519081900360200190f35b34801561037e57600080fd5b50610356610c76565b34801561039357600080fd5b50610168600435610c85565b3480156103ab57600080fd5b506040805160206004803580820135838102808601850190965280855261016895369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497505084359550505050602090910135600160a060020a03169050610d25565b34801561048357600080fd5b50610168600160a060020a0360043516610f14565b3480156104a457600080fd5b506102ed600435610fee565b3480156104bc57600080fd5b50610356611020565b3480156104d157600080fd5b50610168600160a060020a036004351661102f565b60008060008060008060008060149054906101000a900460ff1615151561050c57600080fd5b60009650600095505b87518663ffffffff16101561057157878663ffffffff1681518110151561053857fe5b906020019060200201519450600360008681526020019081526020016000209350610562846110c3565b90960195600190950194610515565b3487111561057e57600080fd5b600095505b87518663ffffffff1610156106a957878663ffffffff168151811015156105a657fe5b602090810290910181015160008181526003909252604090912080549196509450600160a060020a031692506105db846110c3565b91506105e7858361114a565b90506105f33386611290565b600454600160a060020a03161561069e5760048054604080517f3d83230f0000000000000000000000000000000000000000000000000000000081529283018890526001608060020a0384166024840152600160a060020a0386811660448501523360648501529051911691633d83230f91608480830192600092919082900301818387803b15801561068557600080fd5b505af1158015610699573d6000803e3d6000fd5b505050505b600190950194610583565b5050505050505050565b6106bb6116b3565b846001608060020a0381106106cf57600080fd5b846001608060020a0381106106e357600080fd5b8467ffffffffffffffff8111156106f957600080fd5b600154600160a060020a0316331461071057600080fd5b61071a858a6113a6565b60a06040519081016040528086600160a060020a03168152602001896001608060020a03168152602001886001608060020a031681526020018767ffffffffffffffff1681526020014267ffffffffffffffff16815250935061077d898561141a565b600454600160a060020a03161561083a5760048054604080517f048690830000000000000000000000000000000000000000000000000000000081529283018c9052600160a060020a0388811660248501526001608060020a03808d1660448601528b16606485015267ffffffffffffffff8a166084850152905191169163048690839160a480830192600092919082900301818387803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505050505b505050505050505050565b61084d6116e1565b6108556116e1565b6000806000603286511115151561086b57600080fd5b600092505b85518360ff1610156108fc5760036000878560ff1681518110151561089157fe5b906020019060200201516001608060020a0316815260200190815260200160002091506108bd82611568565b156108f1576108cb826110c3565b9050808460ff8516603281106108dd57fe5b6001608060020a0390921660209290920201525b600190920191610870565b5091949350505050565b600054600160a060020a0316331461091d57600080fd5b60005460a060020a900460ff16151561093557600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b600080548190819060a060020a900460ff161561099857600080fd5b60008481526003602052604090208054909350600160a060020a031691506109c0843461114a565b90506109cc3385611290565b600454600160a060020a031615610a725760048054604080517f3d83230f0000000000000000000000000000000000000000000000000000000081529283018790526001608060020a0384166024840152600160a060020a0385811660448501523360648501529051911691633d83230f91608480830192600092919082900301818387803b158015610a5e57600080fd5b505af11580156106a9573d6000803e3d6000fd5b50505050565b60005460a060020a900460ff1681565b600154600160a060020a0316338114610aa057600080fd5b604051600160a060020a03821690303180156108fc02916000818181858888f19350505050158015610ad6573d6000803e3d6000fd5b5050565b60008181526003602052604081208190819081908190819081610afc82611568565b1515610b0757600080fd5b610b10826110c3565b82546001840154600290940154600160a060020a039091169b6001608060020a038086169c50700100000000000000000000000000000000909504909416995090975067ffffffffffffffff8082169750680100000000000000009091041694509092505050565b60025481565b600054600160a060020a03163314610b9557600080fd5b60005460a060020a900460ff1615610bac57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b600190565b6000805460a060020a900460ff161515610c1757600080fd5b600054600160a060020a03163314610c2e57600080fd5b506000818152600360205260409020610c4681611568565b1515610c5157600080fd5b8054610ad6908390600160a060020a0316611589565b600054600160a060020a031681565b600454600160a060020a031681565b610c8e816115d3565b600454600160a060020a031615610d225760048054604080517f7290c21d00000000000000000000000000000000000000000000000000000000815292830184905233602484015251600160a060020a0390911691637290c21d91604480830192600092919082900301818387803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050505b50565b600080808080808767ffffffffffffffff811115610d4257600080fd5b600154600160a060020a03163314610d5957600080fd5b429650600095505b8b518663ffffffff161015610f06578b8663ffffffff16815181101515610d8457fe5b9060200190602002015194508a8663ffffffff16815181101515610da457fe5b906020019060200201519350898663ffffffff16815181101515610dc457fe5b6020908102909101015192506001608060020a038410610de357600080fd5b6001608060020a038310610df657600080fd5b60008581526003602052604090208054909250600160a060020a0389811691161415610efb576001820180546fffffffffffffffffffffffffffffffff19166001608060020a038681169190911781167001000000000000000000000000000000009186169190910217905560028201805467ffffffffffffffff191667ffffffffffffffff8b81169182176fffffffffffffffff0000000000000000191668010000000000000000918b169182021790925560408051888152602081018890528082018790526060810192909252608082019290925290517fd889984bfd2c6aec35dfb3e8aa702f03b02675c9bb827ab5e5a18e80132e0dae9160a0908290030190a15b600190950194610d61565b505050505050505050505050565b600454600090600160a060020a031615610f2d57600080fd5b81905080600160a060020a031663eaf4170c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610f8757600080fd5b505af1158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b50511515610fbe57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550565b600081815260036020526040812061100581611568565b151561101057600080fd5b611019816110c3565b9392505050565b600154600160a060020a031681565b600054600160a060020a0316331461104657600080fd5b600160a060020a038116151561105b57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6002810154600090819068010000000000000000900467ffffffffffffffff164211156111095750600282015468010000000000000000900467ffffffffffffffff1642035b60018301546002840154611019916001608060020a0380821692700100000000000000000000000000000000909204169067ffffffffffffffff168461161d565b60008281526003602052604081208180808061116585611568565b151561117057600080fd5b611179856110c3565b93508387101561118857600080fd5b8454600160a060020a0316925061119e8861165a565b6000841115611245576111b0846116a7565b6040519092508285039150600160a060020a0384169082156108fc029083906000818181858888f193505050501580156111ee573d6000803e3d6000fd5b506040805189815260208101869052808201839052600160a060020a038516606082015233608082015290517fd89a4f81a4f5c550db7fd8493142082dc6088692a10703fcabe09425069dcdd79181900360a00190a15b6040805189815260208101869052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a150919695505050505050565b600154604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163095ea7b391604480830192600092919082900301818387803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b5050600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0387811660248301526044820187905291519190921693506323b872dd9250606480830192600092919082900301818387803b15801561138a57600080fd5b505af115801561139e573d6000803e3d6000fd5b505050505050565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561138a57600080fd5b603c816060015167ffffffffffffffff161015151561143857600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff199091168117825582850151600183018054868801516001608060020a0390811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080880151600290950180546080808b015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190991667ffffffffffffffff199093168317169790971790915587518a815296870194909452858701919091528401529082015290517f05f9bf100dd0ca9f37f08e0526690286d357ed7d6c5a4ac29730440b6e2dfd629181900360a00190a15050565b6002015460006801000000000000000090910467ffffffffffffffff161190565b6115928261165a565b61159c8183611290565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6000818152600360205260408120906115eb82611568565b15156115f657600080fd5b508054600160a060020a031633811461160e57600080fd5b6116188382611589565b505050565b60008080808585106116315786935061164f565b87870392508585840281151561164357fe5b05915081880190508093505b505050949350505050565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6106406040519081016040528060329060208202803883395091929150505600a165627a7a72305820c4563d097060a72e7b626edd320231b6279e41315527cee67ce244e52ccb9fed0029000000000000000000000000388f220698e807f8ead96755763c04341eacd01600000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166309e0a9eb811461012057806327ebe40a1461016a5780633eedf7d8146101975780633f4ba83a14610225578063454a2ab31461023a5780635c975abb146102455780635fd8c7101461026e57806378bd79351461028357806383b5ff8b146102d85780638456cb59146102ff57806385b8618814610314578063878eb368146103295780638da5cb5b146103415780639551dd581461037257806396b5a755146103875780639decde191461039f578063adcd905b14610477578063c55d0f5614610498578063dd1b7a0f146104b0578063f2fde38b146104c5575b34801561011d57600080fd5b50005b60408051602060048035808201358381028086018501909652808552610168953695939460249493850192918291850190849080828437509497506104e69650505050505050565b005b34801561017657600080fd5b50610168600435602435604435606435600160a060020a03608435166106b3565b3480156101a357600080fd5b50604080516020600480358082013583810280860185019096528085526101ec953695939460249493850192918291850190849080828437509497506108459650505050505050565b604051808261064080838360005b838110156102125781810151838201526020016101fa565b5050505090500191505060405180910390f35b34801561023157600080fd5b50610168610906565b61016860043561097c565b34801561025157600080fd5b5061025a610a78565b604080519115158252519081900360200190f35b34801561027a57600080fd5b50610168610a88565b34801561028f57600080fd5b5061029b600435610ada565b60408051600160a060020a0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156102e457600080fd5b506102ed610b78565b60408051918252519081900360200190f35b34801561030b57600080fd5b50610168610b7e565b34801561032057600080fd5b5061025a610bf9565b34801561033557600080fd5b50610168600435610bfe565b34801561034d57600080fd5b50610356610c67565b60408051600160a060020a039092168252519081900360200190f35b34801561037e57600080fd5b50610356610c76565b34801561039357600080fd5b50610168600435610c85565b3480156103ab57600080fd5b506040805160206004803580820135838102808601850190965280855261016895369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497505084359550505050602090910135600160a060020a03169050610d25565b34801561048357600080fd5b50610168600160a060020a0360043516610f14565b3480156104a457600080fd5b506102ed600435610fee565b3480156104bc57600080fd5b50610356611020565b3480156104d157600080fd5b50610168600160a060020a036004351661102f565b60008060008060008060008060149054906101000a900460ff1615151561050c57600080fd5b60009650600095505b87518663ffffffff16101561057157878663ffffffff1681518110151561053857fe5b906020019060200201519450600360008681526020019081526020016000209350610562846110c3565b90960195600190950194610515565b3487111561057e57600080fd5b600095505b87518663ffffffff1610156106a957878663ffffffff168151811015156105a657fe5b602090810290910181015160008181526003909252604090912080549196509450600160a060020a031692506105db846110c3565b91506105e7858361114a565b90506105f33386611290565b600454600160a060020a03161561069e5760048054604080517f3d83230f0000000000000000000000000000000000000000000000000000000081529283018890526001608060020a0384166024840152600160a060020a0386811660448501523360648501529051911691633d83230f91608480830192600092919082900301818387803b15801561068557600080fd5b505af1158015610699573d6000803e3d6000fd5b505050505b600190950194610583565b5050505050505050565b6106bb6116b3565b846001608060020a0381106106cf57600080fd5b846001608060020a0381106106e357600080fd5b8467ffffffffffffffff8111156106f957600080fd5b600154600160a060020a0316331461071057600080fd5b61071a858a6113a6565b60a06040519081016040528086600160a060020a03168152602001896001608060020a03168152602001886001608060020a031681526020018767ffffffffffffffff1681526020014267ffffffffffffffff16815250935061077d898561141a565b600454600160a060020a03161561083a5760048054604080517f048690830000000000000000000000000000000000000000000000000000000081529283018c9052600160a060020a0388811660248501526001608060020a03808d1660448601528b16606485015267ffffffffffffffff8a166084850152905191169163048690839160a480830192600092919082900301818387803b15801561082157600080fd5b505af1158015610835573d6000803e3d6000fd5b505050505b505050505050505050565b61084d6116e1565b6108556116e1565b6000806000603286511115151561086b57600080fd5b600092505b85518360ff1610156108fc5760036000878560ff1681518110151561089157fe5b906020019060200201516001608060020a0316815260200190815260200160002091506108bd82611568565b156108f1576108cb826110c3565b9050808460ff8516603281106108dd57fe5b6001608060020a0390921660209290920201525b600190920191610870565b5091949350505050565b600054600160a060020a0316331461091d57600080fd5b60005460a060020a900460ff16151561093557600080fd5b6000805474ff0000000000000000000000000000000000000000191681556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b339190a1565b600080548190819060a060020a900460ff161561099857600080fd5b60008481526003602052604090208054909350600160a060020a031691506109c0843461114a565b90506109cc3385611290565b600454600160a060020a031615610a725760048054604080517f3d83230f0000000000000000000000000000000000000000000000000000000081529283018790526001608060020a0384166024840152600160a060020a0385811660448501523360648501529051911691633d83230f91608480830192600092919082900301818387803b158015610a5e57600080fd5b505af11580156106a9573d6000803e3d6000fd5b50505050565b60005460a060020a900460ff1681565b600154600160a060020a0316338114610aa057600080fd5b604051600160a060020a03821690303180156108fc02916000818181858888f19350505050158015610ad6573d6000803e3d6000fd5b5050565b60008181526003602052604081208190819081908190819081610afc82611568565b1515610b0757600080fd5b610b10826110c3565b82546001840154600290940154600160a060020a039091169b6001608060020a038086169c50700100000000000000000000000000000000909504909416995090975067ffffffffffffffff8082169750680100000000000000009091041694509092505050565b60025481565b600054600160a060020a03163314610b9557600080fd5b60005460a060020a900460ff1615610bac57600080fd5b6000805474ff0000000000000000000000000000000000000000191660a060020a1781556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff6259190a1565b600190565b6000805460a060020a900460ff161515610c1757600080fd5b600054600160a060020a03163314610c2e57600080fd5b506000818152600360205260409020610c4681611568565b1515610c5157600080fd5b8054610ad6908390600160a060020a0316611589565b600054600160a060020a031681565b600454600160a060020a031681565b610c8e816115d3565b600454600160a060020a031615610d225760048054604080517f7290c21d00000000000000000000000000000000000000000000000000000000815292830184905233602484015251600160a060020a0390911691637290c21d91604480830192600092919082900301818387803b158015610d0957600080fd5b505af1158015610d1d573d6000803e3d6000fd5b505050505b50565b600080808080808767ffffffffffffffff811115610d4257600080fd5b600154600160a060020a03163314610d5957600080fd5b429650600095505b8b518663ffffffff161015610f06578b8663ffffffff16815181101515610d8457fe5b9060200190602002015194508a8663ffffffff16815181101515610da457fe5b906020019060200201519350898663ffffffff16815181101515610dc457fe5b6020908102909101015192506001608060020a038410610de357600080fd5b6001608060020a038310610df657600080fd5b60008581526003602052604090208054909250600160a060020a0389811691161415610efb576001820180546fffffffffffffffffffffffffffffffff19166001608060020a038681169190911781167001000000000000000000000000000000009186169190910217905560028201805467ffffffffffffffff191667ffffffffffffffff8b81169182176fffffffffffffffff0000000000000000191668010000000000000000918b169182021790925560408051888152602081018890528082018790526060810192909252608082019290925290517fd889984bfd2c6aec35dfb3e8aa702f03b02675c9bb827ab5e5a18e80132e0dae9160a0908290030190a15b600190950194610d61565b505050505050505050505050565b600454600090600160a060020a031615610f2d57600080fd5b81905080600160a060020a031663eaf4170c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610f8757600080fd5b505af1158015610f9b573d6000803e3d6000fd5b505050506040513d6020811015610fb157600080fd5b50511515610fbe57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039290921691909117905550565b600081815260036020526040812061100581611568565b151561101057600080fd5b611019816110c3565b9392505050565b600154600160a060020a031681565b600054600160a060020a0316331461104657600080fd5b600160a060020a038116151561105b57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6002810154600090819068010000000000000000900467ffffffffffffffff164211156111095750600282015468010000000000000000900467ffffffffffffffff1642035b60018301546002840154611019916001608060020a0380821692700100000000000000000000000000000000909204169067ffffffffffffffff168461161d565b60008281526003602052604081208180808061116585611568565b151561117057600080fd5b611179856110c3565b93508387101561118857600080fd5b8454600160a060020a0316925061119e8861165a565b6000841115611245576111b0846116a7565b6040519092508285039150600160a060020a0384169082156108fc029083906000818181858888f193505050501580156111ee573d6000803e3d6000fd5b506040805189815260208101869052808201839052600160a060020a038516606082015233608082015290517fd89a4f81a4f5c550db7fd8493142082dc6088692a10703fcabe09425069dcdd79181900360a00190a15b6040805189815260208101869052338183015290517f4fcc30d90a842164dd58501ab874a101a3749c3d4747139cefe7c876f4ccebd29181900360600190a150919695505050505050565b600154604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163095ea7b391604480830192600092919082900301818387803b1580156112fe57600080fd5b505af1158015611312573d6000803e3d6000fd5b5050600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a0387811660248301526044820187905291519190921693506323b872dd9250606480830192600092919082900301818387803b15801561138a57600080fd5b505af115801561139e573d6000803e3d6000fd5b505050505050565b600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015230602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561138a57600080fd5b603c816060015167ffffffffffffffff161015151561143857600080fd5b60008281526003602090815260409182902083518154600160a060020a0390911673ffffffffffffffffffffffffffffffffffffffff199091168117825582850151600183018054868801516001608060020a0390811670010000000000000000000000000000000081029482166fffffffffffffffffffffffffffffffff19909316831790911693909317909155606080880151600290950180546080808b015167ffffffffffffffff90811668010000000000000000026fffffffffffffffff0000000000000000199190991667ffffffffffffffff199093168317169790971790915587518a815296870194909452858701919091528401529082015290517f05f9bf100dd0ca9f37f08e0526690286d357ed7d6c5a4ac29730440b6e2dfd629181900360a00190a15050565b6002015460006801000000000000000090910467ffffffffffffffff161190565b6115928261165a565b61159c8183611290565b6040805183815290517f2809c7e17bf978fbc7194c0a694b638c4215e9140cacc6c38ca36010b45697df9181900360200190a15050565b6000818152600360205260408120906115eb82611568565b15156115f657600080fd5b508054600160a060020a031633811461160e57600080fd5b6116188382611589565b505050565b60008080808585106116315786935061164f565b87870392508585840281151561164357fe5b05915081880190508093505b505050949350505050565b6000908152600360205260408120805473ffffffffffffffffffffffffffffffffffffffff19168155600181019190915560020180546fffffffffffffffffffffffffffffffff19169055565b60025461271091020490565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915290565b6106406040519081016040528060329060208202803883395091929150505600a165627a7a72305820c4563d097060a72e7b626edd320231b6279e41315527cee67ce244e52ccb9fed0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000388f220698e807f8ead96755763c04341eacd01600000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _nftAddr (address): 0x388f220698E807f8EaD96755763C04341Eacd016
Arg [1] : _cut (uint256): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000388f220698e807f8ead96755763c04341eacd016
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Swarm Source
bzzr://c4563d097060a72e7b626edd320231b6279e41315527cee67ce244e52ccb9fed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $2,770.09 | 0.00546003 | $15.12 |
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.