The following standard attempts to define the keys of relevant on-chain metadata for any Native Assets . Any contract that implements the SRC-9 standard MUST implement the SRC-7 and SRC-20 standards. This is a living standard where revisions may be made as the ecosystem evolves.
The SRC-9 standard seeks to enable relevant data for assets on the Fuel Network. This data may include images, text, contact, or all of the above. All metadata queries are done through a single function to facilitate cross-contract calls.
The use of generic metadata for Native Assets is defined in the SRC-7 standard. This standard integrates into the existing SRC-7 standard.
The following keys are reserved for the SRC-9 standard. Use of the keys should follow the SRC-9 specification.
All keys SHALL use snake case.
The social prefix SHALL be used for any social media platform and SHALL return usernames.
Any social media metadata keys SHALL follow the following syntax social:site
where:
social
keyword must be prepended to denote this is a social platform site
keyword must be the website or platform of the social social:discord
The key social:discord
SHALL return a String
variant of a username for the Discord platform.
social:facebook
The key social:facebook
SHALL return a String
variant of a username for the Facebook platform.
social:farcaster
The key social:farcaster
SHALL return a String
variant of a username for the Farcaster platform.
social:friend.tech
The key social:friend.tech
SHALL return a String
variant of a username for the Friend.tech platform.
social:github
The key social:github
SHALL return a String
variant of a username for the Github platform.
social:instagram
The key social:instagram
SHALL return a String
variant of a username for the Instagram platform.
social:lens
The key social:lens
SHALL return a String
variant of a username for the Lens Protocol.
social:linkedin
The key social:linkedin
SHALL return a String
variant of a username for the LinkedIn platform.
social:reddit
The key social:reddit
SHALL return a String
variant of a username for the Reddit platform.
social:signal
The key social:signal
SHALL return a String
variant of a username for the Signal platform.
social:telegram
The key social:telegram
SHALL return a String
variant of a username for the Telegram platform.
social:tiktok
The key social:tiktok
SHALL return a String
variant of a username for the TikTok platform.
social:x
The key social:x
SHALL return a String
variant of a username for the X or formerly Twitter platform.
social:wechat
The key social:wechat
SHALL return a String
variant of a username for the WeChat platform.
social:whatsapp
The key social:whatsapp
SHALL return a String
variant of a username for the WhatsApp platform.
social:youtube
The key social:youtube
SHALL return a String
variant of a username for the YouTube platform.
The contact
prefix SHALL be used for any contact information on a particular project's team for an asset.
Any contact information metadata keys SHALL follow the following syntax contract:type
where:
contact
keyword must be prepended to denote this is contact information type
keyword must be the method of contact The key SHALL use snake case.
contact:email
The key contact:email
SHALL return a String
variant of an email.
contact:mailing
The key contact:mailing
SHALL return a String
variant of a mailing address. All mailing addresses MUST follow the UPU addressing format.
contact:phone
The key contact:phone
SHALL return a String
variant of a phone number. All phone numbers SHALL follow the E.164 standard.
contact:company
The key contact:company
SHALL return a String
variant of a company name.
The link
prefix SHALL be used for any external webpage hyperlink associated with an asset.
Any external webpage metadata keys SHALL follow the following syntax link:site
where:
link
keyword must be prepended to denote this is an external webpage site
keyword must be an external website link:home
The key link:home
SHALL return a String
variant of the asset's project homepage.
link:contact
The key link:contact
SHALL return a String
variant of the asset's project contact information webpage.
link:docs
The key link:docs
SHALL return a String
variant of the asset's project documentation webpage.
link:forum
The key link:forum
SHALL return a String
variant of the asset's project forum webpage.
link:blog
The key link:blog
SHALL return a String
variant of the asset's project blog.
link:linktree
The key link:linktree
SHALL return a String
variant of the asset's project linktree information webpage.
The res
prefix SHALL be used for any resources or general information on an asset.
Any resource metadata keys SHALL follow the following syntax rec:type
where:
res
keyword must be prepended to denote this is a resource type
keyword must be the type of resource res:license
The key res:license
SHALL return a String
variant of the asset's project license.
res:tos
The key res:tos
SHALL return a String
variant of the asset's project Terms of Service.
res:author
The key res:author
SHALL return a String
variant of the asset's project author. This MAY be a full name or pseudonym.
res:about
The key res:about
SHALL return a String
variant about the asset's project up to 2048 characters.
res:description
The key res:description
SHALL return a String
variant describing the asset's project up to 256 characters.
res:date
The key res:date
SHALL return a Int
variant of a UNIX timestamp.
res:block
The key res:block
SHALL return a Int
variant of a block number.
The image
prefix SHALL be used for any image files associated with a singular asset.
Any image metadata keys SHALL follow the following syntax image:type
where:
image
keyword must be prepended to denote this is an image type
keyword must be the file type of the image image:svg
The key image:svg
SHALL return a String
variant of an SVG image.
image:png
The key image:png
SHALL return a String
variant of a URI for a PNG image.
image:jpeg
The key image:jpeg
SHALL return a String
variant of a URI for a JPEG image.
image:webp
The key image:webp
SHALL return a String
variant of a URI for a WebP image.
image:gif
The key image:gif
SHALL return a String
variant of a URI for a GIF image.
image:heif
The key image:heif
SHALL return a String
variant of a URI for a HEIF image.
The video
prefix SHALL be used for any video files associated with a singular asset.
Any video metadata keys SHALL follow the following syntax video:type
where:
video
keyword must be prepended to denote this is a video type
keyword must be the file type of the video video:mp4
The key video:mp4
SHALL return a String
variant of a URI for an MP4 video.
video:webm
The key video:webm
SHALL return a String
variant of a URI for a WebM video.
video:m4v
The key video:m4v
SHALL return a String
variant of a URI for a M4V video.
video:ogv
The key video:ogv
SHALL return a String
variant of a URI for an OGV video.
video:ogg
The key video:ogg
SHALL return a String
variant of a URI for an OGG video.
The audio
prefix SHALL be used for any audio files associated with a singular asset.
Any audio metadata keys SHALL follow the following syntax audio:type
where:
audio
keyword must be prepended to denote this is audio metadata type
keyword must be the file type of the audio audio:mp3
The key audio:mp3
SHALL return a String
variant of a URI for an MP3 file.
audio:wav
The key audio:wav
SHALL return a String
variant of a URI for a WAV file.
audio:oga
The key audio:oga
SHALL return a String
variant of a URI for an OGA file.
The media
prefix SHALL be used for any media associated with a particular singular asset.
Any media metadata keys SHALL follow the following syntax media:type
where:
media
keyword must be prepended to denote this is a video type
keyword must be the file type of the media media:gltf
The key media:gltf
SHALL return a String
variant of a URI for a glTF file.
media:glb
The key media:glb
SHALL return a String
variant of a URI for a GLB file.
The logo
prefix SHALL be used for any images associated with a particular asset or project.
Any logo metadata keys SHALL follow the following syntax logo:type
where:
logo
keyword must be prepended to denote this is a logo type
keyword must be the type of logo logo:svg
The key logo:svg
SHALL return a String
variant of an SVG image of a logo.
logo:svg_light
The key logo:svg_light
SHALL return a String
variant of an SVG image of a logo for light themes.
logo:svg_dark
The key logo:svg_dark
SHALL return a String
variant of an SVG image of a logo for dark themes.
logo:small_light
The key logo:small_light
SHALL return a String
variant of a URI for a 32x32 PNG image of a logo for light themes.
logo:small_dark
The key logo:small_dark
SHALL return a String
variant of a URI for a 32x32 PNG image of a logo for dark themes.
logo:medium_light
The key logo:medium_light
SHALL return a String
variant of a URI for a 256x256 PNG image of a logo for light themes.
logo:medium_dark
The key logo:medium_dark
SHALL return a String
variant of a URI for a 256x256 PNG image of a logo for dark themes.
logo:large_light
The key logo:large_light
SHALL return a String
variant of a URI for a 1024x1024 PNG image of a logo for light themes.
logo:large_dark
The key logo:large_dark
SHALL return a String
variant of a URI for a 1024x1024 PNG image of a logo for dark themes.
The attr
prefix SHALL be used for any attributes associated with a singular asset.
Any attribute metadata keys SHALL follow the following syntax attr:type
where:
attr
keyword must be prepended to denote this is an attribute type
keyword must be the type of attribute There are no standardized types of attributes.
Example: attr:eyes
.
The SRC-9 standard should allow for standardized keys for metadata on the Fuel Network. This standard builds off existing standards and should allow other contracts to query any relevant information on the asset.
This standard is compatible with Fuel's Native Assets , the SRC-20 standard, and the SRC-7 standard.
This standard does not call external contracts, nor does it define any mutations of the contract state.
impl SRC7 for Contract {
fn metadata(asset: AssetId, key: String) -> Option<Metadata> {
if (asset != AssetId::default()) {
return Option::None;
}
match key {
String::from_ascii_str("social:x") => {
let social = String::from_ascii_str("fuel_network");
Option::Some(Metadata::String(social))
},
_ => Option::None,
}
}
}