@cardano-sdk/golden-test-generator 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +16 -0
  2. package/dist/AddressBalance/applyValue.d.ts +3 -0
  3. package/dist/AddressBalance/applyValue.d.ts.map +1 -0
  4. package/dist/AddressBalance/applyValue.js +30 -0
  5. package/dist/AddressBalance/applyValue.js.map +1 -0
  6. package/dist/AddressBalance/getOnChainAddressBalances.d.ts +17 -0
  7. package/dist/AddressBalance/getOnChainAddressBalances.d.ts.map +1 -0
  8. package/dist/AddressBalance/getOnChainAddressBalances.js +95 -0
  9. package/dist/AddressBalance/getOnChainAddressBalances.js.map +1 -0
  10. package/dist/AddressBalance/index.d.ts +3 -0
  11. package/dist/AddressBalance/index.d.ts.map +1 -0
  12. package/dist/AddressBalance/index.js +15 -0
  13. package/dist/AddressBalance/index.js.map +1 -0
  14. package/dist/Block/getBlocks.d.ts +14 -0
  15. package/dist/Block/getBlocks.d.ts.map +1 -0
  16. package/dist/Block/getBlocks.js +73 -0
  17. package/dist/Block/getBlocks.js.map +1 -0
  18. package/dist/Block/index.d.ts +2 -0
  19. package/dist/Block/index.d.ts.map +1 -0
  20. package/dist/Block/index.js +14 -0
  21. package/dist/Block/index.js.map +1 -0
  22. package/dist/Content.d.ts +23 -0
  23. package/dist/Content.d.ts.map +1 -0
  24. package/dist/Content.js +24 -0
  25. package/dist/Content.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +114 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/tsconfig.tsbuildinfo +1 -0
  31. package/dist/util.d.ts +9 -0
  32. package/dist/util.d.ts.map +1 -0
  33. package/dist/util.js +14 -0
  34. package/dist/util.js.map +1 -0
  35. package/package.json +53 -0
  36. package/src/.eslintrc.js +7 -0
  37. package/src/AddressBalance/applyValue.ts +31 -0
  38. package/src/AddressBalance/getOnChainAddressBalances.ts +131 -0
  39. package/src/AddressBalance/index.ts +2 -0
  40. package/src/Block/getBlocks.ts +98 -0
  41. package/src/Block/index.ts +1 -0
  42. package/src/Content.ts +43 -0
  43. package/src/index.ts +127 -0
  44. package/src/tsconfig.json +10 -0
  45. package/src/util.ts +15 -0
  46. package/test/.eslintrc.js +7 -0
  47. package/test/AddressBalance.test.ts +184 -0
  48. package/test/jest.config.js +11 -0
  49. package/test/tsconfig.json +10 -0
package/README.md ADDED
@@ -0,0 +1,16 @@
1
+ # Cardano JS SDK | Golden Test Generator
2
+ Generate golden test files for a range of Cardano concepts, for the purpose of comparing results
3
+ with application state during integration tests. The intended interface is the CLI, but the
4
+ module is structured to offer access as libraries.
5
+
6
+ ## Download or Build
7
+ Builds are attached as artifacts from the GitHub workflow runs, otherwise run
8
+
9
+ ``` console
10
+ yarn pkg
11
+ ```
12
+
13
+ ## Run
14
+ ```console
15
+ ./build/golden-test-generator-{ linux | macos } --help
16
+ ```
@@ -0,0 +1,3 @@
1
+ import { Schema } from '@cardano-ogmios/client';
2
+ export declare const applyValue: (balance: Schema.Value, value: Schema.Value, spending?: boolean) => Schema.Value;
3
+ //# sourceMappingURL=applyValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyValue.d.ts","sourceRoot":"","sources":["../../src/AddressBalance/applyValue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAUhD,eAAO,MAAM,UAAU,YAAa,OAAO,KAAK,SAAS,OAAO,KAAK,yBAAqB,OAAO,KAmBhG,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyValue = void 0;
4
+ const core_1 = require("@cardano-sdk/core");
5
+ const throwIfNegative = (value) => {
6
+ if (value < 0) {
7
+ throw new Error('The value provided cannot be applied as it will result in a negative balance');
8
+ }
9
+ };
10
+ const applyValue = (balance, value, spending = false) => {
11
+ const coins = balance.coins + (spending ? -Math.abs(value.coins) : value.coins);
12
+ throwIfNegative(coins);
13
+ const balanceToApply = { coins };
14
+ if (balance.assets !== undefined || value.assets !== undefined) {
15
+ balanceToApply.assets = { ...balance.assets } ?? {};
16
+ }
17
+ const assets = Object.entries(value.assets ?? {});
18
+ if (assets.length > 0) {
19
+ for (const [assetId, qty] of assets) {
20
+ balanceToApply.assets[assetId] =
21
+ balance.assets[assetId] !== undefined
22
+ ? balance.assets[assetId] + (spending ? -core_1.BigIntMath.abs(qty) : qty)
23
+ : (spending ? -core_1.BigIntMath.abs(qty) : qty);
24
+ throwIfNegative(balanceToApply.assets[assetId]);
25
+ }
26
+ }
27
+ return balanceToApply;
28
+ };
29
+ exports.applyValue = applyValue;
30
+ //# sourceMappingURL=applyValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyValue.js","sourceRoot":"","sources":["../../src/AddressBalance/applyValue.ts"],"names":[],"mappings":";;;AAEA,4CAA+C;AAE/C,MAAM,eAAe,GAAG,CAAC,KAAsB,EAAQ,EAAE;IACvD,IAAI,KAAK,GAAG,CAAC,EAAE;QACb,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;KACjG;AACH,CAAC,CAAC;AAGK,MAAM,UAAU,GAAG,CAAC,OAAqB,EAAE,KAAmB,EAAE,QAAQ,GAAG,KAAK,EAAgB,EAAE;IACvG,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChF,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,MAAM,cAAc,GAAiB,EAAE,KAAK,EAAE,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE;QAC9D,cAAc,CAAC,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;KACrD;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QACrB,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE;YACnC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC5B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;oBACnC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACnE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9C,eAAe,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;SACjD;KACF;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAnBW,QAAA,UAAU,cAmBrB"}
@@ -0,0 +1,17 @@
1
+ import { Logger } from 'ts-log';
2
+ import { Schema, ConnectionConfig } from '@cardano-ogmios/client';
3
+ import { GeneratorMetadata } from '../Content';
4
+ export declare type AddressBalances = {
5
+ [address: string]: Schema.Value;
6
+ };
7
+ export declare type AddressBalancesResponse = GeneratorMetadata & {
8
+ balances: {
9
+ [blockHeight: string]: AddressBalances;
10
+ };
11
+ };
12
+ export declare const getOnChainAddressBalances: (addresses: string[], atBlocks: number[], options?: {
13
+ logger?: Logger;
14
+ ogmiosConnectionConfig: ConnectionConfig;
15
+ onBlock?: (slot: number) => void;
16
+ }) => Promise<AddressBalancesResponse>;
17
+ //# sourceMappingURL=getOnChainAddressBalances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getOnChainAddressBalances.d.ts","sourceRoot":"","sources":["../../src/AddressBalance/getOnChainAddressBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAOL,MAAM,EACN,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,oBAAY,eAAe,GAAG;IAC5B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;CACjC,CAAC;AAEF,oBAAY,uBAAuB,GAAG,iBAAiB,GAAG;IACxD,QAAQ,EAAE;QAAE,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF,eAAO,MAAM,yBAAyB,cACzB,MAAM,EAAE,YACT,MAAM,EAAE;aAEP,MAAM;4BACS,gBAAgB;qBACvB,MAAM,KAAK,IAAI;MAEjC,QAAQ,uBAAuB,CAkGjC,CAAC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getOnChainAddressBalances = void 0;
4
+ const ts_log_1 = require("ts-log");
5
+ const client_1 = require("@cardano-ogmios/client");
6
+ const util_1 = require("../util");
7
+ const applyValue_1 = require("./applyValue");
8
+ const getOnChainAddressBalances = (addresses, atBlocks, options) => {
9
+ const logger = options?.logger ?? ts_log_1.dummyLogger;
10
+ const trackedAddressBalances = Object.fromEntries(addresses.map((address) => [address, { coins: 0, assets: {} }]));
11
+ const trackedTxs = [];
12
+ return new Promise(async (resolve, reject) => {
13
+ let currentBlock;
14
+ let draining = false;
15
+ const response = {
16
+ metadata: {
17
+ cardano: {
18
+ compactGenesis: await client_1.StateQuery.genesisConfig(await client_1.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig })),
19
+ intersection: undefined
20
+ }
21
+ },
22
+ balances: {}
23
+ };
24
+ try {
25
+ const syncClient = await client_1.createChainSyncClient(await client_1.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig }), {
26
+ rollBackward: async (_res, requestNext) => {
27
+ requestNext();
28
+ },
29
+ rollForward: async ({ block }, requestNext) => {
30
+ if (draining)
31
+ return;
32
+ let b;
33
+ let blockBody;
34
+ if (util_1.isByronStandardBlock(block)) {
35
+ b = block.byron;
36
+ blockBody = b.body.txPayload;
37
+ }
38
+ else if (client_1.isShelleyBlock(block)) {
39
+ b = block.shelley;
40
+ blockBody = b.body;
41
+ }
42
+ else if (client_1.isAllegraBlock(block)) {
43
+ b = block.allegra;
44
+ blockBody = b.body;
45
+ }
46
+ else if (client_1.isMaryBlock(block)) {
47
+ b = block.mary;
48
+ blockBody = b.body;
49
+ }
50
+ else if (client_1.isAlonzoBlock(block)) {
51
+ b = block.alonzo;
52
+ }
53
+ if (b !== undefined) {
54
+ currentBlock = b.header.blockHeight;
55
+ if (options?.onBlock !== undefined) {
56
+ options.onBlock(currentBlock);
57
+ }
58
+ for (const tx of blockBody) {
59
+ for (const output of tx.body.outputs) {
60
+ if (trackedAddressBalances[output.address] !== undefined) {
61
+ const addressBalance = { ...trackedAddressBalances[output.address] };
62
+ trackedTxs.push({ id: tx.id, inputs: tx.body.inputs, outputs: tx.body.outputs });
63
+ trackedAddressBalances[output.address] = applyValue_1.applyValue(addressBalance, output.value);
64
+ }
65
+ }
66
+ for (const input of tx.body.inputs) {
67
+ const trackedInput = trackedTxs.find((t) => t.id === input.txId)?.outputs[input.index];
68
+ if (trackedInput !== undefined && trackedAddressBalances[trackedInput?.address] !== undefined) {
69
+ const addressBalance = { ...trackedAddressBalances[trackedInput.address] };
70
+ trackedAddressBalances[trackedInput.address] = applyValue_1.applyValue(addressBalance, trackedInput.value, true);
71
+ }
72
+ }
73
+ }
74
+ if (atBlocks.includes(currentBlock)) {
75
+ response.balances[currentBlock] = { ...trackedAddressBalances };
76
+ if (atBlocks[atBlocks.length - 1] === currentBlock) {
77
+ draining = true;
78
+ await syncClient.shutdown();
79
+ return resolve(response);
80
+ }
81
+ }
82
+ }
83
+ requestNext();
84
+ }
85
+ });
86
+ response.metadata.cardano.intersection = await syncClient.startSync(['origin']);
87
+ }
88
+ catch (error) {
89
+ logger.error(error);
90
+ return reject(error);
91
+ }
92
+ });
93
+ };
94
+ exports.getOnChainAddressBalances = getOnChainAddressBalances;
95
+ //# sourceMappingURL=getOnChainAddressBalances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getOnChainAddressBalances.js","sourceRoot":"","sources":["../../src/AddressBalance/getOnChainAddressBalances.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './applyValue';
2
+ export * from './getOnChainAddressBalances';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/AddressBalance/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./applyValue"), exports);
14
+ __exportStar(require("./getOnChainAddressBalances"), exports);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/AddressBalance/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,+CAA6B;AAC7B,8DAA4C"}
@@ -0,0 +1,14 @@
1
+ import { Logger } from 'ts-log';
2
+ import { ConnectionConfig, Schema } from '@cardano-ogmios/client';
3
+ import { GeneratorMetadata } from '../Content';
4
+ export declare type GetBlocksResponse = GeneratorMetadata & {
5
+ blocks: {
6
+ [blockHeight: string]: Schema.Block;
7
+ };
8
+ };
9
+ export declare const getBlocks: (blockHeights: number[], options?: {
10
+ logger?: Logger;
11
+ ogmiosConnectionConfig: ConnectionConfig;
12
+ onBlock?: (slot: number) => void;
13
+ }) => Promise<GetBlocksResponse>;
14
+ //# sourceMappingURL=getBlocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBlocks.d.ts","sourceRoot":"","sources":["../../src/Block/getBlocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EACL,gBAAgB,EAQhB,MAAM,EACP,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI/C,oBAAY,iBAAiB,GAAG,iBAAiB,GAAG;IAClD,MAAM,EAAE;QAAE,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAA;KAAE,CAAC;CACjD,CAAC;AAEF,eAAO,MAAM,SAAS,iBACN,MAAM,EAAE;aAEX,MAAM;4BACS,gBAAgB;qBACvB,MAAM,KAAK,IAAI;MAEjC,QAAQ,iBAAiB,CAsE3B,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBlocks = void 0;
4
+ const ts_log_1 = require("ts-log");
5
+ const client_1 = require("@cardano-ogmios/client");
6
+ const util_1 = require("../util");
7
+ const getBlocks = async (blockHeights, options) => {
8
+ const logger = options?.logger ?? ts_log_1.dummyLogger;
9
+ const requestedBlocks = {};
10
+ return new Promise(async (resolve, reject) => {
11
+ let currentBlock;
12
+ let draining = false;
13
+ const response = {
14
+ metadata: {
15
+ cardano: {
16
+ compactGenesis: await client_1.StateQuery.genesisConfig(await client_1.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig })),
17
+ intersection: undefined
18
+ }
19
+ },
20
+ blocks: {}
21
+ };
22
+ try {
23
+ const syncClient = await client_1.createChainSyncClient(await client_1.createInteractionContext(reject, logger.info, { connection: options.ogmiosConnectionConfig }), {
24
+ rollBackward: async (_res, requestNext) => {
25
+ requestNext();
26
+ },
27
+ rollForward: async ({ block }, requestNext) => {
28
+ if (draining)
29
+ return;
30
+ let b;
31
+ if (util_1.isByronStandardBlock(block)) {
32
+ b = block.byron;
33
+ }
34
+ else if (client_1.isShelleyBlock(block)) {
35
+ b = block.shelley;
36
+ }
37
+ else if (client_1.isAllegraBlock(block)) {
38
+ b = block.allegra;
39
+ }
40
+ else if (client_1.isMaryBlock(block)) {
41
+ b = block.mary;
42
+ }
43
+ else if (client_1.isAlonzoBlock(block)) {
44
+ b = block.alonzo;
45
+ }
46
+ if (b !== undefined) {
47
+ currentBlock = b.header.blockHeight;
48
+ if (options?.onBlock !== undefined) {
49
+ options.onBlock(currentBlock);
50
+ }
51
+ if (blockHeights.includes(currentBlock)) {
52
+ requestedBlocks[currentBlock] = block;
53
+ if (blockHeights[blockHeights.length - 1] === currentBlock) {
54
+ draining = true;
55
+ response.blocks = requestedBlocks;
56
+ await syncClient.shutdown();
57
+ return resolve(response);
58
+ }
59
+ }
60
+ }
61
+ requestNext();
62
+ }
63
+ });
64
+ response.metadata.cardano.intersection = await syncClient.startSync(['origin']);
65
+ }
66
+ catch (error) {
67
+ logger.error(error);
68
+ return reject(error);
69
+ }
70
+ });
71
+ };
72
+ exports.getBlocks = getBlocks;
73
+ //# sourceMappingURL=getBlocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBlocks.js","sourceRoot":"","sources":["../../src/Block/getBlocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './getBlocks';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Block/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./getBlocks"), exports);
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Block/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B"}
@@ -0,0 +1,23 @@
1
+ import { ChainSync, Schema as Cardano } from '@cardano-ogmios/client';
2
+ import { Commit } from 'git-last-commit';
3
+ export declare type Metadata = {
4
+ cardano: {
5
+ compactGenesis: Cardano.CompactGenesis;
6
+ intersection: ChainSync.Intersection;
7
+ };
8
+ software: {
9
+ name: string;
10
+ version: string;
11
+ commit: Pick<Commit, 'hash' | 'tags'>;
12
+ };
13
+ };
14
+ export declare type GeneratorMetadata = {
15
+ metadata: {
16
+ cardano: Metadata['cardano'];
17
+ };
18
+ };
19
+ export declare const prepareContent: <Body_1>(metadata: Omit<Metadata, 'software'>, body: Body_1) => Promise<{
20
+ metadata: Metadata;
21
+ body: Body_1;
22
+ }>;
23
+ //# sourceMappingURL=Content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.d.ts","sourceRoot":"","sources":["../src/Content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC,oBAAY,QAAQ,GAAG;IACrB,OAAO,EAAE;QACP,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC;QACvC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC;KACtC,CAAC;IACF,QAAQ,EAAG;QACT,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;KACvC,CAAC;CACH,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAAE,QAAQ,EAAE;QAAE,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAE/E,eAAO,MAAM,cAAc,qBACf,KAAK,QAAQ,EAAE,UAAU,CAAC;cAG1B,QAAQ;;EAmBnB,CAAC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareContent = void 0;
4
+ const util_1 = require("./util");
5
+ const packageJson = require('../package.json');
6
+ const prepareContent = async (metadata, body) => {
7
+ const lastCommit = await util_1.getLastCommitPromise();
8
+ return {
9
+ metadata: {
10
+ ...metadata,
11
+ software: {
12
+ name: packageJson.name,
13
+ version: packageJson.version,
14
+ commit: {
15
+ hash: lastCommit.hash,
16
+ tags: lastCommit.tags
17
+ }
18
+ }
19
+ },
20
+ body
21
+ };
22
+ };
23
+ exports.prepareContent = prepareContent;
24
+ //# sourceMappingURL=Content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Content.js","sourceRoot":"","sources":["../src/Content.ts"],"names":[],"mappings":";;;AAEA,iCAA8C;AAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAgBxC,MAAM,cAAc,GAAG,KAAK,EACjC,QAAoC,EACpC,IAAU,EAIT,EAAE;IACH,MAAM,UAAU,GAAG,MAAM,2BAAoB,EAAE,CAAC;IAChD,OAAO;QACL,QAAQ,EAAE;YACR,GAAG,QAAQ;YAEX,QAAQ,EAAE;gBACR,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,MAAM,EAAE;oBACN,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;iBACtB;aACF;SACF;QACD,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AAvBW,QAAA,cAAc,kBAuBzB"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,114 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const commander_1 = require("commander");
9
+ const object_hash_1 = __importDefault(require("object-hash"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const cli_progress_1 = require("cli-progress");
12
+ const fs_extra_1 = require("fs-extra");
13
+ const json_bigint_1 = __importDefault(require("json-bigint"));
14
+ const AddressBalance_1 = require("./AddressBalance");
15
+ const Block_1 = require("./Block");
16
+ const Content_1 = require("./Content");
17
+ const clear = require('clear');
18
+ const packageJson = require('../package.json');
19
+ clear();
20
+ console.log(chalk_1.default.blue('Cardano Golden Test Generator'));
21
+ const createProgressBar = (lastblockHeight) => new cli_progress_1.SingleBar({
22
+ format: `Syncing from genesis to block ${lastblockHeight} | ${chalk_1.default.blue('{bar}')} | {percentage}% || {value}/{total} Blocks`,
23
+ barCompleteChar: '\u2588',
24
+ barIncompleteChar: '\u2591',
25
+ hideCursor: true,
26
+ renderThrottle: 300
27
+ });
28
+ const program = new commander_1.Command('cardano-golden-test-generator');
29
+ program
30
+ .option('--ogmios-host [ogmiosHost]', 'Ogmios host. Defaults to localhost')
31
+ .option('--ogmios-port [ogmiosPort]', 'Ogmios TCP port. Defaults to 1337', (port) => Number.parseInt(port))
32
+ .option('--ogmios-tls [ogmiosTls]', 'Is Ogmios being served over a secure connection?. Defaults to false', (port) => Number.parseInt(port));
33
+ program
34
+ .command('address-balance')
35
+ .description('Balance of addresses, determined by syncing the chain from genesis')
36
+ .argument('[addresses]', 'Comma-separated list of addresses', (addresses) => addresses.split(',').filter((a) => a !== ''))
37
+ .requiredOption('--at-blocks [atBlocks]', 'Balance of the addresses at block heights', (heights) => heights
38
+ .split(',')
39
+ .filter((b) => b !== '')
40
+ .map((height) => Number.parseInt(height)))
41
+ .requiredOption('--out-dir [outDir]', 'File path to write results to')
42
+ .action(async (addresses, { atBlocks, outDir }) => {
43
+ try {
44
+ const { ogmiosHost, ogmiosPort, ogmiosTls } = program.opts();
45
+ const atBlockHeights = atBlocks.sort((a, b) => a - b);
46
+ const lastBlockHeight = atBlockHeights[atBlockHeights.length - 1];
47
+ const progress = createProgressBar(lastBlockHeight);
48
+ await fs_extra_1.ensureDir(outDir);
49
+ progress.start(lastBlockHeight, 0);
50
+ const { balances, metadata } = await AddressBalance_1.getOnChainAddressBalances(addresses, atBlockHeights, {
51
+ ogmiosConnectionConfig: { host: ogmiosHost, port: ogmiosPort, tls: ogmiosTls },
52
+ onBlock: (blockHeight) => {
53
+ progress.update(blockHeight);
54
+ }
55
+ });
56
+ const content = await Content_1.prepareContent(metadata, balances);
57
+ progress.stop();
58
+ const fileName = node_path_1.default.join(outDir, `address-balances-${object_hash_1.default(content)}.json`);
59
+ console.log(`Writing ${fileName}`);
60
+ await fs_extra_1.writeFile(fileName, json_bigint_1.default.stringify(content, undefined, 2));
61
+ process.exit(0);
62
+ }
63
+ catch (error) {
64
+ console.error(error);
65
+ process.exit(1);
66
+ }
67
+ });
68
+ program
69
+ .command('get-block')
70
+ .description('Dump the requested blocks in their raw structure')
71
+ .argument('[blockHeights]', 'Comma-separated list of blocks by number', (blockHeights) => blockHeights
72
+ .split(',')
73
+ .filter((b) => b !== '')
74
+ .map((blockHeight) => Number.parseInt(blockHeight)))
75
+ .requiredOption('--out-dir [outDir]', 'File path to write results to')
76
+ .action(async (blockHeights, { outDir }) => {
77
+ try {
78
+ const { ogmiosHost, ogmiosPort, ogmiosTls } = program.opts();
79
+ const sortedblockHeights = blockHeights.sort((a, b) => a - b);
80
+ const lastblockHeight = sortedblockHeights[sortedblockHeights.length - 1];
81
+ const progress = createProgressBar(lastblockHeight);
82
+ await fs_extra_1.ensureDir(outDir);
83
+ progress.start(lastblockHeight, 0);
84
+ const { blocks, metadata } = await Block_1.getBlocks(sortedblockHeights, {
85
+ logger: console,
86
+ ogmiosConnectionConfig: { host: ogmiosHost, port: ogmiosPort, tls: ogmiosTls },
87
+ onBlock: (blockHeight) => {
88
+ progress.update(blockHeight);
89
+ }
90
+ });
91
+ progress.stop();
92
+ const content = await Content_1.prepareContent(metadata, blocks);
93
+ const fileName = node_path_1.default.join(outDir, `blocks-${object_hash_1.default(content)}.json`);
94
+ console.log(`Writing ${fileName}`);
95
+ await fs_extra_1.writeFile(fileName, json_bigint_1.default.stringify(content, undefined, 2));
96
+ process.exit(0);
97
+ }
98
+ catch (error) {
99
+ console.error(error);
100
+ process.exit(1);
101
+ }
102
+ });
103
+ program.version(packageJson.version);
104
+ if (process.argv.slice(2).length === 0) {
105
+ program.outputHelp();
106
+ process.exit(1);
107
+ }
108
+ else {
109
+ program.parseAsync(process.argv).catch((error) => {
110
+ console.error(error);
111
+ process.exit(0);
112
+ });
113
+ }
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}