[Astar]コントラクト備忘録12(psp22 Burnableの機能追加(複数バーン)について)
こちらの知見がたまったので、備忘録として残します。
1 概要
- psp22 Burnableの機能追加(複数バーン)
2 内容
こちらのコントラクトを作成しました。
#![cfg_attr(not(feature = "std"), no_std)]
#![feature(min_specialization)]
#[openbrush::contract]
pub mod my_psp22_burnable {
use ink_prelude::vec::Vec;
use ink_storage::traits::SpreadAllocate;
use openbrush::{
contracts::psp22::extensions::burnable::*,
contracts::psp22::extensions::mintable::*,
traits::Storage,
};
#[ink(storage)]
#[derive(Default, SpreadAllocate, Storage)]
pub struct Contract {
#[storage_field]
psp22: psp22::Data,
}
impl PSP22 for Contract {}
impl PSP22Burnable for Contract {}
impl PSP22Mintable for Contract {}
impl Contract {
#[ink(constructor)]
pub fn new(total_supply: Balance) -> Self {
ink_lang::codegen::initialize_contract(|instance: &mut Self| {
assert!(instance._mint_to(instance.env().caller(), total_supply).is_ok());
})
}
#[ink(message)]
pub fn burn_from_many(&mut self, accounts: Vec<(AccountId, Balance)>) -> Result<(), PSP22Error> {
for account in accounts.iter() {
self.burn(account.0, account.1)?;
}
Ok(())
}
}
}
こちらは、基本的に、OpenbrushのExampleをそのまま用いています。
https://github.dev/Supercolony-net/openbrush-contracts
1) Burnableを使う準備
まず、下のように、「openbrush::contracts::psp22::extensions::mintable::*」をインポートしていることがわかります。
そして、PSP22Burnableを修正せずに、そのまま実装していることがわかります。
2) burn_from_manyメソッドについて
① Vecについて
まずは、こちらのVecを見てみましょう。
こちらのchatGPTにもあるように、Vecは動的配列です。
ここでは、(AccountId、Balance)のペアを格納するために使われています。
chatGPT
② iter()について
次に、こちらのiter()です。
こちらのchatGPTにあるように、コレクションの要素を順番に返す、イテレータ(反復子)を返します。
chatGPT
③ burn()について
では次に、「burnable.rs」を見てみましょう。
実は、下のように、「burn」という関数は、「_burn_from」という関数を実行しています。
ちなみに、Result型を返していることもわかります。
https://github.dev/Supercolony-net/openbrush-contracts
そして、「_burn_from」は「psp22.rs」にあることがわかります。
https://github.dev/Supercolony-net/openbrush-contracts
④ ?演算子について
では、こちらのコードを確認してみましょう。
?演算子についてはこちらになります。
「burn」メソッドは「Result」型を返すので、エラーが発生した場合には、そのエラーを関数の呼び出し元に返してくれます。
3 最後に
実際に実行すると、Vecのため、複数のペアを引数として渡すことができることが確認できました。
Shibuya
aXVeeXiSzA8dxsj4zCfndJs6qvrwsh5iMMiq9GwsJTpiZDc
今回は以上です。
Discussion