[Astar]コントラクト備忘録23(psp 37の「_mint_to」について)
こちらの知見がたまったので、備忘録として残します。
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