# CW721 Metadata Onchain NFT creators may want to store their NFT metadata on-chain so other contracts are able to interact with it. With CW721-Base in CosmWasm, we allow you to store any data on chain you wish, using a generic `extension: T`. In order to support on-chain metadata, and to demonstrate how to use the extension ability, we have created this simple contract. There is no business logic here, but looking at `lib.rs` will show you how do define custom data that is included when minting and available in all queries. In particular, here we define: ```rust #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] pub struct Trait { pub display_type: Option, pub trait_type: String, pub value: String, } #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] pub struct Metadata { pub image: Option, pub image_data: Option, pub external_url: Option, pub description: Option, pub name: Option, pub attributes: Option>, pub background_color: Option, pub animation_url: Option, pub youtube_url: Option, } pub type Extension = Option; ``` In particular, the fields defined conform to the properties supported in the [OpenSea Metadata Standard](https://docs.opensea.io/docs/metadata-standards). This means when you query `NftInfo{name: "Enterprise"}`, you will get something like: ```json { "name": "Enterprise", "token_uri": "https://starships.example.com/Starship/Enterprise.json", "extension": { "image": null, "image_data": null, "external_url": null, "description": "Spaceship with Warp Drive", "name": "Starship USS Enterprise", "attributes": null, "background_color": null, "animation_url": null, "youtube_url": null } } ``` Please look at the test code for an example usage in Rust. ## Notice Feel free to use this contract out of the box, or as inspiration for further customization of cw721-base. We will not be adding new features or business logic here.