merge working!
This commit is contained in:
parent
57a5ca5fa7
commit
233438f899
|
@ -770,20 +770,25 @@ TransactionBuilder.fromObj = function(data) {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
TransactionBuilder._checkMergeability = function(b) {
|
TransactionBuilder.prototype._checkMergeability = function(b) {
|
||||||
|
var self=this;
|
||||||
|
|
||||||
// Builder should have the same params
|
// Builder should have the same params
|
||||||
['valueInSat', 'valueOutSat', 'feeSat', 'remainderSat', 'signhash', 'spendUnconfirmed']
|
['valueInSat', 'valueOutSat', 'feeSat', 'remainderSat', 'signhash', 'spendUnconfirmed']
|
||||||
.forEach(function (k) {
|
.forEach(function (k) {
|
||||||
if (this[k] !== b[k])
|
|
||||||
throw new Error('mismatch at TransactionBuilder match: ' + k);
|
if (self[k].toString() !== b[k].toString()) {
|
||||||
|
throw new Error('mismatch at TransactionBuilder match: '
|
||||||
|
+ k + ': ' + self[k] + ' vs. ' + b[k]);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.hashToScriptMap) {
|
if (self.hashToScriptMap) {
|
||||||
var err = 0;
|
var err = 0;
|
||||||
if(! b.hashToScriptMap) err=1;
|
if(! b.hashToScriptMap) err=1;
|
||||||
Object.keys(this.hashToScriptMap).forEach(function(k) {
|
Object.keys(self.hashToScriptMap).forEach(function(k) {
|
||||||
if (!b.hashToScriptMap[k]) err=1;
|
if (!b.hashToScriptMap[k]) err=1;
|
||||||
if (this.hashToScriptMap[k] !== b.hashToScriptMap[k]) err=1;
|
if (self.hashToScriptMap[k] !== b.hashToScriptMap[k]) err=1;
|
||||||
});
|
});
|
||||||
if (err)
|
if (err)
|
||||||
throw new Error('mismatch at TransactionBuilder hashToScriptMap');
|
throw new Error('mismatch at TransactionBuilder hashToScriptMap');
|
||||||
|
@ -791,7 +796,7 @@ TransactionBuilder._checkMergeability = function(b) {
|
||||||
|
|
||||||
|
|
||||||
var err = 0, i=0;;
|
var err = 0, i=0;;
|
||||||
this.selectedUtxos.forEach(function(u) {
|
self.selectedUtxos.forEach(function(u) {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
var v=b.selectedUtxos[i++];
|
var v=b.selectedUtxos[i++];
|
||||||
if (!v) err=1;
|
if (!v) err=1;
|
||||||
|
@ -807,13 +812,13 @@ TransactionBuilder._checkMergeability = function(b) {
|
||||||
|
|
||||||
|
|
||||||
err = 0; i=0;;
|
err = 0; i=0;;
|
||||||
this.inputMap.forEach(function(u) {
|
self.inputMap.forEach(function(u) {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
var v=b.inputMap[i++];
|
var v=b.inputMap[i++];
|
||||||
if (!v) err=1;
|
if (!v) err=1;
|
||||||
// confirmations could differ
|
// confirmations could differ
|
||||||
['address', 'scriptType', 'scriptPubKey', 'i'].forEach(function(k) {
|
['address', 'scriptType', 'scriptPubKey', 'i'].forEach(function(k) {
|
||||||
if (u[k] !== v[k])
|
if (u[k].toString() !== v[k].toString())
|
||||||
err=k;
|
err=k;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -840,7 +845,10 @@ TransactionBuilder.prototype._mergeInputSig = function(s0buf, s1buf) {
|
||||||
if (l0 && l1 && l0 !== l1)
|
if (l0 && l1 && l0 !== l1)
|
||||||
throw new Error('TX sig types mismatch in merge');
|
throw new Error('TX sig types mismatch in merge');
|
||||||
|
|
||||||
if (l0) {
|
if (!l0 && !l1) return s0buf;
|
||||||
|
if ( l0 && !l1) return s0buf;
|
||||||
|
if (!l0 && l1) return s1buf;
|
||||||
|
|
||||||
// Look for differences.
|
// Look for differences.
|
||||||
for (var i=0; i<l0; i++) {
|
for (var i=0; i<l0; i++) {
|
||||||
if (!this._chunkIsEmpty(s0.chunks[i]))
|
if (!this._chunkIsEmpty(s0.chunks[i]))
|
||||||
|
@ -871,14 +879,10 @@ TransactionBuilder.prototype._mergeInputSig = function(s0buf, s1buf) {
|
||||||
|
|
||||||
for (var i=0; i<diff.length; i++) {
|
for (var i=0; i<diff.length; i++) {
|
||||||
s0.chunks[emptySlots[i]] = diff[i];
|
s0.chunks[emptySlots[i]] = diff[i];
|
||||||
|
this.signaturesAdded++;
|
||||||
}
|
}
|
||||||
s0.updateBuffer();
|
s0.updateBuffer();
|
||||||
return s0.getBuffer();
|
return s0.getBuffer();
|
||||||
}
|
|
||||||
else {
|
|
||||||
return s1.getBuffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -890,6 +894,7 @@ TransactionBuilder.prototype._mergeTx = function(tx) {
|
||||||
if (l !== v1.ins.length)
|
if (l !== v1.ins.length)
|
||||||
throw new Error('TX in length mismatch in merge');
|
throw new Error('TX in length mismatch in merge');
|
||||||
|
|
||||||
|
this.inputsSigned =0;
|
||||||
for(var i=0; i<l; i++) {
|
for(var i=0; i<l; i++) {
|
||||||
var i0 = v0.ins[i];
|
var i0 = v0.ins[i];
|
||||||
var i1 = v1.ins[i];
|
var i1 = v1.ins[i];
|
||||||
|
@ -900,7 +905,9 @@ TransactionBuilder.prototype._mergeTx = function(tx) {
|
||||||
if (buffertools.compare(i0.o,i1.o) !== 0)
|
if (buffertools.compare(i0.o,i1.o) !== 0)
|
||||||
throw new Error('TX .o in mismatch in merge. Input:',i);
|
throw new Error('TX .o in mismatch in merge. Input:',i);
|
||||||
|
|
||||||
i0.s=self._mergeInputSig(i0.s,i1.s);
|
i0.s=this._mergeInputSig(i0.s,i1.s);
|
||||||
|
|
||||||
|
if (v0.isInputComplete(i)) this.inputsSigned++;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -758,6 +758,41 @@ describe('TransactionBuilder', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('#merge p2sh/p2pubkeyhash', function() {
|
||||||
|
var b = getP2shBuilder(1);
|
||||||
|
var k1 = testdata.dataUnspentSign.keyStringsP2sh.slice(0,1);
|
||||||
|
var k2 = testdata.dataUnspentSign.keyStringsP2sh.slice(1,2);
|
||||||
|
var k3 = testdata.dataUnspentSign.keyStringsP2sh.slice(2,3);
|
||||||
|
b.isFullySigned().should.equal(false);
|
||||||
|
b.signaturesAdded.should.equal(0);
|
||||||
|
b.sign(k1);
|
||||||
|
b.signaturesAdded.should.equal(1);
|
||||||
|
b.isFullySigned().should.equal(false);
|
||||||
|
var tx = b.build();
|
||||||
|
tx.isComplete().should.equal(false);
|
||||||
|
|
||||||
|
var b2 = getP2shBuilder(1);
|
||||||
|
b2.sign(k2);
|
||||||
|
b2.signaturesAdded.should.equal(1);
|
||||||
|
b2.merge(b);
|
||||||
|
b2.signaturesAdded.should.equal(2);
|
||||||
|
tx = b2.build();
|
||||||
|
tx.isComplete().should.equal(false);
|
||||||
|
|
||||||
|
var b3 = getP2shBuilder(1);
|
||||||
|
b3.sign(k3);
|
||||||
|
b3.signaturesAdded.should.equal(1);
|
||||||
|
b3.merge(b2);
|
||||||
|
b3.signaturesAdded.should.equal(3);
|
||||||
|
tx = b3.build();
|
||||||
|
tx.isComplete().should.equal(true);
|
||||||
|
|
||||||
|
b2.merge(b3);
|
||||||
|
b2.signaturesAdded.should.equal(3);
|
||||||
|
tx = b2.build();
|
||||||
|
tx.isComplete().should.equal(true);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue