Skip to main content
Version: 3.2.0

PSP34 Metadata

This example shows how you can reuse the implementation of PSP34 token with PSP34Metadata extension.

First, you should implement basic version of PSP34.

Step 1: Implement features​

#![cfg_attr(not(feature = "std"), no_std, no_main)]

#[openbrush::implementation(PSP34, PSP34Metadata)]
#[openbrush::contract]
pub mod my_psp34_metadata {
...

Step 2: Define storage​

Declare storage struct and declare the field related to the metadata module data structure. Then you need to derive the Storage trait and mark the corresponding field with the #[storage_field] attribute. Deriving this trait allows you to reuse the PSP34Metadata extension in your PSP34 implementation.

#[derive(Default, Storage)]
#[ink(storage)]
pub struct Contract {
#[storage_field]
psp34: psp34::Data,
#[storage_field]
metadata: metadata::Data,
}

Step 3: Define constructor​

Define constructor. Your PSP34Metadata contract is ready!

impl Contract {
/// A constructor which mints the first token to the owner
#[ink(constructor)]
pub fn new(id: Id, name: String, symbol: String) -> Self {
let mut instance = Self::default();

let name_key = String::from("name");
let symbol_key = String::from("symbol");
metadata::Internal::_set_attribute(&mut instance, id.clone(), name_key, name);
metadata::Internal::_set_attribute(&mut instance, id, symbol_key, symbol);

instance
}
}

Final code​

#![cfg_attr(not(feature = "std"), no_std, no_main)]

#[openbrush::implementation(PSP34, PSP34Metadata)]
#[openbrush::contract]
pub mod my_psp34_metadata {
use openbrush::traits::Storage;

#[derive(Default, Storage)]
#[ink(storage)]
pub struct Contract {
#[storage_field]
psp34: psp34::Data,
#[storage_field]
metadata: metadata::Data,
}

impl Contract {
/// A constructor which mints the first token to the owner
#[ink(constructor)]
pub fn new(id: Id, name: String, symbol: String) -> Self {
let mut instance = Self::default();

let name_key = String::from("name");
let symbol_key = String::from("symbol");
metadata::Internal::_set_attribute(&mut instance, id.clone(), name_key, name);
metadata::Internal::_set_attribute(&mut instance, id, symbol_key, symbol);

instance
}
}
}

You can check an example of the usage of PSP34 Metadata.