Created
December 3, 2014 16:07
-
-
Save kungfuant/c8a858957ef5144e9e20 to your computer and use it in GitHub Desktop.
Consolidate dogecoin dust
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var rpcuser = ''; | |
var rpcpass = ''; | |
// Maximum number of inputs per transaction. | |
var maximumInputs = 32; | |
// Maximum number of transaction to generate; | |
var maximumTransactions = 5; | |
function getfee(inputs) { | |
// Upper bound on the size | |
var size = inputs*150 + 44; | |
// 1 Doge per 64kB | |
return 1e8 * Math.ceil(size / 65536); | |
} | |
var addresses = | |
[ "DANCezooGMEZfDpDQ6PWqcscZHhTmWhbak", | |
"DBoyhUnttXGPQ4Qb7fpaBrthXVuxjtUvp2", | |
"DBoyhacKaaEMQbNQmxVKRyzLM88QJiZsJr", | |
"DBuTTUPdq8BzJcJpEBeJ7puwTjX8xNhJxf", | |
"DCASHPigMuGMZECTgiW7LvTQpfJXmNj3t2", | |
"DFLoPJoYp3jC1MkTi9dGFM1ZnkZeEbGWY2", | |
"DFeETANYcHsuGtJSG54k23aoiWQFfgzmDe", | |
"DFeetiiJcxjTg2uQgqZXTfJWcHaeM17TCT", | |
"DFucKMom1DjT59gMBKNJkukfqb7n1VcoMG", | |
"DJAZZCar9Wx8cVzj6FiKaocQrfBNs7PYMN", | |
"DJiiifokqV8eLkwNmrHsA25qYEcAehzpzS", | |
"DJunkeRZkm7nAcK24B9onNwwZva5QE1HgL", | |
"DPisSMEXhEPrswh6poofqR4468vMABVX8E", | |
"DPpppPADxcz4wzLtnP7u668Bs7D8rAyc9g", | |
"DRoPfeETu4PVk9KLRAk4FTCrwBznXs3nkQ", | |
"DRopASsdoX8Dum4Nisn8Y4NDHnKYHnNpLy", | |
"DSEXpoooDrifUsQvk5f8CCJ3XGs2pfz2kY", | |
"DSExKLaPU1DBqqS3CNVP2s8hJ8M9ETqitf", | |
"DSeXbeggQt4Gt5qPpESp2LFHz5Ex5iZnQa", | |
"DShitkiPTWzmboFDy5BEgwjuX4EJxtMHg9", | |
"DSmuRFQYgTSGxd72tMHvJKVcKP57oRmYVb", | |
"DSoCkCoKCX9AvQMJWujT8TAPEEXtUGhgoA", | |
"DSuCKMuMWFtE5otDjB39AG2UefPN2AAQh4", | |
"DSuCkbAgW56eh1Ly3QKxQXGuqivgG3putA", | |
"DUCKsfUkSbsZiAiDa8eRx7XtUfHaiKAABJ", | |
"DUCkTeeFr51YTLGWbFEzwuaD6huCf3SYHG", | |
"DUUUuCks6U48pF7UPFLxfXh6itYAa2qNd6", | |
"DUUUuyooKsVnvMop2DThFjJX6ybGNxbk3M" | |
]; | |
var async = require('async'); | |
var dogecoin = require('node-dogecoin')({user: rpcuser, pass: rpcpass}); | |
// https://en.bitcoin.it/wiki/Proper_Money_Handling_(JSON-RPC)#ECMAScript | |
function JSONtoAmount(value) { | |
return Math.round(1e8 * value); | |
} | |
// Getting a list of all unspent input for the addresses above. | |
dogecoin.listunspent(1, 1000000, addresses, function(err, unspent) { | |
console.log('Found', unspent.length, 'unspent inputs'); | |
// Number of slices | |
var k = Math.min(maximumTransactions, Math.ceil(unspent.length / maximumInputs)); | |
// Slice size | |
var n = Math.ceil(unspent.length / k); | |
console.log('Creating', k, 'transactions with about', n, 'inputs each'); | |
var tasks = []; | |
for (var i = 0; i < k; ++i) | |
tasks.push(unspent.slice(k*i, k*(i+1))); | |
async.mapLimit(tasks, 4, process, function(err, results) { | |
if (err) { | |
console.error('Error:', err); | |
} else { | |
console.log('Success.'); | |
} | |
}); | |
}); | |
// Creating a transaction for the given unspent inputs. | |
function process(unspent, cb) { | |
var inputs = []; | |
var amount = 0; | |
for (var i = 0; i < unspent.length; ++i) { | |
inputs.push({txid:unspent[i].txid, vout:unspent[i].vout}); | |
amount += JSONtoAmount(unspent[i].amount); | |
} | |
var fee = getfee(inputs.length); | |
dogecoin.getnewaddress(function(err, newAddress) { | |
if (err) return cb(err); | |
var outputs = {}; | |
outputs[newAddress] = (amount - fee)/1e8; | |
console.log('Creating raw transation:'); | |
console.log(' Inputs: ', JSON.stringify(inputs /*, null, ' '*/)); | |
console.log(' Outputs: ', JSON.stringify(outputs /*, null, ' '*/)); | |
dogecoin.createrawtransaction(inputs, outputs, function(err, raw) { | |
if (err) return cb(err); | |
console.log(' Raw: ', raw); | |
dogecoin.signrawtransaction(raw, function(err, signed) { | |
if (err) return cb(err); | |
console.log(' Signed: ', signed.hex); | |
console.log(' Complete:', signed.complete); | |
cb(null, signed); | |
}); | |
}); | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment