Skandha
A modular typescript implementation of ERC4337 (Account Abstraction) bundler client.
Install / Use
/learn @etherspot/SkandhaREADME
[!IMPORTANT] Skandha v1 - supports EntryPoint 0.6.0 and can be found on releases/v0.6
Skandha v2 - supports EntryPoint 0.7.0 and can be found on releases/v0.7
Skandha v3 - supports EntryPoint 0.8.0 and can be found on master
Important links
Install Skandha | Chains supported | UserOp Fee history
⚙️ How to run (from Source code)
Run with one-liner:
curl -fsSL https://skandha.run | bash
Or follow the steps below:
- install all dependencies by running
bun install - patch for bcrypto
cd ./node_modules/bcrypto && bun install - build
bun build cp config.json.default config.json- edit
config.json - (optional) run local geth-node from
test/geth-dev - run
./skandha standalone - The bundler will be available on
http://localhost:14337/rpc/
🐳 How to run (a Docker image)
cp config.json.default config.json- edit
config.json docker build -t etherspot/skandha .docker run --mount type=bind,source="$(pwd)"/config.json,target=/usr/app/config.json,readonly -dp 14337:14337 etherspot/skandha standalone
📜 Additional features
- [x] Unsafe mode - bypass opcode & stake validation
- [x] Redirect RPC - Redirect ETH rpc calls to the underlying execution client. This is needed if you use UserOp.js
⚡️ CLI Options
--unsafeMode- enables unsafeMode--redirectRpc- enables redirecting eth rpc calls--executor.bundlingMode manual|auto- sets bundling mode tomanualorautoon start. Default value isauto--metrics.enable false|true- enable Prometheus metrics (default -false)--metrics.host- metrics host (default -127.0.0.1)--metrics.port- metrics port (default -8008)
🔑 Relayer Configuration
Simplest config.json
{
"entryPoints": [
"0x0000000071727De22E5E9d8BAf0edAc6f37da032"
],
"relayers": [
"0x{RELAYER-PRIVATE-KEY}"
],
"rpcEndpoint": "https://polygon-mumbai.blockpi.network/v1/rpc/public"
}
config.json with a default value of each config parameter
{
"entryPoints": [ # supported entry points
"0x0000000071727De22E5E9d8BAf0edAc6f37da032"
],
"relayers": [
"0x0101010101010101010101010101010101010101010101010101010101010101",
"test test test test test test test test test test test junk"
], # relayers private keys, can access from here or via environment variables (SKANDHA_MUMBAI_RELAYERS | SKANDHA_DEV_RELAYERS | etc.)
"beneficiary": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", # optional, fee collector, avaiable via env var (SKANDHA_MUMBAI_BENEFICIARY | etc) - if not set, relayer will be used
"rpcEndpoint": "http://localhost:8545", # rpc provider, also available via env variable (SKANDHA_MUMBAI_RPC | etc)
"minInclusionDenominator": 10, # optional, see EIP-4337
"throttlingSlack": 10, # optional, see EIP-4337
"banSlack": 50 # optional, see EIP-4337
"minStake": 10000000000, # optional, min stake of an entity (in wei)
"minUnstakeDelay": 0, # optional, min unstake delay of an entity
"minSignerBalance": 1, # optional, default is 0.1 ETH. If the relayer's balance drops lower than this, it will be selected as a fee collector
"multicall": "0xcA11bde05977b3631167028862bE2a173976CA11", # optional, multicall3 contract (see https://github.com/mds1/multicall#multicall3-contract-addresses)
"estimationStaticBuffer": 21000, # optional,adds certain amount of gas to callGasLimit on estimation
"validationGasLimit": 10e6, # optional,gas limit during simulateHandleOps and simulateValidation calls
"receiptLookupRange": 1024, # optional,limits the block range of getUserOperationByHash and getUserOperationReceipt
"etherscanApiKey": "", # optional,etherscan api is used to fetch gas prices
"conditionalTransactions": false, # optional,enable conditional transactions
"rpcEndpointSubmit": "", # optional,rpc endpoint that is used only during submission of a bundle
"gasPriceMarkup": 0, # optional,adds % markup on reported gas price via skandha_getGasPrice, 10000 = 100.00%, 500 = 5%
"enforceGasPrice": false, # optional,do not bundle userops with low gas prices
"enforceGasPriceThreshold": 1000, # optional,gas price threshold in bps. If set to 500, userops' gas price is allowed to be 5% lower than the network's gas price
"eip2930": false, # optional, enables eip-2930
"useropsTTL": 300, # optional, Userops time to live (in seconds)
"whitelistedEntities": { # optional, Entities that bypass stake and opcode validation (array of addresses)
"factory": [],
"paymaster": [],
"account": []
},
"bundleGasLimitMarkup": 25000, # optional, adds some amount of additional gas to a bundle tx
"relayingMode": "classic"; # optional, "flashbots" for Flashbots Builder API, "merkle" for Merkle.io
"bundleInterval": 10000, # bundle creation interval
"bundleSize": 4, # optional, max size of a bundle, 4 userops by default
"pvgMarkup": 0 # optional, adds some gas on top of estimated PVG
}
💬 Contact
If you have any questions or feedback about the ERC-4337 Bundler project, please feel free to reach out to us.
📄 License
Licensed under the MIT License.
🤝 Shared Mempool (P2P)
[!WARNING]
This version of the bundler only supports Entry Point v7, which does not have the p2p mempool yet.
🔢 Statistics
🙏 Acknowledgements
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Writing Hookify Rules
90.0kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
review-duplication
99.7kUse this skill during code reviews to proactively investigate the codebase for duplicated functionality, reinvented wheels, or failure to reuse existing project best practices and shared utilities.
