👻

[Astar]コントラクト備忘録13(psp22 Metadataの作成について)

2023/02/26に公開

こちらの知見がたまったので、備忘録として残します。

1 概要

  1. psp22 Metadataの作成

2 内容

こちらのコントラクトを実行しました。
OpenBrushのexampleのコードそのままです。

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

#[openbrush::contract]
pub mod my_psp22 {
    use ink_storage::traits::SpreadAllocate;
    use openbrush::{
        contracts::psp22::extensions::metadata::*,
        traits::{
            Storage,
            String,
        },
    };

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

    impl PSP22 for Contract {}

    impl PSP22Metadata for Contract {}

    impl Contract {
        #[ink(constructor)]
        pub fn new(total_supply: Balance, name: Option<String>, symbol: Option<String>, decimal: u8) -> Self {
            ink_lang::codegen::initialize_contract(|instance: &mut Self| {
                instance.metadata.name = name;
                instance.metadata.symbol = symbol;
                instance.metadata.decimals = decimal;
                instance
                    ._mint_to(instance.env().caller(), total_supply)
                    .expect("Should mint total_supply");
            })
        }
    }
}

1) use キーワードについて

まずは、ここから、OpenBrushの拡張機能である「metadata」を使用していることがわかります。

2) #[storage_field]について

次に、#[storage_field]にこのように「metadata::Data」を設定しています。

そこで、コードを見てみると、このようなデータ構造があることがわかりました。

https://github.dev/Supercolony-net/openbrush-contracts

3) 実装部分について

この部分では、PSP22Metadataをそのまま実装していることがわかります。

4) 「new」関数について

そして、下の部分で、引数のデータをメタデータに入れています。

5) 実際にやってみよう

では、実際にやってみましょう。

「name」に「test」、「symbpol」に「TST」と入れました。

では、「tokenName」関数から今入れた、nameを確認してみましょう。

すると、イメージと違うかと思います。

そこで、このように16進数にでコードしてみましょう。

改めて、nameを確認してみましょう。

このように、プレフィックスとして、文字数を表すものがあり、その後に文字を16進数にデコードしたものがあることがわかりました。
(プレフィックスは実際に色々試してみて、わかりました。)

Shibuya

adFFpvU4tgCLFZsnbAu9g4e9vxcN6dhRRBBHNYvqfHPWdXM

今回は、以上です。

Discussion