diff --git a/lib/model/index.js b/lib/model/index.js index da25d4d..747d73a 100644 --- a/lib/model/index.js +++ b/lib/model/index.js @@ -3,6 +3,7 @@ var Model = {}; Model.Wallet = require('./wallet'); Model.Copayer = require('./copayer'); Model.TxProposalLegacy = require('./txproposal_legacy'); +Model.TxProposal = require('./txproposal'); Model.Address = require('./address'); Model.Notification = require('./notification'); Model.Preferences = require('./preferences'); diff --git a/lib/model/txproposalv3.js b/lib/model/txproposal.js similarity index 81% rename from lib/model/txproposalv3.js rename to lib/model/txproposal.js index a9766c8..a81d7e9 100644 --- a/lib/model/txproposalv3.js +++ b/lib/model/txproposal.js @@ -15,39 +15,39 @@ var Defaults = Common.Defaults; var TxProposalAction = require('./txproposalaction'); -function TxProposalv3() {}; +function TxProposal() {}; -TxProposalv3.Types = { +TxProposal.Types = { STANDARD: 'standard', EXTERNAL: 'external' }; -TxProposalv3.isTypeSupported = function(type) { - return _.contains(_.values(TxProposalv3.Types), type); +TxProposal.isTypeSupported = function(type) { + return _.contains(_.values(TxProposal.Types), type); }; -TxProposalv3._create = {}; +TxProposal._create = {}; -TxProposalv3._create.standard = function(txp, opts) { +TxProposal._create.standard = function(txp, opts) { txp.outputs = _.map(opts.outputs, function(output) { return _.pick(output, ['amount', 'toAddress', 'message']); }); txp.outputOrder = _.shuffle(_.range(txp.outputs.length + 1)); }; -TxProposalv3._create.external = function(txp, opts) { +TxProposal._create.external = function(txp, opts) { txp.setInputs(opts.inputs || []); txp.outputs = opts.outputs; txp.outputOrder = _.range(txp.outputs.length + 1); }; -TxProposalv3.create = function(opts) { +TxProposal.create = function(opts) { opts = opts || {}; - var x = new TxProposalv3(); + var x = new TxProposal(); x.version = 3; - x.type = opts.type || TxProposalv3.Types.STANDARD; + x.type = opts.type || TxProposal.Types.STANDARD; var now = Date.now(); x.createdOn = Math.floor(now / 1000); @@ -73,8 +73,8 @@ TxProposalv3.create = function(opts) { x.customData = opts.customData; - if (_.isFunction(TxProposalv3._create[x.type])) { - TxProposalv3._create[x.type](x, opts); + if (_.isFunction(TxProposal._create[x.type])) { + TxProposal._create[x.type](x, opts); } x.amount = x.getTotalAmount(); @@ -86,8 +86,8 @@ TxProposalv3.create = function(opts) { return x; }; -TxProposalv3.fromObj = function(obj) { - var x = new TxProposalv3(); +TxProposal.fromObj = function(obj) { + var x = new TxProposal(); x.version = obj.version; x.type = obj.type; @@ -126,19 +126,19 @@ TxProposalv3.fromObj = function(obj) { return x; }; -TxProposalv3.prototype.toObject = function() { +TxProposal.prototype.toObject = function() { var x = _.cloneDeep(this); x.isPending = this.isPending(); x.isTemporary = this.isTemporary(); return x; }; -TxProposalv3.prototype.setInputs = function(inputs) { +TxProposal.prototype.setInputs = function(inputs) { this.inputs = inputs; this.inputPaths = _.pluck(inputs, 'path'); }; -TxProposalv3.prototype._updateStatus = function() { +TxProposal.prototype._updateStatus = function() { if (this.status != 'pending') return; if (this.isRejected()) { @@ -148,7 +148,7 @@ TxProposalv3.prototype._updateStatus = function() { } }; -TxProposalv3.prototype._buildTx = function() { +TxProposal.prototype._buildTx = function() { var self = this; var t = new Bitcore.Transaction(); @@ -208,7 +208,7 @@ TxProposalv3.prototype._buildTx = function() { }; -TxProposalv3.prototype._getCurrentSignatures = function() { +TxProposal.prototype._getCurrentSignatures = function() { var acceptedActions = _.filter(this.actions, { type: 'accept' }); @@ -221,7 +221,7 @@ TxProposalv3.prototype._getCurrentSignatures = function() { }); }; -TxProposalv3.prototype.getBitcoreTx = function() { +TxProposal.prototype.getBitcoreTx = function() { var self = this; var t = this._buildTx(); @@ -234,13 +234,13 @@ TxProposalv3.prototype.getBitcoreTx = function() { return t; }; -TxProposalv3.prototype.getRawTx = function() { +TxProposal.prototype.getRawTx = function() { var t = this.getBitcoreTx(); return t.uncheckedSerialize(); }; -TxProposalv3.prototype.getEstimatedSize = function() { +TxProposal.prototype.getEstimatedSize = function() { // Note: found empirically based on all multisig P2SH inputs and within m & n allowed limits. var safetyMargin = 0.05; var walletM = this.requiredSignatures; @@ -256,7 +256,7 @@ TxProposalv3.prototype.getEstimatedSize = function() { return parseInt((size * (1 + safetyMargin)).toFixed(0)); }; -TxProposalv3.prototype.estimateFee = function() { +TxProposal.prototype.estimateFee = function() { var fee = this.feePerKb * this.getEstimatedSize() / 1000; this.fee = parseInt(fee.toFixed(0)); }; @@ -266,7 +266,7 @@ TxProposalv3.prototype.estimateFee = function() { * * @return {Number} total amount of all outputs excluding change output */ -TxProposalv3.prototype.getTotalAmount = function() { +TxProposal.prototype.getTotalAmount = function() { return _.sum(this.outputs, 'amount'); }; @@ -275,7 +275,7 @@ TxProposalv3.prototype.getTotalAmount = function() { * * @return {String[]} copayerIds that performed actions in this proposal (accept / reject) */ -TxProposalv3.prototype.getActors = function() { +TxProposal.prototype.getActors = function() { return _.pluck(this.actions, 'copayerId'); }; @@ -285,7 +285,7 @@ TxProposalv3.prototype.getActors = function() { * * @return {String[]} copayerIds that approved the tx proposal (accept) */ -TxProposalv3.prototype.getApprovers = function() { +TxProposal.prototype.getApprovers = function() { return _.pluck( _.filter(this.actions, { type: 'accept' @@ -298,13 +298,13 @@ TxProposalv3.prototype.getApprovers = function() { * @param {String} copayerId * @return {Object} type / createdOn */ -TxProposalv3.prototype.getActionBy = function(copayerId) { +TxProposal.prototype.getActionBy = function(copayerId) { return _.find(this.actions, { copayerId: copayerId }); }; -TxProposalv3.prototype.addAction = function(copayerId, type, comment, signatures, xpub) { +TxProposal.prototype.addAction = function(copayerId, type, comment, signatures, xpub) { var action = TxProposalAction.create({ copayerId: copayerId, type: type, @@ -316,7 +316,7 @@ TxProposalv3.prototype.addAction = function(copayerId, type, comment, signatures this._updateStatus(); }; -TxProposalv3.prototype._addSignaturesToBitcoreTx = function(tx, signatures, xpub) { +TxProposal.prototype._addSignaturesToBitcoreTx = function(tx, signatures, xpub) { var self = this; if (signatures.length != this.inputs.length) @@ -346,7 +346,7 @@ TxProposalv3.prototype._addSignaturesToBitcoreTx = function(tx, signatures, xpub }; -TxProposalv3.prototype.sign = function(copayerId, signatures, xpub) { +TxProposal.prototype.sign = function(copayerId, signatures, xpub) { try { // Tests signatures are OK var tx = this.getBitcoreTx(); @@ -366,36 +366,36 @@ TxProposalv3.prototype.sign = function(copayerId, signatures, xpub) { } }; -TxProposalv3.prototype.reject = function(copayerId, reason) { +TxProposal.prototype.reject = function(copayerId, reason) { this.addAction(copayerId, 'reject', reason); }; -TxProposalv3.prototype.isTemporary = function() { +TxProposal.prototype.isTemporary = function() { return this.status == 'temporary'; }; -TxProposalv3.prototype.isPending = function() { +TxProposal.prototype.isPending = function() { return !_.contains(['broadcasted', 'rejected'], this.status); }; -TxProposalv3.prototype.isAccepted = function() { +TxProposal.prototype.isAccepted = function() { var votes = _.countBy(this.actions, 'type'); return votes['accept'] >= this.requiredSignatures; }; -TxProposalv3.prototype.isRejected = function() { +TxProposal.prototype.isRejected = function() { var votes = _.countBy(this.actions, 'type'); return votes['reject'] >= this.requiredRejections; }; -TxProposalv3.prototype.isBroadcasted = function() { +TxProposal.prototype.isBroadcasted = function() { return this.status == 'broadcasted'; }; -TxProposalv3.prototype.setBroadcasted = function() { +TxProposal.prototype.setBroadcasted = function() { $.checkState(this.txid); this.status = 'broadcasted'; this.broadcastedOn = Math.floor(Date.now() / 1000); }; -module.exports = TxProposalv3; +module.exports = TxProposal; diff --git a/test/models/txproposalv3.js b/test/models/txproposal.js similarity index 98% rename from test/models/txproposalv3.js rename to test/models/txproposal.js index 22f7bd9..ea6627f 100644 --- a/test/models/txproposalv3.js +++ b/test/models/txproposal.js @@ -4,10 +4,10 @@ var _ = require('lodash'); var chai = require('chai'); var sinon = require('sinon'); var should = chai.should(); -var TxProposal = require('../../lib/model/txproposalv3'); +var TxProposal = require('../../lib/model/txproposal'); var Bitcore = require('bitcore-lib'); -describe('TxProposal v3', function() { +describe('TxProposal', function() { describe('#create', function() { it('should create a TxProposal', function() { var txp = TxProposal.create(aTxpOpts()); diff --git a/test/models/txproposal_legacy.js b/test/models/txproposal_legacy.js index a4d5779..2f1eda7 100644 --- a/test/models/txproposal_legacy.js +++ b/test/models/txproposal_legacy.js @@ -7,7 +7,7 @@ var should = chai.should(); var TxProposal = require('../../lib/model/txproposal_legacy'); var Bitcore = require('bitcore-lib'); -describe('TXProposal', function() { +describe('TXProposal legacy', function() { describe('#create', function() { it('should create a TxProposal', function() {