🌊

[Astar]コントラクト備忘録27(psp22 Wrapperを触ってみよう)

2023/03/05に公開

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

1 概要

  1. psp22 Wrapperについて

2 内容

本日は、こちらのOpenBrushのexample(psp22 Wrapper)につきまして、まずはどのように動かすのかをみてみようと思います。

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

#[openbrush::contract]
pub mod my_psp22_wrapper {
    use openbrush::{
        contracts::psp22::extensions::wrapper::*,
        traits::Storage,
    };

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

    impl PSP22 for Contract {}

    impl PSP22Wrapper for Contract {}

    impl Contract {
        #[ink(constructor)]
        pub fn new(token_address: AccountId) -> Self {
            let mut instance = Self::default();

            instance._init(token_address);

            instance
        }

        /// Exposes the `_recover` function for message caller
        #[ink(message)]
        pub fn recover(&mut self) -> Result<Balance, PSP22Error> {
            self._recover(Self::env().caller())
        }
    }
}

まず、このwrapperコントラクトには、事前にもう一つ、コントラクトが必要です。

まずは、psp22Mintableのコントラクトを下のように作ります。

「bM..~is9」というコントラクトで、test1に一定量のミントがなされています。

この上で、Wrapperコントラクトを作成します。

作成時に、上で作った「bM..~is9」というコントラクトを引数に指定します。

では、Wrapperコントラクトに預け入れを行う、「depositFor」関数を実行してみましょう。

しかし、下のように「test1」に入れようとしたところ、「InsufficientAllowance」というエラーが出ました。

つまり、「Allowance」が不足しています。

そこで、下のように、「Mintable」コントラクトの「increaseAllowance」関数で、「Wrapper」コントラクトに対して、「100」を「allowance」として設定します。

すると、このように、実行することができるようになりました。

右にDebugメッセージが出ていますが、現時点で、私の中で理由がわからないので、ここは今回スルーします。

わかりましたら、どこかで記事にいたします。

一方、「Mintable」コントラクトに預けることもできます。

これは想定とは違うやり方だと思いますが、これも今回試してみようと思います。

40預けました。

また、「test1」に対しても、「25」を預け入れようと思います。

すると、「balanceOf」関数で、確かに「25」が存在していることが確認できました。

また、ここで、「Mintable」コントラクトの「allowance」を確認してみましょう。

最初100だったものが「40 + 25」をすでに預けたので、35が残り可能であるということが見て取れます。

では、「Wrapper」コントラクトで、「WithdrawTo」を実行してみます。

ちなみに、「WithdrawTo」実行前の「Mitable」コントラクトの残高がこちらです。

一方、「WithdrawTo」実行後はこちらになります。

このように、「WithdrawTo」によって、「Mitable」コントラクトも変動していることが確認できました。

今回は以上です。

Discussion