[Astar]コントラクト備忘録27(psp22 Wrapperを触ってみよう)
こちらの知見がたまったので、備忘録として残します。
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