Dexible API & SDK v2.0

Professional grade, programmatic execution for open financial markets

See the Dexible Website | Dexible Web App UI | Dexible User Documentation

If you're looking for docs on v1.0, please go here: https://dexible.gitbook.io/dexible-sdk-v1.0/

Dexible is a fully automated Execution Management System (EMS) for DeFi. In its simplest form, Dexible takes on the responsibility of executing DeFi "orders" according to user-specified "policies". These policies basically dictate how execution should be carried out.

The SDK is a library used to interact directly with the Dexible infrastructure. It makes it easier to call the appropriate APIs with wallet signatures, etc. With the SDK, it is possible to:

  • Lookup token metadata quickly (including wallet balance and Dexible spend allowances)

  • Get quotes for token swaps

  • Submit orders to Dexible for execution

  • Query active and historical orders

  • Pause, Resume, and Cancel orders

Here is a quick example of how to get a quote and submit an order:

Getting an Order Quote

import {Dexible, InfuraWeb3Factory, IERC20Token, TWAPSwap, units} from 'dexible-sdk';
import {ethers} from 'ethers';

const main = async () => {
   const dex = new Dexible({
      web3Factory: new InfuraWeb3Factory(process.env.INFURA_KEY)
   });
   const weth: IERC20Token = {
      address: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
        decimals: 18,
        symbol: "WETH",
        name: "Wrapped ETH",
        chainId: 1
   };
   const usdc: IERC20Token = {
      address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
      decimals: 6,
      symbol: "USDC",
      name: "USD Coin",
      chainId: 1
   };
   
   const twap = new TWAPSwap({
      amountIn:  units.inBNUnits("1", 18),
      tokenOut: usdc,
      tokenIn: weth,
      slippage: new Slippage(.5, false), //false means not expressed as decimal but instead as a percentage
      timeWindowSeconds: 86400
   });
   
   const quote = await dex.exchange.quote(twap);
   console.log(quote);
}

main();

   

This results in:

{
  id: 'bagaaierayqbbhep36rt45fopah6wnfdzry2767lnpjwf24ukqhj37js3fyjq',
  minAmountOut: BigNumber { _hex: '0x4b013278', _isBigNumber: true },
  bpsFee: BigNumber { _hex: '0x02d79883d20000', _isBigNumber: true },
  feeToken: {
    address: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2',
    decimals: 18,
    symbol: 'WETH',
    name: 'Wrapped ETH',
    chainId: 1
  },
  rounds: 1,
  totalEstimatedGasFees: BigNumber { _hex: '0x2ee5547da95e5b', _isBigNumber: true }
}

Submit an Order

 import {
     Dexible, 
     InfuraWeb3Factory, 
     IERC20Token, 
     TWAPSwap, 
     units, 
     ExeuctionStatus
} from 'dexible-sdk';
import {ethers} from 'ethers';

const main = async () => {
   const traderKey = process.env.TRADER_KEY;
   if(!traderKey) {
      throw new Error("Missing TRADER_KEY in environment");
   }
     
   const wallet = new ethers.Wallet(traderKey);
   const dex = new Dexible({
      signer: wallet,
      web3Factory: new InfuraWeb3Factory(process.env.INFURA_KEY)
   });
   const weth: IERC20Token = {
      address: "0xb4fbf271143f4fbf7b91a5ded31805e42b2208d6",
        decimals: 18,
        symbol: "WETH",
        name: "Wrapped ETH",
        chainId: 5
   };
   const uni: IERC20Token = {
      address: "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984",
      decimals: 18,
      symbol: "UNI",
      name: "UNI",
      chainId: 5
   };
   
   const twap = new TWAPSwap({
      amountIn:  units.inBNUnits(".1", 18),
      tokenOut: uni,
      tokenIn: weth,
      slippage: new Slippage(.5, false), //false means not expressed as decimal but instead as a percentage
      timeWindowSeconds: 86400
   });
   
   let order = await dex.exchange.swap(twap);
   console.log(order);
   //then you can poll to get updated status
   while(order.status === ExecutionState.PENDING) {
       sleep(1000); //assume you can implement this
       order = await dex.exchange.status(order.id);
   }
}

main();

This results in order output:

{
      cummulativeBpsFee: BigNumber { _hex: '0x00', _isBigNumber: true },
      cummulativeGasFee: BigNumber { _hex: '0x00', _isBigNumber: true },
      cummulativeInput: BigNumber { _hex: '0x00', _isBigNumber: true },
      cummulativeOutput: BigNumber { _hex: '0x00', _isBigNumber: true },
      feeToken: undefined,
      id: '5:19',
      progress: 0,
      status: 'PENDING',
      tokenIn: {
        decimals: 18,
        symbol: 'WETH',
        balance: BigNumber { _hex: '0x06f337f894208e25', _isBigNumber: true },
        allowance: BigNumber {
          _hex: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff',
          _isBigNumber: true
        }
      },
      tokenOut: {
        decimals: 18,
        symbol: 'UNI',
        balance: BigNumber { _hex: '0x00', _isBigNumber: true },
        allowance: BigNumber { _hex: '0x00', _isBigNumber: true }
      },
      totalInput: BigNumber { _hex: '0x016345785d8a0000', _isBigNumber: true },
      transactions: []
}

Before diving into the weeds of the SDK, it may be necessary to first understand how Dexible receives, validates, and executes orders--basically how Dexible works.

Last updated