github.com/diadata-org/diadata@v1.4.593/scripts/bifrost/main.js (about)

     1  const { ApiPromise, WsProvider } = require('@polkadot/api');
     2  const { options } = require('@bifrost-finance/api');
     3  const { default: BigNumber } = require('bignumber.js');
     4  
     5  async function main() {
     6    const wsProvider = new WsProvider('wss://bifrost-rpc.liebi.com/ws');
     7    const api = await ApiPromise.create(options({
     8      provider: wsProvider
     9    }));
    10  
    11    await api.rpc.chain.subscribeNewHeads(async (header) => {
    12      console.log(`blockHeight: ${header.number}`);
    13      const blockHash = await api.rpc.chain.getBlockHash(header.number);
    14      const at = await api.at(blockHash);
    15      // const at = await api.at('0xb1cbc766d73b63f93accf36dfb96067bbed658482ac7a01015aab6c28927e7d9'); // for testing
    16      const events = await at.query.system.events();
    17      events.filter((record) => {
    18        return record.event.section === 'zenlinkProtocol' && record.event.method === 'AssetSwap';
    19      })
    20        .map(async (record) => {
    21          const { event, phase } = record;
    22          // We collect data as string with
    23          // pair toSymbol fromSymbol toAmount fromAmount toAssetIndex fromAssetIndex foreignTradeID
    24          let asset_balance = event.data[3];
    25          let assets = event.data[2];
    26          let to_native = JSON.parse(assets[0]);
    27          let from_native = JSON.parse(assets[assets.length - 1]);
    28          let from_asset_id = `${from_native.chainId}-${from_native.assetType}-${from_native.assetIndex}`;
    29          let to_asset_id = `${to_native.chainId}-${to_native.assetType}-${to_native.assetIndex}`;
    30          let from = getTokenByPair(from_asset_id).token;
    31          let to = getTokenByPair(to_asset_id).token;
    32          let fromDecimals = getDecimals(from);
    33          let toDecimals = getDecimals(to);
    34          let out = `${to}-${from} ${to} ${from}`
    35          out += ` ${BigNumber(asset_balance[0]).dividedBy(10 ** toDecimals)} ${BigNumber(asset_balance[asset_balance.length - 1]).dividedBy(10 ** fromDecimals)}`;
    36          out += ` ${to_native.assetIndex} ${from_native.assetIndex}`;
    37          out += ` ${header.number}-${phase.asApplyExtrinsic}`;
    38          console.log(`Trade:${out}`)
    39        });
    40    });
    41  }
    42  
    43  main().catch((error) => {
    44    console.error(error);
    45    process.exit(-1);
    46  });
    47  
    48  const getTokenByPair = (value) => {
    49    switch (value) {
    50      case '2001-0-0':
    51        return { type: 'Native', token: 'BNC' };
    52      case '2001-2-519':
    53        return { type: 'Token', token: 'ZLK' };
    54      case '2001-2-1028':
    55        return { type: 'vsToken', token: 'vsKSM' };
    56      case '2001-2-1284':
    57        return { type: 'vsToken', token: 'vsBond(KSM)' };
    58      case '2001-2-1283':
    59        return { type: 'vsToken', token: 'vsBond(DOT)' };
    60      case '2001-2-260':
    61        return { type: 'vToken', token: 'vKSM' };
    62      case '2001-2-2050':
    63        return { type: 'Token', token: 'kBTC' };
    64      case '2001-2-266':
    65        return { type: 'vToken', token: 'vMOVR' };
    66      case '2001-2-264':
    67        return { type: 'vToken', token: 'vPHA' };
    68      case '2001-2-257':
    69        return { type: 'vToken', token: 'vBNC' };
    70      case '2001-2-516':
    71        return { type: 'Token', token: 'KSM' };
    72      case '2001-2-518':
    73        return { type: 'Token', token: 'KAR' };
    74      case '2001-2-770':
    75        return { type: 'Token', token: 'aUSD' };
    76      case '2001-2-521':
    77        return { type: 'Token', token: 'RMRK' };
    78      case '2001-2-522':
    79        return { type: 'Token', token: 'MOVR' };
    80      case '2001-2-520':
    81        return { type: 'Token', token: 'PHA' };
    82      case '2030-0-0':
    83        return { type: 'Token', token: 'BNC' };
    84      case '2030-2-2048':
    85        return { type: 'Token', token: 'DOT' };
    86      case '2030-2-2304':
    87        return { type: 'vToken', token: 'vDOT' };
    88      case '2030-2-2560':
    89        return { type: 'vsToken', token: 'vsDOT' };
    90      case '2030-2-2049':
    91        return { type: 'Token', token: 'GLMR' };
    92      case '2030-2-2052':
    93        return { type: 'Token', token: 'FIL' };
    94      case '2001-2-2048':
    95        return { type: 'Token', token: 'USDT' };
    96      case '2030-2-2305':
    97        return { type: 'vToken', token: 'vGLMR' };
    98      case '2030-2-2308':
    99        return { type: 'vToken', token: 'vFIL' };
   100      default:
   101        return null;
   102    }
   103  };
   104  
   105  const getDecimals = (type) => {
   106    switch (type) {
   107      case 'USDT':
   108        return 6;
   109      case 'kBTC':
   110        return 8;
   111      case 'ETH':
   112      case 'vETH':
   113      case 'ZLK':
   114      case 'FIL':
   115      case 'vFIL':
   116      case 'MOVR':
   117      case 'vMOVR':
   118      case 'GLMR':
   119      case 'vGLMR':
   120      case 'CRAB':
   121      case 'ASTR':
   122      case 'SDN':
   123      case 'MGX':
   124        return 18;
   125  
   126      case 'DOT':
   127      case 'RMRK':
   128      case 'vDOT':
   129      case 'vsDOT':
   130      case 'TUR':
   131        return 10;
   132  
   133      case 'BNCZLKLP':
   134      case 'KARZLKLP':
   135      case 'vKSMKSMLP':
   136      case 'vsKSMKSMLP':
   137      case 'BNCKSMLP':
   138      case 'KSMkUSDLP':
   139      case 'KSMKBTCLP':
   140      case 'PHA':
   141      case 'CSM':
   142      case 'KINT':
   143        return 12;
   144  
   145      default:
   146        return 12;
   147    }
   148  };