From 5a30b9e0d1457683e4fe3e559c7f6638a47afea1 Mon Sep 17 00:00:00 2001 From: tommytrg Date: Mon, 9 Aug 2021 18:35:29 +0200 Subject: [PATCH] feat(api): load data feeds from config json file --- packages/api/sample.env | 3 +- .../src/{web3Middleware => }/abi/BtcUsd.json | 0 .../src/{web3Middleware => }/abi/EthUsd.json | 0 .../abi/WitnetRequestBoardProxy.json | 0 packages/api/src/dataFeeds.json | 74 +++++++++++ packages/api/src/index.ts | 32 ++++- packages/api/src/repository/Feed.ts | 16 ++- packages/api/src/repository/ResultRequest.ts | 12 +- packages/api/src/types.ts | 8 +- packages/api/src/web3Middleware/dataFeeds.ts | 119 ------------------ packages/api/test/feeds.spec.ts | 82 +++++++----- .../api/test/web3Middleware/index.spec.ts | 25 ++-- 12 files changed, 197 insertions(+), 174 deletions(-) rename packages/api/src/{web3Middleware => }/abi/BtcUsd.json (100%) rename packages/api/src/{web3Middleware => }/abi/EthUsd.json (100%) rename packages/api/src/{web3Middleware => }/abi/WitnetRequestBoardProxy.json (100%) create mode 100644 packages/api/src/dataFeeds.json delete mode 100644 packages/api/src/web3Middleware/dataFeeds.ts diff --git a/packages/api/sample.env b/packages/api/sample.env index 63b20b47..ac561578 100644 --- a/packages/api/sample.env +++ b/packages/api/sample.env @@ -6,4 +6,5 @@ MONGO_DATABASE_PASSWORD=your_password MONGO_INITDB_DATABASE=database GOERLI_PROVIDER=https://goerli.infura.io/v3/ KOVAN_PROVIDER=https://kovan.infura.io/v3/ -RINKEBY_PROVIDER=https://rinkeby.infura.io/v3/ \ No newline at end of file +RINKEBY_PROVIDER=https://rinkeby.infura.io/v3/ +DATA_FEED_CONFIG_PATH=/dataFeeds.json \ No newline at end of file diff --git a/packages/api/src/web3Middleware/abi/BtcUsd.json b/packages/api/src/abi/BtcUsd.json similarity index 100% rename from packages/api/src/web3Middleware/abi/BtcUsd.json rename to packages/api/src/abi/BtcUsd.json diff --git a/packages/api/src/web3Middleware/abi/EthUsd.json b/packages/api/src/abi/EthUsd.json similarity index 100% rename from packages/api/src/web3Middleware/abi/EthUsd.json rename to packages/api/src/abi/EthUsd.json diff --git a/packages/api/src/web3Middleware/abi/WitnetRequestBoardProxy.json b/packages/api/src/abi/WitnetRequestBoardProxy.json similarity index 100% rename from packages/api/src/web3Middleware/abi/WitnetRequestBoardProxy.json rename to packages/api/src/abi/WitnetRequestBoardProxy.json diff --git a/packages/api/src/dataFeeds.json b/packages/api/src/dataFeeds.json new file mode 100644 index 00000000..5998ccbf --- /dev/null +++ b/packages/api/src/dataFeeds.json @@ -0,0 +1,74 @@ +[ + { + "abi": "./abi/BtcUsd.json", + "address": "0xF2712e7114A237625EFC8bBA6a6ed1Bb8b6029c9", + "network": "mainnet", + "name": "btc/usd", + "label": "$", + "pollingPeriod": 3600000, + "witnetRequestBoard": { + "address": "0x400DbF3645b345823124aaB22D04013A46D9ceD5", + "abi": "./abi/WitnetRequestBoardProxy.json" + } + }, + { + "abi": "./abi/EthUsd.json", + "address": "0x1ebD93231a7fE551E1d6405404Df34909eff4c2C", + "network": "mainnet", + "name": "eth/usd", + "label": "$", + "pollingPeriod": 3600000, + "witnetRequestBoard": { + "address": "0x400DbF3645b345823124aaB22D04013A46D9ceD5", + "abi": "./abi/WitnetRequestBoardProxy.json" + } + }, + { + "abi": "./abi/BtcUsd.json", + "address": "0x58995FaD03158fB9cd64397347bA97714EF8fC12", + "witnetRequestBoard": { + "address": "0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04", + "abi": "./abi/WitnetRequestBoardProxy.json" + }, + "network": "rinkeby", + "name": "btc/usd", + "label": "$", + "pollingPeriod": 900000 + }, + { + "abi": "./abi/EthUsd.json", + "address": "0xAe9821fbA4Bd76fd6D39859bd7c3d4A90b2ceE40", + "witnetRequestBoard": { + "address": "0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04", + "abi": "./abi/WitnetRequestBoardProxy.json" + }, + "network": "rinkeby", + "name": "eth/usd", + "label": "$", + "pollingPeriod": 900000 + }, + { + "abi": "./abi/BtcUsd.json", + "address": "0x4958806608D2E3Aa22BD8818B555A0a24fe6c38E", + "network": "goerli", + "name": "btc/usd", + "label": "$", + "pollingPeriod": 900000, + "witnetRequestBoard": { + "address": "0x0C4be6AA667df48de54BA174bE7948875fdf152B", + "abi": "./abi/WitnetRequestBoardProxy.json" + } + }, + { + "abi": "./abi/EthUsd.json", + "address": "0xAa0AA725aEb1d382F909a8dE3041e9eaD6507501", + "network": "goerli", + "name": "eth/usd", + "label": "$", + "pollingPeriod": 900000, + "witnetRequestBoard": { + "address": "0x0C4be6AA667df48de54BA174bE7948875fdf152B", + "abi": "./abi/WitnetRequestBoardProxy.json" + } + } +] diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 68db6197..1a185f74 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,21 +1,23 @@ require('dotenv/config') +import fs from 'fs' +import path from 'path' import Web3 from 'web3' import { MongoManager } from './database' import { FeedRepository } from './repository/Feed' import { ResultRequestRepository } from './repository/ResultRequest' import { createServer } from './server' -import { Repositories } from './types' +import { FeedInfo, FeedInfoConfig, Repositories } from './types' import { Web3Middleware } from './web3Middleware/index' -import { dataFeeds } from './web3Middleware/dataFeeds' async function main () { const mongoManager = new MongoManager() const db = await mongoManager.start() + const dataFeeds = readDataFeeds() const repositories: Repositories = { - feedRepository: new FeedRepository(db), - resultRequestRepository: new ResultRequestRepository(db) + feedRepository: new FeedRepository(db, dataFeeds), + resultRequestRepository: new ResultRequestRepository(db, dataFeeds) } const web3Middleware = new Web3Middleware( @@ -33,4 +35,26 @@ async function main () { }) } +function readDataFeeds (): Array { + const dataFeeds: Array = JSON.parse( + fs.readFileSync(path.join(__dirname, process.env.DATA_FEED_CONFIG_PATH || '/dataFeeds.json'), 'utf-8') + ) + + return dataFeeds.map(dataFeed => ({ + ...dataFeed, + abi: JSON.parse( + fs.readFileSync(path.join(__dirname, dataFeed.abi), 'utf-8') + ), + witnetRequestBoard: { + ...dataFeed.witnetRequestBoard, + abi: JSON.parse( + fs.readFileSync( + path.join(__dirname, dataFeed.witnetRequestBoard.abi), + 'utf-8' + ) + ) + } + })) +} + main() diff --git a/packages/api/src/repository/Feed.ts b/packages/api/src/repository/Feed.ts index 4dade1b7..6ff74ab5 100644 --- a/packages/api/src/repository/Feed.ts +++ b/packages/api/src/repository/Feed.ts @@ -3,18 +3,26 @@ import { FeedDbObject, Collection, Db, - ObjectId + ObjectId, + FeedInfo } from '../types' export class FeedRepository { collection: Collection + // list of addresses to include in the search queries using address as an id for each data feed + dataFeedsAddresses: Array - constructor (db: Db) { + constructor (db: Db, dataFeeds: Array) { this.collection = db.collection('feed') + this.dataFeedsAddresses = dataFeeds.map(dataFeed => dataFeed.address) } async getAll () { - return (await this.collection.find({}).toArray()).map(this.normalizeId) + return ( + await this.collection + .find({ address: { $in: this.dataFeedsAddresses } }) + .toArray() + ).map(this.normalizeId) } async insert (feed: Omit) { @@ -42,7 +50,7 @@ export class FeedRepository { async getFeeds (page: number, size: number) { return ( await this.collection - .find({}) + .find({ address: { $in: this.dataFeedsAddresses } }) .skip(size * (page - 1)) .limit(size) .toArray() diff --git a/packages/api/src/repository/ResultRequest.ts b/packages/api/src/repository/ResultRequest.ts index e1c05f74..9c1ca5c6 100644 --- a/packages/api/src/repository/ResultRequest.ts +++ b/packages/api/src/repository/ResultRequest.ts @@ -3,14 +3,18 @@ import { ResultRequestDbObject, Db, Collection, - ObjectId + ObjectId, + FeedInfo } from '../types' export class ResultRequestRepository { collection: Collection + // list of addresses to include in the search queries using address as an id for each data feed + dataFeedsAddresses: Array - constructor (db: Db) { + constructor (db: Db, dataFeeds: Array) { this.collection = db.collection('result_request') + this.dataFeedsAddresses = dataFeeds.map(dataFeed => dataFeed.address) } async getFeedRequests (feedId: ObjectId) { @@ -27,7 +31,9 @@ export class ResultRequestRepository { async getFeedRequestsPage (feedId: ObjectId, page, size) { return ( await this.collection - .find({ feedId: feedId.toString() }) + .find({ + feedId: feedId.toString() + }) .sort({ timestamp: -1 }) .skip(size * (page - 1)) .limit(size) diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index 0d1c2b9f..dcb00844 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -21,8 +21,8 @@ export enum Network { Rinkeby = 'rinkeby' } -export type FeedInfo = { - abi: Array +export type FeedInfoGeneric = { + abi: ABI address: string network: Network name: string @@ -30,9 +30,11 @@ export type FeedInfo = { label: string witnetRequestBoard: { address: string - abi: Array + abi: ABI } } +export type FeedInfo = FeedInfoGeneric> +export type FeedInfoConfig = FeedInfoGeneric export type FeedDbObjectNormalized = FeedDbObject & { id: string } export type ResultRequestDbObjectNormalized = ResultRequestDbObject & { diff --git a/packages/api/src/web3Middleware/dataFeeds.ts b/packages/api/src/web3Middleware/dataFeeds.ts deleted file mode 100644 index a21292d3..00000000 --- a/packages/api/src/web3Middleware/dataFeeds.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { FeedInfo, Network, AbiItem } from '../types' -import BtcUsdAbi from './abi/BtcUsd.json' -import EthUsdAbi from './abi/EthUsd.json' -import WitnetRequestBoardProxy from './abi/WitnetRequestBoardProxy.json' - -export const dataFeeds: Array = [ - // Mainnet (id. 1) - v0.2.0: - // * WitnetRequestBoardProxy: [0x400DbF3645b345823124aaB22D04013A46D9ceD5](https://etherscan.io/address/0x400DbF3645b345823124aaB22D04013A46D9ceD5) - // * BtcUsdPriceFeed: [0xF2712e7114A237625EFC8bBA6a6ed1Bb8b6029c9](https://etherscan.io/address/0xF2712e7114A237625EFC8bBA6a6ed1Bb8b6029c9) - // * EthUsdPriceFeed: [0x1ebD93231a7fE551E1d6405404Df34909eff4c2C](https://etherscan.io/address/0x1ebD93231a7fE551E1d6405404Df34909eff4c2C) - { - abi: BtcUsdAbi as Array, - address: '0xF2712e7114A237625EFC8bBA6a6ed1Bb8b6029c9', - network: Network.Mainnet, - name: 'btc/usd', - label: '$', - pollingPeriod: 3600000, - witnetRequestBoard: { - address: '0x400DbF3645b345823124aaB22D04013A46D9ceD5', - abi: WitnetRequestBoardProxy as Array - } - }, - { - abi: EthUsdAbi as Array, - address: '0x1ebD93231a7fE551E1d6405404Df34909eff4c2C', - network: Network.Mainnet, - name: 'eth/usd', - label: '$', - pollingPeriod: 3600000, - witnetRequestBoard: { - address: '0x400DbF3645b345823124aaB22D04013A46D9ceD5', - abi: WitnetRequestBoardProxy as Array - } - }, - // Rinkeby (id. 4) - v0.2.0: - // * BtcUsdPriceFeed: [0x58995FaD03158fB9cd64397347bA97714EF8fC12](https://rinkeby.etherscan.io/address/0x58995FaD03158fB9cd64397347bA97714EF8fC12) - // * EthUsdPriceFeed: [0xAe9821fbA4Bd76fd6D39859bd7c3d4A90b2ceE40](https://rinkeby.etherscan.io/address/0xAe9821fbA4Bd76fd6D39859bd7c3d4A90b2ceE40) - // * WitnetRequestBoardProxy: [0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04](https://rinkeby.etherscan.io/address/0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04) - { - abi: BtcUsdAbi as Array, - address: '0x58995FaD03158fB9cd64397347bA97714EF8fC12', - witnetRequestBoard: { - address: '0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04', - abi: WitnetRequestBoardProxy as Array - }, - network: Network.Rinkeby, - name: 'btc/usd', - label: '$', - pollingPeriod: 900000 - }, - { - abi: EthUsdAbi as Array, - address: '0xAe9821fbA4Bd76fd6D39859bd7c3d4A90b2ceE40', - witnetRequestBoard: { - address: '0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04', - abi: WitnetRequestBoardProxy as Array - }, - network: Network.Rinkeby, - name: 'eth/usd', - label: '$', - pollingPeriod: 900000 - }, - // Goerli (id. 5) - v0.2.0: - // * BtcUsdPriceFeed: [0x4958806608D2E3Aa22BD8818B555A0a24fe6c38E](https://goerli.etherscan.io/address/0x4958806608D2E3Aa22BD8818B555A0a24fe6c38E#contracts) - // * EthUsdPriceFeed: [0xAa0AA725aEb1d382F909a8dE3041e9eaD6507501](https://goerli.etherscan.io/address/0xAa0AA725aEb1d382F909a8dE3041e9eaD6507501#contracts) - // * WitnetRequestBoardProxy: [0x0C4be6AA667df48de54BA174bE7948875fdf152B](https://goerli.etherscan.io/address/0x0C4be6AA667df48de54BA174bE7948875fdf152B#contracts) - { - abi: BtcUsdAbi as Array, - address: '0x4958806608D2E3Aa22BD8818B555A0a24fe6c38E', - network: Network.Goerli, - name: 'btc/usd', - label: '$', - pollingPeriod: 900000, - witnetRequestBoard: { - address: '0x0C4be6AA667df48de54BA174bE7948875fdf152B', - abi: WitnetRequestBoardProxy as Array - } - }, - { - abi: EthUsdAbi as Array, - address: '0xAa0AA725aEb1d382F909a8dE3041e9eaD6507501', - network: Network.Goerli, - name: 'eth/usd', - label: '$', - pollingPeriod: 900000, - witnetRequestBoard: { - address: '0x0C4be6AA667df48de54BA174bE7948875fdf152B', - abi: WitnetRequestBoardProxy as Array - } - } - // // Kovan (id. 42) - v0.2.0: - // // * BtcUsdPriceFeed: [0x9b3C5A6cB55E027d9ae6f265f6FB6fFA86e7b35E](https://kovan.etherscan.io/address/0x9b3C5A6cB55E027d9ae6f265f6FB6fFA86e7b35E#contracts) - // // * EthUsdPriceFeed: [0xA996939e6a07a0D1D6376c59BE515d8441f5E9b8](https://kovan.etherscan.io/address/0xA996939e6a07a0D1D6376c59BE515d8441f5E9b8#contracts) - // // * WitnetRequestBoardProxy: [0xD9a6d1Ea0d0f4795985725C7Bd40C31a667c033d](https://kovan.etherscan.io/address/0xD9a6d1Ea0d0f4795985725C7Bd40C31a667c033d#contracts) - // { - // abi: BtcUsdAbi as Array, - // address: '0x9b3C5A6cB55E027d9ae6f265f6FB6fFA86e7b35E', - // network: Network.Kovan, - // name: 'btc/usd', - // label: '$', - // pollingPeriod: 15000, - // witnetRequestBoard: { - // address: '0xD9a6d1Ea0d0f4795985725C7Bd40C31a667c033d', - // abi: WitnetRequestBoardProxy as Array - // } - // }, - // { - // abi: EthUsdAbi as Array, - // address: '0xA996939e6a07a0D1D6376c59BE515d8441f5E9b8', - // witnetRequestBoard: { - // address: '0x9b42b0D80C428B17A5828dF5C2c96454ca54bD04', - // abi: WitnetRequestBoardProxy as Array - // }, - // network: Network.Kovan, - // name: 'eth/usd', - // label: '$', - // pollingPeriod: 10000 - // } -] diff --git a/packages/api/test/feeds.spec.ts b/packages/api/test/feeds.spec.ts index d5d69f06..e357d31e 100644 --- a/packages/api/test/feeds.spec.ts +++ b/packages/api/test/feeds.spec.ts @@ -5,6 +5,7 @@ import { ApolloServerTestClient, createTestClient } from 'apollo-server-testing' import { MongoManager } from './../src/database' import { FeedRepository } from '../src/repository/Feed' import { ResultRequestRepository } from '../src/repository/ResultRequest' +import { dataFeeds } from './web3Middleware/dataFeeds' const state: { mongoManager: MongoManager @@ -22,8 +23,8 @@ describe('feeds', function () { const mongoManager = new MongoManager() const db = await mongoManager.start(process.env.CI ? ciUri : null) const server = await createServer({ - feedRepository: new FeedRepository(db), - resultRequestRepository: new ResultRequestRepository(db) + feedRepository: new FeedRepository(db, dataFeeds), + resultRequestRepository: new ResultRequestRepository(db, dataFeeds) }) await new Promise(resolve => { server.listen(info => { @@ -45,13 +46,8 @@ describe('feeds', function () { }) it('get feed list without data feeds', async () => { - await state.mongoManager.db.collection('feed').insertOne({ - address: '1', - name: 'btc/eur', - network: 'mainnet', - label: '$', - requests: [] - }) + const dataFeed = dataFeeds[0] + await state.mongoManager.db.collection('feed').insertOne(dataFeed) const GET_FEEDS = gql` query feeds($page: Int!, $pageSize: Int!) { @@ -81,22 +77,16 @@ describe('feeds', function () { }) expect(feeds.length).toBe(1) - expect(feeds[0]).toHaveProperty('address', '1') - expect(feeds[0]).toHaveProperty('name', 'btc/eur') + expect(feeds[0]).toHaveProperty('address', dataFeed.address) + expect(feeds[0]).toHaveProperty('name', dataFeed.name) expect(feeds[0].id).toBeTruthy() }) it('get feed list with data feeds', async () => { - const feedExample = { - address: '1', - name: 'btc/eur', - requests: [], - label: '$', - network: 'mainnet' - } + const dataFeed = dataFeeds[0] const feedResponse = await state.mongoManager.db .collection('feed') - .insertOne(feedExample) + .insertOne(dataFeed) const resultRequestExample1 = { result: '1111.0', feedId: feedResponse.ops[0]._id.toString(), @@ -168,8 +158,8 @@ describe('feeds', function () { } }) expect(feeds.length).toBe(1) - expect(feeds[0]).toHaveProperty('address', feedExample.address) - expect(feeds[0]).toHaveProperty('name', feedExample.name) + expect(feeds[0]).toHaveProperty('address', dataFeed.address) + expect(feeds[0]).toHaveProperty('name', dataFeed.name) expect(feeds[0]).toHaveProperty('lastResult', resultRequestExample1.result) expect(feeds[0].requests.length).toBe(2) expect(feeds[0].requests[0]).toHaveProperty( @@ -192,14 +182,9 @@ describe('feeds', function () { }) it('get feed', async () => { - const feedExample = { - address: '1', - name: 'btc/usd', - requests: [] - } const result = await state.mongoManager.db .collection('feed') - .insertOne(feedExample) + .insertOne(dataFeeds[0]) const { _id } = result.ops[0] @@ -226,9 +211,46 @@ describe('feeds', function () { } }) - expect(feed).toHaveProperty('address', feedExample.address) - expect(feed).toHaveProperty('name', feedExample.name) - expect(feed).toHaveProperty('requests', feedExample.requests) + expect(feed).toHaveProperty('address', dataFeeds[0].address) + expect(feed).toHaveProperty('name', dataFeeds[0].name) + expect(feed).toHaveProperty('requests', []) expect(feed.id).toBeTruthy() }) + + it('get only feeds specified in the data feed list', async () => { + await state.mongoManager.db.collection('feed').insertOne(dataFeeds[0]) + await state.mongoManager.db.collection('feed').insertOne({ + ...dataFeeds[1], + address: 'fabadaacabada' + }) + + const GET_FEEDS = gql` + query feeds($page: Int!, $pageSize: Int!) { + feeds(page: $page, pageSize: $pageSize) { + feeds { + id + name + address + lastResult + network + label + } + total + } + } + ` + const { + data: { + feeds: { feeds } + } + } = await state.testClient.query({ + query: GET_FEEDS, + variables: { + page: 1, + pageSize: 6 + } + }) + + expect(feeds.length).toBe(1) + }) }) diff --git a/packages/api/test/web3Middleware/index.spec.ts b/packages/api/test/web3Middleware/index.spec.ts index 020c2b14..0de9cc72 100644 --- a/packages/api/test/web3Middleware/index.spec.ts +++ b/packages/api/test/web3Middleware/index.spec.ts @@ -35,7 +35,8 @@ describe('web3Middleware', () => { it('should read the state of each datafeed provided', async () => { const feedInfos: Array = [dataFeeds[0]] const resultRequestRepository = new ResultRequestRepository( - ('' as unknown) as Db + ('' as unknown) as Db, + feedInfos ) resultRequestRepository.insert = jest.fn(async () => { return { @@ -50,7 +51,7 @@ describe('web3Middleware', () => { drTxHash: 'hash' } }) - const feedRepository = new FeedRepository(('' as unknown) as Db) + const feedRepository = new FeedRepository(('' as unknown) as Db, feedInfos) feedRepository.insert = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439011'), address: feedInfos[0].address, @@ -83,7 +84,8 @@ describe('web3Middleware', () => { it('should insert each new contract snapshot', async () => { const feedInfos: Array = [dataFeeds[0]] const resultRequestRepository = new ResultRequestRepository( - ('' as unknown) as Db + ('' as unknown) as Db, + feedInfos ) resultRequestRepository.insert = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), @@ -96,7 +98,7 @@ describe('web3Middleware', () => { timestamp: '1624363045259', drTxHash: 'hash' })) - const feedRepository = new FeedRepository(('' as unknown) as Db) + const feedRepository = new FeedRepository(('' as unknown) as Db, feedInfos) feedRepository.insert = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), address: feedInfos[0].address, @@ -131,7 +133,8 @@ describe('web3Middleware', () => { }) const resultRequestRepository = new ResultRequestRepository( - ('' as unknown) as Db + ('' as unknown) as Db, + feedInfos ) resultRequestRepository.insert = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), @@ -155,7 +158,7 @@ describe('web3Middleware', () => { timestamp: '1624363045259', drTxHash: 'hash' })) - const feedRepository = new FeedRepository(('' as unknown) as Db) + const feedRepository = new FeedRepository(('' as unknown) as Db, feedInfos) feedRepository.insert = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), address: feedInfos[0].address, @@ -194,7 +197,8 @@ describe('web3Middleware', () => { it('should initialize data feed if not exists', async () => { const feedInfos: Array = dataFeeds const resultRequestRepository = new ResultRequestRepository( - ('' as unknown) as Db + ('' as unknown) as Db, + feedInfos ) resultRequestRepository.insert = jest.fn(async ({ address }) => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), @@ -207,7 +211,7 @@ describe('web3Middleware', () => { timestamp: '1624363045259', drTxHash: 'hash' })) - const feedRepository = new FeedRepository(('' as unknown) as Db) + const feedRepository = new FeedRepository(('' as unknown) as Db, feedInfos) feedRepository.insert = jest.fn(async ({ address }) => ({ _id: new ObjectId('507f1f77bcf86cd799439011'), address: address, @@ -238,7 +242,8 @@ describe('web3Middleware', () => { it('should not initialize data feed if exists', async () => { const feedInfos: Array = dataFeeds const resultRequestRepository = new ResultRequestRepository( - ('' as unknown) as Db + ('' as unknown) as Db, + feedInfos ) resultRequestRepository.getLastResult = jest.fn(async () => ({ _id: new ObjectId('507f1f77bcf86cd799439012'), @@ -264,7 +269,7 @@ describe('web3Middleware', () => { drTxHash: 'hash' } }) - const feedRepository = new FeedRepository(('' as unknown) as Db) + const feedRepository = new FeedRepository(('' as unknown) as Db, feedInfos) feedRepository.insert = jest.fn(async ({ address }) => ({ _id: new ObjectId('507f1f77bcf86cd799439011'), address: address,