mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-24 23:18:17 +01:00
TradeWalletService: adapt to segwit wallet
This commit is contained in:
parent
0f4c66f43d
commit
25515710ab
1 changed files with 30 additions and 7 deletions
|
@ -36,6 +36,7 @@ import org.bitcoinj.core.AddressFormatException;
|
||||||
import org.bitcoinj.core.Coin;
|
import org.bitcoinj.core.Coin;
|
||||||
import org.bitcoinj.core.ECKey;
|
import org.bitcoinj.core.ECKey;
|
||||||
import org.bitcoinj.core.InsufficientMoneyException;
|
import org.bitcoinj.core.InsufficientMoneyException;
|
||||||
|
import org.bitcoinj.core.LegacyAddress;
|
||||||
import org.bitcoinj.core.NetworkParameters;
|
import org.bitcoinj.core.NetworkParameters;
|
||||||
import org.bitcoinj.core.SegwitAddress;
|
import org.bitcoinj.core.SegwitAddress;
|
||||||
import org.bitcoinj.core.Sha256Hash;
|
import org.bitcoinj.core.Sha256Hash;
|
||||||
|
@ -44,6 +45,7 @@ import org.bitcoinj.core.Transaction;
|
||||||
import org.bitcoinj.core.TransactionInput;
|
import org.bitcoinj.core.TransactionInput;
|
||||||
import org.bitcoinj.core.TransactionOutPoint;
|
import org.bitcoinj.core.TransactionOutPoint;
|
||||||
import org.bitcoinj.core.TransactionOutput;
|
import org.bitcoinj.core.TransactionOutput;
|
||||||
|
import org.bitcoinj.core.TransactionWitness;
|
||||||
import org.bitcoinj.core.Utils;
|
import org.bitcoinj.core.Utils;
|
||||||
import org.bitcoinj.crypto.DeterministicKey;
|
import org.bitcoinj.crypto.DeterministicKey;
|
||||||
import org.bitcoinj.crypto.TransactionSignature;
|
import org.bitcoinj.crypto.TransactionSignature;
|
||||||
|
@ -601,6 +603,9 @@ public class TradeWalletService {
|
||||||
for (int i = 0; i < buyerInputs.size(); i++) {
|
for (int i = 0; i < buyerInputs.size(); i++) {
|
||||||
TransactionInput transactionInput = makersDepositTx.getInputs().get(i);
|
TransactionInput transactionInput = makersDepositTx.getInputs().get(i);
|
||||||
depositTx.addInput(getTransactionInput(depositTx, getMakersScriptSigProgram(transactionInput), buyerInputs.get(i)));
|
depositTx.addInput(getTransactionInput(depositTx, getMakersScriptSigProgram(transactionInput), buyerInputs.get(i)));
|
||||||
|
if (!TransactionWitness.EMPTY.equals(transactionInput.getWitness())) {
|
||||||
|
depositTx.getInput(depositTx.getInputs().size()-1).setWitness(transactionInput.getWitness());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add seller inputs
|
// Add seller inputs
|
||||||
|
@ -665,6 +670,10 @@ public class TradeWalletService {
|
||||||
TransactionInput input = takersDepositTx.getInput(i);
|
TransactionInput input = takersDepositTx.getInput(i);
|
||||||
Script scriptSig = input.getScriptSig();
|
Script scriptSig = input.getScriptSig();
|
||||||
myDepositTx.getInput(i).setScriptSig(scriptSig);
|
myDepositTx.getInput(i).setScriptSig(scriptSig);
|
||||||
|
TransactionWitness witness = input.getWitness();
|
||||||
|
if (!TransactionWitness.EMPTY.equals(witness)) {
|
||||||
|
myDepositTx.getInput(i).setWitness(witness);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WalletService.printTx("sellerAsMakerFinalizesDepositTx", myDepositTx);
|
WalletService.printTx("sellerAsMakerFinalizesDepositTx", myDepositTx);
|
||||||
|
@ -1165,13 +1174,27 @@ public class TradeWalletService {
|
||||||
if (sigKey.isEncrypted()) {
|
if (sigKey.isEncrypted()) {
|
||||||
checkNotNull(aesKey);
|
checkNotNull(aesKey);
|
||||||
}
|
}
|
||||||
Sha256Hash hash = transaction.hashForSignature(inputIndex, scriptPubKey, Transaction.SigHash.ALL, false);
|
|
||||||
ECKey.ECDSASignature signature = sigKey.sign(hash, aesKey);
|
if (ScriptPattern.isP2PK(scriptPubKey) || ScriptPattern.isP2PKH(scriptPubKey)) {
|
||||||
TransactionSignature txSig = new TransactionSignature(signature, Transaction.SigHash.ALL, false);
|
Sha256Hash hash = transaction.hashForSignature(inputIndex, scriptPubKey, Transaction.SigHash.ALL, false);
|
||||||
if (ScriptPattern.isP2PK(scriptPubKey)) {
|
ECKey.ECDSASignature signature = sigKey.sign(hash, aesKey);
|
||||||
input.setScriptSig(ScriptBuilder.createInputScript(txSig));
|
TransactionSignature txSig = new TransactionSignature(signature, Transaction.SigHash.ALL, false);
|
||||||
} else if (ScriptPattern.isP2PKH(scriptPubKey)) {
|
if (ScriptPattern.isP2PK(scriptPubKey)) {
|
||||||
input.setScriptSig(ScriptBuilder.createInputScript(txSig, sigKey));
|
input.setScriptSig(ScriptBuilder.createInputScript(txSig));
|
||||||
|
} else if (ScriptPattern.isP2PKH(scriptPubKey)) {
|
||||||
|
input.setScriptSig(ScriptBuilder.createInputScript(txSig, sigKey));
|
||||||
|
}
|
||||||
|
} else if (ScriptPattern.isP2WPKH(scriptPubKey)) {
|
||||||
|
// TODO: Consider using this alternative way to build the scriptCode (taken from bitcoinj master)
|
||||||
|
// Script scriptCode = ScriptBuilder.createP2PKHOutputScript(sigKey)
|
||||||
|
Script scriptCode = new ScriptBuilder().data(
|
||||||
|
ScriptBuilder.createOutputScript(LegacyAddress.fromKey(transaction.getParams(), sigKey)).getProgram())
|
||||||
|
.build();
|
||||||
|
Coin value = input.getValue();
|
||||||
|
TransactionSignature txSig = transaction.calculateWitnessSignature(inputIndex, sigKey, scriptCode, value,
|
||||||
|
Transaction.SigHash.ALL, false);
|
||||||
|
input.setScriptSig(ScriptBuilder.createEmpty());
|
||||||
|
input.setWitness(TransactionWitness.redeemP2WPKH(txSig, sigKey));
|
||||||
} else {
|
} else {
|
||||||
throw new SigningException("Don't know how to sign for this kind of scriptPubKey: " + scriptPubKey);
|
throw new SigningException("Don't know how to sign for this kind of scriptPubKey: " + scriptPubKey);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue