https://github.com/bootnodedev/uni-dev-kit
UniDevKit is a lightweight, developer-focused TypeScript library for integrating Uniswap for real-time on-chain data
https://github.com/bootnodedev/uni-dev-kit
Last synced: 6 months ago
JSON representation
UniDevKit is a lightweight, developer-focused TypeScript library for integrating Uniswap for real-time on-chain data
- Host: GitHub
- URL: https://github.com/bootnodedev/uni-dev-kit
- Owner: BootNodeDev
- License: mit
- Created: 2025-05-13T15:41:03.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2025-06-11T20:18:12.000Z (7 months ago)
- Last Synced: 2025-07-03T02:07:59.121Z (7 months ago)
- Language: TypeScript
- Size: 683 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# uniswap-dev-kit
[](https://github.com/BootNodeDev/uni-dev-kit/actions/workflows/ci.yml)
[](https://github.com/BootNodeDev/uni-dev-kit/actions/workflows/release.yml)
[](https://bootnodedev.github.io/uni-dev-kit)
> Modern TypeScript SDK for integrating Uniswap V4 into your dapp.
> **Early version:** API may change rapidly.
A developer-friendly library for interacting with Uniswap V4 contracts. This library provides a simple and flexible interface for common operations like adding liquidity, swapping tokens, and managing positions.
## Features
- 🚀 Simple and intuitive API
- 🔄 Support for all major Uniswap V4 operations
- 💰 Native token support
- 🔒 Permit2 integration for gasless approvals
- 📊 Flexible liquidity management
- 🔍 Built-in quote simulation
- 🛠 TypeScript support
## Installation
```bash
npm install uniswap-dev-kit
# or
yarn add uniswap-dev-kit
```
## Quick Start
```ts
import { UniDevKitV4 } from 'uniswap-dev-kit';
const uniDevKit = new UniDevKitV4({
chainId: 1,
contracts: {
poolManager: "0x...",
positionManager: "0x...",
positionDescriptor: "0x...",
quoter: "0x...",
stateView: "0x...",
universalRouter: "0x..."
}
});
const pool = await uniDevKit.getPool({
tokens: ["0xTokenA", "0xTokenB"],
fee: 3000
});
const quote = await uniDevKit.getQuote({
pool,
amountIn: "1000000000000000000"
});
```
## Documentation
Full API documentation with TypeDoc: [https://bootnodedev.github.io/uni-dev-kit](https://bootnodedev.github.io/uni-dev-kit)
## API Reference
### Index
- [uniswap-dev-kit](#uniswap-dev-kit)
- [Features](#features)
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Documentation](#documentation)
- [API Reference](#api-reference)
- [Index](#index)
- [`getPool`](#getpool)
- [`getQuote`](#getquote)
- [`getTokens`](#gettokens)
- [`getPosition`](#getposition)
- [`getPoolKeyFromPoolId`](#getpoolkeyfrompoolid)
- [`buildSwapCallData`](#buildswapcalldata)
- [`buildAddLiquidityCallData`](#buildaddliquiditycalldata)
- [`preparePermit2BatchCallData`](#preparepermit2batchcalldata)
- [`buildRemoveLiquidityCallData`](#buildremoveliquiditycalldata)
- [Basis Points Reference](#basis-points-reference)
- [Useful Links](#useful-links)
- [Development](#development)
- [Scripts](#scripts)
- [Contributing](#contributing)
- [Release](#release)
- [License](#license)
### `getPool`
Retrieve a pool object from two tokens and a fee tier.
```ts
const pool = await uniDevKit.getPool({
tokens: [tokenA, tokenB],
fee: 3000
});
```
### `getQuote`
Simulate a swap to get `amountOut` and `sqrtPriceLimitX96`.
```ts
const quote = await uniDevKit.getQuote({
pool,
amountIn: "1000000000000000000"
});
```
### `getTokens`
Retrieve token metadata.
```ts
const tokens = await uniDevKit.getTokens({
addresses: ["0x...", "0x..."]
});
```
### `getPosition`
Get details about a Uniswap V4 LP position.
```ts
const position = await uniDevKit.getPosition({
tokenId: 123
});
```
### `getPoolKeyFromPoolId`
Retrieve the `PoolKey` object for a given pool ID.
```ts
const poolKey = await uniDevKit.getPoolKeyFromPoolId({
poolId: "0x..."
});
```
### `buildSwapCallData`
Construct calldata for a Universal Router swap.
```ts
// Basic swap
const { calldata, value } = await uniDevKit.buildSwapCallData({
tokenIn: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC
amountIn: parseUnits("100", 6), // 100 USDC
pool: pool,
slippageTolerance: 50, // 0.5%
recipient: "0x..."
});
// Swap with permit2
const permitData = await uniDevKit.preparePermit2Data({
token: tokenIn,
spender: uniDevKit.getContractAddress('universalRouter'),
owner: userAddress
});
const signature = await signer._signTypedData(
permitData.toSign.domain,
{ PermitSingle: permitData.toSign.types.PermitSingle },
permitData.toSign.values
);
const permitWithSignature = permitData.buildPermit2DataWithSignature(signature);
const { calldata, value } = await uniDevKit.buildSwapCallData({
tokenIn,
amountIn,
pool,
slippageTolerance: 50,
recipient,
permit2Signature: permitWithSignature
});
```
### `buildAddLiquidityCallData`
Build calldata to add liquidity to a pool.
```ts
// Without permit
const { calldata, value } = await uniDevKit.buildAddLiquidityCallData({
pool,
amount0: "100000000",
amount1: "50000000000000000",
recipient: "0x...",
slippageTolerance: 50
});
// With Permit2 batch approval
const permitData = await uniDevKit.preparePermit2BatchData({
tokens: [pool.token0.address, pool.token1.address],
spender: uniDevKit.getContractAddress('positionManager'),
owner: userAddress
});
const signature = await signer.signTypedData(
permitData.toSign.domain,
permitData.toSign.types,
permitData.toSign.values
);
const permitWithSignature = permitData.buildPermit2BatchDataWithSignature(signature);
const { calldata, value } = await uniDevKit.buildAddLiquidityCallData({
pool,
amount0: parseUnits("100", 6),
recipient: "0x...",
permit2BatchSignature: permitWithSignature
});
const tx = await sendTransaction({
to: uniDevKit.getContractAddress('positionManager'),
data: calldata,
value
});
```
### `preparePermit2BatchCallData`
Construct a Permit2 batch approval for gasless interactions.
```ts
const permitData = await uniDevKit.preparePermit2BatchCallData({
tokens: [tokenA.address, tokenB.address],
spender: uniDevKit.getContractAddress('positionManager'),
owner: userAddress
});
```
### `buildRemoveLiquidityCallData`
Build calldata to remove liquidity from a pool.
```ts
const { calldata, value } = await uniDevKit.buildRemoveLiquidityCallData({
liquidityPercentage: 10_000, // 100%
tokenId: '123',
slippageTolerance: 50, // 0.5%
});
const tx = await sendTransaction({
to: uniDevKit.getContractAddress('positionManager'),
data: calldata,
value
});
```
#### Basis Points Reference
Throughout the library, percentages are represented in basis points (bps). For example, when setting a slippage tolerance of 0.5%, you would use `50` bps. Here's a quick reference:
| Basis Points (bps) | Fraction | Percentage |
|:------------------:|:--------:|:----------:|
| 1 | 1/10_000 | 0.01% |
| 10 | 10/10_000 | 0.1% |
| 100 | 100/10_000 | 1% |
| 500 | 500/10_000 | 5% |
| 1000 | 1000/10_000 | 10% |
| 10_000 | 10_000/10_000 | 100% |
## Useful Links
- [Uniswap V4 Docs](https://docs.uniswap.org/contracts/v4/overview)
## Development
### Scripts
- `pnpm build` — Build the library
- `pnpm test` — Run all tests
- `pnpm lint` — Lint code with Biome
- `pnpm format` — Format code with Biome
- `pnpm docs` — Generate API docs with TypeDoc
## Contributing
See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
## Release
- Releases are automated with [semantic-release](https://semantic-release.gitbook.io/semantic-release/).
## License
MIT