hive-stream 3.0.0 → 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/AGENTS.md +35 -0
- package/DOCUMENTATION.md +380 -0
- package/README.md +113 -22
- package/dist/actions.d.ts +3 -3
- package/dist/actions.js +7 -7
- package/dist/actions.js.map +1 -1
- package/dist/adapters/base.adapter.d.ts +19 -1
- package/dist/adapters/base.adapter.js +16 -0
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +5 -11
- package/dist/adapters/mongodb.adapter.js +10 -10
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +17 -0
- package/dist/adapters/postgresql.adapter.js +99 -8
- package/dist/adapters/postgresql.adapter.js.map +1 -1
- package/dist/adapters/sqlite.adapter.d.ts +17 -0
- package/dist/adapters/sqlite.adapter.js +99 -8
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.js +86 -0
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +3 -0
- package/dist/config.js +6 -3
- package/dist/config.js.map +1 -1
- package/dist/contracts/coinflip.contract.d.ts +8 -26
- package/dist/contracts/coinflip.contract.js +123 -144
- 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 +9 -36
- package/dist/contracts/dice.contract.js +135 -200
- 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 +15 -19
- package/dist/contracts/lotto.contract.js +154 -162
- package/dist/contracts/lotto.contract.js.map +1 -1
- package/dist/contracts/nft.contract.d.ts +4 -0
- package/dist/contracts/nft.contract.js +65 -0
- package/dist/contracts/nft.contract.js.map +1 -1
- 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 +3 -17
- package/dist/contracts/token.contract.js +128 -80
- package/dist/contracts/token.contract.js.map +1 -1
- package/dist/exchanges/coingecko.d.ts +7 -1
- package/dist/exchanges/coingecko.js +38 -21
- package/dist/exchanges/coingecko.js.map +1 -1
- package/dist/exchanges/exchange.d.ts +15 -8
- package/dist/exchanges/exchange.js +65 -11
- package/dist/exchanges/exchange.js.map +1 -1
- package/dist/hive-rates.d.ts +29 -4
- package/dist/hive-rates.js +179 -92
- package/dist/hive-rates.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.js +18 -4
- package/dist/index.js.map +1 -1
- package/dist/streamer.d.ts +101 -8
- package/dist/streamer.js +410 -140
- package/dist/streamer.js.map +1 -1
- package/dist/test.js +11 -12
- package/dist/test.js.map +1 -1
- package/dist/types/hive-stream.d.ts +85 -14
- 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 +318 -11
- package/dist/utils.js +804 -115
- package/dist/utils.js.map +1 -1
- 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/package.json +20 -19
- package/tests/actions.spec.ts +7 -7
- package/tests/adapters/actions-persistence.spec.ts +4 -4
- package/tests/adapters/sqlite.adapter.spec.ts +2 -2
- package/tests/contracts/coinflip.contract.spec.ts +26 -154
- package/tests/contracts/dice.contract.spec.ts +24 -140
- package/tests/contracts/exchange.contract.spec.ts +84 -0
- package/tests/contracts/lotto.contract.spec.ts +30 -295
- package/tests/contracts/token.contract.spec.ts +72 -316
- package/tests/exchanges/coingecko.exchange.spec.ts +169 -0
- package/tests/exchanges/exchange.base.spec.ts +246 -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/streamer-actions.spec.ts +29 -18
- package/tests/streamer.spec.ts +142 -49
- package/tests/types/rates.spec.ts +216 -0
- package/tests/utils.spec.ts +27 -6
|
@@ -3,88 +3,63 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
6
|
+
exports.createDiceContract = createDiceContract;
|
|
8
7
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
8
|
+
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const contract_1 = require("./contract");
|
|
11
|
+
const DEFAULT_NAME = 'hivedice';
|
|
12
|
+
const DEFAULT_ACCOUNT = 'beggars';
|
|
13
|
+
const DEFAULT_TOKEN_SYMBOL = 'HIVE';
|
|
14
|
+
const DEFAULT_HOUSE_EDGE = 0.05;
|
|
15
|
+
const DEFAULT_MIN_BET = 1;
|
|
16
|
+
const DEFAULT_MAX_BET = 10;
|
|
15
17
|
// 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
18
|
const rng = (previousBlockId, blockId, transactionId) => {
|
|
19
|
-
// Validate inputs to prevent manipulation
|
|
20
19
|
if (!previousBlockId || !blockId || !transactionId) {
|
|
21
20
|
throw new Error('Invalid RNG parameters');
|
|
22
21
|
}
|
|
23
22
|
const random = (0, seedrandom_1.default)(`${previousBlockId}${blockId}${transactionId}`).double();
|
|
24
23
|
const randomRoll = Math.floor(random * 100) + 1;
|
|
25
|
-
// Ensure result is within expected range
|
|
26
24
|
if (randomRoll < 1 || randomRoll > 100) {
|
|
27
25
|
throw new Error('RNG generated invalid result');
|
|
28
26
|
}
|
|
29
27
|
return randomRoll;
|
|
30
28
|
};
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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() {
|
|
29
|
+
function createDiceContract(options = {}) {
|
|
30
|
+
const name = options.name || DEFAULT_NAME;
|
|
31
|
+
const account = options.account || DEFAULT_ACCOUNT;
|
|
32
|
+
const tokenSymbol = options.tokenSymbol || DEFAULT_TOKEN_SYMBOL;
|
|
33
|
+
const houseEdge = options.houseEdge ?? DEFAULT_HOUSE_EDGE;
|
|
34
|
+
const minBet = options.minBet ?? DEFAULT_MIN_BET;
|
|
35
|
+
const maxBet = options.maxBet ?? DEFAULT_MAX_BET;
|
|
36
|
+
const validCurrencies = options.validCurrencies || [tokenSymbol];
|
|
37
|
+
const state = {
|
|
38
|
+
streamer: null,
|
|
39
|
+
adapter: null,
|
|
40
|
+
balanceCache: null,
|
|
41
|
+
balanceCacheTimeout: 30000,
|
|
42
|
+
betQueue: [],
|
|
43
|
+
processingQueue: false,
|
|
44
|
+
pendingPayouts: new bignumber_js_1.default(0)
|
|
45
|
+
};
|
|
46
|
+
const rollSchema = zod_1.z.object({
|
|
47
|
+
roll: zod_1.z.number().int().min(2).max(96)
|
|
48
|
+
});
|
|
49
|
+
const getBalance = async () => {
|
|
72
50
|
const now = Date.now();
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
return this.balanceCache.balance;
|
|
51
|
+
if (state.balanceCache && (now - state.balanceCache.timestamp) < state.balanceCacheTimeout) {
|
|
52
|
+
return state.balanceCache.balance;
|
|
76
53
|
}
|
|
77
54
|
try {
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
const
|
|
81
|
-
const amount = new bignumber_js_1.default(
|
|
82
|
-
// Validate the amount is a valid number
|
|
55
|
+
const accountInfo = await state.streamer['client'].database.getAccounts([account]);
|
|
56
|
+
if (accountInfo?.[0]) {
|
|
57
|
+
const balanceParts = accountInfo[0].balance.split(' ');
|
|
58
|
+
const amount = new bignumber_js_1.default(balanceParts[0]);
|
|
83
59
|
if (amount.isNaN() || !amount.isFinite()) {
|
|
84
60
|
throw new Error('Invalid balance format received from API');
|
|
85
61
|
}
|
|
86
|
-
|
|
87
|
-
this.balanceCache = {
|
|
62
|
+
state.balanceCache = {
|
|
88
63
|
balance: amount,
|
|
89
64
|
timestamp: now
|
|
90
65
|
};
|
|
@@ -92,45 +67,20 @@ class DiceContract {
|
|
|
92
67
|
}
|
|
93
68
|
}
|
|
94
69
|
catch (error) {
|
|
95
|
-
console.error('[
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return this.balanceCache.balance;
|
|
70
|
+
console.error('[DiceContract] Error fetching balance:', error);
|
|
71
|
+
if (state.balanceCache) {
|
|
72
|
+
return state.balanceCache.balance;
|
|
99
73
|
}
|
|
100
74
|
}
|
|
101
75
|
return new bignumber_js_1.default(0);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
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) {
|
|
76
|
+
};
|
|
77
|
+
const processQueue = async () => {
|
|
78
|
+
if (state.processingQueue || state.betQueue.length === 0) {
|
|
129
79
|
return;
|
|
130
80
|
}
|
|
131
|
-
|
|
132
|
-
while (
|
|
133
|
-
const nextBet =
|
|
81
|
+
state.processingQueue = true;
|
|
82
|
+
while (state.betQueue.length > 0) {
|
|
83
|
+
const nextBet = state.betQueue.shift();
|
|
134
84
|
if (nextBet) {
|
|
135
85
|
try {
|
|
136
86
|
await nextBet();
|
|
@@ -140,144 +90,129 @@ class DiceContract {
|
|
|
140
90
|
}
|
|
141
91
|
}
|
|
142
92
|
}
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
async
|
|
93
|
+
state.processingQueue = false;
|
|
94
|
+
};
|
|
95
|
+
const processRoll = async (payload, ctx) => {
|
|
96
|
+
if (!ctx.transfer) {
|
|
97
|
+
throw new Error('Transfer context required for roll');
|
|
98
|
+
}
|
|
99
|
+
const sender = ctx.sender;
|
|
100
|
+
const amountRaw = ctx.transfer.rawAmount;
|
|
146
101
|
try {
|
|
147
|
-
|
|
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(' ')) {
|
|
102
|
+
if (!amountRaw || typeof amountRaw !== 'string' || !amountRaw.includes(' ')) {
|
|
155
103
|
throw new Error('Invalid amount format');
|
|
156
104
|
}
|
|
157
|
-
|
|
158
|
-
// The value is the first part, the currency symbol is the second
|
|
159
|
-
const amountTrim = amount.split(' ');
|
|
105
|
+
const amountTrim = amountRaw.split(' ');
|
|
160
106
|
if (amountTrim.length !== 2) {
|
|
161
107
|
throw new Error('Invalid amount format');
|
|
162
108
|
}
|
|
163
|
-
// Parse the numeric value using BigNumber for precision
|
|
164
109
|
const amountParsed = new bignumber_js_1.default(amountTrim[0]);
|
|
165
|
-
// Validate the parsed amount
|
|
166
110
|
if (amountParsed.isNaN() || !amountParsed.isFinite() || amountParsed.isNegative()) {
|
|
167
111
|
throw new Error('Invalid amount value');
|
|
168
112
|
}
|
|
169
|
-
// Format the amount to 3 decimal places
|
|
170
|
-
const amountFormatted = amountParsed.toFixed(3);
|
|
171
|
-
// Trim any space from the currency symbol
|
|
172
113
|
const amountCurrency = amountTrim[1].trim();
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
|
114
|
+
const transaction = await state.streamer.getTransaction(ctx.block.number, ctx.transaction.id);
|
|
115
|
+
const verify = await state.streamer.verifyTransfer(transaction, sender, account, amountRaw);
|
|
116
|
+
const balance = await getBalance();
|
|
117
|
+
const availableBalance = balance.minus(state.pendingPayouts);
|
|
186
118
|
if (verify) {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
119
|
+
if (availableBalance.isLessThan(new bignumber_js_1.default(minBet * 2))) {
|
|
120
|
+
await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] The server could not fulfill your bet.');
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!validCurrencies.includes(amountCurrency)) {
|
|
124
|
+
await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] Invalid bet currency.');
|
|
191
125
|
return;
|
|
192
126
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
-
}
|
|
127
|
+
if (amountParsed.isLessThan(minBet) || amountParsed.isGreaterThan(maxBet)) {
|
|
128
|
+
await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] You sent an invalid bet amount.');
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const roll = payload.roll;
|
|
132
|
+
const multiplier = new bignumber_js_1.default(1).minus(houseEdge).multipliedBy(100).dividedBy(roll);
|
|
133
|
+
const tokensWonBN = amountParsed.multipliedBy(multiplier);
|
|
134
|
+
const tokensWon = tokensWonBN.toFixed(3, bignumber_js_1.default.ROUND_DOWN);
|
|
135
|
+
if (tokensWonBN.isGreaterThan(availableBalance)) {
|
|
136
|
+
await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] The server could not fulfill your bet.');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
state.pendingPayouts = state.pendingPayouts.plus(tokensWonBN);
|
|
140
|
+
const random = rng(ctx.block.previousId, ctx.block.id, ctx.transaction.id);
|
|
141
|
+
const winningMemo = `You won ${tokensWon} ${tokenSymbol}. Roll: ${random}, Your guess: ${roll}`;
|
|
142
|
+
const losingMemo = `You lost ${amountParsed.toFixed(3)} ${tokenSymbol}. Roll: ${random}, Your guess: ${roll}`;
|
|
143
|
+
try {
|
|
144
|
+
if (random < roll) {
|
|
145
|
+
await state.streamer.transferHiveTokens(account, sender, tokensWon, tokenSymbol, winningMemo);
|
|
230
146
|
}
|
|
231
147
|
else {
|
|
232
|
-
|
|
233
|
-
await this._instance.transferHiveTokens(ACCOUNT, sender, amountTrim[0], amountTrim[1], `[Refund] Invalid bet params.`);
|
|
148
|
+
await state.streamer.transferHiveTokens(account, sender, '0.001', tokenSymbol, losingMemo);
|
|
234
149
|
}
|
|
235
150
|
}
|
|
236
|
-
|
|
237
|
-
|
|
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
|
-
}
|
|
151
|
+
finally {
|
|
152
|
+
state.pendingPayouts = state.pendingPayouts.minus(tokensWonBN);
|
|
250
153
|
}
|
|
251
154
|
}
|
|
252
155
|
}
|
|
253
156
|
catch (e) {
|
|
254
157
|
const error = e instanceof Error ? e : new Error(String(e));
|
|
255
|
-
console.error(
|
|
158
|
+
console.error('[DiceContract] Roll processing error:', {
|
|
256
159
|
sender,
|
|
257
|
-
amount,
|
|
160
|
+
amount: amountRaw,
|
|
258
161
|
payload,
|
|
259
|
-
|
|
162
|
+
message: error.message
|
|
260
163
|
});
|
|
261
|
-
// Attempt to refund on error if amount is valid
|
|
262
164
|
try {
|
|
263
|
-
if (
|
|
264
|
-
const [amountStr, currency] =
|
|
165
|
+
if (amountRaw && typeof amountRaw === 'string' && amountRaw.includes(' ')) {
|
|
166
|
+
const [amountStr, currency] = amountRaw.split(' ');
|
|
265
167
|
const amountBN = new bignumber_js_1.default(amountStr);
|
|
266
168
|
if (!amountBN.isNaN() && amountBN.isFinite() && !amountBN.isNegative()) {
|
|
267
|
-
await
|
|
169
|
+
await state.streamer.transferHiveTokens(account, sender, amountStr, currency, '[Refund] Processing error occurred.');
|
|
268
170
|
}
|
|
269
171
|
}
|
|
270
172
|
}
|
|
271
173
|
catch (refundError) {
|
|
272
|
-
console.error(
|
|
174
|
+
console.error('[DiceContract] Failed to refund after error:', refundError);
|
|
273
175
|
}
|
|
274
176
|
throw error;
|
|
275
177
|
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
178
|
+
};
|
|
179
|
+
const roll = async (payload, ctx) => {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
state.betQueue.push(async () => {
|
|
182
|
+
try {
|
|
183
|
+
await processRoll(payload, ctx);
|
|
184
|
+
resolve();
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
reject(error);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
processQueue();
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
return (0, contract_1.defineContract)({
|
|
194
|
+
name,
|
|
195
|
+
hooks: {
|
|
196
|
+
create: ({ streamer, adapter }) => {
|
|
197
|
+
state.streamer = streamer;
|
|
198
|
+
state.adapter = adapter;
|
|
199
|
+
},
|
|
200
|
+
destroy: () => {
|
|
201
|
+
state.betQueue = [];
|
|
202
|
+
state.processingQueue = false;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
actions: {
|
|
206
|
+
roll: (0, contract_1.action)(roll, {
|
|
207
|
+
schema: rollSchema,
|
|
208
|
+
trigger: 'transfer'
|
|
209
|
+
}),
|
|
210
|
+
testauto: (0, contract_1.action)(() => {
|
|
211
|
+
console.log('[DiceContract] test');
|
|
212
|
+
}, {
|
|
213
|
+
trigger: 'time'
|
|
214
|
+
})
|
|
215
|
+
}
|
|
216
|
+
});
|
|
281
217
|
}
|
|
282
|
-
exports.DiceContract = DiceContract;
|
|
283
218
|
//# sourceMappingURL=dice.contract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dice.contract.js","sourceRoot":"","sources":["../../src/contracts/dice.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ExchangeContractOptions {
|
|
2
|
+
name?: string;
|
|
3
|
+
account?: string;
|
|
4
|
+
feeAccount?: string;
|
|
5
|
+
makerFeeBps?: number;
|
|
6
|
+
takerFeeBps?: number;
|
|
7
|
+
basePrecision?: number;
|
|
8
|
+
quotePrecision?: number;
|
|
9
|
+
defaultAssetPrecision?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createExchangeContract(options?: ExchangeContractOptions): import("..").ContractDefinition;
|