🕌

[Astar]コントラクト備忘録12(psp22 Burnableの機能追加(複数バーン)について)

2023/02/25に公開

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

1 概要

  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