diff --git a/dist/api/lib/DataCollector/DataCollectorItem.js b/dist/api/lib/DataCollector/DataCollectorItem.js index 82ad011a..540025b7 100644 --- a/dist/api/lib/DataCollector/DataCollectorItem.js +++ b/dist/api/lib/DataCollector/DataCollectorItem.js @@ -124,8 +124,8 @@ class DataCollectorItem { } /** * Resolves item query parsing params - * @param {*} query - * @param {*} params + * @param {*} query + * @param {*} params */ async getItem(query, { fields, getPrevNext }) { try { diff --git a/dist/api/modules/ExtendedStats.js b/dist/api/modules/ExtendedStats.js index 7dead669..0b680c38 100644 --- a/dist/api/modules/ExtendedStats.js +++ b/dist/api/modules/ExtendedStats.js @@ -2,7 +2,7 @@ var _hashrateCalculator = require("../lib/hashrateCalculator"); var _difficultyCalculator = require("../lib/difficultyCalculator"); - +// 1 hour bucket size const DIFFICULTY_BUCKET_SIZE = 3600000; const PERIODS = { diff --git a/dist/api/modules/index.js b/dist/api/modules/index.js index 18de2a72..692f02ae 100644 --- a/dist/api/modules/index.js +++ b/dist/api/modules/index.js @@ -8,7 +8,7 @@ var _Stats = require("./Stats"); var _Summary = require("./Summary"); var _ContractVerification = require("./ContractVerification"); -var _apiTools = require("../lib/apiTools"); +var _apiTools = require("../lib/apiTools"); // import { ExtendedStats } from './ExtendedStats' const apiModules = { Block: _Block.Block, Tx: _Tx.Tx, Address: _Address.Address, Event: _Event.Event, Token: _Token.Token, TxPending: _TxPending.TxPending, Stats: _Stats.Stats, Summary: _Summary.Summary, ContractVerification: _ContractVerification.ContractVerification }; diff --git a/dist/dbPatches/tokenAccountBalances.js b/dist/dbPatches/tokenAccountBalances.js new file mode 100644 index 00000000..4406ec07 --- /dev/null +++ b/dist/dbPatches/tokenAccountBalances.js @@ -0,0 +1,58 @@ +"use strict"; +var _dataSource = _interopRequireDefault(require("../lib/dataSource.js")); +var _nod3Connect = _interopRequireDefault(require("../lib/nod3Connect")); +var _rskContractParser = _interopRequireDefault(require("rsk-contract-parser")); +var _rskUtils = require("rsk-utils");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +const parser = new _rskContractParser.default({ nod3: _nod3Connect.default }); + +patch().then(() => { + console.log('DONE!'); +}).catch(err => { + console.log('ERROR'); + console.log(err); + process.exit(9); +}); + +async function patch() { + try { + let { db } = await (0, _dataSource.default)({ skipCheck: true }); + let collection = db.collection('tokensAddresses'); + let cursor = collection.find(); + await cursor.forEach(async account => { + try { + let { balance, contract, address, _id } = account; + let name = `${contract}--${address}`; + if (balance !== null) { + console.log(`Getting balance for ${name}`); + let newBalance = await getBalance(account); + newBalance = (0, _rskUtils.add0x)(newBalance.toString(16)); + if (balance !== newBalance) { + console.log(`Updating balance for ${name}`); + await collection.updateOne({ _id }, { $set: { balance: newBalance } }); + } else { + console.log(`${name} .... OK`); + } + } else { + console.log(`${name} has null balance, skipped`); + } + } catch (err) { + console.log(err, account); + return Promise.reject(err); + } + }); + } catch (err) { + console.log(err); + process.exit(9); + } +} + +async function getBalance({ address, contract }, { abi } = {}) { + try { + let Contract = parser.makeContract(contract, abi); + let balance = await Contract.call('balanceOf', [address]); + return balance; + } catch (err) { + return Promise.reject(err); + } +} \ No newline at end of file diff --git a/dist/lib/Db.js b/dist/lib/Db.js index c2e0c19a..1bcd3752 100644 --- a/dist/lib/Db.js +++ b/dist/lib/Db.js @@ -1,6 +1,5 @@ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = exports.Db = void 0;var _mongodb = require("mongodb"); - const connectionOptions = { useNewUrlParser: true, useUnifiedTopology: true }; class Db { constructor(config) { diff --git a/dist/lib/btcUtils.js b/dist/lib/btcUtils.js index c31c8cbd..ca6657b9 100644 --- a/dist/lib/btcUtils.js +++ b/dist/lib/btcUtils.js @@ -1,7 +1,7 @@ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.rskAddressFromBtcPublicKey = exports.compressPublic = exports.decompressPublic = exports.parsePublic = exports.pubToAddress = exports.h160toAddress = exports.h160 = exports.sha256 = void 0;var _crypto = _interopRequireDefault(require("crypto")); var bs58 = _interopRequireWildcard(require("bs58")); var _utils = require("./utils"); -var _secp256k = _interopRequireDefault(require("secp256k1"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};if (obj != null) {var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} +var _secp256k = _interopRequireDefault(require("secp256k1"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} const PREFIXES = { mainnet: { diff --git a/dist/lib/initialConfiguration.js b/dist/lib/initialConfiguration.js index 2eaec715..b1572a3e 100644 --- a/dist/lib/initialConfiguration.js +++ b/dist/lib/initialConfiguration.js @@ -2,9 +2,9 @@ var _fs = _interopRequireDefault(require("fs")); var _utils = require("./utils");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} - - - +/** + * + */ const defaultConfig = { nativeContracts: { diff --git a/dist/services/classes/Block.js b/dist/services/classes/Block.js index 2c09760b..c72012cb 100644 --- a/dist/services/classes/Block.js +++ b/dist/services/classes/Block.js @@ -309,8 +309,9 @@ class Block extends _BcThing.BcThing { } newContract(address, data) { - const { nod3, initConfig } = this; - let contract = new _Contract.default(address, data, { nod3, initConfig }); + let { nod3, initConfig } = this; + let { block } = this.data; + let contract = new _Contract.default(address, data, { nod3, initConfig, block }); this.contracts[address] = contract; return contract; } @@ -386,6 +387,8 @@ const getBlockFromDb = async (blockHashOrNumber, collection) => { const deleteBlockDataFromDb = async (blockHash, blockNumber, db) => { try { + blockNumber = parseInt(blockNumber); + if (blockNumber < 1) throw new Error(`The blockNumber is wrong`); if (!blockHash) throw new Error(`Empty block hash`); let hash = blockHash; let result = {}; diff --git a/dist/services/classes/Contract.js b/dist/services/classes/Contract.js index 0ebb4563..8673bedf 100644 --- a/dist/services/classes/Contract.js +++ b/dist/services/classes/Contract.js @@ -5,13 +5,14 @@ var _TokenAddress = _interopRequireDefault(require("./TokenAddress")); var _utils = require("../../lib/utils");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} class Contract extends _BcThing.BcThing { - constructor(address, creationData, { nod3, initConfig }) { + constructor(address, creationData, { nod3, initConfig, block }) { super({ nod3, initConfig }); if (!this.isAddress(address)) throw new Error(`Contract: invalid address ${address}`); this.parser = new _rskContractParser.default({ initConfig, nod3 }); this.address = address; this.creationData = creationData; const createdByTx = creationData && creationData.tx ? creationData.tx : null; + this.block = block; this.data = { address, createdByTx, diff --git a/dist/services/classes/RequestBlocks.js b/dist/services/classes/RequestBlocks.js index 7dba54b0..d032215d 100644 --- a/dist/services/classes/RequestBlocks.js +++ b/dist/services/classes/RequestBlocks.js @@ -4,6 +4,7 @@ var _BlocksBase = require("../../lib/BlocksBase"); var _types = require("../../lib/types"); var _Block = require("./Block"); var _utils = require("../../lib/utils"); +var _UpdateTokenAccountBalances = require("./UpdateTokenAccountBalances"); class Emitter extends _events.EventEmitter {} @@ -140,9 +141,11 @@ async function getBlock(hashOrNumber, { nod3, collections, log, initConfig }) { } try { let newBlock = new _Block.Block(hashOrNumber, { nod3, collections, log, initConfig }); - let block = await newBlock.save().then(res => { + let block = await newBlock.save().then(async res => { if (!res || !res.data) return; - return res.data.block; + let block = res.data.block; + await (0, _UpdateTokenAccountBalances.updateTokenAccountBalances)(block, { nod3, collections, initConfig, log }); + return block; }); return { block, key: hashOrNumber }; } catch (error) { diff --git a/dist/services/classes/TokenAddress.js b/dist/services/classes/TokenAddress.js index 0dd7596e..22346e77 100644 --- a/dist/services/classes/TokenAddress.js +++ b/dist/services/classes/TokenAddress.js @@ -1,11 +1,16 @@ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.default = exports.TokenAddress = void 0;var _BcThing = require("./BcThing"); -var _Contract = _interopRequireDefault(require("./Contract"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} +var _Contract = _interopRequireDefault(require("./Contract")); +var _utils = require("../../lib/utils");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} class TokenAddress extends _BcThing.BcThing { constructor(address, contract) { if (!(contract instanceof _Contract.default)) { throw new Error('contract is not instance of Contract'); } + let { block } = contract; + if (!(0, _utils.isBlockObject)(block)) { + throw new Error(`Block must be a block object`); + } const { initConfig } = contract; super({ initConfig }); if (!this.isAddress(address)) { @@ -13,10 +18,12 @@ class TokenAddress extends _BcThing.BcThing { } this.Contract = contract; this.address = address; + let { number, hash } = block; this.data = { address, contract: this.Contract.address, - balance: null }; + balance: null, + block: { number, hash } }; } async fetch() { diff --git a/dist/services/classes/Tx.js b/dist/services/classes/Tx.js index 7d4dcae9..8da858a2 100644 --- a/dist/services/classes/Tx.js +++ b/dist/services/classes/Tx.js @@ -22,7 +22,6 @@ class Tx extends _BcThing.BcThing { } catch (err) { return Promise.reject(err); } - } async getTx() { diff --git a/dist/services/classes/UpdateTokenAccountBalances.js b/dist/services/classes/UpdateTokenAccountBalances.js new file mode 100644 index 00000000..3d09bfd4 --- /dev/null +++ b/dist/services/classes/UpdateTokenAccountBalances.js @@ -0,0 +1,42 @@ +"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.updateTokenAccountBalances = updateTokenAccountBalances; +var _rskUtils = require("rsk-utils"); +var _rskContractParser = _interopRequireDefault(require("rsk-contract-parser"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} + +async function updateTokenAccountBalances(block, { nod3, collections, log }) { + const parser = new _rskContractParser.default({ nod3 }); + let { number } = block; + number = parseInt(number) - 1; + if (number < 1) return; + log.trace(`Checking token account balances for block ${number}`); + try { + let collection = collections.TokensAddrs; + let query = { 'block.number': number }; + let cursor = collection.find(query); + await cursor.forEach(async account => { + try { + let { balance, _id, address, contract } = account; + let newBalance = await getBalance(account, { parser }); + if (balance !== newBalance) { + log.info(`Updating token account balance ${contract}--${address}`); + await collection.updateOne({ _id }, { $set: { balance: newBalance } }); + } + } catch (err) { + log.error(err); + return Promise.reject(err); + } + }); + } catch (err) { + return Promise.reject(err); + } +} + +async function getBalance({ address, contract }, { parser, abi } = {}) { + try { + let Contract = parser.makeContract(contract, abi); + let balance = await Contract.call('balanceOf', [address]); + if (balance) balance = (0, _rskUtils.add0x)(balance.toString(16)); + return balance; + } catch (err) { + return Promise.reject(err); + } +} \ No newline at end of file diff --git a/dist/services/userEvents/ContractVerifierModule.js b/dist/services/userEvents/ContractVerifierModule.js index c06406d9..58caf99a 100644 --- a/dist/services/userEvents/ContractVerifierModule.js +++ b/dist/services/userEvents/ContractVerifierModule.js @@ -2,7 +2,7 @@ var _StoredConfig = require("../../lib/StoredConfig"); var _mongodb = require("mongodb");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} - +// id to store solc versions list on Config collection const versionsId = '_contractVerifierVersions';exports.versionsId = versionsId; function ContractVerifierModule(db, collections, { url } = {}, { log } = {}) { diff --git a/dist/tools/wsChannel.js b/dist/tools/wsChannel.js index 24c5c2c2..3fffe757 100644 --- a/dist/tools/wsChannel.js +++ b/dist/tools/wsChannel.js @@ -1,5 +1,5 @@ "use strict";var _socket = _interopRequireDefault(require("socket.io-client")); -var c = _interopRequireWildcard(require("../lib/cli"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};if (obj != null) {var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} +var c = _interopRequireWildcard(require("../lib/cli"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} const url = process.argv[2]; let channel = process.argv[3]; diff --git a/dist/tools/wsGet.js b/dist/tools/wsGet.js index 6a283da4..8fb921f0 100644 --- a/dist/tools/wsGet.js +++ b/dist/tools/wsGet.js @@ -3,7 +3,7 @@ var c = _interopRequireWildcard(require("../lib/cli")); var _fs = _interopRequireDefault(require("fs")); var _crypto = _interopRequireDefault(require("crypto")); var URL = _interopRequireWildcard(require("url")); -var _package = _interopRequireDefault(require("../../package.json"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};if (obj != null) {var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} +var _package = _interopRequireDefault(require("../../package.json"));function _getRequireWildcardCache() {if (typeof WeakMap !== "function") return null;var cache = new WeakMap();_getRequireWildcardCache = function () {return cache;};return cache;}function _interopRequireWildcard(obj) {if (obj && obj.__esModule) {return obj;}if (obj === null || typeof obj !== "object" && typeof obj !== "function") {return { default: obj };}var cache = _getRequireWildcardCache();if (cache && cache.has(obj)) {return cache.get(obj);}var newObj = {};var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;for (var key in obj) {if (Object.prototype.hasOwnProperty.call(obj, key)) {var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;if (desc && (desc.get || desc.set)) {Object.defineProperty(newObj, key, desc);} else {newObj[key] = obj[key];}}}newObj.default = obj;if (cache) {cache.set(obj, newObj);}return newObj;}function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} const url = process.env.url || 'ws://localhost:3003'; if (process.argv[2] === '--help') help(); diff --git a/package-lock.json b/package-lock.json index 97321b2b..0a34e585 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "rsk-explorer-api", - "version": "1.0.5", + "version": "1.0.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9b5fd892..c31acb23 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rsk-explorer-api", - "version": "1.0.5", + "version": "1.0.6", "description": "", "main": "index.js", "scripts": { diff --git a/public/swagger.json b/public/swagger.json index 1cb6ba7e..ec2ed0ef 100644 --- a/public/swagger.json +++ b/public/swagger.json @@ -1,7 +1,7 @@ { "info": { "title": "rsk-explorer-api", - "version": "1.0.5", + "version": "1.0.6", "description": "explorer API Documentation" }, "swagger": "2.0",