@o1-labs/mina-archive-node-graphql 0.0.6

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 (138) hide show
  1. package/README.md +321 -0
  2. package/build/benchmark/setup.js +32 -0
  3. package/build/benchmark/setup.js.map +1 -0
  4. package/build/src/blockchain/constants.js +2 -0
  5. package/build/src/blockchain/constants.js.map +1 -0
  6. package/build/src/blockchain/types.js +7 -0
  7. package/build/src/blockchain/types.js.map +1 -0
  8. package/build/src/blockchain/utils.js +39 -0
  9. package/build/src/blockchain/utils.js.map +1 -0
  10. package/build/src/consensus/mina-consensus.js +59 -0
  11. package/build/src/consensus/mina-consensus.js.map +1 -0
  12. package/build/src/context.js +10 -0
  13. package/build/src/context.js.map +1 -0
  14. package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js +2 -0
  15. package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js.map +1 -0
  16. package/build/src/db/archive-node-adapter/archive-node-adapter.js +47 -0
  17. package/build/src/db/archive-node-adapter/archive-node-adapter.js.map +1 -0
  18. package/build/src/db/sql/events-actions/queries.js +438 -0
  19. package/build/src/db/sql/events-actions/queries.js.map +1 -0
  20. package/build/src/db/sql/events-actions/types.js +2 -0
  21. package/build/src/db/sql/events-actions/types.js.map +1 -0
  22. package/build/src/errors/error.js +17 -0
  23. package/build/src/errors/error.js.map +1 -0
  24. package/build/src/index.js +27 -0
  25. package/build/src/index.js.map +1 -0
  26. package/build/src/resolvers-types.js +8 -0
  27. package/build/src/resolvers-types.js.map +1 -0
  28. package/build/src/resolvers.js +67 -0
  29. package/build/src/resolvers.js.map +1 -0
  30. package/build/src/server/plugins.js +39 -0
  31. package/build/src/server/plugins.js.map +1 -0
  32. package/build/src/server/server.js +25 -0
  33. package/build/src/server/server.js.map +1 -0
  34. package/build/src/services/actions-service/actions-service.interface.js +2 -0
  35. package/build/src/services/actions-service/actions-service.interface.js.map +1 -0
  36. package/build/src/services/actions-service/actions-service.js +94 -0
  37. package/build/src/services/actions-service/actions-service.js.map +1 -0
  38. package/build/src/services/blocks-service/blocks-service.interface.js +2 -0
  39. package/build/src/services/blocks-service/blocks-service.interface.js.map +1 -0
  40. package/build/src/services/blocks-service/blocks-service.js +263 -0
  41. package/build/src/services/blocks-service/blocks-service.js.map +1 -0
  42. package/build/src/services/data-adapters/database-row-adapters.js +116 -0
  43. package/build/src/services/data-adapters/database-row-adapters.js.map +1 -0
  44. package/build/src/services/events-service/events-service.interface.js +2 -0
  45. package/build/src/services/events-service/events-service.interface.js.map +1 -0
  46. package/build/src/services/events-service/events-service.js +64 -0
  47. package/build/src/services/events-service/events-service.js.map +1 -0
  48. package/build/src/services/network-service/network-service.interface.js +2 -0
  49. package/build/src/services/network-service/network-service.interface.js.map +1 -0
  50. package/build/src/services/network-service/network-service.js +31 -0
  51. package/build/src/services/network-service/network-service.js.map +1 -0
  52. package/build/src/tracing/jaeger-setup.js +39 -0
  53. package/build/src/tracing/jaeger-setup.js.map +1 -0
  54. package/build/src/tracing/jaeger-tracing.js +29 -0
  55. package/build/src/tracing/jaeger-tracing.js.map +1 -0
  56. package/build/src/tracing/tracer.js +31 -0
  57. package/build/src/tracing/tracer.js.map +1 -0
  58. package/build/tests/__mocks__/generate_mock_data.js +13 -0
  59. package/build/tests/__mocks__/generate_mock_data.js.map +1 -0
  60. package/build/tests/consensus/run-compare.js +40 -0
  61. package/build/tests/consensus/run-compare.js.map +1 -0
  62. package/build/tests/consensus/select-consensus-precomputed.js +80 -0
  63. package/build/tests/consensus/select-consensus-precomputed.js.map +1 -0
  64. package/build/tests/consensus/types.js +15 -0
  65. package/build/tests/consensus/types.js.map +1 -0
  66. package/build/tests/devnet-dump/devnet-dump.test.js +311 -0
  67. package/build/tests/devnet-dump/devnet-dump.test.js.map +1 -0
  68. package/build/tests/devnet-dump/setup.js +58 -0
  69. package/build/tests/devnet-dump/setup.js.map +1 -0
  70. package/build/tests/integration/integration.test.js +226 -0
  71. package/build/tests/integration/integration.test.js.map +1 -0
  72. package/build/tests/integration/setup.js +82 -0
  73. package/build/tests/integration/setup.js.map +1 -0
  74. package/build/tests/live-api/actions.test.js +4 -0
  75. package/build/tests/live-api/actions.test.js.map +1 -0
  76. package/build/tests/live-api/blocks.test.js +116 -0
  77. package/build/tests/live-api/blocks.test.js.map +1 -0
  78. package/build/tests/live-api/events.test.js +97 -0
  79. package/build/tests/live-api/events.test.js.map +1 -0
  80. package/build/tests/live-api/networkState.test.js +27 -0
  81. package/build/tests/live-api/networkState.test.js.map +1 -0
  82. package/build/tests/live-network/live-network.test.js +144 -0
  83. package/build/tests/live-network/live-network.test.js.map +1 -0
  84. package/build/tests/live-network/setup.js +206 -0
  85. package/build/tests/live-network/setup.js.map +1 -0
  86. package/build/tests/resolvers.test.js +475 -0
  87. package/build/tests/resolvers.test.js.map +1 -0
  88. package/build/tests/services/actions-service/actions-service.test.js +124 -0
  89. package/build/tests/services/actions-service/actions-service.test.js.map +1 -0
  90. package/build/tests/services/blocks-service/blocks-service.test.js +348 -0
  91. package/build/tests/services/blocks-service/blocks-service.test.js.map +1 -0
  92. package/build/tests/services/events-service/events-service.test.js +185 -0
  93. package/build/tests/services/events-service/events-service.test.js.map +1 -0
  94. package/build/tests/test-helpers.js +11 -0
  95. package/build/tests/test-helpers.js.map +1 -0
  96. package/build/tests/unit/blockchain-utils.test.js +106 -0
  97. package/build/tests/unit/blockchain-utils.test.js.map +1 -0
  98. package/build/tests/unit/consensus.test.js +154 -0
  99. package/build/tests/unit/consensus.test.js.map +1 -0
  100. package/build/tests/unit/error-handling.test.js +52 -0
  101. package/build/tests/unit/error-handling.test.js.map +1 -0
  102. package/build/tests/utils.test.js +313 -0
  103. package/build/tests/utils.test.js.map +1 -0
  104. package/build/zkapp/contract.js +144 -0
  105. package/build/zkapp/contract.js.map +1 -0
  106. package/build/zkapp/utils.js +174 -0
  107. package/build/zkapp/utils.js.map +1 -0
  108. package/package.json +85 -0
  109. package/schema.graphql +221 -0
  110. package/src/blockchain/constants.ts +2 -0
  111. package/src/blockchain/types.ts +121 -0
  112. package/src/blockchain/utils.ts +54 -0
  113. package/src/consensus/mina-consensus.ts +137 -0
  114. package/src/context.ts +18 -0
  115. package/src/db/archive-node-adapter/archive-node-adapter.interface.ts +23 -0
  116. package/src/db/archive-node-adapter/archive-node-adapter.ts +101 -0
  117. package/src/db/sql/events-actions/queries.ts +490 -0
  118. package/src/db/sql/events-actions/types.ts +208 -0
  119. package/src/envionment.d.ts +18 -0
  120. package/src/errors/error.ts +20 -0
  121. package/src/index.ts +31 -0
  122. package/src/resolvers-types.ts +754 -0
  123. package/src/resolvers.ts +102 -0
  124. package/src/server/plugins.ts +56 -0
  125. package/src/server/server.ts +30 -0
  126. package/src/services/actions-service/actions-service.interface.ts +9 -0
  127. package/src/services/actions-service/actions-service.ts +195 -0
  128. package/src/services/blocks-service/blocks-service.interface.ts +11 -0
  129. package/src/services/blocks-service/blocks-service.ts +407 -0
  130. package/src/services/data-adapters/database-row-adapters.ts +261 -0
  131. package/src/services/events-service/events-service.interface.ts +6 -0
  132. package/src/services/events-service/events-service.ts +118 -0
  133. package/src/services/network-service/network-service.interface.ts +5 -0
  134. package/src/services/network-service/network-service.ts +53 -0
  135. package/src/tracing/jaeger-setup.ts +65 -0
  136. package/src/tracing/jaeger-tracing.ts +44 -0
  137. package/src/tracing/tracer.ts +52 -0
  138. package/tsconfig.json +104 -0
@@ -0,0 +1,27 @@
1
+ import { gql } from 'graphql-tag';
2
+ import { GraphQLClient } from 'graphql-request';
3
+ import assert from 'node:assert';
4
+ import { describe, it } from 'node:test';
5
+ const K = 290;
6
+ const endpoint = process.env.STAGING_GRAPHQL_ENDPOINT ||
7
+ 'http://archive-node-api.gcp.o1test.net/';
8
+ const client = new GraphQLClient(endpoint);
9
+ const networkStateQuery = gql `
10
+ query {
11
+ networkState {
12
+ maxBlockHeight {
13
+ canonicalMaxBlockHeight
14
+ pendingMaxBlockHeight
15
+ }
16
+ }
17
+ }
18
+ `;
19
+ describe('Network State', () => {
20
+ it('should return the network state', async () => {
21
+ const data = await client.request(networkStateQuery);
22
+ const { maxBlockHeight } = data.networkState;
23
+ const { canonicalMaxBlockHeight, pendingMaxBlockHeight } = maxBlockHeight;
24
+ assert.strictEqual(pendingMaxBlockHeight - canonicalMaxBlockHeight, K);
25
+ });
26
+ });
27
+ //# sourceMappingURL=networkState.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkState.test.js","sourceRoot":"","sources":["../../../tests/live-api/networkState.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,CAAC,GAAG,GAAG,CAAC;AACd,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,wBAAwB;IACpC,yCAAyC,CAAC;AAC5C,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;AAE3C,MAAM,iBAAiB,GAAG,GAAG,CAAA;;;;;;;;;CAS5B,CAAC;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GACR,MAAM,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QAC7C,MAAM,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,GAAG,cAAc,CAAC;QAE1E,MAAM,CAAC,WAAW,CAAC,qBAAqB,GAAG,uBAAuB,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { describe, test, before, after } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import postgres from 'postgres';
4
+ import { BlocksService } from '../../src/services/blocks-service/blocks-service.js';
5
+ import { NetworkService } from '../../src/services/network-service/network-service.js';
6
+ import { EventsService } from '../../src/services/events-service/events-service.js';
7
+ import { ActionsService } from '../../src/services/actions-service/actions-service.js';
8
+ import { TracingState } from '../../src/tracing/tracer.js';
9
+ import { startLightnet, stopLightnet, acquireKeyPair, importAndUnlockWhaleAccount, sendPayment, waitForBlockHeight, PG_CONN, } from './setup.js';
10
+ const nullOptions = { tracingState: new TracingState(undefined) };
11
+ const MIN_BLOCKS = 3;
12
+ let client;
13
+ let blocksService;
14
+ let networkService;
15
+ let eventsService;
16
+ let actionsService;
17
+ before(async () => {
18
+ await startLightnet();
19
+ client = postgres(PG_CONN, { max: 5 });
20
+ blocksService = new BlocksService(client);
21
+ networkService = new NetworkService(client);
22
+ eventsService = new EventsService(client);
23
+ actionsService = new ActionsService(client);
24
+ console.log(`Waiting for at least ${MIN_BLOCKS} blocks...`);
25
+ await waitForBlockHeight(MIN_BLOCKS, PG_CONN, 180000);
26
+ console.log('Blocks are being produced. Running tests.');
27
+ }, { timeout: 600000 });
28
+ after(async () => {
29
+ if (client)
30
+ await client.end();
31
+ await stopLightnet();
32
+ });
33
+ describe('Blocks (live network)', () => {
34
+ test('returns produced blocks', async () => {
35
+ const blocks = await blocksService.getBlocks(null, 10, null, nullOptions);
36
+ assert.ok(blocks.length > 0, 'should have produced blocks');
37
+ for (const block of blocks) {
38
+ assert.ok(block.stateHash, 'block should have stateHash');
39
+ assert.ok(block.creator.startsWith('B62q'), 'creator should be a B62 public key');
40
+ assert.ok(block.dateTime, 'block should have dateTime');
41
+ assert.ok(block.transactions, 'block should have transactions');
42
+ }
43
+ });
44
+ test('blocks have incrementing heights', async () => {
45
+ const blocks = await blocksService.getBlocks({ canonical: true }, 10, 'BLOCKHEIGHT_ASC', nullOptions);
46
+ assert.ok(blocks.length >= 2, 'need at least 2 blocks');
47
+ for (let i = 1; i < blocks.length; i++) {
48
+ assert.ok(Number(blocks[i].blockHeight) >= Number(blocks[i - 1].blockHeight), 'heights should be non-decreasing');
49
+ }
50
+ });
51
+ test('blocks can be filtered by height', async () => {
52
+ const blocks = await blocksService.getBlocks({ blockHeight_gte: 1, blockHeight_lt: 3 }, null, null, nullOptions);
53
+ for (const block of blocks) {
54
+ const h = Number(block.blockHeight);
55
+ assert.ok(h >= 1 && h < 3, `height ${h} should be in [1, 3)`);
56
+ }
57
+ });
58
+ test('blocks DESC sort works', async () => {
59
+ const blocks = await blocksService.getBlocks(null, 5, 'BLOCKHEIGHT_DESC', nullOptions);
60
+ assert.ok(blocks.length > 0);
61
+ for (let i = 1; i < blocks.length; i++) {
62
+ assert.ok(Number(blocks[i].blockHeight) <= Number(blocks[i - 1].blockHeight));
63
+ }
64
+ });
65
+ });
66
+ describe('NetworkState (live network)', () => {
67
+ test('returns valid max block heights', async () => {
68
+ const state = await networkService.getNetworkState(nullOptions);
69
+ assert.ok(state.maxBlockHeight, 'should have maxBlockHeight');
70
+ assert.ok(state.maxBlockHeight.canonicalMaxBlockHeight >= 0 ||
71
+ state.maxBlockHeight.pendingMaxBlockHeight >= 0, 'should have at least one height > 0');
72
+ });
73
+ test('pending height >= canonical height', async () => {
74
+ const state = await networkService.getNetworkState(nullOptions);
75
+ assert.ok(state.maxBlockHeight.pendingMaxBlockHeight >=
76
+ state.maxBlockHeight.canonicalMaxBlockHeight, 'pending should be >= canonical');
77
+ });
78
+ });
79
+ describe('Events (live network)', () => {
80
+ test('returns empty for random address', async () => {
81
+ const events = await eventsService.getEvents({ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg' }, nullOptions);
82
+ assert.deepStrictEqual(events, []);
83
+ });
84
+ });
85
+ describe('Actions (live network)', () => {
86
+ test('returns empty for random address', async () => {
87
+ const actions = await actionsService.getActions({ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg' }, nullOptions);
88
+ assert.deepStrictEqual(actions, []);
89
+ });
90
+ });
91
+ describe('Transactions (live network)', () => {
92
+ test('send payment and verify it appears in archive', async () => {
93
+ console.log(' Importing and unlocking whale account...');
94
+ const senderPk = await importAndUnlockWhaleAccount();
95
+ console.log(` Sender: ${senderPk.slice(0, 20)}...`);
96
+ const receiver = await acquireKeyPair();
97
+ console.log(` Receiver: ${receiver.publicKey.slice(0, 20)}...`);
98
+ const txHash = await sendPayment(senderPk, receiver.publicKey, '1000000000', '100000000');
99
+ assert.ok(txHash, 'should get a transaction hash');
100
+ console.log(` Payment sent: ${txHash.slice(0, 25)}...`);
101
+ console.log(' Waiting for transaction to appear in archive...');
102
+ const maxWait = 120000;
103
+ const start = Date.now();
104
+ let found = false;
105
+ while (Date.now() - start < maxWait) {
106
+ const rows = await client `
107
+ SELECT hash FROM user_commands WHERE hash = ${txHash}
108
+ `;
109
+ if (rows.length > 0) {
110
+ found = true;
111
+ break;
112
+ }
113
+ await new Promise((r) => setTimeout(r, 5000));
114
+ }
115
+ assert.ok(found, `transaction ${txHash} should appear in the archive database`);
116
+ console.log(' Transaction confirmed in archive.');
117
+ });
118
+ });
119
+ describe('Schema validation (live network)', () => {
120
+ test('all required tables exist in live archive', async () => {
121
+ const tables = await client `
122
+ SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'
123
+ `;
124
+ const tableNames = tables.map((t) => t.tablename);
125
+ const required = [
126
+ 'blocks',
127
+ 'account_identifiers',
128
+ 'accounts_accessed',
129
+ 'blocks_zkapp_commands',
130
+ 'zkapp_commands',
131
+ 'zkapp_account_update',
132
+ 'zkapp_account_update_body',
133
+ 'zkapp_events',
134
+ 'zkapp_field_array',
135
+ 'zkapp_field',
136
+ 'zkapp_accounts',
137
+ 'zkapp_action_states',
138
+ ];
139
+ for (const table of required) {
140
+ assert.ok(tableNames.includes(table), `table ${table} should exist`);
141
+ }
142
+ });
143
+ });
144
+ //# sourceMappingURL=live-network.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-network.test.js","sourceRoot":"","sources":["../../../tests/live-network/live-network.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ import { execSync } from 'child_process';
2
+ import http from 'http';
3
+ const MINA_PRIVKEY_PASS = 'naughty blue worm';
4
+ const WHALE_KEY_PATH = '/root/.mina-network/offline_whale_keys/offline_whale_account_0';
5
+ const LIGHTNET_IMAGE = process.env.LIGHTNET_IMAGE ??
6
+ 'o1labs/mina-local-network:compatible-latest-lightnet';
7
+ const NETWORK_TYPE = process.env.LIGHTNET_NETWORK_TYPE ?? 'single-node';
8
+ const PROOF_LEVEL = process.env.LIGHTNET_PROOF_LEVEL ?? 'none';
9
+ const SLOT_TIME = process.env.LIGHTNET_SLOT_TIME ?? '20000';
10
+ const CONTAINER_NAME = 'archive-node-api-live-test';
11
+ export const MINA_GRAPHQL_PORT = Number(process.env.LIGHTNET_GRAPHQL_PORT ?? '28080');
12
+ export const POSTGRES_PORT = Number(process.env.LIGHTNET_PG_PORT ?? '25432');
13
+ export const ACCOUNTS_MANAGER_PORT = Number(process.env.LIGHTNET_ACCOUNTS_PORT ?? '28181');
14
+ export const ARCHIVE_API_PORT = Number(process.env.LIGHTNET_ARCHIVE_PORT ?? '28282');
15
+ const MINA_REST_PORT = Number(process.env.LIGHTNET_REST_PORT ?? '23085');
16
+ export const PG_CONN = `postgresql://postgres:postgres@localhost:${POSTGRES_PORT}/archive`;
17
+ export async function startLightnet() {
18
+ try {
19
+ execSync(`docker rm -f ${CONTAINER_NAME} 2>/dev/null`, { stdio: 'pipe' });
20
+ }
21
+ catch {
22
+ }
23
+ console.log(`Starting lightnet container (${LIGHTNET_IMAGE})...`);
24
+ execSync([
25
+ 'docker run -d',
26
+ `--name ${CONTAINER_NAME}`,
27
+ `-e NETWORK_TYPE=${NETWORK_TYPE}`,
28
+ `-e PROOF_LEVEL=${PROOF_LEVEL}`,
29
+ `-e SLOT_TIME=${SLOT_TIME}`,
30
+ `-p ${MINA_GRAPHQL_PORT}:8080`,
31
+ `-p ${POSTGRES_PORT}:5432`,
32
+ `-p ${ACCOUNTS_MANAGER_PORT}:8181`,
33
+ `-p ${ARCHIVE_API_PORT}:8282`,
34
+ `-p ${MINA_REST_PORT}:3085`,
35
+ LIGHTNET_IMAGE,
36
+ ].join(' '), { stdio: 'pipe' });
37
+ console.log('Waiting for Mina network readiness...');
38
+ await waitForNetwork(300000);
39
+ console.log('Mina network is ready.');
40
+ }
41
+ export async function stopLightnet() {
42
+ try {
43
+ execSync(`docker rm -f ${CONTAINER_NAME}`, { stdio: 'pipe' });
44
+ }
45
+ catch {
46
+ }
47
+ }
48
+ async function waitForNetwork(timeoutMs) {
49
+ const start = Date.now();
50
+ const pollIntervalMs = 5000;
51
+ while (Date.now() - start < timeoutMs) {
52
+ try {
53
+ const status = await queryDaemonStatus();
54
+ if (status === 'SYNCED')
55
+ return;
56
+ console.log(` Network status: ${status}, waiting...`);
57
+ }
58
+ catch {
59
+ console.log(' Network not ready yet...');
60
+ }
61
+ await sleep(pollIntervalMs);
62
+ }
63
+ throw new Error(`Network did not become ready within ${timeoutMs}ms`);
64
+ }
65
+ async function queryDaemonStatus() {
66
+ return new Promise((resolve, reject) => {
67
+ const body = JSON.stringify({
68
+ query: '{ daemonStatus { syncStatus } }',
69
+ });
70
+ const req = http.request({
71
+ hostname: 'localhost',
72
+ port: MINA_GRAPHQL_PORT,
73
+ path: '/graphql',
74
+ method: 'POST',
75
+ headers: {
76
+ 'Content-Type': 'application/json',
77
+ 'Content-Length': Buffer.byteLength(body),
78
+ },
79
+ timeout: 5000,
80
+ }, (res) => {
81
+ let data = '';
82
+ res.on('data', (chunk) => (data += chunk));
83
+ res.on('end', () => {
84
+ try {
85
+ const json = JSON.parse(data);
86
+ resolve(json.data?.daemonStatus?.syncStatus ?? 'UNKNOWN');
87
+ }
88
+ catch {
89
+ reject(new Error('Invalid response'));
90
+ }
91
+ });
92
+ });
93
+ req.on('error', reject);
94
+ req.on('timeout', () => {
95
+ req.destroy();
96
+ reject(new Error('Timeout'));
97
+ });
98
+ req.write(body);
99
+ req.end();
100
+ });
101
+ }
102
+ function daemonGraphQL(query) {
103
+ return new Promise((resolve, reject) => {
104
+ const body = JSON.stringify({ query });
105
+ const req = http.request({
106
+ hostname: 'localhost',
107
+ port: MINA_GRAPHQL_PORT,
108
+ path: '/graphql',
109
+ method: 'POST',
110
+ headers: {
111
+ 'Content-Type': 'application/json',
112
+ 'Content-Length': Buffer.byteLength(body),
113
+ },
114
+ timeout: 15000,
115
+ }, (res) => {
116
+ let data = '';
117
+ res.on('data', (chunk) => (data += chunk));
118
+ res.on('end', () => {
119
+ try {
120
+ const json = JSON.parse(data);
121
+ if (json.errors) {
122
+ reject(new Error(JSON.stringify(json.errors)));
123
+ }
124
+ else {
125
+ resolve(json.data);
126
+ }
127
+ }
128
+ catch {
129
+ reject(new Error(`Invalid GraphQL response: ${data}`));
130
+ }
131
+ });
132
+ });
133
+ req.on('error', reject);
134
+ req.on('timeout', () => {
135
+ req.destroy();
136
+ reject(new Error('GraphQL request timeout'));
137
+ });
138
+ req.write(body);
139
+ req.end();
140
+ });
141
+ }
142
+ export async function importAndUnlockWhaleAccount() {
143
+ const importResult = await daemonGraphQL(`mutation { importAccount(password: "${MINA_PRIVKEY_PASS}", path: "${WHALE_KEY_PATH}") { publicKey } }`);
144
+ const pk = importResult.importAccount.publicKey;
145
+ await daemonGraphQL(`mutation { unlockAccount(input: { publicKey: "${pk}", password: "${MINA_PRIVKEY_PASS}" }) { publicKey } }`);
146
+ return pk;
147
+ }
148
+ export async function sendPayment(from, to, amount, fee) {
149
+ const result = await daemonGraphQL(`mutation { sendPayment(input: { from: "${from}", to: "${to}", amount: "${amount}", fee: "${fee}" }) { payment { hash } } }`);
150
+ return result.sendPayment.payment.hash;
151
+ }
152
+ export async function acquireKeyPair() {
153
+ return new Promise((resolve, reject) => {
154
+ const req = http.get({
155
+ hostname: 'localhost',
156
+ port: ACCOUNTS_MANAGER_PORT,
157
+ path: '/acquire-account',
158
+ timeout: 10000,
159
+ }, (res) => {
160
+ let data = '';
161
+ res.on('data', (chunk) => (data += chunk));
162
+ res.on('end', () => {
163
+ try {
164
+ const json = JSON.parse(data);
165
+ if (json.pk && json.sk) {
166
+ resolve({ publicKey: json.pk, privateKey: json.sk });
167
+ }
168
+ else {
169
+ reject(new Error(`acquireKeyPair failed: ${JSON.stringify(json)}`));
170
+ }
171
+ }
172
+ catch {
173
+ reject(new Error(`Invalid response from accounts manager: ${data}`));
174
+ }
175
+ });
176
+ });
177
+ req.on('error', reject);
178
+ req.on('timeout', () => {
179
+ req.destroy();
180
+ reject(new Error('Timeout'));
181
+ });
182
+ });
183
+ }
184
+ export async function waitForBlockHeight(targetHeight, pgConn, timeoutMs = 120000) {
185
+ const pg = await import('postgres');
186
+ const client = pg.default(pgConn);
187
+ const start = Date.now();
188
+ try {
189
+ while (Date.now() - start < timeoutMs) {
190
+ const rows = await client `SELECT max(height) as max_height FROM blocks`;
191
+ const currentHeight = Number(rows[0]?.max_height ?? 0);
192
+ if (currentHeight >= targetHeight)
193
+ return;
194
+ console.log(` Block height: ${currentHeight}, waiting for ${targetHeight}...`);
195
+ await sleep(5000);
196
+ }
197
+ throw new Error(`Block height did not reach ${targetHeight} within ${timeoutMs}ms`);
198
+ }
199
+ finally {
200
+ await client.end();
201
+ }
202
+ }
203
+ function sleep(ms) {
204
+ return new Promise((r) => setTimeout(r, ms));
205
+ }
206
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../tests/live-network/setup.ts"],"names":[],"mappings":"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"}