defi-on-bitcoin-part-2-nft-and-marketplace-min

DeFi on Bitcoin Part 2: NFT and marketplace

This post was first published on Medium. Read DeFi on Bitcoin Part 1: Fungible tokens and token swap and DeFi on Bitcoin Part 3: Uniswap.

In part 2 of the series, we illustrate how to build non-fungible tokens (NFT) and sell them directly on Bitcoin.

Non-Fungible Tokens

In a basic setup, an NFT contract is simply a table with two columns: an ID, uniquely representing a non-fungible asset, and its rightful owner.

NFT Table ID and Owner
NFT Table

The following contract implements such a basic NFT contract, similar to ERC721 token standard in Ethereum.

ERC721 Contract

It is very similar to the fungible token contract we have developed. The most notable difference is the token table at Line 6, mapping ID to its owner, instead of owner to token balance.

Sell NFT

Let us sell some NFTs in exchange for bitcoins. This is akin to swapping fungible tokens. Instead, we swap an NFT for bitcoins.

In the following example, Alice only signs if the payment amount meets her price requirement, in the second output of tx2. Bob only signs if he becomes the new owner of NFT with id 1, in the first output of tx2. Again, the sale is non-custodial and atomic.

NFT Sale chart
NFT Sale

Extensions

There are a variety of ways to extend the sale. We list a few examples:

  • sell NFT in exchange for other tokens: the second output of tx2 should contain the payment to Alice in tokens (fungible or not), not bitcoins, which is funded by a different tx1.
  • platform fee: a third output can be added to tx2 that pays the marketplace a fee, say, 3% of the amount of the second output.

Watch: CoinGeek New York panel, Licensing IP for NFTs: Graphic Novels, Comic Books & Brands

New to Bitcoin? Check out CoinGeek’s Bitcoin for Beginners section, the ultimate resource guide to learn more about Bitcoin—as originally envisioned by Satoshi Nakamoto—and blockchain.

[id^="_form"]
[id^="_form"]
[id$="_submit"]
[id$="_submit"]
[^;]
[^;]
[?&]
[?&]
[^&#]
[^&#]
[(d+)]
[(d+)]
[elem.name]
[elem.name]
[+_a-z0-9-'&=]
[+_a-z0-9-'&=]
[+_a-z0-9-']
[+_a-z0-9-']
[a-z0-9-]
[a-z0-9-]
[a-z]
[a-z]
[el.name]
[el.name]
[id^="_form"]
[id^="_form"]
[id$="_submit"]
[id$="_submit"]
[^;]
[^;]
[?&]
[?&]
[^&#]
[^&#]
[(d+)]
[(d+)]
[elem.name]
[elem.name]
[+_a-z0-9-'&=]
[+_a-z0-9-'&=]
[+_a-z0-9-']
[+_a-z0-9-']
[a-z0-9-]
[a-z0-9-]
[a-z]
[a-z]
[el.name]
[el.name]