Skip to main content

Magic Spend

这是一个实现了 ERC-4337 Paymaster 接口的智能合约,名为MagicSpend。这个合约允许通过 Paymaster 机制来代付用户操作的 Gas 费用,同时还提供了一些额外的功能,如提取多余的 Gas 费用、管理资金等。

合约功能概述

  1. Gas 费用补偿:合约通过validatePaymasterUserOppostOp函数实现了对用户操作的 Gas 费用补偿。
  2. 资金管理:合约支持 ETH 和其他资产的存取功能,包括用户和合约所有者的提取操作。
  3. 签名验证:合约使用 ECDSA 签名验证机制来确保提取请求的合法性。
  4. 防重放攻击:通过 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 标准的智能合约钱包。