var baseBet = 10; // In bits
var baseMultiplier = 1.33; // Target multiplier: 1.33 recommended
var variableBase = false; // Enable variable mode (very experimental), read streakSecurity.
var streakSecurity = 3; // Number of loss-streak you wanna be safe for. Increasing this massively reduces the variableBase calculated. (1-loss = 30%, 3-loss = 5%, 3-loss = 1.35% of your maximum balance). Recommended: 3+
var maximumBet = 999999999; // Maximum bet the bot will do (in bits).
// Pause settings
var pauseThreshold = 20; // when game crashes above this, betting pauses
var continueThreshold = 2; // when paused and the game crashes above this, betting resumes
var pauseAfterNLosses = 3;
var pauseForMGames = 7;
/******************/
pauseThreshold = Math.round(pauseThreshold * 100);
continueThreshold = Math.round(continueThreshold * 100);
// Variables - Do not touch!
var baseSatoshi = baseBet * 100; // Calculated
var currentBet = baseSatoshi;
var currentMultiplier = baseMultiplier;
var currentGameID = -1;
var firstGame = true;
var lossStreak = 0;
var coolingDown = false;
var lostLast = false;
// Pause Variables
var currentGameData;
var lastCrash = (continueThreshold + pauseThreshold)/3;
var paused = false;
var pauseLossStreak = 0;
var pausedFor = 0;
// Initialization
console.log('====== BustaBit Bot ======');
console.log('My username is: ' + engine.getUsername());
console.log('Starting balance: ' + (engine.getBalance() / 100).toFixed(3) + ' bits');
var startingBalance = engine.getBalance();
if (variableBase) {
console.warn('[WARN] Variable mode is enabled and not fully tested. Bot is resillient to ' + streakSecurity + '-loss streaks.');
}
// On a game starting, place the bet.
engine.on('game_starting', function(info) {
console.log('====== New Game ======');
/********************/
if(lastCrash >= pauseThreshold) {
paused = true;
console.log("Pausing Betting");
return;
}
if(paused) {
if(lastCrash >= continueThreshold) {
console.log("Continuing Betting");
lastCrash = (continueThreshold + pauseThreshold)/3;
paused = false;
} else {
console.log("Betting Is Paused");
return;
}
}
/********************/
if(pausedFor > 0) {1
pausedFor++;
if(pausedFor <= pauseForMGames) {
console.log("Paused " + pausedFor + " of " + pauseForMGames + " games");
return;
} else {
console.log("Resuming");
pausedFor = 0;
pauseLossStreak = 0;
}
}
if(pauseLossStreak >= pauseAfterNLosses) {
console.log("Pausing for 1 of " + pauseForMGames + " games");
pausedFor = 1;
return;
}
/********************/
console.log('[Bot] Game #' + info.game_id);
currentGameID = info.game_id;
if (coolingDown) {
if (lossStreak == 0) {
coolingDown = false;
}
else {
lossStreak--;
console.log('[Bot] Cooling down! Games remaining: ' + lossStreak);
return;
}
}
if (!firstGame) { // Display data only after first game played.
console.log('[Stats] Session profit: ' + ((engine.getBalance() - startingBalance) / 100).toFixed(3) + ' bits');
console.log('[Stats] Profit percentage: ' + (((engine.getBalance() / startingBalance) - 1) * 100).toFixed(3) + '%');
}
if (lostLast && !firstGame) {//if (engine.lastGamePlay() == 'LOST' && !firstGame) { // If last game loss:
lossStreak++;
var totalLosses = 0; // Total satoshi lost.
var lastLoss = currentBet; // Store our last bet.
while (lastLoss >= baseSatoshi) { // Until we get down to base bet, add the previous losses.
totalLosses += lastLoss;
lastLoss /= 3;
}
if (lossStreak > streakSecurity) { // If we're on a loss streak, wait a few games!
coolingDown = true;
return;
}
currentBet *= 3; // Then multiply base bet by 3!
currentMultiplier = 1 + (totalLosses / currentBet);
}
else { // Otherwise if win or first game:
lossStreak = 0; // If it was a win, we reset the lossStreak.
if (variableBase) { // If variable bet enabled.
// Variable mode resists (currently) 1 loss, by making sure you have enough to cover the base and the 3x base bet.
var divider = 100;
for (i = 0; i < streakSecurity; i++) {
divider += (100 * Math.pow(3, (i + 1)));
}
newBaseBet = Math.min(Math.max(1, Math.floor(engine.getBalance() / divider)), maximumBet * 100); // In bits
newBaseSatoshi = newBaseBet * 100;
if ((newBaseBet != baseBet) || (newBaseBet == 1)) {
console.log('[Bot] Variable mode has changed base bet to: ' + newBaseBet + ' bits');
baseBet = newBaseBet;
baseSatoshi = newBaseSatoshi;
}
}
// Update bet.
currentBet = baseSatoshi; // in Satoshi
currentMultiplier = baseMultiplier;
}
// Message and set first game to false to be sure.
console.log('[Bot] Betting ' + (currentBet / 100) + ' bits, cashing out at ' + currentMultiplier + 'x');
firstGame = false;
if (currentBet <= engine.getBalance()) { // Ensure we have enough to bet
if (currentBet > (maximumBet * 100)) { // Ensure you only bet the maximum.
console.warn('[Warn] Bet size exceeds maximum bet, lowering bet to ' + (maximumBet * 100) + ' bits');
currentBet = maximumBet;
}
engine.placeBet(currentBet, Math.round(currentMultiplier * 100), false);
}
else { // Otherwise insufficent funds...
if (engine.getBalance() < 100) {
console.error('[Bot] Insufficent funds to do anything... stopping');
engine.stop();
}
else {
console.warn('[Bot] Insufficent funds to bet ' + (currentBet / 100) + ' bits.');
console.warn('[Bot] Resetting to 1 bit basebet');
baseBet = 1;
baseSatoshi = 100;
}
}
});
engine.on('game_started', function(data) {
if (!firstGame) { console.log('[Bot] Game #' + currentGameID + ' has started!'); }
currentGameData = data;
});
engine.on('cashed_out', function(data) {
if (data.username == engine.getUsername()) {
console.log('[Bot] Successfully cashed out at ' + (data.stopped_at / 100) + 'x');
}
});
engine.on('game_crash', function(data) {
if (!firstGame) { console.log('[Bot] Game crashed at ' + (data.game_crash / 100) + 'x'); }
/********************/
lastCrash = data.game_crash;
if (!currentGameData || !currentGameData.hasOwnProperty(engine.getUsername())) {
return;
};
lostLast = engine.lastGamePlay() == 'LOST';
console.log((lostLast ? "Lost" : "Won") + " this game.");
/********************/
if(!lostLast) {
pauseLossStreak = 0;
} else {
pauseLossStreak++;
}
/********************/
});