@indigo-labs/indigo-sdk
Version:
Indigo SDK for interacting with Indigo endpoints via lucid-evolution
96 lines (88 loc) • 2.89 kB
text/typescript
import {
Address,
applyParamsToScript,
Constr,
Data,
fromText,
LucidEvolution,
OutRef,
SpendingValidator,
TxBuilder,
UTxO,
validatorToAddress,
validatorToScriptHash,
} from '@lucid-evolution/lucid';
import { _treasuryValidator } from '../scripts/treasury-validator';
import { ScriptReferences, SystemParams, TreasuryParams } from '../types/system-params';
import { getRandomElement, scriptRef } from '../helpers/lucid-utils';
export class TreasuryContract {
static async feeTx(
fee: bigint,
lucid: LucidEvolution,
params: SystemParams,
tx: TxBuilder,
treasuryRef?: OutRef,
): Promise<void> {
const treasuryUtxo: UTxO = treasuryRef
? getRandomElement(await lucid.utxosByOutRef([treasuryRef]))
: getRandomElement(await lucid.utxosAt(
TreasuryContract.address(params.treasuryParams, lucid),
));
const treasuryScriptRefUtxo = await TreasuryContract.scriptRef(
params.scriptReferences,
lucid,
);
tx.collectFrom([treasuryUtxo], Data.to(new Constr(4, [])))
.pay.ToContract(
treasuryUtxo.address,
{ kind: 'inline', value: treasuryUtxo.datum || '' },
{
...treasuryUtxo.assets,
lovelace: treasuryUtxo.assets['lovelace'] + fee,
},
)
.readFrom([treasuryScriptRefUtxo]);
}
// treasury Validator
static validator(params: TreasuryParams): SpendingValidator {
return {
type: 'PlutusV2',
script: applyParamsToScript(_treasuryValidator.cborHex, [
new Constr(0, [
new Constr(0, [
params.upgradeToken[0].unCurrencySymbol,
fromText(params.upgradeToken[1].unTokenName),
]),
new Constr(0, [
params.versionRecordToken[0].unCurrencySymbol,
fromText(params.versionRecordToken[1].unTokenName),
]),
params.treasuryUtxosStakeCredential ?
new Constr(0, [
new Constr(0, [
new Constr(1, [
params.treasuryUtxosStakeCredential.contents.contents,
])
])
]) : new Constr(1, []),
]),
]),
};
}
static validatorHash(params: TreasuryParams): string {
return validatorToScriptHash(TreasuryContract.validator(params));
}
static address(params: TreasuryParams, lucid: LucidEvolution): Address {
const network = lucid.config().network;
if (!network) {
throw new Error('Network configuration is undefined');
}
return validatorToAddress(network, TreasuryContract.validator(params), params.treasuryUtxosStakeCredential ? { type: 'Script', hash: params.treasuryUtxosStakeCredential.contents.contents} : undefined);
}
static async scriptRef(
params: ScriptReferences,
lucid: LucidEvolution,
): Promise<UTxO> {
return scriptRef(params.treasuryValidatorRef, lucid);
}
}