@@ -16,6 +16,9 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
1616import { LOG_LEVELS_STR } from '../../utils/logging/Logger.js'
1717import ERC721Template from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json' assert { type : 'json' }
1818import 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+
1922import { getDatabase } from '../../utils/database.js'
2023import { PROTOCOL_COMMANDS , EVENTS , MetadataStates } from '../../utils/constants.js'
2124import { 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