EIP-1193 is a standard interface for Ethereum providers, such as MetaMask or hardware wallets, where the key material is hosted externally rather than on the local client.
Copy import {
createComethPaymasterClient,
createSafeSmartAccount,
createSmartAccountClient,
providerToSmartAccountSigner
} from "@cometh/connect-sdk-4337";
import { type Hex, type PublicClient, createPublicClient, http } from "viem";
import { arbitrumSepolia } from "viem/chains";
const apiKey = process.env.COMETH_API_KEY;
const bundlerUrl = process.env.4337_BUNDLER_URL;
const paymasterUrl = process.env.NEXT_PUBLIC_4337_PAYMASTER_URL;
const signer = await providerToSmartAccountSigner(
window.ethereum
);
const publicClient = createPublicClient({
chain: arbitrumSepolia,
transport: http(),
cacheTime: 60_000,
batch: {
multicall: { wait: 50 },
},
}) as PublicClient;
const smartAccount = await createSafeSmartAccount({
apiKey,
signer,
chain: arbitrumSepolia,
publicClient,
smartAccountAddress //if smart account already exists
});
const walletAddress = smartAccount.address
const paymasterClient = await createComethPaymasterClient({
transport: http(paymasterUrl),
chain: arbitrumSepolia,
publicClient,
});
const smartAccountClient = createSmartAccountClient({
account: smartAccount,
chain: arbitrumSepolia,
bundlerTransport: http(bundlerUrl, {
retryCount: 5,
retryDelay: 1000,
timeout: 20_000,
}),
paymaster: paymasterClient,
userOperation: {
estimateFeesPerGas: async () => {
return await paymasterClient.getUserOperationGasPrice();
},
},
});
Copy import {
createComethPaymasterClient,
createSafeSmartAccount,
createSmartAccountClient,
providerToSmartAccountSigner
} from "@cometh/connect-sdk-4337";
import { type Hex, type PublicClient, createPublicClient, http } from "viem";
import { arbitrumSepolia } from "viem/chains";
const apiKey = process.env.COMETH_API_KEY;
const bundlerUrl = process.env.4337_BUNDLER_URL;
const paymasterUrl = process.env.NEXT_PUBLIC_4337_PAYMASTER_URL;
const signer = walletClientToSmartAccountSigner(walletClient);
const publicClient = createPublicClient({
chain: arbitrumSepolia,
transport: http(),
cacheTime: 60_000,
batch: {
multicall: { wait: 50 },
},
}) as PublicClient;
const smartAccount = await createSafeSmartAccount({
apiKey,
signer,
chain: arbitrumSepolia,
publicClient,
smartAccountAddress //if smart account already exists
});
const walletAddress = smartAccount.address
const paymasterClient = await createComethPaymasterClient({
transport: http(paymasterUrl),
chain: arbitrumSepolia,
publicClient,
});
const smartAccountClient = createSmartAccountClient({
account: smartAccount,
chain: arbitrumSepolia,
bundlerTransport: http(bundlerUrl, {
retryCount: 5,
retryDelay: 1000,
timeout: 20_000,
}),
paymaster: paymasterClient,
userOperation: {
estimateFeesPerGas: async () => {
return await paymasterClient.getUserOperationGasPrice();
},
},
});