🌟

[Astar]コントラクト備忘録25(psp22のallowanceについて)

2023/03/03に公開

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

1 概要

  1. psp22のallowanceについて

2 内容

本日は、psp22のallowanceのあたりを見てみようと思います。

下のように、デフォルトで「increaseAllowance」などの関数が用意されています。

では、Githubを見てみましょう。

「_approve_from_to」という関数が使われているということがわかります。

https://github.dev/Supercolony-net/openbrush-contracts

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

このように、「allowances」にキーとバリューが「insert」されています。

そして、「allowances」というデータを見るとこのように、「Mapping」であることがわかります。

また、TypeGurardを実装した、「AllowancesKey」というキーを用いていることわかりました。

そして、「_allowance」関数を確認すると、「get」関数を使用していることがわかります。

なお、getは次に見るように、Option型で返します。

Nullで返ってくる場合があるので、「unwrap」ではなく、「unwrap_or」を使っています。


https://doc.rust-lang.org/std/option/enum.Option.html#method.unwrap

ちなみに、「allowances」がMappingの型なので、こちらの「get」関数を使えています。

では次に、この「allowances」がどこで使われているかを見てみましょう。

それがこちらの「transfer_from」関数です。

「allowance」が「value」より小さい時に、「InsufficientAllowance」というエラーを返します。

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

現在の「allowance」は0です。

次に、「increaseAllowance」で「allowance」を500にしました。(0 + 500 = 500)

では、「transferFrom」を実行してみましょう。

「allowance(500)」より多い「value」を指定すると、このように、想定通り、エラーが起きました。

そして、このように、「allowance」より小さい値を設定するとうまくいきました。

最後に、「allowance」を確認すると、このように、減っていることも確認できました。(500 - 300 = 200)

shibuya

amX69oo96z88FreQRF3A1eAeUes5rd1t7YLotmBMozZw5fr

今回は以上です。

Discussion