send-crypto
Version:
A minimal JavaScript library / wallet for sending crypto assets
55 lines • 5.84 kB
JavaScript
import BigNumber from "bignumber.js";
import * as bitcoin from "bitgo-utxo-lib";
const buildUTXO = async (network, privateKey, changeAddress, toAddress, valueIn, utxos, options) => {
const fees = new BigNumber(options && options.fee !== undefined ? options.fee : 10000);
const value = options && options.subtractFee ? valueIn.minus(fees) : valueIn;
if (value.lt(0)) {
throw new Error(`Unable to include fee in value, fee exceeds value (${fees.toFixed()} > ${valueIn.toFixed()})`);
}
const tx = new bitcoin.TransactionBuilder(network);
if (options && options.version) {
tx.setVersion(options.version);
}
if (options && options.versionGroupID) {
tx.setVersionGroupId(options.versionGroupID);
}
if (options && options.expiryHeight) {
tx.setExpiryHeight(options.expiryHeight);
}
if (options && options.lockTime) {
tx.setLockTime(options.lockTime);
}
if (options && options.consensusBranchId) {
tx.setConsensusBranchId(options.consensusBranchId);
}
// Only use the required utxos
const [usedUTXOs, sum] = utxos.reduce(([utxoAcc, total], utxo) => total.lt(value.plus(fees))
? [[...utxoAcc, utxo], total.plus(utxo.amount)]
: [utxoAcc, total], [[], new BigNumber(0)]);
if (sum.lt(value.plus(fees))) {
throw new Error("Insufficient balance to broadcast transaction");
}
// Add all inputs
usedUTXOs.map((utxo) => {
tx.addInput(utxo.txHash, utxo.vOut);
});
const change = sum.minus(value).minus(fees);
// Add outputs
tx.addOutput(toAddress, value.toNumber());
if (change.gt(0)) {
tx.addOutput(changeAddress, change.toNumber());
}
// Sign inputs
usedUTXOs.map((utxo, i) => {
tx.sign(i, privateKey, null, options && options.signFlag !== undefined ? options.signFlag : null, utxo.amount);
});
return tx.build();
};
const loadPrivateKey = (network, privateKey) => {
return bitcoin.ECPair.fromPrivateKeyBuffer(Buffer.from(privateKey, "hex"), network);
};
export const BitgoUTXOLib = {
buildUTXO,
loadPrivateKey,
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0Z29VdHhvTGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi9saWJyYXJpZXMvYml0Z29VdHhvTGliLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sU0FBUyxNQUFNLGNBQWMsQ0FBQztBQUNyQyxPQUFPLEtBQUssT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBSTFDLE1BQU0sU0FBUyxHQUFHLEtBQUssRUFDbkIsT0FBd0MsRUFDeEMsVUFBZSxFQUNmLGFBQXFCLEVBQ3JCLFNBQWlCLEVBQ2pCLE9BQWtCLEVBQ2xCLEtBQWEsRUFDYixPQVNDLEVBQytCLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxTQUFTLENBQ3RCLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUM3RCxDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQ1AsT0FBTyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNuRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDYixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRCxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQ2pHLENBQUM7S0FDTDtJQUVELE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7UUFDNUIsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbEM7SUFDRCxJQUFJLE9BQU8sSUFBSSxPQUFP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