Support spending wallets with multiple UTXOs

master
Skylar Ittner 2 years ago
parent 0ec764142c
commit 9ddda9b565

@ -41,15 +41,33 @@ function scanPrivateKeyQrCode(callback) {
* @param {type} privateKeyString Private key from wallet QR code
* @param {type} sourceAddress Sender's wallet address
* @param {type} destinationAddress Recipient's wallet address
* @param {Array} utxos Unspent transaction inputs, as array. See createUtxo()
* @param {type} outputSatoshis Amount to send to recipient's wallet
* @returns {string} Hex of serialized transaction, suitable for broadcast via Bitcoin Core or an API.
*/
function createSignedTransaction(bitcoreLib, privateKeyString, sourceAddress, destinationAddress, utxos, outputSatoshis) {
var privateKey = new bitcoreLib.PrivateKey(privateKeyString);
var transaction = new bitcoreLib.Transaction()
.from(utxos)
.to(destinationAddress, outputSatoshis)
.change(sourceAddress)
.sign(privateKey);
return transaction.serialize();
}
/**
* Create a UTXO.
*
* @param {type} sourceAddress Sender's wallet address
* @param {type} txHash From UXTO (unspent output)
* @param {type} txOutputIndex From UXTO (unspent output)
* @param {type} script From UXTO (unspent output)
* @param {type} inputSatoshis From UXTO (unspent output)
* @param {type} outputSatoshis Amount to send to recipient's wallet
* @returns {string} Hex of serialized transaction, suitable for broadcast via Bitcoin Core or an API.
* @returns {createUtxo.utxo}
*/
function createSignedTransaction(bitcoreLib, privateKeyString, sourceAddress, destinationAddress, txHash, txOutputIndex, script, inputSatoshis, outputSatoshis) {
var privateKey = new bitcoreLib.PrivateKey(privateKeyString);
function createUtxo(sourceAddress, txHash, txOutputIndex, script, inputSatoshis) {
var utxo = {
"txId": txHash,
"outputIndex": txOutputIndex,
@ -57,14 +75,7 @@ function createSignedTransaction(bitcoreLib, privateKeyString, sourceAddress, de
"script": script,
"satoshis": inputSatoshis
};
var transaction = new bitcoreLib.Transaction()
.from(utxo)
.to(destinationAddress, outputSatoshis)
.change(sourceAddress)
.sign(privateKey);
return transaction.serialize();
return utxo;
}
/**
@ -113,10 +124,10 @@ function sendCoins(privatekey, fromaddress, toaddress, amount) {
app.dialog.close();
app.dialog.alert("Your wallet has no available funds (ZERO_LENGTH_UXTO).", "Error");
return;
} else if (success.uxtos.length > 1) {
app.dialog.close();
app.dialog.alert("For technical reasons, your wallet isn't compatible with this app right now. You can still sweep this wallet into an alternative app to spend it. (MULTIPLE_UXTO)", "Error");
return;
}
var utxos = [];
for (var i = 0; i < success.utxos.length; i++) {
utxos.push(createUtxo(fromaddress, success.utxos[i].txHash, success.utxos[i].txOutputIndex, success.utxos[i].script, success.utxos[i].value));
}
var bitcore = null;
var satoshis = amount * 100000000;
@ -132,9 +143,7 @@ function sendCoins(privatekey, fromaddress, toaddress, amount) {
app.dialog.alert("This app version doesn't support " + success.currency + ".", "Error");
return;
}
var txdata = createSignedTransaction(bitcore, privatekey, fromaddress, toaddress,
success.uxtos[0].txHash, success.uxtos[0].txOutputIndex, success.uxtos[0].script,
success.uxtos[0].value, satoshis);
var txdata = createSignedTransaction(bitcore, privatekey, fromaddress, toaddress, utxos, satoshis);
progressdialog.setProgress(75);
progressdialog.setText("Sending payment...");

Loading…
Cancel
Save