Skip to content

Instantly share code, notes, and snippets.

@kungfuant
Created December 3, 2014 16:07
Show Gist options
  • Save kungfuant/c8a858957ef5144e9e20 to your computer and use it in GitHub Desktop.
Save kungfuant/c8a858957ef5144e9e20 to your computer and use it in GitHub Desktop.
Consolidate dogecoin dust
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