Skip to content

Commit

Permalink
build: remove golden-test-generator from .eslintignore
Browse files Browse the repository at this point in the history
  • Loading branch information
mkazlauskas committed Nov 18, 2022
1 parent bd8f950 commit 6df9255
Show file tree
Hide file tree
Showing 9 changed files with 180 additions and 164 deletions.
3 changes: 1 addition & 2 deletions .eslintignore
@@ -1,5 +1,4 @@
*.d.ts
node_modules
dist
packages/golden-test-generator
.yarn
.yarn
1 change: 1 addition & 0 deletions packages/golden-test-generator/package.json
Expand Up @@ -57,6 +57,7 @@
"coverage": "shx echo No coverage report for this package"
},
"dependencies": {
"@cardano-sdk/core": "^0.6.0",
"@cardano-sdk/ogmios": "^0.6.0",
"@cardano-sdk/util": "^0.6.0",
"bunyan": "^1.8.15",
Expand Down
19 changes: 13 additions & 6 deletions packages/golden-test-generator/src/AddressBalance/applyValue.ts
@@ -1,17 +1,22 @@
/* eslint-disable prettier/prettier */
/* eslint-disable complexity */
/* eslint-disable unicorn/no-nested-ternary */
import { BigIntMath } from '@cardano-sdk/util';
import { Ogmios } from '@cardano-sdk/ogmios';


const throwIfNegative = (value: bigint | number): void => {
if (value < 0) {
throw new Error('The value provided cannot be applied as it will result in a negative balance');
}
};

// eslint-disable-next-line sonarjs/cognitive-complexity
export const applyValue = (balance: Ogmios.Schema.Value, value: Ogmios.Schema.Value, spending = false): Ogmios.Schema.Value => {
// This is a workaround. coins is typed as a bigint, but it's sometimes being parsed from the raw response as a number.
export const applyValue = (
balance: Ogmios.Schema.Value,
value: Ogmios.Schema.Value,
spending = false
// eslint-disable-next-line sonarjs/cognitive-complexity
): Ogmios.Schema.Value => {
// This is a workaround. coins is typed as a bigint,
// but it's sometimes being parsed from the raw response as a number.
const valueCoins: bigint = typeof value.coins === 'bigint' ? value.coins : BigInt(value.coins);
const balanceCoins: bigint = typeof balance.coins === 'bigint' ? balance.coins : BigInt(balance.coins);
const coins = balanceCoins + (spending ? -BigIntMath.abs(valueCoins) : valueCoins);
Expand All @@ -26,7 +31,9 @@ export const applyValue = (balance: Ogmios.Schema.Value, value: Ogmios.Schema.Va
balanceToApply.assets![assetId] =
balance.assets![assetId] !== undefined
? balance.assets![assetId] + (spending ? -BigIntMath.abs(qty) : qty)
: (spending ? -BigIntMath.abs(qty) : qty);
: spending
? -BigIntMath.abs(qty)
: qty;
throwIfNegative(balanceToApply.assets![assetId]);
}
}
Expand Down
@@ -1,9 +1,9 @@
/* eslint-disable complexity */
import { GeneratorMetadata } from '../Content';
import { Intersection } from '@cardano-sdk/core';
import { Logger } from 'ts-log';
import { Ogmios, ogmiosToCore } from '@cardano-sdk/ogmios';
import { applyValue } from './applyValue';
import { Intersection } from '@cardano-sdk/core';

export type AddressBalances = {
[address: string]: Ogmios.Schema.Value;
Expand All @@ -22,7 +22,7 @@ export const getOnChainAddressBalances = (
onBlock?: (slot: number) => void;
}
): Promise<AddressBalancesResponse> => {
const { logger } = options;
const { logger, ogmiosConnectionConfig, onBlock } = options;
const trackedAddressBalances: AddressBalances = Object.fromEntries(
addresses.map((address) => [address, { assets: {}, coins: 0n }])
);
Expand All @@ -37,16 +37,18 @@ export const getOnChainAddressBalances = (
balances: {},
metadata: {
cardano: {
compactGenesis: ogmiosToCore.genesis(await Ogmios.StateQuery.genesisConfig(
await Ogmios.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig })
)),
compactGenesis: ogmiosToCore.genesis(
await Ogmios.StateQuery.genesisConfig(
await Ogmios.createInteractionContext(reject, logger.info, { connection: ogmiosConnectionConfig })
)
),
intersection: undefined as unknown as Intersection
}
}
};
try {
const syncClient = await Ogmios.createChainSyncClient(
await Ogmios.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig }),
await Ogmios.createInteractionContext(reject, logger.info, { connection: ogmiosConnectionConfig }),
{
rollBackward: async (_res, requestNext) => {
requestNext();
Expand All @@ -63,7 +65,7 @@ export const getOnChainAddressBalances = (
| Ogmios.Schema.BlockAlonzo
| Ogmios.Schema.BlockBabbage;
let blockBody:
undefined
| undefined
| Ogmios.Schema.StandardBlock['body']['txPayload']
| Ogmios.Schema.BlockShelley['body']
| Ogmios.Schema.BlockAllegra['body']
Expand Down Expand Up @@ -95,8 +97,8 @@ export const getOnChainAddressBalances = (
}
if (b !== undefined) {
currentBlock = b.header!.blockHeight;
if (options?.onBlock !== undefined) {
options.onBlock(currentBlock);
if (onBlock !== undefined) {
onBlock(currentBlock);
}
if (blockBody) {
for (const tx of blockBody) {
Expand Down Expand Up @@ -133,7 +135,7 @@ export const getOnChainAddressBalances = (
}
}
);
response.metadata.cardano.intersection = await syncClient.startSync(['origin']) as Intersection;
response.metadata.cardano.intersection = (await syncClient.startSync(['origin'])) as Intersection;
} catch (error) {
logger.error(error);
return reject(error);
Expand Down
@@ -1,13 +1,13 @@
import { ChainSyncEvent, ChainSyncEventType, Intersection } from '@cardano-sdk/core';
import { GeneratorMetadata } from '../Content';
import { Logger } from 'ts-log';
import { Ogmios, ogmiosToCore } from '@cardano-sdk/ogmios';
import { ChainSyncEvent, ChainSyncEventType, Intersection } from '@cardano-sdk/core';

type CardanoMetadata = Pick<GeneratorMetadata['metadata'], 'cardano'>;

export type GetChainSyncEventsResponse = {
events: ChainSyncEvent[];
metadata: CardanoMetadata
metadata: CardanoMetadata;
};

type RequestedBlocks = { [blockHeight: number]: Ogmios.Schema.Block };
Expand All @@ -19,17 +19,17 @@ const blocksWithRollbacks = (blockHeights: number[], requestedBlocks: RequestedB
const requestedBlock = requestedBlocks[blockHeight];
if (!requestedBlock) throw new Error(`Block not found: ${blockHeight}`);
const block = ogmiosToCore.block(requestedBlock);
block && result.push({ eventType: ChainSyncEventType.RollForward, block, tip: block.header });
block && result.push({ block, eventType: ChainSyncEventType.RollForward, tip: block.header });
} else {
const blockNo = -blockHeight;
const requestedBlock = requestedBlocks[blockNo];
if (!requestedBlock) throw new Error(`Cannot rollback to a non-requested block: ${blockHeight}`);
const header = ogmiosToCore.blockHeader(requestedBlock);
header && result.push(({eventType: ChainSyncEventType.RollBackward, tip: header}));
header && result.push({ eventType: ChainSyncEventType.RollBackward, tip: header });
}
}
return result;
}
};

export const getChainSyncEvents = async (
blockHeights: number[],
Expand All @@ -39,24 +39,26 @@ export const getChainSyncEvents = async (
onBlock?: (slot: number) => void;
}
): Promise<GetChainSyncEventsResponse> => {
const { logger } = options;
const { logger, onBlock, ogmiosConnectionConfig } = options;
const requestedBlocks: RequestedBlocks = {};
return new Promise(async (resolve, reject) => {
let currentBlock: number;
// Required to ensure existing messages in the pipe are not processed after the completion condition is met
let draining = false;
const metadata: CardanoMetadata = {
cardano: {
compactGenesis: ogmiosToCore.genesis(await Ogmios.StateQuery.genesisConfig(
await Ogmios.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig })
)),
compactGenesis: ogmiosToCore.genesis(
await Ogmios.StateQuery.genesisConfig(
await Ogmios.createInteractionContext(reject, logger.info, { connection: ogmiosConnectionConfig })
)
),
intersection: undefined as unknown as Intersection
},
}
};
const maxHeight = Math.max(...blockHeights);
try {
const syncClient = await Ogmios.createChainSyncClient(
await Ogmios.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig }),
await Ogmios.createInteractionContext(reject, logger.info, { connection: ogmiosConnectionConfig }),
{
rollBackward: async (_res, requestNext) => {
requestNext();
Expand All @@ -66,8 +68,8 @@ export const getChainSyncEvents = async (
const header = ogmiosToCore.blockHeader(block);
if (!header) return;
currentBlock = header.blockNo;
if (options?.onBlock !== undefined) {
options.onBlock(currentBlock);
if (onBlock !== undefined) {
onBlock(currentBlock);
}
if (blockHeights.includes(currentBlock)) {
requestedBlocks[currentBlock] = block;
Expand All @@ -84,11 +86,10 @@ export const getChainSyncEvents = async (
}
}
);
metadata.cardano.intersection = await syncClient.startSync(['origin']) as Intersection;
metadata.cardano.intersection = (await syncClient.startSync(['origin'])) as Intersection;
} catch (error) {
logger.error(error);
return reject(error);
}
});
};

2 changes: 1 addition & 1 deletion packages/golden-test-generator/src/Content.ts
@@ -1,6 +1,6 @@
import { Cardano, Intersection } from '@cardano-sdk/core';
import { Commit } from 'git-last-commit';
import { getLastCommitPromise } from './util';
import { Cardano, Intersection } from '@cardano-sdk/core';
const packageJson = require('../../package.json');

export type Metadata = {
Expand Down
49 changes: 27 additions & 22 deletions packages/golden-test-generator/src/index.ts
@@ -1,15 +1,16 @@
#!/usr/bin/env node
/* eslint-disable no-console */
import { AddressBalancesResponse, getOnChainAddressBalances } from './AddressBalance';
import { Command } from 'commander';
import { GeneratorMetadata, prepareContent } from './Content';
import { GetChainSyncEventsResponse, getChainSyncEvents as chainSync } from './ChainSyncEvents';
import { Options, SingleBar } from 'cli-progress';
import { ensureDir, writeFile } from 'fs-extra';
import { GeneratorMetadata, prepareContent } from './Content';
import { createLogger } from 'bunyan';
import { ensureDir, writeFile } from 'fs-extra';
import { toSerializableObject } from '@cardano-sdk/util';
import chalk from 'chalk';
import hash from 'object-hash';
import path from 'path';
import { toSerializableObject } from '@cardano-sdk/util';

const clear = require('clear');
const packageJson = require('../../package.json');
Expand Down Expand Up @@ -78,29 +79,33 @@ program
}
});

const mapBlockHeights = (blockHeights: string) =>
blockHeights
.split(',')
.filter((b) => b !== '')
.flatMap((blockHeightSpec) => {
const [from, to] = blockHeightSpec.split('..').map(blockHeight => Number.parseInt(blockHeight));
if (!to) { // 0 is not supported, as such range doesn't make sense
if (!Number.isNaN(from)) return [from]; // single block
throw new Error('blockHeights must be either numbers or ranges, see --help')
}
const result: number[] = [];
for (let blockHeight = from; blockHeight <= to; blockHeight++) {
result.push(blockHeight)
}
return result;
});
const mapBlockHeights = (blockHeights: string) =>
blockHeights
.split(',')
.filter((b) => b !== '')
.flatMap((blockHeightSpec) => {
const [from, to] = blockHeightSpec.split('..').map((blockHeight) => Number.parseInt(blockHeight));
if (!to) {
// 0 is not supported, as such range doesn't make sense
if (!Number.isNaN(from)) return [from]; // single block
throw new Error('blockHeights must be either numbers or ranges, see --help');
}
const result: number[] = [];
for (let blockHeight = from; blockHeight <= to; blockHeight++) {
result.push(blockHeight);
}
return result;
});

program
.command('chain-sync-events')
.description('Dump the requested blocks (rollForward) in their raw structure and simulate rollbacks')
.argument('[blockHeights]', `Comma-separated sorted list of blocks by number.
.argument(
'[blockHeights]',
`Comma-separated sorted list of blocks by number.
Use "-" for rollback to a block, e.g. 10,11,-10,11
Use ".." for block ranges (inclusive), e.g. 0..9`)
Use ".." for block ranges (inclusive), e.g. 0..9`
)
.requiredOption('--out-dir [outDir]', 'File path to write results to')
.option('--log-level [logLevel]', 'Minimum log level', 'info')
.action(async (blockHeightsInput: string, { logLevel, outDir }) => {
Expand All @@ -124,7 +129,7 @@ program
options: {
blockHeights: blockHeightsInput
}
}
};
progress.stop();
const content = await prepareContent<GetChainSyncEventsResponse['events']>(fullMetadata, data);
const fileName = path.join(outDir, `blocks-${hash(content)}.json`);
Expand Down

0 comments on commit 6df9255

Please sign in to comment.