hive-stream 2.0.5 → 3.0.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.
Files changed (89) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.env.example +2 -2
  3. package/.travis.yml +11 -11
  4. package/CHANGELOG.md +166 -0
  5. package/CLAUDE.md +75 -0
  6. package/LICENSE +21 -21
  7. package/README.md +338 -238
  8. package/dist/actions.d.ts +41 -10
  9. package/dist/actions.js +126 -23
  10. package/dist/actions.js.map +1 -1
  11. package/dist/adapters/base.adapter.d.ts +25 -25
  12. package/dist/adapters/base.adapter.js +63 -49
  13. package/dist/adapters/base.adapter.js.map +1 -1
  14. package/dist/adapters/mongodb.adapter.d.ts +50 -37
  15. package/dist/adapters/mongodb.adapter.js +363 -158
  16. package/dist/adapters/mongodb.adapter.js.map +1 -1
  17. package/dist/adapters/postgresql.adapter.d.ts +49 -0
  18. package/dist/adapters/postgresql.adapter.js +507 -0
  19. package/dist/adapters/postgresql.adapter.js.map +1 -0
  20. package/dist/adapters/sqlite.adapter.d.ts +40 -41
  21. package/dist/adapters/sqlite.adapter.js +470 -397
  22. package/dist/adapters/sqlite.adapter.js.map +1 -1
  23. package/dist/api.d.ts +6 -6
  24. package/dist/api.js +95 -55
  25. package/dist/api.js.map +1 -1
  26. package/dist/config.d.ts +16 -16
  27. package/dist/config.js +18 -18
  28. package/dist/config.js.map +1 -1
  29. package/dist/contracts/coinflip.contract.d.ts +27 -14
  30. package/dist/contracts/coinflip.contract.js +253 -94
  31. package/dist/contracts/coinflip.contract.js.map +1 -1
  32. package/dist/contracts/dice.contract.d.ts +37 -29
  33. package/dist/contracts/dice.contract.js +282 -155
  34. package/dist/contracts/dice.contract.js.map +1 -1
  35. package/dist/contracts/lotto.contract.d.ts +20 -20
  36. package/dist/contracts/lotto.contract.js +246 -246
  37. package/dist/contracts/nft.contract.d.ts +24 -0
  38. package/dist/contracts/nft.contract.js +533 -0
  39. package/dist/contracts/nft.contract.js.map +1 -0
  40. package/dist/contracts/token.contract.d.ts +18 -0
  41. package/dist/contracts/token.contract.js +263 -0
  42. package/dist/contracts/token.contract.js.map +1 -0
  43. package/dist/exchanges/bittrex.d.ts +6 -6
  44. package/dist/exchanges/bittrex.js +34 -34
  45. package/dist/exchanges/coingecko.d.ts +5 -0
  46. package/dist/exchanges/coingecko.js +40 -0
  47. package/dist/exchanges/coingecko.js.map +1 -0
  48. package/dist/exchanges/exchange.d.ts +9 -9
  49. package/dist/exchanges/exchange.js +26 -26
  50. package/dist/hive-rates.d.ts +9 -9
  51. package/dist/hive-rates.js +121 -75
  52. package/dist/hive-rates.js.map +1 -1
  53. package/dist/index.d.ts +12 -11
  54. package/dist/index.js +33 -32
  55. package/dist/index.js.map +1 -1
  56. package/dist/streamer.d.ts +140 -93
  57. package/dist/streamer.js +793 -545
  58. package/dist/streamer.js.map +1 -1
  59. package/dist/test.d.ts +1 -1
  60. package/dist/test.js +25 -25
  61. package/dist/test.js.map +1 -1
  62. package/dist/types/hive-stream.d.ts +35 -6
  63. package/dist/types/hive-stream.js +2 -2
  64. package/dist/utils.d.ts +27 -27
  65. package/dist/utils.js +271 -261
  66. package/dist/utils.js.map +1 -1
  67. package/ecosystem.config.js +17 -17
  68. package/jest.config.js +8 -8
  69. package/package.json +53 -48
  70. package/test-contract-block.md +18 -18
  71. package/tests/actions.spec.ts +252 -0
  72. package/tests/adapters/actions-persistence.spec.ts +144 -0
  73. package/tests/adapters/postgresql.adapter.spec.ts +127 -0
  74. package/tests/adapters/sqlite.adapter.spec.ts +180 -42
  75. package/tests/contracts/coinflip.contract.spec.ts +221 -131
  76. package/tests/contracts/dice.contract.spec.ts +202 -159
  77. package/tests/contracts/entrants.json +728 -728
  78. package/tests/contracts/lotto.contract.spec.ts +323 -323
  79. package/tests/contracts/nft.contract.spec.ts +948 -0
  80. package/tests/contracts/token.contract.spec.ts +334 -0
  81. package/tests/helpers/mock-adapter.ts +214 -0
  82. package/tests/setup.ts +29 -18
  83. package/tests/streamer-actions.spec.ts +263 -0
  84. package/tests/streamer.spec.ts +248 -151
  85. package/tests/utils.spec.ts +91 -94
  86. package/tsconfig.build.json +3 -22
  87. package/tslint.json +20 -20
  88. package/wallaby.js +26 -26
  89. package/.env +0 -3
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TokenContract = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const CONTRACT_NAME = 'hivetoken';
9
+ class TokenContract {
10
+ _instance;
11
+ adapter;
12
+ blockNumber;
13
+ blockId;
14
+ previousBlockId;
15
+ transactionId;
16
+ create() {
17
+ this.adapter = this._instance.getAdapter();
18
+ this.initializeTokenTables();
19
+ }
20
+ destroy() {
21
+ // Cleanup logic if needed
22
+ }
23
+ updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
24
+ this.blockNumber = blockNumber;
25
+ this.blockId = blockId;
26
+ this.previousBlockId = previousBlockId;
27
+ this.transactionId = transactionId;
28
+ }
29
+ async initializeTokenTables() {
30
+ try {
31
+ await this.adapter.query(`
32
+ CREATE TABLE IF NOT EXISTS tokens (
33
+ symbol TEXT PRIMARY KEY,
34
+ name TEXT NOT NULL,
35
+ url TEXT,
36
+ precision INTEGER NOT NULL DEFAULT 3,
37
+ max_supply TEXT NOT NULL,
38
+ current_supply TEXT NOT NULL DEFAULT '0',
39
+ creator TEXT NOT NULL,
40
+ created_at DATETIME NOT NULL
41
+ )
42
+ `);
43
+ await this.adapter.query(`
44
+ CREATE TABLE IF NOT EXISTS token_balances (
45
+ account TEXT NOT NULL,
46
+ symbol TEXT NOT NULL,
47
+ balance TEXT NOT NULL DEFAULT '0',
48
+ PRIMARY KEY (account, symbol),
49
+ FOREIGN KEY (symbol) REFERENCES tokens(symbol)
50
+ )
51
+ `);
52
+ await this.adapter.query(`
53
+ CREATE TABLE IF NOT EXISTS token_transfers (
54
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
55
+ from_account TEXT NOT NULL,
56
+ to_account TEXT NOT NULL,
57
+ amount TEXT NOT NULL,
58
+ symbol TEXT NOT NULL,
59
+ memo TEXT,
60
+ block_number INTEGER NOT NULL,
61
+ transaction_id TEXT NOT NULL,
62
+ timestamp DATETIME NOT NULL,
63
+ FOREIGN KEY (symbol) REFERENCES tokens(symbol)
64
+ )
65
+ `);
66
+ }
67
+ catch (error) {
68
+ console.error('[TokenContract] Error initializing tables:', error);
69
+ }
70
+ }
71
+ async createToken(payload, { sender }) {
72
+ try {
73
+ const { symbol, name, url = '', precision = 3, maxSupply } = payload;
74
+ if (!symbol.match(/^[A-Z0-9]{1,10}$/)) {
75
+ throw new Error('Symbol must be 1-10 uppercase alphanumeric characters');
76
+ }
77
+ if (!name || name.length > 50) {
78
+ throw new Error('Name is required and must be 50 characters or less');
79
+ }
80
+ if (precision < 0 || precision > 8) {
81
+ throw new Error('Precision must be between 0 and 8');
82
+ }
83
+ const maxSupplyBN = new bignumber_js_1.default(maxSupply);
84
+ if (maxSupplyBN.isNaN() || maxSupplyBN.lt(1) || maxSupplyBN.gt(9007199254740991)) {
85
+ throw new Error('Maximum supply must be between 1 and 9007199254740991');
86
+ }
87
+ if (url && url.length > 256) {
88
+ throw new Error('URL must be 256 characters or less');
89
+ }
90
+ const existingToken = await this.adapter.query('SELECT symbol FROM tokens WHERE symbol = ?', [symbol]);
91
+ if (existingToken && existingToken.length > 0) {
92
+ throw new Error(`Token with symbol ${symbol} already exists`);
93
+ }
94
+ await this.adapter.query(`
95
+ INSERT INTO tokens (symbol, name, url, precision, max_supply, current_supply, creator, created_at)
96
+ VALUES (?, ?, ?, ?, ?, '0', ?, ?)
97
+ `, [symbol, name, url, precision, maxSupply, sender, new Date()]);
98
+ await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'createToken', payload, {
99
+ action: 'token_created',
100
+ data: {
101
+ symbol,
102
+ name,
103
+ creator: sender,
104
+ maxSupply,
105
+ precision
106
+ }
107
+ });
108
+ console.log(`[TokenContract] Token ${symbol} created by ${sender}`);
109
+ }
110
+ catch (error) {
111
+ console.error('[TokenContract] Error creating token:', error);
112
+ throw error;
113
+ }
114
+ }
115
+ async issueTokens(payload, { sender }) {
116
+ try {
117
+ const { symbol, to, amount, memo = '' } = payload;
118
+ const token = await this.adapter.query('SELECT * FROM tokens WHERE symbol = ?', [symbol]);
119
+ if (!token || token.length === 0) {
120
+ throw new Error(`Token ${symbol} does not exist`);
121
+ }
122
+ const tokenData = token[0];
123
+ if (tokenData.creator !== sender) {
124
+ throw new Error('Only the token creator can issue new tokens');
125
+ }
126
+ const amountBN = new bignumber_js_1.default(amount);
127
+ if (amountBN.isNaN() || amountBN.lte(0)) {
128
+ throw new Error('Amount must be a positive number');
129
+ }
130
+ const currentSupplyBN = new bignumber_js_1.default(tokenData.current_supply);
131
+ const maxSupplyBN = new bignumber_js_1.default(tokenData.max_supply);
132
+ const newSupplyBN = currentSupplyBN.plus(amountBN);
133
+ if (newSupplyBN.gt(maxSupplyBN)) {
134
+ throw new Error('Cannot issue tokens: would exceed maximum supply');
135
+ }
136
+ await this.adapter.query('UPDATE tokens SET current_supply = ? WHERE symbol = ?', [newSupplyBN.toFixed(tokenData.precision), symbol]);
137
+ const existingBalance = await this.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [to, symbol]);
138
+ if (existingBalance && existingBalance.length > 0) {
139
+ const currentBalanceBN = new bignumber_js_1.default(existingBalance[0].balance);
140
+ const newBalanceBN = currentBalanceBN.plus(amountBN);
141
+ await this.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newBalanceBN.toFixed(tokenData.precision), to, symbol]);
142
+ }
143
+ else {
144
+ await this.adapter.query('INSERT INTO token_balances (account, symbol, balance) VALUES (?, ?, ?)', [to, symbol, amountBN.toFixed(tokenData.precision)]);
145
+ }
146
+ await this.adapter.query(`
147
+ INSERT INTO token_transfers (from_account, to_account, amount, symbol, memo, block_number, transaction_id, timestamp)
148
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
149
+ `, ['null', to, amount, symbol, memo, this.blockNumber, this.transactionId, new Date()]);
150
+ await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'issueTokens', payload, {
151
+ action: 'tokens_issued',
152
+ data: {
153
+ symbol,
154
+ to,
155
+ amount,
156
+ newSupply: newSupplyBN.toFixed(tokenData.precision)
157
+ }
158
+ });
159
+ console.log(`[TokenContract] Issued ${amount} ${symbol} to ${to}`);
160
+ }
161
+ catch (error) {
162
+ console.error('[TokenContract] Error issuing tokens:', error);
163
+ throw error;
164
+ }
165
+ }
166
+ async transferTokens(payload, { sender }) {
167
+ try {
168
+ const { symbol, to, amount, memo = '' } = payload;
169
+ const token = await this.adapter.query('SELECT precision FROM tokens WHERE symbol = ?', [symbol]);
170
+ if (!token || token.length === 0) {
171
+ throw new Error(`Token ${symbol} does not exist`);
172
+ }
173
+ const precision = token[0].precision;
174
+ const amountBN = new bignumber_js_1.default(amount);
175
+ if (amountBN.isNaN() || amountBN.lte(0)) {
176
+ throw new Error('Amount must be a positive number');
177
+ }
178
+ const senderBalance = await this.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [sender, symbol]);
179
+ if (!senderBalance || senderBalance.length === 0) {
180
+ throw new Error('Insufficient balance');
181
+ }
182
+ const senderBalanceBN = new bignumber_js_1.default(senderBalance[0].balance);
183
+ if (senderBalanceBN.lt(amountBN)) {
184
+ throw new Error('Insufficient balance');
185
+ }
186
+ const newSenderBalanceBN = senderBalanceBN.minus(amountBN);
187
+ await this.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newSenderBalanceBN.toFixed(precision), sender, symbol]);
188
+ const receiverBalance = await this.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [to, symbol]);
189
+ if (receiverBalance && receiverBalance.length > 0) {
190
+ const receiverBalanceBN = new bignumber_js_1.default(receiverBalance[0].balance);
191
+ const newReceiverBalanceBN = receiverBalanceBN.plus(amountBN);
192
+ await this.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newReceiverBalanceBN.toFixed(precision), to, symbol]);
193
+ }
194
+ else {
195
+ await this.adapter.query('INSERT INTO token_balances (account, symbol, balance) VALUES (?, ?, ?)', [to, symbol, amountBN.toFixed(precision)]);
196
+ }
197
+ await this.adapter.query(`
198
+ INSERT INTO token_transfers (from_account, to_account, amount, symbol, memo, block_number, transaction_id, timestamp)
199
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
200
+ `, [sender, to, amount, symbol, memo, this.blockNumber, this.transactionId, new Date()]);
201
+ await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'transferTokens', payload, {
202
+ action: 'tokens_transferred',
203
+ data: {
204
+ from: sender,
205
+ to,
206
+ amount,
207
+ symbol
208
+ }
209
+ });
210
+ console.log(`[TokenContract] Transferred ${amount} ${symbol} from ${sender} to ${to}`);
211
+ }
212
+ catch (error) {
213
+ console.error('[TokenContract] Error transferring tokens:', error);
214
+ throw error;
215
+ }
216
+ }
217
+ async getBalance(payload, { sender }) {
218
+ try {
219
+ const { account, symbol } = payload;
220
+ const balance = await this.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [account, symbol]);
221
+ const balanceAmount = balance && balance.length > 0 ? balance[0].balance : '0';
222
+ await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'getBalance', payload, {
223
+ action: 'balance_query',
224
+ data: {
225
+ account,
226
+ symbol,
227
+ balance: balanceAmount,
228
+ queried_by: sender
229
+ }
230
+ });
231
+ console.log(`[TokenContract] Balance query: ${account} has ${balanceAmount} ${symbol}`);
232
+ }
233
+ catch (error) {
234
+ console.error('[TokenContract] Error getting balance:', error);
235
+ throw error;
236
+ }
237
+ }
238
+ async getTokenInfo(payload, { sender }) {
239
+ try {
240
+ const { symbol } = payload;
241
+ const token = await this.adapter.query('SELECT * FROM tokens WHERE symbol = ?', [symbol]);
242
+ if (!token || token.length === 0) {
243
+ throw new Error(`Token ${symbol} does not exist`);
244
+ }
245
+ const tokenData = token[0];
246
+ await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'getTokenInfo', payload, {
247
+ action: 'token_info_query',
248
+ data: {
249
+ symbol,
250
+ queried_by: sender,
251
+ token_info: tokenData
252
+ }
253
+ });
254
+ console.log(`[TokenContract] Token info query for ${symbol} by ${sender}`);
255
+ }
256
+ catch (error) {
257
+ console.error('[TokenContract] Error getting token info:', error);
258
+ throw error;
259
+ }
260
+ }
261
+ }
262
+ exports.TokenContract = TokenContract;
263
+ //# sourceMappingURL=token.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.contract.js","sourceRoot":"","sources":["../../src/contracts/token.contract.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { Exchange } from './exchange';
2
- export declare class BittrexExchange extends Exchange {
3
- exchangeId: string;
4
- fetchRates(): Promise<boolean>;
5
- private fetchRate;
6
- }
1
+ import { Exchange } from './exchange';
2
+ export declare class BittrexExchange extends Exchange {
3
+ exchangeId: string;
4
+ fetchRates(): Promise<boolean>;
5
+ private fetchRate;
6
+ }
@@ -1,35 +1,35 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.BittrexExchange = void 0;
7
- const exchange_1 = require("./exchange");
8
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
- class BittrexExchange extends exchange_1.Exchange {
10
- exchangeId = 'bittrex';
11
- async fetchRates() {
12
- const USD_BTC = new bignumber_js_1.default(await this.fetchRate('USD', 'BTC'));
13
- const BTC_HIVE = new bignumber_js_1.default(await this.fetchRate('HIVE', 'BTC'));
14
- const BTC_HBD = new bignumber_js_1.default(await this.fetchRate('HBD', 'BTC'));
15
- if (isNaN(USD_BTC.toNumber()) || isNaN(BTC_HIVE.toNumber()) || isNaN(BTC_HBD.toNumber())) {
16
- return false;
17
- }
18
- const USD_HIVE = USD_BTC.multipliedBy(BTC_HIVE).toNumber();
19
- const USD_HBD = USD_BTC.multipliedBy(BTC_HBD).toNumber();
20
- this.rateUsdHive = USD_HIVE;
21
- this.rateUsdHbd = USD_HBD;
22
- return true;
23
- }
24
- async fetchRate(from, to) {
25
- const endpoint = `https://api.bittrex.com/v3/markets/${from}-${to}/ticker`;
26
- const request = await fetch(endpoint);
27
- const response = await request.json();
28
- if (response) {
29
- return response?.result?.Last;
30
- }
31
- return null;
32
- }
33
- }
34
- exports.BittrexExchange = BittrexExchange;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BittrexExchange = void 0;
7
+ const exchange_1 = require("./exchange");
8
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
9
+ class BittrexExchange extends exchange_1.Exchange {
10
+ exchangeId = 'bittrex';
11
+ async fetchRates() {
12
+ const USD_BTC = new bignumber_js_1.default(await this.fetchRate('USD', 'BTC'));
13
+ const BTC_HIVE = new bignumber_js_1.default(await this.fetchRate('HIVE', 'BTC'));
14
+ const BTC_HBD = new bignumber_js_1.default(await this.fetchRate('HBD', 'BTC'));
15
+ if (isNaN(USD_BTC.toNumber()) || isNaN(BTC_HIVE.toNumber()) || isNaN(BTC_HBD.toNumber())) {
16
+ return false;
17
+ }
18
+ const USD_HIVE = USD_BTC.multipliedBy(BTC_HIVE).toNumber();
19
+ const USD_HBD = USD_BTC.multipliedBy(BTC_HBD).toNumber();
20
+ this.rateUsdHive = USD_HIVE;
21
+ this.rateUsdHbd = USD_HBD;
22
+ return true;
23
+ }
24
+ async fetchRate(from, to) {
25
+ const endpoint = `https://api.bittrex.com/v3/markets/${from}-${to}/ticker`;
26
+ const request = await fetch(endpoint);
27
+ const response = await request.json();
28
+ if (response) {
29
+ return response?.result?.Last;
30
+ }
31
+ return null;
32
+ }
33
+ }
34
+ exports.BittrexExchange = BittrexExchange;
35
35
  //# sourceMappingURL=bittrex.js.map
@@ -0,0 +1,5 @@
1
+ import { Exchange } from './exchange';
2
+ export declare class CoinGeckoExchange extends Exchange {
3
+ exchangeId: string;
4
+ fetchRates(): Promise<boolean>;
5
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoinGeckoExchange = void 0;
4
+ const exchange_1 = require("./exchange");
5
+ class CoinGeckoExchange extends exchange_1.Exchange {
6
+ exchangeId = 'coingecko';
7
+ async fetchRates() {
8
+ try {
9
+ // CoinGecko's free API endpoint for HIVE and HBD prices
10
+ const endpoint = 'https://api.coingecko.com/api/v3/simple/price?ids=hive,hive_dollar&vs_currencies=usd';
11
+ const request = await fetch(endpoint);
12
+ if (!request.ok) {
13
+ console.warn(`CoinGecko API request failed with status: ${request.status}`);
14
+ return false;
15
+ }
16
+ const response = await request.json();
17
+ // Extract USD rates for HIVE and HBD
18
+ const usdHiveRate = response?.hive?.usd;
19
+ const usdHbdRate = response?.hive_dollar?.usd;
20
+ if (typeof usdHiveRate !== 'number' || typeof usdHbdRate !== 'number') {
21
+ console.warn('Invalid response format from CoinGecko API');
22
+ return false;
23
+ }
24
+ if (isNaN(usdHiveRate) || isNaN(usdHbdRate)) {
25
+ console.warn('Received NaN values from CoinGecko API');
26
+ return false;
27
+ }
28
+ this.rateUsdHive = usdHiveRate;
29
+ this.rateUsdHbd = usdHbdRate;
30
+ console.log(`CoinGecko rates updated: HIVE=$${usdHiveRate.toFixed(6)}, HBD=$${usdHbdRate.toFixed(6)}`);
31
+ return true;
32
+ }
33
+ catch (error) {
34
+ console.error('Error fetching rates from CoinGecko:', error);
35
+ return false;
36
+ }
37
+ }
38
+ }
39
+ exports.CoinGeckoExchange = CoinGeckoExchange;
40
+ //# sourceMappingURL=coingecko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../src/exchanges/coingecko.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AAEtC,MAAa,iBAAkB,SAAQ,mBAAQ;IACpC,UAAU,GAAG,WAAW,CAAC;IAEzB,KAAK,CAAC,UAAU;QACnB,IAAI;YACA,wDAAwD;YACxD,MAAM,QAAQ,GAAG,sFAAsF,CAAC;YACxG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEtC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;gBACb,OAAO,CAAC,IAAI,CAAC,6CAA6C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5E,OAAO,KAAK,CAAC;aAChB;YAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YAEtC,qCAAqC;YACrC,MAAM,WAAW,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;YACxC,MAAM,UAAU,GAAG,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC;YAE9C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;gBACnE,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAC3D,OAAO,KAAK,CAAC;aAChB;YAED,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,EAAE;gBACzC,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBACvD,OAAO,KAAK,CAAC;aAChB;YAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;YAE7B,OAAO,CAAC,GAAG,CAAC,kCAAkC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvG,OAAO,IAAI,CAAC;SAEf;QAAC,OAAO,KAAK,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,OAAO,KAAK,CAAC;SAChB;IACL,CAAC;CACJ;AAzCD,8CAyCC"}
@@ -1,9 +1,9 @@
1
- export declare class Exchange {
2
- exchangeId: any;
3
- private oneHour;
4
- rateUsdHive: any;
5
- rateUsdHbd: any;
6
- private lastFetch;
7
- updateRates(): Promise<any>;
8
- fetchRates(): Promise<any>;
9
- }
1
+ export declare class Exchange {
2
+ exchangeId: any;
3
+ private oneHour;
4
+ rateUsdHive: any;
5
+ rateUsdHbd: any;
6
+ private lastFetch;
7
+ updateRates(): Promise<any>;
8
+ fetchRates(): Promise<any>;
9
+ }
@@ -1,27 +1,27 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Exchange = void 0;
4
- class Exchange {
5
- exchangeId;
6
- oneHour = 1000 * 60 * 60;
7
- rateUsdHive;
8
- rateUsdHbd;
9
- lastFetch;
10
- async updateRates() {
11
- const HOUR_AGO = Date.now() - this.oneHour;
12
- // Only fetch once per hour
13
- if (this.lastFetch && this.lastFetch < HOUR_AGO) {
14
- return false;
15
- }
16
- const rates = await this.fetchRates();
17
- if (rates) {
18
- this.lastFetch = Date.now();
19
- }
20
- return rates;
21
- }
22
- async fetchRates() {
23
- return null;
24
- }
25
- }
26
- exports.Exchange = Exchange;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Exchange = void 0;
4
+ class Exchange {
5
+ exchangeId;
6
+ oneHour = 1000 * 60 * 60;
7
+ rateUsdHive;
8
+ rateUsdHbd;
9
+ lastFetch;
10
+ async updateRates() {
11
+ const HOUR_AGO = Date.now() - this.oneHour;
12
+ // Only fetch once per hour
13
+ if (this.lastFetch && this.lastFetch > HOUR_AGO) {
14
+ return false;
15
+ }
16
+ const rates = await this.fetchRates();
17
+ if (rates) {
18
+ this.lastFetch = Date.now();
19
+ }
20
+ return rates;
21
+ }
22
+ async fetchRates() {
23
+ return null;
24
+ }
25
+ }
26
+ exports.Exchange = Exchange;
27
27
  //# sourceMappingURL=exchange.js.map
@@ -1,9 +1,9 @@
1
- export declare class HiveRates {
2
- private fiatRates;
3
- private hiveRates;
4
- private lastFetch;
5
- private oneHour;
6
- fetchRates(): Promise<boolean>;
7
- fiatToHiveRate(fiatSymbol: any, hiveSymbol: any): any;
8
- private getFiatRates;
9
- }
1
+ export declare class HiveRates {
2
+ private fiatRates;
3
+ private hiveRates;
4
+ private lastFetch;
5
+ private oneHour;
6
+ fetchRates(): Promise<boolean>;
7
+ fiatToHiveRate(fiatSymbol: any, hiveSymbol: any): any;
8
+ private getFiatRates;
9
+ }