Skip to content

Latest commit

 

History

History
650 lines (602 loc) · 26.3 KB

fip-0027.md

File metadata and controls

650 lines (602 loc) · 26.3 KB
fip title status type author created updated
27
NFT Signatures
Final
Functionality
Pawel Mastalerz <[email protected]>
2021-05-05
2021-10-21

Abstract

The objective of this FIP is to extend FIO Protocol functionality to enable NFTs to be mapped to a FIO Address. It will allow anyone to see which FIO Address has mapped ("signed") a particular NFT and if it is a FIO Address they trust, they can also trust the NFT.

Example use case:

  • Artist publishes the FIO Domain they own, e.g. artist, on their website.
  • They register a new FIO Address for every art NFT, e.g. masterpiece1@artist
  • They map new NFT (chain, contract address, token ID, media url) to masterpiece1@artist
  • Now, irrespective of who owns the NFT at anytime, it's easy to prove if an NFT (based on chain, contract address, token ID or media url) is mapped to a FIO Address on the artist's FIO Domain and by therefore know if it was created by the artist.

New actions

Contract Action Endpoint Description
fio.address addnft /add_nft Maps a specific NFT to a FIO Address.
fio.address remnft /remove_nft Removes NFT from FIO Address
fio.address remallnfts /remove_all_nfts Adds FIO Address to NFT burn queue for removal
fio.address burnnfts No endpoint Burns NFTs in burn queue

Modified actions

Contract Action Endpoint Description
fio.address burnexpired /burn_expired Burn expired FIO Addresses and Domains should also burn NFTs.
fio.address burnaddress /burn_fio_address Burn FIO Addresses should also burn NFTs.
fio.address xferaddress /transfer_fio_address Transfer FIO Address should also burn NFTs.

New getters

Endpoint Description
/get_nfts_fio_address Returns all NFTs for specified FIO Address.
/get_nfts_contract Returns all mapped NFTs which have the specified contract address and token id.
/get_nfts_hash Returns all mapped NFTs which have the specified hash.

Motivation

Extending the FIO Protocol to allow NFT mappings is a natural progression for the protocol as FIO Addresses were always envisioned to replace complicated addresses such as public addresses or NFT contract addresses and NFT token IDs.

Specification

New actions

Map NFT

Maps a specific NFT to a FIO Address.

Contract: fio.address

New action: addnft

New end point: /add_nft

New fee: add_nft, bundle-eligible (2 bundled transaction) fee amount will be determined during development and updated here

RAM increase: To be determined during implementation

Request body

Group Parameter Required Format Definition
fio_address Yes String FIO Address to map to.
nfts Yes Array List of NFTs to map, max 3
nfts chain_code Yes String Min chars: 1, Max chars: 10, Characters allowed: ASCII a-z0-9, Case-insensitive
nfts contract_address Yes String Min chars: 1, Max chars: 128
nfts token_id Yes String Token ID of NFT. May be left blank if not applicable. Max 64 characters.
nfts url Yes String URL of NFT asset, e.g. media url. May be left blank if not applicable. Max 128 characters.
nfts hash Yes String SHA-256 hash of NFT asset, e.g. media url. May be left blank if not applicable. Max 64 characters.
nfts metadata Yes String Serialized json, max. 128 chars. May be left empty.
max_fee Yes Positive Int Maximum amount of SUFs the user is willing to pay for fee. Should be preceded by /get_fee for correct value.
actor Yes 12 character string Valid actor of signer
tpid Yes FIO Address FIO Address of the entity which generates this transaction. TPID rewards will be paid to this address. Set to empty if not known.
Example
{
  "fio_address": "purse@alice",
  "nfts": [
    {
      "chain_code": "ETH",
      "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
      "token_id": "100010001",
      "url": "ipfs://ipfs/QmZ15eQX8FPjfrtdX3QYbrhZxJpbLpvDpsgb2p3VEH8Bqq",
      "hash": "f83b5702557b1ee76d966c6bf92ae0d038cd176aaf36f86a18e2ab59e6aefa4b",
      "metadata": ""
    },
    {
      "chain_code": "EOS",
      "contract_address": "atomicassets",
      "token_id": "2199023271139",
      "url": "",
      "hash": "",
      "metadata": "{\"creator_url\":\"https://yahoo.com/\"}"
    }
  ],
  "max_fee": 0,
  "actor": "aftyershcu22",
  "tpid": "rewards@wallet"
}

Metadata format

This standard for metadata structure will likely evelove over time and is intended to store meta information about the NFT. Current standard:

Parameter Required Format Definition
creator_url No String URL to NFT's creator website.

Processing

  • Request is validated per Exception handling.
  • add_nft fee is collected or bundled transaction deducted (if FIO Address has available bundled transactions)
  • RAM of signer is increased.
  • Check for maximum FIO transaction size is applied.
  • Store chain_code, contract_address, token_id, url, hash, metadata.
  • If chain_code, contract_address, token_id already stored, update url, hash, metadata.

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid FIO Address Format of FIO Address not valid, FIO Address does not exist or is not mapped to a valid FIO Public Key. 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Address invalid, does not exist."
FIO Domain expired Domain of supplied FIO Address has expired more than 30 days ago 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Domain expired."
Invalid chain format Invalid format of chain_code (see above) 400 "chain_code" Value sent in, e.g. "BTC!@#$%^&()" "Invalid Chain Code"
Invalid contract address format Invalid format of contract_address (see above) 400 "contract_address" Value sent in, e.g. "" "Invalid Contract Address"
Invalid token id Invalid format of token_id (see above) 400 "token_id" Value sent in "Invalid Token ID"
Invalid url Invalid format of url (see above) 400 "token_id" Value sent in "Invalid URL"
Invalid hash Invalid format of hash (see above) 400 "hash" Value sent in "Invalid hash"
Invalid metadata Invalid format of metadata (see above) 400 "metadata" Value sent in "Invalid metadata"
Invalid fee value max_fee format is not valid 400 "max_fee" Value sent in, e.g. "-100" "Invalid fee value"
Fee exceeds maximum Actual fee is greater than supplied max_fee 400 "max_fee" Value sent in, e.g. "1000000000" "Fee exceeds supplied maximum"
Insufficient balance Available (unlocked and unstaked) balance in Staker's account is less than chain fee + amount 400 "max_fee" Value sent in, e.g. "100000000000" "Insufficient balance"
Invalid TPID tpid format is not valid 400 "tpid" Value sent in, e.g. "notvalidfioaddress" "TPID must be empty or valid FIO address"
Invalid number of items More than 3 NFTs in array 400 "nfts" "Min 1, Max 3 NFTs are allowed"
Not owner of FIO Address The signer does not own the FIO Address 403 Type: invalid_signature
Signer not actor Signer not actor 403 Type: invalid_signature

Response body

Parameter Format Definition
status String OK if successful
fee_collected Int Amount of SUFs collected as fee
Example
{
  "status": "OK",
  "fee_collected": 2000000000
}

Remove NFT

Removes NFT from FIO Address

Contract: fio.address

New action: remnft

New end point: /remove_nft

New fee: remove_nft, bundle-eligible (1 bundled transaction) fee amount will be determined during development and updated here

RAM increase: none

Request body

Group Parameter Required Format Definition
fio_address Yes fio address, see FIO address validation rules. FIO Address which will have NFT removed.
nfts Yes List of NFTs to remove, no limit.
nfts chain_code Yes String Min chars: 1, Max chars: 10, Characters allowed: ASCII a-z0-9, Case-insensitive
nfts contract_address Yes String Min chars: 1, Max chars: 128
nfts token_id Yes String Token ID of NFT. May be left blank if not applicable. Max 64 characters.
max_fee Yes max fee SUFs Maximum amount of SUFs the user is willing to pay for fee. Should be preceded by /get_fee for correct value.
actor Yes FIO account name FIO account for the signer, the account owning this payee FIO Address.
tpid Yes FIO Address of TPID, See FIO Address validation rules FIO Address of the wallet which generates this transaction. This FIO Address will be paid 10% of the fee. See FIO Protocol#TPIDs for details. Set to empty if not known.
Example
{
  "fio_address": "purse@alice",
  "nfts": [
    {
      "chain_code": "ETH",
      "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
      "token_id": "100010001"
    },
    {
      "chain_code": "EOS",
      "contract_address": "atomicassets",
      "token_id": "2199023271139"
    }],
  "max_fee": 0,
  "actor": "aftyershcu22",
  "tpid": "rewards@wallet"
}

Processing

  • Request is validated per Exception handling.
  • remove_nft fee is collected or bundled transaction deducted (if FIO Address has available bundled transactions).
  • Check for maximum FIO transaction size is applied.
  • Remove chain_code, contract_address, token_id, url, hash, metadata.

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid FIO Address Format of FIO Address not valid, FIO Address does not exist or is not mapped to a valid FIO Public Key. 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Address invalid, does not exist."
FIO Domain expired Domain of supplied FIO Address has expired more than 30 days ago 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Domain expired."
Invalid fee value max_fee format is not valid 400 "max_fee" Value sent in, e.g. "-100" "Invalid fee value"
Fee exceeds maximum Actual fee is greater than supplied max_fee 400 "max_fee" Value sent in, e.g. "1000000000" "Fee exceeds supplied maximum"
Insufficient balance Available (unlocked and unstaked) balance in Staker's account is less than chain fee + amount 400 "max_fee" Value sent in, e.g. "100000000000" "Insufficient balance"
Invalid TPID tpid format is not valid 400 "tpid" Value sent in, e.g. "notvalidfioaddress" "TPID must be empty or valid FIO address"
Not owner of FIO Address The signer does not own the FIO Address 403 Type: invalid_signature
Signer not actor Signer not actor 403 Type: invalid_signature
Nothing to remove No NFTs are mapped to provided FIO Address 400 "fio_address" Value sent in, e.g. "purse@alice" "No NFTs"
NFT not found The fio address does not have specific NFT mapped to remove 400 "fio_address" Value sent in, e.g. "purse@alice" "NFT not found"

Response body

Parameter Format Definition
status String OK if successful
fee_collected Int Amount of SUFs collected as fee
Example
{
  "status": "OK",
  "fee_collected": 2000000000
}

Remove All NFTs

Removes all NFTs from FIO Address by adding to burn queue.

Contract: fio.address

New action: remallnfts

New end point: /remove_all_nfts

New fee: remove_all_nfts, bundle-eligible (1 bundled transaction) fee amount will be determined during development and updated here

RAM increase: none

Request body

Parameter Required Format Definition
fio_address Yes fio address, see FIO address validation rules. FIO Address which will have NFT removed.
max_fee Yes max fee SUFs Maximum amount of SUFs the user is willing to pay for fee. Should be preceded by /get_fee for correct value.
actor Yes FIO account name FIO account for the signer, the account owning this payee FIO Address.
tpid Yes FIO Address of TPID, See FIO Address validation rules FIO Address of the wallet which generates this transaction. This FIO Address will be paid 10% of the fee. See FIO Protocol#TPIDs for details. Set to empty if not known.
Example
{
  "fio_address": "purse@alice",
  "max_fee": 0,
  "actor": "aftyershcu22",
  "tpid": "rewards@wallet"
}

Processing

  • Request is validated per Exception handling.
  • remove_all_nfts fee is collected or bundled transaction deducted (if FIO Address has available bundled transactions).
  • Check for maximum FIO transaction size is applied.
  • Remove all NFTs mapped to FIO Address.

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid FIO Address Format of FIO Address not valid, FIO Address does not exist or is not mapped to a valid FIO Public Key. 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Address invalid, does not exist."
FIO Domain expired Domain of supplied FIO Address has expired more than 30 days ago 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Domain expired."
Invalid fee value max_fee format is not valid 400 "max_fee" Value sent in, e.g. "-100" "Invalid fee value"
Fee exceeds maximum Actual fee is greater than supplied max_fee 400 "max_fee" Value sent in, e.g. "1000000000" "Fee exceeds supplied maximum"
Insufficient balance Available (unlocked and unstaked) balance in Staker's account is less than chain fee + amount 400 "max_fee" Value sent in, e.g. "100000000000" "Insufficient balance"
Invalid TPID tpid format is not valid 400 "tpid" Value sent in, e.g. "notvalidfioaddress" "TPID must be empty or valid FIO address"
Nothing to remove No NFTs are mapped to provided FIO Address 400 "fio_address" Value sent in, e.g. "purse@alice" "No NFTs"

|Not owner of FIO Address|The signer does not own the FIO Address|403|||Type: invalid_signature| |Signer not actor|Signer not actor|403|||Type: invalid_signature|

Response body

Parameter Format Definition
status String OK if successful
fee_collected Int Amount of SUFs collected as fee
Example
{
  "status": "OK",
  "fee_collected": 2000000000
}

Burn NFTs

Processes NFTs in the burn queue.

Contract: fio.address

New action: burnnfts

New fee: none

RAM increase: none

Request body

Parameter Required Format Definition
actor Yes FIO account name FIO account for the signer, the account authorizing the NFT burn.
Example
{
  "actor": "aftyershcu22"
}

Processing

  • First FIO Address in NFT burn queue is processed
  • Up to 50 NFTs are removed.
  • If NFTs are cleared for FIO Address before 50 NFTs are processed, some of the NFTs for the next addresses in the queue are processed
  • burnnfts is called until all NFTs have been cleared from the burn queue

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Nothing NFTs to burn No FIO Addresses in the burn queue to process 400 "nfts" "Nothing to burn"
Signer not actor Signer not actor 403 Type: invalid_signature

Response body

Parameter Format Definition
status String OK if successful
Example
{
  "status": "OK",
}

Modified actions

Burn Expired

Burn expired FIO Addresses and Domains should also burn NFTs

Contract: fio.address

Action: burnexpired

End point: /burn_expired

Request

Unchanged

Processing

  • Also burn NFTs mapped to FIO Address being burned.

Response

Unchanged

Burn Address

Burn FIO Addresses should also burn NFTs.

Contract: fio.address

Action: burnaddress

End point: /burn_fio_address

Request

Unchanged

Processing

  • Also burn NFTs mapped to FIO Address being burned.

Response

Unchanged

Transfer Address

Transfer FIO Address should also burn NFTs.

Contract: fio.address

Action: xferaddress

End point: /transfer_fio_address

Request

Unchanged

Processing

  • Also burn NFTs mapped to FIO Address being transferred.

Response

Unchanged

New getters

Get NFTs for FIO Address

Returns all NFTs for specified FIO Address.

New end point: /get_nfts_fio_address

Request

Parameter Required Format Definition
fio_address Yes FIO Address FIO Address.
limit No Positive Int Number of records to return. If omitted, all records will be returned. Due to table read timeout, a value of less than 1,000 is recommended.
offset No Positive Int First record from list to return. If omitted, 0 is assumed.
Example
{
  "fio_address": "purse@alice",
  "limit": 100,
  "offset": 0
}

Processing

  • Request is validated per Exception handling
  • NFTs are returned which are mapped by this FIO Address

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid FIO Address Format of FIO Address not valid. 400 "fio_address" Value sent in, i.e. "purse@alice" "Invalid FIO Address format"
FIO Address does not exist FIO Address does not exist. 400 "fio_address" Value sent in, i.e. "purse@alice" "FIO Address does not exist"
Invalid limit limit is not valid 400 "limit" Value sent in, e.g. "-1" "Invalid limit"
invalid offset offset not valid 400 "offset" Value sent in, e.g. "-1" "Invalid offset"
No NFTs are mapped FIO Address does not have any NFTs mapped. 404 "NFTs not found"

Response

Group Parameter Format Definition
nfts JSON Array Array of nfts
nfts chain_code String Chain code
nfts contract_address String Contract address
nfts token_id String Token ID
nfts url String Url of NFT asset
nfts hash String Token ID of NFT
nfts metadata String Metadata for NFT
more Int Number of remaining results
Example
{
  "nfts": [
    {
      "chain_code": "ETH",
      "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
      "token_id": "100010001",
      "url": "ipfs://ipfs/QmZ15eQX8FPjfrtdX3QYbrhZxJpbLpvDpsgb2p3VEH8Bqq",
      "hash": "f83b5702557b1ee76d966c6bf92ae0d038cd176aaf36f86a18e2ab59e6aefa4b",
      "metadata": ""
    },
    {
      "chain_code": "EOS",
      "contract_address": "atomicassets",
      "token_id": "2199023271139",
      "url": "",
      "hash": "",
      "metadata": ""{\"creator_url\":\"https://yahoo.com/\"}""
    }
	],
  "more": 0
}

Get NFTs from contract

Returns all mapped NFTs which have the specified contract address and token id.

New end point: /get_nfts_contract

Request

Parameter Required Format Definition
chain_code Yes String Chain code where NFT contract resides.
contract_address Yes String NFT contract address.
token_id No String NFT token ID.
limit No Positive Int Number of records to return. If omitted, all records will be returned. Due to table read timeout, a value of less than 1,000 is recommended.
offset No Positive Int First record from list to return. If omitted, 0 is assumed.
Example
{
  "chain_code": "ETH",
  "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
  "token_id": "100010001",
  "limit": 100,
  "offset": 0
}

Processing

  • Request is validated per Exception handling
  • NFTs which match the chain_code, contract_address, token_id combination are returned. Omitting or providing empty token_id will return NFTs which have the same chain_code, contract_address. In other words, empty token_id field is a wildcard.

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid chain format Invalid format of chain_code (see above) 400 "chain_code" Value sent in, e.g. "BTC!@#$%^&()" "Invalid Chain Code"
Invalid contract address format Invalid format of contract_address (see above) 400 "contract_address" Value sent in, e.g. "" "Invalid Contract Address"
Invalid token id Invalid format of token_id (see above) 400 "token_id" Value sent in "Invalid Token ID"
Invalid limit limit is not valid 400 "limit" Value sent in, e.g. "-1" "Invalid limit"
invalid offset offset not valid 400 "offset" Value sent in, e.g. "-1" "Invalid offset"
No NFTs are mapped FIO Address does not have any NFTs mapped. 404 "NFTs not found"

Response

Group Parameter Format Definition
nfts JSON Array Array of nfts
nfts fio_address String FIO Address which mapped the NFT
nfts chain_code String Chain code
nfts contract_address String Contract address
nfts token_id String Token ID
nfts url String Url of NFT asset
nfts hash String Token ID of NFT
nfts metadata String Metadata for NFT
more Int Number of remaining results
Example
{
  "nfts": [
    {
      "fio_address": "purse@alice"
      "chain_code": "ETH",
      "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
      "token_id": "100010001",
      "url": "ipfs://ipfs/QmZ15eQX8FPjfrtdX3QYbrhZxJpbLpvDpsgb2p3VEH8Bqq",
      "hash": "f83b5702557b1ee76d966c6bf92ae0d038cd176aaf36f86a18e2ab59e6aefa4b",
      "metadata": ""
    },
    {
      "fio_address": "purse@alice"
      "chain_code": "EOS",
      "contract_address": "atomicassets",
      "token_id": "2199023271139",
      "url": "",
      "hash": "",
      "metadata": ""{\"creator_url\":\"https://yahoo.com/\"}""
    }
	],
  "more": 0
}

Get NFTs from hash

Returns all mapped NFTs which have the specified hash.

New end point: /get_nfts_hash

Request

Parameter Required Format Definition
hash Yes String SHA-256 hash of NFT asset, e.g. media url.
limit No Positive Int Number of records to return. If omitted, all records will be returned. Due to table read timeout, a value of less than 1,000 is recommended.
offset No Positive Int First record from list to return. If omitted, 0 is assumed.
Example
{
  "hash": "f83b5702557b1ee76d966c6bf92ae0d038cd176aaf36f86a18e2ab59e6aefa4b",
  "limit": 100,
  "offset": 0
}

Processing

  • Request is validated per Exception handling
  • NFTs which match the hash are returned.

Exception handling

Error condition Trigger Type fields:name fields:value Error message
Invalid hash Invalid format of hash (see above) 400 "hash" Value sent in "Invalid hash"
Invalid limit limit is not valid 400 "limit" Value sent in, e.g. "-1" "Invalid limit"
invalid offset offset not valid 400 "offset" Value sent in, e.g. "-1" "Invalid offset"
No NFTs are mapped FIO Address does not have any NFTs mapped. 404 "NFTs not found"

Response

Group Parameter Format Definition
nfts JSON Array Array of nfts
nfts fio_address String FIO Address which mapped the NFT
nfts chain_code String Chain code
nfts contract_address String Contract address
nfts token_id String Token ID
nfts url String Url of NFT asset
nfts hash String Token ID of NFT
nfts metadata String Metadata for NFT
more Int Number of remaining results
Example
{
  "nfts": [
    {
      "fio_address": "purse@alice"
      "chain_code": "ETH",
      "contract_address": "0x63c0691d05f441f42915ca6ca0a6f60d8ce148cd",
      "token_id": "100010001",
      "url": "ipfs://ipfs/QmZ15eQX8FPjfrtdX3QYbrhZxJpbLpvDpsgb2p3VEH8Bqq",
      "hash": "f83b5702557b1ee76d966c6bf92ae0d038cd176aaf36f86a18e2ab59e6aefa4b",
      "metadata": ""
    },
    {
      "fio_address": "purse@alice"
      "chain_code": "EOS",
      "contract_address": "atomicassets",
      "token_id": "2199023271139",
      "url": "",
      "hash": "",
      "metadata": ""{\"creator_url\":\"https://yahoo.com/\"}""
    }
	],
  "more": 0
}

Rationale

Ability to search based on multiple parameters was scaled down and split into separate getter calls to ease development effort.

Implementation

Impacted source FIO Contracts:

  • fio.contracts/fio.address/fio.address.cpp
  • fio.contracts/fio.address/fio.address.hpp
  • fio.contracts/fio.common/fio_common_validator.hpp

FIO Node

  • chain_plugin/chain_plugin.cpp
  • chain_plugin/include/chain_plugin.hpp
  • chain_api_plugin/chain_api.plugin.cpp
  • programs/clio/main.cpp

Details:

  • Adding new custom actions to fio.address contract and their supported endpoints on the chain api
  • Add new table (nftstable) to support the necessary storage and searching NFT data
  • Adding new validator functions to fio.common headers (long url and hexadecimal validator)
  • Modifying the existing actions that "burn" nft account containers
  • Updating the FIO Address ABI (static)

Updates to development environment:

fio.devtools/scripts/actions/update_contracts.sh fio.devtools/scripts/launch/04_create_accounts.sh fio.devtools/scripts/launch/09_set_permissions.sh fio.devtools/scripts/launch/19_bind_dev_contracts.sh

Table:

  • nfts (nftstable)
Name Type Definition
id uint64 primary index
owner name Searchable Owner (actor) of the NFT
handle string FIO Handle (FIO Registered Address)
handlehash uint128 Searchable hash of FIO handle (fio address)
chain_code string Blockchain the NFT contract is on
contract_address string Searchable Blockchain contract address of the NFTs
token_id uint64 Unique identifier provided by the NFT contract
url string Users URL for the NFT. Must be RFC3986 supported characters (128 max)
hash string Searchable Sha256 Digest of the NFT
metadata string Additional NFT metadata

Structures: New type and reflections to support complex contract parameters for addnft and remnft.

  • nftinfo

    uint64 id // id of the nft record
    string fio_address // fio address mapped to NFT
    string chain_code // chain code of the nft
    uint64 chain_code_hash //hash of the chain code, for searching from endpoint
    string tokenid //token id is string to support other blockchain id conventions
    uint64 token_id_hash // unique id of the NFT. Created by hashing fio_address + chain_code + contract_address + token_id
    string url //optional
    uint128 fio_address_hash // index of the fio_address (searchable)
    string contract_address // contract address of NFT
    string hash //optional NFT hash
    uint128 hash_index //searchable index for hash
    string metadata // optional data
    
    key 1: byaddress
    key 2: bycontract
    key 3: byhash
    key 4: bychain
    key 5: bytokenid
    
  • nftparam

    string chain_code
    uint64 token_id
    string contract_address
    string url
    string hash
    string metadata
    
  • remnftparam

    string chain_code
    string contract_address
    uint64 token_id
    
  • nftburninfo

    uint64 id
    uint128 fio_address_hash
    

Release information

Released in:

Backwards Compatibility

No changes to requests/responses in existing actions or getters.

Future considerations

None

Discussion link

https://fioprotocol.atlassian.net/wiki/spaces/FC/pages/113606966/NFT+Digital+Signature