Skip to main content

Errors & troubleshooting

An operation can be refused at three layers. The layer tells you who said no:

A refusal at any of these happens before the operation is included, so it costs no gas. An operation that is included but whose calls revert is not an error: sendCalls returns success: false with the transaction hash.

Paymaster (policy)​

Returned from the pm_* calls as a JSON-RPC error with data.reason. Read it with paymasterReason(e) from @hpp-io/aa-sdk (the SDK also throws HppPaymasterError, whose .reason is the same value). The SDK retries the first three by itself.

reasonMeaningFix
free_exhaustedAnother operation took the last free slotRetried automatically (now charged in USDC.e)
fee_quote_staleThe exchange rate moved more than 3% since the quoteRetried automatically
fee_allowance_missingGas was re-estimated above the approved amountRetried automatically
fee_balance_insufficientNot enough USDC.e for the fee — also when the operation itself spends the USDC.e the fee needsTop up, or send less
would_revertSimulation shows the calls would failFix the call (recipient, amount, permissions)
anchor_budget_exceededThis user's monthly budget under the policy is used upWait for next month, or retry without the paymaster
anchor_daily_count_exceededThis user's daily number of sponsored operations is used upWait until tomorrow, or retry without the paymaster
budget_exceeded / count_exceededThe policy's overall budget or operation count is used upRetry without the paymaster; ask us to review the limits
revoke_daily_count_exceededToo many sponsored revokes by this user todayWait until tomorrow, or revoke without the paymaster
op_cost_exceededThis single operation costs more than the policy allows per operationSplit it into smaller operations
policy_requiredNo policyId was sentPass paymaster: { policyId, anchorId }
policy_not_found / policy_inactive / policy_not_started / policy_ended / policy_archivedUnknown policy, switched off, before its start, or after its endCheck the ID and dates
anchor_required / anchor_unknown / anchor_not_entitledMissing anchor, an anchor not registered, or not allowed under this policyCheck the anchor your backend sends
action_not_allowed / calldata_unrecognizedThe policy only sponsors certain contracts or functions, and this call is not one of them (or could not be decoded)Check what your policy covers
sender_blocked / anchor_blockedToo many failed operations from this account or userOpen an issue (see Help)
token_mode_unavailable / fee_token_not_allowed / fee_token_unconfigured / fee_price_unavailableGas in USDC.e cannot be offered right now, or the token is not acceptedRetry later; check the token
gas_missingThe request did not include gas limitsLet the SDK estimate gas first

Bundler​

Code / reasonMessageMeaningFix
unsupported_paymaster—The operation names a paymaster other than HPP'sOn HPP, sponsorship goes through HPP's paymaster only
unsupported_factory—The account factory is not on HPP's allowlist (Kernel, SimpleAccount v0.7/v0.8, EIP-7702)Use a supported account type
-32602already knownThe same operation is already queuedWait for it
-32505Max operations (4) reached for accountMore than 4 operations from one account in flightWait, or batch calls into one operation
—unsupported entryPointSponsorship was requested for an EntryPoint other than v0.7Use EntryPoint v0.7 (the SDK default)
-32500AA…The EntryPoint rejected it in simulationSee the AA codes below
HTTP 429—Per-IP rate limit on the public endpointBack off and retry

EntryPoint (AA codes)​

CodeMeaningUsual cause on HPP
AA21 didn't pay prefundThe account has to pay gas but cannotNo paymaster and no ETH in the account
AA22 expired or not dueOutside the account's valid time windowRe-sign
AA23 reverted / AA24 signature errorThe account rejected the operationWrong owner key; a 7702 account signed without the EIP-191 prefix; or a session outside its rules (over the limit, wrong contract, revoked, expired)
AA25 invalid account nonceNonce reused, or the previous operation is not mined yetSend one operation at a time per account
AA31 paymaster deposit too lowThe paymaster's deposit cannot cover this operationTemporary on HPP's side — retry later, or send without the paymaster
AA32 paymaster expired or not dueThe paymaster approval expired (5 minutes)Request a new approval and send right away
AA33 reverted / AA34 signature errorThe paymaster approval does not match the operationA field was changed after the paymaster approved it — request a new approval
AA40 / AA41Verification gas limit too low or too highLet the SDK estimate, or re-estimate

Troubleshooting​

SymptomLikely causeFix
Every request fails, or the account address looks wrongBundler URL and chain point at different networksUse aa.hpp.io/rpc with hppMainnet, aa-sepolia.hpp.io/rpc with hppSepolia (chain defaults to Sepolia if omitted)
AA34 right after you edit the operationAny field changed after the paymaster approval invalidates itBuild the operation, get the approval, sign — in that order, without edits
Operation accepted, then never minedUnder-priced; dropped from the pool after 300 sUse rundler_getUserOperationGasPrice; keep a preVerificationGas buffer (the SDK does both)
The 7702 setup transaction succeeded but the account is still a plain EOAAn SDK older than 0.3.2 used the wrong authorization nonce when the account sent its own setupUpgrade @hpp-io/aa-sdk and run ensureReady again
embedded owner: signTypedData not providedSigning an x402 payment or a delegation needs typed-data signingPass signTypedData to toEmbeddedOwner
A token (USDC.e) rejects a signature from a delegated accountTokens call isValidSignature on accounts with codeSign through the account (user.account.signTypedData), not the raw owner key
A factory-mode account fails on its first operationDeploying inside the first operation is not supported on HPPCall ensureReady first — it deploys with a normal transaction
An agent's payments stoppedLimit used up, permission expired, or revokedIssue a new permission

Help​

  • Developers: open an issue on hpp-io/hpp-aa-sdk with the network, your account address, and the userOpHash or error message. Never post private keys, anchors, or policy IDs.
  • Wallet users: ask in HPP Telegram.