# TypeScript SDK

## Getting Started

The [VirtuSwap SDK](https://github.com/Virtuswap/v1-sdk) [npm package](https://www.npmjs.com/package/@virtuswap/v1-sdk) provides access to the VirtuSwap API and can be used to find and execute trading routes on supported chains.

To get started, install the latest version of the VirtuSwap SDK:

```bash
npm install @virtuswap/v1-sdk
```

## Quick Start

Firstly, create a new `Router` instance:

```typescript
import { Router } from '@virtuswap/v1-sdk';

const router = new Router();
```

Now you can request a route:

```typescript
const chain = 137; // Polygon (Mainnet)
const tokenIn = '0x0000000000000000000000000000000000000000'; // use zero address for native token (ETH, POL (MATIC), etc.)
const tokenOut = '0x57999936fC9A9EC0751a8D146CcE11901Be8beD0'; // VRSW on Polygon
const amount = '5000000000000000000'; // 5 POL (MATIC)

const route = await router.getRoute(tokenIn, tokenOut, amount, chain, { isExactInput: true });
```

The received `Route` object can be used to visualize the trading route steps, generate transaction data or execute the route.

The latest versions of SDK support routers of versions 3 ([vRouter 1.3](https://docs.virtuswap.io/virtuswap-documentation/technical-reference/smart-contracts-v1/dex-contracts/vrouter-1.3), **preferable**) and 2 ([vRouter 1.2](https://docs.virtuswap.io/virtuswap-documentation/technical-reference/smart-contracts-v1/dex-contracts/vrouter-1.2)).

{% tabs %}
{% tab title="V3-Specific Methods" %}
A `TransactionRequest` object can be created using the `generateTransactionDataV3` method:

```typescript
// userAddress is the address that will receive tokens from the vRouter
const txRequest = router.generateTransactionDataV3(route, userAddress);
```

This object can be transferred to client and used to send a transaction using ethers.js v5:

```typescript
// signer is the wallet that will send the transaction to the vRouter
const tx = await signer.sendTransaction(txRequest);
await tx.wait();
```

You can also prepare the multiswap data and execute the multiswap:

```typescript
// userAddress is the address that will receive tokens from the vRouter
const multiSwapData = router.generateMultiSwapDataV3(route, userAddress);

// amount of native tokens to send
const value = route.tokenIn.isNative ? route.isExactInput ? route.tokenIn.balanceBN : route.slippageThresholdAmount.balanceBN : undefined;

// signer is the wallet that will send the transaction to the vRouter
const tx = await router.executeMultiSwapV3(route.chain, multiSwapData, signer, value);
await tx.wait();
```

{% endtab %}

{% tab title="V2-Specific Methods" %}
A `TransactionRequest` object can be created using the `generateTransactionDataV2` method:

```typescript
// userAddress is the address that will receive tokens from the vRouter
const txRequest = router.generateTransactionDataV2(route, userAddress);
```

This object can be transferred to client and used to send a transaction using ethers.js v5:

```typescript
// signer is the wallet that will send the transaction to the vRouter
const tx = await signer.sendTransaction(txRequest);
await tx.wait();
```

You can also prepare the multicall data and execute the multicall:

```typescript
// userAddress is the address that will receive tokens from the vRouter
const multicallData = router.generateMulticallDataV2(route, userAddress);

// amount of native tokens to send
const value = route.tokenIn.isNative ? route.isExactInput ? route.tokenIn.balanceBN : route.slippageThresholdAmount.balanceBN : undefined;

// signer is the wallet that will send the transaction to the vRouter
const tx = await router.executeMulticallV2(route.chain, multicallData, signer, value);
await tx.wait();
```

{% endtab %}
{% endtabs %}

## Complete Examples

You can check out our complete examples in the following repositories:

{% embed url="<https://github.com/Virtuswap/v1-sdk-backend-example>" %}
Backend integration example
{% endembed %}

{% embed url="<https://github.com/Virtuswap/v1-sdk-frontend-example>" %}
Frontend integration example
{% endembed %}
