2

There are a large number of things that are NonFungible but have their own unique restrictions.

Let's take a specific example for discussion, a physical car. Let's assume ownership of that car is associated with a NonFungibleToken. Also, let's focus on a specific restriction - in order to transfer ownership the car, we must ensure there are no liens on it, and therefore on transfer we must validate each time the ownership is transferred that either no liens exist, or that we have a signed message from each lienholder approving the transaction.

Ideally, we will not wish to restrict ownership of the car to only users with specific wallet implementations, or specific marketplaces -> but we do need to make sure that all marketplaces will follow the rules.

Let's also assume (which might not be the case today) that some mechanism exists that allows us to validate the identity of the owner of the account (some form of decentralized ID that is tied to a user's real world identity) and that the ownership of the car itself is tied to this decentralized ID on chain, such that it's safe to assume that a user may not simply sell the Flow account itself to transfer the car.

That list of assumptions out of the way, what is the best path forward to implementing this restriction today, and what would be the best path forward for ensuring that restrictions are checked by all third party marketplaces?

Sub-Questions:

  1. Are there any FLIPs for Flow standards around this in flight?
  2. Is it viable to shoe horn this into something like the corresponding NFT Collection withdraw method?
  3. Is the only viable option today to bake these sorts of checks into transactions? (Locking the user into specific wallets/platforms)

In previous projects, we've tried both the approach of adding restrictions on transactions (but creating a walled garden) as well as inlining restrictions into the withdraw. Even by baking restrictions into into the collection withdraw method, we still are not necessarily guaranteeing the relevant checks will occur, as a NFT could be withdrawn, stored outside the relevant collection, and then transferred again.

It would seem there would be a tremendous amount of utility for there to be a cross cutting way to indicate any time a resource is moved between accounts, that a certain set of preconditions must be checked. Interested in hearing about any existing conversations on this topic, or the best way to start one if it's not an active conversation.

Jamil R Khan
  • 386
  • 1
  • 9

1 Answers1

4

You are correct that there are many non fungible things in the real world that have restrictions on their transfer, but those restrictions are just legal. They don't completely prevent the owner from transferring it outside of the traditional legal framework, and Cadence works the same way. I think it is perfectly reasonable for a developer to add restrictions to their own deposit or withdraw methods to not allow tokens to be moved unless specific conditions have been met, and that'll enforce those restrictions for 99% of users, just like the restrictions for car transfers work for 99% of car owners.

If a user decides to transfer outside of the regular framework, then they simply should not be allowed to use their ill-gotten NFT in any standard apps and those standard apps should be expected to follow the rules of the main contract. I don't think there is any way to completely 100% enforce this though without significantly hurting other important aspects of the decentralized experience, so I think it is just something that project owners have to live with knowing that it'll only be a very small percentage of their users who find workarounds.