Skip to content

Commit 8868570

Browse files
authored
Include overnightStreamMaxAgeInSeconds in tokenized-equity (#4792)
* Include overnightStreamMaxAgeInSeconds in tokenized-equity * Update test * Fix test
1 parent 8ed6339 commit 8868570

9 files changed

Lines changed: 191 additions & 39 deletions

File tree

.changeset/dirty-singers-add.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@chainlink/tokenized-equity-adapter': minor
3+
---
4+
5+
Include overnightStreamMaxAgeInSeconds

packages/composites/tokenized-equity/src/endpoint/common.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const inputExample = {
88
regularStreamId: '0x0',
99
extendedStreamId: '0x0',
1010
overnightStreamId: '0x0',
11+
overnightStreamMaxAgeInSeconds: 100,
1112
sessionMarket: 'nyse',
1213
sessionMarketType: '24/5',
1314
sessionBoundaries: ['04:00', '16:00', '20:00'],
@@ -39,6 +40,12 @@ export const inputDefinition = new InputParameters(
3940
type: 'string',
4041
description: 'Data Streams overnight hour feed ID for the underlying asset',
4142
},
43+
overnightStreamMaxAgeInSeconds: {
44+
required: false,
45+
type: 'number',
46+
description:
47+
'Ignore report if the streams report is older than current time by more than this value in seconds. If not provided, all reports will be processed regardless of age.',
48+
},
4249
sessionMarket: {
4350
required: true,
4451
type: 'string',
@@ -107,9 +114,9 @@ export type output = {
107114
decimals: number
108115
rawPrice: string
109116
stream: {
110-
regular: DataEngineResponse['Response']['Data']
111-
extended: DataEngineResponse['Response']['Data']
112-
overnight: DataEngineResponse['Response']['Data']
117+
regular?: DataEngineResponse['Response']['Data']
118+
extended?: DataEngineResponse['Response']['Data']
119+
overnight?: DataEngineResponse['Response']['Data']
113120
}
114121
smoother: {
115122
price: string

packages/composites/tokenized-equity/src/lib/streams.ts

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,21 @@ import { AdapterError } from '@chainlink/external-adapter-framework/validation/e
88
type DataEngineResponse = BaseEndpointTypes['Response']['Data']
99

1010
export const getPrice = async (
11+
url: string,
12+
requester: Requester,
1113
regularStreamId: string,
1214
extendedStreamId: string,
1315
overnightStreamId: string,
14-
url: string,
15-
requester: Requester,
16+
overnightStreamMaxAgeInSeconds?: number,
1617
) => {
17-
const [regular, extended, overnight] = await Promise.all(
18+
const [regular, extended, overnight] = await Promise.allSettled(
1819
[regularStreamId, extendedStreamId, overnightStreamId].map((streamId) =>
19-
getDeutscheBoersePrice(streamId, url, requester),
20+
getDeutscheBoersePrice(
21+
streamId,
22+
url,
23+
requester,
24+
streamId === overnightStreamId ? { maxAgeInSeconds: overnightStreamMaxAgeInSeconds } : {},
25+
),
2026
),
2127
)
2228

@@ -27,34 +33,49 @@ export const getPrice = async (
2733
spread: BigInt(stream.ask) - BigInt(stream.bid),
2834
decimals: stream.decimals,
2935
data: {
30-
regular,
31-
extended,
32-
overnight,
36+
regular: regular.status === 'fulfilled' ? regular.value : undefined,
37+
extended: extended.status === 'fulfilled' ? extended.value : undefined,
38+
overnight: overnight.status === 'fulfilled' ? overnight.value : undefined,
3339
},
3440
}
3541
}
3642

3743
const getStream = (
38-
regular: DataEngineResponse,
39-
extended: DataEngineResponse,
40-
overnight: DataEngineResponse,
44+
regular: PromiseSettledResult<DataEngineResponse>,
45+
extended: PromiseSettledResult<DataEngineResponse>,
46+
overnight: PromiseSettledResult<DataEngineResponse>,
4147
) => {
42-
if (regular.marketStatus === TwentyfourFiveMarketStatus.REGULAR) {
43-
return regular
48+
if (
49+
regular.status === 'fulfilled' &&
50+
regular.value.marketStatus === TwentyfourFiveMarketStatus.REGULAR
51+
) {
52+
return regular.value
53+
} else if (
54+
extended.status === 'fulfilled' &&
55+
(extended.value.marketStatus === TwentyfourFiveMarketStatus.POST_MARKET ||
56+
extended.value.marketStatus === TwentyfourFiveMarketStatus.PRE_MARKET)
57+
) {
58+
return extended.value
4459
} else if (
45-
extended.marketStatus === TwentyfourFiveMarketStatus.POST_MARKET ||
46-
extended.marketStatus === TwentyfourFiveMarketStatus.PRE_MARKET
60+
overnight.status === 'fulfilled' &&
61+
overnight.value.marketStatus === TwentyfourFiveMarketStatus.OVERNIGHT
4762
) {
48-
return extended
49-
} else if (overnight.marketStatus === TwentyfourFiveMarketStatus.OVERNIGHT) {
50-
return overnight
63+
return overnight.value
5164
} else {
5265
throw new AdapterError({
5366
statusCode: 503,
5467
message: `Market is not open: regular ${
55-
TwentyfourFiveMarketStatus[regular.marketStatus]
56-
}, extended ${TwentyfourFiveMarketStatus[extended.marketStatus]}, overnight ${
57-
TwentyfourFiveMarketStatus[overnight.marketStatus]
68+
regular.status === 'fulfilled'
69+
? ` ${TwentyfourFiveMarketStatus[regular.value.marketStatus]}`
70+
: ` ${regular.reason}`
71+
}, extended ${
72+
extended.status === 'fulfilled'
73+
? ` ${TwentyfourFiveMarketStatus[extended.value.marketStatus]}`
74+
: ` ${extended.reason}`
75+
}, overnight ${
76+
overnight.status === 'fulfilled'
77+
? ` ${TwentyfourFiveMarketStatus[overnight.value.marketStatus]}`
78+
: ` ${overnight.reason}`
5879
}`,
5980
})
6081
}

packages/composites/tokenized-equity/src/transport/ondoPrice.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const calculatePrice = async (param: {
1616
regularStreamId: string
1717
extendedStreamId: string
1818
overnightStreamId: string
19+
overnightStreamMaxAgeInSeconds?: number
1920
url: string
2021
tradingHoursUrl: string
2122
requester: Requester

packages/composites/tokenized-equity/src/transport/ondoTransport.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ const dedupeParams = (params: RequestParams[]) => {
120120
p.regularStreamId,
121121
p.extendedStreamId,
122122
p.overnightStreamId,
123+
p.overnightStreamMaxAgeInSeconds,
123124
p.sessionMarket,
124125
p.sessionMarketType,
125126
p.sessionBoundaries.join('|'),

packages/composites/tokenized-equity/src/transport/priceTransport.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ const dedupeParams = (params: RequestParams[]) => {
117117
p.regularStreamId,
118118
p.extendedStreamId,
119119
p.overnightStreamId,
120+
p.overnightStreamMaxAgeInSeconds,
120121
p.sessionMarket,
121122
p.sessionMarketType,
122123
p.sessionBoundaries.join('|'),

packages/composites/tokenized-equity/src/transport/smoothedPrice.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const smoothedStreamPrice = async (param: {
99
regularStreamId: string
1010
extendedStreamId: string
1111
overnightStreamId: string
12+
overnightStreamMaxAgeInSeconds?: number
1213
url: string
1314
tradingHoursUrl: string
1415
requester: Requester
@@ -21,11 +22,12 @@ export const smoothedStreamPrice = async (param: {
2122
}) => {
2223
const [price, secondsFromTransition] = await Promise.all([
2324
getPrice(
25+
param.url,
26+
param.requester,
2427
param.regularStreamId,
2528
param.extendedStreamId,
2629
param.overnightStreamId,
27-
param.url,
28-
param.requester,
30+
param.overnightStreamMaxAgeInSeconds,
2931
),
3032
calculateSecondsFromTransition(
3133
param.tradingHoursUrl,

0 commit comments

Comments
 (0)