🔖

[Astar]コントラクト備忘録23(psp 37の「_mint_to」について)

2023/03/02に公開

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

1 概要

  1. psp 37の「_mint_to」について

2 内容

本日は、こちらのpsp37のコントラクトを見ていきましょう。
OpenBrushのexampleそのままです。

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

#[openbrush::contract]
pub mod psp37 {
    // use ink::prelude::vec;
    use ink_prelude::vec;
    use openbrush::{
        contracts::psp37::*,
        storage::Mapping,
        traits::{
            Storage,
            String,
        },
    };

    #[derive(Default, Storage)]
    #[ink(storage)]
    pub struct Contract {
        #[storage_field]
        psp37: psp37::Data,
        denied_ids: Mapping<Id, ()>,
    }

    impl PSP37 for Contract {}

    impl Contract {
        #[ink(constructor)]
        pub fn new() -> Self {
            Self::default()
        }

        #[ink(message)]
        pub fn deny(&mut self, id: Id) {
            self.denied_ids.insert(&id, &());
        }

        #[ink(message)]
        pub fn mint_tokens(&mut self, id: Id, amount: Balance) -> Result<(), PSP37Error> {
            if self.denied_ids.get(&id).is_some() {
                return Err(PSP37Error::Custom(String::from("Id is denied")))
            }
            self._mint_to(Self::env().caller(), vec![(id, amount)])
        }
    }
}

大切なのは、こちらの「_mint_to」だと思います。

実際にGithubで見てみましょう。

こちらのように、「increase_balance」関数が使われています。

では、これが使われている、balancesを見てみましょう。

https://github.dev/727-Ventures/openbrush-contracts

下のように、trait bounds(トレイトバウンド)が行われています。

このトレイトバウンドは、whereキーワードを使い、特定のトレイトを実装することを要求する制約です。

では「BalancesManager」を見てみましょう。

確かに、「increase_balance」関数があることが確認できました。

では、中身を見てみましょう。

let amount = *amount; を見てみます。

chatGPTによると、ここでは参照先の値を取り出す、デリファレンスが行われています。

chatGPT


https://doc.rust-lang.org/std/primitive.u32.html#method.checked_add


https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap

では、本題に入りまして、この部分は何をやっているのでしょうか?

なぜ、(owner,id)のペアでbalanceが0の時は(owner,&None)に1を加えているのでしょうか?

これは実際に見た方がわかりやすいです。

例えば、「test1」というアカウントは、トークンID:「0,1,2」でそれぞれ量を持ちます。

トークンIDを指定しないことで、3種類のトークンIDを持っているということを表すことができます。

そして、こちらはIDを指定しているので、実際にトークンの量を増やすことができます。

例えば、トークンID:0は下のように量をもつことがわかります。

こちらもやっていることは同じです。

「mint」が「true」である場合に、こちらの処理を行っています。

トークンIDを指定した場合は、その「totalSupply」が表示され、

指定しない場合は、その種類数が表示されます。

shibuya

b9CFdH6fjhHMjj5cMnfCdZCnUuxjAd1pREGnGT3KengGZkZ

今回は以上です。

Discussion