Skip to content

Commit 36e93bc

Browse files
committed
fix(cip2): add fee to selection skeleton
1 parent f93e3f1 commit 36e93bc

File tree

5 files changed

+12
-8
lines changed

5 files changed

+12
-8
lines changed

Diff for: packages/cip2/src/RoundRobinRandomImprove/index.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CardanoSerializationLib } from '@cardano-sdk/core';
22
import { InputSelectionError, InputSelectionFailure } from '../InputSelectionError';
33
import { InputSelectionParameters, InputSelector, SelectionResult } from '../types';
4-
import { transactionOutputsToArray } from '../util';
4+
import { maxBigNum, transactionOutputsToArray } from '../util';
55
import { computeChangeAndAdjustForFee } from './change';
66
import { roundRobinSelection } from './roundRobin';
77
import { assertIsBalanceSufficient, preprocessArgs } from './util';
@@ -21,6 +21,7 @@ export const roundRobinRandomImprove = (csl: CardanoSerializationLib): InputSele
2121
fee: await computeMinimumCost({
2222
change: [],
2323
utxo,
24+
fee: maxBigNum(csl),
2425
outputs
2526
}),
2627
change: [],
@@ -45,11 +46,12 @@ export const roundRobinRandomImprove = (csl: CardanoSerializationLib): InputSele
4546
computeMinimumCost({
4647
utxo: utxos,
4748
change: changeValues,
49+
fee: maxBigNum(csl),
4850
outputs
4951
})
5052
});
5153

52-
if (inputs.length > (await computeSelectionLimit({ utxo: inputs, change, outputs }))) {
54+
if (inputs.length > (await computeSelectionLimit({ utxo: inputs, change, fee: maxBigNum(csl), outputs }))) {
5355
throw new InputSelectionError(InputSelectionFailure.MaximumInputCountExceeded);
5456
}
5557

Diff for: packages/cip2/src/selectionConstraints.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { CardanoSerializationLib, CSL, ProtocolParametersRequiredByWallet } from '@cardano-sdk/core';
22
import { ComputeSelectionLimit, SelectionConstraints, TokenBundleSizeExceedsLimit } from '.';
33
import { ComputeMinimumCoinQuantity, EstimateTxFee, SelectionSkeleton } from './types';
4+
import { MAX_U64 } from './util';
45

56
export type BuildTx = (selection: SelectionSkeleton) => Promise<CSL.Transaction>;
67
export interface DefaultSelectionConstraintsProps {
@@ -36,7 +37,7 @@ export const computeMinimumCoinQuantity =
3637
{ coinsPerUtxoWord }: ProtocolParametersRequiredByWallet
3738
): ComputeMinimumCoinQuantity =>
3839
(multiasset) => {
39-
const minUTxOValue = CSL.BigNum.from_str((coinsPerUtxoWord * 29).toString());
40+
const minUTxOValue = csl.BigNum.from_str((coinsPerUtxoWord * 29).toString());
4041
const value = csl.Value.new(csl.BigNum.from_str('0'));
4142
if (multiasset) {
4243
value.set_multiasset(multiasset);
@@ -50,8 +51,7 @@ export const tokenBundleSizeExceedsLimit =
5051
if (!tokenBundle) {
5152
return false;
5253
}
53-
// Review: assuming coin serializes to the same size regardless of quantity
54-
const value = csl.Value.new(csl.BigNum.from_str('0'));
54+
const value = csl.Value.new(csl.BigNum.from_str(MAX_U64.toString()));
5555
value.set_multiasset(tokenBundle);
5656
return value.to_bytes().length > maxValueSize;
5757
};

Diff for: packages/cip2/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export interface SelectionSkeleton {
3939
utxo: CSL.TransactionUnspentOutput[];
4040
outputs: CSL.TransactionOutputs;
4141
change: CSL.Value[];
42+
fee: CSL.BigNum;
4243
}
4344

4445
/**

Diff for: packages/cip2/src/util.ts

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import { CardanoSerializationLib, CSL, Asset, Ogmios } from '@cardano-sdk/core';
66
export type AssetQuantities = Ogmios.util.AssetQuantities;
77
export type ValueQuantities = Ogmios.util.ValueQuantities;
88

9+
export const MAX_U64 = 18_446_744_073_709_551_615n;
10+
export const maxBigNum = (csl: CardanoSerializationLib) => csl.BigNum.from_str(MAX_U64.toString());
11+
912
export const transactionOutputsToArray = (outputs: CSL.TransactionOutputs): CSL.TransactionOutput[] => {
1013
const result: CSL.TransactionOutput[] = [];
1114
for (let outputIdx = 0; outputIdx < outputs.len(); outputIdx++) {

Diff for: packages/cip2/test/util/properties.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { AllAssets, containsUtxo, TestUtils } from './util';
22
import { SelectionResult } from '../../src/types';
33
import { CSL, Ogmios } from '@cardano-sdk/core';
44
import { InputSelectionError, InputSelectionFailure } from '../../src/InputSelectionError';
5-
import { AssetQuantities, ValueQuantities, valueToValueQuantities } from '../../src/util';
5+
import { AssetQuantities, MAX_U64, ValueQuantities, valueToValueQuantities } from '../../src/util';
66
import fc, { Arbitrary } from 'fast-check';
77
import { MockSelectionConstraints } from './constraints';
88

@@ -116,8 +116,6 @@ export const assertFailureProperties = ({
116116
* @returns {Arbitrary} fast-check arbitrary that generates valid sets of UTxO and outputs for input selection.
117117
*/
118118
export const generateSelectionParams = (() => {
119-
const MAX_U64 = 18_446_744_073_709_551_615n;
120-
121119
/**
122120
* Generate random amount of coin and assets.
123121
*/

0 commit comments

Comments
 (0)