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.
- package/.claude/settings.local.json +12 -0
- package/.env.example +2 -2
- package/.travis.yml +11 -11
- package/AGENTS.md +35 -0
- package/CHANGELOG.md +166 -0
- package/CLAUDE.md +75 -0
- package/DOCUMENTATION.md +380 -0
- package/LICENSE +21 -21
- package/README.md +429 -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 +43 -25
- package/dist/adapters/base.adapter.js +79 -49
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +44 -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 +66 -0
- package/dist/adapters/postgresql.adapter.js +598 -0
- package/dist/adapters/postgresql.adapter.js.map +1 -0
- package/dist/adapters/sqlite.adapter.d.ts +57 -41
- package/dist/adapters/sqlite.adapter.js +561 -397
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.d.ts +6 -6
- package/dist/api.js +181 -55
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +19 -16
- package/dist/config.js +21 -18
- package/dist/config.js.map +1 -1
- package/dist/contracts/coinflip.contract.d.ts +9 -14
- package/dist/contracts/coinflip.contract.js +232 -94
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/contract.d.ts +3 -0
- package/dist/contracts/contract.js +26 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/dice.contract.d.ts +10 -29
- package/dist/contracts/dice.contract.js +217 -155
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/exchange.contract.d.ts +11 -0
- package/dist/contracts/exchange.contract.js +492 -0
- package/dist/contracts/exchange.contract.js.map +1 -0
- package/dist/contracts/lotto.contract.d.ts +16 -20
- package/dist/contracts/lotto.contract.js +238 -246
- package/dist/contracts/lotto.contract.js.map +1 -1
- package/dist/contracts/nft.contract.d.ts +28 -0
- package/dist/contracts/nft.contract.js +598 -0
- package/dist/contracts/nft.contract.js.map +1 -0
- package/dist/contracts/poll.contract.d.ts +4 -0
- package/dist/contracts/poll.contract.js +105 -0
- package/dist/contracts/poll.contract.js.map +1 -0
- package/dist/contracts/rps.contract.d.ts +9 -0
- package/dist/contracts/rps.contract.js +217 -0
- package/dist/contracts/rps.contract.js.map +1 -0
- package/dist/contracts/tipjar.contract.d.ts +4 -0
- package/dist/contracts/tipjar.contract.js +60 -0
- package/dist/contracts/tipjar.contract.js.map +1 -0
- package/dist/contracts/token.contract.d.ts +4 -0
- package/dist/contracts/token.contract.js +311 -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 +11 -0
- package/dist/exchanges/coingecko.js +57 -0
- package/dist/exchanges/coingecko.js.map +1 -0
- package/dist/exchanges/exchange.d.ts +16 -9
- package/dist/exchanges/exchange.js +80 -26
- package/dist/exchanges/exchange.js.map +1 -1
- package/dist/hive-rates.d.ts +34 -9
- package/dist/hive-rates.js +208 -75
- package/dist/hive-rates.js.map +1 -1
- package/dist/index.d.ts +19 -11
- package/dist/index.js +47 -32
- package/dist/index.js.map +1 -1
- package/dist/streamer.d.ts +233 -93
- package/dist/streamer.js +1063 -545
- package/dist/streamer.js.map +1 -1
- package/dist/test.d.ts +1 -1
- package/dist/test.js +24 -25
- package/dist/test.js.map +1 -1
- package/dist/types/hive-stream.d.ts +106 -6
- package/dist/types/hive-stream.js +2 -2
- package/dist/types/rates.d.ts +47 -0
- package/dist/types/rates.js +29 -0
- package/dist/types/rates.js.map +1 -0
- package/dist/utils.d.ts +334 -27
- package/dist/utils.js +960 -261
- package/dist/utils.js.map +1 -1
- package/ecosystem.config.js +17 -17
- package/examples/contracts/README.md +8 -0
- package/examples/contracts/exchange.ts +38 -0
- package/examples/contracts/poll.ts +21 -0
- package/examples/contracts/rps.ts +19 -0
- package/examples/contracts/tipjar.ts +19 -0
- package/jest.config.js +8 -8
- package/package.json +54 -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 +94 -132
- package/tests/contracts/dice.contract.spec.ts +87 -160
- package/tests/contracts/entrants.json +728 -728
- package/tests/contracts/exchange.contract.spec.ts +84 -0
- package/tests/contracts/lotto.contract.spec.ts +59 -324
- package/tests/contracts/nft.contract.spec.ts +948 -0
- package/tests/contracts/token.contract.spec.ts +90 -0
- package/tests/exchanges/coingecko.exchange.spec.ts +169 -0
- package/tests/exchanges/exchange.base.spec.ts +246 -0
- package/tests/helpers/mock-adapter.ts +214 -0
- package/tests/helpers/mock-fetch.ts +165 -0
- package/tests/hive-chain-features.spec.ts +238 -0
- package/tests/hive-rates.spec.ts +443 -0
- package/tests/integration/hive-rates.integration.spec.ts +35 -0
- package/tests/setup.ts +29 -18
- package/tests/streamer-actions.spec.ts +274 -0
- package/tests/streamer.spec.ts +342 -152
- package/tests/types/rates.spec.ts +216 -0
- package/tests/utils.spec.ts +113 -95
- package/tsconfig.build.json +3 -22
- package/tslint.json +20 -20
- 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":";;;;;AAmCA,kDA0XC;AA7ZD,gEAAqC;AACrC,6BAAwB;AACxB,yCAAoD;AAEpD,MAAM,YAAY,GAAG,WAAW,CAAC;AA+BjC,SAAgB,mBAAmB,CAAC,UAAgC,EAAE;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAE1C,MAAM,KAAK,GAAG;QACV,QAAQ,EAAE,IAAW;QACrB,OAAO,EAAE,IAAW;KACvB,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAC5C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QACnC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpD,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;KACxB,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;QAClC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5B,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5B,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;QACrC,IAAI,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;aAWzB,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;aAQzB,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;aAazB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAA8F,EAAE,GAAQ,EAAE,EAAE;QACnI,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,GAAG,EAAE,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;YAEhF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBACpC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC1E,CAAC;YAED,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,sBAAS,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,WAAW,CAAC,KAAK,EAAE,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC7E,CAAC;YAED,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAExG,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,iBAAiB,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;aAGzB,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAE3E,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;gBACnE,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE;oBACF,MAAM;oBACN,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,GAAG,CAAC,MAAM;oBACnB,SAAS;oBACT,SAAS;iBACZ;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAAsE,EAAE,GAAQ,EAAE,EAAE;QAC3G,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;YAElD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAE3F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,iBAAiB,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,SAAS,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,sBAAS,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,IAAI,sBAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACxD,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnD,IAAI,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;aAEzB,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YAErC,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAC7C,qEAAqE,EACrE,CAAC,EAAE,EAAE,MAAM,CAAC,CACf,CAAC;YAEF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC5D,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CACxC,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CACpC,CAAC;YACN,CAAC;YAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;aAGzB,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAEzF,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;gBACnE,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE;oBACF,EAAE;oBACF,MAAM;oBACN,MAAM;iBACT;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,IAAI,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAAE,OAAsE,EAAE,GAAQ,EAAE,EAAE;QAC9G,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;YAElD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAE3F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,iBAAiB,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,sBAAS,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,QAAQ,CAAC,KAAK,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAC3C,qEAAqE,EACrE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB,CAAC;YAEF,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,WAAW,GAAG,CAAC,MAAM,sBAAsB,MAAM,SAAS,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,sBAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,eAAe,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,kBAAkB,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CACtD,CAAC;YAEF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAC7C,qEAAqE,EACrE,CAAC,EAAE,EAAE,MAAM,CAAC,CACf,CAAC;YAEF,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChD,MAAM,iBAAiB,GAAG,IAAI,sBAAS,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACpE,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9D,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,oBAAoB,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAChD,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CACpC,CAAC;YACN,CAAC;YAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;;;aAGzB,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAE7F,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE;gBACtE,MAAM,EAAE,oBAAoB;gBAC5B,IAAI,EAAE;oBACF,IAAI,EAAE,GAAG,CAAC,MAAM;oBAChB,EAAE;oBACF,MAAM;oBACN,MAAM;iBACT;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,IAAI,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YACnE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAA4C,EAAE,GAAQ,EAAE,EAAE;QAChF,IAAI,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAEpC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrC,qEAAqE,EACrE,CAAC,OAAO,EAAE,MAAM,CAAC,CACpB,CAAC;YAEF,MAAM,aAAa,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAE/E,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE;gBAClE,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE;oBACF,OAAO;oBACP,MAAM;oBACN,OAAO,EAAE,aAAa;oBACtB,UAAU,EAAE,GAAG,CAAC,MAAM;iBACzB;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,QAAQ,aAAa,IAAI,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC/D,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAA2B,EAAE,GAAQ,EAAE,EAAE;QACjE,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;YAE3B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAE3F,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,iBAAiB,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;gBACpE,MAAM,EAAE,kBAAkB;gBAC1B,IAAI,EAAE;oBACF,MAAM;oBACN,UAAU,EAAE,GAAG,CAAC,MAAM;oBACtB,UAAU,EAAE,SAAS;iBACxB;aACJ,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,wCAAwC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,IAAA,yBAAc,EAAC;QAClB,IAAI;QACJ,KAAK,EAAE;YACH,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE;gBACpC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBACxB,MAAM,qBAAqB,EAAE,CAAC;YAClC,CAAC;SACJ;QACD,OAAO,EAAE;YACL,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE;gBAC7B,MAAM,EAAE,iBAAiB;gBACzB,OAAO,EAAE,aAAa;aACzB,CAAC;YACF,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE;gBAC7B,MAAM,EAAE,iBAAiB;gBACzB,OAAO,EAAE,aAAa;aACzB,CAAC;YACF,cAAc,EAAE,IAAA,iBAAM,EAAC,cAAc,EAAE;gBACnC,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,aAAa;aACzB,CAAC;YACF,UAAU,EAAE,IAAA,iBAAM,EAAC,UAAU,EAAE;gBAC3B,MAAM,EAAE,gBAAgB;gBACxB,OAAO,EAAE,aAAa;aACzB,CAAC;YACF,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE;gBAC/B,MAAM,EAAE,kBAAkB;gBAC1B,OAAO,EAAE,aAAa;aACzB,CAAC;SACL;KACJ,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
rateUsdHive
|
|
5
|
-
rateUsdHbd
|
|
6
|
-
private lastFetch
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"exchange.js","sourceRoot":"","sources":["../../src/exchanges/exchange.ts"],"names":[],"mappings":"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"}
|