mirror of https://github.com/lukechilds/Agama.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.8 KiB
86 lines
2.8 KiB
const bitcoinJSForks = require('bitcoinforksjs-lib');
|
|
const bitcoinZcash = require('bitcoinjs-lib-zcash');
|
|
const bitcoinPos = require('bitcoinjs-lib-pos');
|
|
|
|
module.exports = (shepherd) => {
|
|
// utxo split 1 -> 1, multiple outputs
|
|
shepherd.post('/electrum/createrawtx-split', (req, res, next) => {
|
|
if (shepherd.checkToken(req.body.token)) {
|
|
const wif = req.body.payload.wif;
|
|
const utxo = req.body.payload.utxo;
|
|
const targets = req.body.payload.targets;
|
|
const network = req.body.payload.network;
|
|
const change = req.body.payload.change;
|
|
const outputAddress = req.body.payload.outputAddress;
|
|
const changeAddress = req.body.payload.changeAddress;
|
|
|
|
let key = shepherd.isZcash(network) ? bitcoinZcash.ECPair.fromWIF(wif, shepherd.getNetworkData(network)) : shepherd.bitcoinJS.ECPair.fromWIF(wif, shepherd.getNetworkData(network));
|
|
let tx;
|
|
|
|
if (shepherd.isZcash(network)) {
|
|
tx = new bitcoinZcash.TransactionBuilder(shepherd.getNetworkData(network));
|
|
} else if (shepherd.isPos(network)) {
|
|
tx = new bitcoinPos.TransactionBuilder(shepherd.getNetworkData(network));
|
|
} else {
|
|
tx = new shepherd.bitcoinJS.TransactionBuilder(shepherd.getNetworkData(network));
|
|
}
|
|
|
|
shepherd.log('buildSignedTx', true);
|
|
shepherd.log(`buildSignedTx pub key ${key.getAddress().toString()}`, true);
|
|
|
|
for (let i = 0; i < utxo.length; i++) {
|
|
tx.addInput(utxo[i].txid, utxo[i].vout);
|
|
}
|
|
|
|
for (let i = 0; i < targets.length; i++) {
|
|
if (shepherd.isPos(network)) {
|
|
tx.addOutput(outputAddress, Number(targets[i]), shepherd.getNetworkData(network));
|
|
} else {
|
|
tx.addOutput(outputAddress, Number(targets[i]));
|
|
}
|
|
}
|
|
|
|
if (Number(change) > 0) {
|
|
if (shepherd.isPos(network)) {
|
|
tx.addOutput(changeAddress, Number(change), shepherd.getNetworkData(network));
|
|
} else {
|
|
shepherd.log(`change ${change}`, true);
|
|
tx.addOutput(changeAddress, Number(change));
|
|
}
|
|
}
|
|
|
|
if (network === 'komodo' ||
|
|
network === 'KMD') {
|
|
const _locktime = Math.floor(Date.now() / 1000) - 777;
|
|
tx.setLockTime(_locktime);
|
|
shepherd.log(`kmd tx locktime set to ${_locktime}`, true);
|
|
}
|
|
|
|
for (let i = 0; i < utxo.length; i++) {
|
|
if (shepherd.isPos(network)) {
|
|
tx.sign(shepherd.getNetworkData(network), i, key);
|
|
} else {
|
|
tx.sign(i, key);
|
|
}
|
|
}
|
|
|
|
const rawtx = tx.build().toHex();
|
|
|
|
const successObj = {
|
|
msg: 'success',
|
|
result: rawtx,
|
|
};
|
|
|
|
res.end(JSON.stringify(successObj));
|
|
} else {
|
|
const errorObj = {
|
|
msg: 'error',
|
|
result: 'unauthorized access',
|
|
};
|
|
|
|
res.end(JSON.stringify(errorObj));
|
|
}
|
|
});
|
|
|
|
return shepherd;
|
|
};
|