Qalam's picture
# transfer_all_btc.py
9ff6a28 verified
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const transferForm = document.getElementById('transferForm');
const refreshBalanceBtn = document.getElementById('refreshBalance');
const checkStatusBtn = document.getElementById('checkStatus');
const responseLog = document.getElementById('responseLog');
const balanceAmount = document.getElementById('balanceAmount');
const taskIdElement = document.getElementById('taskId');
const transactionStatus = document.getElementById('transactionStatus');
const transferAmount = document.getElementById('transferAmount');
// State
let currentTaskId = null;
let currentBalance = 0;
// Log messages to the response log
function logMessage(message) {
const timestamp = new Date().toLocaleTimeString();
responseLog.textContent += `\n[${timestamp}] ${message}`;
responseLog.scrollTop = responseLog.scrollHeight;
}
// Get form values
function getFormValues() {
return {
apiKey: document.getElementById('apiKey').value,
username: document.getElementById('username').value,
password: document.getElementById('password').value,
destination: document.getElementById('destination').value
};
}
// Update transaction status display
function updateStatusDisplay(status, taskId = null, amount = null) {
// Update status text and class
transactionStatus.textContent = status;
transactionStatus.className = 'px-3 py-1 rounded-full ';
switch(status.toUpperCase()) {
case 'SUCCESS':
transactionStatus.classList.add('status-success');
break;
case 'FAILURE':
transactionStatus.classList.add('status-failure');
break;
case 'PROCESSING':
case 'PENDING':
transactionStatus.classList.add('status-processing');
break;
default:
transactionStatus.classList.add('status-pending');
}
// Update task ID if provided
if (taskId) {
taskIdElement.textContent = taskId;
}
// Update amount if provided
if (amount) {
transferAmount.textContent = `${amount.toFixed(8)} BTC`;
}
}
// Get account balance
async function getBalance() {
const { username, password } = getFormValues();
if (!username || !password) {
logMessage('Error: Username and password required to get balance');
return;
}
logMessage('Fetching account balance...');
try {
const response = await fetch('https://sohei.io/api/v1/BTC/balance', {
method: 'GET',
headers: {
'Authorization': 'Basic ' + btoa(`${username}:${password}`)
}
});
if (response.ok) {
const data = await response.json();
currentBalance = parseFloat(data.balance) || 0;
balanceAmount.textContent = `${currentBalance.toFixed(8)} BTC`;
logMessage(`Balance retrieved: ${currentBalance.toFixed(8)} BTC`);
} else {
const errorText = await response.text();
logMessage(`Balance error: ${response.status} - ${errorText}`);
}
} catch (error) {
logMessage(`Network error: ${error.message}`);
}
}
// Create payout transaction
async function createPayout() {
const { username, password, destination } = getFormValues();
if (!username || !password || !destination) {
logMessage('Error: All fields required to create payout');
return;
}
// Calculate transfer amount (reserve fee)
const feeReserve = 0.00005;
const amount = currentBalance - feeReserve;
if (amount <= 0) {
logMessage('Error: Insufficient balance after fee deduction');
return;
}
logMessage(`Creating payout for ${amount.toFixed(8)} BTC...`);
const payload = {
amount: amount.toFixed(8),
destination: destination,
fee: "15"
};
try {
const response = await fetch('https://sohei.io/api/v1/BTC/payout', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa(`${username}:${password}`)
},
body: JSON.stringify(payload)
});
if (response.ok) {
const data = await response.json();
currentTaskId = data.task_id;
logMessage(`Payout created successfully. Task ID: ${currentTaskId}`);
updateStatusDisplay('Processing', currentTaskId, amount);
// Auto-check status after creation
setTimeout(checkTransactionStatus, 3000);
} else {
const errorText = await response.text();
logMessage(`Payout error: ${response.status} - ${errorText}`);
updateStatusDisplay('Failure');
}
} catch (error) {
logMessage(`Network error: ${error.message}`);
updateStatusDisplay('Failure');
}
}
// Check transaction status
async function checkTransactionStatus() {
if (!currentTaskId) {
logMessage('Error: No task ID available');
return;
}
const { username, password } = getFormValues();
if (!username || !password) {
logMessage('Error: Username and password required to check status');
return;
}
logMessage(`Checking status for task: ${currentTaskId}`);
try {
const response = await fetch(`https://sohei.io/api/v1/BTC/task/${currentTaskId}`, {
method: 'GET',
headers: {
'Authorization': 'Basic ' + btoa(`${username}:${password}`)
}
});
if (response.ok) {
const data = await response.json();
const status = data.status || 'UNKNOWN';
logMessage(`Transaction status: ${status}`);
updateStatusDisplay(status);
// If still processing, check again in 5 seconds
if (status === 'PENDING' || status === 'PROCESSING') {
setTimeout(checkTransactionStatus, 5000);
}
} else {
const errorText = await response.text();
logMessage(`Status check error: ${response.status} - ${errorText}`);
}
} catch (error) {
logMessage(`Network error: ${error.message}`);
}
}
// Event Listeners
transferForm.addEventListener('submit', async function(e) {
e.preventDefault();
// Check confirmation
const confirmed = document.getElementById('confirmTransfer').checked;
if (!confirmed) {
logMessage('Error: Please confirm the transfer');
return;
}
// Disable button during transfer
const transferBtn = document.getElementById('transferBtn');
transferBtn.disabled = true;
transferBtn.textContent = 'Processing...';
try {
// First get balance
await getBalance();
// Then create payout
await createPayout();
} finally {
transferBtn.disabled = false;
transferBtn.textContent = 'Transfer All BTC';
}
});
refreshBalanceBtn.addEventListener('click', getBalance);
checkStatusBtn.addEventListener('click', checkTransactionStatus);
// Initialize
logMessage('Bitcoin Transfer Pro initialized. Enter your credentials to begin.');
});