Skip to content

Commit

Permalink
ERC721 (still draft)
Browse files Browse the repository at this point in the history
  • Loading branch information
protinam committed Dec 19, 2017
1 parent 97c085f commit 087f8cc
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 20 deletions.
20 changes: 20 additions & 0 deletions contracts/exchange/ERC721.sol
@@ -0,0 +1,20 @@
/*
ERC721 (draft) non-fungible token interface. See https://github.com/ethereum/EIPs/issues/721.
*/

pragma solidity ^0.4.18;

/**
* @title ERC721
* @author Project Wyvern Developers
*/
contract ERC721 {
function totalSupply() public view returns (uint256 _totalSupply);
function balanceOf(address _owner) public view returns (uint256 balance);
function ownerOf(uint256 _tokenId) public view returns (address owner);
function approve(address _to, uint256 _tokenId) public;
function takeOwnership(uint256 _tokenId) public;
function transfer(address _to, uint256 _tokenId) public;
}
16 changes: 9 additions & 7 deletions contracts/exchange/Exchange.sol
Expand Up @@ -76,6 +76,8 @@ contract Exchange is Ownable {
NonFungibleAssetInterface.NonFungibleAssetKind assetKind;
/* Item contract - a value of 0 means no contract is being sold. */
address contractAddress;
/* Item contract nonfungible extra (token ID). */
uint assetExtra;
/* Item metadata IPFS hash. */
bytes metadataHash;
/* The kind of sale. */
Expand Down Expand Up @@ -107,7 +109,7 @@ contract Exchange is Ownable {
bytes metadataHash;
}

event ItemListed (bytes32 id, address seller, NonFungibleAssetInterface.NonFungibleAssetKind assetKind, address contractAddress, bytes metadataHash, SaleKindInterface.SaleKind saleKind, ERC20 paymentToken, uint price, uint timestamp, uint expirationTime, uint extra, EscrowProvider escrowProvider);
event ItemListed (bytes32 id, address seller, NonFungibleAssetInterface.NonFungibleAssetKind assetKind, address contractAddress, uint assetExtra, bytes metadataHash, SaleKindInterface.SaleKind saleKind, ERC20 paymentToken, uint price, uint timestamp, uint expirationTime, uint extra, EscrowProvider escrowProvider);
event ItemRemoved (bytes32 id);
event ItemBidOn (bytes32 id, address bidder, uint amount, uint timestamp);
event ItemPurchased (bytes32 id, address buyer, uint price);
Expand Down Expand Up @@ -155,13 +157,13 @@ contract Exchange is Ownable {
feeFrontend = frontendFee;
}

function listItem(NonFungibleAssetInterface.NonFungibleAssetKind assetKind, address contractAddress, bytes metadataHash, SaleKindInterface.SaleKind saleKind, ERC20 paymentToken, uint price, uint expirationTime, uint extra, EscrowProvider escrowProvider) public costs (feeList) returns (bytes32 id) {
id = keccak256(msg.sender, assetKind, contractAddress, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider);
function listItem(NonFungibleAssetInterface.NonFungibleAssetKind assetKind, address contractAddress, uint assetExtra, bytes metadataHash, SaleKindInterface.SaleKind saleKind, ERC20 paymentToken, uint price, uint expirationTime, uint extra, EscrowProvider escrowProvider) public costs (feeList) returns (bytes32 id) {
id = keccak256(msg.sender, assetKind, contractAddress, assetExtra, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider);
require(items[id].seller == address(0));
NonFungibleAssetInterface.claimOwnership(assetKind, contractAddress);
items[id] = Item(msg.sender, assetKind, contractAddress, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider, false);
NonFungibleAssetInterface.claimOwnership(assetKind, contractAddress, assetExtra);
items[id] = Item(msg.sender, assetKind, contractAddress, assetExtra, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider, false);
ids.push(id);
ItemListed(id, msg.sender, assetKind, contractAddress, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider);
ItemListed(id, msg.sender, assetKind, contractAddress, assetExtra, metadataHash, saleKind, paymentToken, price, now, expirationTime, extra, escrowProvider);
return id;
}

Expand Down Expand Up @@ -229,7 +231,7 @@ contract Exchange is Ownable {
require(item.escrowProvider.holdInEscrow(id, msg.sender, item.seller, item.paymentToken, finalPrice));

/* Transfer ownership of the asset. */
NonFungibleAssetInterface.transferOwnership(item.assetKind, item.contractAddress, msg.sender);
NonFungibleAssetInterface.transferOwnership(item.assetKind, item.contractAddress, msg.sender, item.assetExtra);

/* Record the sale. */
sales[id] = Sale(msg.sender, price, now, new bytes(0));
Expand Down
24 changes: 11 additions & 13 deletions contracts/exchange/NonFungibleAssetInterface.sol
Expand Up @@ -2,6 +2,8 @@ pragma solidity ^0.4.18;

import "zeppelin-solidity/contracts/ownership/Claimable.sol";

import "./ERC721.sol";

/**
* @title NonFungibleAssetInterface
* @author Project Wyvern Developers
Expand All @@ -10,41 +12,37 @@ library NonFungibleAssetInterface {

enum NonFungibleAssetKind { None, Claimable, ERC721 }

function currentOwner(NonFungibleAssetKind kind, address asset) public view returns (address) {
function currentOwner(NonFungibleAssetKind kind, address asset, uint assetExtra) public view returns (address) {
if (kind == NonFungibleAssetKind.None) {
revert();
} else if (kind == NonFungibleAssetKind.Claimable) {
return Claimable(asset).owner();
} else if (kind == NonFungibleAssetKind.ERC721) {
return ERC721(asset).ownerOf(assetExtra);
} else {
revert();
}
}

function pendingOwner(NonFungibleAssetKind kind, address asset) public view returns (address) {
if (kind == NonFungibleAssetKind.None) {
revert();
} else if (kind == NonFungibleAssetKind.Claimable) {
return Claimable(asset).pendingOwner();
} else {
revert();
}
}

function transferOwnership (NonFungibleAssetKind kind, address asset, address newOwner) public {
function transferOwnership (NonFungibleAssetKind kind, address asset, address newOwner, uint assetExtra) public {
if (kind == NonFungibleAssetKind.None) {
return;
} else if (kind == NonFungibleAssetKind.Claimable) {
Claimable(asset).transferOwnership(newOwner);
} else if (kind == NonFungibleAssetKind.ERC721) {
ERC721(asset).transfer(newOwner, assetExtra);
} else {
revert();
}
}

function claimOwnership (NonFungibleAssetKind kind, address asset) public {
function claimOwnership (NonFungibleAssetKind kind, address asset, uint assetExtra) public {
if (kind == NonFungibleAssetKind.None) {
return;
} else if (kind == NonFungibleAssetKind.Claimable) {
Claimable(asset).claimOwnership();
} else if (kind == NonFungibleAssetKind.ERC721) {
ERC721(asset).takeOwnership(assetExtra);
} else {
revert();
}
Expand Down

0 comments on commit 087f8cc

Please sign in to comment.