#!/usr/bin/env node // Sendet SOL aus Kiels Wallet. Aufruf: node send-sol.js // Sicherung: verlangt explizites --ja, druckt vorher Betrag+Ziel+Restguthaben. const { loadWallet } = require('./solana-wallet'); (async () => { const [dest, amountStr, flag] = process.argv.slice(2); if (!dest || !amountStr) { console.error('Aufruf: node send-sol.js --ja'); process.exit(1); } const sol = Number(amountStr); if (!(sol > 0 && sol < 10)) { console.error('Unplausibler Betrag:', amountStr); process.exit(1); } const lamports = BigInt(Math.round(sol * 1e9)); const kit = require('@solana/kit'); const system = require('@solana-program/system'); const rpc = kit.createSolanaRpc('https://api.mainnet-beta.solana.com'); const { signer } = await loadWallet(); const { value: balance } = await rpc.getBalance(signer.address).send(); console.log('Von:', signer.address); console.log('An: ', dest); console.log('Betrag:', sol, 'SOL =', lamports.toString(), 'Lamports; Guthaben:', Number(balance) / 1e9, 'SOL'); if (balance < lamports + 10000n) { console.error('Guthaben reicht nicht (inkl. ~10k Lamports Fee).'); process.exit(1); } if (flag !== '--ja') { console.error('Trockenlauf. Mit --ja wird gesendet.'); process.exit(0); } const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); const ix = system.getTransferSolInstruction({ source: signer, destination: kit.address(dest), amount: kit.lamports(lamports), }); const msg = kit.pipe( kit.createTransactionMessage({ version: 0 }), (m) => kit.setTransactionMessageFeePayerSigner(signer, m), (m) => kit.setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), (m) => kit.appendTransactionMessageInstruction(ix, m), ); const signed = await kit.signTransactionMessageWithSigners(msg); const sig = kit.getSignatureFromTransaction(signed); console.log('Signatur:', sig); const send = kit.sendTransactionWithoutConfirmingFactory({ rpc }); await send(signed, { commitment: 'confirmed', skipPreflight: false }); console.log('Gesendet. Warte auf Bestaetigung...'); for (let i = 0; i < 30; i++) { await new Promise((r) => setTimeout(r, 2000)); const { value } = await rpc.getSignatureStatuses([sig]).send(); const st = value[0]; if (st && (st.confirmationStatus === 'confirmed' || st.confirmationStatus === 'finalized')) { console.log('BESTAETIGT:', st.confirmationStatus, st.err ? 'ERR ' + JSON.stringify(st.err) : 'ok'); process.exit(st.err ? 1 : 0); } } console.log('Keine Bestaetigung nach 60s — Signatur oben manuell pruefen.'); process.exit(1); })().catch((e) => { console.error('FEHLER:', e.message || e); process.exit(1); });