PSP37 Metadata
This example shows how you can reuse the implementation of PSP37 token with PSP37Metadata extension.
First, you should implement basic version of PSP37.
Step 1: Implement PSP37Metadata
#![cfg_attr(not(feature = "std"), no_std, no_main)]
#[openbrush::implementation(PSP37, PSP37Metadata)]
#[openbrush::contract]
pub mod my_psp37 {
...
Step 2: Define storage
Declare storage struct and declare the field related to the metadata module.
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 PSP37Metadata
extension in your
PSP37
implementation.
#[derive(Default, Storage)]
#[ink(storage)]
pub struct Contract {
...
#[storage_field]
metadata: metadata::Data,
}
Step 3: Define constructor
Define constructor. Your PSP37Metadata
contract is ready!
impl Contract {
#[ink(constructor)]
pub fn new() -> Self {
Self::default()
}
}
Final code
#![cfg_attr(not(feature = "std"), no_std, no_main)]
#[openbrush::implementation(PSP37, PSP37Metadata)]
#[openbrush::contract]
pub mod my_psp37 {
use openbrush::traits::{
Storage,
String,
};
#[derive(Default, Storage)]
#[ink(storage)]
pub struct Contract {
#[storage_field]
psp37: psp37::Data,
#[storage_field]
metadata: metadata::Data,
}
impl Contract {
#[ink(constructor)]
pub fn new() -> Self {
Self::default()
}
#[ink(message)]
pub fn set_attribute(&mut self, id: Id, key: String, data: String) -> Result<(), PSP37Error> {
metadata::Internal::_set_attribute(self, &id, &key, &data)
}
}
}
You can check an example of the usage of PSP37 Metadata.