Skip to content

Commit 70fd324

Browse files
[OPDATA-4255] DBAG Tadegate v2 (#4120)
* First commit with refactor'd 2 endpoints * Fixed tests * Changeset * Added bidsz and asksz * revision * added back files * Put base back in * tests and comments * Updated snapshot * removed timestamps * removed optional * Revision * removed files * fixed nit * revision * Fixes multi market subscriptions * Minor change * Typo fix --------- Co-authored-by: Mohamed Mehany <[email protected]>
1 parent 924d3be commit 70fd324

File tree

14 files changed

+668
-210
lines changed

14 files changed

+668
-210
lines changed

.changeset/late-queens-check.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@chainlink/deutsche-boerse-adapter': minor
3+
---
4+
5+
Split the endpoints and added support for tradegate
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export { endpoint as lwba } from './lwba'
2+
export { endpoint as price } from './price'

packages/sources/deutsche-boerse/src/endpoint/lwba.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { AdapterEndpoint } from '@chainlink/external-adapter-framework/adapter'
1+
import { AdapterEndpoint } from '@chainlink/external-adapter-framework/adapter/endpoint'
22
import { InputParameters } from '@chainlink/external-adapter-framework/validation'
33
import { config } from '../config'
4-
import { wsTransport } from '../transport/lwba'
4+
import { lwbaProtobufWsTransport } from '../transport/lwba'
55

6-
export const MARKETS = ['md-xetraetfetp'] as const
6+
export const MARKETS = ['md-xetraetfetp', 'md-tradegate'] as const
77
export type Market = (typeof MARKETS)[number]
88

99
export const inputParameters = new InputParameters(
@@ -30,27 +30,26 @@ export const inputParameters = new InputParameters(
3030
],
3131
)
3232

33-
interface LwbaLatestPriceResponse {
33+
interface LwbaResponse {
3434
Result: number | null
3535
Data: {
3636
mid: number
3737
bid: number
3838
ask: number
39-
latestPrice: number
40-
quoteProviderIndicatedTimeUnixMs: number
41-
tradeProviderIndicatedTimeUnixMs: number
39+
bidSize: number
40+
askSize: number
4241
}
4342
}
4443

4544
export type BaseEndpointTypes = {
4645
Parameters: typeof inputParameters.definition
47-
Response: LwbaLatestPriceResponse
46+
Response: LwbaResponse
4847
Settings: typeof config.settings
4948
}
5049

5150
export const endpoint = new AdapterEndpoint({
5251
name: 'lwba',
5352
aliases: [],
54-
transport: wsTransport,
53+
transport: lwbaProtobufWsTransport,
5554
inputParameters,
5655
})
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { AdapterEndpoint } from '@chainlink/external-adapter-framework/adapter'
2+
import { config } from '../config'
3+
import { priceProtobufWsTransport } from '../transport/price'
4+
import { inputParameters } from './lwba'
5+
6+
export interface PriceResponse {
7+
Result: number | null
8+
Data: {
9+
latestPrice: number
10+
}
11+
}
12+
13+
export type BaseEndpointTypes = {
14+
Parameters: typeof inputParameters.definition
15+
Response: PriceResponse
16+
Settings: typeof config.settings
17+
}
18+
19+
export const endpoint = new AdapterEndpoint({
20+
name: 'price',
21+
aliases: [],
22+
transport: priceProtobufWsTransport,
23+
inputParameters,
24+
})
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { expose, ServerInstance } from '@chainlink/external-adapter-framework'
22
import { Adapter } from '@chainlink/external-adapter-framework/adapter'
33
import { config } from './config'
4-
import { lwba } from './endpoint'
4+
import { lwba, price } from './endpoint'
55

66
export const adapter = new Adapter({
77
defaultEndpoint: lwba.name,
88
name: 'DEUTSCHE_BOERSE',
99
config,
10-
endpoints: [lwba],
10+
endpoints: [lwba, price],
1111
})
1212

1313
export const server = (): Promise<ServerInstance | undefined> => expose(adapter)

packages/sources/deutsche-boerse/src/transport/instrument-quote-cache.ts

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,71 +4,112 @@ export type Quote = {
44
bid?: number
55
ask?: number
66
mid?: number
7+
bidSize?: number
8+
askSize?: number
79
latestPrice?: number
810
quoteProviderTimeUnixMs?: number
911
tradeProviderTimeUnixMs?: number
1012
}
1113

1214
export class InstrumentQuoteCache {
13-
private readonly map = new Map<string, Quote>()
15+
private readonly map = new Map<string, Map<string, Quote>>()
1416

15-
activate(isin: string) {
16-
if (!this.map.has(isin)) this.map.set(isin, {})
17+
isEmpty(): boolean {
18+
return this.map.size === 0
19+
}
20+
21+
hasMarket(market: string): boolean {
22+
const marketMap = this.map.get(market)
23+
return !!marketMap && marketMap.size > 0
24+
}
25+
26+
getMarkets(): string[] {
27+
return [...this.map].flatMap(([market, bucket]) => (bucket.size ? [market] : []))
1728
}
18-
deactivate(isin: string) {
19-
this.map.delete(isin)
29+
30+
activate(market: string, isin: string) {
31+
let marketMap = this.map.get(market)
32+
if (!marketMap) {
33+
marketMap = new Map<string, Quote>()
34+
this.map.set(market, marketMap)
35+
}
36+
if (!marketMap.has(isin)) marketMap.set(isin, {})
37+
}
38+
39+
deactivate(market: string, isin: string) {
40+
const marketMap = this.map.get(market)
41+
if (!marketMap) {
42+
return
43+
}
44+
marketMap.delete(isin)
45+
if (marketMap.size === 0) {
46+
this.map.delete(market)
47+
}
2048
}
21-
has(isin: string): boolean {
22-
return this.map.has(isin)
49+
50+
has(market: string, isin: string): boolean {
51+
return this.map.get(market)?.has(isin) ?? false
2352
}
24-
get(isin: string): Quote | undefined {
25-
return this.map.get(isin)
53+
54+
get(market: string, isin: string): Quote | undefined {
55+
return this.map.get(market)?.get(isin)
2656
}
27-
addQuote(isin: string, bid: number, ask: number, providerTime: number) {
28-
const quote = this.get(isin)
57+
58+
addQuote(
59+
market: string,
60+
isin: string,
61+
bid: number,
62+
ask: number,
63+
providerTime: number,
64+
bidSz: number,
65+
askSz: number,
66+
) {
67+
const quote = this.get(market, isin)
2968
if (!quote) {
30-
throw new Error(`Cannot add quote for inactive ISIN ${isin}`)
69+
throw new Error(`Cannot add quote for inactive instrument ${market}-${isin}`)
3170
}
3271
const mid = new Decimal(bid).plus(ask).div(2)
3372
quote.bid = bid
3473
quote.ask = ask
3574
quote.mid = mid.toNumber()
3675
quote.quoteProviderTimeUnixMs = providerTime
76+
quote.bidSize = bidSz
77+
quote.askSize = askSz
3778
}
38-
addBid(isin: string, bid: number, providerTime: number) {
39-
const quote = this.get(isin)
79+
80+
addBid(market: string, isin: string, bid: number, providerTime: number, bidSz?: number) {
81+
const quote = this.get(market, isin)
4082
if (!quote) {
4183
throw new Error(`Cannot add quote for inactive ISIN ${isin}`)
4284
}
4385
if (quote.ask !== undefined) {
44-
const mid = new Decimal(bid).plus(quote.ask).div(2)
45-
quote.mid = mid.toNumber()
86+
quote.mid = new Decimal(bid).plus(quote.ask).div(2).toNumber()
4687
}
4788
quote.bid = bid
4889
quote.quoteProviderTimeUnixMs = providerTime
90+
quote.bidSize = bidSz
4991
}
50-
addAsk(isin: string, ask: number, providerTime: number) {
51-
const quote = this.get(isin)
92+
93+
addAsk(market: string, isin: string, ask: number, providerTime: number, askSz?: number) {
94+
const quote = this.get(market, isin)
5295
if (!quote) {
5396
throw new Error(`Cannot add quote for inactive ISIN ${isin}`)
5497
}
5598

5699
if (quote.bid !== undefined) {
57-
const mid = new Decimal(quote.bid).plus(ask).div(2)
58-
quote.mid = mid.toNumber()
100+
quote.mid = new Decimal(quote.bid).plus(ask).div(2).toNumber()
59101
}
60102
quote.ask = ask
61103
quote.quoteProviderTimeUnixMs = providerTime
104+
quote.askSize = askSz
62105
}
63-
addTrade(isin: string, lastPrice: number, providerTime: number) {
64-
const quote = this.get(isin)
106+
107+
addTrade(market: string, isin: string, lastPrice: number, providerTime: number) {
108+
const quote = this.get(market, isin)
65109
if (!quote) {
66-
throw new Error(`Cannot add trade for inactive ISIN ${isin}`)
110+
throw new Error(`Cannot add trade for inactive instrument ${market}-${isin}`)
67111
}
68112
quote.latestPrice = lastPrice
69113
quote.tradeProviderTimeUnixMs = providerTime
70114
}
71-
isEmpty(): boolean {
72-
return this.map.size === 0
73-
}
74115
}

0 commit comments

Comments
 (0)