🛠

USDCでガス代を支払えるデモサイトを作った

2025/03/03に公開

デモの動かし方と挙動

USDCをガス代として、USDCを送金するWebアプリ

※リポジトリ
https://github.com/atakedemo/circle-uscd-paymaster/tree/main/02_demo_withui

※挙動の様子
https://youtu.be/cbi0BFqs7Ec

1. 環境変数を設定する

.envファイルを作成する

NEXT_PUBLIC_BUNDLER_PREFIX = "https://public.pimlico.io/v2/"
NEXT_PUBLIC_BASE_SEPOLIA_USDC = '0x036CbD53842c5426634e7929541eC2318f3dCF7e'
NEXT_PUBLIC_BASE_SEPOLIA_PAYMASTER = '0x31BE08D380A21fc740883c0BC434FcFc88740b58'
NEXT_PUBLIC_MAX_GAS_USDC = "1"
NEXT_PUBLIC_PRIVATEKEY = "0x..."

2. Next.jsのWeb UIを立ち上げる

npm run dev

3. Web UI上で送金を行う

以下動画のような流れとなる(最上部のものを再掲)

  1. Wallet接続
  2. 送金

https://youtu.be/cbi0BFqs7Ec

どんな仕組みになっているか

そもそものAccount Abstraction

登場人物

No. 名称 種別 概要
1 ユーザーウォレット EOA いわゆるウォレット
2 Bundler EOA 各ユーザーウォレットからの依頼をまとめてTxを実行する
3 Entry Point Contract Txをオンチェーン上で検証・実行依頼する関所
4 Walletコントラクト Contract ユーザーウォレットごとに作られるコントラクト
5 Paymaster Contract Walletコントラクトのガス代を肩代わりしてくれる

処理の流れ① 〜基本形(Paymasterを使わない)〜

正確には違うが、おおよその処理はこんな感じ

1.ユーザーウォレットからBundlerへ取引実行依頼

2.BundlerがUser Operationをまとめて、Entry Pointへ投げる

3.Entry PointがWalletコントラクトへ実行して良いかチェックする

4.Entry PointがWalletコントラクトを実行し、User Operationを処理する

処理の流れ② 〜Paymasterがガス代を肩代わり〜

まず、上記①の1の前の段階で、PaymasterからEntry Pointへガス代のDepositを行う

次に、3の前にPaymasterへガス代をPaymasterへ肩代わりさせて良いかEntry Pointへチェックを行う

最後のトランザクション実行においては、PaymasterがDepositしたものをガス代として使用する

今回のCircle提供のPaymasterを使うと

Circleが用意しているPaymasterにて、Walletコントラクトよりガス代分相当のUSDCを利用料として徴収している

実装してみての感想

便利だなと思った点

ハッカソンやプロジェクトに協力した際、様々なチェーンでステーブルコインをもらう。この時、メインどころのチェーンに移したい際にそもそものガス代分のネイティブトークンを用意しなければならないのだが、このガス代用意が不要となる。
よって、ステーブルコイン受け取り → 使う といった基本の動線がスムーズになる

考えどころだなと思った点

Paymasterが利用できるための権限を得るUIUXが頭の使い所だと感じた
今回は、WalletコントラクトにUSDCを持たせる必要があったが、そもそもWalletに送金する手間が生じる。
この動線をなるべくスマートにやりたい。
ジャストアイデアではあるが、以下がパッと思いついたところ

  • ガス代の代わりに用いるトークンについて、クレジットカードなどで購入させてWalletコントr買うとに入金する(Paypayチャージするような動線)
  • 利用料無料となるためのNFTを購入してもらう
  • 現金でサブスクリプション結んで、Paymaster運営側がホワイトリスト登録
GitHubで編集を提案

Discussion