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.
- package/.claude/settings.local.json +12 -0
- package/.env.example +2 -2
- package/.travis.yml +11 -11
- package/CHANGELOG.md +166 -0
- package/CLAUDE.md +75 -0
- package/LICENSE +21 -21
- package/README.md +338 -238
- package/dist/actions.d.ts +41 -10
- package/dist/actions.js +126 -23
- package/dist/actions.js.map +1 -1
- package/dist/adapters/base.adapter.d.ts +25 -25
- package/dist/adapters/base.adapter.js +63 -49
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +50 -37
- package/dist/adapters/mongodb.adapter.js +363 -158
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +49 -0
- package/dist/adapters/postgresql.adapter.js +507 -0
- package/dist/adapters/postgresql.adapter.js.map +1 -0
- package/dist/adapters/sqlite.adapter.d.ts +40 -41
- package/dist/adapters/sqlite.adapter.js +470 -397
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.d.ts +6 -6
- package/dist/api.js +95 -55
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +16 -16
- package/dist/config.js +18 -18
- package/dist/config.js.map +1 -1
- package/dist/contracts/coinflip.contract.d.ts +27 -14
- package/dist/contracts/coinflip.contract.js +253 -94
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/dice.contract.d.ts +37 -29
- package/dist/contracts/dice.contract.js +282 -155
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/lotto.contract.d.ts +20 -20
- package/dist/contracts/lotto.contract.js +246 -246
- package/dist/contracts/nft.contract.d.ts +24 -0
- package/dist/contracts/nft.contract.js +533 -0
- package/dist/contracts/nft.contract.js.map +1 -0
- package/dist/contracts/token.contract.d.ts +18 -0
- package/dist/contracts/token.contract.js +263 -0
- package/dist/contracts/token.contract.js.map +1 -0
- package/dist/exchanges/bittrex.d.ts +6 -6
- package/dist/exchanges/bittrex.js +34 -34
- package/dist/exchanges/coingecko.d.ts +5 -0
- package/dist/exchanges/coingecko.js +40 -0
- package/dist/exchanges/coingecko.js.map +1 -0
- package/dist/exchanges/exchange.d.ts +9 -9
- package/dist/exchanges/exchange.js +26 -26
- package/dist/hive-rates.d.ts +9 -9
- package/dist/hive-rates.js +121 -75
- package/dist/hive-rates.js.map +1 -1
- package/dist/index.d.ts +12 -11
- package/dist/index.js +33 -32
- package/dist/index.js.map +1 -1
- package/dist/streamer.d.ts +140 -93
- package/dist/streamer.js +793 -545
- package/dist/streamer.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.js +25 -25
- package/dist/test.js.map +1 -1
- package/dist/types/hive-stream.d.ts +35 -6
- package/dist/types/hive-stream.js +2 -2
- package/dist/utils.d.ts +27 -27
- package/dist/utils.js +271 -261
- package/dist/utils.js.map +1 -1
- package/ecosystem.config.js +17 -17
- package/jest.config.js +8 -8
- package/package.json +53 -48
- package/test-contract-block.md +18 -18
- package/tests/actions.spec.ts +252 -0
- package/tests/adapters/actions-persistence.spec.ts +144 -0
- package/tests/adapters/postgresql.adapter.spec.ts +127 -0
- package/tests/adapters/sqlite.adapter.spec.ts +180 -42
- package/tests/contracts/coinflip.contract.spec.ts +221 -131
- package/tests/contracts/dice.contract.spec.ts +202 -159
- package/tests/contracts/entrants.json +728 -728
- package/tests/contracts/lotto.contract.spec.ts +323 -323
- package/tests/contracts/nft.contract.spec.ts +948 -0
- package/tests/contracts/token.contract.spec.ts +334 -0
- package/tests/helpers/mock-adapter.ts +214 -0
- package/tests/setup.ts +29 -18
- package/tests/streamer-actions.spec.ts +263 -0
- package/tests/streamer.spec.ts +248 -151
- package/tests/utils.spec.ts +91 -94
- package/tsconfig.build.json +3 -22
- package/tslint.json +20 -20
- package/wallaby.js +26 -26
- 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,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
|
|
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
|
package/dist/hive-rates.d.ts
CHANGED
|
@@ -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
|
+
}
|