UNPKG

bsv-sdk

Version:

bsv sdk

316 lines (255 loc) 10.7 kB
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 };