Compose SDK
The Compose SDK is a React-first TypeScript library for Account Abstraction (AA) that enables multi-chain atomic user operations. Built on top of ZeroDev Kernel V3.1, it provides React hooks and components for easily creating smart accounts and executing cross-chain transactions atomically in your React applications.
This SDK is currently under active development and testing. It is not recommended for production use at this time.
Installation
# Using npm
npm install @ssv-labs/compose-sdk
# Using yarn
yarn add @ssv-labs/compose-sdk
# Using pnpm
pnpm install @ssv-labs/compose-sdk
Peer Dependencies
The SDK requires the following peer dependencies:
npm install @wagmi/core wagmi viem @tanstack/react-query react
Quick Start
1. Setup Configuration
First, create your compose configuration:
// config.ts
import { createComposeConfig } from '@ssv-labs/compose-sdk';
import { createConfig, http } from '@wagmi/core';
import { createPublicClient, rpcSchema } from 'viem';
import { injected } from 'wagmi/connectors';
import { rollupA, rollupB, rollupsAccountAbstractionContracts } from '@ssv-labs/compose-sdk';
import type { ComposeRpcSchema } from '@ssv-labs/compose-sdk';
// Create wagmi config
export const wagmiConfig = createConfig({
chains: [rollupA, rollupB],
connectors: [injected()], // Required for wallet connection
client(parameters) {
return createPublicClient({
chain: parameters.chain,
transport: http(parameters.chain.rpcUrls.default.http[0]),
rpcSchema: rpcSchema<ComposeRpcSchema>()
});
}
});
// Create compose config
export const composeConfig = createComposeConfig({
wagmi: wagmiConfig,
accountAbstractionContracts: {
// Use predefined contracts
[rollupA.id]: rollupsAccountAbstractionContracts,
[rollupB.id]: rollupsAccountAbstractionContracts
// Or provide your own account abstraction contracts:
// [rollupA.id]: {
// kernelImpl: '0x...',
// kernelFactory: '0x...',
// multichainValidator: '0x...',
// metaFactory: '0x...'
// },
}
});
2. Setup React Providers
Wrap your app with the required providers:
// App.tsx
import { WagmiProvider } from 'wagmi';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ComposeProvider } from '@ssv-labs/compose-sdk/react';
import { wagmiConfig, composeConfig } from './config';
const queryClient = new QueryClient();
function App() {
return (
<WagmiProvider config={wagmiConfig}>
<QueryClientProvider client={queryClient}>
<ComposeProvider config={composeConfig as any}>
<YourApp />
</ComposeProvider>
</QueryClientProvider>
</WagmiProvider>
);
}
3. Use the Smart Account Hook
Use the useSmartAccount hook in your components:
// MyComponent.tsx
import { useSmartAccount } from '@ssv-labs/compose-sdk/react';
import { rollupA, rollupB } from '@ssv-labs/compose-sdk';
import { useAccount } from 'wagmi';
function MyComponent() {
const { isConnected } = useAccount();
// The hook returns a query object - access .data and .isLoading from it
// Note: multiChainIds is required for cross-chain functionality
const smartAccountQuery = useSmartAccount({
chainId: rollupA.id,
multiChainIds: [rollupA.id, rollupB.id],
});
if (!isConnected) {
return <div>Please connect your wallet</div>;
}
// Access isLoading from the query object
if (smartAccountQuery.isLoading) {
return <div>Creating smart account...</div>;
}
// Access the account address via data?.account.address
// The structure is: query.data.account.address (not query.data.address)
const smartAccountAddress = smartAccountQuery.data?.account?.address;
return (
<div>
<h2>Your Smart Account</h2>
{smartAccountAddress ? (
<p>Address: {smartAccountAddress}</p>
) : (
<p>No smart account found</p>
)}
</div>
);
}
Core Concepts
Configuration
The createComposeConfig function sets up the SDK with your wagmi configuration and account abstraction contracts. It requires:
- wagmi: Your wagmi config instance
- accountAbstractionContracts: A mapping of chain IDs to their account abstraction contract addresses
- getPaymasterEndpoint (optional): Function to get paymaster endpoint URLs for gasless transactions
React Hooks
The SDK provides React hooks for easy integration:
useComposeConfig: Access the compose configuration from contextuseSmartAccount: Create and access a smart account for a specific chain
### Paymaster Setup
To enable paymaster support, provide a `getPaymasterEndpoint` function:
```typescript
const composeConfig = createComposeConfig({
wagmi: wagmiConfig,
accountAbstractionContracts: {
/* ... */
},
getPaymasterEndpoint: ({ method, chainId }) => {
return `https://paymaster.example.com/${chainId}/${method}`;
}
});
The paymaster endpoint should support the following methods:
pm_sponsorUserOperationpm_getPaymasterStubDatapm_getPaymasterData
Chain Configuration
The SDK includes predefined chain configurations:
rollupA(Chain ID: 11113)rollupB(Chain ID: 22224)hoodi(Chain ID: 560048)
You can also use custom chains by defining them with viem's defineChain.