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:
- Are there any FLIPs for Flow standards around this in flight?
- Is it viable to shoe horn this into something like the corresponding NFT Collection withdraw method?
- 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.