@harmoniclabs/buildooor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +22 -0
  3. package/dist/TxBuilder/CanResolveToUTxO/CanResolveToUTxO.d.ts +5 -0
  4. package/dist/TxBuilder/CanResolveToUTxO/CanResolveToUTxO.js +62 -0
  5. package/dist/TxBuilder/CanResolveToUTxO/index.d.ts +1 -0
  6. package/dist/TxBuilder/CanResolveToUTxO/index.js +17 -0
  7. package/dist/TxBuilder/GenesisInfos.d.ts +54 -0
  8. package/dist/TxBuilder/GenesisInfos.js +56 -0
  9. package/dist/TxBuilder/IProvider/IProvider.d.ts +42 -0
  10. package/dist/TxBuilder/IProvider/IProvider.js +2 -0
  11. package/dist/TxBuilder/IProvider/index.d.ts +1 -0
  12. package/dist/TxBuilder/IProvider/index.js +17 -0
  13. package/dist/TxBuilder/TxBuilder.d.ts +106 -0
  14. package/dist/TxBuilder/TxBuilder.js +1251 -0
  15. package/dist/TxBuilder/TxBuilderProtocolParams.d.ts +42 -0
  16. package/dist/TxBuilder/TxBuilderProtocolParams.js +121 -0
  17. package/dist/TxBuilder/TxBuilderRunner/CanBePoolKeyHash.d.ts +3 -0
  18. package/dist/TxBuilder/TxBuilderRunner/CanBePoolKeyHash.js +33 -0
  19. package/dist/TxBuilder/TxBuilderRunner/CanBeStakeCreds.d.ts +3 -0
  20. package/dist/TxBuilder/TxBuilderRunner/CanBeStakeCreds.js +25 -0
  21. package/dist/TxBuilder/TxBuilderRunner/TxBuilderRunner.d.ts +280 -0
  22. package/dist/TxBuilder/TxBuilderRunner/TxBuilderRunner.js +1366 -0
  23. package/dist/TxBuilder/TxBuilderRunner/forceAddr.d.ts +2 -0
  24. package/dist/TxBuilder/TxBuilderRunner/forceAddr.js +8 -0
  25. package/dist/TxBuilder/TxBuilderRunner/index.d.ts +2 -0
  26. package/dist/TxBuilder/TxBuilderRunner/index.js +18 -0
  27. package/dist/TxBuilder/TxBuilderRunner/jsonToMetadata.d.ts +2 -0
  28. package/dist/TxBuilder/TxBuilderRunner/jsonToMetadata.js +35 -0
  29. package/dist/TxBuilder/index.d.ts +5 -0
  30. package/dist/TxBuilder/index.js +21 -0
  31. package/dist/TxBuilder/keepRelevant.d.ts +4 -0
  32. package/dist/TxBuilder/keepRelevant.js +79 -0
  33. package/dist/TxBuilder/utils.d.ts +4 -0
  34. package/dist/TxBuilder/utils.js +66 -0
  35. package/dist/index.d.ts +15 -0
  36. package/dist/index.js +31 -0
  37. package/dist/toOnChain/getSpendingPurposeData.d.ts +5 -0
  38. package/dist/toOnChain/getSpendingPurposeData.js +98 -0
  39. package/dist/toOnChain/getTxInfos.d.ts +8 -0
  40. package/dist/toOnChain/getTxInfos.js +126 -0
  41. package/dist/toOnChain/getTxIntervalData.d.ts +19 -0
  42. package/dist/toOnChain/getTxIntervalData.js +85 -0
  43. package/dist/toOnChain/index.d.ts +2 -0
  44. package/dist/toOnChain/index.js +18 -0
  45. package/dist/txBuild/ChangeInfos/ChangeInfos.d.ts +15 -0
  46. package/dist/txBuild/ChangeInfos/ChangeInfos.js +27 -0
  47. package/dist/txBuild/ITxBuildArgs.d.ts +74 -0
  48. package/dist/txBuild/ITxBuildArgs.js +71 -0
  49. package/dist/txBuild/ITxBuildCert.d.ts +13 -0
  50. package/dist/txBuild/ITxBuildCert.js +37 -0
  51. package/dist/txBuild/ITxBuildInput/ITxBuildInput.d.ts +25 -0
  52. package/dist/txBuild/ITxBuildInput/ITxBuildInput.js +70 -0
  53. package/dist/txBuild/ITxBuildInput/ITxBuildInputInlineScript.d.ts +14 -0
  54. package/dist/txBuild/ITxBuildInput/ITxBuildInputInlineScript.js +14 -0
  55. package/dist/txBuild/ITxBuildInput/ITxBuildInputRefScript.d.ts +14 -0
  56. package/dist/txBuild/ITxBuildInput/ITxBuildInputRefScript.js +15 -0
  57. package/dist/txBuild/ITxBuildMint.d.ts +30 -0
  58. package/dist/txBuild/ITxBuildMint.js +54 -0
  59. package/dist/txBuild/ITxBuildOptions.d.ts +11 -0
  60. package/dist/txBuild/ITxBuildOptions.js +2 -0
  61. package/dist/txBuild/ITxBuildOutput.d.ts +10 -0
  62. package/dist/txBuild/ITxBuildOutput.js +27 -0
  63. package/dist/txBuild/ITxBuildProposalProcedure.d.ts +11 -0
  64. package/dist/txBuild/ITxBuildProposalProcedure.js +13 -0
  65. package/dist/txBuild/ITxBuildVotingProcedure.d.ts +13 -0
  66. package/dist/txBuild/ITxBuildVotingProcedure.js +40 -0
  67. package/dist/txBuild/ITxBuildWithdrawal.d.ts +29 -0
  68. package/dist/txBuild/ITxBuildWithdrawal.js +34 -0
  69. package/dist/txBuild/ScriptWithRedeemer.d.ts +18 -0
  70. package/dist/txBuild/ScriptWithRedeemer.js +16 -0
  71. package/dist/txBuild/index.d.ts +7 -0
  72. package/dist/txBuild/index.js +23 -0
  73. package/dist/utils/CanBeData.d.ts +7 -0
  74. package/dist/utils/CanBeData.js +68 -0
  75. package/dist/utils/Rational.d.ts +8 -0
  76. package/dist/utils/Rational.js +34 -0
  77. package/dist/utils/assert.d.ts +1 -0
  78. package/dist/utils/assert.js +44 -0
  79. package/dist/utils/ints.d.ts +4 -0
  80. package/dist/utils/ints.js +25 -0
  81. package/dist/utils/stringify.d.ts +2 -0
  82. package/dist/utils/stringify.js +38 -0
  83. package/package.json +72 -0
@@ -0,0 +1,1251 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __rest = (this && this.__rest) || function (s, e) {
50
+ var t = {};
51
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
+ t[p] = s[p];
53
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
+ t[p[i]] = s[p[i]];
57
+ }
58
+ return t;
59
+ };
60
+ var __read = (this && this.__read) || function (o, n) {
61
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
62
+ if (!m) return o;
63
+ var i = m.call(o), r, ar = [], e;
64
+ try {
65
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
66
+ }
67
+ catch (error) { e = { error: error }; }
68
+ finally {
69
+ try {
70
+ if (r && !r.done && (m = i["return"])) m.call(i);
71
+ }
72
+ finally { if (e) throw e.error; }
73
+ }
74
+ return ar;
75
+ };
76
+ var __values = (this && this.__values) || function(o) {
77
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
78
+ if (m) return m.call(o);
79
+ if (o && typeof o.length === "number") return {
80
+ next: function () {
81
+ if (o && i >= o.length) o = void 0;
82
+ return { value: o && o[i++], done: !o };
83
+ }
84
+ };
85
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
86
+ };
87
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
88
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
89
+ if (ar || !(i in from)) {
90
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
91
+ ar[i] = from[i];
92
+ }
93
+ }
94
+ return to.concat(ar || Array.prototype.slice.call(from));
95
+ };
96
+ Object.defineProperty(exports, "__esModule", { value: true });
97
+ exports.splitStringByByteLength = exports.getScriptDataHash = exports.TxBuilder = void 0;
98
+ var uint8array_utils_1 = require("@harmoniclabs/uint8array-utils");
99
+ var keepRelevant_1 = require("./keepRelevant.js");
100
+ var GenesisInfos_1 = require("./GenesisInfos.js");
101
+ var cardano_costmodels_ts_1 = require("@harmoniclabs/cardano-costmodels-ts");
102
+ var cardano_ledger_ts_1 = require("@harmoniclabs/cardano-ledger-ts");
103
+ var cbor_1 = require("@harmoniclabs/cbor");
104
+ var crypto_1 = require("@harmoniclabs/crypto");
105
+ var plutus_data_1 = require("@harmoniclabs/plutus-data");
106
+ var plutus_machine_1 = require("@harmoniclabs/plutus-machine");
107
+ var uplc_1 = require("@harmoniclabs/uplc");
108
+ var toOnChain_1 = require("../toOnChain/index.js");
109
+ var txBuild_1 = require("../txBuild/index.js");
110
+ var ints_1 = require("../utils/ints.js");
111
+ var obj_utils_1 = require("@harmoniclabs/obj-utils");
112
+ var TxBuilderRunner_1 = require("./TxBuilderRunner/TxBuilderRunner.js");
113
+ var CanBeData_1 = require("../utils/CanBeData.js");
114
+ var getSpendingPurposeData_1 = require("../toOnChain/getSpendingPurposeData.js");
115
+ var TxBuilderProtocolParams_1 = require("./TxBuilderProtocolParams.js");
116
+ var utils_1 = require("./utils.js");
117
+ var Rational_1 = require("../utils/Rational.js");
118
+ var stringify_1 = require("../utils/stringify.js");
119
+ // const scriptCache: { [x: string]: UPLCTerm } = {};
120
+ function getScriptLikeUplc(scriptLike) {
121
+ return uplc_1.UPLCDecoder.parse(scriptLike.bytes, "flat").body;
122
+ }
123
+ var TxBuilder = /** @class */ (function () {
124
+ function TxBuilder(protocolParamters, genesisInfos) {
125
+ var _genesisInfos = undefined;
126
+ var _setGenesisInfos = function (genInfos) {
127
+ if (!(0, GenesisInfos_1.isGenesisInfos)(genInfos))
128
+ return;
129
+ _genesisInfos = (0, obj_utils_1.freezeAll)((0, GenesisInfos_1.normalizedGenesisInfos)(genInfos));
130
+ };
131
+ _setGenesisInfos(genesisInfos);
132
+ Object.defineProperties(this, {
133
+ genesisInfos: {
134
+ get: function () { return _genesisInfos; },
135
+ set: _setGenesisInfos,
136
+ enumerable: true,
137
+ configurable: false
138
+ },
139
+ setGenesisInfos: {
140
+ value: _setGenesisInfos,
141
+ writable: false,
142
+ enumerable: true,
143
+ configurable: false
144
+ }
145
+ });
146
+ var pp = (0, TxBuilderProtocolParams_1.completeTxBuilderProtocolParams)(protocolParamters);
147
+ (0, obj_utils_1.defineReadOnlyProperty)(this, "protocolParamters", (0, obj_utils_1.freezeAll)(protocolParamters));
148
+ var costmdls = pp.costModels;
149
+ var costs = (0, cardano_costmodels_ts_1.isCostModelsV3)(costmdls.PlutusScriptV3) ? costmdls.PlutusScriptV3 :
150
+ (0, cardano_costmodels_ts_1.isCostModelsV2)(costmdls.PlutusScriptV2) ? costmdls.PlutusScriptV2 :
151
+ (0, cardano_costmodels_ts_1.isCostModelsV1)(costmdls.PlutusScriptV1) ? costmdls.PlutusScriptV1 :
152
+ cardano_costmodels_ts_1.defaultV3Costs;
153
+ (0, obj_utils_1.definePropertyIfNotPresent)(this, "cek", {
154
+ // define as getter so that it can be reused without messing around things
155
+ get: function () { return new plutus_machine_1.Machine(__assign({}, costs)); },
156
+ // set does nothing ( aka. readonly )
157
+ set: function () { },
158
+ enumerable: false,
159
+ configurable: false
160
+ });
161
+ }
162
+ TxBuilder.prototype.runWithProvider = function (provider) {
163
+ return new TxBuilderRunner_1.TxBuilderRunner(this, provider);
164
+ };
165
+ TxBuilder.prototype.keepRelevant = function (requestedOutputSet, initialUTxOSet, minimumLovelaceRequired) {
166
+ if (minimumLovelaceRequired === void 0) { minimumLovelaceRequired = 5000000; }
167
+ return (0, keepRelevant_1.keepRelevant)(requestedOutputSet, initialUTxOSet, minimumLovelaceRequired);
168
+ };
169
+ TxBuilder.prototype.calcLinearFee = function (tx) {
170
+ return ((0, ints_1.forceBigUInt)(this.protocolParamters.txFeePerByte) *
171
+ BigInt((tx instanceof cardano_ledger_ts_1.Tx ? tx.toCbor() : tx).toBuffer().length) +
172
+ (0, ints_1.forceBigUInt)(this.protocolParamters.txFeeFixed));
173
+ };
174
+ TxBuilder.prototype.calcMinFee = function (tx) {
175
+ var _a;
176
+ var totRefScriptBytes = ((_a = tx.body.refInputs) !== null && _a !== void 0 ? _a : [])
177
+ .reduce(function (sum, refIn) {
178
+ if (refIn.resolved.refScript)
179
+ return sum + BigInt(refIn.resolved.refScript.toCbor().toBuffer().length
180
+ + 10 // second Cbor wrap
181
+ );
182
+ return sum;
183
+ }, BigInt(0));
184
+ var minRefScriptFee = this.protocolParamters.minfeeRefScriptCostPerByte ? (totRefScriptBytes * this.protocolParamters.minfeeRefScriptCostPerByte.num /
185
+ this.protocolParamters.minfeeRefScriptCostPerByte.den) : (totRefScriptBytes * (0, Rational_1.cborFromRational)(cardano_ledger_ts_1.defaultProtocolParameters.minfeeRefScriptCostPerByte).num /
186
+ (0, Rational_1.cborFromRational)(cardano_ledger_ts_1.defaultProtocolParameters.minfeeRefScriptCostPerByte).den);
187
+ var minFeeMultiplier = (0, ints_1.forceBigUInt)(this.protocolParamters.txFeePerByte);
188
+ var nVkeyWits = BigInt((0, utils_1.estimateMaxSignersNeeded)(tx));
189
+ var minFee = this.calcLinearFee(tx) +
190
+ minRefScriptFee +
191
+ // consider also vkeys witnesses to be added
192
+ // each vkey witness has fixed size of 102 cbor bytes
193
+ // (1 bytes cbor array tag (length 2)) + (34 cbor bytes of length 32) + (67 cbor bytes of length 64)
194
+ // for a fixed length of 102
195
+ BigInt(102) * nVkeyWits * minFeeMultiplier +
196
+ // we add some more bytes for the array tag
197
+ BigInt(nVkeyWits < 24 ? 1 : (nVkeyWits < 256 ? 2 : 3)) * minFeeMultiplier;
198
+ return minFee;
199
+ };
200
+ TxBuilder.prototype.getMinimumOutputLovelaces = function (tx_out) {
201
+ var size = BigInt(0);
202
+ if (tx_out instanceof cardano_ledger_ts_1.TxOut)
203
+ tx_out = tx_out.toCbor().toBuffer();
204
+ if (typeof tx_out === "string")
205
+ size = BigInt(Math.ceil(tx_out.length / 2));
206
+ else if (!(tx_out instanceof Uint8Array)) {
207
+ if ((0, obj_utils_1.isObject)(tx_out) &&
208
+ (0, obj_utils_1.hasOwn)(tx_out, "toBuffer") &&
209
+ typeof tx_out.toBuffer === "function")
210
+ tx_out = tx_out.toBuffer();
211
+ if (!(tx_out instanceof Uint8Array))
212
+ tx_out = (0, uint8array_utils_1.fromHex)(tx_out.toString());
213
+ }
214
+ if (tx_out instanceof Uint8Array)
215
+ size = BigInt(tx_out.length);
216
+ return BigInt(this.protocolParamters.utxoCostPerByte) * size;
217
+ };
218
+ TxBuilder.prototype.minimizeLovelaces = function (out) {
219
+ var o = out instanceof cardano_ledger_ts_1.TxOut ? out : (0, txBuild_1.txBuildOutToTxOut)(out);
220
+ var minLovelaces = this.getMinimumOutputLovelaces(o);
221
+ return new cardano_ledger_ts_1.TxOut({
222
+ address: o.address,
223
+ value: cardano_ledger_ts_1.Value.add(cardano_ledger_ts_1.Value.sub(o.value, cardano_ledger_ts_1.Value.lovelaces(o.value.lovelaces)), cardano_ledger_ts_1.Value.lovelaces(minLovelaces)),
224
+ datum: o.datum,
225
+ refScript: o.refScript
226
+ });
227
+ };
228
+ /**
229
+ *
230
+ * @param slotN number of the slot
231
+ * @returns POSIX time in **milliseconds**
232
+ */
233
+ TxBuilder.prototype.slotToPOSIX = function (slot, genesisInfos) {
234
+ var gInfos = genesisInfos ? (0, GenesisInfos_1.normalizedGenesisInfos)(genesisInfos) : this.genesisInfos;
235
+ if (gInfos === undefined) {
236
+ throw new Error("can't convert slot to POSIX time because genesis infos are missing");
237
+ }
238
+ return (0, toOnChain_1.slotToPOSIX)((0, ints_1.unsafeForceUInt)(slot), gInfos);
239
+ };
240
+ /**
241
+ *
242
+ * @param POSIX POSIX time in milliseconds
243
+ */
244
+ TxBuilder.prototype.posixToSlot = function (POSIX, genesisInfos) {
245
+ var gInfos = genesisInfos ? (0, GenesisInfos_1.normalizedGenesisInfos)(genesisInfos) : this.genesisInfos;
246
+ if (gInfos === undefined) {
247
+ throw new Error("can't convert POSIX to slot time because genesis infos are missing");
248
+ }
249
+ return (0, toOnChain_1.POSIXToSlot)((0, ints_1.unsafeForceUInt)(POSIX), gInfos);
250
+ };
251
+ /**
252
+ * here mainly for forward compability
253
+ *
254
+ * internally calls `buildSync` so really what `build` is doing is wrapping it in a `Promise`
255
+ *
256
+ * In future this method might implement multi-threading using `Worker`s
257
+ */
258
+ TxBuilder.prototype.build = function (buildArgs, buildOpts) {
259
+ if (buildOpts === void 0) { buildOpts = {}; }
260
+ return __awaiter(this, void 0, void 0, function () {
261
+ return __generator(this, function (_a) {
262
+ return [2 /*return*/, this.buildSync(buildArgs, buildOpts)];
263
+ });
264
+ });
265
+ };
266
+ /**
267
+ * replaces the redeemers and clears vkeyWitnesses in the witness set
268
+ * and re-computes the `scriptDataHash` in the body
269
+ *
270
+ * the input transaction is readonly and is not modified
271
+ *
272
+ * **A NEW TRANSACTION IS CREATED** with vkey witness set empty
273
+ * (the new transaction is unsigned)
274
+ *
275
+ * to summarize, the new transaction differs in:
276
+ * 1) `tx.body.scriptDataHash`
277
+ * 2) `tx.witnesses.redeemers`
278
+ * 3) `tx.witnesses.vkeyWitnesses` (empty)
279
+ */
280
+ TxBuilder.prototype.overrideTxRedeemers = function (tx, newRedeemers, opts) {
281
+ var _a;
282
+ if (opts === void 0) { opts = { mustHaveV3: true }; }
283
+ // datums passed by hash
284
+ var datums = (_a = tx.witnesses.datums) !== null && _a !== void 0 ? _a : [];
285
+ return new cardano_ledger_ts_1.Tx(__assign(__assign({}, tx), { body: new cardano_ledger_ts_1.TxBody(__assign(__assign({}, tx.body), { scriptDataHash: getScriptDataHash(tx.witnesses, (0, cardano_costmodels_ts_1.costModelsToLanguageViewCbor)(this.protocolParamters.costModels, opts).toBuffer()) })), witnesses: new cardano_ledger_ts_1.TxWitnessSet(__assign(__assign({}, tx.witnesses), { vkeyWitnesses: [], redeemers: newRedeemers })) }));
286
+ };
287
+ TxBuilder.prototype.buildSync = function (buildArgs, _a) {
288
+ var _b;
289
+ var _c = _a === void 0 ? {} : _a, onScriptInvalid = _c.onScriptInvalid, onScriptResult = _c.onScriptResult;
290
+ var _initBuild = this.initTxBuild(buildArgs);
291
+ var
292
+ // tx,
293
+ scriptsToExec = _initBuild.scriptsToExec, datumsScriptData = _initBuild.datumsScriptData, languageViews = _initBuild.languageViews, totInputValue = _initBuild.totInputValue, requiredOutputValue = _initBuild.requiredOutputValue, outs = _initBuild.outs, change = _initBuild.change;
294
+ var tx = _initBuild.tx;
295
+ var minFee = _initBuild.minFee;
296
+ var rdmrs = (_b = tx.witnesses.redeemers) !== null && _b !== void 0 ? _b : [];
297
+ var nRdmrs = rdmrs.length;
298
+ if (nRdmrs === 0) {
299
+ this.assertMinOutLovelaces(tx.body.outputs);
300
+ return tx;
301
+ }
302
+ ;
303
+ var txOuts = new Array(outs.length + 1);
304
+ var cek = this.cek;
305
+ if (!(cek instanceof plutus_machine_1.Machine))
306
+ throw new Error("unable to construct transaction including scripts " +
307
+ "if the protocol params are missing the script evaluation costs");
308
+ var executionUnitPrices = this.protocolParamters.executionUnitPrices;
309
+ executionUnitPrices = Array.isArray(executionUnitPrices) ? executionUnitPrices : [
310
+ executionUnitPrices.priceMemory,
311
+ executionUnitPrices.priceSteps,
312
+ ];
313
+ var _d = __read(executionUnitPrices, 2), memRational = _d[0], cpuRational = _d[1];
314
+ memRational = typeof memRational === "number" ? cbor_1.CborPositiveRational.fromNumber(memRational) : memRational;
315
+ cpuRational = typeof cpuRational === "number" ? cbor_1.CborPositiveRational.fromNumber(cpuRational) : cpuRational;
316
+ // group by purpose so we can use the redeemer index to find the script
317
+ var spendScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Spend; });
318
+ var mintScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Mint; });
319
+ var certScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Cert; });
320
+ var withdrawScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Withdraw; });
321
+ var voteScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Voting; });
322
+ var proposeScriptsToExec = scriptsToExec.filter(function (elem) { return elem.rdmrTag === cardano_ledger_ts_1.TxRedeemerTag.Proposing; });
323
+ var maxRound = 3;
324
+ var _isScriptValid = true;
325
+ var fee = minFee;
326
+ var prevFee;
327
+ var _loop_1 = function (round) {
328
+ prevFee = fee;
329
+ var _e = (0, toOnChain_1.getTxInfos)(tx, this_1.genesisInfos), txInfosV1 = _e.v1, txInfosV2 = _e.v2, txInfosV3 = _e.v3;
330
+ var totExBudget = new plutus_machine_1.ExBudget({ mem: 0, cpu: 0 });
331
+ var _loop_2 = function (i) {
332
+ var rdmr = rdmrs[i];
333
+ var tag = rdmr.tag, rdmrData = rdmr.data, rdmr_idx = rdmr.index;
334
+ // "+ 1" because we keep track of lovelaces even if in mint values these are 0
335
+ var index = rdmr_idx + (tag === cardano_ledger_ts_1.TxRedeemerTag.Mint ? 1 : 0);
336
+ // const spendingPurpose = getSpendingPurposeData( rdmr, tx.body );
337
+ var onlyRedeemerArg = function (purposeScriptsToExec) {
338
+ var _a;
339
+ var script = (_a = purposeScriptsToExec.find(function (_a) {
340
+ var idx = _a.index;
341
+ return idx === index;
342
+ })) === null || _a === void 0 ? void 0 : _a.script;
343
+ if (script === undefined)
344
+ throw new Error("missing script for " + (0, cardano_ledger_ts_1.txRedeemerTagToString)(tag) + " redeemer " + (index - 1));
345
+ var expectedVersion = (0, utils_1.scriptTypeToDataVersion)(script.type);
346
+ if (typeof expectedVersion !== "string")
347
+ throw new Error("unexpected redeemer for native script");
348
+ var ctxData = getCtx(script.type, (0, getSpendingPurposeData_1.getSpendingPurposeData)(rdmr, tx.body, expectedVersion), (0, getSpendingPurposeData_1.getScriptInfoData)(rdmr, tx.body, expectedVersion), rdmrData, txInfosV1, txInfosV2, txInfosV3);
349
+ var isV2OrLess = (script.type === cardano_ledger_ts_1.ScriptType.PlutusV1 ||
350
+ script.type === cardano_ledger_ts_1.ScriptType.PlutusV2 ||
351
+ script.type === cardano_ledger_ts_1.ScriptType.NativeScript);
352
+ var _b = cek.eval(isV2OrLess ?
353
+ new uplc_1.Application(new uplc_1.Application(getScriptLikeUplc(script), uplc_1.UPLCConst.data(rdmrData)), uplc_1.UPLCConst.data(ctxData)) :
354
+ new uplc_1.Application(getScriptLikeUplc(script), uplc_1.UPLCConst.data(ctxData))), result = _b.result, budgetSpent = _b.budgetSpent, logs = _b.logs;
355
+ _isScriptValid = onEvaluationResult(i, totExBudget, rdmr, result, budgetSpent, logs, isV2OrLess ? [
356
+ rdmrData,
357
+ ctxData
358
+ ] : [ctxData], rdmrs, onScriptResult, onScriptInvalid);
359
+ };
360
+ if (tag === cardano_ledger_ts_1.TxRedeemerTag.Spend) {
361
+ var entry = spendScriptsToExec.find(function (_a) {
362
+ var idx = _a.index;
363
+ return idx === index;
364
+ });
365
+ if (entry === undefined)
366
+ throw new Error("missing script for spend redeemer " + index);
367
+ var script = entry.script, datum = entry.datum;
368
+ var isV2OrLess = script.type === cardano_ledger_ts_1.ScriptType.PlutusV1 || script.type === cardano_ledger_ts_1.ScriptType.PlutusV2;
369
+ if (datum === undefined && isV2OrLess)
370
+ throw new Error("missing datum for spend redeemer " + index);
371
+ var expectedVersion = (0, utils_1.scriptTypeToDataVersion)(script.type);
372
+ if (typeof expectedVersion !== "string")
373
+ throw new Error("unexpected redeemer for native script");
374
+ var ctxData = getCtx(script.type, (0, getSpendingPurposeData_1.getSpendingPurposeData)(rdmr, tx.body, expectedVersion), (0, getSpendingPurposeData_1.getScriptInfoData)(rdmr, tx.body, expectedVersion, datum), rdmrData, txInfosV1, txInfosV2, txInfosV3);
375
+ var _f = cek.eval(isV2OrLess ?
376
+ new uplc_1.Application(new uplc_1.Application(new uplc_1.Application(getScriptLikeUplc(script), uplc_1.UPLCConst.data(datum)), uplc_1.UPLCConst.data(rdmrData)), uplc_1.UPLCConst.data(ctxData)) :
377
+ new uplc_1.Application(getScriptLikeUplc(script), uplc_1.UPLCConst.data(ctxData))), result = _f.result, budgetSpent = _f.budgetSpent, logs = _f.logs;
378
+ _isScriptValid = onEvaluationResult(i, totExBudget, rdmr, result, budgetSpent, logs, isV2OrLess ? [
379
+ datum,
380
+ rdmrData,
381
+ ctxData
382
+ ] : [ctxData], rdmrs, onScriptResult, onScriptInvalid);
383
+ }
384
+ else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Mint)
385
+ onlyRedeemerArg(mintScriptsToExec);
386
+ else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Cert)
387
+ onlyRedeemerArg(certScriptsToExec);
388
+ else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Withdraw)
389
+ onlyRedeemerArg(withdrawScriptsToExec);
390
+ else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Voting)
391
+ onlyRedeemerArg(voteScriptsToExec);
392
+ else if (tag === cardano_ledger_ts_1.TxRedeemerTag.Proposing)
393
+ onlyRedeemerArg(proposeScriptsToExec);
394
+ else
395
+ throw new Error("unrecoignized redeemer tag " + tag);
396
+ };
397
+ for (var i = 0; i < nRdmrs; i++) {
398
+ _loop_2(i);
399
+ }
400
+ minFee = this_1.calcMinFee(tx);
401
+ fee = minFee +
402
+ ((totExBudget.mem * memRational.num) / memRational.den) +
403
+ ((totExBudget.cpu * cpuRational.num) / cpuRational.den) +
404
+ // bigint division truncates always towards 0;
405
+ // we don't like that so we add `1n` for both divisions ( + 2n )
406
+ BigInt(2);
407
+ if (fee === prevFee)
408
+ return "break"; // return last transaciton
409
+ // reset for next loop
410
+ // no need to reset if there's no next loop
411
+ if (round === maxRound - 1)
412
+ return "break";
413
+ for (var i = 0; i < outs.length; i++) {
414
+ txOuts[i] = outs[i].clone();
415
+ }
416
+ txOuts[txOuts.length - 1] = (new cardano_ledger_ts_1.TxOut({
417
+ address: change.address,
418
+ value: cardano_ledger_ts_1.Value.sub(totInputValue, cardano_ledger_ts_1.Value.add(requiredOutputValue, cardano_ledger_ts_1.Value.lovelaces(fee))),
419
+ datum: change.datum ? ((0, cardano_ledger_ts_1.canBeHash32)(change.datum) ?
420
+ new cardano_ledger_ts_1.Hash32(change.datum) :
421
+ (0, CanBeData_1.forceData)(change.datum)) : undefined,
422
+ refScript: change.refScript
423
+ }));
424
+ var nextWitnesses = new cardano_ledger_ts_1.TxWitnessSet(__assign(__assign({}, tx.witnesses), { redeemers: rdmrs }));
425
+ tx = new cardano_ledger_ts_1.Tx(__assign(__assign({}, tx), { body: new cardano_ledger_ts_1.TxBody(__assign(__assign({}, tx.body), { outputs: txOuts.slice(), fee: fee, scriptDataHash: getScriptDataHash(nextWitnesses, languageViews) })), witnesses: nextWitnesses, isScriptValid: _isScriptValid }));
426
+ _isScriptValid = true;
427
+ totExBudget = new plutus_machine_1.ExBudget({ mem: 0, cpu: 0 });
428
+ };
429
+ var this_1 = this;
430
+ for (var round = 0; round < maxRound; round++) {
431
+ var state_1 = _loop_1(round);
432
+ if (state_1 === "break")
433
+ break;
434
+ }
435
+ this.assertMinOutLovelaces(tx.body.outputs);
436
+ return tx;
437
+ };
438
+ TxBuilder.prototype.assertMinOutLovelaces = function (txOuts) {
439
+ for (var i = 0; i < txOuts.length; i++) {
440
+ var out = txOuts[i];
441
+ var minLovelaces = this.getMinimumOutputLovelaces(out);
442
+ if (out.value.lovelaces < minLovelaces)
443
+ throw new Error("tx output at index ".concat(i, " did not have enough lovelaces to meet the minimum allowed by protocol parameters.\n") +
444
+ "output size: ".concat(out.toCbor().toBuffer().length, " bytes\n") +
445
+ "protocol paramters \"utxoCostPerByte\": ".concat(this.protocolParamters.utxoCostPerByte, "\n") +
446
+ "minimum lovelaces required: ".concat(minLovelaces.toString(), "\n") +
447
+ "output lovelaces : ".concat(out.value.lovelaces.toString(), "\n") +
448
+ "tx output: ".concat((0, stringify_1.stringify)(out.toJson(), undefined, 2)));
449
+ }
450
+ };
451
+ /**
452
+ * extracts the important data from the input
453
+ * and returns it in an easier way to opearte with
454
+ *
455
+ * if the transaction is simple enough (aka. it doesn't include plutus scripts)
456
+ * this is all that either `build` or `buildSync` needs to do
457
+ **/
458
+ TxBuilder.prototype.initTxBuild = function (buildArgs) {
459
+ var _a = (0, txBuild_1.normalizeITxBuildArgs)(buildArgs), outputs = _a.outputs, requiredSigners = _a.requiredSigners, mints = _a.mints, invalidAfter = _a.invalidAfter, certificates = _a.certificates, withdrawals = _a.withdrawals, memo = _a.memo, metadata = _a.metadata, votingProcedures = _a.votingProcedures, proposalProcedures = _a.proposalProcedures, currentTreasuryValue = _a.currentTreasuryValue, paymentToTreasury = _a.paymentToTreasury, args = __rest(_a, ["outputs", "requiredSigners", "mints", "invalidAfter", "certificates", "withdrawals", "memo", "metadata", "votingProcedures", "proposalProcedures", "currentTreasuryValue", "paymentToTreasury"]);
460
+ // mutable args
461
+ var inputs = args.inputs, changeAddress = args.changeAddress, change = args.change, invalidBefore = args.invalidBefore, readonlyRefInputs = args.readonlyRefInputs, collaterals = args.collaterals, collateralReturn = args.collateralReturn;
462
+ if (change)
463
+ changeAddress = change.address;
464
+ if (!changeAddress)
465
+ throw new Error("missing changAddress and change entry while constructing a transaciton; unable to balance inputs and outpus");
466
+ if (!change)
467
+ change = { address: changeAddress };
468
+ var network = changeAddress.network;
469
+ if (!(0, GenesisInfos_1.isNormalizedGenesisInfos)(this.genesisInfos)) {
470
+ this.setGenesisInfos(network === "mainnet" ?
471
+ GenesisInfos_1.defaultMainnetGenesisInfos :
472
+ GenesisInfos_1.defaultPreprodGenesisInfos);
473
+ }
474
+ var undef = void 0;
475
+ // filter inputs so that are unique
476
+ inputs = inputs.reduce(function (accum, input) {
477
+ var samePresent = accum.some(function (_a) {
478
+ var accumUtxo = _a.utxo;
479
+ return eqUTxOByRef(accumUtxo, input.utxo);
480
+ });
481
+ if (!samePresent)
482
+ accum.push(input);
483
+ return accum;
484
+ }, []);
485
+ // filter refIns so that are unique
486
+ readonlyRefInputs = readonlyRefInputs === null || readonlyRefInputs === void 0 ? void 0 : readonlyRefInputs.reduce(function (accum, utxo) {
487
+ var samePresent = accum.some(function (accumUtxo) { return eqUTxOByRef(accumUtxo, utxo); });
488
+ if (!samePresent)
489
+ accum.push(utxo);
490
+ return accum;
491
+ }, []);
492
+ var totInputValue = cardano_ledger_ts_1.Value.zero;
493
+ var refIns = readonlyRefInputs !== null && readonlyRefInputs !== void 0 ? readonlyRefInputs : [];
494
+ var outs = outputs !== null && outputs !== void 0 ? outputs : [];
495
+ var requiredOutputValue = outs.reduce(function (acc, out) { return cardano_ledger_ts_1.Value.add(acc, out.value); }, cardano_ledger_ts_1.Value.zero);
496
+ var vkeyWitnesses = [];
497
+ var nativeScriptsWitnesses = [];
498
+ var bootstrapWitnesses = [];
499
+ var plutusV1ScriptsWitnesses = [];
500
+ var datums = [];
501
+ var plutusV2ScriptsWitnesses = [];
502
+ var plutusV3ScriptsWitnesses = [];
503
+ var dummyExecBudget = plutus_machine_1.ExBudget.maxCborSize;
504
+ var spendRedeemers = [];
505
+ var mintRedeemers = [];
506
+ var certRedeemers = [];
507
+ var withdrawRedeemers = [];
508
+ var voteRedeemers = [];
509
+ var proposeRedeemers = [];
510
+ var scriptsToExec = [];
511
+ /**
512
+ * needed in `getScriptDataHash` to understand whoich cost model to transform in language view
513
+ */
514
+ var _hasV1Scripts = false;
515
+ /**
516
+ * needed in `getScriptDataHash` to understand whoich cost model to transform in language view
517
+ */
518
+ var _hasV2Scripts = false;
519
+ /**
520
+ * needed in `getScriptDataHash` to understand whoich cost model to transform in language view
521
+ */
522
+ var _hasV3Scripts = false;
523
+ function pushScriptToExec(idx, tag, script, datum) {
524
+ if (script.type == cardano_ledger_ts_1.ScriptType.NativeScript)
525
+ return;
526
+ // keep track of exsisting csript versions
527
+ if (!_hasV1Scripts && script.type === "PlutusScriptV1") {
528
+ _hasV1Scripts = true;
529
+ }
530
+ else if (!_hasV2Scripts && script.type === "PlutusScriptV2") {
531
+ _hasV2Scripts = true;
532
+ }
533
+ else if (!_hasV3Scripts && script.type === "PlutusScriptV3") {
534
+ _hasV3Scripts = true;
535
+ }
536
+ scriptsToExec.push({
537
+ index: idx,
538
+ rdmrTag: tag,
539
+ script: {
540
+ type: script.type,
541
+ bytes: script.bytes,
542
+ hash: script.hash.toString()
543
+ },
544
+ datum: datum
545
+ });
546
+ }
547
+ function pushWitScript(script) {
548
+ var t = script.type;
549
+ if (t === "NativeScript")
550
+ pushUniqueScript(nativeScriptsWitnesses, script);
551
+ else if (t === "PlutusScriptV1")
552
+ pushUniqueScript(plutusV1ScriptsWitnesses, script);
553
+ else if (t === "PlutusScriptV2")
554
+ pushUniqueScript(plutusV2ScriptsWitnesses, script);
555
+ else if (t === "PlutusScriptV3")
556
+ pushUniqueScript(plutusV3ScriptsWitnesses, script);
557
+ }
558
+ /**
559
+ * @returns `Script` to execute
560
+ */
561
+ function checkScriptAndPushIfInline(script) {
562
+ var _a, _b;
563
+ if ((0, obj_utils_1.hasOwn)(script, "inline")) {
564
+ if ((0, obj_utils_1.hasOwn)(script, "ref"))
565
+ throw new Error("multiple scripts specified");
566
+ pushWitScript(script.inline);
567
+ return script.inline;
568
+ }
569
+ if ((0, obj_utils_1.hasOwn)(script, "ref")) {
570
+ if ((0, obj_utils_1.hasOwn)(script, "inline"))
571
+ throw new Error("multiple scripts specified");
572
+ var refScript = (_b = (_a = script.ref) === null || _a === void 0 ? void 0 : _a.resolved) === null || _b === void 0 ? void 0 : _b.refScript;
573
+ if (refScript === (void 0))
574
+ throw new Error("script was specified to be a reference script " +
575
+ "but the provided utxo is missing any attached script");
576
+ if (!refIns.some(function (u) { return eqUTxOByRef(u, script.ref); })) {
577
+ refIns.push(script.ref);
578
+ }
579
+ return refScript;
580
+ }
581
+ throw new Error("unexpected execution flow 'checkScriptAndPushIfInline' in TxBuilder");
582
+ }
583
+ /**
584
+ *
585
+ * @param datum
586
+ * @param inlineDatum
587
+ * @returns the `Data` of the datum
588
+ */
589
+ function pushWitDatum(datum, inlineDatum, scriptType) {
590
+ if (scriptType === cardano_ledger_ts_1.ScriptType.NativeScript)
591
+ return undef;
592
+ if (datum === "inline")
593
+ datum = undef;
594
+ if (scriptType === cardano_ledger_ts_1.ScriptType.PlutusV1 ||
595
+ scriptType === cardano_ledger_ts_1.ScriptType.PlutusV2) {
596
+ if (datum === undef) {
597
+ if (!(0, CanBeData_1.canBeData)(inlineDatum))
598
+ throw new Error("datum was specified to be inline; but inline datum is missing");
599
+ // no need to push to witnesses
600
+ return (0, CanBeData_1.forceData)(inlineDatum);
601
+ }
602
+ else {
603
+ var dat = (0, CanBeData_1.forceData)(datum);
604
+ // add datum to witnesses
605
+ // the node finds it trough the datum hash (on the utxo)
606
+ datums.push(dat);
607
+ return dat;
608
+ }
609
+ }
610
+ if (datum === undef) {
611
+ if ((0, CanBeData_1.canBeData)(inlineDatum)) {
612
+ // no need to push to witnesses
613
+ return (0, CanBeData_1.forceData)(inlineDatum);
614
+ }
615
+ if (inlineDatum instanceof cardano_ledger_ts_1.Hash32)
616
+ throw new Error("datum hash specified on spending utxo, but resolved datum is missing");
617
+ return undef;
618
+ }
619
+ else if (inlineDatum instanceof cardano_ledger_ts_1.Hash32) {
620
+ var dat = (0, CanBeData_1.forceData)(datum);
621
+ // add datum to witnesses
622
+ // the node finds it trough the datum hash (on the utxo)
623
+ datums.push(dat);
624
+ return dat;
625
+ }
626
+ return undef;
627
+ }
628
+ var isScriptValid = true;
629
+ // `sort` mutates the array; so we `slice` (clone) first
630
+ var sortedIns = inputs.slice().sort(function (a, b) {
631
+ var ord = (0, uint8array_utils_1.lexCompare)(a.utxo.utxoRef.id.toBuffer(), b.utxo.utxoRef.id.toBuffer());
632
+ // if equal tx id order based on tx output index
633
+ if (ord === 0)
634
+ return a.utxo.utxoRef.index - b.utxo.utxoRef.index;
635
+ // else order by tx id
636
+ return ord;
637
+ });
638
+ var _inputs = inputs.map(function (input) {
639
+ var utxo = input.utxo, referenceScript = input.referenceScript, inputScript = input.inputScript, nativeScript = input.nativeScript;
640
+ var addr = utxo.resolved.address;
641
+ totInputValue = cardano_ledger_ts_1.Value.add(totInputValue, utxo.resolved.value);
642
+ if (addr.paymentCreds.type === cardano_ledger_ts_1.CredentialType.Script &&
643
+ referenceScript === undef &&
644
+ inputScript === undef &&
645
+ nativeScript === undef)
646
+ throw new Error("spending script utxo \"" + utxo.utxoRef.toString() + "\" without script source");
647
+ if (referenceScript !== undef) {
648
+ if (inputScript !== undef || nativeScript !== undef)
649
+ throw new Error("invalid input; multiple scripts specified");
650
+ var datum = referenceScript.datum, redeemer = referenceScript.redeemer, refUtxo_1 = referenceScript.refUtxo;
651
+ var refScript = refUtxo_1.resolved.refScript;
652
+ if (refScript === undefined)
653
+ throw new Error("reference utxo specified (" + refUtxo_1.toString() + ") is missing an attached reference Script");
654
+ var sameRefPresent = refIns.find(function (u) { return eqUTxOByRef(u, refUtxo_1); });
655
+ if (sameRefPresent === undef) {
656
+ refIns.push(refUtxo_1);
657
+ }
658
+ var dat = pushWitDatum(datum, utxo.resolved.datum, refScript.type);
659
+ var i_1 = sortedIns.indexOf(input);
660
+ if (i_1 < 0)
661
+ throw new Error("input missing in sorted");
662
+ spendRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
663
+ data: (0, CanBeData_1.forceData)(redeemer),
664
+ index: i_1,
665
+ execUnits: dummyExecBudget.clone(),
666
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Spend
667
+ }));
668
+ pushScriptToExec(i_1, cardano_ledger_ts_1.TxRedeemerTag.Spend, refScript, dat);
669
+ }
670
+ if (inputScript !== undefined) {
671
+ if (referenceScript !== undefined || nativeScript !== undef)
672
+ throw new Error("invalid input; multiple scripts specified");
673
+ var datum = inputScript.datum, redeemer = inputScript.redeemer, script = inputScript.script;
674
+ pushWitScript(script);
675
+ var dat = pushWitDatum(datum, utxo.resolved.datum, script.type);
676
+ var i_2 = sortedIns.indexOf(input);
677
+ if (i_2 < 0)
678
+ throw new Error("input missing in sorted");
679
+ spendRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
680
+ data: (0, CanBeData_1.forceData)(redeemer),
681
+ index: i_2,
682
+ execUnits: dummyExecBudget.clone(),
683
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Spend
684
+ }));
685
+ pushScriptToExec(i_2, cardano_ledger_ts_1.TxRedeemerTag.Spend, script, dat);
686
+ }
687
+ if (nativeScript instanceof cardano_ledger_ts_1.Script && nativeScript.type === cardano_ledger_ts_1.ScriptType.NativeScript) {
688
+ if (referenceScript !== undefined || inputScript !== undef)
689
+ throw new Error("invalid input; multiple scripts specified");
690
+ pushWitScript(nativeScript);
691
+ }
692
+ return new cardano_ledger_ts_1.TxIn(utxo);
693
+ });
694
+ // good luck spending more than 4294.967295 ADA in fees
695
+ // also 16.777215 ADA (3 bytes) is a lot; but CBOR only uses 2 or 4 bytes integers
696
+ // and 2 are ~0.06 ADA (too low) so go for 4;
697
+ var dummyFee = BigInt("0xffffffff");
698
+ var dummyOuts = outs.map(function (txO) { return txO.clone(); });
699
+ // add dummy change address output
700
+ dummyOuts.push(new cardano_ledger_ts_1.TxOut({
701
+ address: change.address,
702
+ // this value obviously doesn't make sense
703
+ // however now we are not able to calculate it
704
+ // because we are missing the minted value and eventual
705
+ // values associated with certificates
706
+ value: cardano_ledger_ts_1.Value.lovelaces(totInputValue.lovelaces),
707
+ datum: change.datum ? (change.datum instanceof cardano_ledger_ts_1.Hash32 ?
708
+ change.datum :
709
+ (0, CanBeData_1.forceData)(change.datum)) : undef,
710
+ refScript: change.refScript
711
+ }));
712
+ // index to be modified
713
+ var dummyMintRedeemers = [];
714
+ var _mint = mints === null || mints === void 0 ? void 0 : mints.reduce(function (accum, _a, i) {
715
+ var script = _a.script, value = _a.value;
716
+ var redeemer = script.redeemer;
717
+ var policyId = value.policy;
718
+ var toExec = checkScriptAndPushIfInline(script);
719
+ dummyMintRedeemers.push([
720
+ policyId,
721
+ toExec,
722
+ new cardano_ledger_ts_1.TxRedeemer({
723
+ data: (0, CanBeData_1.forceData)(redeemer),
724
+ index: i,
725
+ execUnits: dummyExecBudget.clone(),
726
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Mint
727
+ })
728
+ ]);
729
+ return cardano_ledger_ts_1.Value.add(accum, new cardano_ledger_ts_1.Value([value]));
730
+ }, cardano_ledger_ts_1.Value.zero);
731
+ totInputValue = _mint instanceof cardano_ledger_ts_1.Value ? cardano_ledger_ts_1.Value.add(totInputValue, _mint) : totInputValue;
732
+ function indexOfPolicy(policy) {
733
+ var _a;
734
+ var policyStr = policy.toString();
735
+ return (_a = _mint === null || _mint === void 0 ? void 0 : _mint.map.findIndex(function (entry) { return entry.policy.toString() === policyStr; })) !== null && _a !== void 0 ? _a : -1;
736
+ }
737
+ dummyMintRedeemers.forEach(function (_a) {
738
+ var _b = __read(_a, 3), policy = _b[0], toExec = _b[1], dummyRdmr = _b[2];
739
+ var i = indexOfPolicy(policy);
740
+ mintRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
741
+ data: dummyRdmr.data,
742
+ index: i - 1,
743
+ execUnits: dummyRdmr.execUnits,
744
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Mint
745
+ }));
746
+ pushScriptToExec(i, cardano_ledger_ts_1.TxRedeemerTag.Mint, toExec);
747
+ });
748
+ var _certs = certificates === null || certificates === void 0 ? void 0 : certificates.map(function (_a, i) {
749
+ var cert = _a.cert, script = _a.script;
750
+ if (script !== undef) {
751
+ certRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
752
+ data: (0, CanBeData_1.forceData)(script.redeemer),
753
+ index: i,
754
+ execUnits: dummyExecBudget.clone(),
755
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Cert
756
+ }));
757
+ var toExec = checkScriptAndPushIfInline(script);
758
+ pushScriptToExec(i, cardano_ledger_ts_1.TxRedeemerTag.Cert, toExec);
759
+ }
760
+ return cert;
761
+ });
762
+ var _wits = withdrawals === null || withdrawals === void 0 ? void 0 : withdrawals.sort(function (_a, _b) {
763
+ var fst = _a.withdrawal;
764
+ var snd = _b.withdrawal;
765
+ return (0, uint8array_utils_1.lexCompare)(fst.rewardAccount instanceof cardano_ledger_ts_1.Hash28 ?
766
+ fst.rewardAccount.toBuffer() :
767
+ fst.rewardAccount.credentials.toBuffer(), snd.rewardAccount instanceof cardano_ledger_ts_1.Hash28 ?
768
+ snd.rewardAccount.toBuffer() :
769
+ snd.rewardAccount.credentials.toBuffer());
770
+ }).map(function (_a, i) {
771
+ var withdrawal = _a.withdrawal, script = _a.script;
772
+ if (script !== undef) {
773
+ withdrawRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
774
+ data: (0, CanBeData_1.forceData)(script.redeemer),
775
+ index: i,
776
+ execUnits: dummyExecBudget.clone(),
777
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Withdraw
778
+ }));
779
+ var toExec = checkScriptAndPushIfInline(script);
780
+ pushScriptToExec(i, cardano_ledger_ts_1.TxRedeemerTag.Withdraw, toExec);
781
+ }
782
+ return withdrawal;
783
+ });
784
+ var i = 0;
785
+ var _votingProcedures = Array.isArray(votingProcedures) ?
786
+ new cardano_ledger_ts_1.VotingProcedures(votingProcedures === null || votingProcedures === void 0 ? void 0 : votingProcedures.map(function (_a) {
787
+ var votingProcedure = _a.votingProcedure, script = _a.script;
788
+ if (script !== undef) {
789
+ voteRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
790
+ data: (0, CanBeData_1.forceData)(script.redeemer),
791
+ index: i,
792
+ execUnits: dummyExecBudget.clone(),
793
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Voting
794
+ }));
795
+ var toExec = checkScriptAndPushIfInline(script);
796
+ pushScriptToExec(i, cardano_ledger_ts_1.TxRedeemerTag.Voting, toExec);
797
+ i++;
798
+ }
799
+ return votingProcedure;
800
+ })) : undef;
801
+ var _proposalProcedures = Array.isArray(proposalProcedures) ?
802
+ proposalProcedures.map(function (_a) {
803
+ var proposalProcedure = _a.proposalProcedure, script = _a.script;
804
+ if (script !== undef) {
805
+ proposeRedeemers.push(new cardano_ledger_ts_1.TxRedeemer({
806
+ data: (0, CanBeData_1.forceData)(script.redeemer),
807
+ index: i,
808
+ execUnits: dummyExecBudget.clone(),
809
+ tag: cardano_ledger_ts_1.TxRedeemerTag.Proposing
810
+ }));
811
+ var toExec = checkScriptAndPushIfInline(script);
812
+ pushScriptToExec(i, cardano_ledger_ts_1.TxRedeemerTag.Proposing, toExec);
813
+ i++;
814
+ }
815
+ return new cardano_ledger_ts_1.ProposalProcedure(proposalProcedure);
816
+ }) : undef;
817
+ i = 0;
818
+ var auxData = undef;
819
+ var _metadata = metadata;
820
+ if (memo !== undef) {
821
+ _metadata = new cardano_ledger_ts_1.TxMetadata(__assign(__assign({}, _metadata === null || _metadata === void 0 ? void 0 : _metadata.metadata), { 674: new cardano_ledger_ts_1.TxMetadatumMap([
822
+ {
823
+ k: new cardano_ledger_ts_1.TxMetadatumText("msg"),
824
+ v: new cardano_ledger_ts_1.TxMetadatumList(splitStringByByteLength(memo, 64)
825
+ .map(function (chunk) { return new cardano_ledger_ts_1.TxMetadatumText(chunk); }))
826
+ }
827
+ ]) }));
828
+ }
829
+ if (_metadata !== undef) {
830
+ auxData = new cardano_ledger_ts_1.AuxiliaryData({
831
+ metadata: _metadata,
832
+ });
833
+ }
834
+ var redeemers = spendRedeemers
835
+ .concat(mintRedeemers)
836
+ .concat(withdrawRedeemers)
837
+ .concat(certRedeemers)
838
+ .concat(voteRedeemers)
839
+ .concat(proposeRedeemers);
840
+ var dummyTxWitnesses = new cardano_ledger_ts_1.TxWitnessSet({
841
+ vkeyWitnesses: vkeyWitnesses,
842
+ bootstrapWitnesses: bootstrapWitnesses,
843
+ datums: datums,
844
+ redeemers: redeemers,
845
+ nativeScripts: nativeScriptsWitnesses,
846
+ plutusV1Scripts: plutusV1ScriptsWitnesses,
847
+ plutusV2Scripts: plutusV2ScriptsWitnesses,
848
+ plutusV3Scripts: plutusV3ScriptsWitnesses
849
+ });
850
+ var datumsScriptData = datums.length > 0 ?
851
+ Array.from(cbor_1.Cbor.encode(new cbor_1.CborArray(datums.map(plutus_data_1.dataToCborObj))).toBuffer())
852
+ : [];
853
+ var languageViews = (0, cardano_costmodels_ts_1.costModelsToLanguageViewCbor)(this.protocolParamters.costModels, {
854
+ mustHaveV1: _hasV1Scripts,
855
+ mustHaveV2: _hasV2Scripts,
856
+ mustHaveV3: _hasV3Scripts
857
+ }).toBuffer();
858
+ invalidBefore = invalidBefore === undef ? undef : (0, ints_1.forceBigUInt)(invalidBefore);
859
+ // if( invalidAfter !== undef )
860
+ // {
861
+ // if( invalidBefore === undef ) invalidBefore = 0;
862
+ // }
863
+ if ((0, ints_1.canBeUInteger)(invalidBefore) &&
864
+ (0, ints_1.canBeUInteger)(invalidAfter)) {
865
+ if (invalidBefore >= invalidAfter)
866
+ throw new Error("invalid validity interval; invalidAfter: "
867
+ + invalidAfter.toString() +
868
+ "; was smaller (previous point in time) than invalidBefore:"
869
+ + invalidBefore.toString());
870
+ }
871
+ // assert collateral is present if needed
872
+ if (scriptsToExec.filter(function (s) { return s.script.type !== "NativeScript"; }).length > 0) {
873
+ if (!Array.isArray(collaterals) ||
874
+ collaterals.length <= 0) {
875
+ collaterals = this.findCollaterals(_inputs);
876
+ collateralReturn = undef;
877
+ }
878
+ if (collaterals.length <= 0)
879
+ throw new Error("collaterals missing, and no input could be used");
880
+ var collateralValue = collaterals.reduce(function (accum, collateral) { return cardano_ledger_ts_1.Value.add(accum, collateral.resolved.value); }, cardano_ledger_ts_1.Value.zero);
881
+ if (!cardano_ledger_ts_1.Value.isAdaOnly(collateralValue)) {
882
+ if (!collateralReturn) {
883
+ var addr = collaterals[0].resolved.address;
884
+ collateralReturn = new cardano_ledger_ts_1.TxOut({
885
+ address: addr,
886
+ value: collateralValue
887
+ });
888
+ var minAda = this.getMinimumOutputLovelaces(collateralReturn);
889
+ collateralReturn = new cardano_ledger_ts_1.TxOut({
890
+ address: addr,
891
+ value: cardano_ledger_ts_1.Value.sub(collateralValue, cardano_ledger_ts_1.Value.lovelaces(collateralValue.lovelaces - minAda))
892
+ });
893
+ }
894
+ var realCollValue = cardano_ledger_ts_1.Value.sub(collateralValue, collateralReturn.value);
895
+ if (!cardano_ledger_ts_1.Value.isAdaOnly(realCollValue))
896
+ throw new Error("total collateral value was including non-ADA value;\n" +
897
+ "total collateral value was: ".concat((0, stringify_1.stringify)(realCollValue.toJson(), undef, 2)));
898
+ }
899
+ }
900
+ var dummyTx = new cardano_ledger_ts_1.Tx({
901
+ body: new cardano_ledger_ts_1.TxBody({
902
+ inputs: _inputs,
903
+ outputs: dummyOuts,
904
+ fee: dummyFee,
905
+ mint: _mint,
906
+ certs: _certs,
907
+ withdrawals: _wits,
908
+ refInputs: refIns.length === 0 ? undef : refIns.map(function (refIn) { return refIn instanceof cardano_ledger_ts_1.TxIn ? refIn : new cardano_ledger_ts_1.TxIn(refIn); }),
909
+ // protocolUpdate: protocolUpdateProposal,
910
+ requiredSigners: requiredSigners,
911
+ collateralInputs: collaterals,
912
+ collateralReturn: collateralReturn === undef ?
913
+ undef :
914
+ (0, txBuild_1.txBuildOutToTxOut)(collateralReturn),
915
+ totCollateral: undef,
916
+ validityIntervalStart: invalidBefore === undef ?
917
+ undef :
918
+ (0, ints_1.forceBigUInt)(invalidBefore),
919
+ ttl: invalidAfter === undef ?
920
+ undef :
921
+ (0, ints_1.forceBigUInt)(invalidAfter),
922
+ auxDataHash: auxData === null || auxData === void 0 ? void 0 : auxData.hash,
923
+ scriptDataHash: getScriptDataHash(dummyTxWitnesses, languageViews),
924
+ network: network,
925
+ votingProcedures: _votingProcedures,
926
+ proposalProcedures: _proposalProcedures,
927
+ currentTreasuryValue: currentTreasuryValue,
928
+ donation: paymentToTreasury,
929
+ }),
930
+ witnesses: dummyTxWitnesses,
931
+ auxiliaryData: auxData,
932
+ isScriptValid: isScriptValid
933
+ });
934
+ var minFee = this.calcMinFee(dummyTx);
935
+ var txOuts = new Array(outs.length + 1);
936
+ outs.forEach(function (txO, i) { return txOuts[i] = txO.clone(); });
937
+ var changeOutput = new cardano_ledger_ts_1.TxOut({
938
+ address: change.address,
939
+ value: cardano_ledger_ts_1.Value.sub(totInputValue, cardano_ledger_ts_1.Value.add(requiredOutputValue, cardano_ledger_ts_1.Value.lovelaces(minFee))),
940
+ datum: change.datum ? (change.datum instanceof cardano_ledger_ts_1.Hash32 ?
941
+ change.datum :
942
+ (0, CanBeData_1.forceData)(change.datum)) : undef,
943
+ refScript: change.refScript
944
+ });
945
+ txOuts[txOuts.length - 1] = changeOutput;
946
+ this.assertCorrectChangeOutput(changeOutput);
947
+ var tx = new cardano_ledger_ts_1.Tx(__assign(__assign({}, dummyTx), { body: new cardano_ledger_ts_1.TxBody(__assign(__assign({}, dummyTx.body), { outputs: txOuts, fee: minFee })) }));
948
+ return {
949
+ tx: tx,
950
+ scriptsToExec: scriptsToExec,
951
+ minFee: minFee,
952
+ datumsScriptData: datumsScriptData,
953
+ languageViews: languageViews,
954
+ totInputValue: totInputValue,
955
+ requiredOutputValue: requiredOutputValue,
956
+ outs: outs,
957
+ change: change
958
+ };
959
+ };
960
+ TxBuilder.prototype.assertCorrectChangeOutput = function (changeOutput) {
961
+ var e_1, _a, e_2, _b;
962
+ if (changeOutput.value.lovelaces < 0)
963
+ throw new Error("not enough input lovelaces to cover the output value and fee");
964
+ try {
965
+ for (var _c = __values(changeOutput.value), _d = _c.next(); !_d.done; _d = _c.next()) {
966
+ var _e = _d.value, assets = _e.assets, policy = _e.policy;
967
+ if (policy === "")
968
+ continue;
969
+ try {
970
+ for (var assets_1 = (e_2 = void 0, __values(assets)), assets_1_1 = assets_1.next(); !assets_1_1.done; assets_1_1 = assets_1.next()) {
971
+ var _f = assets_1_1.value, quantity = _f.quantity, name_1 = _f.name;
972
+ if (quantity < 0) {
973
+ console.dir(changeOutput.value.toJson(), { depth: Infinity });
974
+ throw new Error("not enough ".concat(policy.toString(), ".").concat((0, uint8array_utils_1.toHex)(name_1), " in input to cover the total output"));
975
+ }
976
+ }
977
+ }
978
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
979
+ finally {
980
+ try {
981
+ if (assets_1_1 && !assets_1_1.done && (_b = assets_1.return)) _b.call(assets_1);
982
+ }
983
+ finally { if (e_2) throw e_2.error; }
984
+ }
985
+ }
986
+ }
987
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
988
+ finally {
989
+ try {
990
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
991
+ }
992
+ finally { if (e_1) throw e_1.error; }
993
+ }
994
+ };
995
+ TxBuilder.prototype.findCollaterals = function (utxos, targetCollateralLovelaces) {
996
+ var e_3, _a, e_4, _b;
997
+ var _c;
998
+ if (targetCollateralLovelaces === void 0) { targetCollateralLovelaces = 10000000; }
999
+ var grouped = {};
1000
+ var pkhs = [];
1001
+ try {
1002
+ for (var utxos_1 = __values(utxos), utxos_1_1 = utxos_1.next(); !utxos_1_1.done; utxos_1_1 = utxos_1.next()) {
1003
+ var u = utxos_1_1.value;
1004
+ var creds = u.resolved.address.paymentCreds;
1005
+ if (creds.type === cardano_ledger_ts_1.CredentialType.Script)
1006
+ continue;
1007
+ var pkh = creds.hash.toString();
1008
+ if (!Array.isArray(grouped[pkh])) {
1009
+ grouped[pkh] = [];
1010
+ pkhs.push(pkh);
1011
+ }
1012
+ grouped[pkh].push(u);
1013
+ }
1014
+ }
1015
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
1016
+ finally {
1017
+ try {
1018
+ if (utxos_1_1 && !utxos_1_1.done && (_a = utxos_1.return)) _a.call(utxos_1);
1019
+ }
1020
+ finally { if (e_3) throw e_3.error; }
1021
+ }
1022
+ if (pkhs.length === 0)
1023
+ return [];
1024
+ for (var i = 0; i < pkhs.length; i++) {
1025
+ var pkh = pkhs[i];
1026
+ grouped[pkh] = grouped[pkh]
1027
+ .sort(function (a, b) { return -Number(a.resolved.value.lovelaces - b.resolved.value.lovelaces); })
1028
+ .slice(0, Number((_c = this.protocolParamters.maxCollateralInputs) !== null && _c !== void 0 ? _c : 3));
1029
+ }
1030
+ var maxPkh = pkhs.shift();
1031
+ var maxLove = grouped[maxPkh].reduce(function (a, b) { return a + b.resolved.value.lovelaces; }, BigInt(0));
1032
+ try {
1033
+ for (var pkhs_1 = __values(pkhs), pkhs_1_1 = pkhs_1.next(); !pkhs_1_1.done; pkhs_1_1 = pkhs_1.next()) {
1034
+ var pkh = pkhs_1_1.value;
1035
+ var love = grouped[pkh].reduce(function (a, b) { return a + b.resolved.value.lovelaces; }, BigInt(0));
1036
+ if (love > maxLove) {
1037
+ maxPkh = pkh;
1038
+ maxLove = love;
1039
+ }
1040
+ }
1041
+ }
1042
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
1043
+ finally {
1044
+ try {
1045
+ if (pkhs_1_1 && !pkhs_1_1.done && (_b = pkhs_1.return)) _b.call(pkhs_1);
1046
+ }
1047
+ finally { if (e_4) throw e_4.error; }
1048
+ }
1049
+ var collaterals = grouped[maxPkh];
1050
+ targetCollateralLovelaces = BigInt(targetCollateralLovelaces);
1051
+ if (targetCollateralLovelaces < 0)
1052
+ targetCollateralLovelaces = -targetCollateralLovelaces;
1053
+ var filtered = collaterals.filter(function (u) { return u.resolved.value.lovelaces >= targetCollateralLovelaces; });
1054
+ if (filtered.length === 0)
1055
+ return collaterals;
1056
+ // try to reduce the number of utxo collaterals and collateral value.
1057
+ return [filtered[filtered.length - 1]];
1058
+ };
1059
+ return TxBuilder;
1060
+ }());
1061
+ exports.TxBuilder = TxBuilder;
1062
+ function eqUTxOByRef(a, b) {
1063
+ return a === b || a.utxoRef === b.utxoRef || (a.utxoRef.index === b.utxoRef.index &&
1064
+ a.utxoRef.id.toString() === b.utxoRef.id.toString());
1065
+ }
1066
+ function pushUniqueScript(arr, toPush) {
1067
+ var hashToPush = toPush.hash.toString();
1068
+ if (!arr.some(function (script) { return script.hash.toString() === hashToPush; }))
1069
+ arr.push(toPush);
1070
+ }
1071
+ function getCtx(scriptType, spendingPurpose, scriptInfo, redeemerData, txInfosV1, txInfosV2, txInfosV3) {
1072
+ if (scriptType === cardano_ledger_ts_1.ScriptType.PlutusV3) {
1073
+ return new plutus_data_1.DataConstr(0, [
1074
+ txInfosV3,
1075
+ redeemerData,
1076
+ scriptInfo
1077
+ ]);
1078
+ }
1079
+ else if (scriptType === cardano_ledger_ts_1.ScriptType.PlutusV2) {
1080
+ if (txInfosV2 === undefined)
1081
+ throw new Error("plutus script v2 included in a v3 transaction");
1082
+ return new plutus_data_1.DataConstr(0, [
1083
+ txInfosV2,
1084
+ spendingPurpose
1085
+ ]);
1086
+ }
1087
+ else if (scriptType === cardano_ledger_ts_1.ScriptType.PlutusV1) {
1088
+ if (txInfosV1 === undefined)
1089
+ throw new Error("plutus script v1 included in a v2 or v3 transaction");
1090
+ return new plutus_data_1.DataConstr(0, [
1091
+ txInfosV1,
1092
+ spendingPurpose
1093
+ ]);
1094
+ }
1095
+ else
1096
+ throw new Error("unexpected native script execution");
1097
+ }
1098
+ function onEvaluationResult(i, totExBudget, rdmr, result, budgetSpent, logs, callArgs, rdmrs, onScriptResult, onScriptInvalid) {
1099
+ var _isScriptValid = true;
1100
+ // artificially add some budget to allow for small exec costs errors
1101
+ // TODO: fix `plutus-machine` evaluation
1102
+ // budgetSpent.add({
1103
+ // cpu: 100_000,
1104
+ // mem: 10_000
1105
+ // });
1106
+ onScriptResult && onScriptResult(rdmr.clone(), result, budgetSpent.clone(), logs.slice(), callArgs.map(function (d) { return d.clone(); }));
1107
+ if (result instanceof uplc_1.ErrorUPLC ||
1108
+ (function (resultKeys) {
1109
+ return resultKeys.includes("msg") &&
1110
+ resultKeys.includes("addInfos");
1111
+ })(Object.keys(result))) {
1112
+ if (typeof onScriptInvalid === "function") {
1113
+ onScriptInvalid(rdmr.clone(), logs.slice(), callArgs.map(function (d) { return d.clone(); }));
1114
+ _isScriptValid = false;
1115
+ }
1116
+ else {
1117
+ throw new Error("script consumed with ".concat((0, cardano_ledger_ts_1.txRedeemerTagToString)(rdmr.tag), " redemer ") +
1118
+ "and index '".concat(rdmr.index.toString(), "'\n\n") +
1119
+ "called with data arguments:\n".concat(callArgs
1120
+ .map(function (d, i) {
1121
+ return i.toString() + ": " + (0, plutus_data_1.dataToCbor)(d).toString();
1122
+ })
1123
+ .join("\n"), "\n\n") +
1124
+ "failed with \n" +
1125
+ "error message: ".concat(result.msg, "\n") +
1126
+ "additional infos: ".concat((0, stringify_1.stringify)(result.addInfos, function (k, v) {
1127
+ if ((0, uint8array_utils_1.isUint8Array)(v))
1128
+ return (0, uint8array_utils_1.toHex)(v);
1129
+ if (typeof v === "bigint")
1130
+ return v.toString();
1131
+ return v;
1132
+ }), "\n") +
1133
+ "script execution logs: [".concat(logs.toString(), "]\n"));
1134
+ }
1135
+ }
1136
+ rdmrs[i] = new cardano_ledger_ts_1.TxRedeemer(__assign(__assign({}, rdmr), { execUnits: budgetSpent }));
1137
+ totExBudget.add(budgetSpent);
1138
+ return _isScriptValid;
1139
+ }
1140
+ ;
1141
+ function findWitnessKey(map, n) {
1142
+ var _a;
1143
+ var res = (_a = map.map.find(function (_a) {
1144
+ var k = _a.k;
1145
+ return k instanceof cbor_1.CborUInt && Number(k.num) === n;
1146
+ })) === null || _a === void 0 ? void 0 : _a.v;
1147
+ if (!(res instanceof cbor_1.CborArray))
1148
+ return undefined;
1149
+ if (res.array.length === 0)
1150
+ return undefined;
1151
+ return res;
1152
+ }
1153
+ function getScriptDataHash(witnesses, languageViews) {
1154
+ var undef = void 0;
1155
+ var cbor = witnesses.toCborObj();
1156
+ if (!(cbor instanceof cbor_1.CborMap))
1157
+ return undef;
1158
+ var rdmrs = findWitnessKey(cbor, 5);
1159
+ var dats = findWitnessKey(cbor, 4);
1160
+ if (rdmrs === undef &&
1161
+ dats === undef)
1162
+ return undef;
1163
+ var scriptData;
1164
+ if (rdmrs === undef &&
1165
+ dats !== undef) {
1166
+ /* (Deprecated)
1167
+ ; Finally, note that in the case that a transaction includes datums but does not
1168
+ ; include any redeemers, the script data format becomes (in hex):
1169
+ ; [ 80 | datums | A0 ]
1170
+ ; corresponding to a CBOR empty list and an empty map (our apologies).
1171
+ */
1172
+ /* Post Babbage:
1173
+ ; [ A0 | datums | A0 ]
1174
+ */
1175
+ scriptData = new Uint8Array(__spreadArray(__spreadArray([
1176
+ 0xa0
1177
+ ], __read(cbor_1.Cbor.encode(dats).toBuffer()), false), [
1178
+ 0xa0
1179
+ ], false));
1180
+ }
1181
+ else {
1182
+ var rdmrsBuff = rdmrs ? cbor_1.Cbor.encode(rdmrs).toBuffer() : new Uint8Array([0x80]);
1183
+ var datsBuff = dats ? cbor_1.Cbor.encode(dats).toBuffer() : new Uint8Array([]);
1184
+ scriptData = new Uint8Array(rdmrsBuff.length + datsBuff.length + languageViews.length);
1185
+ scriptData.set(rdmrsBuff, 0);
1186
+ scriptData.set(datsBuff, rdmrsBuff.length);
1187
+ scriptData.set(languageViews, rdmrsBuff.length + datsBuff.length);
1188
+ }
1189
+ return new cardano_ledger_ts_1.ScriptDataHash(Uint8Array.from((0, crypto_1.blake2b_256)(scriptData)));
1190
+ }
1191
+ exports.getScriptDataHash = getScriptDataHash;
1192
+ // Helper function to get byte length of a string using UTF-8 encoding
1193
+ // const getByteLength = (str: string): number => {
1194
+ // return new TextEncoder().encode(str).length;
1195
+ // };
1196
+ function getByteLength(str) {
1197
+ return (0, uint8array_utils_1.fromUtf8)(str).length;
1198
+ }
1199
+ /**
1200
+ * Claude prompt (yes I'm lazy):
1201
+ *
1202
+ * write a typescript function that given a string and a number,
1203
+ * returns an array of strings whose length IN BYTES is at most the second parameter,
1204
+ * if a utf 8 char is present at the intersection
1205
+ * of the two chunks IT MUST STAY INTACT and it will be part of the following chunk.
1206
+ *
1207
+ * @example
1208
+ * const exampleString = "Hello, 🌍! This is a test.";
1209
+ * const maxChunkBytes = 10;
1210
+ * const result = splitStringByByteLength(exampleString, maxChunkBytes);
1211
+ * console.log(result); // ["Hello, ", "🌍! This", " is a test", "."]
1212
+ */
1213
+ function splitStringByByteLength(input, maxByteLength) {
1214
+ var e_5, _a;
1215
+ if (maxByteLength === void 0) { maxByteLength = 64; }
1216
+ // If input is empty or max byte length is 0, return empty array
1217
+ if (!input || maxByteLength <= 0)
1218
+ return [];
1219
+ var chunks = [];
1220
+ var currentChunk = '';
1221
+ try {
1222
+ for (var input_1 = __values(input), input_1_1 = input_1.next(); !input_1_1.done; input_1_1 = input_1.next()) {
1223
+ var char = input_1_1.value;
1224
+ var potentialChunk = currentChunk + char;
1225
+ var potentialChunkByteLength = getByteLength(potentialChunk);
1226
+ // If adding this character would exceed max byte length
1227
+ if (potentialChunkByteLength > maxByteLength) {
1228
+ // Push current chunk and start a new one
1229
+ if (currentChunk) {
1230
+ chunks.push(currentChunk);
1231
+ currentChunk = '';
1232
+ }
1233
+ }
1234
+ // Add character to current chunk
1235
+ currentChunk += char;
1236
+ }
1237
+ }
1238
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
1239
+ finally {
1240
+ try {
1241
+ if (input_1_1 && !input_1_1.done && (_a = input_1.return)) _a.call(input_1);
1242
+ }
1243
+ finally { if (e_5) throw e_5.error; }
1244
+ }
1245
+ // Add final chunk if not empty
1246
+ if (currentChunk) {
1247
+ chunks.push(currentChunk);
1248
+ }
1249
+ return chunks;
1250
+ }
1251
+ exports.splitStringByByteLength = splitStringByByteLength;