Skip to content

Commit e6a532c

Browse files
committed
add support for timestampMs in ES
1 parent 1412ef0 commit e6a532c

29 files changed

Lines changed: 300 additions & 163 deletions

config/config.devnet-old.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,7 @@ inflation:
125125
nftProcess:
126126
parallelism: 1
127127
maxRetries: 3
128+
supernova:
129+
activation:
130+
epoch: 2030
131+
timestamp: 1764749472

config/config.devnet.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,8 @@ compression:
196196
enabled: true
197197
level: 6
198198
threshold: 1024
199-
chunkSize: 16384
199+
chunkSize: 16384
200+
supernova:
201+
activation:
202+
epoch: 2030
203+
timestamp: 1764749472

config/config.e2e-mocked.mainnet.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,7 @@ test:
7979
transaction-action:
8080
mex:
8181
microServiceUrl: 'https://graph.xexchange.com/graphql'
82+
supernova:
83+
activation:
84+
epoch: 2030
85+
timestamp: 1764749472

config/config.e2e.mainnet.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,7 @@ stakingV5Inflation:
191191
nftProcess:
192192
parallelism: 1
193193
maxRetries: 3
194+
supernova:
195+
activation:
196+
epoch: 2030
197+
timestamp: 1764749472

config/config.mainnet.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,3 +205,7 @@ customUrlHeaders:
205205
- urlPattern: ''
206206
headers:
207207
x-custom-auth: ''
208+
supernova:
209+
activation:
210+
epoch: 2030
211+
timestamp: 1764749472

config/config.testnet.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,7 @@ compression:
200200
level: 6
201201
threshold: 1024
202202
chunkSize: 16384
203+
supernova:
204+
activation:
205+
epoch: 2030
206+
timestamp: 1764749472

src/common/api-config/api.config.service.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1067,4 +1067,22 @@ export class ApiConfigService {
10671067

10681068
return undefined;
10691069
}
1070-
}
1070+
1071+
getSupernovaActivationEpoch(): number {
1072+
const epoch = this.configService.get<number>('supernova.activation.epoch');
1073+
if (epoch == null) {
1074+
throw new Error('No supernova.activation.epoch present');
1075+
}
1076+
1077+
return epoch;
1078+
}
1079+
1080+
getSupernovaActivationTimestamp(): number {
1081+
const timestamp = this.configService.get<number>('supernova.activation.timestamp');
1082+
if (timestamp == null) {
1083+
throw new Error('No supernova.activation.timestamp present');
1084+
}
1085+
1086+
return timestamp;
1087+
}
1088+
}

src/common/indexer/elastic/elastic.indexer.helper.ts

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { ApplicationFilter } from "src/endpoints/applications/entities/applicati
1919
import { NftType } from "../entities/nft.type";
2020
import { EventsFilter } from "src/endpoints/events/entities/events.filter";
2121
import { ScriptQuery } from "./script.query";
22+
import { TimeUtils } from "src/utils/time.utils";
2223

2324
@Injectable()
2425
export class ElasticIndexerHelper {
@@ -99,7 +100,14 @@ export class ElasticIndexerHelper {
99100
}
100101

101102
if (filter.before || filter.after) {
102-
elasticQuery = elasticQuery.withDateRangeFilter('timestamp', filter.before, filter.after);
103+
if (filter.before) {
104+
const timestampBeforeIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
105+
elasticQuery = elasticQuery.withRangeFilter(timestampBeforeIdentifier, new RangeLowerThanOrEqual(filter.before));
106+
}
107+
if (filter.after) {
108+
const timestampAfterIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
109+
elasticQuery = elasticQuery.withRangeFilter(timestampAfterIdentifier, new RangeGreaterThanOrEqual(filter.after));
110+
}
103111
}
104112

105113
if (filter.canCreate !== undefined) {
@@ -278,8 +286,13 @@ export class ElasticIndexerHelper {
278286
}
279287
}
280288

281-
if (filter.before || filter.after) {
282-
elasticQuery = elasticQuery.withDateRangeFilter('timestamp', filter.before, filter.after);
289+
if (filter.before) {
290+
const timestampBeforeIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
291+
elasticQuery = elasticQuery.withRangeFilter(timestampBeforeIdentifier, new RangeLowerThanOrEqual(filter.before));
292+
}
293+
if (filter.after) {
294+
const timestampAfterIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
295+
elasticQuery = elasticQuery.withRangeFilter(timestampAfterIdentifier, new RangeGreaterThanOrEqual(filter.after));
283296
}
284297

285298
if (filter.nonceBefore) {
@@ -408,8 +421,13 @@ export class ElasticIndexerHelper {
408421
elasticQuery = elasticQuery.withCondition(QueryConditionOptions.must, QueryType.Match('status', filter.status));
409422
}
410423

411-
if (filter.before || filter.after) {
412-
elasticQuery = elasticQuery.withDateRangeFilter('timestamp', filter.before, filter.after);
424+
if (filter.before) {
425+
const timestampBeforeIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
426+
elasticQuery = elasticQuery.withRangeFilter(timestampBeforeIdentifier, new RangeLowerThanOrEqual(filter.before));
427+
}
428+
if (filter.after) {
429+
const timestampAfterIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
430+
elasticQuery = elasticQuery.withRangeFilter(timestampAfterIdentifier, new RangeGreaterThanOrEqual(filter.after));
413431
}
414432

415433
if (filter.senderOrReceiver) {
@@ -553,7 +571,15 @@ export class ElasticIndexerHelper {
553571
.withMustMultiShouldCondition(filter.hashes, hash => QueryType.Match('_id', hash))
554572
.withMustMatchCondition('status', filter.status)
555573
.withMustMultiShouldCondition(filter.tokens, token => QueryType.Match('tokens', token, QueryOperator.AND))
556-
.withDateRangeFilter('timestamp', filter.before, filter.after);
574+
575+
if (filter.before) {
576+
const timestampBeforeIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
577+
elasticQuery = elasticQuery.withRangeFilter(timestampBeforeIdentifier, new RangeLowerThanOrEqual(filter.before));
578+
}
579+
if (filter.after) {
580+
const timestampAfterIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
581+
elasticQuery = elasticQuery.withRangeFilter(timestampAfterIdentifier, new RangeGreaterThanOrEqual(filter.after));
582+
}
557583

558584
if (filter.functions && filter.functions.length > 0) {
559585
if (filter.functions.length === 1 && filter.functions[0] === '') {
@@ -658,8 +684,13 @@ export class ElasticIndexerHelper {
658684

659685
let elasticQuery = ElasticQuery.create().withCondition(QueryConditionOptions.must, mustQueries);
660686

661-
if (filter && (filter.before || filter.after)) {
662-
elasticQuery = elasticQuery.withDateRangeFilter('timestamp', filter.before, filter.after);
687+
if (filter && filter.before) {
688+
const timestampBeforeIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
689+
elasticQuery = elasticQuery.withRangeFilter(timestampBeforeIdentifier, new RangeLowerThanOrEqual(filter.before));
690+
}
691+
if (filter && filter.after) {
692+
const timestampAfterIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
693+
elasticQuery = elasticQuery.withRangeFilter(timestampAfterIdentifier, new RangeGreaterThanOrEqual(filter.after));
663694
}
664695

665696
if (filter && filter.identifiers) {
@@ -764,11 +795,13 @@ export class ElasticIndexerHelper {
764795
let elasticQuery = ElasticQuery.create();
765796

766797
if (filter.after) {
767-
elasticQuery = elasticQuery.withRangeFilter('timestamp', new RangeGreaterThanOrEqual(filter.after));
798+
const timestampIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
799+
elasticQuery = elasticQuery.withRangeFilter(timestampIdentifier, new RangeGreaterThanOrEqual(filter.after));
768800
}
769801

770802
if (filter.before) {
771-
elasticQuery = elasticQuery.withRangeFilter('timestamp', new RangeLowerThanOrEqual(filter.before));
803+
const timestampIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
804+
elasticQuery = elasticQuery.withRangeFilter(timestampIdentifier, new RangeLowerThanOrEqual(filter.before));
772805
}
773806

774807
return elasticQuery;
@@ -791,11 +824,13 @@ export class ElasticIndexerHelper {
791824
let elasticQuery = ElasticQuery.create();
792825

793826
if (filter.before) {
794-
elasticQuery = elasticQuery.withRangeFilter('timestamp', new RangeLowerThanOrEqual(filter.before));
827+
const timestampIdentifier = TimeUtils.isTimestampInSeconds(filter.before) ? 'timestamp' : 'timestampMs';
828+
elasticQuery = elasticQuery.withRangeFilter(timestampIdentifier, new RangeLowerThanOrEqual(filter.before));
795829
}
796830

797831
if (filter.after) {
798-
elasticQuery = elasticQuery.withRangeFilter('timestamp', new RangeGreaterThanOrEqual(filter.after));
832+
const timestampIdentifier = TimeUtils.isTimestampInSeconds(filter.after) ? 'timestamp' : 'timestampMs';
833+
elasticQuery = elasticQuery.withRangeFilter(timestampIdentifier, new RangeGreaterThanOrEqual(filter.after));
799834
}
800835

801836
if (filter.identifier) {

src/common/indexer/elastic/elastic.indexer.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { NftType } from "../entities/nft.type";
3030
import { EventsFilter } from "src/endpoints/events/entities/events.filter";
3131
import { Events } from "../entities/events";
3232
import { EsCircuitBreakerProxy } from "./circuit-breaker/circuit.breaker.proxy.service";
33+
import { TimeUtils } from "src/utils/time.utils";
3334

3435
@Injectable()
3536
export class ElasticIndexerService implements IndexerInterface {
@@ -1031,8 +1032,9 @@ export class ElasticIndexerService implements IndexerInterface {
10311032
}
10321033

10331034
async getBlockByTimestampAndShardId(timestamp: number, shardId: number): Promise<Block | undefined> {
1035+
const timestampIdentifier = TimeUtils.isTimestampInSeconds(timestamp) ? 'timestamp' : 'timestampMs';
10341036
const elasticQuery = ElasticQuery.create()
1035-
.withRangeFilter('timestamp', new RangeGreaterThanOrEqual(timestamp))
1037+
.withRangeFilter(timestampIdentifier, new RangeGreaterThanOrEqual(timestamp))
10361038
.withCondition(QueryConditionOptions.must, [QueryType.Match('shardId', shardId, QueryOperator.AND)])
10371039
.withSort([{ name: 'timestamp', order: ElasticSortOrder.ascending }]);
10381040

src/common/indexer/entities/block.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface Block {
1212
size: number;
1313
sizeTxs: number;
1414
timestamp: number;
15+
timestampMs?: number;
1516
stateRootHash: string;
1617
prevHash: string;
1718
shardId: number;

0 commit comments

Comments
 (0)