Non Fungible Token (NFT) Standard [Community Consideration]

This is actually really deep. I’m still trying to fully understand it:

  1. DEX now shares ownership of Token B_1 with Token A, and shares Token A_1 with Token B.

I thought in order to share a NFT, the caller has to specify an amount to “lock up” and split the NFT? Does the DEX canister do that here?

  1. DEX still co-owns both nfts right now, so they’re still worthless. DEX now has to revoke ownership.

Like the above, doesn’t the DEX canister have to burn tokens to revoke ownership? Or maybe NFTs only get split or burned when the caller of share and revoke is the first owner, but not for subsequent owners?

2 Likes

Hi @jzxchiang, I was hoping you would see this. Excited to hear your thoughts :slight_smile:

share() could infer from its arguments whether it’s a split share, or just a co-own share. If share(addr) it’s clearly just trying to co-own with addr.

Alternatively, share(0, addr) could be taken to mean that you’re sharing ownership without duplicating any tokens.

Less elegantly, but equivalently and perhaps more pragmatically, you could have two functions: splitShare(quantity, address) and share(address).

Yeah I think you have to require the original owner to burn to revoke. That’s the only thing that makes sense if you want to preserve fungibility.

2 Likes

This is a total distraction, but I played with the idea of allowing anyone to revoke for free as long as there still remain 2 other owners.

tl;dr. It doesn't work for fungible tokens.

It produces two problems:

  1. In the DEX example, Token A could revoke right after sharing. That would force Token B or DEX to pay the burn bill. Maybe you can get around that by making burn a separate function that DEX tells Token A to call. Hard for me to understand the consequences of that.

  2. Allowing anyone to pay to revoke ownership would create weird floating token pairs. They have no real value, but can still be shared, perhaps making for weird economics wherein people end up valuing the co-ownership of the token. They feel like Cooper Pairs of the token world because local rules give rise to weird collective “virtual” behavior.

Given that 2 remaining owners is an arbitrary threshold, you could play with implementing nfts that pay burn fees if n or fewer owners remain. For this, the more general approach would probably be to charge burn due / n - 1 to burn.

For example, given an nft with 100 tokens that has been shared, we can vary the n that defines the revoke threshold. This would change the burn fee:
n | burn fee
2 | 100
3 | 50
4 | 33.33…
5 | 25
etc.

If someone pays the burn fee, the remaining “burn due” is decreased by that amount. E.g. with an n of 5, when I pay my 25 tokens to revoke ownership now the remaining group needs to pay off 75 tokens. there’s 4 of them so with that formula burn due / n - 1 that would be 75 / 3 or still 25 to revoke. However, if they could find another address to share it with it would go down to 18.75.

What’s wild about this is it creates an economics of negative pressure: either you have to find a new co-owner to take your spot, or you have to pay to leave the organization. In that world, people would want tools to prevent themselves from receiving tokens, and would have no qualms about sharing | “spending” them. In fact, in that world I would be willing to pay other people to accept ownership.

There’s no reason money has to work as a thing we want. It could also be a thing we flee from. I can see how the behavioral side probably works out better if you’re trying to accrue things rather than avoid accruing them, but it’s still interesting to think about.

This might be an interesting economic model to explore for abundance pricing. What if currency was something you desperately wanted to give away? You go to a restaurant, but instead of them accepting your money, they give this negative pressure token to you. You accept participation in the token in exchange for eating the food. Now, you go to work and they pay you by accepting your negative tokens, etc. It’s a bit like debt, but you’d own it as a group.

Alternatively, maybe you could use it for externality pricing. If I’m an oil company I can accept ownership of a negative pressure token that allows me to drill in a certain area. Years later there’s an oil spill and an oil spill-tracking dao causes the weekly fees associated with carrying the token go up and it becomes expensive for me. I’ll pay an oil cleanup company if they’ll take the token off my hands. The cleanup company fixes the mess and the weekly fees go down, the cleanup company pockets the difference between the payment they received for accepting it and the cost of cleanup. Of course if the cleanup is more expensive than they bargained, they’re stuck paying the weekly fees.

One weird thing about it would be that given that the price to call your personal revoke is burn due / n - 1 but the cost of collective action is burn due / n, this could create an incentive for people to pay for collective projects since burn due / n - 1 > burn due / n. It’s like taxation with compensation, you pay toward the community effort and you actually earn money (or really, lose loss).

Maybe this could be some sort of alternative to quadratic voting for addressing problems of collective action.


To me this behavior is really interesting, but probably not what you mean by fungible token. File it under the category of, “interesting behavior you could implement in your fungible nfts by playing with the rules.”

There’s lots of that sort of thing, by the way.

Treating fungible tokens as just a type of this special nft makes operations more atomic, and I believe it would be simpler to implement (no more rollbacks). But the real benefit is the way in which it increases the space of functionality we can implement.

Two functions and one rule are needed to implement fungible tokens. But what would you get if you had different internal rules? What if you could share but a shared nft could still be spent by all owners? What if you needed a minimum agreement threshold for spending upon share? What about a minimum agreement threshold for sharing with a new address? You can see how this approach to tokens creates an intermediate space between daos and tokens. Not quite an org, but much more than a token.

2 Likes

Really interesting stuff, thanks for sharing.

A couple of dumb questions to make sure I understand the mechanics:

  • Where are the tokens burned from when revoke is called? For example, in step 5 Alice burns 200 tokens to revoke ownership of Token A_1. But aren’t those 200 tokens supposed to go to Bob (or whoever the owner of token B is)?
  • When you say “That would force Token B or DEX to pay the burn bill”, are you referring to the cycle cost of calling the DEX and token canisters?

The share/revoke mechanism kinda reminds me of a counting semaphore in programming, but instead of N threads being able to access a shared resource in parallel, we have N owners who cannot access a shared token until the other owners revoke access (kind of the opposite in some sense). :thinking:

2 Likes

It’s probably not a dumb question but rather a dumb explanation.

By the time revoke is called, Bob already owns the nft with 200 tokens in it. The tokens were minted there when Alice first called share. Alice’s Token A still has 500 tokens. Because Token A_1 has 2 owners, it’s currently valueless.

When Alice wants the transaction to be complete, she can do so by revokeing her ownership. In order to revoke (and thus complete the transaction) we require her to burn 200 tokens in Token A, this way the total number of tokens in circulation remains constant.

Ooh, that is a fascinating analogy. It makes sense it would show up here, IC is async. I never really understood semaphores to be honest. I think the name always made me feel like they’re so sophisticated and I felt intimidated.

1 Like

Going to update the prior post to try to make that clearer.

Hmm interesting, so when Alice first called share to “split” her NFT of 500 tokens, she never actually split the 500 into a 300 and a 200. It’s not until she calls revoke later on that the real token split happens. Does that sound right?

2 Likes

Yep that’s exactly right!

This way, if the DEX transaction were to fail (let’s say Bob never sends her his Token B_1s because he ran out of cycles) Alice still has all of her tokens that she started with. No rollback required

1 Like

In fact, I suppose send could just be implemented as a share and then a revoke.

I am fairly new to The Internet Computer but it seems to me that it may be worth supporting multiple standards and also looking at things as well as ETH style standards.

Over on WAX (an eosio chain with a focus on NFTs) there is an interesting dominant standard called Atomic Assets. It organises metadata neatly and has a features like author royalties and notifications built in.

This effectively runs at contract level which I am assuming is similar to cannister level.

I’d be interested in community members thoughts on this.

2 Likes

Pretty interesting, seems no one has taken you up on the opportunity to explore this more.

Would you be able to share more about how Atomic Assets is implemented?

Thanks, yes

The atomic assets contract is running under a single contract on WAX (and some other eosio chains I believe). It has a number of large community projects / guilds on the multisig on this contract as eosio contracts can be updated rather like canisters can I believe.

This contract allows for collections to be set up - within collections are schemas - within schemas are templates and within templates are assets. Think of this a bit like
collection = pokemon,
schema = actual pokemon, items, NPCs
templates = pickachu, bulbasaur etc… for the actual pokemon schema, candy, potions etc… for items and so on
assets = all actual assets

Collections, schemas and templates have set attributes - main ones for the collections are the ownership details and authorised minters.

Schemas set the fields that the templates within the schema will have.

Templates can set a maximum number of assets that can be minted based on the particular template and give the default information for the assets that can be minted.

Assets inherit from templates when being minted but can be overriden - attributes on assets can also be mutable or immutable. Images/videos are generally held on IPFS and the hash is usually held against an ‘image’ attribute.

Full details can be viewed on the pinknetworkx github.

Disclaimer: I’m not involved with this project but I have used the NFT marketplaces it enables a lot.

1 Like

It would be great if we would have an official standard of NFT, and how we should manage with them.

2 Likes

Where are royalties defined within all the standards?
Are these part of the standard or are they marketplace specific? For example on Ethereum, royalties are not part of the ERC721 or ERC1155 standard, so if an NFT is minted on Opensea and then sold on Rarible, the royalty is not ensured. There was a royalty standard (EIP 2981) released last year which tries to unify royalties across marketplaces, but not sure how adopted they are yet. Is there something similar on ICP or even implemented within a standard?

1 Like

Very great question. I review most of the code and I think we still have to define by ourselves. Most likely migrate from eth standard, or check Entrepot and see how do them manage the royalties? https://entrepot.app/

Hi everyone, there is a piece of NFT/Tokens on IC that I can’t figure out how to address. NFT minting depends upon a canister owned by someone, if the canister owner does not tip cycles, the NFT is gone.

When NFT comes to my mind it is an asset registered on chain that will live forever like on ethereum network(I known there are some caveats there too).
It seems to me that NFT on IC does not have any differentiation than a traditional web 2.0 Application on that perspective.
What are your thoughts on that?

The purpose of a blockchain system is to decentralize it. Nobody owns the hosting, and if it’s blackholed, nobody owns the service itself. If the canister runs out of cycles, simply deposit more and it’ll be back up again. A blackholed canister does live on chain forever, and can be defrosted at any time; it just needs gas to function, except somewhere between a thousandth and a millionth of what Ethereum does (and stably pegged to the XDR to boot).

3 Likes

Sad NFT enjoyooooooor noises

What is in a standard by catspheare, will be available to mint soon. For Whitelist drop ur seed phrases in this thread

Just after this first message into thread must be pinned the last update official status, not just for this but all developments, anybody will read the whole thing and can be persisting questions already solved…

But what about the state of a frozen canister? Does it get reset after a while? Otherwise there would be ton of state bloat for data nobody is paying for.