😸

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

2023/03/06に公開

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

1 概要

  1. psp22 Flashmintについて

2 内容

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

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

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

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

    impl PSP22 for Contract {}

    impl FlashLender for Contract {}

    // To override an internal method from OpenBrush implementation
    // you need to override that in the `PSP22FlashLenderInternal` trait
    impl Internal for Contract {
        /// Override `get_fee` function to add 1% fee to the borrowed `amount`
        fn _get_fee(&self, amount: Balance) -> Balance {
            amount / 100
        }
    }

    impl Contract {
        #[ink(constructor)]
        pub fn new(total_supply: Balance) -> Self {
            let mut instance = Self::default();
            assert!(instance._mint_to(Self::env().caller(), total_supply).is_ok());

            instance
        }
    }
}

ではGithubからコードを見てみましょう。

まずは、「max_flashloan」からです。

ここで、if分岐で「Self::env()::account_id」となっていますので、自分自身のコントラクトを指定する必要があります。


https://github.dev/727-Ventures/openbrush-contracts

このように指定すると、「flashloan」ができる最大値が出てきました。

「totalsupply」は現在こちらになります。

そして、Balance::MAXは下のように、u128型の最大値を表す定数です。

では次に、手数料を表す「flash_fee」を見てみましょう。

先ほどと同様に、引数にアカウントIDを取ります。

エラーも見てみましょう。

「FlashLenderError」の中に「WrongTokenAddress」が入っていました。

そして、「get_fee」関数を見ると、このように0がデフォルトで設定されていました。

そのため、今回使うコードでは、overrideされ、amountの100分の1となるように設定されていました。

では、実際にやってみましょう。

異なるアドレスを設定した時には、このように、「WrongTokenAddress」というエラーが出ました。

自信を設定し、1000を入れたところ、その100分の1の10が出てきました。

では、最後に「flashloan」を見てみましょう。

下のように、mintやburnが行われています。

「_on_flashloan」は長くなるので、別の記事にしようと思います。

まずは、現在、下のbalanceがある状態でテストをしてみます。

下のように、「flashloan」をしようと知ると「AllowanceDoesNotAllowRefund」というエラーが発生しました。

そのため、まずは「allowance」を増やします。

下のようにして、「allowance」を4000にしました。

下のように確認して、4000が確かにあることを確認しました。

では、「flashloan」をしてみましょう。

ここでは500を実行しました。

では、「allowance」を見てみましょう。

下のように減っていることが確認できました。

続いて、balanceOfも確認してみます。

このように想定通りに動いていることが確認できました。

shibuya

XBW8z2hVjD3Raz4m7D2QA6Prigz8Kp2mNaUGtbpKTENAWNm

本日は以上です。

Discussion