From d44b0a706154f3697a36098ec8976a9253c481dd Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Thu, 26 Jun 2025 14:23:57 +0100 Subject: [PATCH 1/6] Add agents md & size comparison --- .gitignore | 3 +- .size-limit.json | 178 ++++++++++- agents.md | 290 ++++++++++++++++++ biome.json | 3 +- packages/mock-paymaster/agents.md | 135 ++++++++ packages/permissionless-test/agents.md | 217 +++++++++++++ packages/permissionless/agents.md | 224 ++++++++++++++ .../size-tests/biconomy-with-client.js | 3 + .../size-tests/biconomy-with-pimlico.js | 2 + .../size-tests/etherspot-with-client.js | 3 + .../size-tests/etherspot-with-pimlico.js | 2 + .../size-tests/kernel-with-client.js | 3 + .../size-tests/kernel-with-pimlico.js | 2 + .../size-tests/light-with-client.js | 3 + .../size-tests/light-with-pimlico.js | 2 + .../size-tests/nexus-with-client.js | 3 + .../size-tests/nexus-with-pimlico.js | 2 + .../size-tests/safe-with-client.js | 3 + .../size-tests/safe-with-pimlico.js | 2 + .../size-tests/simple-with-client.js | 3 + .../size-tests/simple-with-pimlico.js | 2 + .../size-tests/thirdweb-with-client.js | 3 + .../size-tests/thirdweb-with-pimlico.js | 2 + .../size-tests/trust-with-client.js | 3 + .../size-tests/trust-with-pimlico.js | 2 + packages/wagmi-demo/agents.md | 172 +++++++++++ packages/wagmi/agents.md | 162 ++++++++++ 27 files changed, 1425 insertions(+), 4 deletions(-) create mode 100644 agents.md create mode 100644 packages/mock-paymaster/agents.md create mode 100644 packages/permissionless-test/agents.md create mode 100644 packages/permissionless/agents.md create mode 100644 packages/permissionless/size-tests/biconomy-with-client.js create mode 100644 packages/permissionless/size-tests/biconomy-with-pimlico.js create mode 100644 packages/permissionless/size-tests/etherspot-with-client.js create mode 100644 packages/permissionless/size-tests/etherspot-with-pimlico.js create mode 100644 packages/permissionless/size-tests/kernel-with-client.js create mode 100644 packages/permissionless/size-tests/kernel-with-pimlico.js create mode 100644 packages/permissionless/size-tests/light-with-client.js create mode 100644 packages/permissionless/size-tests/light-with-pimlico.js create mode 100644 packages/permissionless/size-tests/nexus-with-client.js create mode 100644 packages/permissionless/size-tests/nexus-with-pimlico.js create mode 100644 packages/permissionless/size-tests/safe-with-client.js create mode 100644 packages/permissionless/size-tests/safe-with-pimlico.js create mode 100644 packages/permissionless/size-tests/simple-with-client.js create mode 100644 packages/permissionless/size-tests/simple-with-pimlico.js create mode 100644 packages/permissionless/size-tests/thirdweb-with-client.js create mode 100644 packages/permissionless/size-tests/thirdweb-with-pimlico.js create mode 100644 packages/permissionless/size-tests/trust-with-client.js create mode 100644 packages/permissionless/size-tests/trust-with-pimlico.js create mode 100644 packages/wagmi-demo/agents.md create mode 100644 packages/wagmi/agents.md diff --git a/.gitignore b/.gitignore index 292b1a48..4fd1f90f 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ temp.ts .env.test.local .env.production.local .envrc -.vscode \ No newline at end of file +.vscode +*trace-output* \ No newline at end of file diff --git a/.size-limit.json b/.size-limit.json index 10bce3c0..ec667c03 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -2,12 +2,186 @@ { "name": "permissionless (esm)", "path": "./packages/permissionless/_esm/index.js", - "limit": "60 kB", + "limit": "63 kB", "import": "*" }, { "name": "permissionless (cjs)", "path": "./packages/permissionless/_cjs/index.js", - "limit": "280 kB" + "limit": "324 kB" + }, + { + "name": "Pimlico Client", + "path": "./packages/permissionless/_esm/clients/pimlico.js", + "limit": "26 kB", + "import": "{ createPimlicoClient }" + }, + { + "name": "Smart Account Client", + "path": "./packages/permissionless/_esm/clients/createSmartAccountClient.js", + "limit": "27 kB", + "import": "{ createSmartAccountClient }" + }, + { + "name": "Simple Account", + "path": "./packages/permissionless/_esm/accounts/simple/toSimpleSmartAccount.js", + "limit": "71 kB", + "import": "{ toSimpleSmartAccount }" + }, + { + "name": "Simple Account + Pimlico", + "path": "./packages/permissionless/size-tests/simple-with-pimlico.js", + "limit": "79 kB", + "import": "*" + }, + { + "name": "Simple Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/simple-with-client.js", + "limit": "80 kB", + "import": "*" + }, + { + "name": "Light Account", + "path": "./packages/permissionless/_esm/accounts/light/toLightSmartAccount.js", + "limit": "69 kB", + "import": "{ toLightSmartAccount }" + }, + { + "name": "Light Account + Pimlico", + "path": "./packages/permissionless/size-tests/light-with-pimlico.js", + "limit": "77 kB", + "import": "*" + }, + { + "name": "Light Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/light-with-client.js", + "limit": "78 kB", + "import": "*" + }, + { + "name": "Safe Account", + "path": "./packages/permissionless/_esm/accounts/safe/toSafeSmartAccount.js", + "limit": "73 kB", + "import": "{ toSafeSmartAccount }" + }, + { + "name": "Safe Account + Pimlico", + "path": "./packages/permissionless/size-tests/safe-with-pimlico.js", + "limit": "81 kB", + "import": "*" + }, + { + "name": "Safe Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/safe-with-client.js", + "limit": "82 kB", + "import": "*" + }, + { + "name": "Kernel Account", + "path": "./packages/permissionless/_esm/accounts/kernel/toKernelSmartAccount.js", + "limit": "96 kB", + "import": "{ toKernelSmartAccount }" + }, + { + "name": "Kernel Account + Pimlico", + "path": "./packages/permissionless/size-tests/kernel-with-pimlico.js", + "limit": "104 kB", + "import": "*" + }, + { + "name": "Kernel Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/kernel-with-client.js", + "limit": "105 kB", + "import": "*" + }, + { + "name": "Biconomy Account", + "path": "./packages/permissionless/_esm/accounts/biconomy/toBiconomySmartAccount.js", + "limit": "70 kB", + "import": "{ toBiconomySmartAccount }" + }, + { + "name": "Biconomy Account + Pimlico", + "path": "./packages/permissionless/size-tests/biconomy-with-pimlico.js", + "limit": "78 kB", + "import": "*" + }, + { + "name": "Biconomy Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/biconomy-with-client.js", + "limit": "79 kB", + "import": "*" + }, + { + "name": "Trust Account", + "path": "./packages/permissionless/_esm/accounts/trust/toTrustSmartAccount.js", + "limit": "69 kB", + "import": "{ toTrustSmartAccount }" + }, + { + "name": "Trust Account + Pimlico", + "path": "./packages/permissionless/size-tests/trust-with-pimlico.js", + "limit": "77 kB", + "import": "*" + }, + { + "name": "Trust Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/trust-with-client.js", + "limit": "78 kB", + "import": "*" + }, + { + "name": "Etherspot Account", + "path": "./packages/permissionless/_esm/accounts/etherspot/toEtherspotSmartAccount.js", + "limit": "70 kB", + "import": "{ toEtherspotSmartAccount }" + }, + { + "name": "Etherspot Account + Pimlico", + "path": "./packages/permissionless/size-tests/etherspot-with-pimlico.js", + "limit": "78 kB", + "import": "*" + }, + { + "name": "Etherspot Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/etherspot-with-client.js", + "limit": "79 kB", + "import": "*" + }, + { + "name": "Nexus Account", + "path": "./packages/permissionless/_esm/accounts/nexus/toNexusSmartAccount.js", + "limit": "69 kB", + "import": "{ toNexusSmartAccount }" + }, + { + "name": "Nexus Account + Pimlico", + "path": "./packages/permissionless/size-tests/nexus-with-pimlico.js", + "limit": "77 kB", + "import": "*" + }, + { + "name": "Nexus Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/nexus-with-client.js", + "limit": "78 kB", + "import": "*" + }, + { + "name": "Thirdweb Account", + "path": "./packages/permissionless/_esm/accounts/thirdweb/toThirdwebSmartAccount.js", + "limit": "68 kB", + "import": "{ toThirdwebSmartAccount }" + }, + { + "name": "Thirdweb Account + Pimlico", + "path": "./packages/permissionless/size-tests/thirdweb-with-pimlico.js", + "limit": "76 kB", + "import": "*" + }, + { + "name": "Thirdweb Account + Client + Pimlico", + "path": "./packages/permissionless/size-tests/thirdweb-with-client.js", + "limit": "77 kB", + "import": "*" } ] diff --git a/agents.md b/agents.md new file mode 100644 index 00000000..1c1d57f7 --- /dev/null +++ b/agents.md @@ -0,0 +1,290 @@ +# Permissionless.js Monorepo Codebase Analysis + +## Overview + +Permissionless.js is a comprehensive TypeScript monorepo for building with ERC-4337 (Account Abstraction). It provides a complete ecosystem of packages for creating and managing smart accounts, integrating with React applications, and testing account abstraction features locally. + +## Monorepo Structure + +### Package Organization + +``` +permissionless.js/ +├── packages/ +│ ├── permissionless/ # Core ERC-4337 library +│ ├── permissionless-test/ # Internal testing utilities +│ ├── wagmi/ # React hooks for Wagmi integration +│ ├── wagmi-demo/ # Demo application +│ └── mock-paymaster/ # Local testing utilities +├── tsconfig/ # Shared TypeScript configurations +├── .changeset/ # Version management +└── [root config files] # Monorepo configuration +``` + +### Package Relationships + +```mermaid +graph TD + A[permissionless] --> B[@permissionless/wagmi] + A --> C[wagmi-demo] + D[@pimlico/mock-paymaster] --> C + B --> C + E[permissionless-test] --> A + E --> D +``` + +## Technology Stack + +### Core Technologies + +- **TypeScript**: Strict mode across all packages +- **Bun**: Package manager and workspace management +- **Viem**: Core Ethereum library +- **React**: For UI packages (wagmi, wagmi-demo) +- **Vitest**: Testing framework +- **Biome**: Code formatting and linting + +### Build System + +- **Workspace-based builds**: Each package builds independently +- **Multiple output formats**: CJS, ESM, and TypeScript declarations +- **tsc-alias**: Path alias resolution +- **Size-limit**: Bundle size monitoring + +## Package Descriptions + +### 1. permissionless (Core Library) + +The foundational package providing: +- Smart account implementations (Safe, Kernel, Biconomy, etc.) +- ERC-4337 actions and utilities +- Bundler and paymaster integrations +- Type-safe abstractions over account abstraction + +**Key Features:** +- 10+ smart account implementations +- Modular action system +- Comprehensive type safety +- Entry point v0.6 and v0.7 support + +### 2. @permissionless/wagmi + +React integration layer: +- Enhanced Wagmi hooks for ERC-4337 +- Context providers for configuration +- Seamless smart account support +- Maintains Wagmi's developer experience + +**Key Features:** +- Drop-in Wagmi enhancement +- Transaction sending with smart accounts +- Capability detection +- Observable state management + +### 3. wagmi-demo + +Demonstration application: +- Live examples of all features +- Passkey authentication demos +- Best practice implementations +- Educational resource + +**Key Features:** +- Interactive demos +- Real-world usage patterns +- Error handling examples +- UI/UX best practices + +### 4. @pimlico/mock-paymaster + +Local testing infrastructure: +- Mock paymaster server +- Prool integration +- ERC20 token deployment +- Development environment setup + +**Key Features:** +- Zero-config local testing +- Fastify-based RPC server +- Contract deployment utilities +- CORS-enabled endpoints + +### 5. permissionless-test (Internal) + +Testing utilities package: +- Complete ERC-4337 test infrastructure +- Smart account factory functions +- RPC test fixtures for Vitest +- Mock AA infrastructure setup + +**Key Features:** +- Automated test environment setup +- Support for all account types +- Dynamic port allocation +- Fork mode support + +## Development Workflow + +### Monorepo Management + +```bash +# Install dependencies +bun install + +# Build all packages +bun run build + +# Run tests +bun test + +# Start development +bun dev +``` + +### Package Scripts + +Each package has standard scripts: +- `build`: Compile TypeScript to multiple formats +- `test`: Run package tests +- `dev`: Start development mode +- `lint`: Check code quality + +### Version Management + +Uses Changesets for coordinated releases: +1. Create changeset for changes +2. Version packages together +3. Publish to npm registry +4. Maintain changelog + +## Coding Standards + +### Consistent Patterns Across Packages + +1. **No Comments Policy**: Self-documenting code +2. **Type Safety**: Strict TypeScript everywhere +3. **Async/Await**: Preferred over promises +4. **Early Returns**: For error conditions +5. **Const by Default**: Immutable values + +### Import/Export Conventions + +- Index files for clean exports +- Type imports using `type` keyword +- `.js` extensions for ESM compatibility +- Workspace dependencies for internal packages + +### Testing Strategy + +- Unit tests with Vitest +- Integration tests with local chains +- Coverage reporting with V8 +- Concurrent test execution where possible + +## Architecture Principles + +### 1. Modularity + +Each package serves a specific purpose: +- Core functionality separated from integrations +- UI components isolated from business logic +- Testing utilities independent of main code + +### 2. Type Safety + +Comprehensive TypeScript usage: +- Strict mode enabled +- Generic types for flexibility +- Conditional types for version compatibility +- No `any` types + +### 3. Developer Experience + +Focus on ease of use: +- Intuitive APIs +- Comprehensive examples +- Clear error messages +- Minimal configuration + +### 4. Extensibility + +Easy to extend and customize: +- Plugin architecture for accounts +- Composable actions +- Override capabilities +- Custom implementations + +## Build Configuration + +### TypeScript Setup + +Shared base configuration with package-specific overrides: +- Target: ES2021 for Node 16+ compatibility +- Lib: ES2022 + DOM for modern features +- Module: ESNext for tree-shaking +- Strict checks enabled + +### Output Formats + +Each package builds to: +1. **CommonJS** (`_cjs/`): Node.js compatibility +2. **ESM** (`_esm/`): Modern bundlers +3. **Types** (`_types/`): TypeScript support + +## Quality Assurance + +### Code Quality Tools + +- **Biome**: Fast formatting and linting +- **TypeScript**: Type checking +- **Size-limit**: Bundle size monitoring +- **Changesets**: Version management + +### Testing Infrastructure + +- **Vitest**: Test runner +- **Prool**: Local blockchain testing +- **Coverage**: V8 coverage reports +- **Integration tests**: Real chain interactions + +## Contributing Guidelines + +### Adding New Features + +1. Determine appropriate package +2. Follow existing patterns +3. Add comprehensive tests +4. Update types and exports +5. Create changeset + +### Package Development + +1. Use workspace dependencies +2. Maintain package independence +3. Follow naming conventions +4. Document in agents.md +5. Add to monorepo scripts + +### Code Review Focus + +- Type safety +- API consistency +- Test coverage +- Bundle size impact +- Breaking changes + +## Future Architecture Considerations + +### Scalability + +- Additional smart account types +- New chain integrations +- Enhanced testing tools +- Performance optimizations + +### Maintainability + +- Clear separation of concerns +- Consistent coding patterns +- Comprehensive documentation +- Automated quality checks \ No newline at end of file diff --git a/biome.json b/biome.json index 4fb1dc7f..8e8fb400 100644 --- a/biome.json +++ b/biome.json @@ -12,7 +12,8 @@ "_esm", "_types", "bun.lockb", - "temp.ts" + "temp.ts", + "packages/permissionless/trace-output" ] }, "organizeImports": { diff --git a/packages/mock-paymaster/agents.md b/packages/mock-paymaster/agents.md new file mode 100644 index 00000000..52686d15 --- /dev/null +++ b/packages/mock-paymaster/agents.md @@ -0,0 +1,135 @@ +# Mock Paymaster Codebase Analysis + +## Overview + +Mock Paymaster is a testing utility that creates a local paymaster instance for ERC-4337 development. It provides a mock paymaster server that can be used with Prool for local testing of account abstraction features without needing external paymaster services. + +## Project Structure + +### Directory Organization + +``` +packages/mock-paymaster/ +├── helpers/ # Utility functions +│ ├── abi.ts # Contract ABIs +│ ├── erc20-utils.ts # ERC20 token deployment utilities +│ ├── schema.ts # Zod schemas for validation +│ └── utils.ts # General utilities +├── constants.ts # Contract addresses and constants +├── index.ts # Main entry point with Prool instance +├── relay.ts # RPC handler implementation +└── singletonPaymasters.ts # Paymaster deployment logic +``` + +## Technology Stack + +### Core Dependencies + +- **prool** (^0.0.23): Local blockchain testing framework +- **viem** (^2.28.1): Ethereum library for type-safe interactions +- **fastify** (^4.28.1): Web framework for RPC server +- **@fastify/cors** (^8.5.0): CORS support for cross-origin requests +- **zod** (^3.24.2): Schema validation + +### Build Tools + +- **TypeScript**: Strict mode with comprehensive type checking +- **Bun**: Package manager and build tool +- **tsc**: TypeScript compiler for CJS/ESM/types builds + +## Coding Patterns and Conventions + +### 1. Prool Instance Pattern + +The package exports a Prool instance definition: + +```typescript +export const paymaster = defineInstance( + ({ anvilRpc, port, altoRpc }: { anvilRpc: string; port: number; altoRpc: string }) => { + // Instance configuration + } +) +``` + +### 2. RPC Handler Pattern + +Implements JSON-RPC methods for paymaster operations: + +```typescript +const rpcHandler = createRpcHandler({ + bundler, + publicClient, + paymasterSigner: walletClient +}) +``` + +### 3. Schema Validation + +Uses Zod for request/response validation: + +```typescript +const schema = z.object({ + // Schema definition +}) +``` + +### 4. Deployment Utilities + +Provides functions to deploy test contracts: + +- `deployPaymasters()`: Deploys paymaster contracts +- `deployErc20Token()`: Deploys test ERC20 tokens + +### 5. Code Style + +- **No comments** unless absolutely necessary +- Descriptive function and variable names +- Early returns for error conditions +- Async/await over promises +- Const for immutable values + +## Architecture + +### Server Architecture + +1. **Fastify Server**: Handles HTTP requests +2. **RPC Handler**: Processes JSON-RPC calls +3. **Contract Deployment**: Sets up test environment +4. **CORS Support**: Enables cross-origin requests + +### Integration Points + +- **Anvil**: Local Ethereum node +- **Alto**: Bundler for user operations +- **Viem**: Blockchain interactions + +## Key Design Principles + +1. **Simplicity**: Minimal setup for testing +2. **Type Safety**: Full TypeScript support +3. **Local Testing**: No external dependencies +4. **Compatibility**: Works with standard ERC-4337 tools + +## Development Workflow + +### Starting the Mock Paymaster + +1. Configure Anvil RPC endpoint +2. Configure Alto bundler endpoint +3. Start the instance with port configuration +4. Server deploys necessary contracts +5. Ready to handle paymaster requests + +### Adding New Features + +1. Update RPC handler for new methods +2. Add schema validation if needed +3. Implement business logic +4. Update types and exports + +### Testing Guidelines + +- Test with local Anvil instance +- Verify contract deployments +- Test RPC method responses +- Ensure proper error handling \ No newline at end of file diff --git a/packages/permissionless-test/agents.md b/packages/permissionless-test/agents.md new file mode 100644 index 00000000..ce03c84f --- /dev/null +++ b/packages/permissionless-test/agents.md @@ -0,0 +1,217 @@ +# Permissionless Test Utilities Codebase Analysis + +## Overview + +Permissionless-test is an internal testing utilities package that provides comprehensive test infrastructure for the Permissionless.js ecosystem. It includes mock account abstraction infrastructure, test helpers, and utilities for setting up local testing environments with all necessary ERC-4337 components. + +## Project Structure + +### Directory Organization + +``` +packages/permissionless-test/ +├── mock-aa-infra/ # Mock infrastructure setup +│ └── alto/ # Alto bundler configuration +│ ├── constants/ # Account-specific constants +│ │ ├── accounts/ # Constants for each account type +│ │ └── core.ts # Core infrastructure constants +│ ├── index.ts # Infrastructure setup +│ └── instance.ts # Alto instance configuration +└── src/ # Test utilities + ├── testWithRpc.ts # RPC test fixture + ├── types.ts # Type definitions + └── utils.ts # Test helper functions +``` + +## Technology Stack + +### Core Dependencies + +- **prool**: Local blockchain testing framework +- **viem**: Ethereum library for blockchain interactions +- **vitest**: Test runner and fixtures +- **@pimlico/alto**: ERC-4337 bundler +- **@pimlico/mock-paymaster**: Mock paymaster for testing +- **get-port**: Dynamic port allocation + +### Infrastructure Components + +- **Anvil**: Local Ethereum node (via Prool) +- **Alto**: ERC-4337 bundler instance +- **Mock Paymaster**: Local paymaster server + +## Test Infrastructure + +### 1. RPC Test Fixture + +The `testWithRpc` fixture provides a complete ERC-4337 testing environment: + +```typescript +export const testWithRpc = test.extend<{ + rpc: { + anvilRpc: string + altoRpc: string + paymasterRpc: string + } +}> +``` + +Features: +- Automatic port allocation +- Instance lifecycle management +- Parallel test support +- Fork mode support + +### 2. Smart Account Factories + +Provides factory functions for all supported smart accounts: +- Simple Account (v0.6, v0.7, v0.8) +- Kernel Account (multiple versions) +- Safe Account (standard and ERC-7579) +- Light Account (v1.1.0, v2.0.0) +- Biconomy Account +- Trust Account +- Nexus Account +- Etherspot Account +- Thirdweb Account + +### 3. Client Utilities + +Helper functions for creating various clients: +- `getBundlerClient()`: Smart account client with bundler +- `getSmartAccountClient()`: Standard smart account client +- `getPimlicoClient()`: Pimlico-specific client +- `getPublicClient()`: Viem public client +- `getAnvilWalletClient()`: Test wallet client + +## Coding Patterns and Conventions + +### 1. Factory Function Pattern + +Each account type has a dedicated factory: + +```typescript +export const get[AccountType]Client = async < + entryPointVersion extends EntryPointVersion +>(params: AAParamType) => { + // Account creation logic +} +``` + +### 2. Configuration Pattern + +Centralized configuration for test accounts: + +```typescript +export const getCoreSmartAccounts = (): Array<{ + name: string + supportsEntryPointV06: boolean + supportsEntryPointV07: boolean + supportsEntryPointV08: boolean + isEip7702Compliant?: boolean + isEip1271Compliant: boolean + getSmartAccountClient: Function + getErc7579SmartAccountClient?: Function +}> +``` + +### 3. Instance Management + +Lifecycle management for test infrastructure: + +```typescript +const instances = await getInstances({ + anvilPort, + altoPort, + paymasterPort +}) +// Use instances +await Promise.all(instances.map(instance => instance.stop())) +``` + +### 4. Code Style + +- **No comments** unless absolutely necessary +- Descriptive function names +- Consistent async/await usage +- Type-safe implementations +- Early returns for error conditions + +## Architecture + +### Test Environment Architecture + +1. **Anvil Node**: Local blockchain with Prague hardfork +2. **Alto Bundler**: Handles user operations +3. **Mock Paymaster**: Sponsors transactions +4. **Contract Deployment**: Sets up necessary contracts + +### Integration Flow + +1. Start Anvil instance +2. Deploy ERC-4337 contracts (if not forked) +3. Start Alto bundler +4. Start mock paymaster +5. Run tests +6. Clean up instances + +## Key Design Principles + +1. **Isolation**: Each test gets fresh instances +2. **Parallelization**: Dynamic port allocation +3. **Flexibility**: Support for multiple account types +4. **Reusability**: Shared utilities across tests +5. **Type Safety**: Full TypeScript support + +## Development Workflow + +### Writing Tests + +1. Use `testWithRpc` fixture for ERC-4337 tests +2. Select appropriate account factory +3. Create clients with test utilities +4. Execute test scenarios +5. Automatic cleanup handled by fixture + +### Adding New Account Types + +1. Add constants in `mock-aa-infra/alto/constants/accounts/` +2. Create factory function in `utils.ts` +3. Add to `getCoreSmartAccounts()` array +4. Update type definitions if needed + +### Testing Best Practices + +- Use dedicated test accounts +- Test multiple entry point versions +- Verify both deployed and undeployed states +- Test with and without paymasters +- Check ERC-7579 compliance where applicable + +## Utility Functions + +### Infrastructure Helpers + +- `ensureBundlerIsReady()`: Wait for bundler availability +- `ensurePaymasterIsReady()`: Wait for paymaster availability +- `setupContracts()`: Deploy required contracts + +### Account Helpers + +- Private key generation +- Mnemonic-based accounts +- Multiple owner configurations +- Version-specific account creation + +## Configuration + +### Default Values + +- **Test Mnemonic**: Standard test mnemonic +- **Chain**: Foundry (local) +- **Hardfork**: Prague +- **Paymaster RPC**: `http://localhost:3000` + +### Environment Variables + +- `VITE_FORK_RPC_URL`: Fork from existing chain (optional) \ No newline at end of file diff --git a/packages/permissionless/agents.md b/packages/permissionless/agents.md new file mode 100644 index 00000000..03ca7326 --- /dev/null +++ b/packages/permissionless/agents.md @@ -0,0 +1,224 @@ +# Permissionless.js Codebase Analysis + +## Overview + +Permissionless.js is a TypeScript utility library for working with ERC-4337 +(Account Abstraction). It provides a comprehensive set of tools for creating and +managing smart accounts, executing user operations, and integrating with various +bundlers and paymasters. + +## Project Structure + +### Directory Organization + +``` +packages/permissionless/ +├── accounts/ # Smart account implementations +│ ├── biconomy/ # Biconomy smart account +│ ├── etherspot/ # Etherspot smart account +│ ├── kernel/ # Kernel smart account (v2, v3, EIP-7702) +│ ├── light/ # Light account +│ ├── nexus/ # Nexus smart account +│ ├── safe/ # Safe (Gnosis) smart account +│ ├── simple/ # Simple account (reference implementation) +│ ├── thirdweb/ # Thirdweb smart account +│ └── trust/ # Trust wallet smart account +├── actions/ # Blockchain interaction functions +│ ├── erc7579/ # ERC-7579 modular account actions +│ ├── etherspot/ # Etherspot-specific actions +│ ├── passkeyServer/ # Passkey authentication actions +│ ├── pimlico/ # Pimlico bundler/paymaster actions +│ ├── public/ # Public RPC actions +│ └── smartAccount/ # Generic smart account actions +├── clients/ # Client implementations +├── errors/ # Custom error definitions +└── utils/ # Utility functions +``` + +## Technology Stack + +### Core Dependencies + +- **viem** (^2.28.1): Core Ethereum library for type-safe interactions +- **ox** (0.6.7, optional): Additional utilities + +### Build Tools + +- **TypeScript**: Strict mode with comprehensive type checking +- **Bun**: Package manager and build tool +- **tsc**: TypeScript compiler for CJS/ESM/types builds +- **tsc-alias**: Path alias resolution + +### Testing + +- **Vitest**: Test runner with concurrent test execution +- **V8**: Code coverage provider +- **permissionless-test**: Internal testing utilities package + +## Coding Patterns and Conventions + +### 1. Smart Account Factory Pattern + +Each smart account implementation follows a consistent factory pattern: + +```typescript +export async function to[AccountName]SmartAccount< + entryPointVersion extends EntryPointVersion, + owner extends OneOf<...>, + eip7702 extends boolean = false +>(parameters: To[AccountName]SmartAccountParameters): Promise> +``` + +Key characteristics: + +- Generic type parameters for flexibility +- Conditional parameter types based on features +- Returns a `SmartAccount` interface implementation +- Implements required methods: `getAddress`, `encodeCalls`, `decodeCalls`, + `getNonce`, `getStubSignature`, `sign`, `signMessage`, `signTypedData`, + `signUserOperation` + +### 2. Action Pattern + +Actions are async functions that interact with the blockchain: + +```typescript +export async function actionName( + client: Client, + parameters: TParameters, +): Promise { + // Implementation using getAction() for composability +} +``` + +### 3. Type System Conventions + +- Extensive use of generics for flexibility +- Conditional types based on entry point versions +- `OneOf` utility for union types +- Naming convention: `[Feature]Parameters` for inputs, `[Feature]ReturnType` for + outputs +- Separate type definition files for complex types + +### 4. Import/Export Structure + +- Index files for clean module exports +- Re-export pattern for public API +- Type imports using `type` keyword +- Consistent `.js` extensions in imports (ESM compatibility) + +### 5. Error Handling + +- Custom error classes extending viem's `BaseError` +- Descriptive error messages with documentation links +- Minimal error handling code +- Error naming: `[Context]Error` + +### 6. Code Style + +- **No comments** unless absolutely necessary +- Descriptive function and variable names +- Early returns for error conditions +- Destructuring for parameter handling +- Async/await over promises +- Const for immutable values + +## Build System + +### Build Outputs + +The project builds to three formats: + +1. **CommonJS** (`_cjs/`): For Node.js compatibility +2. **ESM** (`_esm/`): For modern JavaScript environments +3. **Types** (`_types/`): TypeScript declaration files + +### TypeScript Configuration + +- **Target**: ES2021 (Node 16+ compatibility) +- **Lib**: ES2022 + DOM (for Error.cause and fetch types) +- **Strict Mode**: Full strict checking enabled +- Additional checks: `noFallthroughCasesInSwitch`, `noImplicitReturns`, + `noImplicitOverride`, `noUnusedLocals`, `noUnusedParameters` + +## Testing Approach + +### Test Structure + +- `describe.each()` for testing multiple account types +- `testWithRpc` wrapper for RPC-dependent tests +- Conditional test execution based on feature support +- Clear structure: setup → action → assertions + +### Test Configuration + +- Vitest with Node environment +- 60-second test timeout +- Sequential test execution (no concurrency) +- V8 coverage reporting +- Test files: `**/*.test.ts` + +## Architectural Patterns + +### 1. Factory Pattern + +Used for creating smart account instances with consistent interfaces. + +### 2. Adapter Pattern + +Different account implementations adapt to a common `SmartAccount` interface. + +### 3. Strategy Pattern + +Different signing methods and validation strategies per account type. + +### 4. Builder Pattern + +Complex objects (like user operations) built step by step. + +### 5. Modular Architecture + +Clear separation between: + +- Account implementations +- Actions (operations) +- Utilities +- Error handling +- Type definitions + +## Key Design Principles + +1. **Type Safety**: Extensive TypeScript usage with strict checking +2. **Modularity**: Clear separation of concerns +3. **Extensibility**: Easy to add new account types or actions +4. **Consistency**: Uniform patterns across implementations +5. **Minimal Dependencies**: Only essential dependencies +6. **No Side Effects**: Pure functions where possible +7. **Error Clarity**: Descriptive errors with actionable messages + +## Development Workflow + +### Adding a New Smart Account + +1. Create directory under `accounts/[name]/` +2. Implement `to[Name]SmartAccount` function +3. Add ABI files if needed +4. Implement utility functions in `utils/` +5. Export from `accounts/index.ts` +6. Add comprehensive tests + +### Adding a New Action + +1. Create file in appropriate `actions/` subdirectory +2. Define parameter and return types +3. Implement async function +4. Export from category index file +5. Add tests with RPC mocking + +### Testing Guidelines + +- Test all entry point versions +- Test both deployed and undeployed accounts +- Mock RPC calls appropriately +- Use `testWithRpc` for integration tests +- Ensure comprehensive error case coverage diff --git a/packages/permissionless/size-tests/biconomy-with-client.js b/packages/permissionless/size-tests/biconomy-with-client.js new file mode 100644 index 00000000..68ada617 --- /dev/null +++ b/packages/permissionless/size-tests/biconomy-with-client.js @@ -0,0 +1,3 @@ +export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/toBiconomySmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/biconomy-with-pimlico.js b/packages/permissionless/size-tests/biconomy-with-pimlico.js new file mode 100644 index 00000000..761ec04b --- /dev/null +++ b/packages/permissionless/size-tests/biconomy-with-pimlico.js @@ -0,0 +1,2 @@ +export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/toBiconomySmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/etherspot-with-client.js b/packages/permissionless/size-tests/etherspot-with-client.js new file mode 100644 index 00000000..ecdcf76e --- /dev/null +++ b/packages/permissionless/size-tests/etherspot-with-client.js @@ -0,0 +1,3 @@ +export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/toEtherspotSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/etherspot-with-pimlico.js b/packages/permissionless/size-tests/etherspot-with-pimlico.js new file mode 100644 index 00000000..c601ebb6 --- /dev/null +++ b/packages/permissionless/size-tests/etherspot-with-pimlico.js @@ -0,0 +1,2 @@ +export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/toEtherspotSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/kernel-with-client.js b/packages/permissionless/size-tests/kernel-with-client.js new file mode 100644 index 00000000..dbfac04c --- /dev/null +++ b/packages/permissionless/size-tests/kernel-with-client.js @@ -0,0 +1,3 @@ +export { toKernelSmartAccount } from "../_esm/accounts/kernel/toKernelSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/kernel-with-pimlico.js b/packages/permissionless/size-tests/kernel-with-pimlico.js new file mode 100644 index 00000000..649d28d1 --- /dev/null +++ b/packages/permissionless/size-tests/kernel-with-pimlico.js @@ -0,0 +1,2 @@ +export { toKernelSmartAccount } from "../_esm/accounts/kernel/toKernelSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/light-with-client.js b/packages/permissionless/size-tests/light-with-client.js new file mode 100644 index 00000000..903c4700 --- /dev/null +++ b/packages/permissionless/size-tests/light-with-client.js @@ -0,0 +1,3 @@ +export { toLightSmartAccount } from "../_esm/accounts/light/toLightSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/light-with-pimlico.js b/packages/permissionless/size-tests/light-with-pimlico.js new file mode 100644 index 00000000..792f0b4e --- /dev/null +++ b/packages/permissionless/size-tests/light-with-pimlico.js @@ -0,0 +1,2 @@ +export { toLightSmartAccount } from "../_esm/accounts/light/toLightSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/nexus-with-client.js b/packages/permissionless/size-tests/nexus-with-client.js new file mode 100644 index 00000000..530b81c5 --- /dev/null +++ b/packages/permissionless/size-tests/nexus-with-client.js @@ -0,0 +1,3 @@ +export { toNexusSmartAccount } from "../_esm/accounts/nexus/toNexusSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/nexus-with-pimlico.js b/packages/permissionless/size-tests/nexus-with-pimlico.js new file mode 100644 index 00000000..01101ea7 --- /dev/null +++ b/packages/permissionless/size-tests/nexus-with-pimlico.js @@ -0,0 +1,2 @@ +export { toNexusSmartAccount } from "../_esm/accounts/nexus/toNexusSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/safe-with-client.js b/packages/permissionless/size-tests/safe-with-client.js new file mode 100644 index 00000000..994616e4 --- /dev/null +++ b/packages/permissionless/size-tests/safe-with-client.js @@ -0,0 +1,3 @@ +export { toSafeSmartAccount } from "../_esm/accounts/safe/toSafeSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/safe-with-pimlico.js b/packages/permissionless/size-tests/safe-with-pimlico.js new file mode 100644 index 00000000..7323023d --- /dev/null +++ b/packages/permissionless/size-tests/safe-with-pimlico.js @@ -0,0 +1,2 @@ +export { toSafeSmartAccount } from "../_esm/accounts/safe/toSafeSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/simple-with-client.js b/packages/permissionless/size-tests/simple-with-client.js new file mode 100644 index 00000000..deac1b28 --- /dev/null +++ b/packages/permissionless/size-tests/simple-with-client.js @@ -0,0 +1,3 @@ +export { toSimpleSmartAccount } from "../_esm/accounts/simple/toSimpleSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/simple-with-pimlico.js b/packages/permissionless/size-tests/simple-with-pimlico.js new file mode 100644 index 00000000..e5e96b36 --- /dev/null +++ b/packages/permissionless/size-tests/simple-with-pimlico.js @@ -0,0 +1,2 @@ +export { toSimpleSmartAccount } from "../_esm/accounts/simple/toSimpleSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/thirdweb-with-client.js b/packages/permissionless/size-tests/thirdweb-with-client.js new file mode 100644 index 00000000..882834a1 --- /dev/null +++ b/packages/permissionless/size-tests/thirdweb-with-client.js @@ -0,0 +1,3 @@ +export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/toThirdwebSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/thirdweb-with-pimlico.js b/packages/permissionless/size-tests/thirdweb-with-pimlico.js new file mode 100644 index 00000000..b75c2584 --- /dev/null +++ b/packages/permissionless/size-tests/thirdweb-with-pimlico.js @@ -0,0 +1,2 @@ +export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/toThirdwebSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/trust-with-client.js b/packages/permissionless/size-tests/trust-with-client.js new file mode 100644 index 00000000..26b7893c --- /dev/null +++ b/packages/permissionless/size-tests/trust-with-client.js @@ -0,0 +1,3 @@ +export { toTrustSmartAccount } from "../_esm/accounts/trust/toTrustSmartAccount.js" +export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/trust-with-pimlico.js b/packages/permissionless/size-tests/trust-with-pimlico.js new file mode 100644 index 00000000..261895ca --- /dev/null +++ b/packages/permissionless/size-tests/trust-with-pimlico.js @@ -0,0 +1,2 @@ +export { toTrustSmartAccount } from "../_esm/accounts/trust/toTrustSmartAccount.js" +export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/wagmi-demo/agents.md b/packages/wagmi-demo/agents.md new file mode 100644 index 00000000..5f68d270 --- /dev/null +++ b/packages/wagmi-demo/agents.md @@ -0,0 +1,172 @@ +# Wagmi Demo Application Codebase Analysis + +## Overview + +Wagmi Demo is a React demonstration application showcasing the integration of Permissionless.js with Wagmi. It provides working examples of ERC-4337 account abstraction features, including passkey authentication and smart account interactions. + +## Project Structure + +### Directory Organization + +``` +packages/wagmi-demo/ +├── src/ +│ ├── App.tsx # Main application component +│ ├── main.tsx # Application entry point +│ ├── wagmi.ts # Wagmi configuration +│ ├── PasskeysDemo.tsx # Passkey authentication demo +│ ├── PasskeyServerDemo.tsx # Server-based passkey demo +│ └── vite-env.d.ts # Vite type definitions +├── tsconfig.json # TypeScript configuration +├── tsconfig.node.json # Node TypeScript config +├── vite.config.ts # Vite configuration +└── biome.json # Code formatter configuration +``` + +## Technology Stack + +### Core Dependencies + +- **React**: UI framework +- **Vite**: Build tool and dev server +- **TypeScript**: Type-safe development +- **permissionless**: Core ERC-4337 library (workspace dependency) +- **@permissionless/wagmi**: Wagmi integration (workspace dependency) +- **wagmi**: React hooks for Ethereum +- **viem**: Ethereum library + +### Development Tools + +- **Biome**: Code formatting and linting +- **Vite**: Fast development server with HMR + +## Application Features + +### 1. Passkey Authentication Demo + +Demonstrates WebAuthn-based authentication: +- Create smart accounts with passkeys +- Sign transactions with biometric authentication +- No seed phrases required + +### 2. Passkey Server Demo + +Shows server-assisted passkey flows: +- Server-side passkey validation +- Enhanced security patterns +- Integration with backend services + +### 3. Smart Account Interactions + +Examples of ERC-4337 operations: +- Account creation and deployment +- User operation submission +- Paymaster integration +- Bundler interactions + +## Coding Patterns and Conventions + +### 1. Component Structure + +React functional components with hooks: + +```typescript +export function DemoComponent() { + // Hook usage + // Event handlers + // Render logic +} +``` + +### 2. Wagmi Configuration + +Centralized configuration in wagmi.ts: + +```typescript +const config = createConfig({ + // Chain configuration + // Transport setup + // Connector configuration +}) +``` + +### 3. Demo Pattern + +Each demo is self-contained: +- Clear user instructions +- Error handling and feedback +- Loading states +- Success confirmations + +### 4. Code Style + +- **No comments** unless absolutely necessary +- Descriptive component and function names +- Consistent JSX formatting +- TypeScript for all files + +## Architecture + +### Application Architecture + +1. **Main App**: Route and component management +2. **Demo Components**: Individual feature demonstrations +3. **Wagmi Provider**: Configuration and context +4. **Permissionless Integration**: Smart account functionality + +### State Management + +- React hooks for local state +- Wagmi hooks for blockchain state +- No external state management library + +## Key Design Principles + +1. **Educational**: Clear demonstrations of features +2. **User-Friendly**: Intuitive UI with helpful feedback +3. **Real-World**: Practical implementation examples +4. **Best Practices**: Shows recommended patterns +5. **Error Handling**: Graceful failure scenarios + +## Development Workflow + +### Running the Demo + +```bash +bun dev # Start development server +bun build # Build for production +bun preview # Preview production build +``` + +### Adding New Demos + +1. Create new component in `src/` +2. Implement demo functionality +3. Add to App.tsx routing +4. Include error handling +5. Add user instructions + +### Demo Guidelines + +- Keep demos focused on single features +- Provide clear user instructions +- Show loading and success states +- Handle errors gracefully +- Use realistic scenarios + +## User Experience + +### UI Patterns + +- Clear call-to-action buttons +- Loading indicators during async operations +- Success/error messages +- Step-by-step guidance +- Responsive design + +### Error Handling + +- User-friendly error messages +- Retry mechanisms where appropriate +- Fallback options +- Debug information in development \ No newline at end of file diff --git a/packages/wagmi/agents.md b/packages/wagmi/agents.md new file mode 100644 index 00000000..83897887 --- /dev/null +++ b/packages/wagmi/agents.md @@ -0,0 +1,162 @@ +# Wagmi Permissionless Integration Codebase Analysis + +## Overview + +@permissionless/wagmi is a React hooks library that integrates Permissionless.js with Wagmi v2. It provides React hooks and context providers to seamlessly use ERC-4337 account abstraction features within Wagmi-based applications. + +## Project Structure + +### Directory Organization + +``` +packages/wagmi/ +├── hooks/ # React hooks +│ ├── useAvailableCapabilities.ts # Hook for checking wallet capabilities +│ ├── useSendTransaction.ts # Enhanced transaction sending hook +│ └── useWaitForTransactionReceipt.ts # Transaction receipt waiting hook +├── utils/ # Utility functions +│ └── observe.ts # Observable pattern utilities +├── context.tsx # React context provider +└── index.ts # Main exports +``` + +## Technology Stack + +### Core Dependencies + +- **wagmi** (^2.15.1): React hooks for Ethereum (peer dependency) +- **react**: React library (inherited from wagmi) +- **viem**: Ethereum library (inherited from wagmi) + +### Build Tools + +- **TypeScript**: Strict mode with comprehensive type checking +- **Bun**: Package manager and build tool +- **tsc**: TypeScript compiler for CJS/ESM/types builds + +## Coding Patterns and Conventions + +### 1. Hook Enhancement Pattern + +Extends existing Wagmi hooks with ERC-4337 capabilities: + +```typescript +export function useSendTransaction( + parameters: UseSendTransactionParameters = {} +): UseSendTransactionReturnType { + // Enhanced implementation +} +``` + +### 2. Context Provider Pattern + +Provides configuration through React context: + +```typescript +export function PermissionlessProvider({ + children, + ...props +}: PermissionlessProviderProps) { + // Context provider implementation +} +``` + +### 3. Observable Pattern + +Uses observables for reactive state management: + +```typescript +function observe( + getValue: () => T, + callback: (value: T) => void +): () => void { + // Observable implementation +} +``` + +### 4. Type Augmentation + +Extends Wagmi types with additional parameters: + +```typescript +type UseSendTransactionParameters = WagmiUseSendTransactionParameters & { + // Additional ERC-4337 parameters +} +``` + +### 5. Code Style + +- **No comments** unless absolutely necessary +- Descriptive function and variable names +- Consistent with Wagmi's API design +- Type-safe with full TypeScript support + +## Architecture + +### Hook Architecture + +1. **Enhanced Hooks**: Wrap Wagmi hooks with additional functionality +2. **Context Integration**: Access shared configuration +3. **Observable State**: Reactive updates for async operations +4. **Type Safety**: Full TypeScript support + +### Integration Points + +- **Wagmi Config**: Integrates with Wagmi's configuration +- **Smart Accounts**: Supports ERC-4337 smart accounts +- **Bundlers**: Works with various bundler implementations +- **Paymasters**: Supports paymaster functionality + +## Key Design Principles + +1. **Seamless Integration**: Works naturally with existing Wagmi code +2. **Backward Compatibility**: Doesn't break existing Wagmi functionality +3. **Type Safety**: Maintains Wagmi's type-safe approach +4. **React Best Practices**: Follows React hooks conventions +5. **Minimal API Surface**: Only exposes necessary functionality + +## Hook Documentation + +### useSendTransaction + +Enhanced transaction sending with ERC-4337 support: +- Supports smart account transactions +- Handles user operation creation +- Integrates with bundlers and paymasters + +### useWaitForTransactionReceipt + +Waits for transaction receipts with ERC-4337 awareness: +- Handles both regular and user operation receipts +- Provides proper typing for different receipt types + +### useAvailableCapabilities + +Checks wallet capabilities for ERC-4337 features: +- Detects smart account support +- Identifies available paymaster services +- Checks bundler compatibility + +## Development Workflow + +### Using the Hooks + +1. Wrap app with `PermissionlessProvider` +2. Use hooks like regular Wagmi hooks +3. Access additional ERC-4337 features +4. Handle both EOA and smart account flows + +### Adding New Hooks + +1. Create hook file in `hooks/` directory +2. Extend corresponding Wagmi hook +3. Add ERC-4337 specific logic +4. Export from index.ts +5. Update types as needed + +### Testing Guidelines + +- Test with both EOA and smart accounts +- Verify Wagmi compatibility +- Test error scenarios +- Ensure proper type inference \ No newline at end of file From 61f53555e1bbf7b022a02faf159083740806f3ad Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Thu, 3 Jul 2025 16:54:36 +0100 Subject: [PATCH 2/6] add better tree-shaking --- .../permissionless/accounts/biconomy/index.ts | 13 ++ .../accounts/etherspot/index.ts | 13 ++ packages/permissionless/accounts/index.ts | 149 ++---------------- .../permissionless/accounts/kernel/index.ts | 37 +++++ .../permissionless/accounts/light/index.ts | 15 ++ .../permissionless/accounts/nexus/index.ts | 13 ++ .../permissionless/accounts/safe/index.ts | 3 +- .../permissionless/accounts/simple/index.ts | 24 +++ .../permissionless/accounts/thirdweb/index.ts | 13 ++ .../permissionless/accounts/trust/index.ts | 13 ++ packages/permissionless/package.json | 40 +++++ 11 files changed, 192 insertions(+), 141 deletions(-) create mode 100644 packages/permissionless/accounts/biconomy/index.ts create mode 100644 packages/permissionless/accounts/etherspot/index.ts create mode 100644 packages/permissionless/accounts/kernel/index.ts create mode 100644 packages/permissionless/accounts/light/index.ts create mode 100644 packages/permissionless/accounts/nexus/index.ts create mode 100644 packages/permissionless/accounts/simple/index.ts create mode 100644 packages/permissionless/accounts/thirdweb/index.ts create mode 100644 packages/permissionless/accounts/trust/index.ts diff --git a/packages/permissionless/accounts/biconomy/index.ts b/packages/permissionless/accounts/biconomy/index.ts new file mode 100644 index 00000000..c19ef2bc --- /dev/null +++ b/packages/permissionless/accounts/biconomy/index.ts @@ -0,0 +1,13 @@ +import { + type BiconomySmartAccountImplementation, + type ToBiconomySmartAccountParameters, + type ToBiconomySmartAccountReturnType, + toBiconomySmartAccount +} from "./toBiconomySmartAccount.js" + +export { + type ToBiconomySmartAccountReturnType, + type ToBiconomySmartAccountParameters, + type BiconomySmartAccountImplementation, + toBiconomySmartAccount +} diff --git a/packages/permissionless/accounts/etherspot/index.ts b/packages/permissionless/accounts/etherspot/index.ts new file mode 100644 index 00000000..ce21f369 --- /dev/null +++ b/packages/permissionless/accounts/etherspot/index.ts @@ -0,0 +1,13 @@ +import { + type EtherspotSmartAccountImplementation, + type ToEtherspotSmartAccountParameters, + type ToEtherspotSmartAccountReturnType, + toEtherspotSmartAccount +} from "./toEtherspotSmartAccount.js" + +export { + type ToEtherspotSmartAccountParameters, + type EtherspotSmartAccountImplementation, + type ToEtherspotSmartAccountReturnType, + toEtherspotSmartAccount +} diff --git a/packages/permissionless/accounts/index.ts b/packages/permissionless/accounts/index.ts index 8ac9b893..62b5b91d 100644 --- a/packages/permissionless/accounts/index.ts +++ b/packages/permissionless/accounts/index.ts @@ -1,140 +1,9 @@ -import { - type SimpleSmartAccountImplementation, - type ToSimpleSmartAccountParameters, - type ToSimpleSmartAccountReturnType, - toSimpleSmartAccount -} from "./simple/toSimpleSmartAccount.js" - -import { - type To7702SimpleSmartAccountImplementation, - type To7702SimpleSmartAccountParameters, - type To7702SimpleSmartAccountReturnType, - to7702SimpleSmartAccount -} from "./simple/to7702SimpleSmartAccount.js" - -import { - type LightAccountVersion, - type LightSmartAccountImplementation, - type ToLightSmartAccountParameters, - type ToLightSmartAccountReturnType, - toLightSmartAccount -} from "./light/toLightSmartAccount.js" - -import { - type ToTrustSmartAccountParameters, - type ToTrustSmartAccountReturnType, - type TrustSmartAccountImplementation, - toTrustSmartAccount -} from "./trust/toTrustSmartAccount.js" - -import { - type EtherspotSmartAccountImplementation, - type ToEtherspotSmartAccountParameters, - type ToEtherspotSmartAccountReturnType, - toEtherspotSmartAccount -} from "./etherspot/toEtherspotSmartAccount.js" - -import { - type SafeSmartAccountImplementation, - type SafeVersion, - type ToSafeSmartAccountParameters, - type ToSafeSmartAccountReturnType, - toSafeSmartAccount -} from "./safe/toSafeSmartAccount.js" - -import { - type EcdsaKernelSmartAccountImplementation, - type ToEcdsaKernelSmartAccountParameters, - type ToEcdsaKernelSmartAccountReturnType, - toEcdsaKernelSmartAccount -} from "./kernel/toEcdsaKernelSmartAccount.js" - -import { - type To7702KernelSmartAccountImplementation, - type To7702KernelSmartAccountParameters, - type To7702KernelSmartAccountReturnType, - to7702KernelSmartAccount -} from "./kernel/to7702KernelSmartAccount.js" - -import { - type KernelSmartAccountImplementation, - type KernelVersion, - type ToKernelSmartAccountParameters, - type ToKernelSmartAccountReturnType, - toKernelSmartAccount -} from "./kernel/toKernelSmartAccount.js" - -import { - type BiconomySmartAccountImplementation, - type ToBiconomySmartAccountParameters, - type ToBiconomySmartAccountReturnType, - toBiconomySmartAccount -} from "./biconomy/toBiconomySmartAccount.js" - -import { - type NexusSmartAccountImplementation, - type ToNexusSmartAccountParameters, - type ToNexusSmartAccountReturnType, - toNexusSmartAccount -} from "./nexus/toNexusSmartAccount.js" - -import { - type ThirdwebSmartAccountImplementation, - type ToThirdwebSmartAccountParameters, - type ToThirdwebSmartAccountReturnType, - toThirdwebSmartAccount -} from "./thirdweb/toThirdwebSmartAccount.js" - -export { - type ToSimpleSmartAccountParameters, - type SimpleSmartAccountImplementation, - type ToSimpleSmartAccountReturnType, - toSimpleSmartAccount, - type To7702SimpleSmartAccountParameters, - type To7702SimpleSmartAccountImplementation, - type To7702SimpleSmartAccountReturnType, - to7702SimpleSmartAccount, - type LightAccountVersion, - type ToLightSmartAccountParameters, - type LightSmartAccountImplementation, - type ToLightSmartAccountReturnType, - toLightSmartAccount, - type ToTrustSmartAccountParameters, - type TrustSmartAccountImplementation, - type ToTrustSmartAccountReturnType, - toTrustSmartAccount, - type ToSafeSmartAccountParameters, - type SafeSmartAccountImplementation, - type ToSafeSmartAccountReturnType, - type SafeVersion, - toSafeSmartAccount, - type ToEcdsaKernelSmartAccountParameters, - type EcdsaKernelSmartAccountImplementation, - type ToEcdsaKernelSmartAccountReturnType, - toEcdsaKernelSmartAccount, - type KernelSmartAccountImplementation, - type ToKernelSmartAccountReturnType, - type ToKernelSmartAccountParameters, - type KernelVersion, - toKernelSmartAccount, - type NexusSmartAccountImplementation, - type ToNexusSmartAccountParameters, - type ToNexusSmartAccountReturnType, - toNexusSmartAccount, - type ToBiconomySmartAccountReturnType, - type ToBiconomySmartAccountParameters, - type BiconomySmartAccountImplementation, - toBiconomySmartAccount, - type ToThirdwebSmartAccountReturnType, - type ToThirdwebSmartAccountParameters, - type ThirdwebSmartAccountImplementation, - toThirdwebSmartAccount, - type ToEtherspotSmartAccountParameters, - type EtherspotSmartAccountImplementation, - type ToEtherspotSmartAccountReturnType, - toEtherspotSmartAccount, - type To7702KernelSmartAccountParameters, - type To7702KernelSmartAccountImplementation, - type To7702KernelSmartAccountReturnType, - to7702KernelSmartAccount -} +export * from "./biconomy/index.js" +export * from "./etherspot/index.js" +export * from "./kernel/index.js" +export * from "./light/index.js" +export * from "./nexus/index.js" +export * from "./safe/index.js" +export * from "./simple/index.js" +export * from "./thirdweb/index.js" +export * from "./trust/index.js" diff --git a/packages/permissionless/accounts/kernel/index.ts b/packages/permissionless/accounts/kernel/index.ts new file mode 100644 index 00000000..6f0b3f01 --- /dev/null +++ b/packages/permissionless/accounts/kernel/index.ts @@ -0,0 +1,37 @@ +import { + type EcdsaKernelSmartAccountImplementation, + type ToEcdsaKernelSmartAccountParameters, + type ToEcdsaKernelSmartAccountReturnType, + toEcdsaKernelSmartAccount +} from "./toEcdsaKernelSmartAccount.js" + +import { + type To7702KernelSmartAccountImplementation, + type To7702KernelSmartAccountParameters, + type To7702KernelSmartAccountReturnType, + to7702KernelSmartAccount +} from "./to7702KernelSmartAccount.js" + +import { + type KernelSmartAccountImplementation, + type KernelVersion, + type ToKernelSmartAccountParameters, + type ToKernelSmartAccountReturnType, + toKernelSmartAccount +} from "./toKernelSmartAccount.js" + +export { + type ToEcdsaKernelSmartAccountParameters, + type EcdsaKernelSmartAccountImplementation, + type ToEcdsaKernelSmartAccountReturnType, + toEcdsaKernelSmartAccount, + type KernelSmartAccountImplementation, + type ToKernelSmartAccountReturnType, + type ToKernelSmartAccountParameters, + type KernelVersion, + toKernelSmartAccount, + type To7702KernelSmartAccountParameters, + type To7702KernelSmartAccountImplementation, + type To7702KernelSmartAccountReturnType, + to7702KernelSmartAccount +} diff --git a/packages/permissionless/accounts/light/index.ts b/packages/permissionless/accounts/light/index.ts new file mode 100644 index 00000000..74c3a599 --- /dev/null +++ b/packages/permissionless/accounts/light/index.ts @@ -0,0 +1,15 @@ +import { + type LightAccountVersion, + type LightSmartAccountImplementation, + type ToLightSmartAccountParameters, + type ToLightSmartAccountReturnType, + toLightSmartAccount +} from "./toLightSmartAccount.js" + +export { + type LightAccountVersion, + type ToLightSmartAccountParameters, + type LightSmartAccountImplementation, + type ToLightSmartAccountReturnType, + toLightSmartAccount +} diff --git a/packages/permissionless/accounts/nexus/index.ts b/packages/permissionless/accounts/nexus/index.ts new file mode 100644 index 00000000..a290cde1 --- /dev/null +++ b/packages/permissionless/accounts/nexus/index.ts @@ -0,0 +1,13 @@ +import { + type NexusSmartAccountImplementation, + type ToNexusSmartAccountParameters, + type ToNexusSmartAccountReturnType, + toNexusSmartAccount +} from "./toNexusSmartAccount.js" + +export { + type NexusSmartAccountImplementation, + type ToNexusSmartAccountParameters, + type ToNexusSmartAccountReturnType, + toNexusSmartAccount +} diff --git a/packages/permissionless/accounts/safe/index.ts b/packages/permissionless/accounts/safe/index.ts index a685053a..836b0e40 100644 --- a/packages/permissionless/accounts/safe/index.ts +++ b/packages/permissionless/accounts/safe/index.ts @@ -18,5 +18,6 @@ export { type SafeVersion, type ToSafeSmartAccountParameters, type ToSafeSmartAccountReturnType, - SafeSmartAccount + SafeSmartAccount, + toSafeSmartAccount } diff --git a/packages/permissionless/accounts/simple/index.ts b/packages/permissionless/accounts/simple/index.ts new file mode 100644 index 00000000..21a040b7 --- /dev/null +++ b/packages/permissionless/accounts/simple/index.ts @@ -0,0 +1,24 @@ +import { + type SimpleSmartAccountImplementation, + type ToSimpleSmartAccountParameters, + type ToSimpleSmartAccountReturnType, + toSimpleSmartAccount +} from "./toSimpleSmartAccount.js" + +import { + type To7702SimpleSmartAccountImplementation, + type To7702SimpleSmartAccountParameters, + type To7702SimpleSmartAccountReturnType, + to7702SimpleSmartAccount +} from "./to7702SimpleSmartAccount.js" + +export { + type ToSimpleSmartAccountParameters, + type SimpleSmartAccountImplementation, + type ToSimpleSmartAccountReturnType, + toSimpleSmartAccount, + type To7702SimpleSmartAccountParameters, + type To7702SimpleSmartAccountImplementation, + type To7702SimpleSmartAccountReturnType, + to7702SimpleSmartAccount +} diff --git a/packages/permissionless/accounts/thirdweb/index.ts b/packages/permissionless/accounts/thirdweb/index.ts new file mode 100644 index 00000000..f3d6472d --- /dev/null +++ b/packages/permissionless/accounts/thirdweb/index.ts @@ -0,0 +1,13 @@ +import { + type ThirdwebSmartAccountImplementation, + type ToThirdwebSmartAccountParameters, + type ToThirdwebSmartAccountReturnType, + toThirdwebSmartAccount +} from "./toThirdwebSmartAccount.js" + +export { + type ToThirdwebSmartAccountReturnType, + type ToThirdwebSmartAccountParameters, + type ThirdwebSmartAccountImplementation, + toThirdwebSmartAccount +} diff --git a/packages/permissionless/accounts/trust/index.ts b/packages/permissionless/accounts/trust/index.ts new file mode 100644 index 00000000..783815a4 --- /dev/null +++ b/packages/permissionless/accounts/trust/index.ts @@ -0,0 +1,13 @@ +import { + type ToTrustSmartAccountParameters, + type ToTrustSmartAccountReturnType, + type TrustSmartAccountImplementation, + toTrustSmartAccount +} from "./toTrustSmartAccount.js" + +export { + type ToTrustSmartAccountParameters, + type TrustSmartAccountImplementation, + type ToTrustSmartAccountReturnType, + toTrustSmartAccount +} diff --git a/packages/permissionless/package.json b/packages/permissionless/package.json index 9798d0ec..6665e95d 100644 --- a/packages/permissionless/package.json +++ b/packages/permissionless/package.json @@ -24,11 +24,51 @@ "import": "./_esm/accounts/index.js", "default": "./_cjs/accounts/index.js" }, + "./accounts/biconomy": { + "types": "./_types/accounts/biconomy/index.d.ts", + "import": "./_esm/accounts/biconomy/index.js", + "default": "./_cjs/accounts/biconomy/index.js" + }, + "./accounts/etherspot": { + "types": "./_types/accounts/etherspot/index.d.ts", + "import": "./_esm/accounts/etherspot/index.js", + "default": "./_cjs/accounts/etherspot/index.js" + }, + "./accounts/kernel": { + "types": "./_types/accounts/kernel/index.d.ts", + "import": "./_esm/accounts/kernel/index.js", + "default": "./_cjs/accounts/kernel/index.js" + }, + "./accounts/light": { + "types": "./_types/accounts/light/index.d.ts", + "import": "./_esm/accounts/light/index.js", + "default": "./_cjs/accounts/light/index.js" + }, + "./accounts/nexus": { + "types": "./_types/accounts/nexus/index.d.ts", + "import": "./_esm/accounts/nexus/index.js", + "default": "./_cjs/accounts/nexus/index.js" + }, "./accounts/safe": { "types": "./_types/accounts/safe/index.d.ts", "import": "./_esm/accounts/safe/index.js", "default": "./_cjs/accounts/safe/index.js" }, + "./accounts/simple": { + "types": "./_types/accounts/simple/index.d.ts", + "import": "./_esm/accounts/simple/index.js", + "default": "./_cjs/accounts/simple/index.js" + }, + "./accounts/thirdweb": { + "types": "./_types/accounts/thirdweb/index.d.ts", + "import": "./_esm/accounts/thirdweb/index.js", + "default": "./_cjs/accounts/thirdweb/index.js" + }, + "./accounts/trust": { + "types": "./_types/accounts/trust/index.d.ts", + "import": "./_esm/accounts/trust/index.js", + "default": "./_cjs/accounts/trust/index.js" + }, "./actions": { "types": "./_types/actions/index.d.ts", "import": "./_esm/actions/index.js", From 1ab83b27a3a63a5955223d3446c98edbfecbde49 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Thu, 3 Jul 2025 17:13:04 +0100 Subject: [PATCH 3/6] Fix size estimations --- .size-limit.json | 18 +++++++++--------- .../size-tests/biconomy-with-client.js | 5 ++--- .../size-tests/biconomy-with-pimlico.js | 3 ++- .../size-tests/etherspot-with-client.js | 5 ++--- .../size-tests/etherspot-with-pimlico.js | 3 ++- .../size-tests/kernel-with-client.js | 5 ++--- .../size-tests/kernel-with-pimlico.js | 3 ++- .../size-tests/light-with-client.js | 5 ++--- .../size-tests/light-with-pimlico.js | 3 ++- .../size-tests/nexus-with-client.js | 5 ++--- .../size-tests/nexus-with-pimlico.js | 3 ++- .../size-tests/safe-with-client.js | 5 ++--- .../size-tests/safe-with-pimlico.js | 3 ++- .../size-tests/simple-with-client.js | 5 ++--- .../size-tests/simple-with-pimlico.js | 3 ++- .../size-tests/thirdweb-with-client.js | 5 ++--- .../size-tests/thirdweb-with-pimlico.js | 3 ++- .../size-tests/trust-with-client.js | 5 ++--- .../size-tests/trust-with-pimlico.js | 3 ++- 19 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.size-limit.json b/.size-limit.json index ec667c03..30fdba02 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -24,7 +24,7 @@ }, { "name": "Simple Account", - "path": "./packages/permissionless/_esm/accounts/simple/toSimpleSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/simple/index.js", "limit": "71 kB", "import": "{ toSimpleSmartAccount }" }, @@ -42,7 +42,7 @@ }, { "name": "Light Account", - "path": "./packages/permissionless/_esm/accounts/light/toLightSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/light/index.js", "limit": "69 kB", "import": "{ toLightSmartAccount }" }, @@ -60,7 +60,7 @@ }, { "name": "Safe Account", - "path": "./packages/permissionless/_esm/accounts/safe/toSafeSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/safe/index.js", "limit": "73 kB", "import": "{ toSafeSmartAccount }" }, @@ -78,7 +78,7 @@ }, { "name": "Kernel Account", - "path": "./packages/permissionless/_esm/accounts/kernel/toKernelSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/kernel/index.js", "limit": "96 kB", "import": "{ toKernelSmartAccount }" }, @@ -96,7 +96,7 @@ }, { "name": "Biconomy Account", - "path": "./packages/permissionless/_esm/accounts/biconomy/toBiconomySmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/biconomy/index.js", "limit": "70 kB", "import": "{ toBiconomySmartAccount }" }, @@ -114,7 +114,7 @@ }, { "name": "Trust Account", - "path": "./packages/permissionless/_esm/accounts/trust/toTrustSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/trust/index.js", "limit": "69 kB", "import": "{ toTrustSmartAccount }" }, @@ -132,7 +132,7 @@ }, { "name": "Etherspot Account", - "path": "./packages/permissionless/_esm/accounts/etherspot/toEtherspotSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/etherspot/index.js", "limit": "70 kB", "import": "{ toEtherspotSmartAccount }" }, @@ -150,7 +150,7 @@ }, { "name": "Nexus Account", - "path": "./packages/permissionless/_esm/accounts/nexus/toNexusSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/nexus/index.js", "limit": "69 kB", "import": "{ toNexusSmartAccount }" }, @@ -168,7 +168,7 @@ }, { "name": "Thirdweb Account", - "path": "./packages/permissionless/_esm/accounts/thirdweb/toThirdwebSmartAccount.js", + "path": "./packages/permissionless/_esm/accounts/thirdweb/index.js", "limit": "68 kB", "import": "{ toThirdwebSmartAccount }" }, diff --git a/packages/permissionless/size-tests/biconomy-with-client.js b/packages/permissionless/size-tests/biconomy-with-client.js index 68ada617..23d46622 100644 --- a/packages/permissionless/size-tests/biconomy-with-client.js +++ b/packages/permissionless/size-tests/biconomy-with-client.js @@ -1,3 +1,2 @@ -export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/toBiconomySmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/biconomy-with-pimlico.js b/packages/permissionless/size-tests/biconomy-with-pimlico.js index 761ec04b..4cd67821 100644 --- a/packages/permissionless/size-tests/biconomy-with-pimlico.js +++ b/packages/permissionless/size-tests/biconomy-with-pimlico.js @@ -1,2 +1,3 @@ -export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/toBiconomySmartAccount.js" +export { toBiconomySmartAccount } from "../_esm/accounts/biconomy/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/etherspot-with-client.js b/packages/permissionless/size-tests/etherspot-with-client.js index ecdcf76e..658c0563 100644 --- a/packages/permissionless/size-tests/etherspot-with-client.js +++ b/packages/permissionless/size-tests/etherspot-with-client.js @@ -1,3 +1,2 @@ -export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/toEtherspotSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/etherspot-with-pimlico.js b/packages/permissionless/size-tests/etherspot-with-pimlico.js index c601ebb6..d7791b95 100644 --- a/packages/permissionless/size-tests/etherspot-with-pimlico.js +++ b/packages/permissionless/size-tests/etherspot-with-pimlico.js @@ -1,2 +1,3 @@ -export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/toEtherspotSmartAccount.js" +export { toEtherspotSmartAccount } from "../_esm/accounts/etherspot/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/kernel-with-client.js b/packages/permissionless/size-tests/kernel-with-client.js index dbfac04c..d4785973 100644 --- a/packages/permissionless/size-tests/kernel-with-client.js +++ b/packages/permissionless/size-tests/kernel-with-client.js @@ -1,3 +1,2 @@ -export { toKernelSmartAccount } from "../_esm/accounts/kernel/toKernelSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toKernelSmartAccount } from "../_esm/accounts/kernel/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/kernel-with-pimlico.js b/packages/permissionless/size-tests/kernel-with-pimlico.js index 649d28d1..7edf3f01 100644 --- a/packages/permissionless/size-tests/kernel-with-pimlico.js +++ b/packages/permissionless/size-tests/kernel-with-pimlico.js @@ -1,2 +1,3 @@ -export { toKernelSmartAccount } from "../_esm/accounts/kernel/toKernelSmartAccount.js" +export { toKernelSmartAccount } from "../_esm/accounts/kernel/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/light-with-client.js b/packages/permissionless/size-tests/light-with-client.js index 903c4700..02c736ce 100644 --- a/packages/permissionless/size-tests/light-with-client.js +++ b/packages/permissionless/size-tests/light-with-client.js @@ -1,3 +1,2 @@ -export { toLightSmartAccount } from "../_esm/accounts/light/toLightSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toLightSmartAccount } from "../_esm/accounts/light/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/light-with-pimlico.js b/packages/permissionless/size-tests/light-with-pimlico.js index 792f0b4e..494e911e 100644 --- a/packages/permissionless/size-tests/light-with-pimlico.js +++ b/packages/permissionless/size-tests/light-with-pimlico.js @@ -1,2 +1,3 @@ -export { toLightSmartAccount } from "../_esm/accounts/light/toLightSmartAccount.js" +export { toLightSmartAccount } from "../_esm/accounts/light/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/nexus-with-client.js b/packages/permissionless/size-tests/nexus-with-client.js index 530b81c5..4bc29a76 100644 --- a/packages/permissionless/size-tests/nexus-with-client.js +++ b/packages/permissionless/size-tests/nexus-with-client.js @@ -1,3 +1,2 @@ -export { toNexusSmartAccount } from "../_esm/accounts/nexus/toNexusSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toNexusSmartAccount } from "../_esm/accounts/nexus/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/nexus-with-pimlico.js b/packages/permissionless/size-tests/nexus-with-pimlico.js index 01101ea7..84e38fc3 100644 --- a/packages/permissionless/size-tests/nexus-with-pimlico.js +++ b/packages/permissionless/size-tests/nexus-with-pimlico.js @@ -1,2 +1,3 @@ -export { toNexusSmartAccount } from "../_esm/accounts/nexus/toNexusSmartAccount.js" +export { toNexusSmartAccount } from "../_esm/accounts/nexus/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/safe-with-client.js b/packages/permissionless/size-tests/safe-with-client.js index 994616e4..de7e2dc5 100644 --- a/packages/permissionless/size-tests/safe-with-client.js +++ b/packages/permissionless/size-tests/safe-with-client.js @@ -1,3 +1,2 @@ -export { toSafeSmartAccount } from "../_esm/accounts/safe/toSafeSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toSafeSmartAccount } from "../_esm/accounts/safe/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/safe-with-pimlico.js b/packages/permissionless/size-tests/safe-with-pimlico.js index 7323023d..0c3b45b2 100644 --- a/packages/permissionless/size-tests/safe-with-pimlico.js +++ b/packages/permissionless/size-tests/safe-with-pimlico.js @@ -1,2 +1,3 @@ -export { toSafeSmartAccount } from "../_esm/accounts/safe/toSafeSmartAccount.js" +export { toSafeSmartAccount } from "../_esm/accounts/safe/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/simple-with-client.js b/packages/permissionless/size-tests/simple-with-client.js index deac1b28..ed0084ab 100644 --- a/packages/permissionless/size-tests/simple-with-client.js +++ b/packages/permissionless/size-tests/simple-with-client.js @@ -1,3 +1,2 @@ -export { toSimpleSmartAccount } from "../_esm/accounts/simple/toSimpleSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toSimpleSmartAccount } from "../_esm/accounts/simple/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/simple-with-pimlico.js b/packages/permissionless/size-tests/simple-with-pimlico.js index e5e96b36..6902d20d 100644 --- a/packages/permissionless/size-tests/simple-with-pimlico.js +++ b/packages/permissionless/size-tests/simple-with-pimlico.js @@ -1,2 +1,3 @@ -export { toSimpleSmartAccount } from "../_esm/accounts/simple/toSimpleSmartAccount.js" +export { toSimpleSmartAccount } from "../_esm/accounts/simple/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/thirdweb-with-client.js b/packages/permissionless/size-tests/thirdweb-with-client.js index 882834a1..3fcf8e5b 100644 --- a/packages/permissionless/size-tests/thirdweb-with-client.js +++ b/packages/permissionless/size-tests/thirdweb-with-client.js @@ -1,3 +1,2 @@ -export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/toThirdwebSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/thirdweb-with-pimlico.js b/packages/permissionless/size-tests/thirdweb-with-pimlico.js index b75c2584..fa636831 100644 --- a/packages/permissionless/size-tests/thirdweb-with-pimlico.js +++ b/packages/permissionless/size-tests/thirdweb-with-pimlico.js @@ -1,2 +1,3 @@ -export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/toThirdwebSmartAccount.js" +export { toThirdwebSmartAccount } from "../_esm/accounts/thirdweb/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" diff --git a/packages/permissionless/size-tests/trust-with-client.js b/packages/permissionless/size-tests/trust-with-client.js index 26b7893c..898c7007 100644 --- a/packages/permissionless/size-tests/trust-with-client.js +++ b/packages/permissionless/size-tests/trust-with-client.js @@ -1,3 +1,2 @@ -export { toTrustSmartAccount } from "../_esm/accounts/trust/toTrustSmartAccount.js" -export { createSmartAccountClient } from "../_esm/clients/createSmartAccountClient.js" -export { createPimlicoClient } from "../_esm/clients/pimlico.js" +export { toTrustSmartAccount } from "../_esm/accounts/trust/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" diff --git a/packages/permissionless/size-tests/trust-with-pimlico.js b/packages/permissionless/size-tests/trust-with-pimlico.js index 261895ca..7950bc45 100644 --- a/packages/permissionless/size-tests/trust-with-pimlico.js +++ b/packages/permissionless/size-tests/trust-with-pimlico.js @@ -1,2 +1,3 @@ -export { toTrustSmartAccount } from "../_esm/accounts/trust/toTrustSmartAccount.js" +export { toTrustSmartAccount } from "../_esm/accounts/trust/index.js" +export { createSmartAccountClient } from "../_esm/clients/index.js" export { createPimlicoClient } from "../_esm/clients/pimlico.js" From 1d4289f860d1c41dff42404c616d5e29995457d1 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Thu, 3 Jul 2025 17:15:39 +0100 Subject: [PATCH 4/6] Fix names --- .size-limit.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.size-limit.json b/.size-limit.json index 30fdba02..d4dd01d4 100644 --- a/.size-limit.json +++ b/.size-limit.json @@ -29,13 +29,13 @@ "import": "{ toSimpleSmartAccount }" }, { - "name": "Simple Account + Pimlico", + "name": "Simple Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/simple-with-pimlico.js", "limit": "79 kB", "import": "*" }, { - "name": "Simple Account + Client + Pimlico", + "name": "Simple Account + Client", "path": "./packages/permissionless/size-tests/simple-with-client.js", "limit": "80 kB", "import": "*" @@ -47,13 +47,13 @@ "import": "{ toLightSmartAccount }" }, { - "name": "Light Account + Pimlico", + "name": "Light Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/light-with-pimlico.js", "limit": "77 kB", "import": "*" }, { - "name": "Light Account + Client + Pimlico", + "name": "Light Account + Client", "path": "./packages/permissionless/size-tests/light-with-client.js", "limit": "78 kB", "import": "*" @@ -65,13 +65,13 @@ "import": "{ toSafeSmartAccount }" }, { - "name": "Safe Account + Pimlico", + "name": "Safe Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/safe-with-pimlico.js", "limit": "81 kB", "import": "*" }, { - "name": "Safe Account + Client + Pimlico", + "name": "Safe Account + Client", "path": "./packages/permissionless/size-tests/safe-with-client.js", "limit": "82 kB", "import": "*" @@ -83,13 +83,13 @@ "import": "{ toKernelSmartAccount }" }, { - "name": "Kernel Account + Pimlico", + "name": "Kernel Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/kernel-with-pimlico.js", "limit": "104 kB", "import": "*" }, { - "name": "Kernel Account + Client + Pimlico", + "name": "Kernel Account + Client", "path": "./packages/permissionless/size-tests/kernel-with-client.js", "limit": "105 kB", "import": "*" @@ -101,13 +101,13 @@ "import": "{ toBiconomySmartAccount }" }, { - "name": "Biconomy Account + Pimlico", + "name": "Biconomy Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/biconomy-with-pimlico.js", "limit": "78 kB", "import": "*" }, { - "name": "Biconomy Account + Client + Pimlico", + "name": "Biconomy Account + Client", "path": "./packages/permissionless/size-tests/biconomy-with-client.js", "limit": "79 kB", "import": "*" @@ -119,13 +119,13 @@ "import": "{ toTrustSmartAccount }" }, { - "name": "Trust Account + Pimlico", + "name": "Trust Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/trust-with-pimlico.js", "limit": "77 kB", "import": "*" }, { - "name": "Trust Account + Client + Pimlico", + "name": "Trust Account + Client", "path": "./packages/permissionless/size-tests/trust-with-client.js", "limit": "78 kB", "import": "*" @@ -137,13 +137,13 @@ "import": "{ toEtherspotSmartAccount }" }, { - "name": "Etherspot Account + Pimlico", + "name": "Etherspot Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/etherspot-with-pimlico.js", "limit": "78 kB", "import": "*" }, { - "name": "Etherspot Account + Client + Pimlico", + "name": "Etherspot Account + Client", "path": "./packages/permissionless/size-tests/etherspot-with-client.js", "limit": "79 kB", "import": "*" @@ -155,13 +155,13 @@ "import": "{ toNexusSmartAccount }" }, { - "name": "Nexus Account + Pimlico", + "name": "Nexus Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/nexus-with-pimlico.js", "limit": "77 kB", "import": "*" }, { - "name": "Nexus Account + Client + Pimlico", + "name": "Nexus Account + Client", "path": "./packages/permissionless/size-tests/nexus-with-client.js", "limit": "78 kB", "import": "*" @@ -173,13 +173,13 @@ "import": "{ toThirdwebSmartAccount }" }, { - "name": "Thirdweb Account + Pimlico", + "name": "Thirdweb Account + Client + Pimlico", "path": "./packages/permissionless/size-tests/thirdweb-with-pimlico.js", "limit": "76 kB", "import": "*" }, { - "name": "Thirdweb Account + Client + Pimlico", + "name": "Thirdweb Account + Client", "path": "./packages/permissionless/size-tests/thirdweb-with-client.js", "limit": "77 kB", "import": "*" From 269886844e058c7db832a165de284357472a62da Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Thu, 3 Jul 2025 17:28:53 +0100 Subject: [PATCH 5/6] Added changeset --- .changeset/giant-emus-know.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/giant-emus-know.md diff --git a/.changeset/giant-emus-know.md b/.changeset/giant-emus-know.md new file mode 100644 index 00000000..0fe64fb2 --- /dev/null +++ b/.changeset/giant-emus-know.md @@ -0,0 +1,5 @@ +--- +"permissionless": patch +--- + +Added tree shaking for individual accounts From e75c163511dbf096d6e301743a8dd7728140bb2d Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Fri, 4 Jul 2025 23:43:14 +0100 Subject: [PATCH 6/6] change scripts --- package.json | 26 +++++++++++++------------- packages/wagmi-demo/src/wagmi.ts | 2 ++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index df418cfc..e204df6f 100644 --- a/package.json +++ b/package.json @@ -48,19 +48,19 @@ "keywords": [], "license": "MIT", "scripts": { - "build": "bun run build:permissionless && bun run build:wagmi && bun run build:mock-paymaster", - "build:permissionless": "bun run clean:permissionless && bun run build:permissionless:cjs && bun run build:permissionless:esm && bun run build:permissionless:types", - "build:mock-paymaster": "bun run clean:mock-paymaster && bun run build:mock-paymaster:cjs && bun run build:mock-paymaster:esm && bun run build:mock-paymaster:types", - "build:wagmi": "bun run clean:wagmi && bun run build:wagmi:esm && bun run build:wagmi:types", - "build:permissionless:cjs": "tsc --project ./tsconfig/tsconfig.permissionless.cjs.json && tsc-alias -p ./tsconfig/tsconfig.permissionless.cjs.json && printf '{\"type\":\"commonjs\"}' > ./packages/permissionless/_cjs/package.json", - "build:permissionless:esm": "tsc --project ./tsconfig/tsconfig.permissionless.esm.json && tsc-alias -p ./tsconfig/tsconfig.permissionless.esm.json && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/permissionless/_esm/package.json", - "build:permissionless:types": "tsc --project ./tsconfig/tsconfig.permissionless.types.json && tsc-alias -p ./tsconfig/tsconfig.permissionless.types.json", - "build:wagmi:types": "tsc --project ./tsconfig/tsconfig.wagmi.types.json && tsc-alias -p ./tsconfig/tsconfig.wagmi.types.json", - "build:wagmi:esm": "tsc --project ./tsconfig/tsconfig.wagmi.esm.json && tsc-alias -p ./tsconfig/tsconfig.wagmi.esm.json && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/wagmi/_esm/package.json", - "build:mock-paymaster:cjs": "tsc --project ./tsconfig/tsconfig.mock-paymaster.cjs.json && tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.cjs.json && printf '{\"type\":\"commonjs\"}' > ./packages/mock-paymaster/_cjs/package.json", - "build:mock-paymaster:esm": "tsc --project ./tsconfig/tsconfig.mock-paymaster.esm.json && tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.esm.json && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/mock-paymaster/_esm/package.json", - "build:mock-paymaster:types": "tsc --project ./tsconfig/tsconfig.mock-paymaster.types.json && tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.types.json", - "clean": "bun run clean:permissionless && bun run clean:wagmi && bun run clean:mock-paymaster", + "build": "bun run build:permissionless & bun run build:wagmi & bun run build:mock-paymaster & wait", + "build:permissionless": "bun run clean:permissionless && (bun run build:permissionless:cjs & bun run build:permissionless:esm & bun run build:permissionless:types & wait)", + "build:mock-paymaster": "bun run clean:mock-paymaster && (bun run build:mock-paymaster:cjs & bun run build:mock-paymaster:esm & bun run build:mock-paymaster:types & wait)", + "build:wagmi": "bun run clean:wagmi && (bun run build:wagmi:esm & bun run build:wagmi:types & wait)", + "build:permissionless:cjs": "(tsc --project ./tsconfig/tsconfig.permissionless.cjs.json & tsc-alias -p ./tsconfig/tsconfig.permissionless.cjs.json & wait) && printf '{\"type\":\"commonjs\"}' > ./packages/permissionless/_cjs/package.json", + "build:permissionless:esm": "(tsc --project ./tsconfig/tsconfig.permissionless.esm.json & tsc-alias -p ./tsconfig/tsconfig.permissionless.esm.json & wait) && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/permissionless/_esm/package.json", + "build:permissionless:types": "(tsc --project ./tsconfig/tsconfig.permissionless.types.json & tsc-alias -p ./tsconfig/tsconfig.permissionless.types.json & wait)", + "build:wagmi:types": "(tsc --project ./tsconfig/tsconfig.wagmi.types.json & tsc-alias -p ./tsconfig/tsconfig.wagmi.types.json & wait)", + "build:wagmi:esm": "(tsc --project ./tsconfig/tsconfig.wagmi.esm.json & tsc-alias -p ./tsconfig/tsconfig.wagmi.esm.json & wait) && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/wagmi/_esm/package.json", + "build:mock-paymaster:cjs": "(tsc --project ./tsconfig/tsconfig.mock-paymaster.cjs.json & tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.cjs.json & wait) && printf '{\"type\":\"commonjs\"}' > ./packages/mock-paymaster/_cjs/package.json", + "build:mock-paymaster:esm": "(tsc --project ./tsconfig/tsconfig.mock-paymaster.esm.json & tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.esm.json & wait) && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./packages/mock-paymaster/_esm/package.json", + "build:mock-paymaster:types": "(tsc --project ./tsconfig/tsconfig.mock-paymaster.types.json & tsc-alias -p ./tsconfig/tsconfig.mock-paymaster.types.json)", + "clean": "bun run clean:permissionless & bun run clean:wagmi & bun run clean:mock-paymaster & wait", "clean:permissionless": "rimraf ./packages/permissionless/_esm ./packages/permissionless/_cjs ./packages/permissionless/_types", "clean:wagmi": "rimraf ./packages/wagmi/_esm ./packages/wagmi/_cjs ./packages/wagmi/_types", "clean:mock-paymaster": "rimraf ./packages/mock-paymaster/_esm ./packages/mock-paymaster/_cjs ./packages/mock-paymaster/_types", diff --git a/packages/wagmi-demo/src/wagmi.ts b/packages/wagmi-demo/src/wagmi.ts index 3e91eeaa..c3e1b34e 100644 --- a/packages/wagmi-demo/src/wagmi.ts +++ b/packages/wagmi-demo/src/wagmi.ts @@ -5,6 +5,8 @@ import { coinbaseWallet } from "wagmi/connectors" // TODO: Replace with your Pimlico API key // @ts-ignore +export const pimlicoApiKey = "" + export const config = createConfig({ chains: [sepolia], connectors: [