@render-foundation/utils 0.0.233-beta.0 → 0.0.234-beta.0

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.
@@ -24,30 +24,54 @@ const priceClient = () => {
24
24
  });
25
25
  return {
26
26
  eurToUSDC(ts) {
27
- var _a;
28
27
  return __awaiter(this, void 0, void 0, function* () {
29
- const ticks = yield cb.fetchOHLCV('USDC/EUR', '1m', ts.getTime());
30
- if (ticks.length == 0) {
31
- throw new Error('failed to fetch USDC/EUR ticks from coinbase');
28
+ // EUR per USDC (coinbase USDC/EUR close), inverted to USDC per EUR.
29
+ let eurPerUsdc;
30
+ const ohlcv = yield cb.fetchOHLCV('USDC/EUR', '1m', ts.getTime(), 1);
31
+ if (ohlcv.length > 0)
32
+ eurPerUsdc = Number(ohlcv[0][4]);
33
+ else {
34
+ // Empty (ts ≈ now — the current minute has no closed candle yet): use the live ticker.
35
+ const t = yield cb.fetchTicker('USDC/EUR');
36
+ if (t.last)
37
+ eurPerUsdc = Number(t.last);
38
+ }
39
+ if (!eurPerUsdc || !isFinite(eurPerUsdc)) {
40
+ throw new Error('failed to fetch USDC/EUR from coinbase (OHLCV + ticker empty)');
32
41
  }
33
- return 1 / Number((_a = ticks[0][4]) === null || _a === void 0 ? void 0 : _a.toString());
42
+ return 1 / eurPerUsdc;
34
43
  });
35
44
  },
36
45
  getRenderPriceAtDate(p) {
37
- var _a, _b, _c;
46
+ var _a;
38
47
  return __awaiter(this, void 0, void 0, function* () {
39
- let { symbol, ts } = Object.assign(Object.assign({}, p), { symbol: (_a = p.symbol) !== null && _a !== void 0 ? _a : 'RENDER/USDT',
40
- // @ts-ignore
41
- ex: (_b = p.ex) !== null && _b !== void 0 ? _b : 'binance' });
42
- let ticks = yield bin.fetchOHLCV(symbol, '1m', ts.getTime(), 1, undefined);
43
- if (ticks.length == 0) {
44
- ticks = yield cb.fetchOHLCV(symbol, '1m', ts.getTime(), 1, undefined);
45
- }
46
- if (ticks.length == 0) {
47
- throw new Error(`failed fetching price ticks after coinbase fallback`);
48
+ const symbol = (_a = p.symbol) !== null && _a !== void 0 ? _a : 'RENDER/USDT';
49
+ // coinbase lists RENDER as RENDER/USD, not RENDER/USDT — map for the coinbase fallbacks.
50
+ const cbSymbol = symbol.replace('/USDT', '/USD');
51
+ const since = p.ts.getTime();
52
+ // 1) Historical: the 1m candle at/after ts — binanceus first, then coinbase (correct symbol).
53
+ let ticks = yield bin.fetchOHLCV(symbol, '1m', since, 1);
54
+ if (ticks.length == 0)
55
+ ticks = yield cb.fetchOHLCV(cbSymbol, '1m', since, 1);
56
+ if (ticks.length > 0)
57
+ return Number(ticks[0][4]);
58
+ // 2) OHLCV empty — typically ts ≈ now (the current minute has no closed candle yet). The previous
59
+ // code fell back to a coinbase OHLCV with the WRONG symbol (RENDER/USDT) and threw. Use the live
60
+ // ticker instead (all sources return it): binanceus RENDER/USDT, then coinbase RENDER/USD.
61
+ for (const [ex, sym] of [
62
+ [bin, symbol],
63
+ [cb, cbSymbol],
64
+ ]) {
65
+ try {
66
+ const t = yield ex.fetchTicker(sym);
67
+ if (t.last)
68
+ return Number(t.last);
69
+ }
70
+ catch (_b) {
71
+ /* try next source */
72
+ }
48
73
  }
49
- // first close tick
50
- return Number((_c = ticks[0][4]) === null || _c === void 0 ? void 0 : _c.toString());
74
+ throw new Error(`failed fetching RENDER price for ${symbol} at ${p.ts.toISOString()}`);
51
75
  });
52
76
  },
53
77
  getCurrPrice() {
@@ -1 +1 @@
1
- {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../src/client/price.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAAkD;AAClD,gDAAuB;AAgBhB,MAAM,WAAW,GAAG,GAAgB,EAAE;IAC3C,MAAM,GAAG,GAAG,IAAI,cAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,EAAE,GAAG,IAAI,cAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEhC,MAAM,MAAM,GAAG,IAAI,kCAAe,CAAC;QACjC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,OAAO;QACC,SAAS,CAAC,EAAQ;;;gBACtB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;gBACjE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;oBACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;iBAChE;gBACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0CAAE,QAAQ,EAAE,CAAC,CAAA;;SAC3C;QACK,oBAAoB,CAAC,CAI1B;;;gBACC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,mCACb,CAAC,KACJ,MAAM,EAAE,MAAA,CAAC,CAAC,MAAM,mCAAI,aAAa;oBACjC,aAAa;oBACb,EAAE,EAAE,MAAA,CAAC,CAAC,EAAE,mCAAI,SAAS,GACtB,CAAA;gBACD,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;gBAC1E,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;oBACrB,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;iBACtE;gBACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;oBACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;iBACvE;gBACD,mBAAmB;gBACnB,OAAO,MAAM,CAAC,MAAA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,0CAAE,QAAQ,EAAE,CAAC,CAAA;;SACvC;QACK,YAAY;;;gBAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAA;gBACvD,OAAO,MAAA,GAAG,CAAC,WAAW,0CAAE,aAAa,CAAE,KAAK,CAAE,CAAA;;SAC/C;KACF,CAAA;AACH,CAAC,CAAA;AA3CY,QAAA,WAAW,eA2CvB"}
1
+ {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../src/client/price.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uDAAkD;AAClD,gDAAuB;AAgBhB,MAAM,WAAW,GAAG,GAAgB,EAAE;IAC3C,MAAM,GAAG,GAAG,IAAI,cAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,EAAE,GAAG,IAAI,cAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEhC,MAAM,MAAM,GAAG,IAAI,kCAAe,CAAC;QACjC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,OAAO;QACC,SAAS,CAAC,EAAQ;;gBACtB,oEAAoE;gBACpE,IAAI,UAA8B,CAAA;gBAClC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;gBACpE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;qBACjD;oBACH,uFAAuF;oBACvF,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAA;oBAC1C,IAAI,CAAC,CAAC,IAAI;wBAAE,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;iBACxC;gBACD,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;oBACxC,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;iBACjF;gBACD,OAAO,CAAC,GAAG,UAAU,CAAA;YACvB,CAAC;SAAA;QACK,oBAAoB,CAAC,CAI1B;;;gBACC,MAAM,MAAM,GAAG,MAAA,CAAC,CAAC,MAAM,mCAAI,aAAa,CAAA;gBACxC,yFAAyF;gBACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAChD,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAA;gBAE5B,8FAA8F;gBAC9F,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;gBACxD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;oBAAE,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;gBAC5E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAEhD,kGAAkG;gBAClG,iGAAiG;gBACjG,2FAA2F;gBAC3F,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI;oBACtB,CAAC,GAAG,EAAE,MAAM,CAAC;oBACb,CAAC,EAAE,EAAE,QAAQ,CAAC;iBACN,EAAE;oBACV,IAAI;wBACF,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;wBACnC,IAAI,CAAC,CAAC,IAAI;4BAAE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;qBAClC;oBAAC,WAAM;wBACN,qBAAqB;qBACtB;iBACF;gBACD,MAAM,IAAI,KAAK,CACb,oCAAoC,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,CACtE,CAAA;;SACF;QACK,YAAY;;;gBAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAA;gBACvD,OAAO,MAAA,GAAG,CAAC,WAAW,0CAAE,aAAa,CAAE,KAAK,CAAE,CAAA;;SAC/C;KACF,CAAA;AACH,CAAC,CAAA;AA/DY,QAAA,WAAW,eA+DvB"}
@@ -9,28 +9,50 @@ export const priceClient = () => {
9
9
  });
10
10
  return {
11
11
  async eurToUSDC(ts) {
12
- const ticks = await cb.fetchOHLCV('USDC/EUR', '1m', ts.getTime());
13
- if (ticks.length == 0) {
14
- throw new Error('failed to fetch USDC/EUR ticks from coinbase');
12
+ // EUR per USDC (coinbase USDC/EUR close), inverted to USDC per EUR.
13
+ let eurPerUsdc;
14
+ const ohlcv = await cb.fetchOHLCV('USDC/EUR', '1m', ts.getTime(), 1);
15
+ if (ohlcv.length > 0)
16
+ eurPerUsdc = Number(ohlcv[0][4]);
17
+ else {
18
+ // Empty (ts ≈ now — the current minute has no closed candle yet): use the live ticker.
19
+ const t = await cb.fetchTicker('USDC/EUR');
20
+ if (t.last)
21
+ eurPerUsdc = Number(t.last);
15
22
  }
16
- return 1 / Number(ticks[0][4]?.toString());
23
+ if (!eurPerUsdc || !isFinite(eurPerUsdc)) {
24
+ throw new Error('failed to fetch USDC/EUR from coinbase (OHLCV + ticker empty)');
25
+ }
26
+ return 1 / eurPerUsdc;
17
27
  },
18
28
  async getRenderPriceAtDate(p) {
19
- let { symbol, ts } = {
20
- ...p,
21
- symbol: p.symbol ?? 'RENDER/USDT',
22
- // @ts-ignore
23
- ex: p.ex ?? 'binance',
24
- };
25
- let ticks = await bin.fetchOHLCV(symbol, '1m', ts.getTime(), 1, undefined);
26
- if (ticks.length == 0) {
27
- ticks = await cb.fetchOHLCV(symbol, '1m', ts.getTime(), 1, undefined);
28
- }
29
- if (ticks.length == 0) {
30
- throw new Error(`failed fetching price ticks after coinbase fallback`);
29
+ const symbol = p.symbol ?? 'RENDER/USDT';
30
+ // coinbase lists RENDER as RENDER/USD, not RENDER/USDT — map for the coinbase fallbacks.
31
+ const cbSymbol = symbol.replace('/USDT', '/USD');
32
+ const since = p.ts.getTime();
33
+ // 1) Historical: the 1m candle at/after ts — binanceus first, then coinbase (correct symbol).
34
+ let ticks = await bin.fetchOHLCV(symbol, '1m', since, 1);
35
+ if (ticks.length == 0)
36
+ ticks = await cb.fetchOHLCV(cbSymbol, '1m', since, 1);
37
+ if (ticks.length > 0)
38
+ return Number(ticks[0][4]);
39
+ // 2) OHLCV empty — typically ts ≈ now (the current minute has no closed candle yet). The previous
40
+ // code fell back to a coinbase OHLCV with the WRONG symbol (RENDER/USDT) and threw. Use the live
41
+ // ticker instead (all sources return it): binanceus RENDER/USDT, then coinbase RENDER/USD.
42
+ for (const [ex, sym] of [
43
+ [bin, symbol],
44
+ [cb, cbSymbol],
45
+ ]) {
46
+ try {
47
+ const t = await ex.fetchTicker(sym);
48
+ if (t.last)
49
+ return Number(t.last);
50
+ }
51
+ catch {
52
+ /* try next source */
53
+ }
31
54
  }
32
- // first close tick
33
- return Number(ticks[0][4]?.toString());
55
+ throw new Error(`failed fetching RENDER price for ${symbol} at ${p.ts.toISOString()}`);
34
56
  },
35
57
  async getCurrPrice() {
36
58
  const res = await client.coinId({ id: 'render-token' });
@@ -1 +1 @@
1
- {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../../src/client/price.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,IAAI,MAAM,MAAM,CAAA;AAgBvB,MAAM,CAAC,MAAM,WAAW,GAAG,GAAgB,EAAE;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEhC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,EAAQ;YACtB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;YACjE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;gBACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;aAChE;YACD,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC5C,CAAC;QACD,KAAK,CAAC,oBAAoB,CAAC,CAI1B;YACC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;gBACnB,GAAG,CAAC;gBACJ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,aAAa;gBACjC,aAAa;gBACb,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,SAAS;aACtB,CAAA;YACD,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;YAC1E,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;gBACrB,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,CAAC,CAAA;aACtE;YACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE;gBACrB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;aACvE;YACD,mBAAmB;YACnB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QACxC,CAAC;QACD,KAAK,CAAC,YAAY;YAChB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAA;YACvD,OAAO,GAAG,CAAC,WAAW,EAAE,aAAc,CAAC,KAAK,CAAE,CAAA;QAChD,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"price.js","sourceRoot":"","sources":["../../../../src/client/price.ts"],"names":[],"mappings":"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"}