DCA SDK

Integrating DCA API, it will need to utilize the limit order SDK, which combines creating and canceling limit order functions.

How to install the SDK in your project

npm i @openocean.finance/limitorder-sdk

How to use the SDK in your project

import { openoceanLimitOrderSdk } from '@openocean.finance/limitorder-sdk';

You can then use all the functions explored by the SDK (API and swapSDK).

Create DCA Orders:

// you have to import OpenoceanSdk before you call features:
const function putOrder(wallet, order) {
  const {
    provider, // wallet provider
    chainKey, // chain key, pleaze refer to supported chains
    chainId,// chian id
    account, // user's wallet address
    mode: 'dca'
  } = wallet
  const {
    makerTokenAddress, // maker token address
    makerTokenDecimals, // maker token decimals
    takerTokenAddress, // taker token address
    takerTokenDecimals, // taker token decimals
    makerAmount, // maker amount with decimals
    takerAmount, // taker amount with decimals
    gasPrice, // gas price
    expire, // time difference counted by millisecond
    receiver, // receiver(Optional)
    receiverInputData, // receiver input data(Optional)
  } = order
  // You need to upload the result "Create limit order"
  // to finalize the limit order implementation.
  let result = await openoceanLimitOrderSdk.createLimitOrder(wallet, order)
}

Cancel DCA Orders:

// You have to use Openocean API to get your limit order information to cancel order.
const function cancelOrder(wallet, order){
  const {
    provider, // wallet provider
    chainKey, // chain key, pleaze refer to supported chains
    chainId,// chian id
    account, // user's wallet address
  } = wallet
  const {
    orderData, // order data
    gasPrice, // gas price
  } = order
  const result = await openoceanLimitOrderSdk.cancelLimitOrder(wallet, order)
}

Load Chart

await openoceanLimitOrderSdk.loadChart({
  chain: "base", // chain code, 
  fromTokenSymbol: "WETH", // from token symbol
  toTokenSymbol: "BUSD", // to token symbol
  container: document.getElementById('chart'), // chart's container
  timeLimit: "1d", // 1d、1w、1m、1y、all
  theme: "dark", // dark、light
  type: "line", // line、bar
  setPoint: ({ label, des }) => { // setPoint callback
    console.log('setPoint', label, des);
  }
})

Demo


<template>
  <div id="app">
    <div style="color:blue">
      <div v-if="chain">chain:{{ chain.chainName }}</div>
      <div v-if="myWallet"> walletName:{{ myWallet.name }}</div>
      <div v-if="myWallet">address:{{ myWallet.address }}</div>
    </div>
    <div>
      <div>
        <h3>ConnectWallet</h3>
        <button @click="connectWallet()" style="margin-right:10px">connectWallet</button>
      </div>

      <div>
        <h3>createDcaOrder</h3>
        <button @click="createDcaOrder">createDcaOrder</button>
      </div>
      <div>
        <h3>Orders</h3>
      </div>
      <div v-for="(item, i) in orders" :key="i">
        <!-- {{ item.data }} -->
        <span>{{ item.data.makerAssetSymbol }}</span>
        <span>-></span>
        <span>{{ item.data.takerAssetSymbol }}</span>
        <button v-if="item.statuses === 5 || item.statuses === 1" @click="cancelOrder(item)">cancelOrder</button>
      </div>
      <div id="chart" style="width: 100%; height: 400px; border: 1px solid #c00;">

      </div>

    </div>
  </div>
</template>

<script>
import { tryWalletConnect, Wallets, Chains } from '@openocean.finance/wallet';
import { openoceanLimitOrderSdk } from '@openocean.finance/limitorder-sdk';
import axios from 'axios';

// import VConsole from 'vconsole';
// const vConsole = new VConsole({ theme: 'dark' });

export default {
  name: 'App',
  components: {
  },
  data () {
    return {
      chainName: 'base',
      walletName: 'MetaMask',
      inToken: {
        "address": "0x4200000000000000000000000000000000000006",
        "decimals": 18,
        "symbol": "WETH",
      },
      outToken: {
        "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
        "decimals": 18,
        "symbol": "USDC"
      },
      gasPrice: 3000000000,
      inTokenBalance: null,
      outTokenBalance: null,
      inAmount: 1,
      outAmount: null,

      myWallet: null,
      chain: null,
      provider: null,
      limitOrderExpireOptions: [
        {
          value: "10M",
          label: "10 Mins",
        },
        {
          value: "1H",
          label: "1 Hour",
        },
        {
          value: "1D",
          label: "1 Day",
        },
        {
          value: "3D",
          label: "3 Days",
        },
        {
          value: "7D",
          label: "7 Days",
        },
        {
          value: "30D",
          label: "1 Month",
        },
        {
          value: "3Month",
          label: "3 Month",
        },
        {
          value: "6Month",
          label: "6 Month",
        },
        {
          value: "1Y",
          label: "1 Year",
        }
      ],

      orders: []
    }
  },


  async created () {
  },
  mounted () {
    this.loadChart()
  },
  methods: {
    async createDcaOrder () {

      let order = await openoceanLimitOrderSdk.createLimitOrder(
        {
          provider: this.provider,
          chainKey: this.chainName,
          account: this.myWallet.address,
          chainId: this.chain.chainId,
          mode: 'dca'
        },
        {
          makerTokenAddress: this.inToken.address,
          makerTokenDecimals: this.inToken.decimals,
          takerTokenAddress: this.outToken.address,
          takerTokenDecimals: this.outToken.decimals,
          makerAmount: 1 * (10 ** this.inToken.decimals) + '',
          takerAmount: 2 * (10 ** this.outToken.decimals) + '',
          gasPrice: this.gasPrice,
          expire: this.limitOrderExpireOptions[1].value,
        }
      );
      let json = {
        ...order,
        expireTime: 180,
        time: 60, // 1 Minute
        times: 2,
        // minPrice:1,
        // maxPrice:2,
      }

      const result = await axios.post(
        `https://open-api.openocean.finance/v1/${this.chain.chainId}/dca/swap`,
        json,
        {
          headers: { 'Content-Type': 'application/json' },
        }
      );
      this.getLimitOrder()
    },
    async getLimitOrder () {
      let url = `https://open-api.openocean.finance/v1/${this.chain.chainId}/dca/address/${this.myWallet.address}?page=1&limit=100&statuses=[1,2,5]&sortBy=createDateTime&exclude=0`
      const res = await axios.get(url);
      this.orders = res.data.data
    },
    async cancelOrder (order) {

      const { orderHash } = order;
      const result = await axios.post(
        `https://open-api.openocean.finance/v1/${this.chain.chainId}/dca/cancel`,
        { orderHash }
      );
      const { status } = (result && result.data) || {};
      if (!(status === 3 || status === 4)) {
        let res = await openoceanLimitOrderSdk.cancelLimitOrder(
          {
            provider: this.provider,
            chainKey: this.chainName,
            account: this.myWallet.address,
            chainId: this.chain.chainId
          },
          {
            orderData: order.data,
            gasPrice: this.gasPrice,
          }
        );
      }
      this.getLimitOrder()
    },
    async connectWallet () {
      try {
        let data = await tryWalletConnect({
          chainName: this.chainName,
          walletName: this.walletName
        })


        if (data) {
          this.provider = data.wallet.sdk
          this.myWallet = data.wallet
          this.chain = data.chain

          this.getLimitOrder()

        }
      } catch (error) {
        this.myWallet = null
        this.chain = null
      }
    },
    async loadChart () {
      await openoceanLimitOrderSdk.loadChart({
        chain: "bsc", // chain code, 
        fromTokenSymbol: "BNB", // from token symbol
        toTokenSymbol: "BUSD", // to token symbol
        container: document.getElementById('chart'), // chart's container
        timeLimit: "1d", // 1d、1w、1m、1y、all
        theme: "dark", // dark、light
        type: "line", // line、bar
        setPoint: ({ label, des }) => { // setPoint callback
          console.log('setPoint', label, des);
        }
      })
    }
  }
}

</script>

<style></style>

Last updated