በ በ EntryPoint በመጠቀም የመጀመሪያው UserOperation ውጤታማ ይሰራል. በዚህ ጊዜ ሁሉም ነገር ተስማሚ ነበር - ነገር ግን ስርዓት አንድ አስፈላጊ ክፍሎች አብዛኛውን ጊዜ የማይታመን ተደርጓል: ቦርሳ. ክፍል 1 ጓደኞች መለያ አጠቃቀም እና የ Ethereum ትክክለኛነት ክፍሎች መካከል ጓደኞች ናቸው. እነርሱ የ UserOperations ከሁለተኛ mempool ይወስዳሉ, የኃይል ክፍያዎች በፊት ይክፈሉ, እና በፕሮቶኮል በመጠቀም የተመሠረተ ናቸው. እነርሱ እንዴት ይሰራሉ ያውቃሉ - የክፍያ መስፈርቶች, የፈጠራ ስርዓት, እና የንግድ ግምገማዎች - ችግሮች ለመርዳት እና አስተማማማኝ መተግበሪያዎችን ለመፍጠር አስፈላጊ ነው. የ UserOperation Lifecycle አጠቃቀም በ UserOperation ላይ የተሰራ የሥራ ቦርሳዎች አጠቃቀም ነው. ይህ ለስማርት መለያ ላይ አንድ እንቅስቃሴ ለማስተካከል የሚፈልጉትን ነገር ሁሉ ያካትታል - Authorization, gas constraints, execution calldata, and optional paymaster logic. በ EntryPoint v0.8 ውስጥ, UserOperations በሽያጭ ላይ የተሸፈኑ, gas-optimized ቅርጸት ይጠቀማሉ. በ permissionless.js እንደ SDKs ጋር ይሰራሉ ጊዜ, እነርሱ በሽያጭ የተሸፈኑ ቅርጸት እንደ ይመዝገቡ: type UserOperation = { sender: Address nonce: bigint factory?: Address // Account factory (for first-time deployment) factoryData?: Hex // Factory calldata callData: Hex callGasLimit: bigint verificationGasLimit: bigint preVerificationGas: bigint maxFeePerGas: bigint maxPriorityFeePerGas: bigint paymaster?: Address paymasterVerificationGasLimit?: bigint paymasterPostOpGasLimit?: bigint paymasterData?: Hex signature: Hex } On-chain, EntryPoint gas efficiency (የአንድ አጠቃቀም አጠቃቀም አጠቃቀም አጠቃቀም) የ SDK ይህ ማሸጊያ ራስ-ሰር ይጠቀማል—እርስዎ ይህን ለመርዳት አይፈልግም. accountGasLimits = verificationGasLimit | callGasLimit የ UserOperation Lifecycle እንደዚህ ይሆናል: መፍጠር: ተጠቃሚው በ Smart Account SDK (like permissionless.js) ጋር UserOp መፍጠር ይችላሉ. : User signs the UserOp hash, proving they authorized the action Signing አግኙን: UserOp በ eth_sendUserOperation በኩል ወደ አግኙን አግኙን ነው የምስክር ወረቀት: Bundler በ UserOp ማረጋገጫ ለማረጋገጥ እርግጠኛ ይሆናል Mempool: የ UserOp በዩናይትድ ስቴትስ ውስጥ ይመጣል Bundling: Bundler በርካታ UserOps ወደ አንድ ብቻ handleOps አግኝተዋል መተግበሪያ: EntryPoint መተግበሪያ እያንዳንዱ On-chain UserOp ማረጋገጫ, ከዚያም እነሱን መተግበሪያ : EntryPoint collects gas costs from each account (or their paymaster). Payment የኩባንያው መውሰድ ሁለት ጊዜ ሊሆን ይችላል: አንድ ጊዜ ከባድ ጓደኛ (የ UserOp መውሰድ እንደሚቻል), እና አንድ ጊዜ በ EntryPoint ላይ (እነዚህ ሁለት መውሰድ የተለያዩ ውጤቶችን ለማምረት በፊት). እያንዳንዱ ትክክለኛነት ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ኮርፖሬሽን ማረጋገጫ: የ Bundlers ஏன் Paranoid ናቸው ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ከባድ ጓደኛዎች ይህ ነገር ሁሉንም ጓደኝነት ሞዴሎች ያካትታል. የ Ethereum ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ (Ethereum) ስቴትስ ERC-4337 በይነገጽ ማረጋገጫ ኮድ እንዴት ሊሆን ይችላል ያካትታል. የ EntryPoint ጥንካሬ ቅርጸት ይጠቀማል: : መለያው validateUserOp ተግባር የክፍያ ማረጋገጫ እና የክፍያ ማረጋገጫ ይሰራል. ይህ ደረጃ የክፍያ የክፍያ መግዛት የሚችል የክፍያ እና የክፍያ ምን ላይ ጠንካራ መስፈርቶች አለው. Validation Phase : መለያው መተግበሪያ ተግባር እውነተኛ ተግባር ይሰራል. እዚህ ምንም መስፈርቶች — ሙሉ EVM ችሎታዎች. Execution Phase አግኝቷል Opcodes አንዳንድ opcodes በክፍያ ወቅት የተጠበቁ ናቸው, ምክንያቱም የእነርሱ ዋጋዎች በክፍያ እና በክፍያ መካከል ሊለወጥ ይችላሉ: TIMESTAMP, NUMBER, COINBASE, PREVRANDAO: Block-dependent ዋጋዎች. አንድ መለያ (block.timestamp > deadline) መውሰድ ከሆነ (block.timestamp > deadline) መውሰድ ይችላሉ, ሲሚኒየም መውሰድ ይችላሉ, ከዚያም ከባድ ከባድ ከባድ ከባድ እስከባድ ጊዜ. BLOCKHASH: የተለያዩ ቦርሳዎች ላይ የተለያዩ ዋጋዎችን ይቀየዳል. GASPRICE, BASEFEE: የመስመር ላይ ሁኔታዎች ላይ የተመሠረተ ልማት. በ ERC-7562 [OP-080] ላይ ብቻ የተመሠረተ ኢንተርኔት (እነዚህ ላይ ይመልከቱ) የሚመሠረተ ተመሠረተ ተመሠረተ. GASLIMIT, ORIGIN: ሲሚኒየም መዋቅር እና እውነተኛ መተግበሪያ መካከል የተለያዩ ሊሆን ይችላል. BLOBHASH, BLOBBASEFEE: EIP-4844 blob-related opcodes በፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕሮፕ. SELFDESTRUCT, INVALID: የክፍያ ሂደቱ ውስጥ የፈጠራ ኦፕኮድ አይችሉም. ጋዝ: ብቻ ከባድ አንድ *CALL ትዕዛዝ-CALL, DELEGATECALL, STATICCALL, ወይም CALLCODE (የሌሎች ትዕዛዞች ወደ ጋዝ መላኪያ ለማግኘት) የሚከተሉትን ጊዜ ይቻላል. CREATE: በአጠቃላይ የተመሠረተ ነው, ምክንያቱም በእርግጥ ያልተመሠረተ አድራሻዎች ላይ መተግበሪያዎችን ለመፍጠር ነው. ነገር ግን, CREATE አንድ የተመሠረተ ፋብሪካ ይጠቀማል ጊዜ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ ጊዜ ብቻ ነው. እዚህ የእርስዎ መለያው የተጠበቀ opcode ይጠቀማል ጊዜ ምን ይሆናል: // This validateUserOp will be rejected by bundlers function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds) external returns (uint256 validationData) { // BANNED: block.timestamp can change require(block.timestamp < deadline, "Expired"); // ... rest of validation } The bundler runs a trace during simulation (using አንድ ERC-7562 ተስማሚ tracer ጋር) እና እያንዳንዱ UserOp እያንዳንዱ ተስማሚው opcodes ተስማሚ ነው. ዘመናዊ ተስማሚዎች የ JavaScript tracer ወይም በ EntryPoint v0.8 ጋር ተስማሚ የ Go መተግበሪያ መጠቀም ይችላሉ. debug_traceCall መግቢያ መስፈርቶች ከ opcodes በላይ, ቦርሳዎች የክፍያ slots የክፍያ ኮድ መውሰድ እና መጻፍ ሊሆን ይችላል ያካትታል. can only access: Unstaked entities የእርስዎን የክፍያ (የክፍያ መለያ) መለያ አድራሻ A ጋር "ካተተተተዋል" የቁማር ቦታዎች, defined as: the slot value equals A, OR was calculated as keccak256(Aannoo X) + n where x is bytes32 and n is in the range 0 to 128 በአጠቃላይ, ይህ ማለት የእርስዎ መለያ በኮምፒውተር አድራሻ በኮምፒውተር መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ መለያ የክፍያ ቅርጸት ነው የእርስዎን መለያ አድራሻ ቁልፍ ነው ከሆነ, ይህ ስሌት "እርስዎ ጋር የተገናኙ" ነው. የ offset (0-128) ከኮምፒውተር መውሰድ በኋላ የተመሠረተ የኮምፒውተር ክፍሎች መዳረሻ ይሰጣል - የኮምፒውተር ክፍሎች አንድ የኮምፒውተር ክፍሎች ናቸው. mapping(address => uint256) balances keccak256(address || slot_of_mapping) +n (አክሲዮን, paymasters, ወይም ፋብሪካዎች በ EntryPoint ውስጥ ክፍያ አግኝቷል) ተጨማሪ ነጻነት ያገኛሉ: Staked entities Can access any slot in their own storage (STO-031) በ UserOp (STO-032) ውስጥ ማንኛውም ኢንተርኔት ጋር የተያያዙ መክፈል ይችላሉ በ non-entity contracts (STO-033) ውስጥ መክፈት ብቻ መግዛት ይችላሉ See the full storage access rules in . የኦሪጂናል 7562 እነዚህን ሁኔታዎች ምን ያህል ሊሆን ይችላል? የ 2 UserOperations ይመልከቱ, እነሱም መቆጣጠሪያ ወቅት ተመሳሳይ የቁማር ስልክ ከ ይመልከቱ. የመጀመሪያው አጠቃቀም በዚህ ስልክ ስልክ ይሞታሉ ከሆነ, ሁለተኛው አጠቃቀም መቆጣጠሪያ አጠቃቀም አጠቃቀም አጠቃቀም ሊሆን ይችላል. የክፍያ መዳረሻ መከላከያ ወቅት ማቀዝቀዣ መዳረሻ ማቀዝቀዣ በመጠቀም, ቦርሳዎች በእያንዳንዱ ቦርሳ ውስጥ በርካታ UserOperations ያካትታሉ, የ cross-operation interference ወይም non-deterministic ፍለጋዎችን ለመጠበቅ. The Reputation System በአጠቃላይ, አንድ መለያ የ UserOps ይሰጣል, ነገር ግን በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ Bundlers እነዚህ entities ጋር መከታተል እያንዳንዱ ኢንተርኔት (ኮምፒውተር አድራሻ, paymaster አድራሻ, ፋብሪካ አድራሻ) ለ, የ bundler መለያዎች: reputation system የ opsSeen: እነዚህን መሣሪያዎች ላይ የ UserOps አጠቃቀም አጠቃቀም አላቸው : How many of those actually got included on-chain opsIncluded The reputation status is determined by slack-based thresholds (defined in ): የኦሪጂናል 7562 maxSeen = opsSeen / MIN_INCLUSION_RATE_DENOMINATOR (10 for bundlers) status = BANNED if maxSeen > opsIncluded + BAN_SLACK (50) status = THROTTLED if maxSeen > opsIncluded + THROTTLING_SLACK (10) status = OK otherwise The "slack" values are tolerance buffers that prevent false positives from normal operational variance. አንድ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ አጠቃላይ provides an even larger buffer before permanent banning. This design acknowledges that some UserOps legitimately fail (network conditions, race conditions) without indicating malicious behavior. THROTTLING_SLACK = 10 BAN_SLACK = 50 አንድ አጠቃቀም ጊዜ የ "Bundler" በ "Meppool" ውስጥ የሚሆን የ UserOps መጠን ያካትታል. , all UserOps involving that entity are rejected immediately. throttled banned ግምገማ ኩባንያዎች በ EntryPoint ትዕዛዞች ውስጥ ETH መተግበሪያዎችን ለማሻሻል ይችላሉ: entryPoint.addStake{ value: 1 ether }(unstakeDelaySec); The stake isn't slashed—it's just locked. But it demonstrates commitment and grants: Relaxed storage access rules (as described above) ከፍተኛ ግምገማዎች ከባድ ግምገማዎች ይበልጥ ለ paymasters እና ፋብሪካዎች, በተለይም, መጫወት ምርት ጥቅም ላይ በአብዛኛው አስፈላጊ ነው. ምንም ይህ, አንድ አንድ ተለዋዋጭ UserOp በፍጥነት የአትክልት ለመቀነስ ይችላሉ. የ canonical mempool ይፈልጋል (chain-specific, typically 1 ETH or equivalent) and የ 86400 ሰከንዶች (1 ቀን) ትክክለኛ ተቀማጭ መጠን በሽያጭ ላይ ይለያያል እና በ mempool ሜታታታታታዎች ውስጥ የተመሠረተ ነው — የእርስዎን ትክክለኛ አውታረ መረብ ለ ማሸጊያ ማረጋገጫ ይመልከቱ. MIN_STAKE_VALUE MIN_UNSTAKE_DELAY ጋዝ ኢንዱስትሪ ከባድ አግኝቷል ፡፡ በባድ አግኝቷል ፡፡ በባድ አግኝቷል ፡፡ በባድ አግኝቷል ፡፡ በባድ አግኝቷል ፡፡ በባድ አግኝቷል ፡፡ የ Bundler አጠቃቀም Revenue = Σ (each UserOp's payment to beneficiary) Cost = Gas used × Gas price paid for handleOps tx Profit = Revenue - Cost እያንዳንዱ UserOp የእርስዎን ጋዝ አጠቃቀም እና የተመሠረተ ጋዝ ዋጋ ላይ የተመሠረተ: Payment = (actualGasUsed + preVerificationGas) × min(maxFeePerGas, baseFee + maxPriorityFeePerGas) The bundler sets the አድራሻ በ call to receive these payments. beneficiary handleOps ትክክለኛነት ይሰጣል The አጠቃላይ ክፍያዎች የተወሰነ ክፍያዎች ሊሆን አይችልም: preVerificationGas : 16 gas per non-zero byte, 4 gas per zero byte Calldata cost የ Bundle overhead: በ UserOps ላይ የተመሠረተ እያንዳንዱ HandleOps አግኝተዋል ክፍያዎች L2 ውሂብ ክፍያዎች: እንደ Optimism ወይም Arbitrum እንደ L2s ላይ, L1 ወደ calldata ለመስጠት ተጨማሪ ክፍያዎች አሉ ጋዝ ማከማቻ ላይ, ማከማቻዎች preVerificationGas በ UserOp መጠን ላይ የተመሠረተ ያካትታል: // Simplified preVerificationGas calculation const calldataCost = userOpBytes.reduce((sum, byte) => sum + (byte === 0 ? 4n : 16n), 0n ); const overhead = 38000n; // ~21000 tx base + ~10000 bundle overhead + ~7000 per-op preVerificationGas = calldataCost + overhead + l2DataFee; Overhead values vary by bundler. For reference, Alto uses አግኙን , . Always use የ hardcoding ይልቅ. transactionGasStipend: 21000 fixedGasOverhead: 9830 perUserOp: 7260 eth_estimateUserOperationGas የማይጠቀሙ ጋዝ ቅናሽ መተግበሪያዎች ለ ጋዝ (እነዚህ BlockSpace ፍሰት) የሚፈልጉትን ተጨማሪ ክፍያዎችን ለመጠበቅ EntryPoint የክፍያ ጋዝ ላይ የክፍያ ክፍያዎችን ይጠቀማል. (የአውሮፕላን መለያዎች) እና (የ Paymaster ልጥፎች ለ) callGasLimit paymasterPostOpGasLimit በእያንዳንዱ ገጾች ውስጥ የማይጠቀሙ ጋዝ በ PENALTY_GAS_THRESHOLD (40,000) በላይ ከሆነ, መለያው የሚጠቀሙ መጠን ከ 10% (UNUSED_GAS_PENALTY_PERCENT) ይሰጣል (የ verificationGasLimit ወይም preVerificationGas አይጠቀሙ) ይህ "እርስዎን ደህንነት ለማግኘት" "እርስዎን ትክክለኛነት ከፍተኛ ትክክለኛነት ለማስተካከል ይደሰቱ" እርስዎ ጋዝ ግምገማዎች ስዕሎች ይመልከቱ ከሆነ, የእርስዎን መስፈርቶች ትክክለኛ ነው ከሆነ ይመልከቱ. መጨረሻው መጨረሻው መጨረሻው መጨረሻው መጨረሻው መጨረሻ ነው. eth_estimateUserOperationGas Common Errors and Debugging When a UserOperation is rejected, the RPC error is the only signal you get. Bundlers return structured error codes that explain exactly why the operation failed — but only if you know how to read them. AA1x: ፋብሪካ ስህተት በ EntryPoint v0.8 ውስጥ, አንድ አዲስ መለያ በመተግበሪያ ላይ ይሆናል. and as separate fields (the EntryPoint packs them into internally): factory factoryData initCode AA10: "የተላለፊያ ተመሠረተ" - የተላለፊያ አድራሻ በአሁኑ ጊዜ ኮድ የተሰራ ነው. AA13: "initCode failed or OOG" - የ ፋብሪካ's createAccount call failed ወይም ጋዝ አዝራረዋል. : "initCode must return sender" - The factory returned a different address than expected. AA14 AA15: "initCode must create sender" - የፋብሪካ አግኝተዋል ነገር ግን ወደ አግኝተዋል አድራሻ ወደ ኮድ መተግበሪያ አይደለም. : የእርስዎን ፋብሪካ ውስጥ የፕሮጀክት መግቢያ መግቢያ መግቢያ መግቢያ መግቢያ መግቢያ መግቢያ መግቢያ መግቢያ Debugging createAccount AA2x: መለያ ማረጋገጫ ስህተት The most common category: : "account not deployed" - The sender address has no code and no was provided. AA20 initCode AA21: "የተግበሪያ አግኝቷል" - መለያው ከፍተኛው አግኝቷል የሚችል ጋዝ ወጪ ለማሸነፍ አይችልም. AA22: "አውሮፕላስ" ወይም "አውሮፕላስ" (የአውሮፕላስ) "የአውሮፕላስ" (የአውሮፕላስ) ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ ከሁሉም ጊዜ. AA23: "የተግበሪያ" - መለያው validateUserOp ተግባር ተመሠረተ. የእርስዎን ትዕዛዞች ማረጋገጫ መግቢያ መግቢያ ይመልከቱ. : "signature error" - The returned validation data indicates an invalid signature. AA24 AA25: "Invalid account nonce" - The nonce doesn't match. The nonce in ERC-4337 is a 256-bit value with two parts: nonce = (keyword << 64) Igbo sequence. The key (upper 192 bits) identifies the "lane"—you can have multiple parallel UserOps with different keys. The sequence (lower 64 bits) must increment sequentially within each lane. Common causes: Reusing a nonce that was already included የ nonce key አጠቃቀም ሌላው UserOp ጋር ተመሳሳይ መተግበሪያ በ mempool ውስጥ ይጀምራል AA26: "Over verificationGasLimit" - መለያ ማረጋገጫ የተመሠረተ በላይ ጋዝ ይጠቀማል. AA3x: የ Paymaster Errors : "paymaster not deployed" - The paymaster address has no code deployed. AA30 : "paymaster deposit too low" - The paymaster's deposit in the EntryPoint can't cover the gas cost. Top it up: AA31 entryPoint.depositTo{ value: 1 ether }(paymasterAddress); AA32: "paymaster የተወሰነ ወይም የተወሰነ አይደለም" - AA22 ጋር ተመሳሳይ, ነገር ግን paymaster's validation data ለ. : "paymaster reverted" - The paymaster's function reverted. AA33 validatePaymasterUserOp : "paymaster signature error" - Bad signature in the paymaster data. AA34 : "over paymasterVerificationGasLimit" - Paymaster validation used more gas than allocated. Increase . AA36 paymasterVerificationGasLimit Bundlers ጋር ይሰራል RPC ዘዴዎች Every ERC-4337 bundler implements these standard methods: : Submit a UserOp for inclusion eth_sendUserOperation const userOpHash = await bundler.request({ method: 'eth_sendUserOperation', params: [userOp, entryPointAddress] }); : Get gas limit estimates eth_estimateUserOperationGas const gasEstimate = await bundler.request({ method: 'eth_estimateUserOperationGas', params: [userOp, entryPointAddress] }); // Returns: { preVerificationGas, verificationGasLimit, callGasLimit, ... } : አንድ UserOp በ Hash ላይ ይመልከቱ eth_getUserOperationByHash const userOp = await bundler.request({ method: 'eth_getUserOperationByHash', params: [userOpHash] }); : Get the receipt after inclusion eth_getUserOperationReceipt const receipt = await bundler.request({ method: 'eth_getUserOperationReceipt', params: [userOpHash] }); // Returns: { success, actualGasUsed, receipt: { transactionHash, ... } } : Discover which EntryPoint versions the bundler supports eth_supportedEntryPoints const entryPoints = await bundler.request({ method: 'eth_supportedEntryPoints', params: [] }); // Returns: ['0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108'] የዲጂታል Mempool Originally, each bundler maintained its own private mempool. This created problems: የ Censorship Risk: አንድ ተባባሪ እያንዳንዱ UserOps ያካትታሉ ይችላሉ : Users had to know which bundlers to submit to Fragmentation : If your bundler went down, your UserOps were stuck Single points of failure The solution is the , a P2P network where bundlers gossip UserOps to each other. It works similarly to how Ethereum nodes gossip transactions: ERC-4337 shared mempool User submits UserOp to any participating bundler Bundler validates and adds to the local mempool Bundler ወደ connected peers በመተግበሪያ Any bundler on the network can include the UserOp. የፕሮክቶኮች መረብ ለማግኘት libp2p ይጠቀማል. Bundlers ማንኛውም mempools እነርሱ ድጋፍ (የ IPFS CIDs የተመሠረተ mempool ሜታዳታ ፋይሎች ያካትታሉ), እና ብቻ የ UserOps ያካትታሉ. ለምሳሌ, አንድ mempool ሜታዳታ ፋይሎች እንደ: chainId: '1' entryPointContract: '0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108' description: Canonical ERC-4337 mempool for Ethereum Mainnet minimumStake: '1000000000000000000' የ IPFS CID በዚህ ፋይሎች ውስጥ በ P2P ቁጥጥር ስምዎች ውስጥ ጥቅም ላይ የ mempool መታወቂያ ይሆናል. የ mempool ሜታታታታታዎች ማረጋገጫ መስፈርቶች ያካትታል: ማንኛውም opcodes የተጠበቀ ናቸው, መክተቻ መግቢያ ሞዴሎች, ጋዝ መስፈርቶች, እና ታዋቂነት መስፈርቶች. አንድ ቦርሳ በ P2P ግምገማ በኩል አንድ UserOp ያገኛል ጊዜ, በአካባቢው mempool ወደ ያካትታል በፊት የእርስዎን መስፈርቶች ጋር ይወዳሉ. ዘመናዊ ጥያቄዎች Aggregators የምስክር ወረቀት ማረጋገጫ በሽያጭ ላይ ዋጋ ነው. የ ecrecover precompile በሽያጭ በሽያጭ በ 3,000 ጋዝ ነው, ነገር ግን የ smart account signature verification በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽያጭ በሽ What problem do aggregators solve? Instead of each account verifying its own signature, accounts can delegate to an aggregator contract. The aggregator implements a batch verification algorithm (like BLS signatures, where multiple signatures can be combined into one). How it works: መለያው validateUserOp በ validation ውሂብ ውስጥ አንድ aggregator አድራሻ ይውላል Bundler groups all UserOps using the same aggregator Bundler Aggregator.validateSignatures(userOps, AggregatedSignature) አንድ ጊዜ ወደ ቡድን ይደውሉ If verification passes, all UserOps in that group are considered valid : The return value from packs three pieces of information into a single 256-bit value: The validationData encoding validateUserOp validationData = uint160(aggregator) | // bits 0-159: aggregator address (uint256(validUntil) << 160) | // bits 160-207: expiration timestamp (uint256(validAfter) << 208) // bits 208-255: earliest valid time አጠቃቀም (ቢት 0-159): አጠቃቀም አጠቃቀም አጠቃቀም አጠቃቀም አጠቃቀም አድራሻ, ወይም ልዩ ዋጋዎች: 0 = አጠቃቀም ተስማሚ, 1 = አጠቃቀም ተስማሚ validUntil (ቢት 160-207): ይህ UserOp መጨረሻው በኋላ Timestamp (0 = ምንም መጨረሻ) (bits 208-255): Timestamp before which this UserOp is not valid (0 = immediately valid) validAfter ይህ የኮምፒውተር መለያዎች በእያንዳንዱ ውሂብ መጠን ውስጥ ትክክለኛነት እና የክፍያ ማረጋገጫ ትክክለኛነት ይሰጣሉ.This encoding lets accounts specify both signature verification delegation and time-limited validity in a single return value. Paymasters የ Paymasters ተጠቃሚዎች ከ ጋዝ ክፍያ አጠቃቀም. የ ጋዝ ክፍያ መለያ helyett, አንድ paymaster ሊሆን ይችላል: የ Sponsor Transactions: ተጠቃሚዎች ላይ ክፍያ (gassless UX) ERC-20 ቶኮችን ያግኙ: ተጠቃሚዎች በ stablecoins ወይም ሌሎች ቶኮችን ይክፈሉ : Rate limiting, subscription models, etc. Implement custom logic The paymaster's validation flow runs during the validation phase: function validatePaymasterUserOp( PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 maxCost ) external returns (bytes memory context, uint256 validationData); The returned here is passed to መተግበሪያ መጨረሻ በኋላ, የ paymaster መጨረሻ መለያዎችን (በ ERC-20 ቶኬን መክፈት እንደ) ለማስተካከል ይችላሉ: context postOp function postOp( PostOpMode mode, bytes calldata context, uint256 actualGasCost, uint256 actualUserOpFeePerGas ) external; Paymasters should be staked for production use. Staking provides relaxed storage access rules and better reputation—unstaked paymasters face strict limitations and can be quickly throttled by bundlers. While unstaked paymasters technically function with basic operations, staking is practically required for any serious paymaster implementation. can በአካባቢው ሙከራዎች ይህ ክፍል በ EntryPoint v0.8 ጋር ይጀምራል. የ Pimlico TypeScript Bundler እና , a viem-based library for ERC-4337 interactions. Alto permissionless.js SimpleAccountFactory In Part 1 we built a minimal smart account. But how do users deploy it? They can't send a regular transaction—they don't have ETH for gas yet. ERC-4337 solves this with factory contracts. ለ , the reference implementation includes በ EntryPoint ጋር መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ መተግበሪያ SimpleAccount SimpleAccountFactory Account Deployment via UserOp የ EntryPoint ፋብሪካ እና factoryData መስኮቶች ጋር አንድ UserOp ያገኛሉ ጊዜ: Checks if has code—if yes, skip deployment sender በ factoryData በኩል factory.createAccount(አውስትራሊያ, ሻጋታ) ይደውሉ Verifies the deployed address matches sender የቅርብ ጊዜ የተመሠረተ መለያ ላይ ማረጋገጫ ይጀምራል በከፍተኛ ደረጃ alto \ --rpc-url http://localhost:8545 \ --entrypoints 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 \ --executor-private-keys 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d \ --utility-private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ --safe-mode false \ --api-version v1,v2 \ --bundle-mode auto Key flags: : Key for submitting bundles (must have ETH) --executor-private-keys : Anvil lacks the JavaScript tracer for full ERC-7562 validation --safe-mode false --api-version v1,v2: ሁለቱም UserOp ቅርጸቶች (v1 ለ 0.6, v2 ለ 0.7/0.8) ያግኙ Sending UserOperations with permissionless.js መዋቅር መዋቅር: npm install viem permissionless Step 1: Set up clients We need three clients: one for reading chain state, one for bundler-specific RPCs, and one for the smart account owner. import { http, createPublicClient, createWalletClient, parseEther } from "viem" import { privateKeyToAccount } from "viem/accounts" import { foundry } from "viem/chains" import { toSimpleSmartAccount } from "permissionless/accounts" import { createSmartAccountClient } from "permissionless/clients" import { createPimlicoClient } from "permissionless/clients/pimlico" const ENTRYPOINT = "0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108" const publicClient = createPublicClient({ chain: foundry, transport: http("http://localhost:8545") }) const pimlicoClient = createPimlicoClient({ chain: foundry, transport: http("http://localhost:4337"), entryPoint: { address: ENTRYPOINT, version: "0.8" } }) const owner = privateKeyToAccount(process.env.PRIVATE_KEY) The connects to Alto's RPC and provides gas estimation via . pimlicoClient pimlico_getUserOperationGasPrice Step 2: Create the smart account instance const simpleAccount = await toSimpleSmartAccount({ client: publicClient, owner, entryPoint: { address: ENTRYPOINT, version: "0.8" } }) const accountAddress = await simpleAccount.getAddress() console.log("Account:", accountAddress) This computes the counterfactual address using the factory's መለያው አሁን አይሆንም – ነገር ግን እኛ ትክክለኛውን ምንድን ይሆናል ያውቃሉ. getAddress Step 3: Fund the account The smart account needs ETH to pay for gas (or use a paymaster). We can send ETH to the counterfactual address: const walletClient = createWalletClient({ account: owner, chain: foundry, transport: http("http://localhost:8545") }) await walletClient.sendTransaction({ to: accountAddress, value: parseEther("1") }) The ETH sits at that address. When the account is deployed, it can access those funds immediately. Step 4: Create the smart account client const smartAccountClient = createSmartAccountClient({ client: publicClient, account: simpleAccount, bundlerTransport: http("http://localhost:4337"), userOperation: { estimateFeesPerGas: async () => (await pimlicoClient.getUserOperationGasPrice()).fast } }) The handles UserOp construction, nonce management, gas estimation, and signing. The የ callback አጠቃቀም አጠቃቀም አጠቃቀም አጠቃቀም አጠቃቀም. smartAccountClient estimateFeesPerGas Step 5: Send a UserOperation const hash = await smartAccountClient.sendUserOperation({ calls: [{ to: "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720", value: parseEther("0.01"), data: "0x" }] }) const receipt = await smartAccountClient.waitForUserOperationReceipt({ hash }) console.log("Success:", receipt.success) For the first UserOp, the SDK automatically includes እና fields. The EntryPoint deploys the account, then executes the transfer—all in one transaction. factory factoryData አግኝቷል ነገር Bundlers are the execution layer of ERC-4337. They are what turns Account Abstraction from a specification into a production-ready mechanism. Understanding their constraints — validation rules, gas economics, and reputation mechanics — is critical when designing reliable smart accounts. Mistakes here don’t surface in Solidity code, but in mempool behavior, simulations, and execution economics. ERC-4337 በፕሮቶኮል እና በፕሮቶኮል መዋቅር ውስጥ ከባድነት ይቀላቀሉ. የፕሮቶኮች ከባድነት ከባድነት ከባድነት ከባድነት ከባድነት ከባድነት ከባድነት ከባድነት ይጀምራል.