It's time to break ground again at NIFTEX. Today we're going to explore NFT Governance and a practical application of it, enabled by NIFTEX v2.

TLDR; skip to NFT Governance in Practice for how-to-governance.

What's NFT Governance?

We distinguish between two types of governance at NIFTEX: Global and Local. When we talk about NFT Governance, we generally mean Local Governance.

  • Global Governance concerns the control of a number of parameters by NIFTEX (DAO). These parameters apply to all fractionalizations that happen via the protocol.
  • Local Governance concerns the control of parameters that apply to a specific fractionalized (set of) NFT(s). This control is in the hands of people that own fractions of that particular asset.
  • Some Global parameters serve as defaults and can be overwritten by Local Governance. For example, say the Global default duration of a governance proposal is a week. Maybe owners of a particular fractionalized NFT don't like this duration because it is too short for proper discussion. One of them could then make a proposal to change the duration of governance proposals for this asset specifically. Other fraction owners of the same NFT(s) can then vote to approve or reject this proposal. This is Local Governance in action.

Protocol parameters are not the only thing Local Governance can touch. In fact the primary reason why Local Governance exists is because we wanted to make sure that NFTs with on-chain rights would preserve those rights once fractionalized.

By on-chain rights, we mean NFTs of which the ownership gives you the power to do something on-chain related to the NFT. Examples are ENS domain names, where ownership gives you the right to manage e.g. subdomains, and Decentraland parcels, where ownership of the parcel gives you the right to appoint a particular address as a "builder" - someone who can add content to that parcel. In NIFTEX v1 launched in early 2020, such rights were not accessible, which we wanted to fix of course.

Enter Local Governance. With NIFTEX v2, owners of an NFT with on-chain rights can make proposals affecting those rights as if the NFT was still in someone's wallet. The only key difference is that your co-owners need to approve - you can't make such decisions by yourself because you don't own the full NFT.

So what does Local Governance really look like?

NFT Governance in Practice

Let's do a walkthrough of a governance proposal for a specific set of fractions. Conlan from Async.Art was kind enough to provide us with a Layer NFT (ERC721). Layers are parts of an artwork that allow the owner to change the content. If an artwork consists of two squares of which each square is a Layer, then the owner of either Layer could choose to change the color of the respective square, or to rotate that square, or maybe even to turn it into a circle!

Understanding our Rights

In our case, we own a Layer NFT with tokenId 1986 in an artwork called Frames by Alex Stanlake. What can we do with it? The artwork contract can be found at https://rinkeby.etherscan.io/address/0x4F37310372dd39d451f7022EE587FA8B9F72d80B#readProxyContract. If we query getControlToken with tokenId 1986, we will get:

  int256[] :  0
  4
  0

The only important thing here is the last value, 0, which is the current value of our Layer. This value dictates what our Layer looks like visually. Is it blue or does it contain a picture of Vitalik's cat?

Using our Rights

Now we want to change this value to display Vitalik's dog instead. To do this, we need to call the function useControlToken . But... this function will only accept your call if you are the owner of the NFT! In our case, the Layer NFT has been fractionalized and the owner is now a smart contract that manages custody. Hence nobody can call useControlToken directly because they are not the owner. Thankfully we can still craft a transaction to call this function and submit it through the smart contract. This is NFT Governance at its core and should be familiar to those who have experience with DAO governance.

Crafting the Transaction  

Crafting is facilitated by the NIFTEX frontend. The governance interface is located at alpha.niftex.org/govern. On this page there are three main components. On the upper left side, you will see an overview of recent governance proposals across all fractionalized NFTs. You can also look up governance proposals for a specific fraction set here. Under this overview, there is a list with the values of all Global parameters in the NIFTEX protocol (check out ACTION_DURATION, which controls the default duration during which owners can reject a proposal).

On the right side is what we need to start crafting.

Note that you are required to own a minimum % of the supply to make a governance proposal.

1.
First, we need to select the fraction set for which we want to make a proposal. In our case, the fractionalized Layer NFT has the ticker $GT. We type in GT and click on the little tag that appears.

Look up the ticker of the fractions you want to interact with.

2.
Now, we need an "ABI". An ABI is an overview of all the functions in a smart contract. It basically acts as a translator for anything that is looking to interact with a smart contract. In our case, we want to call useControlToken, which is part of the artwork contract. This means we need to go get the ABI for that contract, which thankfully etherscan makes quite easy for us. We copy the ABI from etherscan and enter it in the ABI field on niftex.org.

Find and enter the ABI of the contract to call.

3.
When entering the ABI, the frontend will automatically extract all usable functions and put them in a dropdown. You need to select the function you want to use from that dropdown. In our case, we select useControlToken.

Select the function you want to call.

4.
Once you have selected the function, the frontend will ask you for the parameters required to call the function. To call useControlToken, we need to give the controlTokenId, the leverIds, and newValues. The type of the parameter required is indicated.

  • controlTokenId: the id of the NFT - 1986 in our case.
  • leverIds: something specific to Async Art -  [0] in our case. It is an array because a Layer can have multiple levers.
  • newValues: the new value we want to set - say [3] in our case. It is an array because each lever comes with a value.
Enter the values for all parameters to call useControlToken.

5.
Now we need to tell the NIFTEX protocol where this transaction has to be sent, and if we want to send any Ether along with it.

  • Call destination: address to send this transaction to. In our case, we want to send it to the artwork contract, so we enter its address (note that Async Art uses a proxy pattern).
  • Call value: if you want to send Ether along with the transaction, convert it to Wei and enter the amount here.

6.
Last steps: once you've entered all info, you will receive an Action id. If you want to discuss this proposal with others, create a discussion thread on the forums that references the Action id. Example for $GT: https://forum.niftex.org/t/gt-actual-governance-action-that-will-fail/25/2.

You should always create a discussion thread when considering or submitting a new governance proposal.

7.
If you're ready, click the button to send your proposal to the chain.

Responding to a Governance Proposal

Knowing that these are early days and that it is not easy to anticipate how things will go, NIFTEX has adopted a very simple governance procedure to start with.

  • Once a proposal has been made, anyone with a sufficient fraction balance can reject it. If nobody rejects it and the deadline for the proposal passes, the proposal succeeds. Once passed, a proposal still needs to be executed in order to actually effect the desired changes.

When a new governance proposal has been made, Discord and Twitter will send out a notification. The proposal will also show up on the main page for the fractions, and on the governance page.  

Overview of recent governance proposals on the /asset page.
Overview of governance proposals on the /govern page.

You can reject a pending proposal or execute a passed one by clicking on it in the list in the image above.

Overview and controls for a passed proposal. 

In our case, as you can see, the proposal was successfully executed! getControlToken now returns 3 instead of 0. Firm handshakes all around.

TLDR 2, the general approach for NFT Governance is:

  1. Figure out what value you want/need to change.
  2. Figure out what function you need to call on the smart contract level to change this value.
  3. Find the contract address and its ABI.
  4. Submit as described above.

We can't wait to see what our Phrackers will come up with. Good luck & stay fraccy!