Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/six-adapter-initial.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chainlink/six-adapter': minor
Comment thread
cll-dawid marked this conversation as resolved.
Outdated
---

New adapter for SIX Exchange and BME equity market data via WebSocket streaming with mTLS authentication
24 changes: 24 additions & 0 deletions .pnp.cjs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 44 additions & 0 deletions packages/sources/six/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"name": "@chainlink/six-adapter",
"version": "0.1.0",
"description": "Chainlink six adapter.",
"keywords": [
"Chainlink",
"LINK",
"blockchain",
"oracle",
"six"
],
"main": "dist/index.js",
"types": "dist/index.d.ts",
"files": [
"dist"
],
"repository": {
"url": "https://github.com/smartcontractkit/external-adapters-js",
"type": "git"
},
"license": "MIT",
"scripts": {
"clean": "rm -rf dist && rm -f tsconfig.tsbuildinfo",
"prepack": "yarn build",
"build": "tsc -b",
"server": "node -e 'require(\"./index.js\").server()'",
"server:dist": "node -e 'require(\"./dist/index.js\").server()'",
"start": "yarn server:dist"
},
"devDependencies": {
"@sinonjs/fake-timers": "9.1.2",
"@types/jest": "^29.5.14",
"@types/node": "22.14.1",
"@types/sinonjs__fake-timers": "8.1.5",
"@types/ws": "^8",
"nock": "13.5.6",
"typescript": "5.8.3"
},
"dependencies": {
"@chainlink/external-adapter-framework": "2.11.6",
"tslib": "2.4.1",
"ws": "^8.18.3"
}
}
41 changes: 41 additions & 0 deletions packages/sources/six/src/config/index.ts
Comment thread
cll-dawid marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { AdapterConfig } from '@chainlink/external-adapter-framework/config'

export const config = new AdapterConfig(
{
WS_API_ENDPOINT: {
description: 'SIX WebSocket API endpoint',
type: 'string',
default: 'wss://api.six-group.com/web/v2/websocket',
required: true,
sensitive: false,
},
CERT_BASE64: {
description:
'Base64-encoded signed certificate (signed-certificate.pem) for mTLS authentication',
type: 'string',
required: true,
sensitive: true,
},
KEY_BASE64: {
description: 'Base64-encoded private key (private-key.pem) for mTLS authentication',
type: 'string',
required: true,
sensitive: true,
},
CONFLATION_PERIOD: {
description: 'Conflation period in ISO 8601 duration format (e.g. PT1S for 1 second)',
type: 'string',
default: 'PT1S',
required: false,
sensitive: false,
},
},
{
envDefaultOverrides: {
// SIX requires ping every 10s, disconnects after 60s inactivity.
// Detect zombie connections faster than the default 120s.
WS_SUBSCRIPTION_UNRESPONSIVE_TTL: 30_000, // 30s without data -> reconnect
CACHE_MAX_AGE: 10_000, // 10s - data updates every 1s, stale after 10s
},
},
)
58 changes: 58 additions & 0 deletions packages/sources/six/src/endpoint/price.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { AdapterEndpoint } from '@chainlink/external-adapter-framework/adapter/endpoint'
import { InputParameters } from '@chainlink/external-adapter-framework/validation'
import { config } from '../config'
import { generateTransport } from '../transport/price'

const inputParameters = new InputParameters(
{
ticker: {
aliases: ['base', 'symbol', 'asset'],
required: true,
type: 'string',
description: 'Instrument ticker (e.g. ABBN, ALC, ANA, ANE)',
},
bc: {
aliases: ['market', 'bourseCode', 'exchange'],
required: true,
type: 'string',
description: 'SIX Bourse Code (e.g. 4 for SIX Swiss Exchange, 1058 for BME)',
},
},
[
{
ticker: 'ABBN',
bc: '4',
},
],
)

interface PriceResponse {
Result: number | null
Data: {
mid: number | null
bid: number | null
bidSize: number | null
ask: number | null
askSize: number | null
lastTradedPrice: number | null
volume: number | null
ripcord: boolean
ripcordAsInt: number
ripcordDetails?: string
}
}

export type BaseEndpointTypes = {
Parameters: typeof inputParameters.definition
Response: PriceResponse
Settings: typeof config.settings
}

const transport = generateTransport()

export const endpoint = new AdapterEndpoint({
name: 'price',
aliases: ['equity', 'stock'],
transport,
inputParameters,
})
13 changes: 13 additions & 0 deletions packages/sources/six/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { expose, ServerInstance } from '@chainlink/external-adapter-framework'
import { Adapter } from '@chainlink/external-adapter-framework/adapter'
import { config } from './config'
import { endpoint } from './endpoint/price'

export const adapter = new Adapter({
defaultEndpoint: endpoint.name,
name: 'SIX',
config,
endpoints: [endpoint],
})

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