npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@scalingparrots/uniswap-smart-routing

v0.2.24

Published

Integrate Uniswap V3 protocol for StableComp Contracts

Downloads

188

Readme

Uniswap Smart Routing for OneClick 🔁

This repository contains routing logic for integrate Uniswap V3 protocol for StableComp Contracts.

It searches for the most efficient way to swap token A for token B, considering splitting swaps across multiple routes, gas costs and format all the data needed to call the OneClickV3 contract.

Testing

First make sure you have run npm install.

npm run test

CLI

The package can be run as a CLI for testing purposes.

First create a .env file in the root of the project and configure:

RPC_URL = '<RPC_URL>'

Installation

npm i @scalingparrots/uniswap-smart-routing

Usage

Function

import {
  OneClickInV3,
  EstimateOneClickInV3,
  OneClickOutV3,
} from "@scalingparrots/uniswap-smart-routing";

Type

import {
  OneClickInSmartRouting,
  OneClickInContract,
  EstimateOneClickInContract,
  OneClickOutSmartRouting,
  OneClickOutContract,
} from "@scalingparrots/uniswap-smart-routing";

OneClickV3 Contract

OneClickInETH

    function OneClickInETH(
        address[][] memory _routev2,
        bytes[] memory _routev3,
        address _poolAddress,
        address _tokenAddress,
        address[] memory _poolTokens,
        address _vault,
        uint256 _crvSlippage,
        bool _oneToken,
        uint256 _indexIn
    ) external payable nonReentrant

| Name | Type | | | -------------- | ------- | ----------------------------------------------------------------------------------------- | | _routev2 | address | The routing of UniswapV2 for the swap | | _routev3 | bytes | The routing of UniswapV3 for the swap | | _poolAddress | address | Curve pool address | | _tokenAddress | address | Curve token address | | _poolTokens | address | Curve tokens in the pool | | _vault | address | StablecompVault address | | _crvSlippage | uint256 | Slippage for Curve deposit | | _oneToken | bool | Invest in all tokens or in a one of specified index. False = all tokens, True = one token | | _indexIn | uint256 | Index of the specified to invest |

OneClickIn

    function OneClickIn(
        address[][] memory _routev2,
        bytes[] memory _routev3,
        address _tokenIn,
        address _poolAddress,
        address _tokenAddress,
        address[] memory _poolTokens,
        address _vault,
        uint256 _amountIn,
        uint256 _crvSlippage,
        bool _oneToken,
        uint256 _indexIn
    ) external nonReentrant

| Name | Type | | | -------------- | ------- | ----------------------------------------------------------------------------------------- | | _routev2 | address | The routing of UniswapV2 for the swap | | _routev3 | bytes | The routing of UniswapV3 for the swap | | _tokenIn | address | The token in to deposit | | _poolAddress | address | Curve pool address | | _tokenAddress | address | Curve token address | | _poolTokens | address | Curve tokens in the pool | | _vault | address | StablecompVault address | | _amountIn | uint256 | Amount of token in to swap or deposit | | _crvSlippage | uint256 | Slippage for Curve deposit | | _oneToken | bool | Invest in all tokens or in a one of specified index. False = all tokens, True = one token | | _indexIn | uint256 | Index of the specified to invest |

OneClickOutETH

    function OneClickOutETH(
        address[][] memory _routev2,
        bytes[] memory _routev3,
        address _poolAddress,
        address _tokenAddress,
        address[] memory _poolTokens,
        address _vault,
        uint256 _amountOut
    ) external nonReentrant

| Name | Type | | | -------------- | ------- | ------------------------------------- | | _routev2 | address | The routing of UniswapV2 for the swap | | _routev3 | bytes | The routing of UniswapV3 for the swap | | _poolAddress | address | Curve pool address | | _tokenAddress | address | Curve token address | | _poolTokens | address | Curve tokens in the pool | | _vault | address | StablecompVault address | | _amountOut | uint256 | Amount of token to remove |

OneClickOut

    function OneClickOut(
        address[][] memory _routev2,
        bytes[] memory _routev3,
        address _poolAddress,
        address _tokenAddress,
        address[] memory _poolTokens,
        address _vault,
        address _tokenOut,
        uint256 _amountOut
    ) external nonReentrant

| Name | Type | | | -------------- | ------- | ------------------------------------- | | _routev2 | address | The routing of UniswapV2 for the swap | | _routev3 | bytes | The routing of UniswapV3 for the swap | | _poolAddress | address | Curve pool address | | _tokenAddress | address | Curve token address | | _poolTokens | address | Curve tokens in the pool | | _vault | address | StablecompVault address | | _tokenOut | address | Token we want to get out | | _amountOut | uint256 | Amount of token to remove |

estimateOneClickIn

    function estimateOneClickIn(
        address _tokenIn,
        address _poolAddress,
        address[] memory _poolTokens,
        uint256[] memory _priceTokensIn,
        address _vault,
        uint256 _amountIn,
        uint256 _crvSlippage,
        bool _oneToken,
        uint256 _indexIn
    ) external view returns (uint256 amountTokenOut)

| Name | Type | | | --------------- | ------- | ----------------------------------------------------------------------------------------- | | _tokenIn | address | The token in to deposit | | _poolAddress | address | Curve pool address | | _poolTokens | address | Curve token address | | _priceTokensIn | uint256 | Curve tokens price vs tokenIn | | _vault | address | StablecompVault address | | _amountIn | uint256 | Amount of token to deposit | | _crvSlippage | uint256 | Slippage for Curve deposit | | _oneToken | bool | Invest in all tokens or in a one of specified index. False = all tokens, True = one token | | _indexIn | uint256 | Index of the specified to invest |

estimateOneClickOut

    function estimateOneClickOut(
        address _poolAddress,
        address _tokenAddress,
        address[] memory _poolTokens,
        address _vault,
        address _tokenOut,
        uint256[] memory _priceTokens,
        uint256 _amountOut
    ) external view returns (uint256 amountTokenOut)

| Name | Type | | | -------------- | ------- | -------------------------------------- | | _poolAddress | address | Curve pool address | | _tokenAddress | address | Curve token address | | _poolTokens | address | Curve tokens in the pool | | _vault | address | StablecompVault address | | _tokenOut | address | Address of the token to withdraw | | _priceTokens | uint256 | Prices of the tokens in the Curve pool | | _amountOut | uint256 | Amount of share to withdraw |

Uniswap Smart Routing for OneClick 🔁

Function

import {
  OneClickInV3,
  EstimateOneClickInV3,
  OneClickOutV3,
} from "@scalingparrots/uniswap-smart-routing";

Type

import type {
  OneClickInSmartRouting,
  OneClickInContract,
  EstimateOneClickInContract,
  OneClickOutSmartRouting,
  OneClickOutContract,
} from "@scalingparrots/uniswap-smart-routing";

OneClickInV3()

OneClickInV3 returns data formatted to call the OneClickIn & OneClickInETH function.

Input

interface OneClickInSmartRouting {
  chainId: ChainId;
  provider: JsonRpcProvider;
  tokenIn: string;
  amountIn: string;
  vault: string;
  crvSlippage: number;
  oneToken: boolean;
  indexIn: number;
}

| Name | Type | | | ----------- | --------------- | ----------------------------------------------------------------------------------------- | | chainId | ChainId | The Chain Id of the Blockchain used | | provider | JsonRpcProvider | RPC providers | | tokenIn | string | The address of the tokenIn | | amountIn | string | The amount of tokenIn you want to deposit | | vault | string | StablecompVault address | | crvSlippage | number | Slippage for Curve deposit | | oneToken | boolean | Invest in all tokens or in a one of specified index. False = all tokens, True = one token | | indexIn | number | Index of the specified to invest. |

All amounts and slippages must be input in decimal format, they will be converted to BigNumber by the library.

Output

interface OneClickInContract {
  routev2: string[][];
  routev3: string[];
  tokenIn: string;
  poolAddress: string;
  tokenAddress: string;
  poolTokens: string[];
  vault: string;
  amountIn: string;
  crvSlippage: number;
  oneToken: boolean;
  indexIn: number;
}

| Name | Type | | | ------------ | ---------- | ---------------------------------------------------- | | routeV2 | string[][] | The routing of UniswapV2 for the swap | | routeV3 | string[] | The bytes to routing in UniswapV3 | | tokenIn | string | The address of the tokenIn | | poolAddress | string | Curve pool address | | tokenAddress | string | Curve token address | | poolTokens | string[] | Curve tokens in the pool | | vault | string | StablecompVault address | | amountIn | string | Amount of token in to swap or deposit | | crvSlippage | number | Slippage for Curve deposit | | oneToken | boolean | Invest in all tokens or in a one of specified index. | | indexIn | number | Index of the specified to invest. |

EstimateOneClickInV3()

estimateOneClickInV3 returns data formatted to call the estimateOneClickIn function.

Input

interface OneClickInSmartRouting {
  chainId: ChainId;
  provider: JsonRpcProvider;
  tokenIn: string;
  amountIn: string;
  vault: string;
  crvSlippage: number;
  oneToken: boolean;
  indexIn: number;
}

| Name | Type | | | ----------- | --------------- | ----------------------------------------------------------------------------------------- | | chainId | ChainId | The Chain Id of the Blockchain used | | provider | JsonRpcProvider | RPC providers | | tokenIn | string | The address of the tokenIn | | amountIn | string | The amount of tokenIn you want to deposit | | vault | string | StablecompVault address | | crvSlippage | number | Slippage for Curve deposit | | oneToken | boolean | Invest in all tokens or in a one of specified index. False = all tokens, True = one token | | indexIn | number | Index of the specified to invest. |

All amounts and slippages must be input in decimal format, they will be converted to BigNumber by the library.

Output

interface EstimateOneClickInContract {
  tokenIn: string;
  poolAddress: string;
  poolTokens: string[];
  priceTokenIn: string[];
  vault: string;
  amountIn: string;
  crvSlippage: number;
  oneToken: boolean;
  indexIn: number;
}

| Name | Type | | | ------------ | -------- | ---------------------------------------------------- | | tokenIn | string | Address of token in to deposit | | poolAddress | string | Curve pool address | | poolTokens | string[] | Curve tokens in the pool | | priceTokenIn | string[] | Curve tokens price vs tokenIn | | vault | string | StablecompVault address | | amountIn | string | Amount of token in to swap or deposit | | crvSlippage | number | Slippage for Curve deposit | | oneToken | boolean | Invest in all tokens or in a one of specified index. | | indexIn | number | Index of the specified to invest. |

OneClickOutV3()

OneClickOutV3 returns data formatted to call the OneClickOut & OneClickOutETH function.

Input

interface OneClickOutSmartRouting {
  chainId: ChainId;
  provider: JsonRpcProvider;
  tokenOut: string;
  amountOut: string;
  vault: string;
}

| Name | Type | | | --------- | --------------- | ----------------------------------- | | chainId | ChainId | The Chain Id of the Blockchain used | | provider | JsonRpcProvider | RPC providers | | tokenOut | string | Address of token we want to get out | | amountOut | string | Amount of token to remove | | vault | string | StablecompVault address |

All amounts and slippages must be input in decimal format, they will be converted to BigNumber by the library.

Output

interface OneClickOutContract {
  routev2: string[][];
  routev3: string[];
  poolAddress: string;
  tokenAddress: string;
  poolTokens: string[];
  vault: string;
  tokenOut: string;
  amountOut: string;
}

| Name | Type | | | ------------ | ---------- | ------------------------------------- | | routeV2 | string[][] | The routing of UniswapV2 for the swap | | routeV3 | string[] | The bytes to routing in UniswapV3 | | poolAddress | string | Curve pool address | | tokenAddress | string | Curve token address | | poolTokens | string[] | Curve tokens in the pool | | vault | string | StablecompVault address | | tokenOut | string | Address of token we want to get out | | amountOut | number | Amount of token to remove |

EstimateOneClickOut()

estimateOneClickInV3 returns data formatted to call the estimateOneClickOut function.

Input

interface OneClickOutSmartRouting {
  chainId: ChainId;
  provider: JsonRpcProvider;
  tokenOut: string;
  amountOut: string;
  vault: string;
}

| Name | Type | | | --------- | --------------- | ----------------------------------- | | chainId | ChainId | The Chain Id of the Blockchain used | | provider | JsonRpcProvider | RPC providers | | tokenOut | string | Address of token we want to get out | | amountOut | string | Amount of token to remove | | vault | string | StablecompVault address |

All amounts and slippages must be input in decimal format, they will be converted to BigNumber by the library.

Output

interface EstimateOneClickOutContract {
  poolAddress: string;
  tokenAddress: string;
  poolTokens: string[];
  vault: string;
  tokenOut: string;
  priceToken: string[];
  amountOut: string;
}

| Name | Type | | | ------------ | -------- | -------------------------------------- | | poolAddress | string | Curve pool address | | tokenAddress | string | Curve token address | | poolTokens | string[] | Curve tokens in the pool | | vault | string | StablecompVault address | | tokenOut | string | Address of token we want to get out | | priceToken | string[] | Prices of the tokens in the Curve pool | | amountOut | number | Amount of token to remove |

Exemple

const vault = "0x3f0d8746d07e7b60974Bbb1F275CD61B071d69D5";
const chainId = 1;
const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL);
const token = "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599"; //WBTC
const amount = "0.1";
const amountOut = "2500";
const crvSlippage = 0.1;
const oneToken = false;
const indexIn = 0;

const estimateOneClickIn = await estimateOneClickInV3({
  chainId,
  provider,
  token,
  amount,
  vault,
  crvSlippage,
  oneToken,
  indexIn,
});

const oneClickInV3 = await OneClickInV3({
  chainId,
  provider,
  token,
  amount,
  vault,
  crvSlippage,
  oneToken,
  indexIn,
});

const oneClickOutV3 = await OneClickOutV3({
  chainId,
  provider,
  token,
  amountOut,
  vault,
});

const estimateOneClickOut = await EstimateOneClickOut({
  chainId,
  provider,
  tokenOut,
  amountOut,
  vault,
});

Return

      estimateOneClickIn: {
        "tokenIn": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
        "poolAddress": "0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2",
        "poolTokens": [
          "0x853d955aCEf822Db058eb8505911ED77F175b99e",
          "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
        ],
        "priceTokenIn": [
          "1175306013499988321881",
          "1174932005"
        ],
        "vault": "0x3f0d8746d07e7b60974Bbb1F275CD61B071d69D5",
        "amountIn": "10000000",
        "crvSlippage": 10,
        "oneToken": false,
        "indexIn": 0
      }

      oneClickInV3: {
        "routev2": [],
        "routev3": [
          "0x2260fac5e5542a773aa44fbcfedf7c193bc2c5990001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000064853d955acef822db058eb8505911ed77f175b99e",
          "0x2260fac5e5542a773aa44fbcfedf7c193bc2c5990001f4a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
        ],
        "tokenIn": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
        "poolAddress": "0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2",
        "tokenAddress": "0x3175Df0976dFA876431C2E9eE6Bc45b65d3473CC",
        "poolTokens": [
          "0x853d955aCEf822Db058eb8505911ED77F175b99e",
          "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
        ],
        "vault": "0x3f0d8746d07e7b60974Bbb1F275CD61B071d69D5",
        "amountIn": "10000000",
        "crvSlippage": 10,
        "oneToken": false,
        "indexIn": 0
      }

      estimateOneClickOut: {
        "poolAddress": "0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2",
        "tokenAddress": "0x3175Df0976dFA876431C2E9eE6Bc45b65d3473CC",
        "poolTokens": [
          "0x853d955aCEf822Db058eb8505911ED77F175b99e",
          "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
        ],
        "vault": "0x3f0d8746d07e7b60974Bbb1F275CD61B071d69D5",
        "tokenOut": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
        "priceToken": [
          "5338154",
          "5341338"
        ],
        "amountOut": "2500000000000000000000"
      }

      oneClickOutV3: {
        "routev2": [],
        "routev3": [
          "0x853d955acef822db058eb8505911ed77f175b99e000064a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f42260fac5e5542a773aa44fbcfedf7c193bc2c599",
          "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb480001f42260fac5e5542a773aa44fbcfedf7c193bc2c599"
        ],
        "poolAddress": "0xDcEF968d416a41Cdac0ED8702fAC8128A64241A2",
        "tokenAddress": "0x3175Df0976dFA876431C2E9eE6Bc45b65d3473CC",
        "poolTokens": [
          "0x853d955aCEf822Db058eb8505911ED77F175b99e",
          "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
        ],
        "vault": "0x3f0d8746d07e7b60974Bbb1F275CD61B071d69D5",
        "tokenOut": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599",
        "amountOut": "2500000000000000000000"
      }