hive-stream 3.0.0 → 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 (101) hide show
  1. package/AGENTS.md +35 -0
  2. package/DOCUMENTATION.md +380 -0
  3. package/README.md +113 -22
  4. package/dist/actions.d.ts +3 -3
  5. package/dist/actions.js +7 -7
  6. package/dist/actions.js.map +1 -1
  7. package/dist/adapters/base.adapter.d.ts +19 -1
  8. package/dist/adapters/base.adapter.js +16 -0
  9. package/dist/adapters/base.adapter.js.map +1 -1
  10. package/dist/adapters/mongodb.adapter.d.ts +5 -11
  11. package/dist/adapters/mongodb.adapter.js +10 -10
  12. package/dist/adapters/mongodb.adapter.js.map +1 -1
  13. package/dist/adapters/postgresql.adapter.d.ts +17 -0
  14. package/dist/adapters/postgresql.adapter.js +99 -8
  15. package/dist/adapters/postgresql.adapter.js.map +1 -1
  16. package/dist/adapters/sqlite.adapter.d.ts +17 -0
  17. package/dist/adapters/sqlite.adapter.js +99 -8
  18. package/dist/adapters/sqlite.adapter.js.map +1 -1
  19. package/dist/api.js +86 -0
  20. package/dist/api.js.map +1 -1
  21. package/dist/config.d.ts +3 -0
  22. package/dist/config.js +6 -3
  23. package/dist/config.js.map +1 -1
  24. package/dist/contracts/coinflip.contract.d.ts +8 -26
  25. package/dist/contracts/coinflip.contract.js +123 -144
  26. package/dist/contracts/coinflip.contract.js.map +1 -1
  27. package/dist/contracts/contract.d.ts +3 -0
  28. package/dist/contracts/contract.js +26 -0
  29. package/dist/contracts/contract.js.map +1 -0
  30. package/dist/contracts/dice.contract.d.ts +9 -36
  31. package/dist/contracts/dice.contract.js +135 -200
  32. package/dist/contracts/dice.contract.js.map +1 -1
  33. package/dist/contracts/exchange.contract.d.ts +11 -0
  34. package/dist/contracts/exchange.contract.js +492 -0
  35. package/dist/contracts/exchange.contract.js.map +1 -0
  36. package/dist/contracts/lotto.contract.d.ts +15 -19
  37. package/dist/contracts/lotto.contract.js +154 -162
  38. package/dist/contracts/lotto.contract.js.map +1 -1
  39. package/dist/contracts/nft.contract.d.ts +4 -0
  40. package/dist/contracts/nft.contract.js +65 -0
  41. package/dist/contracts/nft.contract.js.map +1 -1
  42. package/dist/contracts/poll.contract.d.ts +4 -0
  43. package/dist/contracts/poll.contract.js +105 -0
  44. package/dist/contracts/poll.contract.js.map +1 -0
  45. package/dist/contracts/rps.contract.d.ts +9 -0
  46. package/dist/contracts/rps.contract.js +217 -0
  47. package/dist/contracts/rps.contract.js.map +1 -0
  48. package/dist/contracts/tipjar.contract.d.ts +4 -0
  49. package/dist/contracts/tipjar.contract.js +60 -0
  50. package/dist/contracts/tipjar.contract.js.map +1 -0
  51. package/dist/contracts/token.contract.d.ts +3 -17
  52. package/dist/contracts/token.contract.js +128 -80
  53. package/dist/contracts/token.contract.js.map +1 -1
  54. package/dist/exchanges/coingecko.d.ts +7 -1
  55. package/dist/exchanges/coingecko.js +38 -21
  56. package/dist/exchanges/coingecko.js.map +1 -1
  57. package/dist/exchanges/exchange.d.ts +15 -8
  58. package/dist/exchanges/exchange.js +65 -11
  59. package/dist/exchanges/exchange.js.map +1 -1
  60. package/dist/hive-rates.d.ts +29 -4
  61. package/dist/hive-rates.js +179 -92
  62. package/dist/hive-rates.js.map +1 -1
  63. package/dist/index.d.ts +10 -3
  64. package/dist/index.js +18 -4
  65. package/dist/index.js.map +1 -1
  66. package/dist/streamer.d.ts +101 -8
  67. package/dist/streamer.js +410 -140
  68. package/dist/streamer.js.map +1 -1
  69. package/dist/test.js +11 -12
  70. package/dist/test.js.map +1 -1
  71. package/dist/types/hive-stream.d.ts +85 -14
  72. package/dist/types/rates.d.ts +47 -0
  73. package/dist/types/rates.js +29 -0
  74. package/dist/types/rates.js.map +1 -0
  75. package/dist/utils.d.ts +318 -11
  76. package/dist/utils.js +804 -115
  77. package/dist/utils.js.map +1 -1
  78. package/examples/contracts/README.md +8 -0
  79. package/examples/contracts/exchange.ts +38 -0
  80. package/examples/contracts/poll.ts +21 -0
  81. package/examples/contracts/rps.ts +19 -0
  82. package/examples/contracts/tipjar.ts +19 -0
  83. package/package.json +20 -19
  84. package/tests/actions.spec.ts +7 -7
  85. package/tests/adapters/actions-persistence.spec.ts +4 -4
  86. package/tests/adapters/sqlite.adapter.spec.ts +2 -2
  87. package/tests/contracts/coinflip.contract.spec.ts +26 -154
  88. package/tests/contracts/dice.contract.spec.ts +24 -140
  89. package/tests/contracts/exchange.contract.spec.ts +84 -0
  90. package/tests/contracts/lotto.contract.spec.ts +30 -295
  91. package/tests/contracts/token.contract.spec.ts +72 -316
  92. package/tests/exchanges/coingecko.exchange.spec.ts +169 -0
  93. package/tests/exchanges/exchange.base.spec.ts +246 -0
  94. package/tests/helpers/mock-fetch.ts +165 -0
  95. package/tests/hive-chain-features.spec.ts +238 -0
  96. package/tests/hive-rates.spec.ts +443 -0
  97. package/tests/integration/hive-rates.integration.spec.ts +35 -0
  98. package/tests/streamer-actions.spec.ts +29 -18
  99. package/tests/streamer.spec.ts +142 -49
  100. package/tests/types/rates.spec.ts +216 -0
  101. package/tests/utils.spec.ts +27 -6
@@ -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":"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"}
@@ -1,9 +1,34 @@
1
+ import { Exchange } from './exchanges/exchange';
2
+ import { ExchangeRates, HiveRates as HiveRatesType, SupportedCrypto, SupportedFiat, RateConfig } from './types/rates';
1
3
  export declare class HiveRates {
2
4
  private fiatRates;
3
5
  private hiveRates;
4
- private lastFetch;
5
- private oneHour;
6
+ private lastFiatFetch?;
7
+ private readonly exchanges;
8
+ private readonly config;
9
+ private static readonly FIAT_API_ENDPOINTS;
10
+ constructor(config?: RateConfig, customExchanges?: Exchange[]);
6
11
  fetchRates(): Promise<boolean>;
7
- fiatToHiveRate(fiatSymbol: any, hiveSymbol: any): any;
8
- private getFiatRates;
12
+ private fetchCryptoRates;
13
+ private calculateCrossRates;
14
+ private calculateAverageRates;
15
+ getRate(fiatSymbol: SupportedFiat, cryptoSymbol: SupportedCrypto): number | null;
16
+ getAllRates(): Readonly<HiveRatesType>;
17
+ getCryptoRates(): {
18
+ hive?: number;
19
+ hbd?: number;
20
+ };
21
+ getFiatRates(): Readonly<ExchangeRates>;
22
+ fiatToHiveRate(fiatSymbol: string, hiveSymbol: string): number | null;
23
+ private fetchFiatRates;
24
+ private parseFiatResponse;
25
+ private fetchWithTimeout;
26
+ getLastFetchTimes(): {
27
+ crypto?: number;
28
+ fiat?: number;
29
+ };
30
+ isCacheValid(): {
31
+ crypto: boolean;
32
+ fiat: boolean;
33
+ };
9
34
  }
@@ -2,121 +2,208 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HiveRates = void 0;
4
4
  const coingecko_1 = require("./exchanges/coingecko");
5
+ const rates_1 = require("./types/rates");
5
6
  class HiveRates {
6
7
  fiatRates = {};
7
8
  hiveRates = {};
8
- lastFetch;
9
- oneHour = 1000 * 60 * 60;
9
+ lastFiatFetch;
10
+ exchanges;
11
+ config;
12
+ static FIAT_API_ENDPOINTS = [
13
+ 'https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies',
14
+ 'https://latest.currency-api.pages.dev/v1/currencies'
15
+ ];
16
+ constructor(config = {}, customExchanges = []) {
17
+ this.config = {
18
+ cacheDuration: config.cacheDuration ?? 60 * 60 * 1000, // 1 hour
19
+ maxRetries: config.maxRetries ?? 3,
20
+ retryDelay: config.retryDelay ?? 1000,
21
+ timeout: config.timeout ?? 10000,
22
+ };
23
+ this.exchanges = customExchanges.length > 0
24
+ ? customExchanges
25
+ : [new coingecko_1.CoinGeckoExchange(this.config)];
26
+ }
10
27
  async fetchRates() {
11
- let hiveAverage = 0;
12
- let hbdAverage = 0;
13
- let hiveCount = 0;
14
- let hbdCount = 0;
15
- let exchangesUpdated = false;
16
- const exchanges = [new coingecko_1.CoinGeckoExchange()];
17
- for (const exchange of exchanges) {
18
- const updated = await exchange.updateRates();
19
- if (updated) {
20
- exchangesUpdated = true;
21
- const usdHiveRate = exchange.rateUsdHive;
22
- const usdHbdRate = exchange.rateUsdHbd;
23
- if (usdHiveRate && usdHiveRate > 0) {
24
- hiveAverage += usdHiveRate;
25
- hiveCount++;
26
- }
27
- if (usdHbdRate && usdHbdRate > 0) {
28
- hbdAverage += usdHbdRate;
29
- hbdCount++;
30
- }
28
+ try {
29
+ const [cryptoSuccess, fiatSuccess] = await Promise.allSettled([
30
+ this.fetchCryptoRates(),
31
+ this.fetchFiatRates()
32
+ ]);
33
+ const cryptoUpdated = cryptoSuccess.status === 'fulfilled' && cryptoSuccess.value;
34
+ const fiatUpdated = fiatSuccess.status === 'fulfilled' && fiatSuccess.value;
35
+ if (!cryptoUpdated && !fiatUpdated) {
36
+ console.warn('No rates were updated');
37
+ return false;
31
38
  }
39
+ if (cryptoUpdated) {
40
+ this.calculateCrossRates();
41
+ }
42
+ return true;
32
43
  }
33
- const fiatRates = await this.getFiatRates();
34
- if (hiveCount === 0 && hbdCount === 0) {
35
- return false;
36
- }
37
- if (hiveCount > 0) {
38
- hiveAverage = hiveAverage / hiveCount;
39
- }
40
- if (hbdCount > 0) {
41
- hbdAverage = hbdAverage / hbdCount;
44
+ catch (error) {
45
+ console.error('Error in fetchRates:', error);
46
+ throw error instanceof rates_1.RatesError ? error : new rates_1.RatesError(`Unexpected error: ${error instanceof Error ? error.message : String(error)}`, 'UNKNOWN_ERROR');
42
47
  }
43
- for (const [symbol, value] of Object.entries(this.fiatRates)) {
44
- const rate = Number(value);
45
- this.hiveRates[`USD_${symbol}`] = rate;
46
- this.hiveRates[`${symbol}_HIVE`] = hiveAverage * rate;
47
- this.hiveRates[`${symbol}_HBD`] = hbdAverage * rate;
48
+ }
49
+ async fetchCryptoRates() {
50
+ const results = await Promise.allSettled(this.exchanges.map(exchange => exchange.updateRates()));
51
+ const successfulUpdates = results
52
+ .map((result, index) => ({
53
+ result,
54
+ exchange: this.exchanges[index]
55
+ }))
56
+ .filter(({ result }) => result.status === 'fulfilled' && result.value);
57
+ if (successfulUpdates.length === 0) {
58
+ const errors = results
59
+ .filter(result => result.status === 'rejected')
60
+ .map(result => result.reason);
61
+ console.warn('All crypto exchanges failed:', errors);
62
+ return false;
48
63
  }
49
64
  return true;
50
65
  }
51
- fiatToHiveRate(fiatSymbol, hiveSymbol) {
52
- if (!this.hiveRates) {
53
- return null;
66
+ calculateCrossRates() {
67
+ const { hiveAverage, hbdAverage } = this.calculateAverageRates();
68
+ if (hiveAverage === 0 && hbdAverage === 0) {
69
+ console.warn('No valid crypto rates available for cross-rate calculation');
70
+ return;
54
71
  }
55
- if (!this.hiveRates[`${fiatSymbol}_${hiveSymbol}`]) {
56
- return null;
72
+ // Calculate cross rates with fiat currencies
73
+ Object.entries(this.fiatRates).forEach(([symbol, rate]) => {
74
+ if (typeof rate === 'number' && !isNaN(rate) && rate > 0) {
75
+ this.hiveRates[`USD_${symbol}`] = rate;
76
+ if (hiveAverage > 0) {
77
+ this.hiveRates[`${symbol}_HIVE`] = hiveAverage * rate;
78
+ }
79
+ if (hbdAverage > 0) {
80
+ this.hiveRates[`${symbol}_HBD`] = hbdAverage * rate;
81
+ }
82
+ }
83
+ });
84
+ }
85
+ calculateAverageRates() {
86
+ let hiveSum = 0;
87
+ let hbdSum = 0;
88
+ let hiveCount = 0;
89
+ let hbdCount = 0;
90
+ for (const exchange of this.exchanges) {
91
+ if (exchange.rateUsdHive && exchange.rateUsdHive > 0) {
92
+ hiveSum += exchange.rateUsdHive;
93
+ hiveCount++;
94
+ }
95
+ if (exchange.rateUsdHbd && exchange.rateUsdHbd > 0) {
96
+ hbdSum += exchange.rateUsdHbd;
97
+ hbdCount++;
98
+ }
57
99
  }
58
- return this.hiveRates[`${fiatSymbol}_${hiveSymbol}`];
100
+ return {
101
+ hiveAverage: hiveCount > 0 ? hiveSum / hiveCount : 0,
102
+ hbdAverage: hbdCount > 0 ? hbdSum / hbdCount : 0
103
+ };
59
104
  }
60
- async getFiatRates(base = 'USD') {
61
- const HOUR_AGO = Date.now() - this.oneHour;
62
- if (this.lastFetch && this.lastFetch > HOUR_AGO) {
63
- return false;
105
+ getRate(fiatSymbol, cryptoSymbol) {
106
+ const pair = `${fiatSymbol}_${cryptoSymbol}`;
107
+ return this.hiveRates[pair] ?? null;
108
+ }
109
+ getAllRates() {
110
+ return { ...this.hiveRates };
111
+ }
112
+ getCryptoRates() {
113
+ const { hiveAverage, hbdAverage } = this.calculateAverageRates();
114
+ return {
115
+ ...(hiveAverage > 0 && { hive: hiveAverage }),
116
+ ...(hbdAverage > 0 && { hbd: hbdAverage })
117
+ };
118
+ }
119
+ getFiatRates() {
120
+ return { ...this.fiatRates };
121
+ }
122
+ // Legacy method for backward compatibility
123
+ fiatToHiveRate(fiatSymbol, hiveSymbol) {
124
+ return this.getRate(fiatSymbol, hiveSymbol);
125
+ }
126
+ async fetchFiatRates(baseCurrency = 'USD') {
127
+ const cacheExpiry = Date.now() - this.config.cacheDuration;
128
+ if (this.lastFiatFetch && this.lastFiatFetch > cacheExpiry) {
129
+ return false; // Cache still valid
64
130
  }
65
- try {
66
- const baseKey = base.toLowerCase();
67
- let response = null;
68
- let exchangeRates = null;
69
- // Try primary endpoint first
131
+ const baseKey = baseCurrency.toLowerCase();
132
+ let lastError = null;
133
+ for (const baseUrl of HiveRates.FIAT_API_ENDPOINTS) {
70
134
  try {
71
- const primaryUrl = `https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/${baseKey}.json`;
72
- const request = await fetch(primaryUrl);
73
- if (request.ok) {
74
- response = await request.json();
75
- exchangeRates = response?.[baseKey];
135
+ const url = `${baseUrl}/${baseKey}.json`;
136
+ const response = await this.fetchWithTimeout(url);
137
+ const data = await response.json();
138
+ const rates = this.parseFiatResponse(data, baseKey);
139
+ if (Object.keys(rates).length === 0) {
140
+ throw new rates_1.ValidationError('No valid currency rates found in response');
76
141
  }
142
+ this.fiatRates = rates;
143
+ this.lastFiatFetch = Date.now();
144
+ console.log(`Successfully fetched ${Object.keys(rates).length} fiat rates from ${baseUrl}`);
145
+ return true;
77
146
  }
78
- catch (primaryError) {
79
- console.warn('Primary API endpoint failed:', primaryError.message);
147
+ catch (error) {
148
+ lastError = error instanceof Error ? error : new Error(String(error));
149
+ console.warn(`Fiat API endpoint ${baseUrl} failed:`, lastError.message);
80
150
  }
81
- // If primary fails, try the Cloudflare fallback
82
- if (!exchangeRates) {
83
- try {
84
- const fallbackUrl = `https://latest.currency-api.pages.dev/v1/currencies/${baseKey}.json`;
85
- const request = await fetch(fallbackUrl);
86
- if (request.ok) {
87
- response = await request.json();
88
- exchangeRates = response?.[baseKey];
89
- }
90
- }
91
- catch (fallbackError) {
92
- console.warn('Fallback API endpoint failed:', fallbackError.message);
93
- }
94
- }
95
- if (!exchangeRates || typeof exchangeRates !== 'object') {
96
- console.error('No valid exchange rates found in API response');
97
- return false;
98
- }
99
- // Convert the currency codes to uppercase to match the previous format
100
- const upperCaseRates = {};
101
- for (const [currency, rate] of Object.entries(exchangeRates)) {
102
- if (typeof rate === 'number' && !isNaN(rate)) {
103
- upperCaseRates[currency.toUpperCase()] = rate;
104
- }
151
+ }
152
+ throw new rates_1.NetworkError(`All fiat API endpoints failed. Last error: ${lastError?.message}`, 'fiat-api');
153
+ }
154
+ parseFiatResponse(data, baseKey) {
155
+ if (!data || typeof data !== 'object') {
156
+ throw new rates_1.ValidationError('Invalid fiat API response format');
157
+ }
158
+ const exchangeRates = data[baseKey];
159
+ if (!exchangeRates || typeof exchangeRates !== 'object') {
160
+ throw new rates_1.ValidationError(`No exchange rates found for base currency: ${baseKey}`);
161
+ }
162
+ const validRates = {};
163
+ Object.entries(exchangeRates).forEach(([currency, rate]) => {
164
+ if (typeof rate === 'number' && !isNaN(rate) && rate > 0) {
165
+ validRates[currency.toUpperCase()] = rate;
105
166
  }
106
- if (Object.keys(upperCaseRates).length === 0) {
107
- console.error('No valid currency rates found');
108
- return false;
167
+ });
168
+ return validRates;
169
+ }
170
+ async fetchWithTimeout(url) {
171
+ const controller = new AbortController();
172
+ const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
173
+ try {
174
+ const response = await fetch(url, {
175
+ signal: controller.signal,
176
+ headers: {
177
+ 'User-Agent': 'hive-stream/3.0.0',
178
+ 'Accept': 'application/json',
179
+ 'Cache-Control': 'no-cache',
180
+ },
181
+ });
182
+ if (!response.ok) {
183
+ throw new rates_1.NetworkError(`HTTP ${response.status}: ${response.statusText}`);
109
184
  }
110
- this.fiatRates = upperCaseRates;
111
- this.lastFetch = Date.now();
112
- console.log(`Successfully fetched ${Object.keys(upperCaseRates).length} currency rates with base ${base}`);
113
- return true;
185
+ return response;
114
186
  }
115
- catch (error) {
116
- console.error('Error fetching fiat rates:', error);
117
- return false;
187
+ finally {
188
+ clearTimeout(timeoutId);
118
189
  }
119
190
  }
191
+ getLastFetchTimes() {
192
+ const cryptoTimes = this.exchanges
193
+ .map(exchange => exchange.getLastFetchTime())
194
+ .filter((time) => time !== undefined);
195
+ return {
196
+ ...(cryptoTimes.length > 0 && { crypto: Math.max(...cryptoTimes) }),
197
+ ...(this.lastFiatFetch && { fiat: this.lastFiatFetch })
198
+ };
199
+ }
200
+ isCacheValid() {
201
+ const cryptoValid = this.exchanges.some(exchange => exchange.isCacheValid());
202
+ const fiatValid = this.lastFiatFetch
203
+ ? this.lastFiatFetch > (Date.now() - this.config.cacheDuration)
204
+ : false;
205
+ return { crypto: cryptoValid, fiat: fiatValid };
206
+ }
120
207
  }
121
208
  exports.HiveRates = HiveRates;
122
209
  //# sourceMappingURL=hive-rates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hive-rates.js","sourceRoot":"","sources":["../src/hive-rates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hive-rates.js","sourceRoot":"","sources":["../src/hive-rates.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,11 +2,18 @@ export * from './config';
2
2
  export * from './streamer';
3
3
  export * from './utils';
4
4
  export * from './actions';
5
+ export * from './contracts/contract';
5
6
  export * from './adapters/base.adapter';
6
7
  export * from './adapters/sqlite.adapter';
7
8
  export * from './adapters/mongodb.adapter';
8
9
  export * from './adapters/postgresql.adapter';
9
- export { DiceContract } from './contracts/dice.contract';
10
- export { LottoContract } from './contracts/lotto.contract';
11
- export { CoinflipContract } from './contracts/coinflip.contract';
10
+ export { createDiceContract } from './contracts/dice.contract';
11
+ export { createLottoContract } from './contracts/lotto.contract';
12
+ export { createCoinflipContract } from './contracts/coinflip.contract';
13
+ export { createTokenContract } from './contracts/token.contract';
14
+ export { createNFTContract, NFTContract } from './contracts/nft.contract';
15
+ export { createRpsContract } from './contracts/rps.contract';
16
+ export { createPollContract } from './contracts/poll.contract';
17
+ export { createTipJarContract } from './contracts/tipjar.contract';
18
+ export { createExchangeContract } from './contracts/exchange.contract';
12
19
  export * from './types/hive-stream';
package/dist/index.js CHANGED
@@ -14,21 +14,35 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.CoinflipContract = exports.LottoContract = exports.DiceContract = void 0;
17
+ exports.createExchangeContract = exports.createTipJarContract = exports.createPollContract = exports.createRpsContract = exports.NFTContract = exports.createNFTContract = exports.createTokenContract = exports.createCoinflipContract = exports.createLottoContract = exports.createDiceContract = void 0;
18
18
  __exportStar(require("./config"), exports);
19
19
  __exportStar(require("./streamer"), exports);
20
20
  __exportStar(require("./utils"), exports);
21
21
  __exportStar(require("./actions"), exports);
22
+ __exportStar(require("./contracts/contract"), exports);
22
23
  __exportStar(require("./adapters/base.adapter"), exports);
23
24
  __exportStar(require("./adapters/sqlite.adapter"), exports);
24
25
  __exportStar(require("./adapters/mongodb.adapter"), exports);
25
26
  __exportStar(require("./adapters/postgresql.adapter"), exports);
26
27
  var dice_contract_1 = require("./contracts/dice.contract");
27
- Object.defineProperty(exports, "DiceContract", { enumerable: true, get: function () { return dice_contract_1.DiceContract; } });
28
+ Object.defineProperty(exports, "createDiceContract", { enumerable: true, get: function () { return dice_contract_1.createDiceContract; } });
28
29
  var lotto_contract_1 = require("./contracts/lotto.contract");
29
- Object.defineProperty(exports, "LottoContract", { enumerable: true, get: function () { return lotto_contract_1.LottoContract; } });
30
+ Object.defineProperty(exports, "createLottoContract", { enumerable: true, get: function () { return lotto_contract_1.createLottoContract; } });
30
31
  var coinflip_contract_1 = require("./contracts/coinflip.contract");
31
- Object.defineProperty(exports, "CoinflipContract", { enumerable: true, get: function () { return coinflip_contract_1.CoinflipContract; } });
32
+ Object.defineProperty(exports, "createCoinflipContract", { enumerable: true, get: function () { return coinflip_contract_1.createCoinflipContract; } });
33
+ var token_contract_1 = require("./contracts/token.contract");
34
+ Object.defineProperty(exports, "createTokenContract", { enumerable: true, get: function () { return token_contract_1.createTokenContract; } });
35
+ var nft_contract_1 = require("./contracts/nft.contract");
36
+ Object.defineProperty(exports, "createNFTContract", { enumerable: true, get: function () { return nft_contract_1.createNFTContract; } });
37
+ Object.defineProperty(exports, "NFTContract", { enumerable: true, get: function () { return nft_contract_1.NFTContract; } });
38
+ var rps_contract_1 = require("./contracts/rps.contract");
39
+ Object.defineProperty(exports, "createRpsContract", { enumerable: true, get: function () { return rps_contract_1.createRpsContract; } });
40
+ var poll_contract_1 = require("./contracts/poll.contract");
41
+ Object.defineProperty(exports, "createPollContract", { enumerable: true, get: function () { return poll_contract_1.createPollContract; } });
42
+ var tipjar_contract_1 = require("./contracts/tipjar.contract");
43
+ Object.defineProperty(exports, "createTipJarContract", { enumerable: true, get: function () { return tipjar_contract_1.createTipJarContract; } });
44
+ var exchange_contract_1 = require("./contracts/exchange.contract");
45
+ Object.defineProperty(exports, "createExchangeContract", { enumerable: true, get: function () { return exchange_contract_1.createExchangeContract; } });
32
46
  // Types
33
47
  __exportStar(require("./types/hive-stream"), exports);
34
48
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,4CAA0B;AAE1B,0DAAwC;AACxC,4DAA0C;AAC1C,6DAA2C;AAC3C,gEAA8C;AAE9C,2DAAyD;AAAhD,6GAAA,YAAY,OAAA;AACrB,6DAA2D;AAAlD,+GAAA,aAAa,OAAA;AACtB,mEAAiE;AAAxD,qHAAA,gBAAgB,OAAA;AAEzB,QAAQ;AACR,sDAAoC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,4CAA0B;AAC1B,uDAAqC;AAErC,0DAAwC;AACxC,4DAA0C;AAC1C,6DAA2C;AAC3C,gEAA8C;AAE9C,2DAA+D;AAAtD,mHAAA,kBAAkB,OAAA;AAC3B,6DAAiE;AAAxD,qHAAA,mBAAmB,OAAA;AAC5B,mEAAuE;AAA9D,2HAAA,sBAAsB,OAAA;AAC/B,6DAAiE;AAAxD,qHAAA,mBAAmB,OAAA;AAC5B,yDAA0E;AAAjE,iHAAA,iBAAiB,OAAA;AAAE,2GAAA,WAAW,OAAA;AACvC,yDAA6D;AAApD,iHAAA,iBAAiB,OAAA;AAC1B,2DAA+D;AAAtD,mHAAA,kBAAkB,OAAA;AAC3B,+DAAmE;AAA1D,uHAAA,oBAAoB,OAAA;AAC7B,mEAAuE;AAA9D,2HAAA,sBAAsB,OAAA;AAE/B,QAAQ;AACR,sDAAoC"}
@@ -1,7 +1,7 @@
1
1
  import { AdapterBase } from './adapters/base.adapter';
2
2
  import { TimeAction } from './actions';
3
3
  import { ConfigInterface } from './config';
4
- import { ContractInstance } from './types/hive-stream';
4
+ import { ContractDefinition, EscrowOperationType } from './types/hive-stream';
5
5
  export declare class Streamer {
6
6
  private customJsonSubscriptions;
7
7
  private customJsonIdSubscriptions;
@@ -9,6 +9,7 @@ export declare class Streamer {
9
9
  private commentSubscriptions;
10
10
  private postSubscriptions;
11
11
  private transferSubscriptions;
12
+ private escrowSubscriptions;
12
13
  private attempts;
13
14
  private config;
14
15
  private client;
@@ -19,6 +20,9 @@ export declare class Streamer {
19
20
  private blockNumberTimeout;
20
21
  private latestBlockTimer;
21
22
  private lastBlockNumber;
23
+ private headBlockNumber;
24
+ private isPollingBlock;
25
+ private isCatchingUp;
22
26
  private blockId;
23
27
  private previousBlockId;
24
28
  private transactionId;
@@ -54,6 +58,7 @@ export declare class Streamer {
54
58
  * Validate that the contract and method exist for the action
55
59
  */
56
60
  private validateActionContract;
61
+ private isActionTriggerAllowed;
57
62
  /**
58
63
  * Remove an action by ID
59
64
  */
@@ -78,8 +83,8 @@ export declare class Streamer {
78
83
  * Resets a specific action time value
79
84
  */
80
85
  resetAction(id: string): Promise<boolean>;
81
- registerContract(name: string, contract: ContractInstance): this;
82
- unregisterContract(name: string): void;
86
+ registerContract(contract: ContractDefinition): Promise<void>;
87
+ unregisterContract(name: string): Promise<void>;
83
88
  /**
84
89
  * setConfig
85
90
  *
@@ -105,11 +110,12 @@ export declare class Streamer {
105
110
  private getBlock;
106
111
  private loadBlock;
107
112
  processOperation(op: [string, any], blockNumber: number, blockId: string, prevBlockId: string, trxId: string, blockTime: Date): Promise<void>;
113
+ private normalizeContractPayload;
114
+ private isEscrowOperationType;
115
+ private buildEscrowDetails;
116
+ private buildContractContext;
117
+ private dispatchContractAction;
108
118
  private processActions;
109
- /**
110
- * Execute a single action with proper isolation
111
- */
112
- private executeAction;
113
119
  /**
114
120
  * Clean up completed or disabled actions to prevent memory leaks
115
121
  */
@@ -117,9 +123,84 @@ export declare class Streamer {
117
123
  saveStateToDisk(): Promise<void>;
118
124
  private saveStateThrottled;
119
125
  saveToHiveApi(from: string, data: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
120
- getAccountTransfers(account: string, from?: number, limit?: number): Promise<any>;
126
+ getAccountTransfers(account: string, from?: number, limit?: number): Promise<any[]>;
121
127
  transferHiveTokens(from: string, to: string, amount: string, symbol: string, memo?: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
122
128
  transferHiveTokensMultiple(from: string, accounts: string[], amount: string, symbol: string, memo?: string): Promise<boolean>;
129
+ broadcastOperations(operations: Array<[string, any]>, signingKeys?: string | string[]): Promise<import("@hiveio/dhive").TransactionConfirmation>;
130
+ broadcastMultiSigOperations(operations: Array<[string, any]>, signingKeys: string[]): any;
131
+ createAuthority(keyAuths?: Array<[string, number]>, accountAuths?: Array<[string, number]>, weightThreshold?: number): any;
132
+ updateAccountAuthorities(account: string, authorityUpdate: {
133
+ owner?: any;
134
+ active?: any;
135
+ posting?: any;
136
+ memo_key?: string;
137
+ json_metadata?: string;
138
+ posting_json_metadata?: string;
139
+ useAccountUpdate2?: boolean;
140
+ }, signingKeys?: string | string[]): Promise<any>;
141
+ escrowTransfer(options: {
142
+ from: string;
143
+ to: string;
144
+ agent: string;
145
+ escrow_id: number;
146
+ hive_amount?: string;
147
+ hbd_amount?: string;
148
+ fee: string;
149
+ ratification_deadline: string | Date;
150
+ escrow_expiration: string | Date;
151
+ json_meta?: string | Record<string, any>;
152
+ }, signingKeys?: string | string[]): any;
153
+ escrowApprove(options: {
154
+ from: string;
155
+ to: string;
156
+ agent: string;
157
+ who: string;
158
+ escrow_id: number;
159
+ approve: boolean;
160
+ }, signingKeys?: string | string[]): any;
161
+ escrowDispute(options: {
162
+ from: string;
163
+ to: string;
164
+ agent: string;
165
+ who: string;
166
+ escrow_id: number;
167
+ }, signingKeys?: string | string[]): any;
168
+ escrowRelease(options: {
169
+ from: string;
170
+ to: string;
171
+ agent: string;
172
+ who: string;
173
+ receiver: string;
174
+ escrow_id: number;
175
+ hive_amount?: string;
176
+ hbd_amount?: string;
177
+ }, signingKeys?: string | string[]): any;
178
+ recurrentTransfer(options: {
179
+ from: string;
180
+ to: string;
181
+ amount: string;
182
+ memo?: string;
183
+ recurrence: number;
184
+ executions: number;
185
+ }, signingKeys?: string | string[]): any;
186
+ createProposal(options: {
187
+ creator: string;
188
+ receiver: string;
189
+ start_date: string | Date;
190
+ end_date: string | Date;
191
+ daily_pay: string;
192
+ subject: string;
193
+ permlink: string;
194
+ }, signingKeys?: string | string[]): any;
195
+ updateProposalVotes(options: {
196
+ voter: string;
197
+ proposal_ids: number[];
198
+ approve: boolean;
199
+ }, signingKeys?: string | string[]): any;
200
+ removeProposals(options: {
201
+ proposal_owner: string;
202
+ proposal_ids: number[];
203
+ }, signingKeys?: string | string[]): any;
123
204
  transferHiveEngineTokens(from: string, to: string, symbol: string, quantity: string, memo?: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
124
205
  transferHiveEngineTokensMultiple(from: string, accounts: any[], symbol: string, memo?: string, amount?: string): Promise<void>;
125
206
  issueHiveEngineTokens(from: string, to: string, symbol: string, quantity: string, memo?: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
@@ -127,6 +208,13 @@ export declare class Streamer {
127
208
  upvote(votePercentage: string, username: string, permlink: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
128
209
  downvote(votePercentage: string, username: string, permlink: string): Promise<import("@hiveio/dhive").TransactionConfirmation>;
129
210
  getTransaction(blockNumber: number, transactionId: string): Promise<import("@hiveio/dhive").SignedTransaction>;
211
+ getStatus(): {
212
+ lastBlockNumber: number;
213
+ headBlockNumber: number;
214
+ blocksBehind: number;
215
+ latestBlockchainTime: Date;
216
+ isCatchingUp: boolean;
217
+ };
130
218
  verifyTransfer(transaction: any, from: string, to: string, amount: string): Promise<boolean>;
131
219
  onComment(callback: any): void;
132
220
  onPost(callback: any): void;
@@ -134,7 +222,12 @@ export declare class Streamer {
134
222
  onCustomJson(callback: any): void;
135
223
  onCustomJsonId(callback: any, id: string): void;
136
224
  onHiveEngine(callback: any): void;
225
+ onEscrowTransfer(callback: any): void;
226
+ onEscrowApprove(callback: any): void;
227
+ onEscrowDispute(callback: any): void;
228
+ onEscrowRelease(callback: any): void;
137
229
  private cleanupSubscriptions;
138
230
  removeTransferSubscription(account: string): void;
139
231
  removeCustomJsonIdSubscription(id: string): void;
232
+ removeEscrowSubscriptions(type?: EscrowOperationType): void;
140
233
  }