用 ERC-20 token 支付 gas
1 Biconomy Relayer
是支付 gas 的第三方。
meta tx 不直接发送到区块链,而是发送元交易到第三方 Relayer,该第三方支付 gas。
2 ERC20Fowarder
合约代码
- 存储用来计算费用的其它合约的地址,包括 FeeManager 和 Oracle Aggregator。其中,FeeManager 是给 token 一个费用乘数,Oracle Aggregator 用来获得 token 价格。
- 在执行成功后向用户收费。调用特定 ERC20 token 的 transferFrom 方法 -- 向用户收费。
- 用户的 gas 会被转到 feeReceiver 地址,该地址是部署 ERC20Forwarder 合约的 owner,Biconomy 拥有 feeReceiver 地址。
3 Fee Manager
合约代码
该合约为负责为 user/token 组合给定一个费用乘数 -- getFeeMultipiler(address user, address token)。费用乘数本身是是在基础 tokenGasPrice 设置加价的方式。
Biconomy 的默认实现是 CentralizedFeeManager.sol,然而,任何实现 IFeeManager.sol 的合约都可以作为费用管理器。这为定制打开了大门。
费用乘数可以在 0 和 6.5535 之间-表示为从 0 到 65535 的 uint16 基点。然而,对于未来的定制选项,我们可能会规定最小值 >1。
4 Oracle Aggregator
合约代码
不同的 token 有不同的流动性和经济,这将影响我们获取他们价格数据的方式。
对于流行的 token,比如 Dai 和 USDC,可以使用 Chainlink 的价格源。对于更多具有 AMM 流动性的代币,使用 Uniswap TWAP 价格源。可能需要一些代币的完全定制安排,比如,定价数据来自另一个 DeFi 协议。
5 BiconomyForwarder (Trusted Forwarder)
合约代码
- 验证签名
- 将用户的地址添加到 call data
- 用户合约仅依赖 forwarder 保证安全性
6 DApp Smart Contract
用户的合约,获取原始 sender 并执行原始 tx
需要兼容 ERC-2771 标准
- 继承 BasicMetaTransaction
- 将
msg.sender
替换为_msgSender
,以获取原始 sender
参考
Forward - Enable Paying Gas in ERC20
Moving Forward, save your ETH. Pay gas in ERC20 tokens.
metatx-standard