Description:
Smart contract deployed on Ethereum with Factory features.
Blockchain: Ethereum
Source Code: View Code On The Blockchain
Solidity Source Code:
{{
"language": "Solidity",
"sources": {
"contracts/libraries/EIP7702Lib.sol": {
"content": "// SPDX-License-Identifier: MIT\r
pragma solidity ^0.8.19;\r
\r
/**\r
* @title EIP7702Lib\r
* @dev Library for EIP-7702 functionality (MetaMask Smart Accounts)\r
*/\r
library EIP7702Lib {\r
// Events\r
event EIP7702TransactionExecuted(address indexed eoa, address indexed contractCode, bytes32 indexed transactionHash, bool success, bytes returnData);\r
event EIP7702BatchExecuted(address indexed eoa, address indexed contractCode, uint256 operationsCount, bool success);\r
\r
/**\r
* @dev Execute EIP-7702 transaction for EOA with temporary smart contract functionality\r
*/\r
function executeEIP7702Transaction(\r
address eoa,\r
address contractCode,\r
bytes memory callData,\r
bytes memory signature\r
) external {\r
require(verifyEIP7702Signature(eoa, contractCode, callData, signature), "Invalid EIP-7702 signature");\r
\r
(bool success, bytes memory returnData) = eoa.call(\r
abi.encodeWithSignature("executeWithContractCode(address,bytes)", contractCode, callData)\r
);\r
\r
emit EIP7702TransactionExecuted(eoa, contractCode, keccak256(callData), success, returnData);\r
require(success, "EIP-7702 transaction failed");\r
}\r
\r
/**\r
* @dev Execute batch EIP-7702 transactions for multiple operations\r
*/\r
function executeEIP7702Batch(\r
address eoa,\r
address contractCode,\r
bytes[] memory operations,\r
bytes memory signature\r
) external {\r
require(verifyEIP7702BatchSignature(eoa, contractCode, operations, signature), "Invalid EIP-7702 batch signature");\r
\r
uint256 successCount = 0;\r
for (uint256 i = 0; i < operations.length; i++) {\r
(bool success, ) = eoa.call(\r
abi.encodeWithSignature("executeWithContractCode(address,bytes)", contractCode, operations[i])\r
);\r
if (success) successCount++;\r
}\r
\r
emit EIP7702BatchExecuted(eoa, contractCode, operations.length, successCount == operations.length);\r
require(successCount == operations.length, "Some EIP-7702 batch operations failed");\r
}\r
\r
/**\r
* @dev Execute EIP-7702 token transfer with gas sponsorship\r
*/\r
function executeEIP7702SponsoredTransfer(\r
address eoa,\r
address contractCode,\r
address token,\r
address from,\r
address to,\r
uint256 amount,\r
bytes memory signature\r
) external {\r
require(verifyEIP7702Signature(eoa, contractCode, abi.encode(token, from, to, amount), signature), "Invalid EIP-7702 signature");\r
\r
(bool success, bytes memory returnData) = eoa.call(\r
abi.encodeWithSignature(\r
"executeWithContractCode(address,bytes)",\r
contractCode,\r
abi.encodeWithSignature("transferFrom(address,address,uint256)", from, to, amount)\r
)\r
);\r
\r
emit EIP7702TransactionExecuted(eoa, contractCode, keccak256(abi.encode(token, from, to, amount)), success, returnData);\r
require(success, "EIP-7702 sponsored transfer failed");\r
}\r
\r
/**\r
* @dev Verify EIP-7702 authorization signature\r
*/\r
function verifyEIP7702Signature(\r
address eoa,\r
address contractCode,\r
bytes memory callData,\r
bytes memory signature\r
) internal pure returns (bool) {\r
bytes32 messageHash = keccak256(\r
abi.encodePacked(\r
"\x19EIP-7702 Authorization:\
",\r
eoa,\r
contractCode,\r
callData\r
)\r
);\r
\r
bytes32 r;\r
bytes32 s;\r
uint8 v;\r
\r
if (signature.length == 65) {\r
assembly {\r
r := mload(add(signature, 32))\r
s := mload(add(signature, 64))\r
v := byte(0, mload(add(signature, 96)))\r
}\r
} else {\r
return false;\r
}\r
\r
address signer = ecrecover(messageHash, v, r, s);\r
return signer == eoa;\r
}\r
\r
/**\r
* @dev Verify EIP-7702 batch authorization signature\r
*/\r
function verifyEIP7702BatchSignature(\r
address eoa,\r
address contractCode,\r
bytes[] memory operations,\r
bytes memory signature\r
) internal pure returns (bool) {\r
bytes32 messageHash = keccak256(\r
abi.encodePacked(\r
"\x19EIP-7702 Batch Authorization:\
",\r
eoa,\r
contractCode,\r
keccak256(abi.encode(operations))\r
)\r
);\r
\r
bytes32 r;\r
bytes32 s;\r
uint8 v;\r
\r
if (signature.length == 65) {\r
assembly {\r
r := mload(add(signature, 32))\r
s := mload(add(signature, 64))\r
v := byte(0, mload(add(signature, 96)))\r
}\r
} else {\r
return false;\r
}\r
\r
address signer = ecrecover(messageHash, v, r, s);\r
return signer == eoa;\r
}\r
}\r
"
}
},
"settings": {
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}
Submitted on: 2025-09-20 12:47:47
Comments
Log in to comment.
No comments yet.