# @long-defi/sdk

> LongDeFi Smart Account SDK

Latest version **0.0.5** (published 2024-02-01) · 0 weekly downloads

## Install

```sh
npm install @long-defi/sdk
pnpm add @long-defi/sdk
yarn add @long-defi/sdk
bun add @long-defi/sdk
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.5 |
| Published | 2024-02-01 |
| First published | 2024-01-26 |
| Weekly downloads | 0 |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=20.0.0 |
| Dependencies | 2 |
| Unpacked size | 536.8 KB |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| GitHub stars | 0 |
| Author | LongDefi Foundation |
| Maintainers | kenzokker |
| Keywords | long-defi, smart-account, smart-account-sdk |

## Links

- npm: https://www.npmjs.com/package/@long-defi/sdk
- Repository: https://github.com/LongDefi-foundation/smart-account-sdk
- Homepage: https://github.com/LongDefi-foundation/smart-account-sdk#readme
- Issues: https://github.com/LongDefi-foundation/smart-account-sdk/issues
- npm.io page: https://npm.io/package/@long-defi/sdk

## Dependencies (2)

- [elliptic](https://npm.io/package/elliptic.md) ^6.5.4
- [@types/elliptic](https://npm.io/package/@types/elliptic.md) ^6.4.18

## Recent versions

- 0.0.5 (latest) — 2024-02-01
- 0.0.4 — 2024-02-01
- 0.0.3 — 2024-01-31
- 0.0.2 — 2024-01-26
- 0.0.1 — 2024-01-26

## README

# LongDefi Smart Account Sdk

## Installation

```bash
npm install @long-defi/sdk viem
```

## Supported Chains

- Sepolia

## Usage

### Exampe

- https://github.com/LongDefi-foundation/sdk-example

### Create `SmartAccountV1Provider` instance:

```typescript
import { SmartAccountV1Provider } from "@long-defi/sdk";

const smartAccountV1Provider = new SmartAccountV1Provider(publicClient);
```

### Create Session Key

```typescript
/**
 *  type CreateSessionKeyRequestOutput = {
 *    session: {
 *      privateKey: `0x${string}`;
 *      address: `0x${string}`;
 *    };
 *    request: TypedDataDefinition;
 *  }
 */

const data: CreateSessionKeyRequestOutput =
  await smartAccountProvider.createSessionKeyRequest(
    smartAccount,
    sessionNonce
  );

// Signing with `useSignTypedData()` hook (https://wagmi.sh/react/api/hooks/useSignTypedData)
const signature = await signTypedDataAsync(data.request);
```

### Create swap request with session key

```typescript
// Prerequisite: Smart account already deployed
const smartAccountSalt = BigInt(0);
const smartAccount = await getSmartAccountAddress(owner.address, smartAccountSalt);

// 1. Create session key and sign session key request
const sessionNonce: bigint = ...; // challenge from server
const { session, request } = await smartAccountV1Provider.createSessionKeyRequest(
  smartAccount,
  sessionNonce
);
const ownerSignature = await owner.signTypedData(sessionRequest);

// 2. Create swap request and sign with session key
const singlePathSwapInput = {
  tokenIn,
  tokenOut,
  fee: 3000,
  deadline: BigInt(2 ** 255),
  amountIn: BigInt(20),
  amountOutMinimum: BigInt(0),
};

/**
 * `orderSeparator` prevents nonce conflict.
 * It is useful when creating multiple orders
 * in one direction (buy/sell) within a single pool.
 */
const { userOpHash, request } = await smartAccountV1Provider.createSwapRequest({
  orderSeparatorId: 0, // optional, default is 0
  smartAccount,
  dex: "uniswapV3",
  swapInput: singlePathSwapInput,
  gasless: true,
});
const sessionSignature = signMessage({
  privateKey: session.privateKey,
  message: { raw: message },
});

// 3. Aggregate signatures on client side
const clientSignature = smartAccountV1Provider.aggregateClientSignatures(
  ownerSignature,
  sessionSignature,
  sessionNonce
);
const userOperation = { ...request, signature: clientSignature };

// ==========================================
// ===== Send `userOperation` to server =====
// ==========================================
const serverSignature = await bundler.signMessage({
  message: { raw: userOpHash },
});
const fullSignature = `0x${
  serverSignature.slice(2) + clientSignatures.slice(2)
}` as const;
userOperation.signature = fullSignature;
```

### Create swap request without session key

```typescript
const singlePathSwapInput = {
  tokenIn,
  tokenOut,
  fee: 3000,
  deadline: BigInt(2 ** 255),
  amountIn: BigInt(100),
  amountOutMinimum: BigInt(0),
} as const;

const { smartAccount, userOpHash, request } =
  await smartAccountV1Provider.createSwapRequest({
    smartAccount,
    dex: "uniswapV3",
    swapInput: singlePathSwapInput,
    gasless: true,
  });

const signature = await signMessage(config, {
  message: { raw: userOpHash },
});

const userOperation = { ...request, signature };
```

### Price Utils

```typescript
const publicClient = usePublicClient();

// The order of tokens is not important
const price = await convertSqrtX96toPrice(
  publicClient,
  [token0, token1],
  sqrtPriceX96
);

const sqrtX96 = await convertPriceToSqrtX96(
  publicClient,
  [token0, token1],
  price
);
```

---
_Source: https://npm.io/package/@long-defi/sdk · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
