Polymarket / polymarket-subgraph

Polymarket's public subgraph manifest for indexing on-chain trade, volume, user, liquidity and market data.
GNU Lesser General Public License v3.0
24 stars 5 forks source link

Supporting multiple events by transaction #27

Closed poly-rodr closed 2 years ago

poly-rodr commented 2 years ago

Fixes:

poly-rodr commented 2 years ago

A script to test it once deployed and synced:

import axios from "axios";
import { BigNumber } from "ethers";
import { formatUnits } from "ethers/lib/utils";

const filterError = (g: any): boolean =>
  g.collateralVolume !== g.tradesCollateralVolume ||
  g.tradesQuantity !== g.tradesTradesQuantity;

const mapError = (g: any): any => {
  if (g.collateralVolume !== g.tradesCollateralVolume) {
    return {
      id: g.id,
      volume: g.collateralVolume,
      buysVolume: g.collateralBuyVolume,
      sellsVolume: g.collateralSellVolume,
      tradeslVolume: g.tradesCollateralVolume,
      buysTradesVolume: g.buyTradesCollateralVolume,
      sellsTradesVolume: g.sellTradesCollateralVolume,
      diff:
        parseFloat(g.collateralVolume) - parseFloat(g.tradesCollateralVolume),
    };
  } else {
    return {
      id: g.id,
      trades: g.tradesQuantity,
      tradesTrades: g.tradesTradesQuantity,
      diff: parseFloat(g.tradesQuantity) - parseFloat(g.tradesTradesQuantity),
    };
  }
};

const mapOk = (g: any): any => {
  return {
    id: g.id,
    volume: g.collateralVolume,
    buysVolume: g.collateralBuyVolume,
    sellsVolume: g.collateralSellVolume,
    tradeslVolume: g.tradesCollateralVolume,
    buysTradesVolume: g.buyTradesCollateralVolume,
    sellsTradesVolume: g.sellTradesCollateralVolume,
    trades: g.tradesQuantity,
    tradesTrades: g.tradesTradesQuantity,
  };
};

const request = {
  method: "post",
  url: "http://localhost:8000/subgraphs/name/TokenUnion/polymarket",
  headers: {
    "Content-Type": "application/json",
  },
  data: JSON.stringify({
    query: `query {
      filledOrderBooks {
        id
        collateralVolume
        collateralBuyVolume
        collateralSellVolume
        tradesQuantity
        buys {
          size
          id
          orderHash
        }
        sells {
          size
          id
          orderHash
        }
      }
    }`,
    variables: {},
  }),
};

axios(request)
  .then(function (response) {
    const filledOrderBooks = response.data.data.filledOrderBooks;

    // group sells and buys to get the sizes
    const grouped = filledOrderBooks.map((ob: any) => {
      let tradesCollateralVolume = BigNumber.from("0");
      let buyTradesCollateralVolume = BigNumber.from("0");
      let sellTradesCollateralVolume = BigNumber.from("0");
      let tradesTradesQuantity = 0;

      if ("buys" in ob) {
        ob.buys.forEach((buy: any) => {
          tradesTradesQuantity++;
          tradesCollateralVolume = tradesCollateralVolume.add(
            BigNumber.from(buy.size)
          );
          buyTradesCollateralVolume = buyTradesCollateralVolume.add(
            BigNumber.from(buy.size)
          );
        });
      }
      if ("sells" in ob) {
        ob.sells.forEach((sell: any) => {
          tradesTradesQuantity++;
          tradesCollateralVolume = tradesCollateralVolume.add(
            BigNumber.from(sell.size)
          );
          sellTradesCollateralVolume = sellTradesCollateralVolume.add(
            BigNumber.from(sell.size)
          );
        });
      }

      return {
        id: ob.id,
        collateralVolume: formatUnits(BigNumber.from(ob.collateralVolume), 6),
        buysAndSellsCollateralVolume: formatUnits(
          BigNumber.from(ob.collateralBuyVolume).add(
            BigNumber.from(ob.collateralSellVolume)
          ),
          6
        ),
        collateralBuyVolume: formatUnits(
          BigNumber.from(ob.collateralBuyVolume),
          6
        ),
        collateralSellVolume: formatUnits(
          BigNumber.from(ob.collateralSellVolume),
          6
        ),
        tradesCollateralVolume: formatUnits(
          BigNumber.from(tradesCollateralVolume),
          6
        ),
        buyTradesCollateralVolume: formatUnits(
          BigNumber.from(buyTradesCollateralVolume),
          6
        ),
        sellTradesCollateralVolume: formatUnits(
          BigNumber.from(sellTradesCollateralVolume),
          6
        ),
        tradesQuantity: ob.tradesQuantity,
        tradesTradesQuantity: tradesTradesQuantity.toString(),
      };
    });

    // print results
    if (grouped.find(filterError)) {
      console.log("ERROR", grouped.filter(filterError).map(mapError));
    } else {
      console.log("OK", grouped.map(mapOk));
    }
  })
  .catch(function (error) {
    console.log(error);
  });