@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
90 lines (84 loc) • 2.53 kB
text/typescript
import { AssetClass, matchSingle } from '@3rd-eye-labs/cardano-offchain-common';
import {
LucidEvolution,
ScriptHash,
toHex,
UTxO,
} from '@lucid-evolution/lucid';
import {
parseStableswapOrderDatum,
StableswapOrderDatum,
} from '../../src/contracts/stableswap/types-new';
import { createScriptAddress } from '../../src';
import { array as A, function as F, option as O } from 'fp-ts';
export async function findSingleStableswapOrder(
lucid: LucidEvolution,
stableswapScriptHash: ScriptHash,
iassetName: string,
collateralAsset: AssetClass,
): Promise<{ utxo: UTxO; datum: StableswapOrderDatum }> {
const cdpUtxos = await lucid.utxosAt(
createScriptAddress(lucid.config().network!, stableswapScriptHash),
);
return matchSingle(
F.pipe(
cdpUtxos.map((utxo) =>
F.pipe(
O.fromNullable(utxo.datum),
O.flatMap(parseStableswapOrderDatum),
O.flatMap((datum) => {
if (
toHex(datum.iasset) === iassetName &&
toHex(datum.collateralAsset.currencySymbol) ===
toHex(collateralAsset.currencySymbol) &&
toHex(datum.collateralAsset.tokenName) ===
toHex(collateralAsset.tokenName)
) {
return O.some({ utxo, datum: datum });
} else {
return O.none;
}
}),
),
),
A.compact,
),
(res) =>
new Error(
'Expected a single stableswap order UTXO.: ' + JSON.stringify(res),
),
);
}
export async function findStableswapOrders(
lucid: LucidEvolution,
stableswapScriptHash: ScriptHash,
iassetName: string,
collateralAsset: AssetClass,
): Promise<{ utxo: UTxO; datum: StableswapOrderDatum }[]> {
const cdpUtxos = await lucid.utxosAt(
createScriptAddress(lucid.config().network!, stableswapScriptHash),
);
const orders = F.pipe(
cdpUtxos.map((utxo) =>
F.pipe(
O.fromNullable(utxo.datum),
O.flatMap(parseStableswapOrderDatum),
O.flatMap((datum) => {
if (
toHex(datum.iasset) === iassetName &&
toHex(datum.collateralAsset.currencySymbol) ===
toHex(collateralAsset.currencySymbol) &&
toHex(datum.collateralAsset.tokenName) ===
toHex(collateralAsset.tokenName)
) {
return O.some({ utxo, datum: datum });
} else {
return O.none;
}
}),
),
),
A.compact,
);
return orders;
}