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
|
@@ -1,156 +1,283 @@
|
|
|
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.DiceContract = void 0;
|
|
7
|
-
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
8
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
-
const CONTRACT_NAME = 'hivedice';
|
|
10
|
-
const ACCOUNT = 'beggars';
|
|
11
|
-
const TOKEN_SYMBOL = 'HIVE';
|
|
12
|
-
const HOUSE_EDGE = 0.05;
|
|
13
|
-
const MIN_BET = 1;
|
|
14
|
-
const MAX_BET = 10;
|
|
15
|
-
// Random Number Generator
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* @
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
if
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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.DiceContract = void 0;
|
|
7
|
+
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
8
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
+
const CONTRACT_NAME = 'hivedice';
|
|
10
|
+
const ACCOUNT = 'beggars';
|
|
11
|
+
const TOKEN_SYMBOL = 'HIVE';
|
|
12
|
+
const HOUSE_EDGE = 0.05;
|
|
13
|
+
const MIN_BET = 1;
|
|
14
|
+
const MAX_BET = 10;
|
|
15
|
+
// Provably Fair Random Number Generator
|
|
16
|
+
// Uses deterministic blockchain data to ensure results are verifiable by users
|
|
17
|
+
// This is the correct approach for transparent, auditable gambling systems
|
|
18
|
+
const rng = (previousBlockId, blockId, transactionId) => {
|
|
19
|
+
// Validate inputs to prevent manipulation
|
|
20
|
+
if (!previousBlockId || !blockId || !transactionId) {
|
|
21
|
+
throw new Error('Invalid RNG parameters');
|
|
22
|
+
}
|
|
23
|
+
const random = (0, seedrandom_1.default)(`${previousBlockId}${blockId}${transactionId}`).double();
|
|
24
|
+
const randomRoll = Math.floor(random * 100) + 1;
|
|
25
|
+
// Ensure result is within expected range
|
|
26
|
+
if (randomRoll < 1 || randomRoll > 100) {
|
|
27
|
+
throw new Error('RNG generated invalid result');
|
|
28
|
+
}
|
|
29
|
+
return randomRoll;
|
|
30
|
+
};
|
|
31
|
+
// Valid betting currencies
|
|
32
|
+
const VALID_CURRENCIES = ['HIVE'];
|
|
33
|
+
class DiceContract {
|
|
34
|
+
_instance;
|
|
35
|
+
blockNumber;
|
|
36
|
+
blockId;
|
|
37
|
+
previousBlockId;
|
|
38
|
+
transactionId;
|
|
39
|
+
// Cache for account balance to reduce API calls
|
|
40
|
+
balanceCache = null;
|
|
41
|
+
balanceCacheTimeout = 30000; // 30 seconds
|
|
42
|
+
// Queue system for processing bets to prevent race conditions
|
|
43
|
+
betQueue = [];
|
|
44
|
+
processingQueue = false;
|
|
45
|
+
pendingPayouts = new bignumber_js_1.default(0);
|
|
46
|
+
create() {
|
|
47
|
+
// Runs every time register is called on this contract
|
|
48
|
+
// Do setup logic and code in here (creating a database, etc)
|
|
49
|
+
}
|
|
50
|
+
destroy() {
|
|
51
|
+
// Runs every time unregister is run for this contract
|
|
52
|
+
// Close database connections, write to a database with state, etc
|
|
53
|
+
}
|
|
54
|
+
// Updates the contract with information about the current block
|
|
55
|
+
// This is a method automatically called if it exists
|
|
56
|
+
updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
|
|
57
|
+
// Lifecycle method which sets block info
|
|
58
|
+
this.blockNumber = blockNumber;
|
|
59
|
+
this.blockId = blockId;
|
|
60
|
+
this.previousBlockId = previousBlockId;
|
|
61
|
+
this.transactionId = transactionId;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get Balance
|
|
65
|
+
*
|
|
66
|
+
* Helper method for getting the contract account balance with caching
|
|
67
|
+
* We cache the balance to reduce API calls since it doesn't change frequently
|
|
68
|
+
*
|
|
69
|
+
* @returns number
|
|
70
|
+
*/
|
|
71
|
+
async getBalance() {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
// Return cached balance if still valid
|
|
74
|
+
if (this.balanceCache && (now - this.balanceCache.timestamp) < this.balanceCacheTimeout) {
|
|
75
|
+
return this.balanceCache.balance;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
const account = await this._instance['client'].database.getAccounts([ACCOUNT]);
|
|
79
|
+
if (account?.[0]) {
|
|
80
|
+
const balance = account[0].balance.split(' ');
|
|
81
|
+
const amount = new bignumber_js_1.default(balance[0]);
|
|
82
|
+
// Validate the amount is a valid number
|
|
83
|
+
if (amount.isNaN() || !amount.isFinite()) {
|
|
84
|
+
throw new Error('Invalid balance format received from API');
|
|
85
|
+
}
|
|
86
|
+
// Cache the balance
|
|
87
|
+
this.balanceCache = {
|
|
88
|
+
balance: amount,
|
|
89
|
+
timestamp: now
|
|
90
|
+
};
|
|
91
|
+
return amount;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('[DiceContainer] Error fetching balance:', error);
|
|
96
|
+
// Return cached balance if available, even if expired
|
|
97
|
+
if (this.balanceCache) {
|
|
98
|
+
return this.balanceCache.balance;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return new bignumber_js_1.default(0);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Roll
|
|
105
|
+
*
|
|
106
|
+
* Automatically called when a custom JSON action matches the following method
|
|
107
|
+
*
|
|
108
|
+
* @param payload
|
|
109
|
+
* @param param1 - sender and amount
|
|
110
|
+
*/
|
|
111
|
+
async roll(payload, { sender, amount }) {
|
|
112
|
+
// Add bet to queue for processing
|
|
113
|
+
return new Promise((resolve, reject) => {
|
|
114
|
+
this.betQueue.push(async () => {
|
|
115
|
+
try {
|
|
116
|
+
await this.processRoll(payload, { sender, amount });
|
|
117
|
+
resolve();
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
reject(error);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// Start processing queue if not already running
|
|
124
|
+
this.processQueue();
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
async processQueue() {
|
|
128
|
+
if (this.processingQueue || this.betQueue.length === 0) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.processingQueue = true;
|
|
132
|
+
while (this.betQueue.length > 0) {
|
|
133
|
+
const nextBet = this.betQueue.shift();
|
|
134
|
+
if (nextBet) {
|
|
135
|
+
try {
|
|
136
|
+
await nextBet();
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error('[DiceContract] Queue processing error:', error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
this.processingQueue = false;
|
|
144
|
+
}
|
|
145
|
+
async processRoll(payload, { sender, amount }) {
|
|
146
|
+
try {
|
|
147
|
+
// Validate payload structure
|
|
148
|
+
if (!payload || typeof payload.roll !== 'number') {
|
|
149
|
+
throw new Error('Invalid payload structure');
|
|
150
|
+
}
|
|
151
|
+
// Destructure the values from the payload
|
|
152
|
+
const { roll } = payload;
|
|
153
|
+
// Validate amount format
|
|
154
|
+
if (!amount || typeof amount !== 'string' || !amount.includes(' ')) {
|
|
155
|
+
throw new Error('Invalid amount format');
|
|
156
|
+
}
|
|
157
|
+
// The amount is formatted like 100 HIVE
|
|
158
|
+
// The value is the first part, the currency symbol is the second
|
|
159
|
+
const amountTrim = amount.split(' ');
|
|
160
|
+
if (amountTrim.length !== 2) {
|
|
161
|
+
throw new Error('Invalid amount format');
|
|
162
|
+
}
|
|
163
|
+
// Parse the numeric value using BigNumber for precision
|
|
164
|
+
const amountParsed = new bignumber_js_1.default(amountTrim[0]);
|
|
165
|
+
// Validate the parsed amount
|
|
166
|
+
if (amountParsed.isNaN() || !amountParsed.isFinite() || amountParsed.isNegative()) {
|
|
167
|
+
throw new Error('Invalid amount value');
|
|
168
|
+
}
|
|
169
|
+
// Format the amount to 3 decimal places
|
|
170
|
+
const amountFormatted = amountParsed.toFixed(3);
|
|
171
|
+
// Trim any space from the currency symbol
|
|
172
|
+
const amountCurrency = amountTrim[1].trim();
|
|
173
|
+
// console.log(`Roll: ${roll}
|
|
174
|
+
// Amount parsed: ${amountParsed}
|
|
175
|
+
// Amount formatted: ${amountFormatted}
|
|
176
|
+
// Currency: ${amountCurrency}`);
|
|
177
|
+
// Get the transaction from the blockchain
|
|
178
|
+
const transaction = await this._instance.getTransaction(this.blockNumber, this.transactionId);
|
|
179
|
+
// Call the verifyTransfer method to confirm the transfer happened
|
|
180
|
+
const verify = await this._instance.verifyTransfer(transaction, sender, 'beggars', amount);
|
|
181
|
+
// Get the balance of our contract account
|
|
182
|
+
const balance = await this.getBalance();
|
|
183
|
+
// Calculate available balance (total - pending payouts)
|
|
184
|
+
const availableBalance = balance.minus(this.pendingPayouts);
|
|
185
|
+
// Transfer is valid
|
|
186
|
+
if (verify) {
|
|
187
|
+
// Server balance is less than the minimum required, cancel and refund
|
|
188
|
+
if (availableBalance.isLessThan(new bignumber_js_1.default(MIN_BET * 2))) {
|
|
189
|
+
// Send back what was sent, the server is broke
|
|
190
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] The server could not fulfill your bet.`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Bet amount is valid
|
|
194
|
+
if (amountParsed.isGreaterThanOrEqualTo(MIN_BET) && amountParsed.isLessThanOrEqualTo(MAX_BET)) {
|
|
195
|
+
// Validate roll is valid (integer between 2-96)
|
|
196
|
+
if (Number.isInteger(roll) && roll >= 2 && roll <= 96 && VALID_CURRENCIES.includes(amountCurrency)) {
|
|
197
|
+
// Calculate the multiplier percentage
|
|
198
|
+
const multiplier = new bignumber_js_1.default(1).minus(HOUSE_EDGE).multipliedBy(100).dividedBy(roll);
|
|
199
|
+
// Calculate the number of tokens won
|
|
200
|
+
const tokensWonBN = amountParsed.multipliedBy(multiplier);
|
|
201
|
+
const tokensWon = tokensWonBN.toFixed(3, bignumber_js_1.default.ROUND_DOWN);
|
|
202
|
+
// User won more than the server can afford, refund the bet amount
|
|
203
|
+
if (tokensWonBN.isGreaterThan(availableBalance)) {
|
|
204
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] The server could not fulfill your bet.`);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Reserve the potential payout
|
|
208
|
+
this.pendingPayouts = this.pendingPayouts.plus(tokensWonBN);
|
|
209
|
+
// Generate cryptographically secure random number
|
|
210
|
+
// Note: This is still deterministic based on blockchain data
|
|
211
|
+
// In production, consider using a commit-reveal scheme
|
|
212
|
+
const random = rng(this.previousBlockId, this.blockId, this.transactionId);
|
|
213
|
+
// Memo that shows in users memo when they win
|
|
214
|
+
const winningMemo = `You won ${tokensWon} ${TOKEN_SYMBOL}. Roll: ${random}, Your guess: ${roll}`;
|
|
215
|
+
// Memo that shows in users memo when they lose
|
|
216
|
+
const losingMemo = `You lost ${amountParsed.toFixed(3)} ${TOKEN_SYMBOL}. Roll: ${random}, Your guess: ${roll}`;
|
|
217
|
+
try {
|
|
218
|
+
// If random value is less than roll
|
|
219
|
+
if (random < roll) {
|
|
220
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, tokensWon, TOKEN_SYMBOL, winningMemo);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, '0.001', TOKEN_SYMBOL, losingMemo);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
finally {
|
|
227
|
+
// Release the reserved payout
|
|
228
|
+
this.pendingPayouts = this.pendingPayouts.minus(tokensWonBN);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
// Invalid bet parameters, refund the user their bet
|
|
233
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] Invalid bet params.`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
try {
|
|
238
|
+
// We need to refund the user
|
|
239
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You sent an invalid bet amount.`);
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
243
|
+
console.error(`[DiceContract] Refund error: ${error.message}`, {
|
|
244
|
+
sender,
|
|
245
|
+
amount: amountTrim[0],
|
|
246
|
+
currency: amountTrim[1],
|
|
247
|
+
stack: error.stack
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
255
|
+
console.error(`[DiceContract] Roll processing error: ${error.message}`, {
|
|
256
|
+
sender,
|
|
257
|
+
amount,
|
|
258
|
+
payload,
|
|
259
|
+
stack: error.stack
|
|
260
|
+
});
|
|
261
|
+
// Attempt to refund on error if amount is valid
|
|
262
|
+
try {
|
|
263
|
+
if (amount && typeof amount === 'string' && amount.includes(' ')) {
|
|
264
|
+
const [amountStr, currency] = amount.split(' ');
|
|
265
|
+
const amountBN = new bignumber_js_1.default(amountStr);
|
|
266
|
+
if (!amountBN.isNaN() && amountBN.isFinite() && !amountBN.isNegative()) {
|
|
267
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountStr, currency, '[Refund] Processing error occurred.');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (refundError) {
|
|
272
|
+
console.error(`[DiceContract] Failed to refund after error:`, refundError);
|
|
273
|
+
}
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Called by our time-based action
|
|
278
|
+
testauto() {
|
|
279
|
+
console.log('test');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.DiceContract = DiceContract;
|
|
156
283
|
//# sourceMappingURL=dice.contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":";;;;;;AAEA,4DAAoC;AACpC,gEAAqC;AAErC,MAAM,aAAa,GAAG,UAAU,CAAC;AAEjC,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,OAAO,GAAG,EAAE,CAAC;AAEnB,
|
|
1
|
+
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +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
|
-
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
|
+
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
|
+
}
|