Magic Spend
这是一个实现了 ERC-4337 Paymaster 接口的智能合约,名为MagicSpend。这个合约允许通过 Paymaster 机制来代付用户操作的 Gas 费用,同时还提供了一些额外的功能,如提取多余的 Gas 费用、管理资金等。
合约功能概述
- Gas 费用补偿:合约通过
validatePaymasterUserOp和postOp函数实现了对用户操作的 Gas 费用补偿。 - 资金管理:合约支持 ETH 和其他资产的存取功能,包括用户和合约所有者的提取操作。
- 签名验证:合约使用 ECDSA 签名验证机制来确保提取请求的合法性。
- 防重放攻击:通过 nonce 机制防止重放攻击。
主要结构和函数
数据结构
WithdrawRequest:包含提取请求的详细信息,包括签名、资产地址、提取金额、nonce 和有效期。
事件
MagicSpendWithdrawal:在验证提取请求并准备提取资金时触发。MaxWithdrawDenominatorSet:在设置最大提取分母时触发。
错误处理
InvalidSignature:当提取请求的签名无效时抛出。Expired:当提取请求过期时抛出。InvalidNonce:当提取请求的 nonce 已被使用时抛出。RequestLessThanGasMaxCost:当提取请求的金额不足以支付最大 Gas 费用时抛出。UnsupportedPaymasterAsset:当提取请求的资产不是 ETH 时抛出。WithdrawTooLarge:当提取请求的金额超过允许的最大提取金额时抛出。NoExcess:当没有多余的资金可提取时抛出。UnexpectedPostOpRevertedMode:当postOp函数被第二次调用并且模式为postOpReverted时抛出。
修饰符
onlyEntryPoint:确保只能由 EntryPoint 合约调用的函数。
构造函数
constructor:初始化合约的所有者和最大提取分母。
主要函数
validatePaymasterUserOp:验证用户操作并计算需要补偿的 Gas 费用。postOp:在用户操作完成后进行资金结算。withdrawGasExcess:允许用户提取多余的 Gas 费用。withdraw:允许用户通过有效的提取请求提取资金。ownerWithdraw:允许合约所有者提取资金。entryPointDeposit:将 ETH 存入 EntryPoint 合约。entryPointWithdraw:从 EntryPoint 合约中提取 ETH。entryPointAddStake:向 EntryPoint 合约添加质押。entryPointUnlockStake:解锁 EntryPoint 合约中的质押。entryPointWithdrawStake:从 EntryPoint 合约中提取质押。setMaxWithdrawDenominator:设置最大提取分母。
签名验证和哈希计算
isValidWithdrawSignature:验证提取请求的签名。getHash:计算提取请求的哈希值。
内部函数
_setMaxWithdrawDenominator:设置最大提取分母。_validateRequest:验证提取请求的合法性。_withdraw:执行资金提取操作。
使用示例
假设你是合约的所有者,并且想要设置最大提取分母:
// 设置最大提取分母为100
magicSpend.setMaxWithdrawDenominator(100);
假设用户想要提取多余的 Gas 费用:
// 提取多余的Gas费用
magicSpend.withdrawGasExcess();
通过这种方式,MagicSpend合约实现了一个灵活且安全的 Gas 费用补偿机制,适用于 ERC-4337 标准的智能合约钱包。