@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.
- package/LICENSE +201 -0
- package/README.md +22 -0
- package/dist/TxBuilder/CanResolveToUTxO/CanResolveToUTxO.d.ts +5 -0
- package/dist/TxBuilder/CanResolveToUTxO/CanResolveToUTxO.js +62 -0
- package/dist/TxBuilder/CanResolveToUTxO/index.d.ts +1 -0
- package/dist/TxBuilder/CanResolveToUTxO/index.js +17 -0
- package/dist/TxBuilder/GenesisInfos.d.ts +54 -0
- package/dist/TxBuilder/GenesisInfos.js +56 -0
- package/dist/TxBuilder/IProvider/IProvider.d.ts +42 -0
- package/dist/TxBuilder/IProvider/IProvider.js +2 -0
- package/dist/TxBuilder/IProvider/index.d.ts +1 -0
- package/dist/TxBuilder/IProvider/index.js +17 -0
- package/dist/TxBuilder/TxBuilder.d.ts +106 -0
- package/dist/TxBuilder/TxBuilder.js +1251 -0
- package/dist/TxBuilder/TxBuilderProtocolParams.d.ts +42 -0
- package/dist/TxBuilder/TxBuilderProtocolParams.js +121 -0
- package/dist/TxBuilder/TxBuilderRunner/CanBePoolKeyHash.d.ts +3 -0
- package/dist/TxBuilder/TxBuilderRunner/CanBePoolKeyHash.js +33 -0
- package/dist/TxBuilder/TxBuilderRunner/CanBeStakeCreds.d.ts +3 -0
- package/dist/TxBuilder/TxBuilderRunner/CanBeStakeCreds.js +25 -0
- package/dist/TxBuilder/TxBuilderRunner/TxBuilderRunner.d.ts +280 -0
- package/dist/TxBuilder/TxBuilderRunner/TxBuilderRunner.js +1366 -0
- package/dist/TxBuilder/TxBuilderRunner/forceAddr.d.ts +2 -0
- package/dist/TxBuilder/TxBuilderRunner/forceAddr.js +8 -0
- package/dist/TxBuilder/TxBuilderRunner/index.d.ts +2 -0
- package/dist/TxBuilder/TxBuilderRunner/index.js +18 -0
- package/dist/TxBuilder/TxBuilderRunner/jsonToMetadata.d.ts +2 -0
- package/dist/TxBuilder/TxBuilderRunner/jsonToMetadata.js +35 -0
- package/dist/TxBuilder/index.d.ts +5 -0
- package/dist/TxBuilder/index.js +21 -0
- package/dist/TxBuilder/keepRelevant.d.ts +4 -0
- package/dist/TxBuilder/keepRelevant.js +79 -0
- package/dist/TxBuilder/utils.d.ts +4 -0
- package/dist/TxBuilder/utils.js +66 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +31 -0
- package/dist/toOnChain/getSpendingPurposeData.d.ts +5 -0
- package/dist/toOnChain/getSpendingPurposeData.js +98 -0
- package/dist/toOnChain/getTxInfos.d.ts +8 -0
- package/dist/toOnChain/getTxInfos.js +126 -0
- package/dist/toOnChain/getTxIntervalData.d.ts +19 -0
- package/dist/toOnChain/getTxIntervalData.js +85 -0
- package/dist/toOnChain/index.d.ts +2 -0
- package/dist/toOnChain/index.js +18 -0
- package/dist/txBuild/ChangeInfos/ChangeInfos.d.ts +15 -0
- package/dist/txBuild/ChangeInfos/ChangeInfos.js +27 -0
- package/dist/txBuild/ITxBuildArgs.d.ts +74 -0
- package/dist/txBuild/ITxBuildArgs.js +71 -0
- package/dist/txBuild/ITxBuildCert.d.ts +13 -0
- package/dist/txBuild/ITxBuildCert.js +37 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInput.d.ts +25 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInput.js +70 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInputInlineScript.d.ts +14 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInputInlineScript.js +14 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInputRefScript.d.ts +14 -0
- package/dist/txBuild/ITxBuildInput/ITxBuildInputRefScript.js +15 -0
- package/dist/txBuild/ITxBuildMint.d.ts +30 -0
- package/dist/txBuild/ITxBuildMint.js +54 -0
- package/dist/txBuild/ITxBuildOptions.d.ts +11 -0
- package/dist/txBuild/ITxBuildOptions.js +2 -0
- package/dist/txBuild/ITxBuildOutput.d.ts +10 -0
- package/dist/txBuild/ITxBuildOutput.js +27 -0
- package/dist/txBuild/ITxBuildProposalProcedure.d.ts +11 -0
- package/dist/txBuild/ITxBuildProposalProcedure.js +13 -0
- package/dist/txBuild/ITxBuildVotingProcedure.d.ts +13 -0
- package/dist/txBuild/ITxBuildVotingProcedure.js +40 -0
- package/dist/txBuild/ITxBuildWithdrawal.d.ts +29 -0
- package/dist/txBuild/ITxBuildWithdrawal.js +34 -0
- package/dist/txBuild/ScriptWithRedeemer.d.ts +18 -0
- package/dist/txBuild/ScriptWithRedeemer.js +16 -0
- package/dist/txBuild/index.d.ts +7 -0
- package/dist/txBuild/index.js +23 -0
- package/dist/utils/CanBeData.d.ts +7 -0
- package/dist/utils/CanBeData.js +68 -0
- package/dist/utils/Rational.d.ts +8 -0
- package/dist/utils/Rational.js +34 -0
- package/dist/utils/assert.d.ts +1 -0
- package/dist/utils/assert.js +44 -0
- package/dist/utils/ints.d.ts +4 -0
- package/dist/utils/ints.js +25 -0
- package/dist/utils/stringify.d.ts +2 -0
- package/dist/utils/stringify.js +38 -0
- 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;
|