đ Tale of a Rough Morning⊠But an Epic One! đ âđ»
Today, waking up felt like a slap from reality wrapped in a pillowcase. đ„Ž You know the kind of wake-up where you stare at the clock like:
"Wait⊠did I sleep, or was that just a 17-minute blink?" đ”âđ«
Why this chaotic awakening, you ask?
Well, it all started last night â or rather very early this morning, depending on how you measure time (and caffeine levels). đ
đ§ We were brave (or foolish?) enough to dive into a coding challenge from the mighty @itharagaian â who we now suspect is half-human, half-Java compiler. His infamous project?
â6 Jars Transfer in Java.â Just the title makes the brain sweat. đ§ đŠ
âĄïž Want to challenge yourself too (warning: sleepless night ahead)?
https://ecency.com/hive-143869/@itharagaian/6-jars-transfert-java-form
So, full of ambition (and probably too much confidence), we told ourselves:
"No worries, we'll ask an AI for help â easy peasy!"
đ Spoiler alert: It was NOT easy peasy.
It went more like a Windows update crashing your game mid-boss fight. đ§šđŁ
We tried, we re-tried, asked AIs, begged the digital gods⊠and in the end, we laughed. A lot. đ
But laughter doesnât replace sleep, and this morning, our body filed a complaint:
đ„Ž âBuddy, youâre not 20 anymore. You spent the night coding? Youâre paying the price now. Achy knees, burning eyes, and a brain running like a dusty old laptop.â
And yet⊠zero regrets.
Because sometimes, staying up late to learn, mess around, laugh, and push your limits â thatâs what makes this Hive adventure so awesome. đđ
So how about you? Do you even sleep, or have you fused with your keyboard already? đ
Hereâs what it gave us last night:
But Hive Keychain wonât start.
đ Chronique dâun matin difficile⊠mais Ă©pique ! đ âđ»
Aujourdâhui , le rĂ©veil a Ă©tĂ© . . . disons-le franchement : violent . đ„Ž Oui , oui , ce genre de rĂ©veil oĂč tu regardes l'heure et tu te dis : " Mais ⊠jâai dormi , ou c'Ă©tait juste une micro-sieste de 17 minutes ?" đ”âđ«
Pourquoi ce chaos matinal ? Eh bien , tout a commencĂ© hier soir â ou plutĂŽt cette nuit , ou mĂȘme ce matin trĂšs tĂŽt , selon lâangle de vue ( et le degrĂ© de cafĂ©ine dans le sang ) . đ
đ§ Nous avons tentĂ© de relever un dĂ©fi lancĂ© par le grand @itharagaian et son fameux " 6 Jars Transfer en Java " . Rien que le titre fait transpirer des neurones. đ§ đŠ
âĄïž Si vous ĂȘtes assez courageux pour tenter lâaventure Ă votre tour ( attention , risque de nuit blanche ! ) , voici le lien de son post :
https://ecency.com/hive-143869/@itharagaian/6-jars-transfert-java-form
Avec beaucoup dâambition ( et un peu de naĂŻvetĂ© ) , on sâest dit :
"Facile ! Avec une IA, ça va passer crÚme !"
đ Spoiler alert : ça nâest pas passĂ© crĂšme .
Câest plutĂŽt passĂ© comme une mise Ă jour Windows non dĂ©sirĂ©e en plein milieu dâune partie de jeu en ligne . đ§š đŁ
On a donc tentĂ© , re-tentĂ© , demandĂ© Ă des IA , implorĂ© les forces cosmiques du codage ⊠et finalement on a bien ri . đ Mais le rire ne remplace pas le sommeil , et lĂ , ce matin , câest le corps qui parle :
đ„Ž "Tâas plus 20 ans mon vieux. T'as codĂ© toute la nuit ? Tâen paies le prix fort . Genoux qui grincent , yeux qui piquent , et le cerveau qui rame plus quâun vieux PC sous Windows 98 . "
Mais malgré tout ça ⊠aucun regret !
Parce que parfois , perdre un peu de sommeil pour apprendre , Ă©chouer , rigoler et repousser ses limites , câest ce qui rend cette aventure sur Hive encore plus cool . đ đ
Et toi , tu dors parfois , ou tâas fusionnĂ© avec ton clavier ? đ
Pour @itharagaian
Voici ce que sa nous a donner cette nuit :
Mais hive keychain veux pas ce lancer .
Hive Transfer Tool
Compte: @hive-103505
<div class="balance-display">
<p>Solde HIVE: <span id="hiveBalance">Chargement...</span></p>
<p>Solde HBD: <span id="hbdBalance">Chargement...</span></p>
</div>
<button id="refreshBalance">Actualiser les soldes</button>
<div id="balanceStatus" class="status-message"></div>
</div>
<div class="container">
<h2>Configuration des transferts</h2>
<div class="token-selector">
<button id="hiveBtn" class="token-btn active">Utiliser HIVE</button>
<button id="hbdBtn" class="token-btn">Utiliser HBD</button>
</div>
<label for="amount">Montant total à transférer:</label>
<input type="number" id="amount" step="0.001" min="0" placeholder="Entrez le montant">
<div class="transfer-list">
<h3>Répartition automatique:</h3>
<div class="transfer-item"><span>@invest-time</span><span>5%</span></div>
<div class="transfer-item"><span>@token-thx</span><span>10%</span></div>
<div class="transfer-item"><span>@gestion.alive</span><span>10%</span></div>
<div class="transfer-item"><span>@hive103505.fun</span><span>10%</span></div>
<div class="transfer-item"><span>@vote-com</span><span>55%</span></div>
</div>
<button id="executeTransfer" disabled>Exécuter le transfert</button>
<div id="transferStatus" class="status-message"></div>
<div id="jsonResult">Les détails du transfert apparaßtront ici...</div>
</div>
<script>
// Configuration
const ACCOUNT = 'hive-103505';
const DESTINATIONS = [
{ account: 'invest-time', percentage: 0.05 },
{ account: 'token-thx', percentage: 0.10 },
{ account: 'gestion.alive', percentage: 0.10 },
{ account: 'hive103505.fun', percentage: 0.10 },
{ account: 'vote-com', percentage: 0.55 }
];
// ĂlĂ©ments DOM
const hiveBalanceEl = document.getElementById('hiveBalance');
const hbdBalanceEl = document.getElementById('hbdBalance');
const refreshBalanceBtn = document.getElementById('refreshBalance');
const balanceStatusEl = document.getElementById('balanceStatus');
const hiveBtn = document.getElementById('hiveBtn');
const hbdBtn = document.getElementById('hbdBtn');
const amountInput = document.getElementById('amount');
const executeTransferBtn = document.getElementById('executeTransfer');
const transferStatusEl = document.getElementById('transferStatus');
const jsonResultEl = document.getElementById('jsonResult');
// Variables d'état
let currentToken = 'HIVE';
let hiveBalance = 0;
let hbdBalance = 0;
let keychainReady = false;
// Initialisation
document.addEventListener('DOMContentLoaded', () => {
setupEventListeners();
checkKeychain();
loadBalances();
});
function setupEventListeners() {
refreshBalanceBtn.addEventListener('click', loadBalances);
hiveBtn.addEventListener('click', () => switchToken('HIVE'));
hbdBtn.addEventListener('click', () => switchToken('HBD'));
executeTransferBtn.addEventListener('click', executeTransfer);
amountInput.addEventListener('input', validateAmount);
}
function switchToken(token) {
currentToken = token;
hiveBtn.classList.toggle('active', token === 'HIVE');
hbdBtn.classList.toggle('active', token === 'HBD');
updateAmountPlaceholder();
validateAmount();
}
function updateAmountPlaceholder() {
const maxAmount = currentToken === 'HIVE' ? hiveBalance : hbdBalance;
amountInput.placeholder = `Maximum: ${maxAmount.toFixed(3)} ${currentToken}`;
amountInput.max = maxAmount;
}
function validateAmount() {
const amount = parseFloat(amountInput.value);
const maxAmount = currentToken === 'HIVE' ? hiveBalance : hbdBalance;
if (isNaN(amount) || amount <= 0 || amount > maxAmount) {
executeTransferBtn.disabled = true;
} else {
executeTransferBtn.disabled = !keychainReady;
}
}
function checkKeychain() {
if (typeof hive_keychain !== 'undefined') {
keychainReady = true;
executeTransferBtn.disabled = false;
} else {
transferStatusEl.innerHTML = `
<div class="error">
<strong>Hive Keychain non détecté!</strong><br>
L'extension est requise pour signer les transactions.<br>
<a href="https://chrome.google.com/webstore/detail/hive-keychain/jhgnkgkahckokgpeimmhlmkonjbkepgkb" target="_blank">Installer Hive Keychain</a>
</div>
`;
keychainReady = false;
executeTransferBtn.disabled = true;
}
}
async function loadBalances() {
balanceStatusEl.textContent = "Chargement des soldes...";
balanceStatusEl.className = "status-message";
try {
const balances = await getBalancesFromApi();
if (balances) {
hiveBalance = parseFloat(balances.HIVE.split(' ')[0]);
hbdBalance = parseFloat(balances.HBD.split(' ')[0]);
hiveBalanceEl.textContent = hiveBalance.toFixed(3) + ' HIVE';
hbdBalanceEl.textContent = hbdBalance.toFixed(3) + ' HBD';
updateAmountPlaceholder();
validateAmount();
balanceStatusEl.textContent = "Soldes actualisés avec succÚs";
balanceStatusEl.className = "status-message success";
}
} catch (error) {
console.error('Error:', error);
balanceStatusEl.textContent = `Erreur: ${error.message || "Impossible de charger les soldes"}`;
balanceStatusEl.className = "status-message error";
}
}
async function getBalancesFromApi() {
try {
const response = await fetch('https://api.hive.blog', {
method: 'POST',
body: JSON.stringify({
jsonrpc: "2.0",
method: "condenser_api.get_accounts",
params: [[ACCOUNT]],
id: 1
}),
headers: { 'Content-Type': 'application/json' }
});
const data = await response.json();
if (data.result && data.result[0]) {
return {
HIVE: data.result[0].balance,
HBD: data.result[0].hbd_balance
};
}
throw new Error("Réponse API invalide");
} catch (error) {
throw new Error("API Hive indisponible");
}
}
function executeTransfer() {
if (!keychainReady) {
transferStatusEl.innerHTML = '<div class="error">Hive Keychain non disponible</div>';
return;
}
const amount = parseFloat(amountInput.value);
if (isNaN(amount) || amount <= 0) {
transferStatusEl.innerHTML = '<div class="error">Veuillez entrer un montant valide</div>';
return;
}
const maxAmount = currentToken === 'HIVE' ? hiveBalance : hbdBalance;
if (amount > maxAmount) {
transferStatusEl.innerHTML = `<div class="error">Montant trop élevé. Solde disponible: ${maxAmount.toFixed(3)} ${currentToken}</div>`;
return;
}
// Préparer les transferts
const transfers = DESTINATIONS.map(dest => {
const transferAmount = (amount * dest.percentage).toFixed(3);
return {
to: dest.account,
amount: `${transferAmount} ${currentToken}`,
memo: ''
};
});
// Préparer la customJson
const customJson = JSON.stringify({
contractName: 'tokens',
contractAction: 'transfer',
contractPayload: {
transfers: transfers
}
});
// Afficher les détails
jsonResultEl.innerHTML = `
<strong>Détails du transfert:</strong><br>
<pre>${JSON.stringify({
from: ACCOUNT,
token: currentToken,
totalAmount: amount.toFixed(3),
transfers: transfers
}, null, 2)}</pre>
<p>Hive Keychain va s'ouvrir pour signer la transaction...</p>
`;
// Désactiver le bouton pendant le traitement
executeTransferBtn.disabled = true;
executeTransferBtn.innerHTML = '<span class="loading"></span> Traitement en cours...';
transferStatusEl.innerHTML = '<div>Préparation de la transaction...</div>';
// Envoyer la transaction via Hive Keychain
hive_keychain.requestCustomJson(
ACCOUNT,
'ssc-mainnet-hive', // ID de la chaĂźne
'Posting', // Permissions requises
customJson,
'Transfert multiple', // Message de confirmation
function(response) {
if (response.success) {
transferStatusEl.innerHTML = `
<div class="success">
Transfert réussi!<br>
Transaction ID: ${response.result.id}
</div>
`;
jsonResultEl.innerHTML += `
<div class="success" style="margin-top: 10px; padding: 10px;">
<strong>Transaction confirmée:</strong><br>
ID: ${response.result.id}<br>
Block: ${response.result.block_num}
</div>
`;
} else {
transferStatusEl.innerHTML = `
<div class="error">
Erreur lors du transfert: ${response.message}
</div>
`;
}
// Réactiver le bouton
executeTransferBtn.disabled = false;
executeTransferBtn.textContent = 'Exécuter le transfert';
// Actualiser les soldes aprĂšs 3 secondes
setTimeout(loadBalances, 3000);
}
);
}
</script>