@chainlink/external-adapter-framework 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/adapter.js +128 -0
  2. package/background-executor.js +45 -0
  3. package/cache/factory.js +58 -0
  4. package/cache/index.js +173 -0
  5. package/cache/local.js +83 -0
  6. package/cache/metrics.js +120 -0
  7. package/cache/redis.js +100 -0
  8. package/chainlink-external-adapter-framework-v0.0.6.tgz +0 -0
  9. package/config/index.js +366 -0
  10. package/config/provider-limits.js +74 -0
  11. package/examples/bank-frick/accounts.js +192 -0
  12. package/examples/bank-frick/config/index.js +54 -0
  13. package/examples/bank-frick/index.js +15 -0
  14. package/examples/bank-frick/util.js +39 -0
  15. package/examples/coingecko/src/config/index.js +13 -0
  16. package/examples/coingecko/src/config/overrides.json +10826 -0
  17. package/examples/coingecko/src/cryptoUtils.js +41 -0
  18. package/examples/coingecko/src/endpoint/coins.js +33 -0
  19. package/examples/coingecko/src/endpoint/crypto-marketcap.js +46 -0
  20. package/examples/coingecko/src/endpoint/crypto-volume.js +46 -0
  21. package/examples/coingecko/src/endpoint/crypto.js +47 -0
  22. package/examples/coingecko/src/endpoint/dominance.js +26 -0
  23. package/examples/coingecko/src/endpoint/global-marketcap.js +26 -0
  24. package/examples/coingecko/src/endpoint/index.js +15 -0
  25. package/examples/coingecko/src/globalUtils.js +48 -0
  26. package/examples/coingecko/src/index.js +14 -0
  27. package/examples/coingecko/test/e2e/adapter.test.js +262 -0
  28. package/examples/coingecko/test/integration/adapter.test.js +264 -0
  29. package/examples/coingecko/test/integration/capturedRequests.json +1 -0
  30. package/examples/coingecko/test/integration/fixtures.js +41 -0
  31. package/examples/coingecko-old/batch-warming.js +53 -0
  32. package/examples/coingecko-old/index.js +11 -0
  33. package/examples/coingecko-old/rest.js +51 -0
  34. package/examples/ncfx/config/index.js +15 -0
  35. package/examples/ncfx/index.js +11 -0
  36. package/examples/ncfx/websocket.js +73 -0
  37. package/index.js +127 -0
  38. package/metrics/constants.js +25 -0
  39. package/metrics/index.js +122 -0
  40. package/metrics/util.js +9 -0
  41. package/package.json +5 -15
  42. package/rate-limiting/background/fixed-frequency.js +35 -0
  43. package/rate-limiting/index.js +84 -0
  44. package/rate-limiting/metrics.js +44 -0
  45. package/rate-limiting/request/simple-counting.js +62 -0
  46. package/test.js +6 -0
  47. package/transports/batch-warming.js +101 -0
  48. package/transports/index.js +87 -0
  49. package/transports/metrics.js +105 -0
  50. package/transports/rest.js +138 -0
  51. package/transports/util.js +86 -0
  52. package/transports/websocket.js +166 -0
  53. package/util/index.js +35 -0
  54. package/util/logger.js +62 -0
  55. package/util/recordRequests.js +45 -0
  56. package/util/request.js +2 -0
  57. package/util/subscription-set/expiring-sorted-set.js +47 -0
  58. package/util/subscription-set/subscription-set.js +19 -0
  59. package/util/test-payload-loader.js +83 -0
  60. package/validation/error.js +79 -0
  61. package/validation/index.js +91 -0
  62. package/validation/input-params.js +30 -0
  63. package/validation/override-functions.js +40 -0
  64. package/validation/overrideFunctions.js +40 -0
  65. package/validation/preset-tokens.json +23 -0
  66. package/validation/validator.js +303 -0
  67. package/.c8rc.json +0 -3
  68. package/.eslintignore +0 -10
  69. package/.eslintrc.js +0 -96
  70. package/.github/README.MD +0 -42
  71. package/.github/actions/setup/action.yaml +0 -13
  72. package/.github/workflows/label.yaml +0 -39
  73. package/.github/workflows/main.yaml +0 -39
  74. package/.github/workflows/publish.yaml +0 -17
  75. package/.prettierignore +0 -13
  76. package/.yarnrc +0 -0
  77. package/README.md +0 -103
  78. package/dist/examples/coingecko/test/e2e/adapter.test.ts.js +0 -82953
  79. package/dist/examples/coingecko/test/integration/adapter.test.ts.js +0 -91672
  80. package/dist/main.js +0 -72703
  81. package/docker-compose.yaml +0 -35
  82. package/env.sh +0 -54
  83. package/env2.sh +0 -55
  84. package/jest.config.js +0 -5
  85. package/publish.sh +0 -0
  86. package/src/adapter.ts +0 -263
  87. package/src/background-executor.ts +0 -52
  88. package/src/cache/factory.ts +0 -26
  89. package/src/cache/index.ts +0 -258
  90. package/src/cache/local.ts +0 -73
  91. package/src/cache/metrics.ts +0 -112
  92. package/src/cache/redis.ts +0 -93
  93. package/src/config/index.ts +0 -517
  94. package/src/config/provider-limits.ts +0 -127
  95. package/src/examples/bank-frick/README.MD +0 -10
  96. package/src/examples/bank-frick/accounts.ts +0 -246
  97. package/src/examples/bank-frick/config/index.ts +0 -53
  98. package/src/examples/bank-frick/index.ts +0 -13
  99. package/src/examples/bank-frick/types.d.ts +0 -38
  100. package/src/examples/bank-frick/util.ts +0 -55
  101. package/src/examples/coingecko/src/config/index.ts +0 -12
  102. package/src/examples/coingecko/src/config/overrides.json +0 -10826
  103. package/src/examples/coingecko/src/cryptoUtils.ts +0 -88
  104. package/src/examples/coingecko/src/endpoint/coins.ts +0 -54
  105. package/src/examples/coingecko/src/endpoint/crypto-marketcap.ts +0 -66
  106. package/src/examples/coingecko/src/endpoint/crypto-volume.ts +0 -66
  107. package/src/examples/coingecko/src/endpoint/crypto.ts +0 -63
  108. package/src/examples/coingecko/src/endpoint/dominance.ts +0 -40
  109. package/src/examples/coingecko/src/endpoint/global-marketcap.ts +0 -40
  110. package/src/examples/coingecko/src/endpoint/index.ts +0 -6
  111. package/src/examples/coingecko/src/globalUtils.ts +0 -78
  112. package/src/examples/coingecko/src/index.ts +0 -17
  113. package/src/examples/coingecko/test/e2e/adapter.test.ts +0 -278
  114. package/src/examples/coingecko/test/integration/__snapshots__/adapter.test.ts.snap +0 -15
  115. package/src/examples/coingecko/test/integration/adapter.test.ts +0 -281
  116. package/src/examples/coingecko/test/integration/capturedRequests.json +0 -1
  117. package/src/examples/coingecko/test/integration/fixtures.ts +0 -42
  118. package/src/examples/coingecko-old/batch-warming.ts +0 -79
  119. package/src/examples/coingecko-old/index.ts +0 -9
  120. package/src/examples/coingecko-old/rest.ts +0 -77
  121. package/src/examples/ncfx/config/index.ts +0 -12
  122. package/src/examples/ncfx/index.ts +0 -9
  123. package/src/examples/ncfx/websocket.ts +0 -99
  124. package/src/index.ts +0 -149
  125. package/src/metrics/constants.ts +0 -23
  126. package/src/metrics/index.ts +0 -115
  127. package/src/metrics/util.ts +0 -18
  128. package/src/rate-limiting/background/fixed-frequency.ts +0 -45
  129. package/src/rate-limiting/index.ts +0 -100
  130. package/src/rate-limiting/metrics.ts +0 -18
  131. package/src/rate-limiting/request/simple-counting.ts +0 -76
  132. package/src/transports/batch-warming.ts +0 -127
  133. package/src/transports/index.ts +0 -152
  134. package/src/transports/metrics.ts +0 -95
  135. package/src/transports/rest.ts +0 -168
  136. package/src/transports/util.ts +0 -63
  137. package/src/transports/websocket.ts +0 -245
  138. package/src/util/index.ts +0 -23
  139. package/src/util/logger.ts +0 -69
  140. package/src/util/recordRequests.ts +0 -47
  141. package/src/util/request.ts +0 -117
  142. package/src/util/subscription-set/expiring-sorted-set.ts +0 -54
  143. package/src/util/subscription-set/subscription-set.ts +0 -35
  144. package/src/util/test-payload-loader.ts +0 -87
  145. package/src/validation/error.ts +0 -116
  146. package/src/validation/index.ts +0 -110
  147. package/src/validation/input-params.ts +0 -45
  148. package/src/validation/override-functions.ts +0 -44
  149. package/src/validation/overrideFunctions.ts +0 -44
  150. package/src/validation/preset-tokens.json +0 -23
  151. package/src/validation/validator.ts +0 -384
  152. package/test/adapter.test.ts +0 -27
  153. package/test/background-executor.test.ts +0 -108
  154. package/test/cache/cache-key.test.ts +0 -114
  155. package/test/cache/helper.ts +0 -100
  156. package/test/cache/local.test.ts +0 -54
  157. package/test/cache/redis.test.ts +0 -89
  158. package/test/correlation.test.ts +0 -114
  159. package/test/index.test.ts +0 -37
  160. package/test/metrics/feed-id.test.ts +0 -38
  161. package/test/metrics/helper.ts +0 -14
  162. package/test/metrics/labels.test.ts +0 -36
  163. package/test/metrics/metrics.test.ts +0 -267
  164. package/test/metrics/redis-metrics.test.ts +0 -113
  165. package/test/metrics/warmer-metrics.test.ts +0 -193
  166. package/test/metrics/ws-metrics.test.ts +0 -225
  167. package/test/rate-limit-config.test.ts +0 -242
  168. package/test/smoke/smoke.test.ts +0 -166
  169. package/test/smoke/test-payload-fail.json +0 -3
  170. package/test/smoke/test-payload.js +0 -22
  171. package/test/smoke/test-payload.json +0 -7
  172. package/test/transports/batch.test.ts +0 -466
  173. package/test/transports/rest.test.ts +0 -242
  174. package/test/transports/websocket.test.ts +0 -183
  175. package/test/tsconfig.json +0 -5
  176. package/test/util.ts +0 -77
  177. package/test/validation.test.ts +0 -178
  178. package/test.sh +0 -20
  179. package/test2.sh +0 -2
  180. package/tsconfig.json +0 -28
  181. package/typedoc.json +0 -6
  182. package/webpack.config.js +0 -57
  183. package/yarn-error.log +0 -3778
@@ -1,88 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { PRO_API_ENDPOINT, DEFAULT_API_ENDPOINT } from './config'
3
- import { AdapterConfig } from '../../../config'
4
- import { makeLogger } from '../../../util/logger'
5
-
6
- type Overrides = Record<string, Record<string, string>>
7
-
8
- export interface AdapterRequestParams {
9
- coinid?: string
10
- base?: string
11
- quote: string
12
- overrides?: Overrides
13
- }
14
-
15
- export interface ProviderRequestBody {
16
- ids: string
17
- vs_currencies: string
18
- include_market_cap?: boolean
19
- include_24hr_vol?: boolean
20
- }
21
-
22
- export interface ProviderResponseBody {
23
- [base: string]: {
24
- [quote: string]: number
25
- }
26
- }
27
-
28
- interface ResultEntry {
29
- value: number
30
- params: {
31
- quote: string
32
- base?: string
33
- coinid?: string
34
- overrides?: Overrides
35
- }
36
- }
37
-
38
- interface ResultEntryWithoutOverrides {
39
- value: number
40
- params: {
41
- quote: string
42
- base?: string
43
- coinid?: string
44
- }
45
- }
46
-
47
- export const buildBatchedRequestBody = (
48
- params: AdapterRequestParams[],
49
- config: AdapterConfig,
50
- ): AxiosRequestConfig<ProviderRequestBody> => {
51
- return {
52
- baseURL: config.API_KEY ? PRO_API_ENDPOINT : DEFAULT_API_ENDPOINT,
53
- url: '/simple/price',
54
- method: 'GET',
55
- params: {
56
- ids: [...new Set(params.map((p) => p.coinid ?? p.base))].join(','),
57
- vs_currencies: [...new Set(params.map((p) => p.quote))].join(','),
58
- x_cg_pro_api_key: config.API_KEY,
59
- },
60
- }
61
- }
62
-
63
- const logger = makeLogger('CoinGecko Crypto Batched')
64
-
65
- export const constructEntry = (
66
- res: AxiosResponse<ProviderResponseBody>,
67
- requestPayload: AdapterRequestParams,
68
- resultPath: string,
69
- ): ResultEntryWithoutOverrides | undefined => {
70
- const coinId = requestPayload.coinid ?? (requestPayload.base as string)
71
- const dataForCoin = res.data[coinId]
72
- const dataForQuote = dataForCoin ? dataForCoin[resultPath] : undefined
73
- if (!dataForQuote) {
74
- logger.warn(`Data for "${requestPayload.quote}" not found for token "${coinId}".`)
75
- return
76
- }
77
- const entry = {
78
- params: requestPayload,
79
- value: dataForQuote,
80
- } as ResultEntry
81
- if (requestPayload.coinid) {
82
- entry.params.coinid = requestPayload.coinid
83
- } else {
84
- entry.params.base = requestPayload.base
85
- }
86
- delete entry.params.overrides
87
- return entry
88
- }
@@ -1,54 +0,0 @@
1
- import { AxiosResponse, AxiosRequestConfig } from 'axios'
2
- import { AdapterConfig } from '../../../../config'
3
- import { AdapterEndpoint } from '../../../../../src/adapter'
4
- import { RestTransport } from '../../../../../src/transports'
5
- import { AdapterRequest, AdapterResponse } from '../../../../../src/util'
6
- import { InputParameters } from '../../../../../src/validation'
7
- import { DEFAULT_API_ENDPOINT, PRO_API_ENDPOINT, customSettings } from '../config'
8
-
9
- export const inputParameters: InputParameters = {}
10
-
11
- export interface AdapterRequestParams {
12
- id: string
13
- }
14
-
15
- export interface CoinsResponse {
16
- id: string
17
- symbol: string
18
- name: string
19
- }
20
-
21
- const restEndpointTransport = new RestTransport({
22
- prepareRequest: (
23
- _: AdapterRequest<AdapterRequestParams>,
24
- config: AdapterConfig<typeof customSettings>,
25
- ): AxiosRequestConfig<CoinsResponse> => {
26
- const baseURL = config.API_KEY ? PRO_API_ENDPOINT : DEFAULT_API_ENDPOINT
27
- const params = config.API_KEY ? { x_cg_pro_api_key: config.API_KEY } : undefined
28
- return {
29
- baseURL,
30
- url: '/coins/list',
31
- method: 'GET',
32
- params,
33
- }
34
- },
35
- parseResponse: (
36
- req: AdapterRequest<AdapterRequestParams>,
37
- res: AxiosResponse<CoinsResponse[]>,
38
- ): AdapterResponse<CoinsResponse[]> => {
39
- return {
40
- data: res.data,
41
- statusCode: 200,
42
- result: res.data,
43
- }
44
- },
45
- options: {
46
- coalescing: true,
47
- },
48
- })
49
-
50
- export const endpoint: AdapterEndpoint = {
51
- name: 'coins',
52
- transport: restEndpointTransport,
53
- inputParameters,
54
- }
@@ -1,66 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { AdapterEndpoint, AdapterContext } from '../../../../adapter'
3
- import { BatchWarmingTransport } from '../../../../transports/batch-warming'
4
- import { ProviderResult } from '../../../../util'
5
- import { InputParameters } from '../../../../validation'
6
- import { baseInputParameters } from '../../../../validation/input-params'
7
- import {
8
- AdapterRequestParams,
9
- ProviderRequestBody,
10
- buildBatchedRequestBody,
11
- constructEntry,
12
- ProviderResponseBody,
13
- } from '../cryptoUtils'
14
-
15
- export const inputParameters: InputParameters = {
16
- overrides: baseInputParameters['overrides'],
17
- coinid: {
18
- description: 'The CoinGecko id or to query',
19
- required: false,
20
- },
21
- base: {
22
- aliases: ['from', 'coin'],
23
- description: 'The symbol of symbols of the currency to query',
24
- required: false,
25
- },
26
- quote: {
27
- aliases: ['to', 'market'],
28
- description: 'The symbol of the currency to convert to',
29
- required: true,
30
- },
31
- }
32
-
33
- const batchEndpointTransport = new BatchWarmingTransport({
34
- prepareRequest: (
35
- params: AdapterRequestParams[],
36
- context: AdapterContext,
37
- ): AxiosRequestConfig<ProviderRequestBody> => {
38
- const requestBody = buildBatchedRequestBody(params, context.adapterConfig)
39
- requestBody.params.include_market_cap = true
40
- return requestBody
41
- },
42
- parseResponse: (
43
- params: AdapterRequestParams[],
44
- res: AxiosResponse<ProviderResponseBody>,
45
- ): ProviderResult<AdapterRequestParams>[] => {
46
- const entries = [] as ProviderResult<AdapterRequestParams>[]
47
- for (const requestPayload of params) {
48
- const entry = constructEntry(
49
- res,
50
- requestPayload,
51
- `${requestPayload.quote.toLowerCase()}_market_cap`,
52
- )
53
- if (entry) {
54
- entries.push(entry)
55
- }
56
- }
57
- return entries
58
- },
59
- })
60
-
61
- export const endpoint: AdapterEndpoint = {
62
- name: 'marketcap',
63
- aliases: ['crypto-marketcap'],
64
- transport: batchEndpointTransport,
65
- inputParameters,
66
- }
@@ -1,66 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { AdapterEndpoint, AdapterContext } from '../../../../adapter'
3
- import { BatchWarmingTransport } from '../../../../transports/batch-warming'
4
- import { ProviderResult } from '../../../../util'
5
- import { InputParameters } from '../../../../validation'
6
- import { baseInputParameters } from '../../../../validation/input-params'
7
- import {
8
- AdapterRequestParams,
9
- ProviderRequestBody,
10
- buildBatchedRequestBody,
11
- constructEntry,
12
- ProviderResponseBody,
13
- } from '../cryptoUtils'
14
-
15
- export const inputParameters: InputParameters = {
16
- overrides: baseInputParameters['overrides'],
17
- coinid: {
18
- description: 'The CoinGecko id or to query',
19
- required: false,
20
- },
21
- base: {
22
- aliases: ['from', 'coin'],
23
- description: 'The symbol of symbols of the currency to query',
24
- required: false,
25
- },
26
- quote: {
27
- aliases: ['to', 'market'],
28
- description: 'The symbol of the currency to convert to',
29
- required: true,
30
- },
31
- }
32
-
33
- const batchEndpointTransport = new BatchWarmingTransport({
34
- prepareRequest: (
35
- params: AdapterRequestParams[],
36
- context: AdapterContext,
37
- ): AxiosRequestConfig<ProviderRequestBody> => {
38
- const requestBody = buildBatchedRequestBody(params, context.adapterConfig)
39
- requestBody.params.include_24hr_vol = true
40
- return requestBody
41
- },
42
- parseResponse: (
43
- params: AdapterRequestParams[],
44
- res: AxiosResponse<ProviderResponseBody>,
45
- ): ProviderResult<AdapterRequestParams>[] => {
46
- const entries = [] as ProviderResult<AdapterRequestParams>[]
47
- for (const requestPayload of params) {
48
- const entry = constructEntry(
49
- res,
50
- requestPayload,
51
- `${requestPayload.quote.toLowerCase()}_24h_vol`,
52
- )
53
- if (entry) {
54
- entries.push(entry)
55
- }
56
- }
57
- return entries
58
- },
59
- })
60
-
61
- export const endpoint: AdapterEndpoint = {
62
- name: 'volume',
63
- aliases: ['crypto-volume'],
64
- transport: batchEndpointTransport,
65
- inputParameters,
66
- }
@@ -1,63 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { AdapterEndpoint, AdapterContext } from '../../../../adapter'
3
- import { BatchWarmingTransport } from '../../../../transports/batch-warming'
4
- import { ProviderResult } from '../../../../util'
5
- import { InputParameters } from '../../../../validation'
6
- import { baseInputParameters } from '../../../../validation/input-params'
7
- import {
8
- AdapterRequestParams,
9
- ProviderRequestBody,
10
- buildBatchedRequestBody,
11
- constructEntry,
12
- ProviderResponseBody,
13
- } from '../cryptoUtils'
14
-
15
- export const inputParameters: InputParameters = {
16
- overrides: baseInputParameters['overrides'],
17
- coinid: {
18
- description: 'The CoinGecko id or to query',
19
- required: false,
20
- },
21
- base: {
22
- aliases: ['from', 'coin'],
23
- description: 'The symbol of symbols of the currency to query',
24
- required: false,
25
- },
26
- quote: {
27
- aliases: ['to', 'market'],
28
- description: 'The symbol of the currency to convert to',
29
- required: true,
30
- },
31
- }
32
-
33
- const batchEndpointTransport = new BatchWarmingTransport({
34
- prepareRequest: (
35
- params: AdapterRequestParams[],
36
- context: AdapterContext,
37
- ): AxiosRequestConfig<ProviderRequestBody> => {
38
- return buildBatchedRequestBody(params, context.adapterConfig)
39
- },
40
- parseResponse: (
41
- params: AdapterRequestParams[],
42
- res: AxiosResponse<ProviderResponseBody>,
43
- ): ProviderResult<AdapterRequestParams>[] => {
44
- const entries = [] as ProviderResult<AdapterRequestParams>[]
45
- for (const requestPayload of params) {
46
- const entry = constructEntry(res, requestPayload, requestPayload.quote.toLowerCase())
47
- // NOTE: the `entries` array is going to be shorter than the `params` array if one of the params has a bad token.
48
- // Is that okay? I did this to avoid caching an invalid value for transient DP issues. Just want to make
49
- // sure this works within the core framework
50
- if (entry) {
51
- entries.push(entry)
52
- }
53
- }
54
- return entries
55
- },
56
- })
57
-
58
- export const endpoint: AdapterEndpoint = {
59
- name: 'crypto',
60
- aliases: ['crypto-batched', 'batched', 'batch'],
61
- transport: batchEndpointTransport,
62
- inputParameters,
63
- }
@@ -1,40 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { AdapterEndpoint, AdapterContext } from '../../../../adapter'
3
- import { BatchWarmingTransport } from '../../../../transports/batch-warming'
4
- import { ProviderResult } from '../../../../util'
5
- import {
6
- buildGlobalRequestBody,
7
- AdapterRequestParams,
8
- ProviderResponseBody,
9
- constructEntry,
10
- inputParameters,
11
- } from '../globalUtils'
12
-
13
- const batchEndpointTransport = new BatchWarmingTransport({
14
- prepareRequest: (
15
- params: AdapterRequestParams[],
16
- context: AdapterContext,
17
- ): AxiosRequestConfig<never> => {
18
- return buildGlobalRequestBody(context.adapterConfig)
19
- },
20
- parseResponse: (
21
- params: AdapterRequestParams[],
22
- res: AxiosResponse<ProviderResponseBody>,
23
- ): ProviderResult<AdapterRequestParams>[] => {
24
- const entries = [] as ProviderResult<AdapterRequestParams>[]
25
- for (const requestPayload of params) {
26
- const entry = constructEntry(res, requestPayload, 'market_cap_percentage')
27
- if (entry) {
28
- entries.push(entry)
29
- }
30
- }
31
- return entries
32
- },
33
- })
34
-
35
- export const endpoint: AdapterEndpoint = {
36
- name: 'dominance',
37
- aliases: ['market_cap_percentage'],
38
- transport: batchEndpointTransport,
39
- inputParameters,
40
- }
@@ -1,40 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { AdapterEndpoint, AdapterContext } from '../../../../adapter'
3
- import { BatchWarmingTransport } from '../../../../transports/batch-warming'
4
- import { ProviderResult } from '../../../../util'
5
- import {
6
- buildGlobalRequestBody,
7
- AdapterRequestParams,
8
- ProviderResponseBody,
9
- constructEntry,
10
- inputParameters,
11
- } from '../globalUtils'
12
-
13
- const batchEndpointTransport = new BatchWarmingTransport({
14
- prepareRequest: (
15
- params: AdapterRequestParams[],
16
- context: AdapterContext,
17
- ): AxiosRequestConfig<never> => {
18
- return buildGlobalRequestBody(context.adapterConfig)
19
- },
20
- parseResponse: (
21
- params: AdapterRequestParams[],
22
- res: AxiosResponse<ProviderResponseBody>,
23
- ): ProviderResult<AdapterRequestParams>[] => {
24
- const entries = [] as ProviderResult<AdapterRequestParams>[]
25
- for (const requestPayload of params) {
26
- const entry = constructEntry(res, requestPayload, 'total_market_cap')
27
- if (entry) {
28
- entries.push(entry)
29
- }
30
- }
31
- return entries
32
- },
33
- })
34
-
35
- export const endpoint: AdapterEndpoint = {
36
- name: 'globalmarketcap',
37
- aliases: ['total_market_cap'],
38
- transport: batchEndpointTransport,
39
- inputParameters,
40
- }
@@ -1,6 +0,0 @@
1
- export { endpoint as coins } from './coins'
2
- export { endpoint as crypto } from './crypto'
3
- export { endpoint as cryptoMarketcap } from './crypto-marketcap'
4
- export { endpoint as globalMarketcap } from './global-marketcap'
5
- export { endpoint as dominance } from './dominance'
6
- export { endpoint as cryptoVolume } from './crypto-volume'
@@ -1,78 +0,0 @@
1
- import { AxiosRequestConfig, AxiosResponse } from 'axios'
2
- import { PRO_API_ENDPOINT, DEFAULT_API_ENDPOINT } from './config'
3
- import { AdapterConfig } from '../../../config'
4
- import { makeLogger } from '../../../util/logger'
5
- import { InputParameters } from '../../../validation'
6
-
7
- const logger = makeLogger('CoinGecko Global Batched')
8
-
9
- export const inputParameters: InputParameters = {
10
- market: {
11
- aliases: ['to', 'quote'],
12
- description: 'The ticker of the coin to query',
13
- required: true,
14
- },
15
- }
16
-
17
- export interface AdapterRequestParams {
18
- market: string
19
- }
20
-
21
- export interface ProviderResponseBody {
22
- data: {
23
- active_cryptocurrencies: number
24
- upcoming_icos: number
25
- ongoing_icos: number
26
- ended_icos: number
27
- markets: number
28
- total_market_cap: Record<string, number>
29
- total_volume: Record<string, number>
30
- market_cap_percentage: Record<string, number>
31
- market_cap_change_percentage_24h_usd: number
32
- updated_at: number
33
- }
34
- }
35
-
36
- interface ResultEntry {
37
- value: number
38
- params: AdapterRequestParams
39
- }
40
-
41
- export const buildGlobalRequestBody = (config: AdapterConfig): AxiosRequestConfig<never> => {
42
- const apiKey = {
43
- x_cg_pro_api_key: config.API_KEY,
44
- }
45
- return {
46
- baseURL: config.API_KEY ? PRO_API_ENDPOINT : DEFAULT_API_ENDPOINT,
47
- url: '/global',
48
- method: 'GET',
49
- params: apiKey,
50
- }
51
- }
52
-
53
- export const constructEntry = (
54
- res: AxiosResponse<ProviderResponseBody>,
55
- requestPayload: AdapterRequestParams,
56
- resultPath: 'total_market_cap' | 'market_cap_percentage',
57
- ): ResultEntry | undefined => {
58
- const resultData = res.data.data
59
- if (!resultData) {
60
- logger.warn(`Data not found".`)
61
- return
62
- }
63
- const totalMarketcapData = resultData[resultPath]
64
- if (!totalMarketcapData) {
65
- logger.warn(`Data for "${resultPath}" not found".`)
66
- return
67
- }
68
- const result = totalMarketcapData[requestPayload.market.toLowerCase()]
69
- if (!result) {
70
- logger.warn(`Data for "${requestPayload.market}" not found".`)
71
- return
72
- }
73
- const entry = {
74
- params: requestPayload,
75
- value: result,
76
- } as ResultEntry
77
- return entry
78
- }
@@ -1,17 +0,0 @@
1
- import { Adapter } from '../../../../src/adapter'
2
- import overrides from './config/overrides.json'
3
- import {
4
- coins,
5
- crypto,
6
- cryptoVolume,
7
- cryptoMarketcap,
8
- dominance,
9
- globalMarketcap,
10
- } from './endpoint'
11
-
12
- export const adapter: Adapter = {
13
- defaultEndpoint: 'crypto',
14
- name: 'coingecko',
15
- endpoints: [crypto, coins, cryptoMarketcap, cryptoVolume, dominance, globalMarketcap],
16
- overrides: (overrides as Record<string, Record<string, string>>)['coingecko'],
17
- }