hive-stream 2.0.3 → 2.0.6

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 (99) hide show
  1. package/.env.example +3 -2
  2. package/.travis.yml +11 -11
  3. package/LICENSE +21 -21
  4. package/README.md +238 -236
  5. package/dist/actions.d.ts +10 -9
  6. package/dist/actions.js +23 -15
  7. package/dist/actions.js.map +1 -1
  8. package/dist/adapters/base.adapter.d.ts +25 -21
  9. package/dist/adapters/base.adapter.js +49 -63
  10. package/dist/adapters/base.adapter.js.map +1 -1
  11. package/dist/adapters/mongodb.adapter.d.ts +37 -29
  12. package/dist/adapters/mongodb.adapter.js +158 -113
  13. package/dist/adapters/mongodb.adapter.js.map +1 -1
  14. package/dist/adapters/sqlite.adapter.d.ts +41 -23
  15. package/dist/adapters/sqlite.adapter.js +397 -121
  16. package/dist/adapters/sqlite.adapter.js.map +1 -1
  17. package/dist/api.d.ts +6 -0
  18. package/dist/api.js +56 -0
  19. package/dist/api.js.map +1 -0
  20. package/dist/config.d.ts +16 -14
  21. package/dist/config.js +18 -15
  22. package/dist/config.js.map +1 -1
  23. package/dist/contracts/coinflip.contract.d.ts +14 -0
  24. package/dist/contracts/coinflip.contract.js +95 -0
  25. package/dist/contracts/coinflip.contract.js.map +1 -0
  26. package/dist/contracts/dice.contract.d.ts +29 -29
  27. package/dist/contracts/dice.contract.js +155 -157
  28. package/dist/contracts/dice.contract.js.map +1 -1
  29. package/dist/contracts/lotto.contract.d.ts +20 -16
  30. package/dist/contracts/lotto.contract.js +246 -107
  31. package/dist/contracts/lotto.contract.js.map +1 -1
  32. package/dist/exchanges/bittrex.d.ts +6 -0
  33. package/dist/exchanges/bittrex.js +35 -0
  34. package/dist/exchanges/bittrex.js.map +1 -0
  35. package/dist/exchanges/exchange.d.ts +9 -0
  36. package/dist/exchanges/exchange.js +27 -0
  37. package/dist/exchanges/exchange.js.map +1 -0
  38. package/dist/hive-rates.d.ts +9 -0
  39. package/dist/hive-rates.js +76 -0
  40. package/dist/hive-rates.js.map +1 -0
  41. package/dist/index.d.ts +11 -10
  42. package/dist/index.js +32 -15
  43. package/dist/index.js.map +1 -1
  44. package/dist/streamer.d.ts +93 -70
  45. package/dist/streamer.js +545 -439
  46. package/dist/streamer.js.map +1 -1
  47. package/dist/test.d.ts +1 -1
  48. package/dist/test.js +25 -27
  49. package/dist/test.js.map +1 -1
  50. package/dist/types/hive-stream.d.ts +6 -6
  51. package/dist/types/hive-stream.js +2 -2
  52. package/dist/utils.d.ts +27 -14
  53. package/dist/utils.js +261 -85
  54. package/dist/utils.js.map +1 -1
  55. package/ecosystem.config.js +17 -17
  56. package/jest.config.js +8 -13
  57. package/package.json +48 -44
  58. package/test-contract-block.md +18 -18
  59. package/tests/adapters/sqlite.adapter.spec.ts +43 -0
  60. package/tests/contracts/coinflip.contract.spec.ts +132 -0
  61. package/tests/contracts/dice.contract.spec.ts +159 -156
  62. package/tests/contracts/entrants.json +728 -728
  63. package/tests/contracts/lotto.contract.spec.ts +323 -372
  64. package/tests/setup.ts +18 -20
  65. package/tests/streamer.spec.ts +151 -151
  66. package/tests/utils.spec.ts +94 -99
  67. package/tsconfig.build.json +22 -20
  68. package/tslint.json +20 -20
  69. package/wallaby.js +26 -0
  70. package/.env +0 -1
  71. package/dist/adapters/file.adapter.d.ts +0 -8
  72. package/dist/adapters/file.adapter.js +0 -70
  73. package/dist/adapters/file.adapter.js.map +0 -1
  74. package/dist/test/setup.d.ts +0 -0
  75. package/dist/test/setup.js +0 -9
  76. package/dist/test/setup.js.map +0 -1
  77. package/dist/test/streamer.spec.d.ts +0 -1
  78. package/dist/test/streamer.spec.js +0 -145
  79. package/dist/test/streamer.spec.js.map +0 -1
  80. package/dist/test/utils.spec.d.ts +0 -1
  81. package/dist/test/utils.spec.js +0 -11
  82. package/dist/test/utils.spec.js.map +0 -1
  83. package/dist/tests/contracts/dice.contract.spec.d.ts +0 -1
  84. package/dist/tests/contracts/dice.contract.spec.js +0 -130
  85. package/dist/tests/contracts/dice.contract.spec.js.map +0 -1
  86. package/dist/tests/contracts/entrants.json +0 -729
  87. package/dist/tests/contracts/lotto.contract.spec.d.ts +0 -1
  88. package/dist/tests/contracts/lotto.contract.spec.js +0 -300
  89. package/dist/tests/contracts/lotto.contract.spec.js.map +0 -1
  90. package/dist/tests/setup.d.ts +0 -1
  91. package/dist/tests/setup.js +0 -19
  92. package/dist/tests/setup.js.map +0 -1
  93. package/dist/tests/streamer.spec.d.ts +0 -1
  94. package/dist/tests/streamer.spec.js +0 -123
  95. package/dist/tests/streamer.spec.js.map +0 -1
  96. package/dist/tests/utils.spec.d.ts +0 -1
  97. package/dist/tests/utils.spec.js +0 -87
  98. package/dist/tests/utils.spec.js.map +0 -1
  99. package/hive-stream.json +0 -1
@@ -1,16 +1,20 @@
1
- export declare class LottoContract {
2
- private _instance;
3
- private adapter;
4
- private blockNumber;
5
- private blockId;
6
- private previousBlockId;
7
- private transactionId;
8
- private create;
9
- private destroy;
10
- private updateBlockInfo;
11
- private getBalance;
12
- buy(payload: any, { sender, amount }: {
13
- sender: any;
14
- amount: any;
15
- }): Promise<void>;
16
- }
1
+ export declare class LottoContract {
2
+ private _instance;
3
+ private adapter;
4
+ private blockNumber;
5
+ private blockId;
6
+ private previousBlockId;
7
+ private transactionId;
8
+ create(): Promise<void>;
9
+ destroy(): void;
10
+ updateBlockInfo(blockNumber: any, blockId: any, previousBlockId: any, transactionId: any): void;
11
+ getBalance(): Promise<number>;
12
+ getPreviousUserTicketsForCurrentDrawType(type: string, account: string): Promise<number>;
13
+ buy(payload: any, { sender, amount }: {
14
+ sender: any;
15
+ amount: any;
16
+ }): Promise<any>;
17
+ drawHourlyLottery(): Promise<any[]>;
18
+ drawDailyLottery(): Promise<any[]>;
19
+ getWinners(count: number, entries: any[]): Promise<any[]>;
20
+ }
@@ -1,108 +1,247 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- const utils_1 = require("@hivechain/dhive/lib/utils");
16
- const seedrandom_1 = __importDefault(require("seedrandom"));
17
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
18
- const CONTRACT_NAME = 'hivelotto';
19
- const ACCOUNT = 'beggars';
20
- const TOKEN_SYMBOL = 'HIVE';
21
- const VALID_CURRENCIES = ['HIVE'];
22
- const COST = 10;
23
- const MAX_ENTRIES = 50;
24
- const PERCENTAGE_FEE = 25; // 5% of 500 total = 25 HIVE
25
- const COLLECTION_LOTTERY = 'lottery';
26
- const COLLECTION_WINNERS = 'winners';
27
- function rng(previousBlockId, blockId, transactionId, maximum = 100) {
28
- const random = seedrandom_1.default(`${previousBlockId}${blockId}${transactionId}`).double();
29
- const randomRoll = Math.floor(random * maximum) + 1;
30
- return randomRoll;
31
- }
32
- class LottoContract {
33
- create() {
34
- this.adapter = this._instance.getAdapter();
35
- }
36
- destroy() {
37
- // Runs every time unregister is run for this contract
38
- // Close database connections, write to a database with state, etc
39
- }
40
- updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
41
- // Lifecycle method which sets block info
42
- this.blockNumber = blockNumber;
43
- this.blockId = blockId;
44
- this.previousBlockId = previousBlockId;
45
- this.transactionId = transactionId;
46
- }
47
- getBalance() {
48
- return __awaiter(this, void 0, void 0, function* () {
49
- const account = yield this._instance['client'].database.getAccounts([ACCOUNT]);
50
- if (account === null || account === void 0 ? void 0 : account[0]) {
51
- const balance = account[0].balance.split(' ');
52
- const amount = balance[0];
53
- return parseFloat(amount);
54
- }
55
- return null;
56
- });
57
- }
58
- buy(payload, { sender, amount }) {
59
- return __awaiter(this, void 0, void 0, function* () {
60
- const amountTrim = amount.split(' ');
61
- const amountParsed = parseFloat(amountTrim[0]);
62
- const amountFormatted = parseFloat(amountTrim[0]).toFixed(3);
63
- const amountCurrency = amountTrim[1].trim();
64
- const transaction = yield this._instance.getTransaction(this.blockNumber, this.transactionId);
65
- const verify = yield this._instance.verifyTransfer(transaction, sender, ACCOUNT, amount);
66
- const balance = yield this.getBalance();
67
- if (verify) {
68
- // User sent an invalid currency
69
- if (!VALID_CURRENCIES.includes(amountFormatted)) {
70
- yield this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You sent an invalid currency.`);
71
- }
72
- // User sent too much
73
- if (amountParsed > COST) {
74
- yield this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] A ticket costs ${COST} HIVE. You sent ${amount}`);
75
- return;
76
- }
77
- // Get database reference from adapter
78
- const db = this.adapter['db'];
79
- const collection = db.collection(COLLECTION_LOTTERY);
80
- const lotto = yield collection.find().sort({ '_id': -1 }).limit(1).toArray();
81
- // We have a lotto
82
- if (lotto.length) {
83
- const total = lotto.entries.length + 1;
84
- const balance = yield this.getBalance();
85
- const payout = new bignumber_js_1.default(balance).minus(PERCENTAGE_FEE).toPrecision(3);
86
- // Total number of entries including this one hits the limit
87
- // Lets pay out the lottery
88
- if (total === MAX_ENTRIES) {
89
- collection;
90
- const entrant1 = lotto.entries[rng(this.previousBlockId, this.blockId, this.transactionId, total)];
91
- yield utils_1.sleep(3000);
92
- const entrant2 = lotto.entries[rng(this.previousBlockId, this.blockId, this.transactionId, total)];
93
- yield utils_1.sleep(3000);
94
- const entrant3 = lotto.entries[rng(this.previousBlockId, this.blockId, this.transactionId, total)];
95
- yield utils_1.sleep(3000);
96
- const entrant4 = lotto.entries[rng(this.previousBlockId, this.blockId, this.transactionId, total)];
97
- yield utils_1.sleep(3000);
98
- const entrant5 = lotto.entries[rng(this.previousBlockId, this.blockId, this.transactionId, total)];
99
- }
100
- else {
101
- }
102
- }
103
- }
104
- });
105
- }
106
- }
107
- exports.LottoContract = LottoContract;
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.LottoContract = void 0;
7
+ const utils_1 = require("@hiveio/dhive/lib/utils");
8
+ const utils_2 = require("./../utils");
9
+ const seedrandom_1 = __importDefault(require("seedrandom"));
10
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
11
+ const CONTRACT_NAME = 'hivelotto';
12
+ const ACCOUNT = 'beggars';
13
+ const FEE_ACCOUNT = 'beggars';
14
+ const TOKEN_SYMBOL = 'HIVE';
15
+ const VALID_CURRENCIES = ['HIVE'];
16
+ const VALID_DRAW_TYPES = ['hourly', 'daily'];
17
+ // How much does a ticket cost?
18
+ const COST = 10;
19
+ // Minimum number of entries required for draws to payout
20
+ const MIN_ENTRIES_HOURLY = 25;
21
+ const MIN_ENTRIES_DAILY = 100;
22
+ // How many winners to pick for the hourly draw
23
+ const HOURLY_WINNERS_PICK = 3;
24
+ // How many winners to pick for the daily draw
25
+ const DAILY_WINNERS_PICK = 10;
26
+ // Max tickets per user, prevents users from harvesting by overwhelmingly buying tickets
27
+ const MAX_TICKETS_PER_USER = 3;
28
+ // The percentage the site keeps (5%)
29
+ const PERCENTAGE = 5;
30
+ const COLLECTION_LOTTERY = 'lottery';
31
+ const COLLECTION_SETTINGS = 'settings';
32
+ const COLLECTION_WINNERS = 'winners';
33
+ function rng(previousBlockId, blockId, transactionId, entropy, maximum = 100) {
34
+ const random = (0, seedrandom_1.default)(`${previousBlockId}${blockId}${transactionId}${entropy}`).double();
35
+ const randomRoll = Math.floor(random * maximum) + 1;
36
+ return randomRoll;
37
+ }
38
+ class LottoContract {
39
+ // tslint:disable-next-line: variable-name
40
+ _instance;
41
+ adapter;
42
+ blockNumber;
43
+ blockId;
44
+ previousBlockId;
45
+ transactionId;
46
+ async create() {
47
+ this.adapter = this._instance.getAdapter();
48
+ const settings = await this.adapter.findOne(COLLECTION_SETTINGS, {});
49
+ if (!settings) {
50
+ this.adapter.insert(COLLECTION_SETTINGS, {
51
+ contractInitiated: new Date(),
52
+ enabled: true
53
+ });
54
+ }
55
+ }
56
+ destroy() {
57
+ // Runs every time unregister is run for this contract
58
+ // Close database connections, write to a database with state, etc
59
+ }
60
+ updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
61
+ // Lifecycle method which sets block info
62
+ this.blockNumber = blockNumber;
63
+ this.blockId = blockId;
64
+ this.previousBlockId = previousBlockId;
65
+ this.transactionId = transactionId;
66
+ }
67
+ async getBalance() {
68
+ const account = await this._instance['client'].database.getAccounts([ACCOUNT]);
69
+ if (account?.[0]) {
70
+ const balance = account[0].balance.split(' ');
71
+ const amount = balance[0];
72
+ return parseFloat(amount);
73
+ }
74
+ return null;
75
+ }
76
+ async getPreviousUserTicketsForCurrentDrawType(type, account) {
77
+ const lotto = await this.adapter.find(COLLECTION_LOTTERY, { status: 'active', type: type });
78
+ if (!lotto[0] || !lotto[0].entries) {
79
+ return 0;
80
+ }
81
+ const userEntries = lotto[0].entries.filter(e => e.account === account);
82
+ return userEntries.length;
83
+ }
84
+ async buy(payload, { sender, amount }) {
85
+ const { type } = payload;
86
+ const amountTrim = amount.split(' ');
87
+ const amountParsed = parseFloat(amountTrim[0]);
88
+ const amountCurrency = amountTrim[1].trim();
89
+ const transaction = await this._instance.getTransaction(this.blockNumber, this.transactionId);
90
+ const verify = await this._instance.verifyTransfer(transaction, sender, ACCOUNT, amount);
91
+ if (verify) {
92
+ // User sent an invalid currency
93
+ if (!VALID_CURRENCIES.includes(amountCurrency)) {
94
+ await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You sent an invalid currency.`);
95
+ return;
96
+ }
97
+ // User did not specify a valid entry type, refund them
98
+ if (!VALID_DRAW_TYPES.includes(type)) {
99
+ await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You specified an invalid draw type`);
100
+ return;
101
+ }
102
+ // If the user has already entered the maximum allowed times, refund them
103
+ const previousEntriesCount = await this.getPreviousUserTicketsForCurrentDrawType(type, sender);
104
+ if (previousEntriesCount === MAX_TICKETS_PER_USER) {
105
+ await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You have exceeded the allowed number of entries`);
106
+ return;
107
+ }
108
+ // User sent too much, refund the difference
109
+ if (amountParsed > COST) {
110
+ const difference = new bignumber_js_1.default(amountParsed).minus(COST).toFixed(3);
111
+ await this._instance.transferHiveTokens(ACCOUNT, sender, difference, amountTrim[1], `[Refund] A ticket costs ${COST} HIVE. You sent ${amount}. You were refunded ${difference} HIVE.`);
112
+ return;
113
+ }
114
+ // Find an active lotto draw that is of status "active" and our type
115
+ const lotto = await this.adapter.find(COLLECTION_LOTTERY, { status: 'active', type: type });
116
+ // We have a lotto
117
+ if (lotto.length) {
118
+ const draw = lotto[0];
119
+ draw.entries.push({
120
+ account: sender,
121
+ transactionId: this.transactionId,
122
+ date: new Date()
123
+ });
124
+ return await this.adapter.replace(COLLECTION_LOTTERY, { _id: draw._id }, draw);
125
+ }
126
+ // We need to create a new lotto, no active draws for this type
127
+ const entries = [{
128
+ account: sender,
129
+ transactionId: this.transactionId,
130
+ date: new Date()
131
+ }];
132
+ return await this.adapter.insert(COLLECTION_LOTTERY, { status: 'active', type: type, entries });
133
+ }
134
+ }
135
+ async drawHourlyLottery() {
136
+ const lotto = await this.adapter.find(COLLECTION_LOTTERY, { status: 'active', type: 'hourly' });
137
+ // We found an hourly draw
138
+ if (lotto.length) {
139
+ const draw = lotto[0];
140
+ const total = draw.entries.length;
141
+ // Number of entrants is less than the minimum
142
+ if (total < MIN_ENTRIES_HOURLY) {
143
+ const entrants = draw.entries.reduce((arr, entrant) => {
144
+ arr.push(entrant.account);
145
+ return arr;
146
+ }, []);
147
+ await this._instance.transferHiveTokensMultiple(ACCOUNT, entrants, '10.000', 'HIVE', '[Refund] The hourly lotto draw did not have enough contestants.');
148
+ return;
149
+ }
150
+ const balance = await this.getBalance();
151
+ // Number of entrants multiplied by the entry cost is the total for this draw
152
+ const winningsAmount = new bignumber_js_1.default(total).multipliedBy(COST).toNumber();
153
+ // Calculate how much the account gets to keep
154
+ const percentageFee = new bignumber_js_1.default(winningsAmount).dividedBy(100).multipliedBy(PERCENTAGE);
155
+ // The amount minus the percentage to pay out to winners
156
+ const payoutTotal = new bignumber_js_1.default(winningsAmount).minus(percentageFee);
157
+ // Amount each winner gets
158
+ const amountPerWinner = new bignumber_js_1.default(payoutTotal).dividedBy(HOURLY_WINNERS_PICK).toFixed(3);
159
+ // Send fee percentage to fee account
160
+ if (ACCOUNT !== FEE_ACCOUNT) {
161
+ await this._instance.transferHiveTokens(ACCOUNT, FEE_ACCOUNT, percentageFee.toFixed(3), 'HIVE', 'percentage fee');
162
+ }
163
+ // Winnings exceed balance
164
+ if (payoutTotal.toNumber() > balance) {
165
+ throw new Error('Balance is less than amount to pay out');
166
+ }
167
+ const winners = await this.getWinners(HOURLY_WINNERS_PICK, draw.entries);
168
+ if (winners) {
169
+ const winnerStrings = winners.reduce((arr, winner) => {
170
+ arr.push(winner.account);
171
+ return arr;
172
+ }, []);
173
+ await this._instance.transferHiveTokensMultiple(ACCOUNT, winnerStrings, amountPerWinner, TOKEN_SYMBOL, `Congratulations you won the hourly lottery. You won ${amountPerWinner} ${TOKEN_SYMBOL}. Winners: ${winnerStrings.join(', ')}`);
174
+ const losers = draw.entries
175
+ .filter(e => {
176
+ return !winnerStrings.includes(e.account);
177
+ })
178
+ .reduce((unique, value) => {
179
+ return unique.includes(value.account) ? unique : [...unique, value.account];
180
+ }, []);
181
+ if (losers) {
182
+ await this._instance.transferHiveTokensMultiple(ACCOUNT, losers, '0.001', TOKEN_SYMBOL, `Sorry, you didn't win the hourly draw. Winners: ${winnerStrings.join(', ')}`);
183
+ }
184
+ }
185
+ return winners;
186
+ }
187
+ }
188
+ async drawDailyLottery() {
189
+ const lotto = await this.adapter.find(COLLECTION_LOTTERY, { status: 'active', type: 'daily' });
190
+ // We found an hourly draw
191
+ if (lotto.length) {
192
+ const draw = lotto[0];
193
+ const total = draw.entries.length;
194
+ // Number of entrants is less than the minimum
195
+ if (total < MIN_ENTRIES_DAILY) {
196
+ for (const entrant of draw.entries) {
197
+ await this._instance.transferHiveTokens(ACCOUNT, entrant.account, '10.000', 'HIVE', '[Refund] The hourly lotto draw did not have enough contestants.');
198
+ await utils_2.Utils.sleep(3000);
199
+ }
200
+ return;
201
+ }
202
+ const balance = await this.getBalance();
203
+ // Number of entrants multiplied by the entry cost is the total for this draw
204
+ const winningsAmount = new bignumber_js_1.default(total).multipliedBy(COST).toNumber();
205
+ // Calculate how much the account gets to keep
206
+ const percentageFee = new bignumber_js_1.default(winningsAmount).dividedBy(100).multipliedBy(PERCENTAGE);
207
+ // The amount minus the percentage to pay out to winners
208
+ const payoutTotal = new bignumber_js_1.default(winningsAmount).minus(percentageFee);
209
+ // Amount each winner gets
210
+ const amountPerWinner = new bignumber_js_1.default(payoutTotal).dividedBy(DAILY_WINNERS_PICK).toFixed(3);
211
+ // Send fee percentage to fee account
212
+ if (ACCOUNT !== FEE_ACCOUNT) {
213
+ await this._instance.transferHiveTokens(ACCOUNT, FEE_ACCOUNT, percentageFee.toFixed(3), 'HIVE', 'percentage fee');
214
+ }
215
+ // Winnings exceed balance
216
+ if (payoutTotal.toNumber() > balance) {
217
+ throw new Error('Balance is less than amount to pay out');
218
+ }
219
+ const winners = await this.getWinners(DAILY_WINNERS_PICK, draw.entries);
220
+ if (winners) {
221
+ const winnerStrings = winners.reduce((arr, winner) => {
222
+ arr.push(winner.account);
223
+ return arr;
224
+ }, []);
225
+ await this._instance.transferHiveTokensMultiple(ACCOUNT, winnerStrings, amountPerWinner, TOKEN_SYMBOL, `Congratulations you won the daily lottery. You won ${amountPerWinner} ${TOKEN_SYMBOL}`);
226
+ }
227
+ return winners;
228
+ }
229
+ }
230
+ async getWinners(count, entries) {
231
+ let winners = [];
232
+ utils_2.Utils.shuffle(entries);
233
+ for (const entry of entries) {
234
+ if (winners.length < count) {
235
+ const winner = entries[rng(this.previousBlockId + `${(0, seedrandom_1.default)().double()}`, this.blockId + `${(0, seedrandom_1.default)().double()}`, this.transactionId + `${(0, seedrandom_1.default)().double()}`, (0, seedrandom_1.default)().double(), entries.length - 1)];
236
+ winners.push(winner);
237
+ await (0, utils_1.sleep)(300);
238
+ }
239
+ else {
240
+ break;
241
+ }
242
+ }
243
+ return winners;
244
+ }
245
+ }
246
+ exports.LottoContract = LottoContract;
108
247
  //# sourceMappingURL=lotto.contract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lotto.contract.js","sourceRoot":"","sources":["../../src/contracts/lotto.contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lotto.contract.js","sourceRoot":"","sources":["../../src/contracts/lotto.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +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
+ }
@@ -0,0 +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;
35
+ //# sourceMappingURL=bittrex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bittrex.js","sourceRoot":"","sources":["../../src/exchanges/bittrex.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAsC;AAEtC,gEAAqC;AAErC,MAAa,eAAgB,SAAQ,mBAAQ;IAClC,UAAU,GAAG,SAAS,CAAC;IAEvB,KAAK,CAAC,UAAU;QACnB,MAAM,OAAO,GAAG,IAAI,sBAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,sBAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,sBAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAElE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE;YACtF,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEzD,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAE1B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,EAAU;QAC5C,MAAM,QAAQ,GAAG,sCAAsC,IAAI,IAAI,EAAE,SAAS,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEtC,IAAI,QAAQ,EAAE;YACV,OAAO,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;SACjC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAhCD,0CAgCC"}
@@ -0,0 +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
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Exchange = void 0;
4
+ class Exchange {
5
+ exchangeId;
6
+ oneHour = 1000 * 60 * 60;
7
+ rateUsdHive;
8
+ rateUsdHbd;
9
+ lastFetch;
10
+ async updateRates() {
11
+ const HOUR_AGO = Date.now() - this.oneHour;
12
+ // Only fetch once per hour
13
+ if (this.lastFetch && this.lastFetch < HOUR_AGO) {
14
+ return false;
15
+ }
16
+ const rates = await this.fetchRates();
17
+ if (rates) {
18
+ this.lastFetch = Date.now();
19
+ }
20
+ return rates;
21
+ }
22
+ async fetchRates() {
23
+ return null;
24
+ }
25
+ }
26
+ exports.Exchange = Exchange;
27
+ //# sourceMappingURL=exchange.js.map
@@ -0,0 +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"}
@@ -0,0 +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
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HiveRates = void 0;
4
+ const bittrex_1 = require("./exchanges/bittrex");
5
+ class HiveRates {
6
+ fiatRates = [];
7
+ hiveRates = [];
8
+ lastFetch;
9
+ oneHour = 1000 * 60 * 60;
10
+ 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 bittrex_1.BittrexExchange()];
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
+ }
31
+ }
32
+ }
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;
42
+ }
43
+ for (const [symbol, value] of Object.entries(this.fiatRates)) {
44
+ this.hiveRates[`USD_${symbol}`] = value;
45
+ this.hiveRates[`${symbol}_HIVE`] = hiveAverage * value;
46
+ this.hiveRates[`${symbol}_HBD`] = hbdAverage * value;
47
+ }
48
+ return true;
49
+ }
50
+ fiatToHiveRate(fiatSymbol, hiveSymbol) {
51
+ if (!this.hiveRates) {
52
+ return null;
53
+ }
54
+ if (!this.hiveRates[`${fiatSymbol}_${hiveSymbol}`]) {
55
+ return null;
56
+ }
57
+ return this.hiveRates[`${fiatSymbol}_${hiveSymbol}`];
58
+ }
59
+ async getFiatRates(base = 'USD') {
60
+ const HOUR_AGO = Date.now() - this.oneHour;
61
+ if (this.lastFetch && this.lastFetch < HOUR_AGO) {
62
+ return false;
63
+ }
64
+ const request = await fetch(`https://api.exchangeratesapi.io/latest?base=${base}`);
65
+ const response = await request.json();
66
+ const exchangeRates = response?.rates;
67
+ if (!exchangeRates) {
68
+ return false;
69
+ }
70
+ this.fiatRates = exchangeRates;
71
+ this.lastFetch = Date.now();
72
+ return true;
73
+ }
74
+ }
75
+ exports.HiveRates = HiveRates;
76
+ //# sourceMappingURL=hive-rates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hive-rates.js","sourceRoot":"","sources":["../src/hive-rates.ts"],"names":[],"mappings":"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"}