# Cometh Connect SDK

This SDK help any dApps to get a smoother UX for your end-users (control a wallet with biometrics, pay for his gas fees, social recovery...)

## Installation

```bash
bun add viem @cometh/connect-sdk-4337
```

## Setup

```ts
import { createComethPaymasterClient, createSafeSmartAccount, createSmartAccountClient } from "@cometh/connect-sdk-4337";
import { arbitrumSepolia } from "viem/chains";
import { http } from "viem";

const apiKey = process.env.NEXT_PUBLIC_COMETH_API_KEY;
const bundlerUrl = process.env.NEXT_PUBLIC_4337_BUNDLER_URL;

const smartAccount = await createSafeSmartAccount({
    apiKey,
    entryPoint: ENTRYPOINT_ADDRESS_V07 ,
})

const paymasterClient = await createComethPaymasterClient({
    transport: http(paymasterUrl),
    chain,
})

 const smartAccountClient = createSmartAccountClient({
    account: smartAccount,
    chain,
    bundlerTransport: http(bundlerUrl),
    paymaster: paymasterClient,
    userOperation: {
        estimateFeesPerGas: async () => {
            return await paymasterClient.getUserOperationGasPrice();
        },
    }
})

```

## Send transaction

```ts
import { smartAccountClient } from "./client";
import countContractAbi from "../contract/counterABI.json";

const calldata = encodeFunctionData({
    abi: countContractAbi,
    functionName: "count",
});
  
const txHash =  await smartAccount.sendTransaction({
    to: COUNTER_CONTRACT_ADDRESS,
    data: calldata,
});

```

## Send batch transactions

```ts
import { smartAccountClient } from "./client";
import countContractAbi from "../contract/counterABI.json";

const calldata = encodeFunctionData({
    abi: countContractAbi,
    functionName: "count",
});
  
const txHash =  await smartAccount.sendTransactions({
    calls: [
        {
        to: COUNTER_CONTRACT_ADDRESS,
        data: calldata,
        },
        {
        to: COUNTER_CONTRACT_ADDRESS,
        data: calldata,
        },
    ],
});

```

## Handle owners

```ts
import { smartAccountClient } from "./client";

// get owners
const owners = await smartAccountClient.getOwners()

// get enriched owners (with passkey credentials)
const enrichedOwners = await smartAccountClient.getEnrichedOwners()

// add a new owner
await smartAccountClient.addOwner({ownerToAdd:OWNER_ADDRESS_TO_ADD})

// remove an owner
await smartAccountClient.removeOwner({ownerToRemove:OWNER_ADDRESS_TO_REMOVE})

```


