github.com/diadata-org/diadata@v1.4.593/scripts/bifrost/zenlink-bifrost-polkadot.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://hk.p.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('0xabad97ea80a0e3f696a7613c87099b336b8b5322a3f6f0d61ab8cf2fc8fa1b50'); // 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 };