Skip to content

Commit 018683d

Browse files
committed
Add stats wihtin ddo in MetadataCreated. Update logic in OrderStarted.
1 parent 27075f7 commit 018683d

File tree

1 file changed

+91
-7
lines changed

1 file changed

+91
-7
lines changed

src/components/Indexer/processor.ts

Lines changed: 91 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
1616
import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js'
1717
import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type: 'json' }
1818
import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' assert { type: 'json' }
19+
import Dispenser from '@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json' assert { type: 'json' }
20+
import FixedRateExchange from '@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json' assert { type: 'json' }
21+
1922
import { getDatabase } from '../../utils/database.js'
2023
import { PROTOCOL_COMMANDS, EVENTS, MetadataStates } from '../../utils/constants.js'
2124
import { getDtContract, wasNFTDeployedByOurFactory } from './utils.js'
@@ -40,13 +43,18 @@ class BaseEventProcessor {
4043
this.networkId = chainId
4144
}
4245

43-
protected getTokenInfo(services: any[]): any[] {
46+
protected async getTokenInfo(services: any[], signer: Signer): Promise<any[]> {
4447
const datatokens: any[] = []
45-
services.forEach((service) => {
48+
services.forEach(async (service) => {
49+
const datatoken = new ethers.Contract(
50+
service.datatokenAddress,
51+
ERC20Template.abi,
52+
signer
53+
)
4654
datatokens.push({
4755
address: service.datatokenAddress,
48-
name: 'Datatoken',
49-
symbol: 'DT1',
56+
name: await datatoken.name(),
57+
symbol: await datatoken.symbol(),
5058
serviceId: service.id
5159
})
5260
})
@@ -362,7 +370,7 @@ export class MetadataEventProcessor extends BaseEventProcessor {
362370
// stuff that we overwrite
363371
ddo.chainId = chainId
364372
ddo.nftAddress = event.address
365-
ddo.datatokens = this.getTokenInfo(ddo.services)
373+
ddo.datatokens = await this.getTokenInfo(ddo.services, signer)
366374
ddo.nft = await this.getNFTInfo(
367375
ddo.nftAddress,
368376
signer,
@@ -431,6 +439,77 @@ export class MetadataEventProcessor extends BaseEventProcessor {
431439

432440
// we need to store the event data (either metadata created or update and is updatable)
433441
if ([EVENTS.METADATA_CREATED, EVENTS.METADATA_UPDATED].includes(eventName)) {
442+
if (eventName === EVENTS.METADATA_CREATED) {
443+
for (const service of ddo.services) {
444+
const datatoken = new ethers.Contract(
445+
service.datatokenAddress,
446+
ERC20Template.abi,
447+
signer
448+
)
449+
let dispensers = []
450+
let fixedRates = []
451+
let prices = []
452+
try {
453+
dispensers = await datatoken.getDispensers()
454+
} catch (e) {
455+
INDEXER_LOGGER.error(`Contract call fails when retrieving dispensers: ${e}`)
456+
}
457+
if (dispensers) {
458+
for (const dispenser of dispensers) {
459+
const dispenserContract = new ethers.Contract(
460+
dispenser,
461+
Dispenser.abi,
462+
signer
463+
)
464+
if ((await dispenserContract.status())[0] === true) {
465+
ddo.indexedMetadata.stats.push({
466+
datatokenAddress: service.datatokenAddress,
467+
name: await datatoken.name(),
468+
serviceId: service.id,
469+
orders: 0, // just created
470+
prices: prices.push({
471+
type: 'dispenser',
472+
price: '0',
473+
contract: dispenser
474+
})
475+
})
476+
}
477+
}
478+
}
479+
try {
480+
fixedRates = await datatoken.getFixedRates()
481+
} catch (e) {
482+
INDEXER_LOGGER.error(
483+
`Contract call fails when retrieving fixed rate exchanges: ${e}`
484+
)
485+
}
486+
if (fixedRates) {
487+
for (const fixedRate of fixedRates) {
488+
const fixedRateContract = new ethers.Contract(
489+
fixedRate.address,
490+
FixedRateExchange.abi,
491+
signer
492+
)
493+
const exchange = await fixedRateContract.getExchange(fixedRate.id)
494+
if (exchange[6] === true) {
495+
ddo.indexedMetadata.stats.push({
496+
datatokenAddress: service.datatokenAddress,
497+
name: await datatoken.name(),
498+
serviceId: service.id,
499+
orders: 0, // just created
500+
prices: prices.push({
501+
type: 'fixedRate',
502+
price: exchange[5],
503+
token: exchange[1],
504+
contract: fixedRate,
505+
exchangeId: fixedRate.id
506+
})
507+
})
508+
}
509+
}
510+
}
511+
}
512+
}
434513
if (!ddo.event) {
435514
ddo.event = {}
436515
}
@@ -664,11 +743,16 @@ export class OrderStartedEventProcessor extends BaseEventProcessor {
664743
return
665744
}
666745
if (
667-
'stats' in ddo &&
746+
'indexedMetadata' in ddo &&
668747
ddo.services[serviceIndex].datatokenAddress?.toLowerCase() ===
669748
event.address?.toLowerCase()
670749
) {
671-
ddo.stats.orders += 1
750+
for (const stat of ddo.indexedMetadata.stats) {
751+
if (stat.datatokenAddress.toLowerCase() === event.address?.toLowerCase()) {
752+
stat.orders += 1
753+
break
754+
}
755+
}
672756
} else {
673757
// Still update until we validate and polish schemas for DDO.
674758
// But it should update ONLY if first condition is met.

0 commit comments

Comments
 (0)