Skip to content

Commit 8a58574

Browse files
authored
Merge pull request #110 from EdgeApp/matthew/midgard-tcy
Add Midgard plugin for TCY rates
2 parents fb8550e + 4900d0d commit 8a58574

File tree

4 files changed

+159
-41
lines changed

4 files changed

+159
-41
lines changed

src/config.ts

Lines changed: 89 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import { makeConfig } from 'cleaner-config'
2-
import { asArray, asNumber, asObject, asOptional, asString } from 'cleaners'
2+
import {
3+
asArray,
4+
asMaybe,
5+
asNumber,
6+
asObject,
7+
asOptional,
8+
asString
9+
} from 'cleaners'
310

411
// Customization:
512

@@ -54,6 +61,9 @@ const providerDefaults = {
5461
wazirx: {
5562
uri: 'https://api.wazirx.com'
5663
},
64+
midgard: {
65+
uri: 'https://midgard.ninerealms.com'
66+
},
5767
coinmonitor: {
5868
uri: 'http://ar.coinmonitor.info'
5969
}
@@ -111,46 +121,85 @@ export const asConfig = asObject({
111121
]),
112122
ratesServerAddress: asOptional(asString, RATES_SERVER_ADDRESS),
113123
slackWebhookUrl: asOptional(asString, SLACK_WEBHOOK_URL),
114-
providers: asOptional(
124+
providers: asMaybe(
115125
asObject({
116-
coincap: asObject({
117-
uri: asString
118-
}),
119-
currencyConverter: asObject({
120-
uri: asString,
121-
apiKey: asString
122-
}),
123-
coinMarketCapCurrent: asObject({
124-
uri: asString,
125-
apiKey: asString
126-
}),
127-
coinMarketCapHistorical: asObject({
128-
uri: asString,
129-
apiKey: asString
130-
}),
131-
openExchangeRates: asObject({
132-
uri: asString,
133-
apiKey: asString
134-
}),
135-
coinstore: asObject({
136-
uri: asString
137-
}),
138-
coingecko: asObject({
139-
uri: asString
140-
}),
141-
coingeckopro: asObject({
142-
uri: asString,
143-
apiKey: asString
144-
}),
145-
compound: asObject({
146-
uri: asString
147-
}),
148-
wazirx: asObject({
149-
uri: asString
150-
}),
151-
coinmonitor: asObject({
152-
uri: asString
153-
})
126+
coincap: asMaybe(
127+
asObject({
128+
uri: asString
129+
}),
130+
providerDefaults.coincap
131+
),
132+
currencyConverter: asMaybe(
133+
asObject({
134+
uri: asString,
135+
apiKey: asString
136+
}),
137+
providerDefaults.currencyConverter
138+
),
139+
coinMarketCapCurrent: asMaybe(
140+
asObject({
141+
uri: asString,
142+
apiKey: asString
143+
}),
144+
providerDefaults.coinMarketCapCurrent
145+
),
146+
coinMarketCapHistorical: asMaybe(
147+
asObject({
148+
uri: asString,
149+
apiKey: asString
150+
}),
151+
providerDefaults.coinMarketCapHistorical
152+
),
153+
openExchangeRates: asMaybe(
154+
asObject({
155+
uri: asString,
156+
apiKey: asString
157+
}),
158+
providerDefaults.openExchangeRates
159+
),
160+
coinstore: asMaybe(
161+
asObject({
162+
uri: asString
163+
}),
164+
providerDefaults.coinstore
165+
),
166+
coingecko: asMaybe(
167+
asObject({
168+
uri: asString
169+
}),
170+
providerDefaults.coingecko
171+
),
172+
coingeckopro: asMaybe(
173+
asObject({
174+
uri: asString,
175+
apiKey: asString
176+
}),
177+
providerDefaults.coingeckopro
178+
),
179+
compound: asMaybe(
180+
asObject({
181+
uri: asString
182+
}),
183+
providerDefaults.compound
184+
),
185+
wazirx: asMaybe(
186+
asObject({
187+
uri: asString
188+
}),
189+
providerDefaults.wazirx
190+
),
191+
midgard: asMaybe(
192+
asObject({
193+
uri: asString
194+
}),
195+
providerDefaults.midgard
196+
),
197+
coinmonitor: asMaybe(
198+
asObject({
199+
uri: asString
200+
}),
201+
providerDefaults.coinmonitor
202+
)
154203
}),
155204
providerDefaults
156205
),

src/providers/midgard.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { asObject, asString } from 'cleaners'
2+
import fetch from 'node-fetch'
3+
4+
import { config } from '../config'
5+
import { NewRates, RateMap, ReturnRate } from '../rates'
6+
import { logger } from '../utils/utils'
7+
8+
const { uri } = config.providers.midgard
9+
// https://midgard.ninerealms.com/v2/pool/THOR.TCY
10+
const asMidgardTcyResponse = asObject({
11+
// annualPercentageRate: '10.261585964326816',
12+
// asset: 'THOR.TCY',
13+
// assetDepth: '223863906811412',
14+
// assetPrice: '0.18381873155332273',
15+
assetPriceUSD: asString
16+
// earnings: '4004966054359',
17+
// earningsAnnualAsPercentOfDepth: '2.537405194396682',
18+
// liquidityUnits: '30164031604896',
19+
// lpLuvi: 'NaN',
20+
// nativeDecimal: '8',
21+
// poolAPY: '10.261585964326816',
22+
// runeDepth: '41150379390645',
23+
// saversAPR: '0',
24+
// saversDepth: '0',
25+
// saversUnits: '0',
26+
// status: 'available',
27+
// synthSupply: '0',
28+
// synthUnits: '0',
29+
// totalCollateral: '0',
30+
// totalDebtTor: '0',
31+
// units: '30164031604896',
32+
// volume24h: '128829051343702'
33+
})
34+
35+
const midgardRateMap = (
36+
results: ReturnType<typeof asMidgardTcyResponse>
37+
): RateMap => ({ 'TCY_iso:USD': results.assetPriceUSD })
38+
39+
const midgard = async (
40+
requestedRates: ReturnRate[],
41+
currentTime: string
42+
): Promise<NewRates> => {
43+
const rates = { [currentTime]: {} }
44+
45+
// This is a TCY-only provider so we can check to exit early
46+
if (requestedRates.find(req => req.currency_pair === 'TCY_iso:USD') == null)
47+
return rates
48+
49+
// Query
50+
try {
51+
const response = await fetch(`${uri}/v2/pool/THOR.TCY`)
52+
if (response.status !== 200) {
53+
throw new Error(response.statusText)
54+
}
55+
const json = asMidgardTcyResponse(await response.json())
56+
rates[currentTime] = midgardRateMap(json)
57+
} catch (e) {
58+
logger(`No midgard TCY pool quote`, e)
59+
}
60+
61+
return rates
62+
}
63+
64+
export { midgard }

src/rates.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
fallbackConstantRates,
2525
zeroRates
2626
} from './providers/hardcodedProviders'
27+
import { midgard } from './providers/midgard'
2728
import { openExchangeRates } from './providers/openExchangeRates'
2829
import { wazirx } from './providers/wazirx'
2930
import {
@@ -135,6 +136,7 @@ const getRatesFromProviders = async (
135136
coinmonitor,
136137
wazirx,
137138
coinstore,
139+
midgard,
138140
coingecko,
139141
coincap,
140142
coinMarketCap,

src/utils/currencyCodeMaps.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"USD.st_iso:USD": "1"
7070
},
7171
"coinMarketCap": {
72+
"TCY": "36449",
7273
"ZANO": "4691",
7374
"LLD": "35872",
7475
"SUI": "20947",
@@ -407,6 +408,7 @@
407408
"RNDR": "render-token"
408409
},
409410
"coingecko": {
411+
"TCY": "tcy",
410412
"ZANO": "zano",
411413
"SUI": "sui",
412414
"SPX": "spx6900",
@@ -851,7 +853,8 @@
851853
"SUI",
852854
"AXL",
853855
"USDC-M",
854-
"ZANO"
856+
"ZANO",
857+
"TCY"
855858
],
856859
"fiatCurrencyCodes": [
857860
"iso:ALL",

0 commit comments

Comments
 (0)