bsv-sdk
Version:
bsv sdk
316 lines (255 loc) • 10.7 kB
JavaScript
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
import _regeneratorRuntime from "@babel/runtime/regenerator";
function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
import * as bsv from "@sensible-contract/bsv";
import { MetaSVProvider } from "showpay-providers";
import { getTransferNeedUtxosAndFee } from "./utils/Txutils";
var Wallet = /*#__PURE__*/function () {
function Wallet(wif, network, metasvAuth, feeb) {
if (feeb === void 0) {
feeb = 0.5;
}
this.privateKey = bsv.PrivateKey.fromWIF(wif);
this.publicKey = this.privateKey.publicKey;
this.address = this.privateKey.toAddress(network);
this.provider = new MetaSVProvider(network, metasvAuth);
this.feeb = feeb;
}
var _proto = Wallet.prototype;
_proto.transfer = /*#__PURE__*/function () {
var _transfer = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(receivers, broadcast) {
var _this = this;
var balanceResp, addressBalance, totalTransferAmount, _iterator, _step, receiver, utxos, utxosAndFee, fee, tx, _iterator2, _step2, _receiver, utxoTotalAmount, txid, txHex, retUtxos, i, resTxid;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (broadcast === void 0) {
broadcast = true;
}
_context.next = 3;
return this.provider.getBalance(this.address.toString());
case 3:
balanceResp = _context.sent;
addressBalance = balanceResp.balance + balanceResp.pendingBalance;
totalTransferAmount = 0;
for (_iterator = _createForOfIteratorHelperLoose(receivers); !(_step = _iterator()).done;) {
receiver = _step.value;
totalTransferAmount += receiver.amount;
}
if (!(addressBalance < totalTransferAmount)) {
_context.next = 9;
break;
}
throw new Error("Insufficient BSV Balance");
case 9:
_context.next = 11;
return this.getAddressUtxos(this.address.toString());
case 11:
utxos = _context.sent;
utxosAndFee = getTransferNeedUtxosAndFee(receivers, utxos, this.feeb);
utxos = utxosAndFee.utxos;
fee = utxosAndFee.fee;
tx = new bsv.Transaction();
tx.from(utxos.map(function (utxo) {
return {
txId: utxo.txId,
outputIndex: utxo.outputIndex,
satoshis: utxo.satoshis,
script: bsv.Script.buildPublicKeyHashOut(_this.address).toHex()
};
}));
for (_iterator2 = _createForOfIteratorHelperLoose(receivers); !(_step2 = _iterator2()).done;) {
_receiver = _step2.value;
tx.addOutput(new bsv.Transaction.Output({
satoshis: _receiver.amount,
script: bsv.Script.fromAddress(_receiver.address)
}));
}
utxoTotalAmount = 0;
utxos.forEach(function (utxo) {
utxoTotalAmount += utxo.satoshis;
});
if (utxoTotalAmount - fee - totalTransferAmount >= 135) {
tx.addOutput(new bsv.Transaction.Output({
satoshis: utxoTotalAmount - fee - totalTransferAmount,
script: bsv.Script.fromAddress(this.address)
}));
}
tx.fee(fee);
tx.sign(this.privateKey);
txid = tx.id;
txHex = tx.serialize(true);
retUtxos = [];
for (i = 0; i < tx.outputs.length; i++) {
retUtxos.push({
txId: txid,
outputIndex: i,
satoshis: tx.outputs[i].satoshis,
// @ts-ignore
address: bsv.Address.fromScript(tx.outputs[i].script).toString()
});
}
if (!broadcast) {
_context.next = 33;
break;
}
_context.next = 30;
return this.provider.broadcast(txHex);
case 30:
resTxid = _context.sent;
if (resTxid) {
_context.next = 33;
break;
}
throw new Error("broadcast error");
case 33:
return _context.abrupt("return", {
txid: txid,
txHex: txHex,
utxos: retUtxos
});
case 34:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function transfer(_x, _x2) {
return _transfer.apply(this, arguments);
}
return transfer;
}();
_proto.transferAll = /*#__PURE__*/function () {
var _transferAll = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(receiverAddress, broadcast) {
var _this2 = this;
var balanceResp, addressBalance, utxos, fee, minAmountCanTransfer, tx, txid, txHex, retUtxos, resTxid;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return this.provider.getBalance(this.address.toString());
case 2:
balanceResp = _context2.sent;
addressBalance = balanceResp.balance + balanceResp.pendingBalance;
_context2.next = 6;
return this.getAddressUtxos(this.address.toString());
case 6:
utxos = _context2.sent;
fee = Math.ceil((utxos.length * 148 + 34 + 10) * this.feeb);
minAmountCanTransfer = 135 + fee;
if (!(addressBalance < minAmountCanTransfer)) {
_context2.next = 11;
break;
}
throw new Error("Insufficient BSV Balance");
case 11:
tx = new bsv.Transaction();
tx.from(utxos.map(function (utxo) {
return {
txId: utxo.txId,
outputIndex: utxo.outputIndex,
satoshis: utxo.satoshis,
script: bsv.Script.buildPublicKeyHashOut(_this2.address).toHex()
};
}));
tx.addOutput(new bsv.Transaction.Output({
satoshis: addressBalance - fee,
script: bsv.Script.fromAddress(receiverAddress)
}));
tx.fee(fee);
tx.sign(this.privateKey);
txid = tx.id;
txHex = tx.serialize(true);
retUtxos = [{
txId: txid,
outputIndex: 0,
satoshis: addressBalance - fee,
address: receiverAddress
}];
if (!broadcast) {
_context2.next = 25;
break;
}
_context2.next = 22;
return this.provider.broadcast(txHex);
case 22:
resTxid = _context2.sent;
if (resTxid) {
_context2.next = 25;
break;
}
throw new Error("broadcast error");
case 25:
return _context2.abrupt("return", {
txid: txid,
txHex: txHex,
utxos: retUtxos
});
case 26:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function transferAll(_x3, _x4) {
return _transferAll.apply(this, arguments);
}
return transferAll;
}();
_proto.getAddressUtxos = /*#__PURE__*/function () {
var _getAddressUtxos = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(address) {
var utxos, flag, gUtxos, i;
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
utxos = [];
flag = "";
gUtxos = [];
i = 0;
case 4:
if (!(i < 10)) {
_context3.next = 15;
break;
}
_context3.next = 7;
return this.provider.getUtxos(address, {
flag: flag
});
case 7:
gUtxos = _context3.sent;
if (!(gUtxos.length == 0)) {
_context3.next = 10;
break;
}
return _context3.abrupt("break", 15);
case 10:
flag = gUtxos[gUtxos.length - 1].flag;
utxos = utxos.concat(gUtxos);
case 12:
i++;
_context3.next = 4;
break;
case 15:
return _context3.abrupt("return", utxos);
case 16:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
function getAddressUtxos(_x5) {
return _getAddressUtxos.apply(this, arguments);
}
return getAddressUtxos;
}();
return Wallet;
}();
export { Wallet as default };