crypto-bot
Version:
multi-function tools for blockchain automation
937 lines (769 loc) • 38.5 kB
JavaScript
const { logger } = require('./utils/logger');
const { sleep } = require('./utils/sleep');
const { ethers } = require("ethers");
const cliProgress = require('cli-progress');
const colors = require('ansi-colors');
const { Contract, Provider } = require('ethcall')
const { Table } = require("console-table-printer");
//const { tokenlist: token } = require('./../data/token');
const tools = require("./utils/tools");
const crypto = require("./utils/crypto");
//const botpairs = require('./bot5-pairs');
const EXCHANGE = require('./bot-exchange');
const fs = require('fs');
//const { cryptolib: config } = require(".");
//const botType = require('./core/type');
const botType = require('./core/type');
const FactoryJsonFile = "./lib/ABI/factory.json";
const factoryABI = JSON.parse(fs.readFileSync(FactoryJsonFile));
const exchangeJsonFile = "./lib/ABI/exchangePair.json";
const exchangePairABI = JSON.parse(fs.readFileSync(exchangeJsonFile));
const soulswapJsonFile = "./lib/ABI/factory/SoulSwap.json";
const routerABI = new ethers.utils.Interface(require("./ABI/router.json"));
const souswalABI = JSON.parse(fs.readFileSync(soulswapJsonFile));
const { pairlistHeader, exchangeHeader } = require('./utils/tableheader');
module.exports = {
listPairs: async function (Network, Exchange, Option) {
const p = new Table(pairlistHeader);
const x = new Table(exchangeHeader);
if(Option == undefined){
Option = 0
}
logger.debug(`Entering listPairs function: Options are: ${Option}`)
//console.log(Exchange)
if(Option == undefined){
Option = 1;
}
let _list = await botpairs.readExchangeData(Network)
for(let j = 0 ; j < _list.factory.length; j++ ){
if(Exchange.factory == undefined){
Exchange.factory = await this.getFactoryAddress(Network, Exchange.router);
logger.warn(`Factory for not found in configuration. Consider adding factory address: ${Exchange.factory} to configuration of ${Exchange.name}.`);
}
if( _list.factory[j].address == Exchange.factory ){
x.addRow({ chain: Network.chainId, name: Exchange.name, router: _list.factory[j].address, count: _listfactory[j].pairs.length})
logger.verbose(`${Exchange.name} : ${_list.factory[j].pairs.length} pairs details option: ${Option}`);
logger.debug(`Pair for exchange: ${_list.factory[j].address} `);
const pairslist = _list.factory[j].pairs;
if(Option != 0){
for(let i = 0 ; i < pairslist.length ; i++)
{
//logger.info(` ${pairslist[i].address} | token0: ${pairslist[i].token0} token1: ${pairslist[i].token1} lastBlock: ${pairslist[i].reserve[2]} `);
p.addRow({ chain: Network.chainId, network: Network.name, pair: pairslist[i].address, token0: pairslist[i].token0 ,token1: pairslist[i].token1, lastBlock: pairslist[i].reserve[2]})
//logger.info(` ${pairslist[i].address} | token0: ${pairslist[i].token0} token1: ${pairslist[i].token1} lastBlock: ${pairslist[i].reserve[2]} `);
}
p.printTable();
}
}
}
x.printTable();
logger.debug("Listing pair for exchange completed...");
return
},
listAllExchangePairs: async function (Network, _Option) {
logger.debug(`Entering listAllExchangePairs: Options are: ${_Option}`)
if(_Option == undefined){
_Option = 1;
}
const xList = await EXCHANGE.getExchangeList(Network);
//console.log(xList)
if(Array.isArray(xList)){
xList.forEach(xchange => {
console.log(xchange.factory)
EXCHANGE.listExchangePairs(Network, xchange)
});
if(xList.length == 0){
logger.warn(`no exchange found for ${Network.name} (${Network.chainId})`)
}
}
logger.debug("End list pair for all exchange completed...");
return
},
getFactoryAddress: async function (Network, routerAddress) {
logger.debug(`Getting factory address for ${routerAddress}`);
const provider = new ethers.providers.JsonRpcProvider(Network.https[0]);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY);
const account = wallet.connect(provider);
const router = new ethers.Contract(routerAddress, routerABI, account);
// const router = new ethers.Contract(routerlist[i].router, uniswapABI, account); //OTHER ABI
const routerFactory = await router.factory();
return routerFactory;
},
//updateFactoryCount: async function(Network, Exchange, Option) {
//
//},
updateFactoryPairs: async function (Network, Exchange, Option) {
logger.verbose(`Getting pairs address from (${Network.chainId}) ${Exchange.name}`);
if(Option == undefined){
Option = 0
}
const provider = new ethers.providers.JsonRpcProvider(Network.https[0]);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY);
const account = wallet.connect(provider);
if(Exchange.factory == undefined){
Exchange.factory = await this.getFactoryAddress(Network, Exchange.router);
}
const routerFactory = Exchange.factory;
let factoryContract = undefined;
const PairArray = new Array();
const PairIndexArray = new Array();
//const _PairIndexArray = new Array();
let allPairsLength = undefined
if(routerFactory != '0x1120e150dA9def6Fe930f4fEDeD18ef57c0CA7eF'){
factoryContract = new ethers.Contract(
routerFactory,
factoryABI,
account
);
allPairsLength = await factoryContract.allPairsLength();
}
else{
factoryContract = new ethers.Contract(
routerFactory,
souswalABI,
account
);
allPairsLength = await factoryContract.totalPairs();
}
logger.info(` (${Network.chainId}) Factory address: ${routerFactory} ${allPairsLength} pairs found in exchange`);
// pair list
logger.verbose(` Rebuilding pairs index...`)
//const _latestCount = allPairsLength;
await this.rebuildPairIndex(Network, Exchange);
logger.verbose(` Loading pairs index from data files...`)
const _pairIndex = await this.getPairIndex(Network, Exchange);
// pair data
logger.verbose( ` Validating and rebuilding pair data.,,`)
const _newPairData = await this.rebuildPairData(Network, Exchange, _pairIndex.length )
logger.info(`Rebuild data has returned ${_newPairData} `)
await sleep(1000);
const currentFactoryData = await this.getPairData(Network, Exchange)
const delta = _pairIndex.length - currentFactoryData.length;
const newPairCount = allPairsLength - _pairIndex.length
let startLoad = 0
let rebuild = false
let rebuildIndex = false
if(delta == 0)
{
logger.verbose(` No delta found between Pair Index file ${_pairIndex.length} and Pair Data file ${currentFactoryData.length} `)
startLoad = _pairIndex.length;
} else if( delta > 0){
logger.warn(` Delta found between Pair Index ${_pairIndex.length} and Pair Data ${currentFactoryData.length}`)
rebuild = true
} else {
logger.error(` Delta found between Pair Index ${_pairIndex.length} and Pair Data ${currentFactoryData.length}`)
rebuild = true
}
if( allPairsLength > _pairIndex.length){
if( rebuildIndex){
startLoad = 0
}else{
startLoad = _pairIndex.length
}
}else{
if( rebuildIndex){
startLoad = 0
}else{
startLoad = _pairIndex.length
}
}
logger.verbose(` ${newPairCount} new pair to load. rebuildIndex: ${rebuildIndex} rebuildData: ${rebuild}`)
//************************************************************** */
let _resize = crypto.resizeMultiCallArray( (allPairsLength-startLoad), botType.MULTI_CALL_PAIRINFO);
//let _index = 0;
const title = `(${Exchange.name}) - extracting new pair index |`
const bar1 = new cliProgress.SingleBar({format: title + colors.green('{bar}') + '| {percentage}% | {value}/{total} pair'}, cliProgress.Presets.shades_classic);
let toDo = allPairsLength-startLoad
if(toDo > 0) bar1.start(toDo, 0);
let _countProgress = 0;
for(let pos = startLoad ; pos < allPairsLength; (pos=pos + _resize) ){
if( (pos + _resize > allPairsLength)) _resize = allPairsLength - pos;
//console.log(pos)
//console.log(_resize)
const _partialdata = await this.multiCallPair(Network, pos, _resize, routerFactory, factoryABI );
for(let j = 0; j < _partialdata.length ; j++){
const PairData = new Object(_partialdata[j]);
PairIndexArray.push(PairData);
logger.debug(`address: ${PairData.address} index: ${PairData.index}`)
}
_countProgress = _countProgress + _partialdata.length;
bar1.update(_countProgress);
}
bar1.update(_countProgress);
bar1.stop();
if( startLoad != 0 ){
await this.addPairIndex(Network, PairIndexArray, Exchange);
logger.verbose(` ${PairIndexArray.length} pairs index added from factory`);
}
else{
await this.writePairIndex(Network, PairIndexArray, Exchange);
logger.verbose(` ${PairIndexArray.length} pairs index retreived from factory`);
}
//************************************************************** */
let _splitpairAddress = undefined
let count = 0
let _RebuildData = new Array();
let _PairIndexArray = undefined
const _currentFactoryData = await this.getPairData(Network, Exchange)
if( rebuild ){
logger.info(` rebuild ${rebuild} `)
let currentDataLen = _currentFactoryData.length
_PairIndexArray = await this.getPairIndex(Network, Exchange)
if(currentDataLen > _PairIndexArray.length){
logger.error(` error there's no more data then expected. Sanity to create`)
}
for(let i = 0 ; i < _PairIndexArray.length ; i++){
let _tempData = new Object(_PairIndexArray[i])
if( !(i < currentDataLen) ){
_RebuildData.push(_tempData)
}
}
_splitpairAddress = crypto.splitMultiCall(_RebuildData, botType.MULTI_CALL_PAIRDATA);
count = _RebuildData.length // local
} else {
_splitpairAddress = crypto.splitMultiCall(PairIndexArray, botType.MULTI_CALL_PAIRDATA);
count = PairIndexArray.length
}
const title2 = `(${Exchange.name}) - extracting pair information |`
const bar2 = new cliProgress.SingleBar({format: title2 + colors.green('{bar}') + '| {percentage}% | {value}/{total} pair'}, cliProgress.Presets.shades_classic);
let _countProgress2 = 0;
//console.log(count)
if(count > 0 ) bar2.start(count, 0);
// open read file in read mode to append.
// Doesn't work since I need 1 array [{data},], not []!!!
// Solution ... build a temp file, then rewrite master file!! :-)
for(let i = 0 ; i < _splitpairAddress.length ; i++){
const _pairdate = await this.multiGetPairData(Network, _splitpairAddress[i], exchangePairABI );
if( !(_pairdate.length == _splitpairAddress[i].length) ){
logger.error(` Received data for ${_pairdate.length} new token. Expected data for: ${_splitpairAddress[i].length}`)
//console.log(_splitpairAddress[i])
//return
}
else{
logger.verbose(` Received data for ${_pairdate.length} new pair...`)
//console.log(_pairdate)
let _realTimeArray = new Array();
for(let j = 0; j < _pairdate.length ; j++){
const PairObject = _pairdate[j]
PairArray.push(PairObject);
_realTimeArray.push(PairObject)
logger.verbose(` Address: ${PairObject.address} (${PairObject.symbol}) token0: ${PairObject.token0} token1: ${PairObject.token1} lastBlock: ${PairObject.reserve[2]}`)
}
// should call append here instead
tools.writeFile(Network, botType.PAIRDATA_TEMP_TYPE, Exchange, _realTimeArray )
//await this.addPairData(Network, _realTimeArray, Exchange);
logger.verbose(` ${_realTimeArray.length} pairs data added to factory file`);
}
_countProgress2 = _countProgress2 + _pairdate.length;
bar2.update(_countProgress2);
}
bar2.update(_countProgress2);
bar2.stop();
// Now let's reload the tempFile into 1 Big Array
const _FinalData = new Array()
//const _newdata = await this.readTempFolderData(Network, Exchange)
const _newdata = await tools.readFolderData(Network, botType.PAIRDATA_TEMP_TYPE, Exchange);
if(_newdata.length > 0) logger.info(` ${_newdata.length} pair data found on disk after extraction.`)
if( _newdata.length > 0 ){
for(let i = 0 ; i < _newdata.length ; i++ ){
let _data = new Object(_newdata[i])
_FinalData.push(_data)
}
logger.verbose(` ${_newdata.length} data found in temp file. ${_FinalData.length} data added from temp file.`)
if( _FinalData.length > 0 ){
logger.info(` Adding ${_FinalData.length} pair data to disk.`)
await this.addPairData(Network, _FinalData, Exchange);
await tools.deleteFolderData(Network, botType.PAIRDATA_TEMP_TYPE ,Exchange);
}
}
return
},
rebuildPairData: async function (Network, Exchange, _maxData){
logger.info(` Rebuilding the Pair Data file...`);
// Now let's reload the tempFile into 1 Big Array
const _TempData = new Array()
const _tempFolderData = await tools.readFolderData(Network, botType.PAIRDATA_TEMP_TYPE, Exchange);
if(_tempFolderData.length > 0) logger.verbose(` ${_tempFolderData.length} pair data found in temp folder.`)
if( _tempFolderData.length > 0 ){
for(let i = 0 ; i < _tempFolderData.length ; i++ ){
let _data = new Object(_tempFolderData[i])
_TempData.push(_data)
}
if( _TempData.length > 0 ) {
logger.info(` Adding ${_TempData.length} pair data from temp folder to data files.`)
await this.addPairData(Network, _TempData, Exchange);
await tools.deleteFolderData(Network, botType.PAIRDATA_TEMP_TYPE, Exchange)
}
await sleep(5000);
}
const _pairData = await this.getPairData(Network, Exchange);
logger.verbose( ` ${_tempFolderData.length} data found in temp files. ${_TempData.length} data added from temp files. Total record: ${_pairData.length}`)
let _finalCount = 0;
let _index = new Array();
let _rebuildPairData = new Array();
let _unsyncIndex = new Array();
// parse all to build index arrayee
let counter = 0;
for( let k = 0 ; k < _pairData.length ; k++){
let _data = new Object(_pairData[k])
if( (_data.index == counter) ){
_index.push(_data);
counter++
} else{
//console.log(k)
_unsyncIndex.push(_data);
//console.log(_data)
}
}
if( _pairData.length != _index.length){
logger.info(` Found ${_pairData.length} pair data in data file. It will be fixed automatically.`);
}
let _countIndex = 0;
for(let k = 0 ; k < _index.length ; k++){
let _data = new Object(_index[k]);
//let found = false
if( (_data.index == _countIndex) ){
// good
_rebuildPairData.push(_data)
_countIndex++;
} else {
// CHECK UNSYNC DATA
let foundInSync = false
for(let i = 0 ; i < _unsyncIndex; i++ ){
let _unsyncData = _unsyncIndex[i]
if(_unsyncData.index == _countIndex){
// good
if(!foundInSync){
_rebuildPairData.push(_unsyncData);
logger.info(` fixing out of order index. ${_unsyncData.index} for ${_unsyncData.address}`);
_countIndex++;
foundInSync = true
break;
}
}
}
if(!foundInSync ){
_unsyncIndex.push(_data);
//logger.warn(` out of order index. ${_data.index} for ${_data.address}`);
}
}
}
let _target = _pairData.length
//logger.info(` Found ${_target} pair data in index file.`)
let _FinalRebuildPairData = new Array();
if( (_unsyncIndex.length > 0 )){
logger.info(` ${_unsyncIndex.length} out-of-sync index.`);
logger.info(` ${_rebuildPairData.length} record in first pass of rebuild: ${_rebuildPairData.length}`)
for(let k = 0 ; k < _rebuildPairData.length ; k++){
let currentIndex = k;
let found = false
if( (currentIndex <= _rebuildPairData.length) ){
for(let P = currentIndex ; P < _rebuildPairData.length ; P++){
if( !found ){
let currentPair = new Object(_rebuildPairData[P]);
if(currentIndex == currentPair.index){
//all good
if(!found){
_FinalRebuildPairData.push(currentPair);
found = true;
break;
}
}
else{
// how to find quickly in array
let _found = false
let _maxTry = _unsyncIndex.length
let _loop =0
while( (!_found && (_loop <_maxTry)) ){
let _dataUnsync = _unsyncIndex.shift();
if( (_dataUnsync.index == currentIndex)){
// good
_FinalRebuildPairData.push(_dataUnsync);
_found = true;
found = true;
} else{
//check for duplicate.
if(_dataUnsync.index > currentIndex){
_unsyncIndex.push(_dataUnsync)
} // else just drop it it's a duplicate.
}
_loop++
}
if(_loop >= _maxTry){
logger.error(` Unable to find index: ${currentIndex} in un-sync data.`)
}
}
}else{
break;
}
}
}
}
// here we continue from un sync data.
// how to find quickly in array
let _found = false
let _loop = 0
let _keepRunning = true
let _startIndex = _FinalRebuildPairData.length;
let _runningIndex = _startIndex;
let _iteration = 0
let _MAXtarget = _startIndex + _unsyncIndex.length
logger.verbose(` rebuilding from this start index in unsync data: ${_runningIndex} Max record to add: ${_MAXtarget} `)
const title = `${Exchange.name} | rebuilding from un-sync data |`
const bar1 = new cliProgress.SingleBar({format: title + colors.green('{bar}') + '| {percentage}% | {value}/{total} pair data '}, cliProgress.Presets.shades_classic);
// sorting array
bar1.start(_MAXtarget, 0);
_unsyncIndex.sort(function(a, b){return a.index - b.index});
let _maxTry = _unsyncIndex.length
while( _keepRunning ){
_iteration++
if( (_loop > _maxTry) && (!_found)){
logger.debug(` Unable to find index: ${_runningIndex} in loop ${_loop} `)
_keepRunning = false
} else if (_found) {
_found = false;
_loop = 0;
_runningIndex++
if( _runningIndex % 100 ) bar1.update(_runningIndex);
}
if( !(_maxTry == 0) ){
let _dataUnsync = _unsyncIndex.shift();
_maxTry = _unsyncIndex.length
if( (_dataUnsync.index == _runningIndex)){
// good
_FinalRebuildPairData.push(_dataUnsync);
//console.log(_dataUnsync.index)
_found = true;
} else{
//check for duplicate.
if(_dataUnsync.index > _runningIndex){
//console.log(_dataUnsync.index)
_unsyncIndex.push(_dataUnsync)
} // else just drop it it's a duplicate.
}
} else{
_keepRunning = false;
}
_loop++
}
bar1.stop();
logger.info(` Start index: ${_startIndex} Last index found: ${_runningIndex} Pair data added: ${_runningIndex-_startIndex}. It took ${_iteration} iteration to complete `)
if( (_FinalRebuildPairData.length > _rebuildPairData.length) || (_FinalRebuildPairData.length <= _maxData) ){
logger.info(` Successfully re-order and sync pair data. ${_FinalRebuildPairData.length}.`)
_finalCount = _FinalRebuildPairData.length
await this.writePairData(Network, _FinalRebuildPairData, Exchange)
}
else{
logger.error(` Final rebuild record: ${_FinalRebuildPairData.length} Original record: ${_target}`)
}
}
else {
logger.info(` No issue found for ${_rebuildPairData.length} pair data.`)
}
logger.info(` Rebuilding of the Pair Data file completed.`);
return _finalCount
},
rebuildPairIndex: async function (Network, Exchange){
logger.info(` Rebuilding the Pair Index file...`);
const _pairIndex = await this.getPairIndex(Network, Exchange);
let _index = new Array();
let _rebuildPairIndex = new Array();
let counter = 0;
// parse all to build index array
for(let k = 0 ; k < _pairIndex.length ; k++){
let _tempData = new Object(_pairIndex[k])
if( _tempData.index == counter ){
_index.push(_tempData);
counter++
} else{
console.log(k)
_unsyncIndex.push(_tempData);
console.log(_tempData)
}
}
if( _pairIndex.length != _index.length){
logger.warn(` Found ${_pairIndex.length} pair index in file. Loaded ${_index.length} pair. It will be fixed automatically.`);
}
let _countIndex = 0;
let _unsyncIndex = new Array();
for(let k = 0 ; k < _index.length ; k++){
let _data = new Object(_index[k]);
if(_data.index == _countIndex){
// good
_rebuildPairIndex.push(_data)
_countIndex++;
} else {
// CHECK UNSYNC DATA
let foundInSync = false
for(let i = 0 ; i < _unsyncIndex; i++ ){
let _unsyncData = _unsyncIndex[i]
if(_unsyncData.index == _countIndex){
// good
_rebuildPairIndex.push(_unsyncData);
logger.info(` fixing out of order index. ${_unsyncData.index} for ${_unsyncData.address}`);
_countIndex++;
foundInSync = true
}
}
if(!foundInSync ){
_unsyncIndex.push(_data);
}
}
}
logger.verbose(` Found ${_unsyncIndex.length} un-sync record.`);
logger.verbose(` Number of record in rebuild pair index: ${_rebuildPairIndex.length}`)
let _target = (_pairIndex.length)
let _FinalRebuildPairIndex = new Array();
if( !(_target == _rebuildPairIndex.length)){
for(let k = 0 ; k < _target ; k++){
let currentIndex = k;
let found = false
for(let P = 0 ; P < _rebuildPairIndex.length ; P++){
let currentPair = new Object(_rebuildPairIndex[k]);
if(currentIndex == currentPair.index){
//all good
if(!found){
_FinalRebuildPairIndex.push(currentPair);
found = true;
break;
}
}
else{
// index missing here... will add from sync...
for(let i = 0 ; i < _unsyncIndex.length ; i++){
let _syncIndex = _unsyncIndex[i];
if( (_syncIndex.index == currentIndex)){
// good
if(!found){
_FinalRebuildPairIndex.push(_syncIndex);
found = true;
break;
}
}
}
}
}
}
if(_FinalRebuildPairIndex.length == _pairIndex.length ){
logger.info(` Successfully re-order and sync pair data index. ${_FinalRebuildPairIndex.length}.`)
await this.writePairIndex(Network, _FinalRebuildPairIndex, Exchange)
}
else{
logger.error(` Final rebuild record: ${_FinalRebuildPairIndex.length} Original record: ${_pairIndex.length}`)
}
} else{
logger.info(` No issue found for pair index. ${_rebuildPairIndex.length}.`)
}
logger.verbose(` Rebuilding of the Pair Index file completed.`);
},
multiCallPair: async function(Network, _index, pairCount, factory, factoryABI) {
logger.verbose(`ChainID: ${Network.chainId} - ${Network.name} - ${Network.https[0]}` );
let provider = Network.https[0];
let result2 = undefined;
try {
result2 = await this.call(provider, _index, pairCount, factory, factoryABI );
} catch (e) {
logger.info(`${e}`);
}
logger.verbose("Done multiCallPair...")
return result2
},
multiGetPairData: async function(Network, _pairlist, exchangePairABI) {
logger.verbose(`ChainID: ${Network.chainId} - ${Network.name} - ${Network.https[0]}` );
let provider = Network.https[0];
let result = undefined;
try {
result = await this.call2(provider, _pairlist, exchangePairABI );
} catch (e) {
logger.info(`${e}`);
}
//console.log(result)
logger.verbose(" Done multiGetPairData...")
return result
},
// return list of wallet data object.
getPairData: async function(Network, Exchange){
const _data = await tools.readFile(Network, botType.PAIRDATA_TYPE, Exchange)
return _data
},
// return list of wallet data object.
getAllPairData: async function(Network, Exchange){
const _data = await tools.readFile(Network, botType.PAIRDATA_TYPE, null)
return _data
},
// return list of wallet data object.
getPairIndex: async function(Network, Exchange){
const _data = await tools.readFile(Network, botType.PAIRINDEX_TYPE, Exchange)
return _data
},
addPairIndex: async function (Network, PairIndex, Exchange) {
logger.verbose(` Saving ${PairIndex.length} pair index information for router ${Exchange.factory} `);
let newArray = new Array()
const currentData = await this.getPairIndex(Network, Exchange);
for(let j = 0; j < currentData.length ; j++){
const PairIndexObject = currentData[j]
newArray.push(PairIndexObject);
}
for(let k = 0 ; k < PairIndex.length ; k++)
{
const PairIndexObject = PairIndex[k]
newArray.push(PairIndexObject)
}
await tools.writeFile(Network, botType.PAIRINDEX_TYPE, Exchange, newArray)
},
// TO BE REDONE RE-VISIT
addPairData: async function (Network, PairArray, Exchange) {
logger.verbose(` Saving ${PairArray.length} pair data information for router ${Exchange.factory} `);
const _currentData = new Object(await this.getPairData(Network, Exchange));
logger.verbose(` Loaded ${_currentData.length} pair data information for factory ${Exchange.factory} `);
for(let k = 0 ; k < PairArray.length ; k++)
{
const PairObject = new Object(PairArray[k])
//newArray.push(PairObject)
_currentData.push(PairObject)
}
await tools.writeFile(Network, botType.PAIRDATA_TYPE, Exchange, _currentData)
logger.info(` Final count after merging: ${_currentData.length} pair data information for factory ${Exchange.factory} `);
},
writePairIndex: async function (Network, PairIndex, Exchange) {
logger.verbose(` Saving ${PairIndex.length} token information for router ${Exchange.factory} `);
const _result = await tools.writeFile(Network, botType.PAIRINDEX_TYPE, Exchange, PairIndex)
if(_result) {
return true;
}
else {
logger.error(`error while saving record saved. `)
return false;
}
},
writePairData: async function (Network, PairArray, Exchange) {
logger.verbose(` Saving ${PairArray.length} token information for router ${Exchange.factory} `);
const _result = await tools.writeFile(Network, botType.PAIRDATA_TYPE, Exchange, PairArray)
if(_result) {
return true;
}
else {
logger.error(`error while saving record saved. `)
return false;
}
},
// NOT USED
getPairs: async function (factory, index, account, exchangePairABI) {
logger.debug(`Getting pairs ${index}`);
const pairAddress = await factory.allPairs(index);
const getTokenName = new ethers.Contract(
pairAddress,
exchangePairABI,
account)
const token0 = await getTokenName.token0();
const token1 = await getTokenName.token1();
const reserves = await getTokenName.getReserves();
logger.debug(` getPairs: ${pairAddress} : ${token0} : ${token1} : ${reserves}`);
const PairObject = Object({
"address": pairAddress,
"token0": token0,
"token1": token1,
"reserve": reserves
})
return PairObject;
//logger.info("Pair (" + i +") : "+ pairAddress + " : "+ token0symbol + " : " + token0 +" : "+ token0name +" : "+ reserves[0] + " : " + token1symbol + " : " + token1 +" : "+ token1name +" : "+ reserves[1] + " BlockNumber: " + reserves[2]);
},
call: async function(rpc, startIndex, pairCount, _routerFactory, _factoryABI) {
const exchangePair = new Array();
const pairArrayResult = new Array();
const callarray = new Array();
const ethcallProvider = new Provider();
const provider = new ethers.providers.JsonRpcProvider(rpc);
await ethcallProvider.init(provider);
for (let i = 0; i < (pairCount); i++) {
const FactoryContract = new Contract(
_routerFactory,
_factoryABI
);
exchangePair[i] = FactoryContract.allPairs(i+startIndex)
callarray.push(exchangePair[i]);
}
const data = await ethcallProvider.all(callarray);
let resultLength = data.length;
logger.debug(`Number of pairs in result: ${resultLength}`);
if (resultLength != callarray.length) {
logger.error(`Error in the result data count | received: ${resultLength} vs expected: ${callarray.length} `);
}
for(let i = 0 ; i < data.length ; i++)
{
const PairObject = Object({
"index": (i+startIndex),
"address": data[i]
})
pairArrayResult.push(PairObject);
logger.silly(`data received: ${data[i]}`)
}
return (pairArrayResult)
},
call2: async function(rpc, _pairlist, _exchangePairABI) {
const pairtoken0 = new Array();
const pairtoken1 = new Array();
const pairreserve = new Array();
const pairAddress = new Array();
const pairIndex = new Array();
const pairDataArrayResult = new Array();
const callarray = new Array();
const ethcallProvider = new Provider();
const provider = new ethers.providers.JsonRpcProvider(rpc);
await ethcallProvider.init(provider);
let totalCount = _pairlist.length;
for (let i = 0; i < totalCount; i++) {
let pairTemp = _pairlist[i]
const FactoryPairContract = new Contract(
pairTemp.address,
_exchangePairABI
);
pairtoken0[i] = FactoryPairContract.token0();
pairtoken1[i] = FactoryPairContract.token1();
pairreserve[i] = FactoryPairContract.getReserves();
pairAddress[i] = pairTemp.address
pairIndex[i] = pairTemp.index
callarray.push(pairtoken0[i]);
callarray.push(pairtoken1[i]);
callarray.push(pairreserve[i]);
}
const data = await ethcallProvider.all(callarray);
let resultLength = data.length;
logger.debug(`Number of pairs in result: ${resultLength}`);
if (resultLength != callarray.length) {
logger.error(`Error in the result data count | received: ${resultLength} vs expected: ${callarray.length} `);
}
let count = 0;
let index_pointer = 0;
let tokenA = undefined;
let tokenB = undefined;
let reserveAB = undefined;
for(let i = 0 ; i < data.length ; i++)
{
if(count == 0){
tokenA = data[i]
count++
}
else if(count == 1){
tokenB = data[i]
count++
}
else if(count == 2){
reserveAB = data[i]
const PairObject = new Object({
"index": pairIndex[index_pointer],
"address": pairAddress[index_pointer],
"token0": tokenA,
"token1": tokenB,
"reserve":reserveAB
})
//console.log(PairObject)
pairDataArrayResult.push(PairObject);
index_pointer++;
count = 0;
}
logger.debug(`data received: ${data[i]}`)
}
return pairDataArrayResult
},
}