@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
96 lines (89 loc) • 2.41 kB
text/typescript
import {
Credential,
fromText,
LucidEvolution,
toHex,
} from '@lucid-evolution/lucid';
import { createScriptAddress } from '../../src/utils/lucid-utils';
import { RobOutput, parseRobDatum } from '../../src/contracts/rob/types-new';
import { option as O, array as A, function as F } from 'fp-ts';
import { SystemParams } from '../../src';
import { LucidContext } from '../test-helpers';
import { matchSingle } from '@3rd-eye-labs/cardano-offchain-common';
/**
* Beware, this shouldn't be used in production since it queries all the UTXOs
* at an address and does the filtering in this function.
*/
export async function findRob(
context: LucidContext,
sysParams: SystemParams,
owner: string,
assetTokenName: string,
stakeCredential?: Credential,
): Promise<RobOutput[]> {
const network = context.lucid.config().network!;
const robUtxos = await context.lucid.utxosAt(
createScriptAddress(
network,
sysParams.validatorHashes.robHash,
stakeCredential,
),
);
return F.pipe(
robUtxos,
A.map((utxo) =>
F.pipe(
O.fromNullable(utxo.datum),
O.flatMap(parseRobDatum),
O.flatMap((datum) => {
if (
toHex(datum.owner) == owner &&
toHex(datum.iasset) == fromText(assetTokenName)
) {
return O.some({ utxo, datum });
} else return O.none;
}),
),
),
A.compact,
);
}
export async function findSingleRob(
context: LucidContext,
sysParams: SystemParams,
iasset: string,
pkh: Credential,
): Promise<RobOutput> {
return matchSingle(
await findRob(context, sysParams, pkh.hash, iasset),
(res) => new Error('Expected a single ROB UTXO.: ' + JSON.stringify(res)),
);
}
export async function findAllRobs(
lucid: LucidEvolution,
sysParams: SystemParams,
iasset: string,
): Promise<RobOutput[]> {
const robUtxos = await lucid.utxosAt(
createScriptAddress(
lucid.config().network!,
sysParams.validatorHashes.robHash,
),
);
return F.pipe(
robUtxos.map((utxo) =>
F.pipe(
O.fromNullable(utxo.datum),
O.flatMap(parseRobDatum),
O.flatMap((datum) => {
if (toHex(datum.iasset) === fromText(iasset)) {
return O.some({ utxo, datum: datum });
} else {
return O.none;
}
}),
),
),
A.compact,
);
}