@cardano-sdk/input-selection 0.6.0-nightly.1

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 (72) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +50 -0
  4. package/dist/cjs/InputSelectionError.d.ts +12 -0
  5. package/dist/cjs/InputSelectionError.d.ts.map +1 -0
  6. package/dist/cjs/InputSelectionError.js +19 -0
  7. package/dist/cjs/InputSelectionError.js.map +1 -0
  8. package/dist/cjs/RoundRobinRandomImprove/change.d.ts +23 -0
  9. package/dist/cjs/RoundRobinRandomImprove/change.d.ts.map +1 -0
  10. package/dist/cjs/RoundRobinRandomImprove/change.js +227 -0
  11. package/dist/cjs/RoundRobinRandomImprove/change.js.map +1 -0
  12. package/dist/cjs/RoundRobinRandomImprove/index.d.ts +7 -0
  13. package/dist/cjs/RoundRobinRandomImprove/index.d.ts.map +1 -0
  14. package/dist/cjs/RoundRobinRandomImprove/index.js +52 -0
  15. package/dist/cjs/RoundRobinRandomImprove/index.js.map +1 -0
  16. package/dist/cjs/RoundRobinRandomImprove/roundRobin.d.ts +3 -0
  17. package/dist/cjs/RoundRobinRandomImprove/roundRobin.d.ts.map +1 -0
  18. package/dist/cjs/RoundRobinRandomImprove/roundRobin.js +65 -0
  19. package/dist/cjs/RoundRobinRandomImprove/roundRobin.js.map +1 -0
  20. package/dist/cjs/RoundRobinRandomImprove/util.d.ts +34 -0
  21. package/dist/cjs/RoundRobinRandomImprove/util.d.ts.map +1 -0
  22. package/dist/cjs/RoundRobinRandomImprove/util.js +76 -0
  23. package/dist/cjs/RoundRobinRandomImprove/util.js.map +1 -0
  24. package/dist/cjs/index.d.ts +5 -0
  25. package/dist/cjs/index.d.ts.map +1 -0
  26. package/dist/cjs/index.js +21 -0
  27. package/dist/cjs/index.js.map +1 -0
  28. package/dist/cjs/package.json +3 -0
  29. package/dist/cjs/selectionConstraints.d.ts +14 -0
  30. package/dist/cjs/selectionConstraints.d.ts.map +1 -0
  31. package/dist/cjs/selectionConstraints.js +43 -0
  32. package/dist/cjs/selectionConstraints.js.map +1 -0
  33. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  34. package/dist/cjs/types.d.ts +40 -0
  35. package/dist/cjs/types.d.ts.map +1 -0
  36. package/dist/cjs/types.js +3 -0
  37. package/dist/cjs/types.js.map +1 -0
  38. package/dist/esm/InputSelectionError.d.ts +12 -0
  39. package/dist/esm/InputSelectionError.d.ts.map +1 -0
  40. package/dist/esm/InputSelectionError.js +15 -0
  41. package/dist/esm/InputSelectionError.js.map +1 -0
  42. package/dist/esm/RoundRobinRandomImprove/change.d.ts +23 -0
  43. package/dist/esm/RoundRobinRandomImprove/change.d.ts.map +1 -0
  44. package/dist/esm/RoundRobinRandomImprove/change.js +220 -0
  45. package/dist/esm/RoundRobinRandomImprove/change.js.map +1 -0
  46. package/dist/esm/RoundRobinRandomImprove/index.d.ts +7 -0
  47. package/dist/esm/RoundRobinRandomImprove/index.d.ts.map +1 -0
  48. package/dist/esm/RoundRobinRandomImprove/index.js +48 -0
  49. package/dist/esm/RoundRobinRandomImprove/index.js.map +1 -0
  50. package/dist/esm/RoundRobinRandomImprove/roundRobin.d.ts +3 -0
  51. package/dist/esm/RoundRobinRandomImprove/roundRobin.d.ts.map +1 -0
  52. package/dist/esm/RoundRobinRandomImprove/roundRobin.js +61 -0
  53. package/dist/esm/RoundRobinRandomImprove/roundRobin.js.map +1 -0
  54. package/dist/esm/RoundRobinRandomImprove/util.d.ts +34 -0
  55. package/dist/esm/RoundRobinRandomImprove/util.d.ts.map +1 -0
  56. package/dist/esm/RoundRobinRandomImprove/util.js +63 -0
  57. package/dist/esm/RoundRobinRandomImprove/util.js.map +1 -0
  58. package/dist/esm/index.d.ts +5 -0
  59. package/dist/esm/index.d.ts.map +1 -0
  60. package/dist/esm/index.js +5 -0
  61. package/dist/esm/index.js.map +1 -0
  62. package/dist/esm/package.json +3 -0
  63. package/dist/esm/selectionConstraints.d.ts +14 -0
  64. package/dist/esm/selectionConstraints.d.ts.map +1 -0
  65. package/dist/esm/selectionConstraints.js +35 -0
  66. package/dist/esm/selectionConstraints.js.map +1 -0
  67. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  68. package/dist/esm/types.d.ts +40 -0
  69. package/dist/esm/types.d.ts.map +1 -0
  70. package/dist/esm/types.js +2 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/package.json +78 -0
@@ -0,0 +1,220 @@
1
+ import { Cardano, coalesceValueQuantities } from '@cardano-sdk/core';
2
+ import { InputSelectionError, InputSelectionFailure } from '../InputSelectionError';
3
+ import { assetQuantitySelector, getCoinQuantity, toValues } from './util';
4
+ import minBy from 'lodash/minBy';
5
+ import orderBy from 'lodash/orderBy';
6
+ import pick from 'lodash/pick';
7
+ const getLeftoverAssets = (utxoSelected, uniqueTxAssetIDs) => {
8
+ const leftovers = new Map();
9
+ for (const [_, { value: { assets } }] of utxoSelected) {
10
+ if (assets) {
11
+ const leftoverAssetKeys = [...assets.keys()].filter((id) => !uniqueTxAssetIDs.includes(id));
12
+ for (const assetKey of leftoverAssetKeys) {
13
+ const quantity = assets.get(assetKey);
14
+ if (quantity === 0n)
15
+ continue;
16
+ const assetLeftovers = leftovers.get(assetKey) || [];
17
+ leftovers.set(assetKey, [...assetLeftovers, quantity]);
18
+ }
19
+ }
20
+ }
21
+ return leftovers;
22
+ };
23
+ const redistributeLeftoverAssets = (utxoSelected, requestedAssetChangeBundles, uniqueTxAssetIDs) => {
24
+ const leftovers = getLeftoverAssets(utxoSelected, uniqueTxAssetIDs);
25
+ const resultBundles = [...requestedAssetChangeBundles];
26
+ for (const assetId of leftovers.keys()) {
27
+ const quantities = orderBy(leftovers.get(assetId), (q) => q, 'desc');
28
+ if (resultBundles.length === 0) {
29
+ resultBundles.push({ coins: 0n });
30
+ }
31
+ while (quantities.length > resultBundles.length) {
32
+ const smallestQuantity = quantities.pop();
33
+ quantities[quantities.length - 1] += smallestQuantity;
34
+ }
35
+ for (const [idx, quantity] of quantities.entries()) {
36
+ const originalBundle = resultBundles[idx];
37
+ const originalBundleAssets = originalBundle.assets?.entries() || [];
38
+ resultBundles.splice(idx, 1, {
39
+ assets: new Map([...originalBundleAssets, [assetId, quantity]]),
40
+ coins: originalBundle.coins
41
+ });
42
+ }
43
+ }
44
+ return resultBundles;
45
+ };
46
+ const createBundlePerOutput = (outputValues, coinTotalRequested, coinChangeTotal, assetTotals) => {
47
+ let totalCoinBundled = 0n;
48
+ const totalAssetsBundled = new Map();
49
+ const bundles = outputValues.map((value) => {
50
+ const coins = coinTotalRequested > 0n ? (coinChangeTotal * value.coins) / coinTotalRequested : 0n;
51
+ totalCoinBundled += coins;
52
+ if (!value.assets) {
53
+ return { coins };
54
+ }
55
+ const assets = new Map();
56
+ for (const [assetId, outputAmount] of value.assets.entries()) {
57
+ const { selected, requested } = assetTotals.get(assetId);
58
+ const assetChangeTotal = selected - requested;
59
+ const assetChange = (assetChangeTotal * outputAmount) / selected;
60
+ totalAssetsBundled.set(assetId, (totalAssetsBundled.get(assetId) || 0n) + assetChange);
61
+ assets.set(assetId, assetChange);
62
+ }
63
+ return { assets, coins };
64
+ });
65
+ return { bundles, totalAssetsBundled, totalCoinBundled };
66
+ };
67
+ const smallestBundleTokenMap = (bundles) => {
68
+ if (bundles.length === 0) {
69
+ const bundle = { assets: new Map(), coins: 0n };
70
+ bundles.push(bundle);
71
+ return bundle.assets;
72
+ }
73
+ const bundle = minBy(bundles, ({ assets }) => assets?.size || 0);
74
+ if (!bundle.assets)
75
+ bundle.assets = new Map();
76
+ return bundle.assets;
77
+ };
78
+ const computeRequestedAssetChangeBundles = (utxoSelected, outputValues, uniqueTxAssetIDs, { implicitCoin, implicitTokens }, fee) => {
79
+ const assetTotals = new Map();
80
+ const utxoSelectedValues = toValues(utxoSelected);
81
+ for (const assetId of uniqueTxAssetIDs) {
82
+ assetTotals.set(assetId, {
83
+ requested: assetQuantitySelector(assetId)(outputValues) + implicitTokens.spend(assetId),
84
+ selected: assetQuantitySelector(assetId)(utxoSelectedValues) + implicitTokens.input(assetId)
85
+ });
86
+ }
87
+ const coinTotalSelected = getCoinQuantity(utxoSelectedValues) + implicitCoin.input;
88
+ const coinTotalRequested = getCoinQuantity(outputValues) + fee + implicitCoin.deposit;
89
+ const coinChangeTotal = coinTotalSelected - coinTotalRequested;
90
+ const { totalCoinBundled, bundles, totalAssetsBundled } = createBundlePerOutput(outputValues, coinTotalRequested, coinChangeTotal, assetTotals);
91
+ const coinLost = coinChangeTotal - totalCoinBundled;
92
+ if (coinLost > 0) {
93
+ if (bundles.length === 0) {
94
+ bundles.push({ coins: coinLost });
95
+ }
96
+ else {
97
+ bundles[0].coins += coinLost;
98
+ }
99
+ }
100
+ for (const assetId of uniqueTxAssetIDs) {
101
+ const assetTotal = assetTotals.get(assetId);
102
+ const bundled = totalAssetsBundled.get(assetId) || 0n;
103
+ const assetLost = assetTotal.selected - assetTotal.requested - bundled;
104
+ if (assetLost > 0n) {
105
+ const anyChangeTokenBundle = bundles.find(({ assets }) => assets?.has(assetId))?.assets || smallestBundleTokenMap(bundles);
106
+ const assetQuantityAlreadyInBundle = anyChangeTokenBundle.get(assetId) || 0n;
107
+ anyChangeTokenBundle.set(assetId, assetQuantityAlreadyInBundle + assetLost);
108
+ }
109
+ }
110
+ return bundles;
111
+ };
112
+ const pickExtraRandomUtxo = ({ utxoRemaining, utxoSelected }, random) => {
113
+ const remainingUtxoOfOnlyCoin = utxoRemaining.filter(([_, { value }]) => !value.assets);
114
+ const pickFrom = remainingUtxoOfOnlyCoin.length > 0 ? remainingUtxoOfOnlyCoin : utxoRemaining;
115
+ const pickIdx = Math.floor(random() * pickFrom.length);
116
+ const newUtxoSelected = [...utxoSelected, pickFrom[pickIdx]];
117
+ const originalIdx = utxoRemaining.indexOf(pickFrom[pickIdx]);
118
+ const newUtxoRemaining = [...utxoRemaining.slice(0, originalIdx), ...utxoRemaining.slice(originalIdx + 1)];
119
+ return { utxoRemaining: newUtxoRemaining, utxoSelected: newUtxoSelected };
120
+ };
121
+ const coalesceChangeBundlesForMinCoinRequirement = (changeBundles, computeMinimumCoinQuantity) => {
122
+ if (changeBundles.length === 0) {
123
+ return changeBundles;
124
+ }
125
+ const noZeroQuantityAssetChangeBundles = changeBundles.map(({ coins, assets }) => ({
126
+ assets: assets ? new Map([...assets.entries()].filter(([_, quantity]) => quantity > 0n)) : undefined,
127
+ coins
128
+ }));
129
+ let sortedBundles = orderBy(noZeroQuantityAssetChangeBundles, ({ coins }) => coins, 'desc');
130
+ const stubMaxSizeAddress = Cardano.Address('addr_test1qqydn46r6mhge0kfpqmt36m6q43knzsd9ga32n96m89px3nuzcjqw982pcftgx53fu5527z2cj2tkx2h8ux2vxsg475qypp3m9');
131
+ const satisfiesMinCoinRequirement = (value) => {
132
+ const stubTxOut = { address: stubMaxSizeAddress, value };
133
+ return value.coins >= computeMinimumCoinQuantity(stubTxOut);
134
+ };
135
+ while (sortedBundles.length > 1 && !satisfiesMinCoinRequirement(sortedBundles[sortedBundles.length - 1])) {
136
+ const smallestBundle = sortedBundles.pop();
137
+ sortedBundles[sortedBundles.length - 1] = coalesceValueQuantities([
138
+ sortedBundles[sortedBundles.length - 1],
139
+ smallestBundle
140
+ ]);
141
+ sortedBundles = orderBy(sortedBundles, ({ coins }) => coins, 'desc');
142
+ }
143
+ if (!satisfiesMinCoinRequirement(sortedBundles[0])) {
144
+ return undefined;
145
+ }
146
+ return sortedBundles.filter((bundle) => bundle.coins > 0n || (bundle.assets?.size || 0) > 0);
147
+ };
148
+ const computeChangeBundles = ({ utxoSelection, outputValues, uniqueTxAssetIDs, implicitValue, computeMinimumCoinQuantity, fee = 0n }) => {
149
+ const requestedAssetChangeBundles = computeRequestedAssetChangeBundles(utxoSelection.utxoSelected, outputValues, uniqueTxAssetIDs, implicitValue, fee);
150
+ const requestedAssetChangeBundlesWithLeftoverAssets = redistributeLeftoverAssets(utxoSelection.utxoSelected, requestedAssetChangeBundles, uniqueTxAssetIDs);
151
+ const changeBundles = coalesceChangeBundlesForMinCoinRequirement(requestedAssetChangeBundlesWithLeftoverAssets, computeMinimumCoinQuantity);
152
+ if (!changeBundles) {
153
+ return false;
154
+ }
155
+ return { changeBundles, ...utxoSelection };
156
+ };
157
+ const validateChangeBundles = (changeBundles, tokenBundleSizeExceedsLimit) => {
158
+ for (const { assets } of changeBundles) {
159
+ if (!assets)
160
+ continue;
161
+ if (tokenBundleSizeExceedsLimit(assets)) {
162
+ throw new InputSelectionError(InputSelectionFailure.UtxoFullyDepleted);
163
+ }
164
+ }
165
+ return changeBundles;
166
+ };
167
+ export const computeChangeAndAdjustForFee = async ({ computeMinimumCoinQuantity, tokenBundleSizeExceedsLimit, estimateTxFee, outputValues, uniqueTxAssetIDs, implicitValue, random, utxoSelection }) => {
168
+ const recomputeChangeAndAdjustForFeeWithExtraUtxo = (currentUtxoSelection) => {
169
+ if (currentUtxoSelection.utxoRemaining.length > 0) {
170
+ return computeChangeAndAdjustForFee({
171
+ computeMinimumCoinQuantity,
172
+ estimateTxFee,
173
+ implicitValue,
174
+ outputValues,
175
+ random,
176
+ tokenBundleSizeExceedsLimit,
177
+ uniqueTxAssetIDs,
178
+ utxoSelection: pickExtraRandomUtxo(currentUtxoSelection, random)
179
+ });
180
+ }
181
+ throw new InputSelectionError(InputSelectionFailure.UtxoFullyDepleted);
182
+ };
183
+ const selectionWithChangeAndFee = computeChangeBundles({
184
+ computeMinimumCoinQuantity,
185
+ implicitValue,
186
+ outputValues,
187
+ uniqueTxAssetIDs,
188
+ utxoSelection
189
+ });
190
+ if (!selectionWithChangeAndFee)
191
+ return recomputeChangeAndAdjustForFeeWithExtraUtxo(utxoSelection);
192
+ const fee = await estimateTxFee(selectionWithChangeAndFee.utxoSelected, validateChangeBundles(selectionWithChangeAndFee.changeBundles, tokenBundleSizeExceedsLimit));
193
+ const totalOutputCoin = getCoinQuantity(outputValues) + fee + implicitValue.implicitCoin.deposit;
194
+ const totalInputCoin = getCoinQuantity(toValues(selectionWithChangeAndFee.utxoSelected)) + implicitValue.implicitCoin.input;
195
+ if (totalOutputCoin > totalInputCoin) {
196
+ if (selectionWithChangeAndFee.utxoRemaining.length === 0) {
197
+ throw new InputSelectionError(InputSelectionFailure.UtxoBalanceInsufficient);
198
+ }
199
+ return recomputeChangeAndAdjustForFeeWithExtraUtxo(selectionWithChangeAndFee);
200
+ }
201
+ const finalSelection = computeChangeBundles({
202
+ computeMinimumCoinQuantity,
203
+ fee,
204
+ implicitValue,
205
+ outputValues,
206
+ uniqueTxAssetIDs,
207
+ utxoSelection: pick(selectionWithChangeAndFee, ['utxoRemaining', 'utxoSelected'])
208
+ });
209
+ if (!finalSelection) {
210
+ return recomputeChangeAndAdjustForFeeWithExtraUtxo(selectionWithChangeAndFee);
211
+ }
212
+ const { changeBundles, utxoSelected, utxoRemaining } = finalSelection;
213
+ return {
214
+ change: validateChangeBundles(changeBundles, tokenBundleSizeExceedsLimit),
215
+ fee,
216
+ inputs: utxoSelected,
217
+ remainingUTxO: utxoRemaining
218
+ };
219
+ };
220
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { InputSelector } from '../types';
2
+ interface RoundRobinRandomImproveOptions {
3
+ random?: typeof Math.random;
4
+ }
5
+ export declare const roundRobinRandomImprove: ({ random }?: RoundRobinRandomImproveOptions) => InputSelector;
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,aAAa,EAAmB,MAAM,UAAU,CAAC;AAMpF,UAAU,8BAA8B;IACtC,MAAM,CAAC,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,uBAAuB,gBAEjC,8BAA8B,KAAQ,aAqDvC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { InputSelectionError, InputSelectionFailure } from '../InputSelectionError';
2
+ import { assertIsBalanceSufficient, preProcessArgs, toValues } from './util';
3
+ import { computeChangeAndAdjustForFee } from './change';
4
+ import { cslUtil } from '@cardano-sdk/core';
5
+ import { roundRobinSelection } from './roundRobin';
6
+ export const roundRobinRandomImprove = ({ random = Math.random } = {}) => ({
7
+ select: async ({ utxo: utxoSet, outputs: outputSet, constraints: { computeMinimumCost, computeSelectionLimit, computeMinimumCoinQuantity, tokenBundleSizeExceedsLimit }, implicitValue: partialImplicitValue = {} }) => {
8
+ const { utxo, outputs, uniqueTxAssetIDs, implicitValue } = preProcessArgs(utxoSet, outputSet, partialImplicitValue);
9
+ assertIsBalanceSufficient(uniqueTxAssetIDs, utxo, outputs, implicitValue);
10
+ const roundRobinSelectionResult = roundRobinSelection({
11
+ implicitValue,
12
+ outputs,
13
+ random,
14
+ uniqueTxAssetIDs,
15
+ utxo
16
+ });
17
+ const result = await computeChangeAndAdjustForFee({
18
+ computeMinimumCoinQuantity,
19
+ estimateTxFee: (utxos, changeValues) => computeMinimumCost({
20
+ change: new Set(changeValues),
21
+ fee: cslUtil.MAX_U64,
22
+ inputs: new Set(utxos),
23
+ outputs: outputSet
24
+ }),
25
+ implicitValue,
26
+ outputValues: toValues(outputs),
27
+ random,
28
+ tokenBundleSizeExceedsLimit,
29
+ uniqueTxAssetIDs,
30
+ utxoSelection: roundRobinSelectionResult
31
+ });
32
+ const inputs = new Set(result.inputs);
33
+ const change = new Set(result.change);
34
+ if (result.inputs.length > (await computeSelectionLimit({ change, fee: result.fee, inputs, outputs: outputSet }))) {
35
+ throw new InputSelectionError(InputSelectionFailure.MaximumInputCountExceeded);
36
+ }
37
+ return {
38
+ remainingUTxO: new Set(result.remainingUTxO),
39
+ selection: {
40
+ change,
41
+ fee: result.fee,
42
+ inputs,
43
+ outputs: outputSet
44
+ }
45
+ };
46
+ }
47
+ });
48
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpF,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EACtC,MAAM,GAAG,IAAI,CAAC,MAAM,KACc,EAAE,EAAiB,EAAE,CAAC,CAAC;IACzD,MAAM,EAAE,KAAK,EAAE,EACb,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,SAAS,EAClB,WAAW,EAAE,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,EACnH,aAAa,EAAE,oBAAoB,GAAG,EAAE,EACf,EAA4B,EAAE;QACvD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAEpH,yBAAyB,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAE1E,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;YACpD,aAAa;YACb,OAAO;YACP,MAAM;YACN,gBAAgB;YAChB,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAAC;YAChD,0BAA0B;YAC1B,aAAa,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CACrC,kBAAkB,CAAC;gBACjB,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC;gBAC7B,GAAG,EAAE,OAAO,CAAC,OAAO;gBACpB,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC;gBACtB,OAAO,EAAE,SAAS;aACnB,CAAC;YACJ,aAAa;YACb,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC;YAC/B,MAAM;YACN,2BAA2B;YAC3B,gBAAgB;YAChB,aAAa,EAAE,yBAAyB;SACzC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,qBAAqB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;YACjH,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;SAChF;QAED,OAAO;YACL,aAAa,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;YAC5C,SAAS,EAAE;gBACT,MAAM;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM;gBACN,OAAO,EAAE,SAAS;aACnB;SACF,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { RoundRobinRandomImproveArgs, UtxoSelection } from './util';
2
+ export declare const roundRobinSelection: ({ utxo: utxosWithValue, outputs: outputsWithValue, uniqueTxAssetIDs, random, implicitValue }: RoundRobinRandomImproveArgs) => UtxoSelection;
3
+ //# sourceMappingURL=roundRobin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundRobin.d.ts","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/roundRobin.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,2BAA2B,EAC3B,aAAa,EAId,MAAM,QAAQ,CAAC;AAiEhB,eAAO,MAAM,mBAAmB,iGAM7B,2BAA2B,KAAG,aA2ChC,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { BigIntMath } from '@cardano-sdk/util';
2
+ import { assetQuantitySelector, getCoinQuantity, toValues } from './util';
3
+ const improvesSelection = (utxoAlreadySelected, input, minimumTarget, getQuantity) => {
4
+ const oldQuantity = getQuantity(utxoAlreadySelected);
5
+ if (oldQuantity < minimumTarget)
6
+ return true;
7
+ const newQuantity = oldQuantity + getQuantity([input]);
8
+ const idealTarget = 2n * minimumTarget;
9
+ const newDistance = BigIntMath.abs(idealTarget - newQuantity);
10
+ const oldDistance = BigIntMath.abs(idealTarget - oldQuantity);
11
+ if (newDistance < oldDistance)
12
+ return true;
13
+ return false;
14
+ };
15
+ const listTokensWithin = (uniqueOutputAssetIDs, outputs, { implicitCoin, implicitTokens }) => [
16
+ ...uniqueOutputAssetIDs.map((id) => {
17
+ const getQuantity = assetQuantitySelector(id);
18
+ const implicitInput = implicitTokens.input(id);
19
+ const implicitSpend = implicitTokens.spend(id);
20
+ return {
21
+ filterUtxo: (utxo) => utxo.filter(([_, { value: { assets } }]) => assets?.get(id)),
22
+ getTotalSelectedQuantity: (utxo) => getQuantity(toValues(utxo)) + implicitInput,
23
+ minimumTarget: getQuantity(toValues(outputs)) + implicitSpend
24
+ };
25
+ }),
26
+ {
27
+ filterUtxo: (utxo) => utxo,
28
+ getTotalSelectedQuantity: (utxo) => getCoinQuantity(toValues(utxo)) + implicitCoin.input,
29
+ minimumTarget: getCoinQuantity(toValues(outputs)) + implicitCoin.deposit
30
+ }
31
+ ];
32
+ export const roundRobinSelection = ({ utxo: utxosWithValue, outputs: outputsWithValue, uniqueTxAssetIDs, random, implicitValue }) => {
33
+ const utxoSelected = [];
34
+ const utxoRemaining = [...utxosWithValue];
35
+ const tokensRemaining = listTokensWithin(uniqueTxAssetIDs, outputsWithValue, implicitValue);
36
+ while (tokensRemaining.length > 0) {
37
+ for (const [tokenIdx, { filterUtxo, minimumTarget, getTotalSelectedQuantity }] of tokensRemaining.entries()) {
38
+ const utxo = filterUtxo(utxoRemaining);
39
+ if (utxo.length > 0) {
40
+ const inputIdx = Math.floor(random() * utxo.length);
41
+ const input = utxo[inputIdx];
42
+ if (improvesSelection(utxoSelected, input, minimumTarget, getTotalSelectedQuantity)) {
43
+ utxoSelected.push(input);
44
+ utxoRemaining.splice(utxoRemaining.indexOf(input), 1);
45
+ }
46
+ else {
47
+ tokensRemaining.splice(tokenIdx, 1);
48
+ }
49
+ }
50
+ else {
51
+ tokensRemaining.splice(tokenIdx, 1);
52
+ }
53
+ }
54
+ }
55
+ if (utxoSelected.length === 0) {
56
+ utxoSelected.push(utxoRemaining[0]);
57
+ utxoRemaining.splice(0, 1);
58
+ }
59
+ return { utxoRemaining, utxoSelected };
60
+ };
61
+ //# sourceMappingURL=roundRobin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundRobin.js","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/roundRobin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Cardano } from '@cardano-sdk/core';
2
+ import { ImplicitValue } from '../types';
3
+ export interface ImplicitTokens {
4
+ spend(assetId: Cardano.AssetId): bigint;
5
+ input(assetId: Cardano.AssetId): bigint;
6
+ }
7
+ export interface RequiredImplicitValue {
8
+ implicitCoin: Required<Cardano.util.ImplicitCoin>;
9
+ implicitTokens: ImplicitTokens;
10
+ }
11
+ export interface RoundRobinRandomImproveArgs {
12
+ utxo: Cardano.Utxo[];
13
+ outputs: Cardano.TxOut[];
14
+ uniqueTxAssetIDs: Cardano.AssetId[];
15
+ implicitValue: RequiredImplicitValue;
16
+ random: typeof Math.random;
17
+ }
18
+ export declare type PreProcessedArgs = Omit<RoundRobinRandomImproveArgs, 'random'>;
19
+ export interface UtxoSelection {
20
+ utxoSelected: Cardano.Utxo[];
21
+ utxoRemaining: Cardano.Utxo[];
22
+ }
23
+ export declare const mintToImplicitTokens: (mintMap?: Cardano.TokenMap) => {
24
+ implicitTokensInput: Map<Cardano.AssetId, bigint>;
25
+ implicitTokensSpend: Map<Cardano.AssetId, bigint>;
26
+ };
27
+ export declare const preProcessArgs: (availableUtxo: Set<Cardano.Utxo>, outputSet: Set<Cardano.TxOut>, partialImplicitValue?: ImplicitValue) => PreProcessedArgs;
28
+ export declare function toValues(outputs: Cardano.TxOut[]): Cardano.Value[];
29
+ export declare function toValues(utxo: Cardano.Utxo[]): Cardano.Value[];
30
+ export declare const assetQuantitySelector: (id: Cardano.AssetId) => (quantities: Cardano.Value[]) => bigint;
31
+ export declare const getCoinQuantity: (quantities: Cardano.Value[]) => bigint;
32
+ export declare const assertIsCoinBalanceSufficient: (utxoValues: Cardano.Value[], outputValues: Cardano.Value[], implicitCoin: Required<Cardano.util.ImplicitCoin>) => void;
33
+ export declare const assertIsBalanceSufficient: (uniqueTxAssetIDs: Cardano.AssetId[], utxo: Cardano.Utxo[], outputs: Cardano.TxOut[], { implicitCoin, implicitTokens }: RequiredImplicitValue) => void;
34
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IACxC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAClD,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACpC,aAAa,EAAE,qBAAqB,CAAC;IACrC,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC;CAC5B;AAED,oBAAY,gBAAgB,GAAG,IAAI,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;AAE3E,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;IAC7B,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;CAC/B;AAED,eAAO,MAAM,oBAAoB;;;CAOhC,CAAC;AAEF,eAAO,MAAM,cAAc,kBACV,IAAI,QAAQ,IAAI,CAAC,aACrB,IAAI,QAAQ,KAAK,CAAC,yBACN,aAAa,KACnC,gBAoBF,CAAC;AAKF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AACpE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;AAWhE,eAAO,MAAM,qBAAqB,wCAEnB,QAAQ,KAAK,EAAE,KAAG,MACwC,CAAC;AAE1E,eAAO,MAAM,eAAe,eAAgB,QAAQ,KAAK,EAAE,KAAG,MACR,CAAC;AAEvD,eAAO,MAAM,6BAA6B,eAC5B,QAAQ,KAAK,EAAE,gBACb,QAAQ,KAAK,EAAE,gBACf,SAAS,QAAQ,IAAI,CAAC,YAAY,CAAC,SAOlD,CAAC;AAQF,eAAO,MAAM,yBAAyB,qBAClB,QAAQ,OAAO,EAAE,QAC7B,QAAQ,IAAI,EAAE,WACX,QAAQ,KAAK,EAAE,oCACU,qBAAqB,KACtD,IAeF,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { BigIntMath } from '@cardano-sdk/util';
2
+ import { InputSelectionError, InputSelectionFailure } from '../InputSelectionError';
3
+ import uniq from 'lodash/uniq';
4
+ export const mintToImplicitTokens = (mintMap = new Map()) => {
5
+ const mint = [...mintMap.entries()];
6
+ const implicitTokensInput = new Map(mint.filter(([_, quantity]) => quantity > 0));
7
+ const implicitTokensSpend = new Map(mint.filter(([_, quantity]) => quantity < 0).map(([assetId, quantity]) => [assetId, -quantity]));
8
+ return { implicitTokensInput, implicitTokensSpend };
9
+ };
10
+ export const preProcessArgs = (availableUtxo, outputSet, partialImplicitValue) => {
11
+ const outputs = [...outputSet];
12
+ const implicitCoin = {
13
+ deposit: partialImplicitValue?.coin?.deposit || 0n,
14
+ input: partialImplicitValue?.coin?.input || 0n
15
+ };
16
+ const mintMap = partialImplicitValue?.mint || new Map();
17
+ const { implicitTokensInput, implicitTokensSpend } = mintToImplicitTokens(mintMap);
18
+ const implicitTokens = {
19
+ input: (assetId) => implicitTokensInput.get(assetId) || 0n,
20
+ spend: (assetId) => implicitTokensSpend.get(assetId) || 0n
21
+ };
22
+ const uniqueOutputAssetIDs = uniq(outputs.flatMap(({ value: { assets } }) => [...(assets?.keys() || [])]));
23
+ const uniqueTxAssetIDs = uniq([...uniqueOutputAssetIDs, ...mintMap.keys()]);
24
+ return {
25
+ implicitValue: { implicitCoin, implicitTokens },
26
+ outputs,
27
+ uniqueTxAssetIDs,
28
+ utxo: [...availableUtxo]
29
+ };
30
+ };
31
+ const isUtxoArray = (outputsOrUtxo) => outputsOrUtxo.length > 0 && Array.isArray(outputsOrUtxo[0]);
32
+ export function toValues(outputsOrUtxo) {
33
+ if (isUtxoArray(outputsOrUtxo)) {
34
+ return outputsOrUtxo.map(([_, { value }]) => value);
35
+ }
36
+ return outputsOrUtxo.map(({ value }) => value);
37
+ }
38
+ export const assetQuantitySelector = (id) => (quantities) => BigIntMath.sum(quantities.map(({ assets }) => assets?.get(id) || 0n));
39
+ export const getCoinQuantity = (quantities) => BigIntMath.sum(quantities.map(({ coins }) => coins));
40
+ export const assertIsCoinBalanceSufficient = (utxoValues, outputValues, implicitCoin) => {
41
+ const utxoCoinTotal = getCoinQuantity(utxoValues);
42
+ const outputsCoinTotal = getCoinQuantity(outputValues);
43
+ if (outputsCoinTotal + implicitCoin.deposit > utxoCoinTotal + implicitCoin.input) {
44
+ throw new InputSelectionError(InputSelectionFailure.UtxoBalanceInsufficient);
45
+ }
46
+ };
47
+ export const assertIsBalanceSufficient = (uniqueTxAssetIDs, utxo, outputs, { implicitCoin, implicitTokens }) => {
48
+ if (utxo.length === 0) {
49
+ throw new InputSelectionError(InputSelectionFailure.UtxoBalanceInsufficient);
50
+ }
51
+ const utxoValues = toValues(utxo);
52
+ const outputsValues = toValues(outputs);
53
+ for (const assetId of uniqueTxAssetIDs) {
54
+ const getAssetQuantity = assetQuantitySelector(assetId);
55
+ const utxoTotal = getAssetQuantity(utxoValues);
56
+ const outputsTotal = getAssetQuantity(outputsValues);
57
+ if (outputsTotal + implicitTokens.spend(assetId) > utxoTotal + implicitTokens.input(assetId)) {
58
+ throw new InputSelectionError(InputSelectionFailure.UtxoBalanceInsufficient);
59
+ }
60
+ }
61
+ assertIsCoinBalanceSufficient(utxoValues, outputsValues, implicitCoin);
62
+ };
63
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../src/RoundRobinRandomImprove/util.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpF,OAAO,IAAI,MAAM,aAAa,CAAC;AA2B/B,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA4B,IAAI,GAAG,EAAE,EAAE,EAAE;IAC5E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAChG,CAAC;IACF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,aAAgC,EAChC,SAA6B,EAC7B,oBAAoC,EAClB,EAAE;IACpB,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAwC;QACxD,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE;QAClD,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE;KAC/C,CAAC;IACF,MAAM,OAAO,GAAqB,oBAAoB,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;IAC1E,MAAM,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACnF,MAAM,cAAc,GAAmB;QACrC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1D,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;KAC3D,CAAC;IACF,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,GAAG,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO;QACL,aAAa,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE;QAC/C,OAAO;QACP,gBAAgB;QAChB,IAAI,EAAE,CAAC,GAAG,aAAa,CAAC;KACzB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,aAA+C,EAAmC,EAAE,CACvG,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAO9D,MAAM,UAAU,QAAQ,CAAC,aAA+C;IACtE,IAAI,WAAW,CAAC,aAAa,CAAC,EAAE;QAC9B,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;KACrD;IACD,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAChC,CAAC,EAAmB,EAAE,EAAE,CACxB,CAAC,UAA2B,EAAU,EAAE,CACtC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAE1E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAA2B,EAAU,EAAE,CACrE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,UAA2B,EAC3B,YAA6B,EAC7B,YAAiD,EACjD,EAAE;IACF,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IACvD,IAAI,gBAAgB,GAAG,YAAY,CAAC,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC,KAAK,EAAE;QAChF,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;KAC9E;AACH,CAAC,CAAC;AAQF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,gBAAmC,EACnC,IAAoB,EACpB,OAAwB,EACxB,EAAE,YAAY,EAAE,cAAc,EAAyB,EACjD,EAAE;IACR,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACrB,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;KAC9E;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE;QACtC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;YAC5F,MAAM,IAAI,mBAAmB,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;SAC9E;KACF;IACD,6BAA6B,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;AACzE,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './RoundRobinRandomImprove';
2
+ export * from './selectionConstraints';
3
+ export * from './types';
4
+ export * from './InputSelectionError';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './RoundRobinRandomImprove';
2
+ export * from './selectionConstraints';
3
+ export * from './types';
4
+ export * from './InputSelectionError';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,SAAS,CAAC;AACxB,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,14 @@
1
+ import { CSL } from '@cardano-sdk/core';
2
+ import { ComputeMinimumCoinQuantity, ComputeSelectionLimit, EstimateTxFee, ProtocolParametersForInputSelection, SelectionConstraints, SelectionSkeleton, TokenBundleSizeExceedsLimit } from './types';
3
+ import { ProtocolParametersRequiredByInputSelection } from '.';
4
+ export declare type BuildTx = (selection: SelectionSkeleton) => Promise<CSL.Transaction>;
5
+ export interface DefaultSelectionConstraintsProps {
6
+ protocolParameters: ProtocolParametersForInputSelection;
7
+ buildTx: BuildTx;
8
+ }
9
+ export declare const computeMinimumCost: ({ minFeeCoefficient, minFeeConstant }: Pick<ProtocolParametersRequiredByInputSelection, 'minFeeCoefficient' | 'minFeeConstant'>, buildTx: BuildTx) => EstimateTxFee;
10
+ export declare const computeMinimumCoinQuantity: (coinsPerUtxoByte: ProtocolParametersRequiredByInputSelection['coinsPerUtxoByte']) => ComputeMinimumCoinQuantity;
11
+ export declare const tokenBundleSizeExceedsLimit: (maxValueSize: ProtocolParametersRequiredByInputSelection['maxValueSize']) => TokenBundleSizeExceedsLimit;
12
+ export declare const computeSelectionLimit: (maxTxSize: ProtocolParametersRequiredByInputSelection['maxTxSize'], buildTx: BuildTx) => ComputeSelectionLimit;
13
+ export declare const defaultSelectionConstraints: ({ protocolParameters: { coinsPerUtxoByte, maxTxSize, maxValueSize, minFeeCoefficient, minFeeConstant }, buildTx }: DefaultSelectionConstraintsProps) => SelectionConstraints;
14
+ //# sourceMappingURL=selectionConstraints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionConstraints.d.ts","sourceRoot":"","sources":["../../src/selectionConstraints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAsD,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,aAAa,EACb,mCAAmC,EACnC,oBAAoB,EACpB,iBAAiB,EACjB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,0CAA0C,EAAE,MAAM,GAAG,CAAC;AAE/D,oBAAY,OAAO,GAAG,CAAC,SAAS,EAAE,iBAAiB,KAAK,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAEjF,MAAM,WAAW,gCAAgC;IAC/C,kBAAkB,EAAE,mCAAmC,CAAC;IACxD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,0CAKxB,KAAK,0CAA0C,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,WAClF,OAAO,KACf,aAYF,CAAC;AAEJ,eAAO,MAAM,0BAA0B,qBAClB,0CAA0C,CAAC,kBAAkB,CAAC,KAAG,0BAOjF,CAAC;AAEN,eAAO,MAAM,2BAA2B,iBACvB,0CAA0C,CAAC,cAAc,CAAC,KAAG,2BAQ3E,CAAC;AAWJ,eAAO,MAAM,qBAAqB,cACpB,0CAA0C,CAAC,WAAW,CAAC,WAAW,OAAO,KAAG,qBAQvF,CAAC;AAEJ,eAAO,MAAM,2BAA2B,sHAGrC,gCAAgC,KAAG,oBAYrC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { CSL, InvalidProtocolParametersError, coreToCsl, cslUtil } from '@cardano-sdk/core';
2
+ export const computeMinimumCost = ({ minFeeCoefficient, minFeeConstant }, buildTx) => async (selection) => {
3
+ const tx = await buildTx(selection);
4
+ return BigInt(CSL.min_fee(tx, CSL.LinearFee.new(CSL.BigNum.from_str(minFeeCoefficient.toString()), CSL.BigNum.from_str(minFeeConstant.toString()))).to_str());
5
+ };
6
+ export const computeMinimumCoinQuantity = (coinsPerUtxoByte) => (output) => BigInt(CSL.min_ada_for_output(coreToCsl.txOut(output), CSL.DataCost.new_coins_per_byte(CSL.BigNum.from_str(coinsPerUtxoByte.toString()))).to_str());
7
+ export const tokenBundleSizeExceedsLimit = (maxValueSize) => (tokenBundle) => {
8
+ if (!tokenBundle) {
9
+ return false;
10
+ }
11
+ const value = CSL.Value.new(cslUtil.maxBigNum);
12
+ value.set_multiasset(coreToCsl.tokenMap(tokenBundle));
13
+ return value.to_bytes().length > maxValueSize;
14
+ };
15
+ const getTxSize = (tx) => tx.to_bytes().length;
16
+ export const computeSelectionLimit = (maxTxSize, buildTx) => async (selectionSkeleton) => {
17
+ const tx = await buildTx(selectionSkeleton);
18
+ const txSize = getTxSize(tx);
19
+ if (txSize <= maxTxSize) {
20
+ return selectionSkeleton.inputs.size;
21
+ }
22
+ return selectionSkeleton.inputs.size - 1;
23
+ };
24
+ export const defaultSelectionConstraints = ({ protocolParameters: { coinsPerUtxoByte, maxTxSize, maxValueSize, minFeeCoefficient, minFeeConstant }, buildTx }) => {
25
+ if (!coinsPerUtxoByte || !maxTxSize || !maxValueSize || !minFeeCoefficient || !minFeeConstant) {
26
+ throw new InvalidProtocolParametersError('Missing one of: coinsPerUtxoByte, maxTxSize, maxValueSize, minFeeCoefficient, minFeeConstant');
27
+ }
28
+ return {
29
+ computeMinimumCoinQuantity: computeMinimumCoinQuantity(coinsPerUtxoByte),
30
+ computeMinimumCost: computeMinimumCost({ minFeeCoefficient, minFeeConstant }, buildTx),
31
+ computeSelectionLimit: computeSelectionLimit(maxTxSize, buildTx),
32
+ tokenBundleSizeExceedsLimit: tokenBundleSizeExceedsLimit(maxValueSize)
33
+ };
34
+ };
35
+ //# sourceMappingURL=selectionConstraints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectionConstraints.js","sourceRoot":"","sources":["../../src/selectionConstraints.ts"],"names":[],"mappings":"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"}