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,95 +1,254 @@
|
|
|
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.CoinflipContract = void 0;
|
|
7
|
-
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
8
|
-
const uuid_1 = require("uuid");
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
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.CoinflipContract = void 0;
|
|
7
|
+
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
10
|
+
const CONTRACT_NAME = 'coinflip';
|
|
11
|
+
const ACCOUNT = 'beggars';
|
|
12
|
+
const TOKEN_SYMBOL = 'HIVE';
|
|
13
|
+
const VALID_CURRENCIES = ['HIVE'];
|
|
14
|
+
const MAX_AMOUNT = 20;
|
|
15
|
+
const MIN_AMOUNT = 0.001;
|
|
16
|
+
// Provably Fair Random Number Generator for coinflip
|
|
17
|
+
// Uses deterministic blockchain data to ensure results are verifiable by users
|
|
18
|
+
function rng(previousBlockId, blockId, transactionId, serverSeed, clientSeed = '') {
|
|
19
|
+
// Validate inputs to prevent manipulation
|
|
20
|
+
if (!previousBlockId || !blockId || !transactionId || !serverSeed) {
|
|
21
|
+
throw new Error('Invalid RNG parameters');
|
|
22
|
+
}
|
|
23
|
+
const random = (0, seedrandom_1.default)(`${previousBlockId}${blockId}${transactionId}${clientSeed}${serverSeed}`).double();
|
|
24
|
+
const randomRoll = Math.floor(random * 2) + 1;
|
|
25
|
+
// Ensure result is within expected range
|
|
26
|
+
if (randomRoll < 1 || randomRoll > 2) {
|
|
27
|
+
throw new Error('RNG generated invalid result');
|
|
28
|
+
}
|
|
29
|
+
return randomRoll === 1 ? 'heads' : 'tails';
|
|
30
|
+
}
|
|
31
|
+
class CoinflipContract {
|
|
32
|
+
_instance;
|
|
33
|
+
adapter;
|
|
34
|
+
blockNumber;
|
|
35
|
+
blockId;
|
|
36
|
+
previousBlockId;
|
|
37
|
+
transactionId;
|
|
38
|
+
// Cache for account balance to reduce API calls
|
|
39
|
+
balanceCache = null;
|
|
40
|
+
balanceCacheTimeout = 30000; // 30 seconds
|
|
41
|
+
// Queue system for processing bets to prevent race conditions
|
|
42
|
+
betQueue = [];
|
|
43
|
+
processingQueue = false;
|
|
44
|
+
pendingPayouts = new bignumber_js_1.default(0);
|
|
45
|
+
create() {
|
|
46
|
+
this.adapter = this._instance.getAdapter();
|
|
47
|
+
}
|
|
48
|
+
destroy() {
|
|
49
|
+
// Cleanup resources
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get Balance with caching
|
|
53
|
+
*/
|
|
54
|
+
async getBalance() {
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
// Return cached balance if still valid
|
|
57
|
+
if (this.balanceCache && (now - this.balanceCache.timestamp) < this.balanceCacheTimeout) {
|
|
58
|
+
return this.balanceCache.balance;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const account = await this._instance['client'].database.getAccounts([ACCOUNT]);
|
|
62
|
+
if (account?.[0]) {
|
|
63
|
+
const balance = account[0].balance.split(' ');
|
|
64
|
+
const amount = new bignumber_js_1.default(balance[0]);
|
|
65
|
+
// Validate the amount is a valid number
|
|
66
|
+
if (amount.isNaN() || !amount.isFinite()) {
|
|
67
|
+
throw new Error('Invalid balance format received from API');
|
|
68
|
+
}
|
|
69
|
+
// Cache the balance
|
|
70
|
+
this.balanceCache = {
|
|
71
|
+
balance: amount,
|
|
72
|
+
timestamp: now
|
|
73
|
+
};
|
|
74
|
+
return amount;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('[CoinflipContract] Error fetching balance:', error);
|
|
79
|
+
// Return cached balance if available, even if expired
|
|
80
|
+
if (this.balanceCache) {
|
|
81
|
+
return this.balanceCache.balance;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return new bignumber_js_1.default(0);
|
|
85
|
+
}
|
|
86
|
+
updateBlockInfo(blockNumber, blockId, previousBlockId, transactionId) {
|
|
87
|
+
// Lifecycle method which sets block info
|
|
88
|
+
this.blockNumber = blockNumber;
|
|
89
|
+
this.blockId = blockId;
|
|
90
|
+
this.previousBlockId = previousBlockId;
|
|
91
|
+
this.transactionId = transactionId;
|
|
92
|
+
}
|
|
93
|
+
async flip(payload, { sender, amount }) {
|
|
94
|
+
// Add bet to queue for processing
|
|
95
|
+
return new Promise((resolve, reject) => {
|
|
96
|
+
this.betQueue.push(async () => {
|
|
97
|
+
try {
|
|
98
|
+
await this.processFlip(payload, { sender, amount });
|
|
99
|
+
resolve();
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
reject(error);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
// Start processing queue if not already running
|
|
106
|
+
this.processQueue();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
async processQueue() {
|
|
110
|
+
if (this.processingQueue || this.betQueue.length === 0) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.processingQueue = true;
|
|
114
|
+
while (this.betQueue.length > 0) {
|
|
115
|
+
const nextBet = this.betQueue.shift();
|
|
116
|
+
if (nextBet) {
|
|
117
|
+
try {
|
|
118
|
+
await nextBet();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error('[CoinflipContract] Queue processing error:', error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
this.processingQueue = false;
|
|
126
|
+
}
|
|
127
|
+
async processFlip(payload, { sender, amount }) {
|
|
128
|
+
try {
|
|
129
|
+
// Validate payload structure
|
|
130
|
+
if (!payload || typeof payload !== 'object') {
|
|
131
|
+
throw new Error('Invalid payload structure');
|
|
132
|
+
}
|
|
133
|
+
const { guess, seed } = payload;
|
|
134
|
+
const VALID_GUESSES = ['heads', 'tails'];
|
|
135
|
+
// Validate amount format
|
|
136
|
+
if (!amount || typeof amount !== 'string' || !amount.includes(' ')) {
|
|
137
|
+
throw new Error('Invalid amount format');
|
|
138
|
+
}
|
|
139
|
+
const amountTrim = amount.split(' ');
|
|
140
|
+
if (amountTrim.length !== 2) {
|
|
141
|
+
throw new Error('Invalid amount format');
|
|
142
|
+
}
|
|
143
|
+
// Parse the numeric value using BigNumber for precision
|
|
144
|
+
const amountParsed = new bignumber_js_1.default(amountTrim[0]);
|
|
145
|
+
// Validate the parsed amount
|
|
146
|
+
if (amountParsed.isNaN() || !amountParsed.isFinite() || amountParsed.isNegative()) {
|
|
147
|
+
throw new Error('Invalid amount value');
|
|
148
|
+
}
|
|
149
|
+
const amountCurrency = amountTrim[1].trim();
|
|
150
|
+
const transaction = await this._instance.getTransaction(this.blockNumber, this.transactionId);
|
|
151
|
+
const verify = await this._instance.verifyTransfer(transaction, sender, ACCOUNT, amount);
|
|
152
|
+
// Get the balance of our contract account
|
|
153
|
+
const balance = await this.getBalance();
|
|
154
|
+
// Calculate available balance (total - pending payouts)
|
|
155
|
+
const availableBalance = balance.minus(this.pendingPayouts);
|
|
156
|
+
if (verify) {
|
|
157
|
+
// User sent an invalid currency
|
|
158
|
+
if (!VALID_CURRENCIES.includes(amountCurrency)) {
|
|
159
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You sent an invalid currency.`);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
// Validate bet amount is within bounds
|
|
163
|
+
if (amountParsed.isLessThan(MIN_AMOUNT)) {
|
|
164
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] Bet amount too small. Minimum: ${MIN_AMOUNT} ${amountCurrency}.`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// User sent too much, refund the bet
|
|
168
|
+
if (amountParsed.isGreaterThan(MAX_AMOUNT)) {
|
|
169
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] You sent too much. Maximum: ${MAX_AMOUNT} ${amountCurrency}.`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
// Calculate potential payout (2x bet amount)
|
|
173
|
+
const potentialPayout = amountParsed.multipliedBy(2);
|
|
174
|
+
// Check if server can afford the payout
|
|
175
|
+
if (potentialPayout.isGreaterThan(availableBalance)) {
|
|
176
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] The server cannot afford this bet payout.`);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Invalid guess
|
|
180
|
+
if (!guess || !VALID_GUESSES.includes(guess)) {
|
|
181
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] Invalid guess. Please only send heads or tails.`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Reserve the potential payout
|
|
185
|
+
this.pendingPayouts = this.pendingPayouts.plus(potentialPayout);
|
|
186
|
+
try {
|
|
187
|
+
const serverSeed = (0, uuid_1.v4)();
|
|
188
|
+
// Validate server seed was generated
|
|
189
|
+
if (!serverSeed || typeof serverSeed !== 'string') {
|
|
190
|
+
throw new Error('Failed to generate server seed');
|
|
191
|
+
}
|
|
192
|
+
const generatedGuess = rng(this.previousBlockId, this.blockId, this.transactionId, serverSeed, seed ?? '');
|
|
193
|
+
if (generatedGuess === guess) {
|
|
194
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'flip', payload, {
|
|
195
|
+
action: 'transfer',
|
|
196
|
+
data: {
|
|
197
|
+
date: new Date(),
|
|
198
|
+
guess,
|
|
199
|
+
serverSeed,
|
|
200
|
+
previousBlockId: this.previousBlockId,
|
|
201
|
+
blockId: this.blockId,
|
|
202
|
+
transactionId: this.transactionId,
|
|
203
|
+
userWon: 'true'
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, potentialPayout.toFixed(3), amountTrim[1], `[Winner] | Guess: ${guess} | Server Roll: ${generatedGuess} | Previous block id: ${this.previousBlockId} | BlockID: ${this.blockId} | Trx ID: ${this.transactionId} | Server Seed: ${serverSeed}`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
await this.adapter.addEvent(new Date(), CONTRACT_NAME, 'flip', payload, {
|
|
210
|
+
action: 'transfer',
|
|
211
|
+
data: {
|
|
212
|
+
guess,
|
|
213
|
+
serverSeed,
|
|
214
|
+
previousBlockId: this.previousBlockId,
|
|
215
|
+
blockId: this.blockId,
|
|
216
|
+
transactionId: this.transactionId,
|
|
217
|
+
userWon: 'false'
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, '0.001', amountTrim[1], `[Lost] | Guess: ${guess} | Server Roll: ${generatedGuess} | Previous block id: ${this.previousBlockId} | BlockID: ${this.blockId} | Trx ID: ${this.transactionId} | Server Seed: ${serverSeed}`);
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
// Release the reserved payout
|
|
224
|
+
this.pendingPayouts = this.pendingPayouts.minus(potentialPayout);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
const error = e instanceof Error ? e : new Error(String(e));
|
|
230
|
+
console.error(`[CoinflipContract] Flip processing error: ${error.message}`, {
|
|
231
|
+
sender,
|
|
232
|
+
amount,
|
|
233
|
+
payload,
|
|
234
|
+
stack: error.stack
|
|
235
|
+
});
|
|
236
|
+
// Attempt to refund on error if amount is valid
|
|
237
|
+
try {
|
|
238
|
+
if (amount && typeof amount === 'string' && amount.includes(' ')) {
|
|
239
|
+
const [amountStr, currency] = amount.split(' ');
|
|
240
|
+
const amountBN = new bignumber_js_1.default(amountStr);
|
|
241
|
+
if (!amountBN.isNaN() && amountBN.isFinite() && !amountBN.isNegative()) {
|
|
242
|
+
await this._instance.transferHiveTokens(ACCOUNT, sender, amountStr, currency, '[Refund] Processing error occurred.');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (refundError) {
|
|
247
|
+
console.error(`[CoinflipContract] Failed to refund after error:`, refundError);
|
|
248
|
+
}
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
exports.CoinflipContract = CoinflipContract;
|
|
95
254
|
//# sourceMappingURL=coinflip.contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coinflip.contract.js","sourceRoot":"","sources":["../../src/contracts/coinflip.contract.ts"],"names":[],"mappings":";;;;;;AACA,4DAAoC;AACpC,+BAAoC;
|
|
1
|
+
{"version":3,"file":"coinflip.contract.js","sourceRoot":"","sources":["../../src/contracts/coinflip.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
private
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
import { Streamer } from './../streamer';
|
|
2
|
+
export declare class DiceContract {
|
|
3
|
+
_instance: Streamer;
|
|
4
|
+
private blockNumber;
|
|
5
|
+
private blockId;
|
|
6
|
+
private previousBlockId;
|
|
7
|
+
private transactionId;
|
|
8
|
+
private balanceCache;
|
|
9
|
+
private readonly balanceCacheTimeout;
|
|
10
|
+
private betQueue;
|
|
11
|
+
private processingQueue;
|
|
12
|
+
private pendingPayouts;
|
|
13
|
+
create(): void;
|
|
14
|
+
destroy(): void;
|
|
15
|
+
updateBlockInfo(blockNumber: any, blockId: any, previousBlockId: any, transactionId: any): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get Balance
|
|
18
|
+
*
|
|
19
|
+
* Helper method for getting the contract account balance with caching
|
|
20
|
+
* We cache the balance to reduce API calls since it doesn't change frequently
|
|
21
|
+
*
|
|
22
|
+
* @returns number
|
|
23
|
+
*/
|
|
24
|
+
private getBalance;
|
|
25
|
+
/**
|
|
26
|
+
* Roll
|
|
27
|
+
*
|
|
28
|
+
* Automatically called when a custom JSON action matches the following method
|
|
29
|
+
*
|
|
30
|
+
* @param payload
|
|
31
|
+
* @param param1 - sender and amount
|
|
32
|
+
*/
|
|
33
|
+
private roll;
|
|
34
|
+
private processQueue;
|
|
35
|
+
private processRoll;
|
|
36
|
+
private testauto;
|
|
37
|
+
}
|