使用 Ethers.js 操作 zkSync Paymaster
在前一篇文章 Solidity - zkSync Paymaster 程式範例說明了如何撰寫和部署 Paymaster 合約,也有使用 Paymaster 發起交易的方法。不過專案是用 zksync-cli 建立,使用的是 Ethers.js v5 的版本。這篇文章會以如何在 Dapp 中,使用現成 Paymaster 的角度來說明。包含 Ethers.js v5 和 v6 的用法。
使用 zksync 套件和連接錢包等說明,參考之前的文章使用 Ethers.js 操作 zkSync 帳戶抽象,這邊不重複說明。
產生 Paymaster 參數
使用 Paymaster 發送交易要在交易中帶入 Paymaster 相關參數,可以使用套件中提供的方法:
1 | utils.getPaymasterParams(paymasterAddress: string, paymasterInput: PaymasterInput): PaymasterParams |
- paymasterAddress: Paymaster 合約地址。
- paymasterInput: Paymaster 使用的類型和參數,目前有兩種類型,參考下面範例。
- 回傳值:Tx 中
customData
的paymasterParams
資料格式,參考下面範例。
PaymasterInput 範例如下:
General
1 | // v5 使用 zksync-web3 |
ApprovalBased
1 | const PAYMASTER = '0xf9340983982a75985518CEa03129381be8b20F74'; |
預估手續費
v6
1 | const gasLimit = await contract.method.estimateGas( |
如果是使用 ApprovalBased
要重新計算一次 paymasterParams
的 minimalAllowance
1 | const tokenPrice = 2000n; // 此 Token 對於 ETH 的價格,例如 USDC/ETH 假設是 2000 |
v5
1 | // 順序不同 |
和上面一樣要重新計算一次 minimalAllowance
,不過 v5 和 v6 使用的數字型別不同
1 | gasLimit.mul(gasPrice).mul(2000) |
如果沒有使用帳戶抽象的話,實際上也可以略過這一步,讓他自己計算,但 minimalAllowance
不會自己計算。不進行預估的話可能會送出比實際需要的數字還大,有可能被收取超額的手續費。
送出交易
1 | await contract.method({ |
實際發送出交易 Metamask 會看到下面畫面:
會發現它其實是使用和帳戶抽象一樣的簽章方式來發送。Paymaster 可以和帳戶抽象同時使用,參考使用 Ethers.js 操作 zkSync 帳戶抽象,把 paymasterParams
資料帶入即可。
延伸閱讀
Solidity - zkSync Paymaster 程式範例
使用 Ethers.js 操作 zkSync 帳戶抽象
使用 Web3.js 操作 zkSync Paymaster