███████╗██╗██████╗ ███████╗███████╗ ██████╗ ██████╗
██╔════╝██║██╔══██╗ ╚════██║╚════██║██╔═████╗╚════██╗
█████╗ ██║██████╔╝█████╗ ██╔╝ ██╔╝██║██╔██║ █████╔╝
██╔══╝ ██║██╔═══╝ ╚════╝██╔╝ ██╔╝ ████╔╝██║██╔═══╝
███████╗██║██║ ██║ ██║ ╚██████╔╝███████╗
╚══════╝╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
一个完整的 EIP-7702 智能账户实现,支持 EOA 临时升级为智能账户并执行批量交易,包括标准批量交易和自定义hex数据批量交易功能。
EIP-7702 允许普通 EOA(Externally Owned Account)临时升级为智能账户,执行批量操作后自动恢复到 EOA 状态。本项目提供了完整的实现,包括标准批量交易和自定义hex数据批量交易功能。
- ✅ EOA 临时升级 - 将普通账户临时升级为智能账户
- ✅ 批量交易执行 - 支持一次性执行多个交易
- ✅ 签名验证 - 使用 ECDSA 签名确保安全性
- ✅ 防重放攻击 - 通过 nonce 机制防止重放
- ✅ 自动状态恢复 - 执行完成后自动恢复到 EOA 状态
- ✅ 标准交易格式 - 支持标准的 to/value/data 交易格式
- ✅ ABI 解析 - 自动解析和显示函数调用信息
- ✅ 安全验证 - 内置地址白名单和金额限制
- ✅ 环境配置 - 通过环境变量灵活配置
- ✅ 自定义Hex数据 - 支持任意hex格式的交易数据
- ✅ 合约调用支持 - 支持智能合约函数调用
- ✅ ETH转账 - 支持简单的ETH转账
- ✅ 安全验证 - 内置地址白名单和金额限制
- ✅ 环境配置 - 通过环境变量灵活配置
eip-7702/
├── contract/
│ └── SendBatchTransactions.sol # 核心智能账户合约
├── src/
│ ├── standard-batch.js # 标准批量交易脚本
│ └── hex-batch.js # Hex批量交易脚本
├── call_data/
│ ├── standard-batch-config.json # 标准批量交易配置
│ ├── hex-batch-config.json # Hex批量交易配置
│ ├── STANDARD_BATCH_CONFIG_GUIDE.md # 标准批量交易配置指南
│ └── HEX_BATCH_CONFIG_GUIDE.md # Hex批量交易配置指南
├── deploy.sh # 部署脚本
├── foundry.toml # Foundry 配置
├── remappings.txt # 依赖重映射
├── package.json # Node.js 项目配置
├── CONTRACT_VERIFICATION_GUIDE.md # 合约验证(开源)指南
├── .env # 环境变量配置
├── .gitignore # Git 忽略文件
└── README.md # 项目说明
git
git clone https://github.com/oxmoei/eip-7702.git && cd eip-7702
- Linux/WSL/macOS 用户:
./install.sh
- Windows 用户: 以管理员身份启动 PowerShell,然后执行以下命令
.\install.ps1
编辑 .env
,根据提示填写各项配置
# 运行部署脚本
./deploy.sh
# 执行标准批量交易
node src/standard-batch.js
# 执行 Hex 批量交易
node src/hex-batch.js
@openzeppelin/contracts
- OpenZeppelin 智能合约库forge-std
- Foundry 标准库
viem
- 以太坊客户端库dotenv
- 环境变量管理chalk
- 终端颜色输出
主要的智能账户合约,包含以下功能:
- validateAuthorization - 验证 EIP-7702 授权签名
- executeBatchWithAuthorization - 执行批量交易(带授权)
- executeWithAuthorization - 执行单笔交易(带授权)
- executeBatch - 直接执行批量交易
- execute - 直接执行单笔交易
- executeHexBatchWithAuthorization - 执行hex批量交易(带授权)
- executeHexWithAuthorization - 执行单笔hex交易(带授权)
- executeHexBatch - 直接执行hex批量交易
- executeHex - 直接执行单笔hex交易
编辑 call_data/standard-batch-config.json
:
{
"transactions": [
{
"target": "0xd9c5d6111983ea3692f1d29bec4ac7d6f723217a",
"value": "100000000000000000",
"data": "0x",
"description": "向地址0xd9c5d6111983ea3692f1d29bec4ac7d6f723217a发送0.1ETH"
},
{
"target": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0",
"abi": {
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable"
},
"params": [
"0x9d5befd138960ddf0dc4368a036bfad420e306ef",
"1000000"
],
"description": "将1代币(合约:0xdac17f958d2ee523a2206206994597c13d831ec7)转账给地址0x9d5befd138960ddf0dc4368a036bfad420e306ef"
},
{
"target": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0",
"abi": {
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address"
},
{
"name": "amount",
"type": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable"
},
"params": [
"0x9d5befd138960ddf0dc4368a036bfad420e306ef",
"1000000000000000000000"
],
"description": "将代币0xdac17f958d2ee523a2206206994597c13d831ec7授权给地址0x9d5befd138960ddf0dc4368a036bfad420e306ef"
}
],
"settings": {
"maxSingleTransactionValue": "1000000000000000000",
"maxBatchTotalValue": "5000000000000000000",
"enableAddressWhitelist": false,
"allowedTargets": []
}
}
node src/standard-batch.js
# 或者
npm run standard
编辑 call_data/hex-batch-config.json
:
{
"transactions": [
{
"target": "0xd9c5d6111983ea3692f1d29bec4ac7d6f723217a",
"value": "100000000000000000",
"hexData": "0x",
"isContractCall": false,
"description": "向地址0xd9c5d6111983ea3692f1d29bec4ac7d6f723217a发送0.1ETH"
},
{
"target": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0",
"hexData": "0xa9059cbb0000000000000000000000009d5befd138960ddf0dc4368a036bfad420e306e00000000000000000000000000000000000000000000000000000000000f4240",
"isContractCall": true,
"description": "将1代币(合约:0xdac17f958d2ee523a2206206994597c13d831ec7)转账给地址0x9d5befd138960ddf0dc4368a036bfad420e306ef"
},
{
"target": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"value": "0",
"hexData": "0x095ea7b30000000000000000000000009d5befd138960ddf0dc4368a036bfad420e306ef000000000000000000000000000000000000000000000000d3c21bcecceda0000000",
"isContractCall": true,
"description": "将代币0xdac17f958d2ee523a2206206994597c13d831ec7授权给地址0x9d5befd138960ddf0dc4368a036bfad420e306ef"
}
],
"settings": {
"maxSingleTransactionValue": "1000000000000000000",
"maxBatchTotalValue": "5000000000000000000",
"enableAddressWhitelist": false,
"allowedTargets": []
}
}
node src/hex-batch.js
# 或者
npm run hex
详细配置说明请参考:
- 私钥安全 - 通过环境变量管理,不在代码中硬编码
- 地址验证 - 支持白名单机制,防止意外转账
- 金额限制 - 设置合理的交易金额上限
- 错误处理 - 完整的错误回滚和异常处理
- 测试网络 - 建议先在测试网络上验证
- Gas 优化 - 自动 Gas 估算和策略选择
-
配置错误
错误: 请设置有效的 PRIVATE_KEY 解决: 检查.env文件中的私钥配置
-
功能未启用
错误: 标准批量交易功能未启用,请设置 ENABLE_STANDARD_BATCH=true 解决: 在.env文件中设置相应的功能开关为true
-
网络连接问题
错误: 无法连接到RPC节点 解决: 检查RPC_URL配置和网络连接
-
Gas不足
错误: Gas不足 解决: 增加GAS_LIMIT或检查账户余额
-
配置文件错误
错误: 配置文件不存在或格式错误 解决: 检查call_data目录下的配置文件是否存在且格式正确
-
语法错误
错误: SyntaxError: missing ) after argument list 解决: 检查脚本文件中的语法错误,确保所有括号匹配
-
环境变量缺失
错误: 环境变量未设置 解决: 确保.env文件存在且包含所有必需的配置项
- Telegram: t.me/cryptostar210
- 请我喝杯☕:0xd328426a8e0bcdbbef89e96a91911eff68734e84 ▋5LmGJmv7Lbjh9K1gEer47xSHZ7mDcihYqVZGoPMRo89s