Skip to main content

Reference

Endpoints​

HPP MainnetHPP Sepolia
Chain ID190415181228
Chain RPChttps://mainnet.hpp.iohttps://sepolia.hpp.io
Bundler + paymasterhttps://aa.hpp.io/rpchttps://aa-sepolia.hpp.io/rpc
Walletaa.hpp.ioaa-sepolia.hpp.io
Block explorerexplorer.hpp.iosepolia-explorer.hpp.io

The bundler endpoint serves the standard ERC-4337 methods (eth_sendUserOperation, eth_estimateUserOperationGas, …), rundler_*, and the ERC-7677 paymaster methods (pm_*). Pass the URL as bundlerUrl to the SDK.

What the endpoint accepts:

  • Paymasters: HPP's two paymasters only (unsupported_paymaster otherwise). Operations without a paymaster are accepted.
  • Accounts: Kernel, SimpleAccount (v0.7 / v0.8), and EIP-7702 accounts (unsupported_factory otherwise).
  • EntryPoint: v0.7 and v0.8; sponsorship is v0.7 only.
  • Rate-limited per IP (HTTP 429). debug_* methods are not exposed.

Contracts​

The account and module contracts are at the same addresses on both networks (and on other chains), so permissionless and @rhinestone/module-sdk defaults match.

ContractAddressRole
EntryPoint v0.70x0000000071727De22E5E9d8BAf0edAc6f37da032Used by Kernel — SDK default
EntryPoint v0.80x4337084D9E255Ff0702461CF8895CE9E3b5Ff108For Simple7702Account
Kernel v3.30xd6CEDDe84be40893d153Be9d467CD6aD37875b28Account logic; EIP-7702 delegation target
KernelFactory0x2577507b78c2008Ff367261CB6285d44ba5eF2E9Factory-mode accounts (browser wallets)
ECDSAValidator0x845ADb2C711129d4f3966735eD98a9F09fC4cE57Root signer of factory accounts
Smart Sessions0x00000000008bDABA73cD9815d79069c247Eb4bDASession validator
OwnableValidator0x000000000013fdB5234E4E3162a810F54d9f7E98Session signer check
USDC.e0x401eCb1D350407f13ba348573E5630B83638E30DTOKENS[chainId].USDCe

These differ per network:

ContractHPP MainnetHPP Sepolia
VerifyingPaymaster (free gas)0xAC177f9d80E2c2feA17A44Cca9c3c76235C303450x686f803a2c8C7f7e88e5E6ABFEDc1DbEA1e2b5bC
SingletonPaymasterV7 (gas in USDC.e)0xa56ee8524BCf81397bA29f069Bfc695a3E703B970xb4c0E1b0498A35330fd1DE0C85977A6721638db4
ERC-7710 DelegationManager0xEf6d2D01af8e6313f9D544DC2AaC6a438590c2A90x20248e5193B1Ef08298812AdA31F4B0D75e99652

The ERC-7710 enforcer addresses are listed in the facilitator's /supported response.

SDK (@hpp-io/aa-sdk)​

ExportPurpose
createHppAccount({ owner, chain, bundlerUrl, paymaster?, mode? })A user's account. owner is a viem LocalAccount or WalletClient
account.ensureReady({ sponsor? })One-time setup: EIP-7702 delegation or factory deployment
account.sendCalls(calls)One atomic UserOperation → { success, txHash, userOpHash, receipt, fee }
account.quoteFee(calls)Upper bound of the fee before signing
account.grantPaymentDelegation(…) / revokePaymentDelegation(…)ERC-7710 payment delegations
account.grantSession(…) / revokeSession(id) / sessionUsage(id)Sessions
createHppSessionClient({ account, permissionId, signer, chain, bundlerUrl, paymaster? })Agent side of a session
buildPaymentRedelegation / signPaymentRedelegationAgent side of a payment delegation
toEmbeddedOwner({ address, signMessage, signAuthorization? })Wrap an embedded-wallet signer (Privy, Dynamic, …)
feeApproveAction(…)Session action that lets an agent's operations pay gas in USDC.e
paymasterReason(e) / HppPaymasterErrorRead the paymaster's refusal reason from an error
account.ensureFeeAllowance({ amount, calls })Pre-approve a fixed USDC.e amount for gas instead of the automatic per-operation approve
erc7710Environment(chainId)HPP's ERC-7710 contract addresses, for @metamask/smart-accounts-kit
hppMainnet, hppSepolia, TOKENS, ADDRESSESConstants. chain defaults to hppSepolia if omitted

Requires Node.js 20+, ESM, and viem 2.56+. Source and issues: github.com/hpp-io/hpp-aa-sdk.

Limits​

Current values — they may change.

LimitValue
Parallel nonce lanes per account4
Operations per bundle32
Mempool time-to-live300 s — an under-priced operation is dropped after this
Paymaster signature validity300 s by default
Public endpointPer-IP rate limit (HTTP 429)

Rejection reasons​

All errors with fixes, grouped by layer: Errors & troubleshooting. The most common bundler messages:

CodeMessageMeaning
-32500AA25 invalid account nonceNonce reused, or the previous operation is not mined yet
-32500AA23 reverted / validateUserOp … revertedThe account rejected it — for a session: over the limit, wrong contract, revoked, or expired
-32500AA21 didn't pay prefundNo sponsorship and not enough ETH in the account
-32505Max operations (4) reached for accountMore than 4 lanes in flight
-32602already knownThe same operation is already queued

If you bypass the SDK​

Things you need to know when you talk to the endpoint with raw viem or permissionless:

  1. Fees: use rundler_getUserOperationGasPrice. Generic estimators over-price — the priority fee on HPP is 0.
  2. preVerificationGas is mostly L1 data cost (roughly 2.5k gas per calldata byte). Add a buffer, or the operation sits in the mempool and is dropped.
  3. EIP-7702: land the delegation as a separate type-4 transaction. The bundler rejects viem's 2-byte factory: "0x7702" marker. When the account sends its own type-4 transaction, the authorization nonce is the account nonce + 1.
  4. 7702 root signature: Kernel verifies an EIP-191-prefixed userOpHash against address(this).
  5. Installing a validator on Kernel: initData = hook (20 bytes, sentinel 0x…01) ‖ abi.encode(validatorData, hookData, selectorData) with selectorData = 0xe9ae5c53. Selectors cannot be added later.
  6. Session nonce key: [mode 1B][type 1B = 0x01][validator 20B][lane 2B]. @rhinestone/module-sdk's encodeValidatorNonce emits type 0x00 (the root key) — build it yourself.
  7. Factory accounts: deploying inside the first UserOperation (initCode) is rejected because KernelFactory is not staked. Deploy with a normal transaction first.
  8. Signing EIP-712 payloads (x402, Permit): a delegated account has code, so tokens call isValidSignature. Sign through the account (Kernel-wrapped hash), not with the raw owner key.