1.0.8 • Published 1 year ago

unifi-sdk v1.0.8

Weekly downloads
-
License
ISC
Repository
-
Last release
1 year ago

Unifi Docs

UniFi provides access to any Defi protocol in just a single line of code. Currently Unifi has integrated Uniswap with methods to do swaps, approve and get swap quote in uniswap all in a single line.

In the coming up weeks: 1) We will be integrating protocols like Aave, 1inch and more methods from Uniswap 2) Creation of AA wallet architecture and provide REST API endpoints

Setup

Install Unifi SDK

npm i unifi-sdk

You can use our demo api-key and try out Unifi

let demoApiKey = "wutu5laotqfd8ofbn30px8sv7s9g9u3f";
const Unifi = require("unifi-sdk");

let unifi = Unifi(demoApiKey);

Methods

Uniswap Methods

Unifi supports the following chains for Uniswap

UNISWAP SUPPORTED CHAINS
GOERLI:5
ETHEREUM_MAINNET:1
POLYGON_MAINNET:137
ARBITRUM_MAINNET:42161
OPTIMISM_MAINNET:10
POLYGON_MUMBAI:80001
BINANCE: SOON
CELO: SOON

approve

Approve uniswap to handle your tokens. This method is required to be executed before you do unifi.uniswap.swap calls.

If you do not pass amount, then default value is used. The default value is the maximum value possible in solidity 2^256-1.

This mean you will approve uniswap to handle 2^256-1 quantity of your tokens.

let unsignedTxn = await unifi.uniswap.approve({
  walletAddress: wallet.address,
  tokenAddress: "0x70cBa46d2e933030E2f274AE58c951C800548AeF",
  amount: "100000",
  chainId: 5,
});

This call returns an unsignedTxn object which you can sign with your wallet to submit your transaction

Output of the above will be similar as shown below.

{
  data: '0x095ea7b300000000000000000000000068b3465833fb72a70ecdf485e0e4c7bd8665fc4500000000000000000000000000000000000000000000000000000000000186a0',
  to: '0x70cBa46d2e933030E2f274AE58c951C800548AeF',
  nonce: 842,
  gasLimit: { type: 'BigNumber', hex: '0x0493e0' },
  gasPrice: { type: 'BigNumber', hex: '0x015b3970' }
}

Sample Implementation Below

const Unifi = require('unifi-sdk')
const ethers = require('ethers');
let provider =  new ethers.providers.JsonRpcProvider('your-provider-url');
let wallet = new ethers.Wallet('your-private-key',provider);

let apiKey = 'your-api-key';
let unifi = Unifi(apiKey);

async function execute(){

    unsignedTxn = await unifi.uniswap.approve({
        walletAddress:wallet.address,
        tokenAddress:"0x70cBa46d2e933030E2f274AE58c951C800548AeF",
        amount:"100000",
        chainId:5,
    }
    )
    
    let sentTxn = await wallet.sendTransaction(unsignedTxn)
    let txnReceipt =  await sentTxn.wait();
    console.log('txnReceipt',txnReceipt)
}

execute()

getQuote

Get the best Quotes from Uniswap (V2 and V3). Returns an Object with all essential information about the swap

let unsignedTxn = await unifi.uniswap.getQuote({
  sellTokenAddress: "0x70cBa46d2e933030E2f274AE58c951C800548AeF",
  buyTokenAddress: "0x07865c6e87b9f70255377e024ace6630c1eaa37f",
  sellTokenAmount: "1000",
  chainId: 5,
});

swap

Swaps Tokens, pass in the sellTokenAddress for the token you want to sell and buyTokenAddress for the token you want to buy.

You can either pass sellTokenAmount or buyTokenAmount depending on your need.

Passing sellTokenAmount results in generating an unsigned transaction object for selling sellTokenAmount worth sellTokens.

Passing buyTokenAmount results in generating an unsigned transaction object for buying buyTokenAmount worth buyTokens for respective amount of sellTokens to be sold.

let unsignedTxn = await unifi.uniswap.swap({
  walletAddress: wallet.address,
  sellTokenAddress: "0x70cBa46d2e933030E2f274AE58c951C800548AeF",
  buyTokenAddress: "0x07865c6e87b9f70255377e024ace6630c1eaa37f",
  buyTokenAmount: "1000",
  recipientAddress: wallet.address,
  chainId: 5,
});

This call returns an unsignedTxn object which you can sign with your wallet to submit your transaction

Output of the above will be similar as shown below

{
  data: '0x5ae401dc00000000000000000000000000000000000000000000000000000000643c9683000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000010442712a670000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000001be2e1dedca98f0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000f522c2e707345475da50bd45a4c8061df4de722e000000000000000000000000000000000000000000000000000000000000000300000000000000000000000070cba46d2e933030e2f274ae58c951c800548aef000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d600000000000000000000000007865c6e87b9f70255377e024ace6630c1eaa37f00000000000000000000000000000000000000000000000000000000',
  to: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45',
  value: { type: 'BigNumber', hex: '0x00' },
  from: '0xf522C2E707345475dA50BD45a4C8061df4dE722E',
  gasPrice: { type: 'BigNumber', hex: '0x015b3970' },
  gasLimit: { type: 'BigNumber', hex: '0x043bfc' },
  nonce: 842
}

Sample implementation Below

const Unifi = require('unifi-sdk')
const ethers = require('ethers');
let provider =  new ethers.providers.JsonRpcProvider('your-provider-url');
let wallet = new ethers.Wallet('your-private-key',provider);

let apiKey = 'your-api-key';
let unifi = Unifi(apiKey);

async function execute(){

    let unsignedTxn = await unifi.uniswap.swap({
        walletAddress:wallet.address,
        sellTokenAddress:"0x70cBa46d2e933030E2f274AE58c951C800548AeF",
        buyTokenAddress:"0x07865c6e87b9f70255377e024ace6630c1eaa37f",
        buyTokenAmount:"1000000",
        recipientAddress:wallet.address,
        chainId:5,
    }
    )
    
    let sentTxn = await wallet.sendTransaction(unsignedTxn)
    let txnReceipt =  await sentTxn.wait();
    console.log('txnReceipt',txnReceipt)
}

execute()

Custom Strategy

targetImpactIntervalPurchase

implements a strategy similar to TWAP for swapping large amount of crypto over an interval of time at a targeted price impact in uniswap

The below will return a TIIPExecutor Object with which you can trigger to start the strategy and listen to events

let TIIPExecutor = unifi.uniswapTools.targetImpactIntervalPurchase({
    walletAddress:wallet.address, 
    sellTokenAddress:'0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
    buyTokenAddress:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
    maximumPriceImpact:0.05,
    priceImpactTolerance:0.01,
    desiredChunkSize:"20",
    targetQuantity:"2000",
    interval:60000,
    lowerBoundChunkSize:"10",
    chainId:1,
});

The following command with start the strategy

TIPExecutor.runTIPExecutor()

The following is essential to listen to events which will contain the required transaction to be sent from your wallet at every interval which you have specified

TIPExecutor.TIPExecutorEvents.on('executionOutput',(response)=>{
    console.log('response',response);
    //wallet.sendTransaction(response.unsignedTxnObject);
})

Full Implementation

const Unifi = require('unifi-sdk');
let apiKey = 'your-api-key';
let unifi = Unifi(apiKey);
const fs = require('fs'); 
const ethers = require('ethers');
let provider =  new ethers.providers.JsonRpcProvider('your-provider-url');
let wallet = new ethers.Wallet('your-private-key',provider);


let TIPExecutor = unifi.uniswapTools.targetImpactIntervalPurchase({
    walletAddress:wallet.address, 
    sellTokenAddress:'0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
    buyTokenAddress:'0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
    maximumPriceImpact:0.05,
    priceImpactTolerance:0.01,
    desiredChunkSize:"20",
    targetQuantity:"2000",
    interval:60000,
    lowerBoundChunkSize:"10",
    chainId:1,
});

const time = new Date().getTime();

TIPExecutor.runTIPExecutor()
TIPExecutor.TIPExecutorEvents.on('executionOutput',async(response)=>{
    console.log('response',response);

    let sentTxn = await wallet.sendTransaction(response.unsignedTxnObject);
    let receipt = await sentTxn.wait();
    //writing to a file to log events for reference
    fs.appendFile('executionHistory_'+time+'.txt',JSON.stringify(response)+'\n', (err)=>{
        if(err) throw err;
    })
    

})

You can check out the code for the strategy at

unifi-sdk/tools/uniswap/TIPExecutor.js
1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago