Skip to content

Commit

Permalink
feat: wip
Browse files Browse the repository at this point in the history
  • Loading branch information
HinsonSIDAN committed May 15, 2024
1 parent cc6a62b commit 5af4215
Show file tree
Hide file tree
Showing 10 changed files with 139 additions and 150 deletions.
2 changes: 0 additions & 2 deletions packages/module/src/common/helpers/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,2 @@
export * from './generateNonce';
export * from './mergeSignatures';
export * from './readPlutusData';
export * from './readTransaction';
6 changes: 0 additions & 6 deletions packages/module/src/common/helpers/readTransaction.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,130 +1,130 @@
import type { Quantity, UTxO, Unit } from '@mesh/common/types';

export const selectUtxos = (
inputs: UTxO[],
requiredAssets: Map<Unit, Quantity>,
threshold: Quantity
): UTxO[] => {
const totalRequiredAssets = new Map<Unit, Quantity>(requiredAssets);
totalRequiredAssets.set(
'lovelace',
String(Number(totalRequiredAssets.get('lovelace')) + Number(threshold))
);
const utxoMap = new Map<number, UTxO>();
for (let i = 0; i < inputs.length; i++) {
utxoMap.set(i, inputs[i]);
}
const selectedInputs = new Set<number>();
const onlyLovelace = new Set<number>();
const singletons = new Set<number>();
const pairs = new Set<number>();
const rest = new Set<number>();
for (let i = 0; i < inputs.length; i++) {
switch (inputs[i].output.amount.length) {
case 1: {
onlyLovelace.add(i);
break;
}
case 2: {
singletons.add(i);
break;
}
case 3: {
pairs.add(i);
break;
}
default: {
rest.add(i);
break;
}
}
}

const addUtxoWithAssetAmount = (
inputIndex: number,
assetUnit: string,
set: Set<number>
) => {
const utxo = utxoMap.get(inputIndex);
if (!utxo) return;

const amount = getAssetAmount(utxo, assetUnit);
if (Number(amount) > 0) {
selectedInputs.add(inputIndex);
set.delete(inputIndex);
for (const asset of utxo.output.amount) {
totalRequiredAssets.set(
asset.unit,
String(
Number(totalRequiredAssets.get(asset.unit)) - Number(asset.quantity)
)
);
}
}
};

for (const assetUnit of totalRequiredAssets.keys()) {
if (assetUnit == 'lovelace') continue;
for (const inputIndex of singletons) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, singletons);
}

for (const inputIndex of pairs) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, pairs);
}

for (const inputIndex of rest) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, rest);
}
}

for (const inputIndex of onlyLovelace) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', onlyLovelace);
}

for (const inputIndex of singletons) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', singletons);
}

for (const inputIndex of pairs) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', pairs);
}

for (const inputIndex of rest) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', rest);
}

for (const assetUnit of totalRequiredAssets.keys()) {
if (Number(totalRequiredAssets.get(assetUnit)) > 0) return [];
}

const selectedUtxos: UTxO[] = [];
for (const inputIndex of selectedInputs) {
const utxo = utxoMap.get(inputIndex);
if (utxo) {
selectedUtxos.push(utxo);
}
}
return selectedUtxos;
};

const getAssetAmount = (utxo: UTxO, assetUnit: string): string => {
for (const utxoAsset of utxo.output.amount) {
if (utxoAsset.unit == assetUnit) return utxoAsset.quantity;
}
return '0';
};
import type { Quantity, UTxO, Unit } from '@mesh/common/types';

export const selectUtxos = (
inputs: UTxO[],
requiredAssets: Map<Unit, Quantity>,
threshold: Quantity
): UTxO[] => {
const totalRequiredAssets = new Map<Unit, Quantity>(requiredAssets);
totalRequiredAssets.set(
'lovelace',
String(Number(totalRequiredAssets.get('lovelace')) + Number(threshold))
);
const utxoMap = new Map<number, UTxO>();
for (let i = 0; i < inputs.length; i++) {
utxoMap.set(i, inputs[i]);
}
const selectedInputs = new Set<number>();
const onlyLovelace = new Set<number>();
const singletons = new Set<number>();
const pairs = new Set<number>();
const rest = new Set<number>();
for (let i = 0; i < inputs.length; i++) {
switch (inputs[i].output.amount.length) {
case 1: {
onlyLovelace.add(i);
break;
}
case 2: {
singletons.add(i);
break;
}
case 3: {
pairs.add(i);
break;
}
default: {
rest.add(i);
break;
}
}
}

const addUtxoWithAssetAmount = (
inputIndex: number,
assetUnit: string,
set: Set<number>
) => {
const utxo = utxoMap.get(inputIndex);
if (!utxo) return;

const amount = getAssetAmount(utxo, assetUnit);
if (Number(amount) > 0) {
selectedInputs.add(inputIndex);
set.delete(inputIndex);
for (const asset of utxo.output.amount) {
totalRequiredAssets.set(
asset.unit,
String(
Number(totalRequiredAssets.get(asset.unit)) - Number(asset.quantity)
)
);
}
}
};

for (const assetUnit of totalRequiredAssets.keys()) {
if (assetUnit == 'lovelace') continue;
for (const inputIndex of singletons) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, singletons);
}

for (const inputIndex of pairs) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, pairs);
}

for (const inputIndex of rest) {
const assetRequired = totalRequiredAssets.get(assetUnit);
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, assetUnit, rest);
}
}

for (const inputIndex of onlyLovelace) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', onlyLovelace);
}

for (const inputIndex of singletons) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', singletons);
}

for (const inputIndex of pairs) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', pairs);
}

for (const inputIndex of rest) {
const assetRequired = totalRequiredAssets.get('lovelace');
if (!assetRequired || Number(assetRequired) <= 0) break;
addUtxoWithAssetAmount(inputIndex, 'lovelace', rest);
}

for (const assetUnit of totalRequiredAssets.keys()) {
if (Number(totalRequiredAssets.get(assetUnit)) > 0) return [];
}

const selectedUtxos: UTxO[] = [];
for (const inputIndex of selectedInputs) {
const utxo = utxoMap.get(inputIndex);
if (utxo) {
selectedUtxos.push(utxo);
}
}
return selectedUtxos;
};

const getAssetAmount = (utxo: UTxO, assetUnit: string): string => {
for (const utxoAsset of utxo.output.amount) {
if (utxoAsset.unit == assetUnit) return utxoAsset.quantity;
}
return '0';
};
1 change: 1 addition & 0 deletions packages/module/src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ export * from './CIP27';
export * from './CIP1852';
export * from './CIP1853';
export * from './CIP1855';
export * from './CPS0009';
export * from './CSL';
6 changes: 1 addition & 5 deletions packages/module/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
export * from './common/contracts';
export * from './common/types';
export {
generateNonce,
readPlutusData,
readTransaction,
} from './common/helpers';
export { generateNonce, readPlutusData } from './common/helpers';
export * from './common/utils/resolver';
export * from './common/utils/parser';
export * from './core/CIP2';
Expand Down
1 change: 1 addition & 0 deletions packages/module/src/serializer/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './signatures';
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { csl } from '@mesh/core';
import type {
TransactionWitnessSet, Vkeywitnesses,
} from '@mesh/core';
import type { TransactionWitnessSet, Vkeywitnesses } from '@mesh/core';

export const mergeSignatures = (
txWitnessSet: TransactionWitnessSet, newSignatures: Vkeywitnesses,
txWitnessSet: TransactionWitnessSet,
newSignatures: Vkeywitnesses
) => {
const txSignatures = txWitnessSet.vkeys();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ import {
Certificate,
TxInParameter,
} from './type';
import { selectUtxos } from '@mesh/core/CPS-009';
import { selectUtxos } from '@mesh/core';
import JSONbig from 'json-bigint';

export class MeshTxBuilderCore {
Expand Down
2 changes: 1 addition & 1 deletion packages/module/src/wallet/app.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
ISigner,
ISubmitter,
} from '@mesh/common/contracts';
import { mergeSignatures } from '@mesh/common/helpers';
import { mergeSignatures } from '@mesh/serializer';
import {
deserializeTx,
toAddress,
Expand Down
2 changes: 1 addition & 1 deletion packages/module/src/wallet/browser.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {
SUPPORTED_WALLETS,
} from '@mesh/common/constants';
import { IInitiator, ISigner, ISubmitter } from '@mesh/common/contracts';
import { mergeSignatures } from '@mesh/common/helpers';
import { mergeSignatures } from '@mesh/serializer';
import {
deserializeAddress,
deserializeTx,
Expand Down

0 comments on commit 5af4215

Please sign in to comment.