@xmr-core/xmr-mymonero-libs
Version:
A collection of utilities for building ontop of a MyMonero compatible API
75 lines (68 loc) • 1.8 kB
text/typescript
import { popRandElement } from "./arr_utils";
import { Log } from "./logger";
import { BigInt } from "@xmr-core/biginteger";
import { config } from "@xmr-core/xmr-constants";
import { JSONPrettyPrint } from "@xmr-core/xmr-str-utils";
import { Output } from "@xmr-core/xmr-transaction";
export function selectOutputsAndAmountForMixin(
targetAmount: BigInt,
unusedOuts: Output[],
isRingCT: boolean,
sweeping: boolean,
) {
JSONPrettyPrint(
"selectOutputsAndAmountForMixin",
{
targetAmount,
unusedOuts,
isRingCT,
sweeping,
},
"args",
);
Log.SelectOutsAndAmtForMix.target(targetAmount);
let usingOutsAmount = new BigInt(0);
const usingOuts: Output[] = [];
const remainingUnusedOuts = unusedOuts.slice(); // take copy so as to prevent issue if we must re-enter tx building fn if fee too low after building
while (
usingOutsAmount.compare(targetAmount) < 0 &&
remainingUnusedOuts.length > 0
) {
const out = popRandElement(remainingUnusedOuts);
if (!isRingCT && out.rct) {
// out.rct is set by the server
continue; // skip rct outputs if not creating rct tx
}
const outAmount = new BigInt(out.amount);
if (outAmount.compare(config.dustThreshold) < 0) {
// amount is dusty..
if (!sweeping) {
Log.SelectOutsAndAmtForMix.Dusty.notSweeping();
continue;
}
if (!out.rct) {
Log.SelectOutsAndAmtForMix.Dusty.rct();
continue;
} else {
Log.SelectOutsAndAmtForMix.Dusty.nonRct();
}
}
usingOuts.push(out);
usingOutsAmount = usingOutsAmount.add(outAmount);
Log.SelectOutsAndAmtForMix.usingOut(outAmount, out);
}
JSONPrettyPrint(
"selectOutputsAndAmountForMixin",
{
usingOuts,
usingOutsAmount,
remainingUnusedOuts,
},
"ret",
);
return {
usingOuts,
usingOutsAmount,
remainingUnusedOuts,
};
}