UNPKG

@nervosnetwork/ckb-sdk-utils

Version:

Utils module of @nervosnetwork/ckb-sdk-core

50 lines 3.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.extraInputs = void 0; const tslib_1 = require("tslib"); const jsbi_1 = (0, tslib_1.__importDefault)(require("jsbi")); const calculateTransactionFee_js_1 = (0, tslib_1.__importDefault)(require("../calculateTransactionFee.js")); const sizes_js_1 = require("../sizes.js"); const index_js_1 = require("../exceptions/index.js"); const extraInputs = (params) => { const changeThreshold = jsbi_1.default.BigInt(`${params.changeThreshold}`); const feeRate = jsbi_1.default.BigInt(`${params.feeRate}`); const currentChangeOutput = params.tx.outputs[params.tx.outputs.length - 1]; const currentChange = jsbi_1.default.BigInt(currentChangeOutput.capacity); const fee = jsbi_1.default.BigInt((0, calculateTransactionFee_js_1.default)(`0x${(0, sizes_js_1.getTransactionSize)(params.tx).toString(16)}`, `0x${feeRate.toString(16)}`)); const lack = jsbi_1.default.subtract(jsbi_1.default.add(fee, changeThreshold), currentChange); if (jsbi_1.default.LE(lack, jsbi_1.default.BigInt(0))) { return Object.assign(Object.assign({}, params.tx), { outputs: [ ...params.tx.outputs.slice(0, -1), Object.assign(Object.assign({}, currentChangeOutput), { capacity: `0x${jsbi_1.default.subtract(currentChange, fee).toString(16)}` }), ] }); } params.cells.sort((c1, c2) => +jsbi_1.default.subtract(jsbi_1.default.BigInt(c1.capacity), jsbi_1.default.BigInt(c2.capacity))); const SIZE_PER_INPUT = jsbi_1.default.BigInt(44); const FEE_PER_INPUT = jsbi_1.default.divide(jsbi_1.default.multiply(SIZE_PER_INPUT, feeRate), jsbi_1.default.BigInt(1000)); for (let i = 1; i <= Math.min(params.extraCount, params.cells.length); i++) { const extraCost = jsbi_1.default.multiply(jsbi_1.default.BigInt(i), FEE_PER_INPUT); const totalLack = jsbi_1.default.add(lack, extraCost); const extraCapacity = params.cells .slice(0, i) .reduce((sum, c) => jsbi_1.default.add(sum, jsbi_1.default.BigInt(c.capacity)), jsbi_1.default.BigInt(0)); if (jsbi_1.default.GE(extraCapacity, totalLack)) { const inputs = [ ...params.tx.inputs, ...params.cells.slice(0, i).map(c => ({ previousOutput: c.outPoint, since: '0x0', })), ]; const change = jsbi_1.default.add(changeThreshold, jsbi_1.default.subtract(extraCapacity, totalLack)); const changeOutput = Object.assign(Object.assign({}, currentChangeOutput), { capacity: `0x${change.toString(16)}` }); const outputs = [...params.tx.outputs.slice(0, -1), changeOutput]; const tx = Object.assign(Object.assign({}, params.tx), { inputs, outputs }); return tx; } } throw new index_js_1.ReconciliationException(); }; exports.extraInputs = extraInputs; exports.default = exports.extraInputs; //# sourceMappingURL=extraInputs.js.map