hive-stream 2.0.6 → 3.0.1

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 (123) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.env.example +2 -2
  3. package/.travis.yml +11 -11
  4. package/AGENTS.md +35 -0
  5. package/CHANGELOG.md +166 -0
  6. package/CLAUDE.md +75 -0
  7. package/DOCUMENTATION.md +380 -0
  8. package/LICENSE +21 -21
  9. package/README.md +429 -238
  10. package/dist/actions.d.ts +41 -10
  11. package/dist/actions.js +126 -23
  12. package/dist/actions.js.map +1 -1
  13. package/dist/adapters/base.adapter.d.ts +43 -25
  14. package/dist/adapters/base.adapter.js +79 -49
  15. package/dist/adapters/base.adapter.js.map +1 -1
  16. package/dist/adapters/mongodb.adapter.d.ts +44 -37
  17. package/dist/adapters/mongodb.adapter.js +363 -158
  18. package/dist/adapters/mongodb.adapter.js.map +1 -1
  19. package/dist/adapters/postgresql.adapter.d.ts +66 -0
  20. package/dist/adapters/postgresql.adapter.js +598 -0
  21. package/dist/adapters/postgresql.adapter.js.map +1 -0
  22. package/dist/adapters/sqlite.adapter.d.ts +57 -41
  23. package/dist/adapters/sqlite.adapter.js +561 -397
  24. package/dist/adapters/sqlite.adapter.js.map +1 -1
  25. package/dist/api.d.ts +6 -6
  26. package/dist/api.js +181 -55
  27. package/dist/api.js.map +1 -1
  28. package/dist/config.d.ts +19 -16
  29. package/dist/config.js +21 -18
  30. package/dist/config.js.map +1 -1
  31. package/dist/contracts/coinflip.contract.d.ts +9 -14
  32. package/dist/contracts/coinflip.contract.js +232 -94
  33. package/dist/contracts/coinflip.contract.js.map +1 -1
  34. package/dist/contracts/contract.d.ts +3 -0
  35. package/dist/contracts/contract.js +26 -0
  36. package/dist/contracts/contract.js.map +1 -0
  37. package/dist/contracts/dice.contract.d.ts +10 -29
  38. package/dist/contracts/dice.contract.js +217 -155
  39. package/dist/contracts/dice.contract.js.map +1 -1
  40. package/dist/contracts/exchange.contract.d.ts +11 -0
  41. package/dist/contracts/exchange.contract.js +492 -0
  42. package/dist/contracts/exchange.contract.js.map +1 -0
  43. package/dist/contracts/lotto.contract.d.ts +16 -20
  44. package/dist/contracts/lotto.contract.js +238 -246
  45. package/dist/contracts/lotto.contract.js.map +1 -1
  46. package/dist/contracts/nft.contract.d.ts +28 -0
  47. package/dist/contracts/nft.contract.js +598 -0
  48. package/dist/contracts/nft.contract.js.map +1 -0
  49. package/dist/contracts/poll.contract.d.ts +4 -0
  50. package/dist/contracts/poll.contract.js +105 -0
  51. package/dist/contracts/poll.contract.js.map +1 -0
  52. package/dist/contracts/rps.contract.d.ts +9 -0
  53. package/dist/contracts/rps.contract.js +217 -0
  54. package/dist/contracts/rps.contract.js.map +1 -0
  55. package/dist/contracts/tipjar.contract.d.ts +4 -0
  56. package/dist/contracts/tipjar.contract.js +60 -0
  57. package/dist/contracts/tipjar.contract.js.map +1 -0
  58. package/dist/contracts/token.contract.d.ts +4 -0
  59. package/dist/contracts/token.contract.js +311 -0
  60. package/dist/contracts/token.contract.js.map +1 -0
  61. package/dist/exchanges/bittrex.d.ts +6 -6
  62. package/dist/exchanges/bittrex.js +34 -34
  63. package/dist/exchanges/coingecko.d.ts +11 -0
  64. package/dist/exchanges/coingecko.js +57 -0
  65. package/dist/exchanges/coingecko.js.map +1 -0
  66. package/dist/exchanges/exchange.d.ts +16 -9
  67. package/dist/exchanges/exchange.js +80 -26
  68. package/dist/exchanges/exchange.js.map +1 -1
  69. package/dist/hive-rates.d.ts +34 -9
  70. package/dist/hive-rates.js +208 -75
  71. package/dist/hive-rates.js.map +1 -1
  72. package/dist/index.d.ts +19 -11
  73. package/dist/index.js +47 -32
  74. package/dist/index.js.map +1 -1
  75. package/dist/streamer.d.ts +233 -93
  76. package/dist/streamer.js +1063 -545
  77. package/dist/streamer.js.map +1 -1
  78. package/dist/test.d.ts +1 -1
  79. package/dist/test.js +24 -25
  80. package/dist/test.js.map +1 -1
  81. package/dist/types/hive-stream.d.ts +106 -6
  82. package/dist/types/hive-stream.js +2 -2
  83. package/dist/types/rates.d.ts +47 -0
  84. package/dist/types/rates.js +29 -0
  85. package/dist/types/rates.js.map +1 -0
  86. package/dist/utils.d.ts +334 -27
  87. package/dist/utils.js +960 -261
  88. package/dist/utils.js.map +1 -1
  89. package/ecosystem.config.js +17 -17
  90. package/examples/contracts/README.md +8 -0
  91. package/examples/contracts/exchange.ts +38 -0
  92. package/examples/contracts/poll.ts +21 -0
  93. package/examples/contracts/rps.ts +19 -0
  94. package/examples/contracts/tipjar.ts +19 -0
  95. package/jest.config.js +8 -8
  96. package/package.json +54 -48
  97. package/test-contract-block.md +18 -18
  98. package/tests/actions.spec.ts +252 -0
  99. package/tests/adapters/actions-persistence.spec.ts +144 -0
  100. package/tests/adapters/postgresql.adapter.spec.ts +127 -0
  101. package/tests/adapters/sqlite.adapter.spec.ts +180 -42
  102. package/tests/contracts/coinflip.contract.spec.ts +94 -132
  103. package/tests/contracts/dice.contract.spec.ts +87 -160
  104. package/tests/contracts/entrants.json +728 -728
  105. package/tests/contracts/exchange.contract.spec.ts +84 -0
  106. package/tests/contracts/lotto.contract.spec.ts +59 -324
  107. package/tests/contracts/nft.contract.spec.ts +948 -0
  108. package/tests/contracts/token.contract.spec.ts +90 -0
  109. package/tests/exchanges/coingecko.exchange.spec.ts +169 -0
  110. package/tests/exchanges/exchange.base.spec.ts +246 -0
  111. package/tests/helpers/mock-adapter.ts +214 -0
  112. package/tests/helpers/mock-fetch.ts +165 -0
  113. package/tests/hive-chain-features.spec.ts +238 -0
  114. package/tests/hive-rates.spec.ts +443 -0
  115. package/tests/integration/hive-rates.integration.spec.ts +35 -0
  116. package/tests/setup.ts +29 -18
  117. package/tests/streamer-actions.spec.ts +274 -0
  118. package/tests/streamer.spec.ts +342 -152
  119. package/tests/types/rates.spec.ts +216 -0
  120. package/tests/utils.spec.ts +113 -95
  121. package/tsconfig.build.json +3 -22
  122. package/tslint.json +20 -20
  123. package/wallaby.js +26 -26
@@ -0,0 +1,311 @@
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.createTokenContract = createTokenContract;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const zod_1 = require("zod");
9
+ const contract_1 = require("./contract");
10
+ const DEFAULT_NAME = 'hivetoken';
11
+ function createTokenContract(options = {}) {
12
+ const name = options.name || DEFAULT_NAME;
13
+ const state = {
14
+ streamer: null,
15
+ adapter: null
16
+ };
17
+ const createTokenSchema = zod_1.z.object({
18
+ symbol: zod_1.z.string().regex(/^[A-Z0-9]{1,10}$/),
19
+ name: zod_1.z.string().min(1).max(50),
20
+ url: zod_1.z.string().max(256).optional(),
21
+ precision: zod_1.z.number().int().min(0).max(8).optional(),
22
+ maxSupply: zod_1.z.string()
23
+ });
24
+ const issueTokensSchema = zod_1.z.object({
25
+ symbol: zod_1.z.string().min(1),
26
+ to: zod_1.z.string().min(1),
27
+ amount: zod_1.z.string().min(1),
28
+ memo: zod_1.z.string().optional()
29
+ });
30
+ const transferTokensSchema = zod_1.z.object({
31
+ symbol: zod_1.z.string().min(1),
32
+ to: zod_1.z.string().min(1),
33
+ amount: zod_1.z.string().min(1),
34
+ memo: zod_1.z.string().optional()
35
+ });
36
+ const getBalanceSchema = zod_1.z.object({
37
+ account: zod_1.z.string().min(1),
38
+ symbol: zod_1.z.string().min(1)
39
+ });
40
+ const getTokenInfoSchema = zod_1.z.object({
41
+ symbol: zod_1.z.string().min(1)
42
+ });
43
+ const initializeTokenTables = async () => {
44
+ try {
45
+ await state.adapter.query(`
46
+ CREATE TABLE IF NOT EXISTS tokens (
47
+ symbol TEXT PRIMARY KEY,
48
+ name TEXT NOT NULL,
49
+ url TEXT,
50
+ precision INTEGER NOT NULL DEFAULT 3,
51
+ max_supply TEXT NOT NULL,
52
+ current_supply TEXT NOT NULL DEFAULT '0',
53
+ creator TEXT NOT NULL,
54
+ created_at DATETIME NOT NULL
55
+ )
56
+ `);
57
+ await state.adapter.query(`
58
+ CREATE TABLE IF NOT EXISTS token_balances (
59
+ account TEXT NOT NULL,
60
+ symbol TEXT NOT NULL,
61
+ balance TEXT NOT NULL DEFAULT '0',
62
+ PRIMARY KEY (account, symbol),
63
+ FOREIGN KEY (symbol) REFERENCES tokens(symbol)
64
+ )
65
+ `);
66
+ await state.adapter.query(`
67
+ CREATE TABLE IF NOT EXISTS token_transfers (
68
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
69
+ from_account TEXT NOT NULL,
70
+ to_account TEXT NOT NULL,
71
+ amount TEXT NOT NULL,
72
+ symbol TEXT NOT NULL,
73
+ memo TEXT,
74
+ block_number INTEGER NOT NULL,
75
+ transaction_id TEXT NOT NULL,
76
+ timestamp DATETIME NOT NULL,
77
+ FOREIGN KEY (symbol) REFERENCES tokens(symbol)
78
+ )
79
+ `);
80
+ }
81
+ catch (error) {
82
+ console.error('[TokenContract] Error initializing tables:', error);
83
+ }
84
+ };
85
+ const createToken = async (payload, ctx) => {
86
+ try {
87
+ const { symbol, name: tokenName, url = '', precision = 3, maxSupply } = payload;
88
+ if (!symbol.match(/^[A-Z0-9]{1,10}$/)) {
89
+ throw new Error('Symbol must be 1-10 uppercase alphanumeric characters');
90
+ }
91
+ if (!tokenName || tokenName.length > 50) {
92
+ throw new Error('Name is required and must be 50 characters or less');
93
+ }
94
+ if (precision < 0 || precision > 8) {
95
+ throw new Error('Precision must be between 0 and 8');
96
+ }
97
+ const maxSupplyBN = new bignumber_js_1.default(maxSupply);
98
+ if (maxSupplyBN.isNaN() || maxSupplyBN.lt(1) || maxSupplyBN.gt(9007199254740991)) {
99
+ throw new Error('Maximum supply must be between 1 and 9007199254740991');
100
+ }
101
+ if (url && url.length > 256) {
102
+ throw new Error('URL must be 256 characters or less');
103
+ }
104
+ const existingToken = await state.adapter.query('SELECT symbol FROM tokens WHERE symbol = ?', [symbol]);
105
+ if (existingToken && existingToken.length > 0) {
106
+ throw new Error(`Token with symbol ${symbol} already exists`);
107
+ }
108
+ await state.adapter.query(`
109
+ INSERT INTO tokens (symbol, name, url, precision, max_supply, current_supply, creator, created_at)
110
+ VALUES (?, ?, ?, ?, ?, '0', ?, ?)
111
+ `, [symbol, tokenName, url, precision, maxSupply, ctx.sender, new Date()]);
112
+ await state.adapter.addEvent(new Date(), name, 'createToken', payload, {
113
+ action: 'token_created',
114
+ data: {
115
+ symbol,
116
+ name: tokenName,
117
+ creator: ctx.sender,
118
+ maxSupply,
119
+ precision
120
+ }
121
+ });
122
+ console.log(`[TokenContract] Token ${symbol} created by ${ctx.sender}`);
123
+ }
124
+ catch (error) {
125
+ console.error('[TokenContract] Error creating token:', error);
126
+ throw error;
127
+ }
128
+ };
129
+ const issueTokens = async (payload, ctx) => {
130
+ try {
131
+ const { symbol, to, amount, memo = '' } = payload;
132
+ const token = await state.adapter.query('SELECT * FROM tokens WHERE symbol = ?', [symbol]);
133
+ if (!token || token.length === 0) {
134
+ throw new Error(`Token ${symbol} does not exist`);
135
+ }
136
+ const tokenData = token[0];
137
+ if (tokenData.creator !== ctx.sender) {
138
+ throw new Error('Only the token creator can issue new tokens');
139
+ }
140
+ const amountBN = new bignumber_js_1.default(amount);
141
+ if (amountBN.isNaN() || amountBN.lte(0)) {
142
+ throw new Error('Amount must be a positive number');
143
+ }
144
+ const currentSupplyBN = new bignumber_js_1.default(tokenData.current_supply);
145
+ const maxSupplyBN = new bignumber_js_1.default(tokenData.max_supply);
146
+ const newSupplyBN = currentSupplyBN.plus(amountBN);
147
+ if (newSupplyBN.gt(maxSupplyBN)) {
148
+ throw new Error('Cannot issue tokens: would exceed maximum supply');
149
+ }
150
+ await state.adapter.query(`
151
+ UPDATE tokens SET current_supply = ? WHERE symbol = ?
152
+ `, [newSupplyBN.toString(), symbol]);
153
+ const existingBalance = await state.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [to, symbol]);
154
+ if (existingBalance && existingBalance.length > 0) {
155
+ const balanceBN = new bignumber_js_1.default(existingBalance[0].balance);
156
+ const newBalanceBN = balanceBN.plus(amountBN);
157
+ await state.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newBalanceBN.toString(), to, symbol]);
158
+ }
159
+ else {
160
+ await state.adapter.query('INSERT INTO token_balances (account, symbol, balance) VALUES (?, ?, ?)', [to, symbol, amountBN.toString()]);
161
+ }
162
+ await state.adapter.query(`
163
+ INSERT INTO token_transfers (from_account, to_account, amount, symbol, memo, block_number, transaction_id, timestamp)
164
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
165
+ `, ['null', to, amount, symbol, memo, ctx.block.number, ctx.transaction.id, new Date()]);
166
+ await state.adapter.addEvent(new Date(), name, 'issueTokens', payload, {
167
+ action: 'tokens_issued',
168
+ data: {
169
+ to,
170
+ amount,
171
+ symbol
172
+ }
173
+ });
174
+ console.log(`[TokenContract] Issued ${amount} ${symbol} to ${to}`);
175
+ }
176
+ catch (error) {
177
+ console.error('[TokenContract] Error issuing tokens:', error);
178
+ throw error;
179
+ }
180
+ };
181
+ const transferTokens = async (payload, ctx) => {
182
+ try {
183
+ const { symbol, to, amount, memo = '' } = payload;
184
+ if (ctx.sender === to) {
185
+ throw new Error('Cannot transfer tokens to yourself');
186
+ }
187
+ const token = await state.adapter.query('SELECT * FROM tokens WHERE symbol = ?', [symbol]);
188
+ if (!token || token.length === 0) {
189
+ throw new Error(`Token ${symbol} does not exist`);
190
+ }
191
+ const amountBN = new bignumber_js_1.default(amount);
192
+ if (amountBN.isNaN() || amountBN.lte(0)) {
193
+ throw new Error('Amount must be a positive number');
194
+ }
195
+ const senderBalance = await state.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [ctx.sender, symbol]);
196
+ if (!senderBalance || senderBalance.length === 0) {
197
+ throw new Error(`Account ${ctx.sender} does not have any ${symbol} tokens`);
198
+ }
199
+ const senderBalanceBN = new bignumber_js_1.default(senderBalance[0].balance);
200
+ if (senderBalanceBN.lt(amountBN)) {
201
+ throw new Error('Insufficient balance');
202
+ }
203
+ const newSenderBalanceBN = senderBalanceBN.minus(amountBN);
204
+ await state.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newSenderBalanceBN.toString(), ctx.sender, symbol]);
205
+ const receiverBalance = await state.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [to, symbol]);
206
+ if (receiverBalance && receiverBalance.length > 0) {
207
+ const receiverBalanceBN = new bignumber_js_1.default(receiverBalance[0].balance);
208
+ const newReceiverBalanceBN = receiverBalanceBN.plus(amountBN);
209
+ await state.adapter.query('UPDATE token_balances SET balance = ? WHERE account = ? AND symbol = ?', [newReceiverBalanceBN.toString(), to, symbol]);
210
+ }
211
+ else {
212
+ await state.adapter.query('INSERT INTO token_balances (account, symbol, balance) VALUES (?, ?, ?)', [to, symbol, amountBN.toString()]);
213
+ }
214
+ await state.adapter.query(`
215
+ INSERT INTO token_transfers (from_account, to_account, amount, symbol, memo, block_number, transaction_id, timestamp)
216
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
217
+ `, [ctx.sender, to, amount, symbol, memo, ctx.block.number, ctx.transaction.id, new Date()]);
218
+ await state.adapter.addEvent(new Date(), name, 'transferTokens', payload, {
219
+ action: 'tokens_transferred',
220
+ data: {
221
+ from: ctx.sender,
222
+ to,
223
+ amount,
224
+ symbol
225
+ }
226
+ });
227
+ console.log(`[TokenContract] Transferred ${amount} ${symbol} from ${ctx.sender} to ${to}`);
228
+ }
229
+ catch (error) {
230
+ console.error('[TokenContract] Error transferring tokens:', error);
231
+ throw error;
232
+ }
233
+ };
234
+ const getBalance = async (payload, ctx) => {
235
+ try {
236
+ const { account, symbol } = payload;
237
+ const balance = await state.adapter.query('SELECT balance FROM token_balances WHERE account = ? AND symbol = ?', [account, symbol]);
238
+ const balanceAmount = balance && balance.length > 0 ? balance[0].balance : '0';
239
+ await state.adapter.addEvent(new Date(), name, 'getBalance', payload, {
240
+ action: 'balance_query',
241
+ data: {
242
+ account,
243
+ symbol,
244
+ balance: balanceAmount,
245
+ queried_by: ctx.sender
246
+ }
247
+ });
248
+ console.log(`[TokenContract] Balance query: ${account} has ${balanceAmount} ${symbol}`);
249
+ }
250
+ catch (error) {
251
+ console.error('[TokenContract] Error getting balance:', error);
252
+ throw error;
253
+ }
254
+ };
255
+ const getTokenInfo = async (payload, ctx) => {
256
+ try {
257
+ const { symbol } = payload;
258
+ const token = await state.adapter.query('SELECT * FROM tokens WHERE symbol = ?', [symbol]);
259
+ if (!token || token.length === 0) {
260
+ throw new Error(`Token ${symbol} does not exist`);
261
+ }
262
+ const tokenData = token[0];
263
+ await state.adapter.addEvent(new Date(), name, 'getTokenInfo', payload, {
264
+ action: 'token_info_query',
265
+ data: {
266
+ symbol,
267
+ queried_by: ctx.sender,
268
+ token_info: tokenData
269
+ }
270
+ });
271
+ console.log(`[TokenContract] Token info query for ${symbol} by ${ctx.sender}`);
272
+ }
273
+ catch (error) {
274
+ console.error('[TokenContract] Error getting token info:', error);
275
+ throw error;
276
+ }
277
+ };
278
+ return (0, contract_1.defineContract)({
279
+ name,
280
+ hooks: {
281
+ create: async ({ streamer, adapter }) => {
282
+ state.streamer = streamer;
283
+ state.adapter = adapter;
284
+ await initializeTokenTables();
285
+ }
286
+ },
287
+ actions: {
288
+ createToken: (0, contract_1.action)(createToken, {
289
+ schema: createTokenSchema,
290
+ trigger: 'custom_json'
291
+ }),
292
+ issueTokens: (0, contract_1.action)(issueTokens, {
293
+ schema: issueTokensSchema,
294
+ trigger: 'custom_json'
295
+ }),
296
+ transferTokens: (0, contract_1.action)(transferTokens, {
297
+ schema: transferTokensSchema,
298
+ trigger: 'custom_json'
299
+ }),
300
+ getBalance: (0, contract_1.action)(getBalance, {
301
+ schema: getBalanceSchema,
302
+ trigger: 'custom_json'
303
+ }),
304
+ getTokenInfo: (0, contract_1.action)(getTokenInfo, {
305
+ schema: getTokenInfoSchema,
306
+ trigger: 'custom_json'
307
+ })
308
+ }
309
+ });
310
+ }
311
+ //# 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,11 @@
1
+ import { Exchange } from './exchange';
2
+ import { RateConfig } from '../types/rates';
3
+ export declare class CoinGeckoExchange extends Exchange {
4
+ readonly exchangeId = "coingecko";
5
+ private static readonly API_BASE;
6
+ private static readonly ENDPOINT;
7
+ constructor(config?: RateConfig);
8
+ fetchRates(): Promise<boolean>;
9
+ private parseRatesResponse;
10
+ private validateRates;
11
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoinGeckoExchange = void 0;
4
+ const exchange_1 = require("./exchange");
5
+ const rates_1 = require("../types/rates");
6
+ class CoinGeckoExchange extends exchange_1.Exchange {
7
+ exchangeId = 'coingecko';
8
+ static API_BASE = 'https://api.coingecko.com/api/v3';
9
+ static ENDPOINT = '/simple/price?ids=hive,hive_dollar&vs_currencies=usd';
10
+ constructor(config) {
11
+ super(config);
12
+ }
13
+ async fetchRates() {
14
+ try {
15
+ const url = `${CoinGeckoExchange.API_BASE}${CoinGeckoExchange.ENDPOINT}`;
16
+ const response = await this.fetchWithTimeout(url);
17
+ const data = await response.json();
18
+ const { usdHiveRate, usdHbdRate } = this.parseRatesResponse(data);
19
+ this.validateRates(usdHiveRate, usdHbdRate);
20
+ this.rateUsdHive = usdHiveRate;
21
+ this.rateUsdHbd = usdHbdRate;
22
+ console.log(`CoinGecko rates updated: HIVE=$${usdHiveRate.toFixed(6)}, HBD=$${usdHbdRate.toFixed(6)}`);
23
+ return true;
24
+ }
25
+ catch (error) {
26
+ if (error instanceof rates_1.ValidationError || error instanceof rates_1.NetworkError) {
27
+ throw error;
28
+ }
29
+ throw new rates_1.NetworkError(`Unexpected error fetching rates: ${error instanceof Error ? error.message : String(error)}`, this.exchangeId);
30
+ }
31
+ }
32
+ parseRatesResponse(data) {
33
+ if (!data || typeof data !== 'object') {
34
+ throw new rates_1.ValidationError('Invalid response format: expected object', this.exchangeId);
35
+ }
36
+ const usdHiveRate = data.hive?.usd;
37
+ const usdHbdRate = data.hive_dollar?.usd;
38
+ if (typeof usdHiveRate !== 'number' || typeof usdHbdRate !== 'number') {
39
+ throw new rates_1.ValidationError('Invalid response format: missing or invalid rate data', this.exchangeId);
40
+ }
41
+ return { usdHiveRate, usdHbdRate };
42
+ }
43
+ validateRates(hiveRate, hbdRate) {
44
+ if (isNaN(hiveRate) || isNaN(hbdRate)) {
45
+ throw new rates_1.ValidationError('Received NaN values from API', this.exchangeId);
46
+ }
47
+ if (hiveRate <= 0 || hbdRate <= 0) {
48
+ throw new rates_1.ValidationError('Received non-positive rate values', this.exchangeId);
49
+ }
50
+ // Sanity check: HIVE and HBD should be reasonable values (between $0.01 and $1000)
51
+ if (hiveRate < 0.01 || hiveRate > 1000 || hbdRate < 0.01 || hbdRate > 1000) {
52
+ throw new rates_1.ValidationError(`Rates outside expected range: HIVE=${hiveRate}, HBD=${hbdRate}`, this.exchangeId);
53
+ }
54
+ }
55
+ }
56
+ exports.CoinGeckoExchange = CoinGeckoExchange;
57
+ //# sourceMappingURL=coingecko.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coingecko.js","sourceRoot":"","sources":["../../src/exchanges/coingecko.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,16 @@
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
+ import { ExchangeInterface, RateConfig } from '../types/rates';
2
+ export declare abstract class Exchange implements ExchangeInterface {
3
+ abstract readonly exchangeId: string;
4
+ rateUsdHive?: number;
5
+ rateUsdHbd?: number;
6
+ private lastFetch?;
7
+ private readonly config;
8
+ constructor(config?: RateConfig);
9
+ updateRates(): Promise<boolean>;
10
+ abstract fetchRates(): Promise<boolean>;
11
+ private fetchRatesWithRetry;
12
+ protected fetchWithTimeout(url: string): Promise<Response>;
13
+ private delay;
14
+ getLastFetchTime(): number | undefined;
15
+ isCacheValid(): boolean;
16
+ }
@@ -1,27 +1,81 @@
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
+ const rates_1 = require("../types/rates");
5
+ class Exchange {
6
+ rateUsdHive;
7
+ rateUsdHbd;
8
+ lastFetch;
9
+ config;
10
+ constructor(config = {}) {
11
+ this.config = {
12
+ cacheDuration: config.cacheDuration ?? 60 * 60 * 1000, // 1 hour
13
+ maxRetries: config.maxRetries ?? 3,
14
+ retryDelay: config.retryDelay ?? 1000, // 1 second
15
+ timeout: config.timeout ?? 10000, // 10 seconds
16
+ };
17
+ }
18
+ async updateRates() {
19
+ const cacheExpiry = Date.now() - this.config.cacheDuration;
20
+ // Return cached data if still valid
21
+ if (this.lastFetch && this.lastFetch > cacheExpiry) {
22
+ return false; // No update needed
23
+ }
24
+ const success = await this.fetchRatesWithRetry();
25
+ if (success) {
26
+ this.lastFetch = Date.now();
27
+ }
28
+ return success;
29
+ }
30
+ async fetchRatesWithRetry() {
31
+ let lastError = null;
32
+ for (let attempt = 1; attempt <= this.config.maxRetries; attempt++) {
33
+ try {
34
+ const success = await this.fetchRates();
35
+ if (success) {
36
+ return true;
37
+ }
38
+ }
39
+ catch (error) {
40
+ lastError = error instanceof Error ? error : new Error(String(error));
41
+ if (attempt < this.config.maxRetries) {
42
+ await this.delay(this.config.retryDelay * attempt);
43
+ }
44
+ }
45
+ }
46
+ throw new rates_1.NetworkError(`Failed to fetch rates after ${this.config.maxRetries} attempts: ${lastError?.message}`, this.exchangeId);
47
+ }
48
+ async fetchWithTimeout(url) {
49
+ const controller = new AbortController();
50
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
51
+ try {
52
+ const response = await fetch(url, {
53
+ signal: controller.signal,
54
+ headers: {
55
+ 'User-Agent': 'hive-stream/3.0.0',
56
+ 'Accept': 'application/json',
57
+ },
58
+ });
59
+ if (!response.ok) {
60
+ throw new rates_1.NetworkError(`HTTP ${response.status}: ${response.statusText}`, this.exchangeId);
61
+ }
62
+ return response;
63
+ }
64
+ finally {
65
+ clearTimeout(timeoutId);
66
+ }
67
+ }
68
+ delay(ms) {
69
+ return new Promise(resolve => setTimeout(resolve, ms));
70
+ }
71
+ getLastFetchTime() {
72
+ return this.lastFetch;
73
+ }
74
+ isCacheValid() {
75
+ if (!this.lastFetch)
76
+ return false;
77
+ return this.lastFetch > (Date.now() - this.config.cacheDuration);
78
+ }
79
+ }
80
+ exports.Exchange = Exchange;
27
81
  //# sourceMappingURL=exchange.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchanges/exchange.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAQ;IACV,UAAU,CAAC;IACV,OAAO,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IAE1B,WAAW,CAAC;IACZ,UAAU,CAAC;IACV,SAAS,CAAC;IAEX,KAAK,CAAC,WAAW;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE3C,2BAA2B;QAC3B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,QAAQ,EAAE;YAC7C,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAEtC,IAAI,KAAK,EAAE;YACP,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;SAC/B;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AA5BD,4BA4BC"}
1
+ {"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchanges/exchange.ts"],"names":[],"mappings":";;;AAAA,0CAA6E;AAE7E,MAAsB,QAAQ;IAEnB,WAAW,CAAU;IACrB,UAAU,CAAU;IAEnB,SAAS,CAAU;IACV,MAAM,CAAuB;IAE9C,YAAY,SAAqB,EAAE;QAC/B,IAAI,CAAC,MAAM,GAAG;YACV,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,SAAS;YAChE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,WAAW;YAClD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK,EAAE,aAAa;SAClD,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,WAAW;QACpB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAE3D,oCAAoC;QACpC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,GAAG,WAAW,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC,CAAC,mBAAmB;QACrC,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEjD,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAIO,KAAK,CAAC,mBAAmB;QAC7B,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACjE,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxC,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,IAAI,CAAC;gBAChB,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAEtE,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;oBACnC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,CAAC;gBACvD,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,IAAI,oBAAY,CAClB,+BAA+B,IAAI,CAAC,MAAM,CAAC,UAAU,cAAc,SAAS,EAAE,OAAO,EAAE,EACvF,IAAI,CAAC,UAAU,CAClB,CAAC;IACN,CAAC;IAES,KAAK,CAAC,gBAAgB,CAAC,GAAW;QACxC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,OAAO,EAAE;oBACL,YAAY,EAAE,mBAAmB;oBACjC,QAAQ,EAAE,kBAAkB;iBAC/B;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,oBAAY,CAClB,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,EACjD,IAAI,CAAC,UAAU,CAClB,CAAC;YACN,CAAC;YAED,OAAO,QAAQ,CAAC;QACpB,CAAC;gBAAS,CAAC;YACP,YAAY,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,EAAU;QACpB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,gBAAgB;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAEM,YAAY;QACf,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAClC,OAAO,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACrE,CAAC;CACJ;AAlGD,4BAkGC"}