UNPKG

@indigo-labs/indigo-sdk

Version:

Indigo SDK for interacting with Indigo endpoints via lucid-evolution

241 lines (216 loc) 6.76 kB
import { addAssets, Emulator, EmulatorAccount, generateEmulatorAccount, Lucid, paymentCredentialOf, } from '@lucid-evolution/lucid'; import { beforeEach, describe, test } from 'vitest'; import { LucidContext, runAndAwaitTx, runAndAwaitTxBuilder, } from '../test-helpers'; import { mkLovelacesOf } from '@3rd-eye-labs/cardano-offchain-common'; import { feedPriceOracleTx, PriceOracleParams, startPriceOracleTx, } from '../../src'; import { expectScriptFailure } from '../utils/asserts'; import { feedPriceOracleTxStealNft } from './transactions-mutated'; import * as Core from '@evolution-sdk/evolution'; import { rationalFromInt } from '../../src/types/rational'; type MyContext = LucidContext<{ admin: EmulatorAccount; }>; describe('Rational Price Oracle', () => { beforeEach<MyContext>(async (context: MyContext) => { context.users = { admin: generateEmulatorAccount( addAssets(mkLovelacesOf(100_000_000_000_000n)), ), }; context.emulator = new Emulator(Object.values(context.users)); context.lucid = await Lucid(context.emulator, 'Custom'); context.lucid.selectWallet.fromSeed(context.users.admin.seedPhrase); }); test<MyContext>('Start Rational Price Oracle', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [tx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); await runAndAwaitTxBuilder(context.lucid, tx); }); test<MyContext>('Feed Rational Price Oracle', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); const feedTx = await feedPriceOracleTx( context.lucid, { txHash: startTxHash, outputIndex: 0 }, rationalFromInt(2n), params, context.emulator.slot, ); await runAndAwaitTxBuilder(context.lucid, feedTx); }); test<MyContext>('Feed Rational Price Oracle cannot be negative', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); await expectScriptFailure( 'Price must be positive', feedPriceOracleTx( context.lucid, { txHash: startTxHash, outputIndex: 0 }, rationalFromInt(-2n), params, context.emulator.slot, ), ); }); test<MyContext>('Feed Rational Price Oracle cannot be steal NFT', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); await expectScriptFailure( 'Wrong continuing output', feedPriceOracleTxStealNft( context.lucid, { txHash: startTxHash, outputIndex: 0 }, rationalFromInt(2n), params, context.emulator.slot, ), ); }); test<MyContext>('Feed Rational Price Oracle cannot have zero denominator', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); await expectScriptFailure( 'Denominator cannot be zero', feedPriceOracleTx( context.lucid, { txHash: startTxHash, outputIndex: 0 }, { numerator: 2n, denominator: 0n }, params, context.emulator.slot, ), ); }); test<MyContext>('Feed Rational Price Oracle with large number', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); await runAndAwaitTx( context.lucid, feedPriceOracleTx( context.lucid, { txHash: startTxHash, outputIndex: 0 }, { numerator: BigInt(Number.MAX_SAFE_INTEGER) * BigInt(Number.MAX_SAFE_INTEGER), denominator: BigInt(Number.MAX_SAFE_INTEGER), }, params, context.emulator.slot, ), ); }); test<MyContext>('Feed Rational Price Oracle can change auxiliary data', async (context: MyContext) => { const pkh = paymentCredentialOf(context.users.admin.address).hash; const params: PriceOracleParams = { owner: pkh, biasTime: 20_000n, expirationPeriod: 1_800_000n, }; const [startTx, _] = await startPriceOracleTx( context.lucid, 'ORACLE_NFT', rationalFromInt(1n), params, context.emulator.slot, ); const startTxHash = await runAndAwaitTxBuilder(context.lucid, startTx); await runAndAwaitTx( context.lucid, feedPriceOracleTx( context.lucid, { txHash: startTxHash, outputIndex: 0 }, rationalFromInt(1n), params, context.emulator.slot, Core.Data.fromCBORHex( 'd8799f1b0180e51d1ae19514d8799f1a00030d40ff1b00000194ce33c598ff', ), ), ); }); });