ETH Price: $2,628.89 (-0.50%)

Contract

0x0925BdA166940800Af5EFD6c7D1136dDeFBF0387
 

Overview

ETH Balance

0.005460033482142857 ETH

Eth Value

$14.35 (@ $2,628.89/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Bid71199612019-01-24 17:32:082093 days ago1548351128IN
0x0925BdA1...DeFBF0387
0.025 ETH0.001740415
Bid71199582019-01-24 17:30:442093 days ago1548351044IN
0x0925BdA1...DeFBF0387
0 ETH0.001765185
Bid68990162018-12-16 19:40:502132 days ago1544989250IN
0x0925BdA1...DeFBF0387
0.025 ETH0.000696162
Bid67214032018-11-17 13:04:052161 days ago1542459845IN
0x0925BdA1...DeFBF0387
0 ETH0.001014763
Bid65649402018-10-22 22:14:562187 days ago1540246496IN
0x0925BdA1...DeFBF0387
0 ETH0.001691025
Bid65649382018-10-22 22:14:122187 days ago1540246452IN
0x0925BdA1...DeFBF0387
0 ETH0.001691275
Bid65649252018-10-22 22:10:002187 days ago1540246200IN
0x0925BdA1...DeFBF0387
0 ETH0.001766025
Bid64407572018-10-02 17:17:522207 days ago1538500672IN
0x0925BdA1...DeFBF0387
0.00458802 ETH0.0038531310.61
Set Listener64245622018-09-30 1:33:312210 days ago1538271211IN
0x0925BdA1...DeFBF0387
0 ETH0.000425979
0x6080604064225512018-09-29 17:34:232210 days ago1538242463IN
 Create: SaleClockAuction
0 ETH0.01685610

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
71199612019-01-24 17:32:082093 days ago1548351128
0x0925BdA1...DeFBF0387
0.0225 ETH
68990162018-12-16 19:40:502132 days ago1544989250
0x0925BdA1...DeFBF0387
0.0225 ETH
64407572018-10-02 17:17:522207 days ago1538500672
0x0925BdA1...DeFBF0387
0.00412798 ETH
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

Contract ABI

[{"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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.