aptos-core icon indicating copy to clipboard operation
aptos-core copied to clipboard

[aptos-token] Add OwnerStore to support get latest owner of token id

Open icodezjb opened this issue 2 years ago • 4 comments

Description

Currently in aptos-token, unable to get the latest token owner. This means that changes in token ownership cannot be detected in the contract

In this PR, we're adding a OwnerStore table to store token_id and the latest owner, and add some related functions

  • fun owner_upsert(token_id: TokenId, owner: address): Add or update the latest owner of the token_id.

  • fun owner_remove(token_id: TokenId): Remove the latest owner by token_id.

  • public fun latest_owner_of(token_id: TokenId): Option<address>: Retrieve the latest owner by the token_id.

  • public fun is_latest_owner(account: address, token_id: TokenId): bool: Check if the specified account and the owner of token_id are equal.

Important

  • Similar to ERC721, only one owner hold the token, that is are token_id and owner in one-to-one correspondence. In this PR, it will be works correct.
    In this case, it is often necessary to obtain the latest owner of the token_id.

  • Similar to ERC1155, many owners hold the same token, that is a token_id can correspond to many owners. In this PR, it will be overwritten by the latest detected owner.

Test Plan

unit tests


This change is Reviewable

icodezjb avatar Oct 12 '22 11:10 icodezjb

Does anyone have a review ? if I'm wrong please point it out. I only changed the move code, the code inside aptos-core is a bit difficult for me, I can't fix the tests

icodezjb avatar Oct 13 '22 12:10 icodezjb

Does anyone have a review ? if I'm wrong please point it out. I only changed the move code, the code inside aptos-core is a bit difficult for me, I can't fix the tests

You can use events from token store to get notified of ownership change

areshand avatar Oct 14 '22 17:10 areshand

You can use events from token store to get notified of ownership change

@areshand

Thank you for your reply. The change of ownership can be notified to the off-chain system through event. But it cannot handle the scenario of calling between contracts on the chain.

Such as the Domain Name System: (1) test.apt is a NFT(aptos-token). (2) test.apt is bound to 0xaaa address. (3) test.apt is resolved to 0xaaa address.

Now test.apt is transferred to 0xbbb address, to which address test.apt should be resolved ?

There are two ways of handling: (1) 0xbbb rebind test.apt to 0xbbb: The Domain Name System is unable to detect changes in domain ownership in a timely manner. test.apt should still be resolved to 0xaaa before rebinding. (2) aptos-token provides the latest_owner_of interface: The Domain Name System can resolve test.apt to 0xbbb in time after test.apt is transferred without relying on other operations.

As an aptos nft standard, aptos-token should provide a similar interface for other contracts to call, not just detect ownership changes through off-chain systems

icodezjb avatar Oct 17 '22 02:10 icodezjb

ship can be notified to the off-chain system through event. But it cannot handle the scenario of calling between contracts on the chain.

Such as the Domain Name System: (1) test.apt is a NFT(aptos-token).

This requires maintain a mapping between the name service token and all their owner. I think this is an ideal usecase for indexer. If you want the logic to purely happen on-chain, the application contract can maintain this mapping itself instead of having it in the standard. For example, you can deploy a contract to create name service tokens, which maintains a mapping between the owner address and the token.

areshand avatar Oct 17 '22 14:10 areshand