NIFTEX NFT fractions include a Buyout Clause, which ensures an NFT can be recovered from its fractions without owning 100% of the fractions. This post goes through the (technical) details.

Background

When we first wrote the smart contracts for NFT fractionalization in early 2020, we had no idea how fractions would play out. We did know, however, that there should be a way of recovering a fractionalized NFT without owning 100% of its fractions. Once the fractions spread out across markets and wallets, it is almost impossible to recover all of them. If it is hard or impossible to recover an NFT, it begs the question of what the fractions are really worth, since they are backed by an asset that cannot be redeemed. Hence we relied on traditional governance to augment the fractions i.e. the ERC20 registry that issues them.

The clause we use is also known as/similar to "drag-along" and "shotgun" clauses. Thanks to Giotto for initially pointing us towards them.

Stepping through a buyout

Note: NIFTEX contracts are verified on etherscan, e.g. https://etherscan.io/address/0x3e39505167639ce7852c1f521f2926a01928a0cf#code

This post concerns the "ShotgunClause" contract.

0. Requirements for initiating a Buyout:

  1. The Buyout flow must be enabled. It is enabled by default.
  2. The NFT must be custodied in the contract set.
  3. No existing Buyout should be in progress. This means only one buyout can happen at a time.
  4. Ether must be included in the transaction triggering the Buyout. This ether represents the total offer made for all unowned fractions.
  5. The offerer must own fractions (but not all).

  1. User perspective: Offerer

You own a few fractions of an extraordinary artwork NFT. You'd like to own all of it! When the NFT was fractionalized it was valued at 10 ETH. Now with the DeFi hype and NFTs flying off the shelves you figure it's worth 12 ETH.

You navigate to My Assets in the NIFTEX dashboard, find your artwork fractions, and click "Claim NFT". You are now in the Buyout interface. A few statistics will be displayed regarding how many fractions you own vs. the rest of the market.

The Buyout interface.

At the bottom, there is an option to "Make an Offer". If you value the NFT at 12 ETH, calculate the price per fraction. Say 1,000 fractions were created - you're offering 0.012 ETH per fraction. When you enter the amount, the interface will tell you how much ETH you need to commit to buy everyone out. Two scenarios will also displayed explaining what happens if your offer is accepted/rejected.

Making an offer.

When you click the "Make Offer" button, a two-week period starts in which others can reject your offer. Rejection (or "counterclaim") happens by buying YOU out at YOUR price. Going back to the example - you're giving everybody the right to buy your fractions at 0.012 ETH per fraction.

If you're making a fair offer, as you are in the example, there is not much to worry about. The majority will be fine with getting extra ETH - remember they only paid for a 10 ETH valuation at the start, and now you're offering 12.

However, say you're trying to get the NFT for cheap, and are offering only 0.0001 ETH per fraction for a valuation of 1 ETH. You're lowballing! And you've just given everybody the right to buy YOUR fractions at that price. Clearly you don't want that to happen, and won't make such a low offer in the first place - this is the fair-value mechanic of the Buyout Clause.

Notes

  • Initiating a Buyout pauses all transfers for those fractions. This is done to simplify accounting in the buyout process.
  • The offerer's fractions are custodied in the master contract for the duration of the Buyout.

1.a Rejection

What happens if an offer is rejected?

  • The offerer loses their fraction at the price they offered
  • The holders who participated in rejecting the offer receive the offerer's fractions proportional to the ETH they committed to buy the offerer out.
  • The offerer receives the ETH corresponding to their fraction holdings and the price they offered.
  • The NFT remains fractionalized and transfers are resumed.

1.b Acceptance

What happens when an offer is accepted?

  • An offer is accepted when no rejections take place in the two-week period.
  • The offerer gets the right to claim the NFT into their wallet. The offerer's fractions are burned.
  • The other holders receive the ETH offered by the offerer. To receive the ETH, they must burn their fractions. If they participated in a counterclaim but did not raise enough, they also get the corresponding ETH back.
  • Transfers are resumed.

2. User Perspective: Holder

There you were, enjoying fractions of that wonderful artwork NFT - wait, what's that? Someone's trying to make off with it for only 12 ETH?! Curses! It's worth way more than that, it has a blue kirby in it! You set out to stop the offer i.e. counterclaim.

Requirements for making a counterclaim

  • Holder must own fractions
  • Transaction must contain Ether, which is (part of) the amount required to buy the offerer out. Ether sent cannot be more than the remaining required amount to counterclaim.
  • Holder cannot be offerer.
  • Buyout must be in progress.
  • Transaction must be made before the Buyout deadline expires (two weeks from initial offer).

You navigate to My Assets in the NIFTEX dashboard, find the artwork fractions and click "View Active Claim".

NFT undergoing a Buyout. 

The Buyout interface shows you some statistics on the NFT and the Buyout. At the bottom, you have the option of making a "counterclaim", that is, committing ETH to buy out the initial offerer.

  • You do not need to send 100% of the ETH required to buy out the offerer. Holders can cooperate to crowdraise the ETH together to reduce pressure on individual stakeholders.

Your friend, who also has some blue kirby NFT fractions and is intent on keeping them, has agreed to commit 5 ETH out of the 8 ETH required to buy the offerer out. You commit the remaining 3 ETH.

Example Buyout from the holders' perspective.

Success! The offerer has been bought out with the 8 ETH the counterclaimants committed. The Buyout is enacted. You and your friend receive 3/8 and 5/8 of the offerer's fractions respectively, and the offerer receives 8 ETH.

All participants should now have a message and button at the top of the Buyout interface indicating the outcome and asking them to claim ETH or fractions. If the offerer won because there were no counterclaims, they will see a message and button to claim the NFT two weeks from the time of the offer.

Technical Notes

Contracts created

  • A ShotgunClause contract is created by the master contract when a new Buyout is triggered in the fraction registry contract.

Events emitted

  • ShardGovernor.NewShotgun(address indexed shotgun)
  • ShotgunClause.Countercommit(address indexed committer, uint indexed weiAmount)
  • ShardGovernor.ShotgunEnacted(address(_shotgunClause))
  • ShotgunClause.EtherCollected(address indexed collector, uint indexed weiAmount)

Miscellaneous

  • The master contract keeps track of all buyouts.
  • The ShotgunClause contract custodies all ETH sent by parties involved in the Buyout.
  • The Buyout is automatically enacted (finalized) when enough Ether is raised by counterclaimants. The Buyout must be manually enacted if the deadline expires without (enough) counterclaims. When the Buyout is enacted, all assets become available for claim: fractions, ETH, NFT.