sendTx sign reject tests
This commit is contained in:
parent
f3a152ca30
commit
36ed3682be
|
@ -54,6 +54,8 @@ Verifier.checkCopayers = function(copayers, walletPrivKey, myXPrivKey, n) {
|
||||||
|
|
||||||
|
|
||||||
Verifier.checkTxProposal = function(data, txp) {
|
Verifier.checkTxProposal = function(data, txp) {
|
||||||
|
$.checkArgument(txp.creatorId);
|
||||||
|
|
||||||
var creatorXPubKey = _.find(data.publicKeyRing, function(xPubKey) {
|
var creatorXPubKey = _.find(data.publicKeyRing, function(xPubKey) {
|
||||||
if (WalletUtils.xPubToCopayerId(xPubKey) === txp.creatorId) return true;
|
if (WalletUtils.xPubToCopayerId(xPubKey) === txp.creatorId) return true;
|
||||||
});
|
});
|
||||||
|
|
|
@ -449,6 +449,7 @@ API.prototype.getTxProposals = function(opts, cb) {
|
||||||
|
|
||||||
API.prototype.signTxProposal = function(txp, cb) {
|
API.prototype.signTxProposal = function(txp, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
$.checkArgument(txp.creatorId);
|
||||||
|
|
||||||
this._loadAndCheck(function(err, data) {
|
this._loadAndCheck(function(err, data) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
|
@ -497,6 +498,7 @@ API.prototype.signTxProposal = function(txp, cb) {
|
||||||
|
|
||||||
API.prototype.rejectTxProposal = function(txp, reason, cb) {
|
API.prototype.rejectTxProposal = function(txp, reason, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
$.checkArgument(cb);
|
||||||
|
|
||||||
this._loadAndCheck(
|
this._loadAndCheck(
|
||||||
function(err, data) {
|
function(err, data) {
|
||||||
|
|
|
@ -780,7 +780,7 @@ CopayServer.prototype.rejectTx = function(opts, cb) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
return cb();
|
return cb(null, txp);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -83,14 +83,14 @@ fsmock._get = function(name) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
var utxos = [];
|
|
||||||
var blockExplorerMock = {};
|
var blockExplorerMock = {};
|
||||||
|
blockExplorerMock.utxos = [];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
blockExplorerMock.getUnspentUtxos = function(dummy, cb) {
|
blockExplorerMock.getUnspentUtxos = function(dummy, cb) {
|
||||||
var ret = _.map(utxos || [], function(x) {
|
var ret = _.map(blockExplorerMock.utxos || [], function(x) {
|
||||||
x.toObject = function() {
|
x.toObject = function() {
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
@ -100,17 +100,23 @@ blockExplorerMock.getUnspentUtxos = function(dummy, cb) {
|
||||||
};
|
};
|
||||||
|
|
||||||
blockExplorerMock.setUtxo = function(address, amount, m) {
|
blockExplorerMock.setUtxo = function(address, amount, m) {
|
||||||
utxos.push({
|
blockExplorerMock.utxos.push({
|
||||||
txid: Bitcore.crypto.Hash.sha256(new Buffer(Math.random() * 100000)).toString('hex'),
|
txid: Bitcore.crypto.Hash.sha256(new Buffer(Math.random() * 100000)).toString('hex'),
|
||||||
vout: Math.floor((Math.random() * 10) + 1),
|
vout: Math.floor((Math.random() * 10) + 1),
|
||||||
amount: amount,
|
amount: amount,
|
||||||
address: address.address,
|
address: address.address,
|
||||||
scriptPubKey: Bitcore.Script.buildMultisigOut(address.publicKeys, m).toScriptHashOut(),
|
scriptPubKey: Bitcore.Script.buildMultisigOut(address.publicKeys, m).toScriptHashOut().toString(),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
blockExplorerMock.broadcast = function(raw, cb) {
|
||||||
|
blockExplorerMock.lastBroadcasted = raw;
|
||||||
|
return cb(null, (new Bitcore.Transaction(raw)).id);
|
||||||
|
};
|
||||||
|
|
||||||
blockExplorerMock.reset = function() {
|
blockExplorerMock.reset = function() {
|
||||||
utxos = [];
|
blockExplorerMock.utxos = [];
|
||||||
};
|
};
|
||||||
|
|
||||||
describe('client API ', function() {
|
describe('client API ', function() {
|
||||||
|
@ -355,15 +361,15 @@ describe('client API ', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
describe.only('Send Transactions', function() {
|
describe('Send Transactions', function() {
|
||||||
it('Send and broadcast in 1-1 wallet', function(done) {
|
it('Send and broadcast in 1-1 wallet', function(done) {
|
||||||
helpers.createAndJoinWallet(clients, 1, 1, function(err, w) {
|
helpers.createAndJoinWallet(clients, 1, 1, function(err, w) {
|
||||||
clients[0].createAddress(function(err, x0) {
|
clients[0].createAddress(function(err, x0) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
should.exist(x0.address);
|
should.exist(x0.address);
|
||||||
blockExplorerMock.setUtxo(x0, 10, 1);
|
blockExplorerMock.setUtxo(x0, 1, 1);
|
||||||
var opts = {
|
var opts = {
|
||||||
amount: 10000,
|
amount: '0.1btc',
|
||||||
toAddress: 'n2TBMPzPECGUfcT2EByiTJ12TPZkhN2mN5',
|
toAddress: 'n2TBMPzPECGUfcT2EByiTJ12TPZkhN2mN5',
|
||||||
message: 'hola 1-1',
|
message: 'hola 1-1',
|
||||||
};
|
};
|
||||||
|
@ -373,8 +379,10 @@ describe('client API ', function() {
|
||||||
x.requiredSignatures.should.equal(1);
|
x.requiredSignatures.should.equal(1);
|
||||||
x.status.should.equal('pending');
|
x.status.should.equal('pending');
|
||||||
x.changeAddress.path.should.equal('m/2147483647/1/0');
|
x.changeAddress.path.should.equal('m/2147483647/1/0');
|
||||||
clients[0].signTxProposal(x.id, function(err, res) {
|
clients[0].signTxProposal(x, function(err, tx) {
|
||||||
should.not.exist(err, err.message);
|
should.not.exist(err);
|
||||||
|
tx.status.should.equal('broadcasted');
|
||||||
|
tx.txid.should.equal((new Bitcore.Transaction(blockExplorerMock.lastBroadcasted)).id);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -397,15 +405,91 @@ describe('client API ', function() {
|
||||||
x.status.should.equal('pending');
|
x.status.should.equal('pending');
|
||||||
x.requiredRejections.should.equal(2);
|
x.requiredRejections.should.equal(2);
|
||||||
x.requiredSignatures.should.equal(2);
|
x.requiredSignatures.should.equal(2);
|
||||||
clients[0].signTxProposal(x.id, function(err, res) {
|
clients[0].signTxProposal(x, function(err, tx) {
|
||||||
should.not.exist(err, err.message);
|
should.not.exist(err, err);
|
||||||
done();
|
tx.status.should.equal('pending');
|
||||||
|
clients[1].signTxProposal(x, function(err, tx) {
|
||||||
|
should.not.exist(err);
|
||||||
|
tx.status.should.equal('broadcasted');
|
||||||
|
tx.txid.should.equal((new Bitcore.Transaction(blockExplorerMock.lastBroadcasted)).id);
|
||||||
|
done();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Send, reject, 2 signs and broadcast in 2-3 wallet', function(done) {
|
||||||
|
helpers.createAndJoinWallet(clients, 2, 3, function(err, w) {
|
||||||
|
clients[0].createAddress(function(err, x0) {
|
||||||
|
should.not.exist(err);
|
||||||
|
should.exist(x0.address);
|
||||||
|
blockExplorerMock.setUtxo(x0, 10, 1);
|
||||||
|
var opts = {
|
||||||
|
amount: 10000,
|
||||||
|
toAddress: 'n2TBMPzPECGUfcT2EByiTJ12TPZkhN2mN5',
|
||||||
|
message: 'hola 1-1',
|
||||||
|
};
|
||||||
|
clients[0].sendTxProposal(opts, function(err, x) {
|
||||||
|
should.not.exist(err);
|
||||||
|
x.status.should.equal('pending');
|
||||||
|
x.requiredRejections.should.equal(2);
|
||||||
|
x.requiredSignatures.should.equal(2);
|
||||||
|
clients[0].rejectTxProposal(x, 'no me gusto', function(err, tx) {
|
||||||
|
should.not.exist(err, err);
|
||||||
|
tx.status.should.equal('pending');
|
||||||
|
clients[1].signTxProposal(x, function(err, tx) {
|
||||||
|
should.not.exist(err);
|
||||||
|
clients[2].signTxProposal(x, function(err, tx) {
|
||||||
|
should.not.exist(err);
|
||||||
|
tx.status.should.equal('broadcasted');
|
||||||
|
tx.txid.should.equal((new Bitcore.Transaction(blockExplorerMock.lastBroadcasted)).id);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Send, reject in 3-4 wallet', function(done) {
|
||||||
|
helpers.createAndJoinWallet(clients, 3, 4, function(err, w) {
|
||||||
|
clients[0].createAddress(function(err, x0) {
|
||||||
|
should.not.exist(err);
|
||||||
|
should.exist(x0.address);
|
||||||
|
blockExplorerMock.setUtxo(x0, 10, 1);
|
||||||
|
var opts = {
|
||||||
|
amount: 10000,
|
||||||
|
toAddress: 'n2TBMPzPECGUfcT2EByiTJ12TPZkhN2mN5',
|
||||||
|
message: 'hola 1-1',
|
||||||
|
};
|
||||||
|
clients[0].sendTxProposal(opts, function(err, x) {
|
||||||
|
should.not.exist(err);
|
||||||
|
x.status.should.equal('pending');
|
||||||
|
x.requiredRejections.should.equal(2);
|
||||||
|
x.requiredSignatures.should.equal(3);
|
||||||
|
|
||||||
|
clients[0].rejectTxProposal(x, 'no me gusto', function(err, tx) {
|
||||||
|
should.not.exist(err, err);
|
||||||
|
tx.status.should.equal('pending');
|
||||||
|
clients[1].signTxProposal(x, function(err, tx) {
|
||||||
|
should.not.exist(err);
|
||||||
|
tx.status.should.equal('pending');
|
||||||
|
clients[2].rejectTxProposal(x, 'tampoco me gusto', function(err, tx) {
|
||||||
|
should.not.exist(err);
|
||||||
|
tx.status.should.equal('rejected');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue