@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
126 lines (115 loc) • 3.16 kB
text/typescript
import {
addAssets,
Address,
Assets,
calculateMinLovelaceFromUTxO,
Credential,
credentialToAddress,
Data,
Datum,
LucidEvolution,
Network,
OutputDatum,
OutRef,
paymentCredentialOf,
ProtocolParameters,
Script,
ScriptHash,
scriptHashToCredential,
stakeCredentialOf,
TxBuilder,
UTxO,
} from '@lucid-evolution/lucid';
import { ScriptReference } from '../types/system-params';
import { match, P } from 'ts-pattern';
/**
* Returns the inline datum.
* Throws when the UTXO doesn't have an inline datum
* (i.e. in case it has hash datum or no datum).
*/
export function getInlineDatumOrThrow(utxo: UTxO): Datum {
if (utxo.datum != null) {
return utxo.datum;
}
throw new Error(
'Expected an inline datum for OutRef: ' +
JSON.stringify({
txHash: utxo.txHash,
outputIndex: utxo.outputIndex,
} as OutRef),
);
}
export async function addrDetails(
lucid: LucidEvolution,
): Promise<[Credential, Credential | undefined]> {
const addr = await lucid.wallet().address();
let stakeCredential = undefined;
try {
stakeCredential = stakeCredentialOf(addr);
} catch (_) {
// No stake credential
}
return [paymentCredentialOf(addr), stakeCredential];
}
export function createScriptAddress(
network: Network,
scriptHash: ScriptHash,
stakeCredential?: Credential,
): Address {
return credentialToAddress(
network,
scriptHashToCredential(scriptHash),
stakeCredential,
);
}
export async function scriptRef(
ref: ScriptReference,
lucid: LucidEvolution,
): Promise<UTxO> {
const utxos = await lucid.utxosByOutRef([
{ txHash: ref.input.transactionId, outputIndex: ref.input.index },
]);
if (utxos.length === 0) throw Error('Unable to locate script ref.');
return utxos[0];
}
/**
* Complete, sign with wallet, submit a tx and wait for confirmation.
*/
export async function submitTx(
lucid: LucidEvolution,
tx: TxBuilder,
): Promise<void> {
const txHash = await tx
.complete()
.then((t) => t.sign.withWallet().complete())
.then((t) => t.submit());
await lucid.awaitTx(txHash);
}
export function balance(utxos: UTxO[]): Assets {
return utxos.reduce((acc, utxo) => addAssets(acc, utxo.assets), {});
}
/**
* Estimate the min lovelace for a UTXO so it can be created.
*/
export function estimateUtxoMinLovelace(
protocolParameters: ProtocolParameters,
destinationAddr: string,
assets: Assets,
destinationDatum: OutputDatum | undefined = undefined,
scriptRef: Script | undefined = undefined,
): bigint {
return calculateMinLovelaceFromUTxO(protocolParameters.coinsPerUtxoByte, {
address: destinationAddr,
datumHash: match(destinationDatum)
.with({ kind: 'hash', value: P.select() }, (dHash) => dHash)
.otherwise(() => null),
datum: match(destinationDatum)
.with({ kind: 'inline', value: P.select() }, (data) => Data.to(data))
.otherwise(() => null),
assets: assets,
// Use dummy tx hash and out idx
txHash: '0000000000000000000000000000000000000000000000000000000000000000',
outputIndex: 0,
scriptRef: scriptRef ?? null,
} satisfies UTxO);
}