'use strict'; var imports = require('soop').imports(); var bitcore = require('bitcore'); var util = bitcore.util; var Transaction = bitcore.Transaction; var Builder = bitcore.TransactionBuilder; var Script = bitcore.Script; var buffertools = bitcore.buffertools; var Storage = imports.Storage || require('./Storage'); var storage = Storage.default(); function TxProposal(opts) { this.tx = opts.tx; this.seenBy = opts.seenBy || {}; this.signedBy = opts.signedBy || {}; }; module.exports = require('soop')(TxProposal); function TxProposals(opts) { opts = opts || {}; this.walletId = opts.walletId; this.network = opts.networkName === 'livenet' ? bitcore.networks.livenet : bitcore.networks.testnet; this.publicKeyRing = opts.publicKeyRing; this.txps = []; } TxProposals.fromObj = function(o) { var ret = new TxProposals({ networkName: o.networkName, walletId: o.walletId, }); o.txps.forEach(function(t) { var tx = new Transaction; tx.parse(new Buffer(t.txHex,'hex')); ret.txps.push({ seenBy: t.seenBy, signedBy: t.signedBy, tx: tx, }); }); return ret; }; TxProposals.prototype.toObj = function() { var ret = []; this.txps.forEach(function(t) { ret.push({ seenBy: t.seenBy, signedBy: t.signedBy, txHex: t.tx.serialize(), }); }); return { txps: ret, walletId: this.walletId, networkName: this.network.name, }; }; TxProposals.prototype._getNormHash = function(txps) { var ret = {}; txps.forEach(function(txp) { var hash = txp.tx.getNormalizedHash().toString('hex'); ret[hash]=txp; }); return ret; }; TxProposals.prototype._startMerge = function(myTxps, theirTxps) { var fromUs=0, fromTheirs=0, merged =0; var toMerge = {}, ready=[]; Object.keys(theirTxps).forEach(function(hash) { if (!myTxps[hash]) { ready.push(theirTxps[hash]); // only in theirs; fromTheirs++; } else { toMerge[hash]=theirTxps[hash]; // need Merging merged++; } }); Object.keys(myTxps).forEach(function(hash) { if(!toMerge[hash]) { ready.push(myTxps[hash]); // only in myTxps; fromUs++; } }); return { stats: { fromUs: fromUs, fromTheirs: fromTheirs, merged: merged, }, ready: ready, toMerge: toMerge, }; }; TxProposals.prototype._mergeMetadata = function(myTxps, theirTxps, mergeInfo) { var toMerge = mergeInfo.toMerge; Object.keys(toMerge).forEach(function(hash) { var v0 = myTxps[hash]; var v1 = toMerge[hash]; Object.keys(v1.seenBy).forEach(function(k) { v0.seenBy[k] = v1.seenBy[k]; }); Object.keys(v1.signedBy).forEach(function(k) { v0.signedBy[k] = v1.signedBy[k]; }); }); }; TxProposals.prototype._chunkIsEmpty = function(chunk) { return chunk === 0 || // when serializing and back, EMPTY_BUFFER becomes 0 buffertools.compare(chunk, util.EMPTY_BUFFER) === 0; }; // // function d(s,l) { // console.log('DUMP'); //TODO // for (var i=0; i