Bitcointalk thread: https://bitcointalk.org/index.php?topic=1122324.0
Once you get the HEX you can manually submit to Eligius: http://eligius.st/~wizkid057/newstats/pushtxn.php
Bitcointalk thread: https://bitcointalk.org/index.php?topic=1122324.0
Once you get the HEX you can manually submit to Eligius: http://eligius.st/~wizkid057/newstats/pushtxn.php
# [rights] Copyright Dan B. (brianddk) 2015 https://github.com/brianddk | |
# [license] Licensed under Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0 | |
# [repo] https://gist.github.com/brianddk/db762a50c6fa5049ff63 | |
# [version] 0.3 | |
# [tips] 18MDTTiqPM8ZEo29Cig1wfGdkLNtvyorW5 | |
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException | |
import argparse | |
import os | |
import os.path | |
import simplejson | |
import getpass | |
from decimal import Decimal, ROUND_DOWN | |
def main(): | |
satPcoin = 100000000 | |
coinPsat = 0.00000001 | |
minTxFee = 1000 | |
(rpcuser, rpcpassword, rpcbind) = parse_conf(args.conf) | |
url='http://%s:%s@%s' % (rpcuser, rpcpassword, rpcbind) | |
btcrpc = AuthServiceProxy(url) | |
uctxo = get_uctxo(btcrpc) | |
fee = (Decimal(args.txfee) / Decimal(satPcoin)) | |
vout = [{'txid': uctxo['txid'], 'vout': uctxo['vout']}] | |
amt = uctxo['amount'] - fee | |
amt = amt.quantize(Decimal(str(coinPsat)), rounding=ROUND_DOWN) | |
sendto = {uctxo['address']: amt} | |
print "\nFROM:" | |
prettyPrint(vout) | |
print "\nTO:" | |
prettyPrint(sendto) | |
print "\nFEE:" | |
prettyPrint({'FeeInBtc': fee}) | |
txhex = btcrpc.createrawtransaction(vout, sendto) | |
passphrase = getpass.getpass("Enter Wallet Passphrase: ") | |
btcrpc.walletpassphrase(passphrase, 1) | |
sigtx = btcrpc.signrawtransaction(txhex) | |
btcrpc.walletlock() | |
dectx = btcrpc.decoderawtransaction(sigtx['hex']) | |
txlen = len(sigtx['hex']) | |
feePkb = 1000 * int(args.txfee) / txlen | |
print "\nTRANSACTION:" | |
prettyPrint(dectx) | |
print "\nHEX:\n%s" % sigtx['hex'] | |
print "\nLEN: %d" % txlen | |
print "\nFEE / KB: %d" % feePkb | |
if feePkb < minTxFee: | |
print "Ohh No... The fee is too small [Err 2]" | |
print "INFO: http://bitcoinexchangerate.org/fees" | |
exit(2) | |
if args.send: | |
btcrpc.sendrawtransaction(sigtx['hex']) | |
def conf_default(): | |
appdata=os.environ["APPDATA"] | |
#return os.path.join(appdata, "Bitcoin", "testnet3", "bitcoin.conf") | |
return os.path.join(appdata, "Bitcoin", "bitcoin.conf") | |
def parse_args(): | |
parser=argparse.ArgumentParser() | |
parser.add_argument("-conf", help="Bitcoin Config file to reference", | |
action="store", type=str, default=conf_default()) | |
parser.add_argument("-txfee", help="TXFEE in satoshi to spend", | |
action="store", type=int, default=111111) | |
parser.add_argument("-uctxo", help="UCTXO index from '-list' to spend", | |
action="store", type=int, default=0) | |
parser.add_argument("-debug", help="Debug run of the script", | |
action="store_true") | |
parser.add_argument("-list", help="List unconf TXOs to choose from", | |
action="store_true") | |
parser.add_argument("-send", help="Send the transaction", | |
action="store_true") | |
return parser.parse_args() | |
def parse_conf(conf_file): | |
conff=open(conf_file, "r") | |
if args.list: print "\nCONFIGURATION:" | |
for line in conff: | |
line=line.strip() | |
if line.startswith("#"): continue | |
if args.list and len(line): print ' ',line | |
if line.startswith("rpcuser="): | |
rpcuser=line[len("rpcuser="):] | |
if line.startswith("rpcpassword="): | |
rpcpassword=line[len("rpcpassword="):] | |
if line.startswith("rpcbind="): | |
rpcbind=line[len("rpcbind="):] | |
conff.close() | |
return (rpcuser, rpcpassword, rpcbind) | |
def prettyPrint(obj): | |
print simplejson.dumps(obj, use_decimal=True, sort_keys=True, indent=4 * ' ') | |
def get_uctxo(btcrpc): | |
uctxos = [] | |
ustxos = btcrpc.listunspent(0) | |
for ustxo in ustxos: | |
if args.debug: | |
if ustxo['confirmations'] == 0: continue #test | |
else: | |
if ustxo['confirmations'] != 0: continue #final | |
uctxos += [ustxo] | |
addr = ustxo['address'] | |
data = btcrpc.validateaddress(addr) | |
if not data.get('ismine'): | |
print "Ohh No... almost sent to wrong address [Err 1]" | |
exit(1) | |
if args.list: | |
i = 0 | |
for uctxo in uctxos: | |
print "\nUCTXO[%d]" % i | |
i += 1 | |
prettyPrint(uctxo) | |
exit() | |
return uctxos[args.uctxo] | |
if __name__ == "__main__": | |
args = parse_args() | |
main() | |