@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,58 @@
1
+ import { execSync } from 'child_process';
2
+ import postgres from 'postgres';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ const PG_TEST_HOST = process.env.PG_TEST_HOST ?? 'localhost';
6
+ const PG_TEST_PORT = process.env.PG_TEST_PORT ?? '5432';
7
+ const PG_TEST_USER = process.env.PG_TEST_USER ?? 'postgres';
8
+ const PG_TEST_PASSWORD = process.env.PG_TEST_PASSWORD ?? 'postgres';
9
+ const PG_TEST_DB = process.env.PG_TEST_DB ?? 'devnet_dump_test';
10
+ const DATA_DIR = path.resolve(process.cwd(), 'data');
11
+ const DEFAULT_DUMP_PATH = path.join(DATA_DIR, 'devnet-archive.sql');
12
+ const DEVNET_DUMP_PATH = process.env.DEVNET_DUMP_PATH ?? DEFAULT_DUMP_PATH;
13
+ export const connectionString = `postgres://${PG_TEST_USER}:${PG_TEST_PASSWORD}@${PG_TEST_HOST}:${PG_TEST_PORT}/${PG_TEST_DB}`;
14
+ function adminConnectionString(db = 'postgres') {
15
+ return `postgres://${PG_TEST_USER}:${PG_TEST_PASSWORD}@${PG_TEST_HOST}:${PG_TEST_PORT}/${db}`;
16
+ }
17
+ export async function downloadDump() {
18
+ if (fs.existsSync(DEVNET_DUMP_PATH)) {
19
+ console.log(`Using existing dump at ${DEVNET_DUMP_PATH}`);
20
+ return DEVNET_DUMP_PATH;
21
+ }
22
+ console.log('Downloading devnet archive dump (second-newest to avoid incomplete)...');
23
+ const script = path.resolve(process.cwd(), 'scripts/download_devnet_dump.sh');
24
+ execSync(`bash ${script} ${DATA_DIR}`, { stdio: 'inherit' });
25
+ if (!fs.existsSync(DEVNET_DUMP_PATH)) {
26
+ throw new Error(`Dump not found at ${DEVNET_DUMP_PATH} after download`);
27
+ }
28
+ return DEVNET_DUMP_PATH;
29
+ }
30
+ export async function setupTestDatabase() {
31
+ const dumpPath = await downloadDump();
32
+ const admin = postgres(adminConnectionString(), { max: 1 });
33
+ try {
34
+ await admin.unsafe(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${PG_TEST_DB}' AND pid <> pg_backend_pid()`);
35
+ await admin.unsafe(`DROP DATABASE IF EXISTS ${PG_TEST_DB}`);
36
+ await admin.unsafe(`CREATE DATABASE ${PG_TEST_DB}`);
37
+ }
38
+ finally {
39
+ await admin.end();
40
+ }
41
+ console.log(`Loading devnet dump into ${PG_TEST_DB}... (this may take a few minutes)`);
42
+ execSync(`PGPASSWORD=${PG_TEST_PASSWORD} psql -h ${PG_TEST_HOST} -p ${PG_TEST_PORT} -U ${PG_TEST_USER} -d ${PG_TEST_DB} -f ${dumpPath}`, { stdio: 'pipe', timeout: 600000 });
43
+ console.log('Dump loaded successfully.');
44
+ }
45
+ export async function teardownTestDatabase() {
46
+ const admin = postgres(adminConnectionString(), { max: 1 });
47
+ try {
48
+ await admin.unsafe(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${PG_TEST_DB}' AND pid <> pg_backend_pid()`);
49
+ await admin.unsafe(`DROP DATABASE IF EXISTS ${PG_TEST_DB}`);
50
+ }
51
+ finally {
52
+ await admin.end();
53
+ }
54
+ }
55
+ export function createTestClient() {
56
+ return postgres(connectionString, { max: 5 });
57
+ }
58
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../tests/devnet-dump/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import { describe, test, before, after } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { EventsService } from '../../src/services/events-service/events-service.js';
4
+ import { ActionsService } from '../../src/services/actions-service/actions-service.js';
5
+ import { NetworkService } from '../../src/services/network-service/network-service.js';
6
+ import { BlocksService } from '../../src/services/blocks-service/blocks-service.js';
7
+ import { BlockStatusFilter } from '../../src/blockchain/types.js';
8
+ import { TracingState } from '../../src/tracing/tracer.js';
9
+ import { setupTestDatabase, teardownTestDatabase, createTestClient, } from './setup.js';
10
+ const nullOptions = { tracingState: new TracingState(undefined) };
11
+ let client;
12
+ before(async () => {
13
+ await setupTestDatabase();
14
+ client = createTestClient();
15
+ }, { timeout: 30000 });
16
+ after(async () => {
17
+ await client.end();
18
+ await teardownTestDatabase();
19
+ });
20
+ describe('BlocksService (integration)', () => {
21
+ let blocksService;
22
+ before(() => {
23
+ blocksService = new BlocksService(client);
24
+ });
25
+ test('returns blocks with default parameters', async () => {
26
+ const blocks = await blocksService.getBlocks(null, null, null, nullOptions);
27
+ assert.ok(blocks.length > 0, 'should return at least one block');
28
+ for (const block of blocks) {
29
+ assert.ok(block.stateHash, 'stateHash should be present');
30
+ assert.ok(block.creator, 'creator should be present');
31
+ assert.ok(block.dateTime, 'dateTime should be present');
32
+ assert.ok(block.transactions, 'transactions should be present');
33
+ }
34
+ });
35
+ test('returns blocks sorted DESC', async () => {
36
+ const blocks = await blocksService.getBlocks({ canonical: true }, 10, 'BLOCKHEIGHT_DESC', nullOptions);
37
+ assert.ok(blocks.length > 0);
38
+ for (let i = 1; i < blocks.length; i++) {
39
+ assert.ok(Number(blocks[i].blockHeight) <= Number(blocks[i - 1].blockHeight), `block ${i} height should be <= previous in DESC`);
40
+ }
41
+ });
42
+ test('respects limit parameter', async () => {
43
+ const blocks = await blocksService.getBlocks(null, 3, null, nullOptions);
44
+ assert.strictEqual(blocks.length, 3);
45
+ });
46
+ test('filters by blockHeight_gte', async () => {
47
+ const blocks = await blocksService.getBlocks({ blockHeight_gte: 20 }, null, null, nullOptions);
48
+ assert.ok(blocks.length > 0);
49
+ for (const block of blocks) {
50
+ assert.ok(block.blockHeight >= 20, `block height ${block.blockHeight} should be >= 20`);
51
+ }
52
+ });
53
+ test('filters by blockHeight_lt', async () => {
54
+ const blocks = await blocksService.getBlocks({ blockHeight_lt: 5 }, null, null, nullOptions);
55
+ assert.ok(blocks.length > 0);
56
+ for (const block of blocks) {
57
+ assert.ok(block.blockHeight < 5, `block height ${block.blockHeight} should be < 5`);
58
+ }
59
+ });
60
+ test('filters by height range', async () => {
61
+ const blocks = await blocksService.getBlocks({ blockHeight_gte: 10, blockHeight_lt: 15 }, null, null, nullOptions);
62
+ for (const block of blocks) {
63
+ assert.ok(block.blockHeight >= 10 && block.blockHeight < 15);
64
+ }
65
+ });
66
+ test('filters canonical blocks only', async () => {
67
+ const blocks = await blocksService.getBlocks({ canonical: true }, null, null, nullOptions);
68
+ assert.ok(blocks.length > 0);
69
+ assert.strictEqual(blocks.length, 24, 'should return all 24 canonical blocks');
70
+ });
71
+ test('filters non-canonical blocks', async () => {
72
+ const blocks = await blocksService.getBlocks({ canonical: false }, null, null, nullOptions);
73
+ assert.ok(blocks.length > 0, 'should have orphaned/pending blocks');
74
+ });
75
+ test('filters inBestChain=true', async () => {
76
+ const blocks = await blocksService.getBlocks({ inBestChain: true }, null, null, nullOptions);
77
+ assert.ok(blocks.length > 0);
78
+ assert.ok(blocks.length >= 24, 'should include at least all canonical blocks');
79
+ });
80
+ test('block data has correct shape', async () => {
81
+ const blocks = await blocksService.getBlocks({ canonical: true, blockHeight_gte: 2, blockHeight_lt: 3 }, 1, null, nullOptions);
82
+ assert.strictEqual(blocks.length, 1);
83
+ const block = blocks[0];
84
+ assert.strictEqual(Number(block.blockHeight), 2);
85
+ assert.ok(block.stateHash.length > 0, 'stateHash should be non-empty');
86
+ assert.ok(block.creator.startsWith('B62q'), 'creator should be a B62 key');
87
+ assert.ok(block.dateTime, 'dateTime should be present');
88
+ assert.ok(block.transactions, 'transactions should be present');
89
+ const date = new Date(block.dateTime);
90
+ assert.ok(!isNaN(date.getTime()), 'dateTime should be valid ISO date');
91
+ });
92
+ test('block coinbase is populated for canonical blocks', async () => {
93
+ const blocks = await blocksService.getBlocks({ canonical: true, blockHeight_gte: 2, blockHeight_lt: 4 }, null, null, nullOptions);
94
+ const withCoinbase = blocks.filter((b) => b.transactions.coinbase !== '0');
95
+ assert.ok(withCoinbase.length > 0, 'at least one block should have coinbase');
96
+ });
97
+ test('returns empty for impossible height range', async () => {
98
+ const blocks = await blocksService.getBlocks({ blockHeight_gte: 99999 }, null, null, nullOptions);
99
+ assert.strictEqual(blocks.length, 0);
100
+ });
101
+ test('filters by dateTime range', async () => {
102
+ const allBlocks = await blocksService.getBlocks({ canonical: true }, 1, 'BLOCKHEIGHT_DESC', nullOptions);
103
+ const latestTime = new Date(allBlocks[0].dateTime);
104
+ const oneHourBefore = new Date(latestTime.getTime() - 3600000);
105
+ const blocks = await blocksService.getBlocks({ dateTime_gte: oneHourBefore.toISOString(), dateTime_lt: latestTime.toISOString() }, null, null, nullOptions);
106
+ for (const block of blocks) {
107
+ const blockTime = new Date(block.dateTime);
108
+ assert.ok(blockTime >= oneHourBefore && blockTime < latestTime);
109
+ }
110
+ });
111
+ });
112
+ describe('NetworkService (integration)', () => {
113
+ let networkService;
114
+ before(() => {
115
+ networkService = new NetworkService(client);
116
+ });
117
+ test('returns max block heights for canonical and pending', async () => {
118
+ const state = await networkService.getNetworkState(nullOptions);
119
+ assert.ok(state.maxBlockHeight, 'maxBlockHeight should be present');
120
+ assert.strictEqual(state.maxBlockHeight.canonicalMaxBlockHeight, 25, 'canonical max should be 25 (from dump)');
121
+ assert.strictEqual(state.maxBlockHeight.pendingMaxBlockHeight, 26, 'pending max should be 26 (inserted by test setup)');
122
+ });
123
+ test('pending height > canonical height', async () => {
124
+ const state = await networkService.getNetworkState(nullOptions);
125
+ assert.ok(state.maxBlockHeight.pendingMaxBlockHeight >
126
+ state.maxBlockHeight.canonicalMaxBlockHeight);
127
+ });
128
+ });
129
+ describe('EventsService (integration)', () => {
130
+ let eventsService;
131
+ before(() => {
132
+ eventsService = new EventsService(client);
133
+ });
134
+ test('returns empty for address with no events', async () => {
135
+ const events = await eventsService.getEvents({
136
+ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg',
137
+ }, nullOptions);
138
+ assert.deepStrictEqual(events, []);
139
+ });
140
+ test('returns empty for nonexistent address', async () => {
141
+ const events = await eventsService.getEvents({
142
+ address: 'B62qnonexistentAddressThatDoesNotExistInTheDatabase1234567',
143
+ }, nullOptions);
144
+ assert.deepStrictEqual(events, []);
145
+ });
146
+ test('returns empty with block range filter', async () => {
147
+ const events = await eventsService.getEvents({
148
+ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg',
149
+ from: 1,
150
+ to: 10,
151
+ }, nullOptions);
152
+ assert.deepStrictEqual(events, []);
153
+ });
154
+ test('returns empty with canonical status filter', async () => {
155
+ const events = await eventsService.getEvents({
156
+ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg',
157
+ status: BlockStatusFilter.canonical,
158
+ }, nullOptions);
159
+ assert.deepStrictEqual(events, []);
160
+ });
161
+ test('throws block range error when to < from', async () => {
162
+ await assert.rejects(() => eventsService.getEvents({ address: 'B62qtest', from: 100, to: 50 }, nullOptions), (err) => {
163
+ assert.strictEqual(err.extensions?.code, 'BLOCK_RANGE_ERROR');
164
+ return true;
165
+ });
166
+ });
167
+ });
168
+ describe('ActionsService (integration)', () => {
169
+ let actionsService;
170
+ before(() => {
171
+ actionsService = new ActionsService(client);
172
+ });
173
+ test('returns empty for address with no actions', async () => {
174
+ const actions = await actionsService.getActions({
175
+ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg',
176
+ }, nullOptions);
177
+ assert.deepStrictEqual(actions, []);
178
+ });
179
+ test('returns empty for nonexistent address', async () => {
180
+ const actions = await actionsService.getActions({
181
+ address: 'B62qnonexistentAddressThatDoesNotExistInTheDatabase1234567',
182
+ }, nullOptions);
183
+ assert.deepStrictEqual(actions, []);
184
+ });
185
+ test('throws block range error when to < from', async () => {
186
+ await assert.rejects(() => actionsService.getActions({ address: 'B62qtest', from: 100, to: 50 }, nullOptions), (err) => {
187
+ assert.strictEqual(err.extensions?.code, 'BLOCK_RANGE_ERROR');
188
+ return true;
189
+ });
190
+ });
191
+ test('throws action state error for nonexistent fromActionState', async () => {
192
+ await assert.rejects(() => actionsService.getActions({
193
+ address: 'B62qiy32p8kAKnny8ZFwoMhYpBppM1DWVCqAPBYNcXnsAHhnfAAuXgg',
194
+ fromActionState: 'nonexistent_action_state_hash_value',
195
+ }, nullOptions), (err) => {
196
+ assert.strictEqual(err.extensions?.code, 'ACTION_STATE_NOT_FOUND');
197
+ return true;
198
+ });
199
+ });
200
+ });
201
+ describe('Schema validation (integration)', () => {
202
+ test('all required tables exist', async () => {
203
+ const tables = await client `
204
+ SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'
205
+ `;
206
+ const tableNames = tables.map((t) => t.tablename);
207
+ const required = [
208
+ 'blocks',
209
+ 'account_identifiers',
210
+ 'accounts_accessed',
211
+ 'blocks_zkapp_commands',
212
+ 'zkapp_commands',
213
+ 'zkapp_account_update',
214
+ 'zkapp_account_update_body',
215
+ 'zkapp_events',
216
+ 'zkapp_field_array',
217
+ 'zkapp_field',
218
+ 'zkapp_accounts',
219
+ 'zkapp_action_states',
220
+ ];
221
+ for (const table of required) {
222
+ assert.ok(tableNames.includes(table), `table ${table} should exist`);
223
+ }
224
+ });
225
+ });
226
+ //# sourceMappingURL=integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../tests/integration/integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { execSync } from 'child_process';
2
+ import postgres from 'postgres';
3
+ import path from 'path';
4
+ const PG_TEST_HOST = process.env.PG_TEST_HOST ?? 'localhost';
5
+ const PG_TEST_PORT = process.env.PG_TEST_PORT ?? '5432';
6
+ const PG_TEST_USER = process.env.PG_TEST_USER ?? 'postgres';
7
+ const PG_TEST_PASSWORD = process.env.PG_TEST_PASSWORD ?? 'postgres';
8
+ const PG_TEST_DB = process.env.PG_TEST_DB ?? 'archive_node_api_test';
9
+ const DEFAULT_DUMP_PATH = path.resolve(process.cwd(), 'tests/integration/fixtures/archive_db.sql');
10
+ const ARCHIVE_DUMP_PATH = process.env.ARCHIVE_DUMP_PATH ?? DEFAULT_DUMP_PATH;
11
+ export const connectionString = `postgres://${PG_TEST_USER}:${PG_TEST_PASSWORD}@${PG_TEST_HOST}:${PG_TEST_PORT}/${PG_TEST_DB}`;
12
+ function adminConnectionString(db = 'postgres') {
13
+ return `postgres://${PG_TEST_USER}:${PG_TEST_PASSWORD}@${PG_TEST_HOST}:${PG_TEST_PORT}/${db}`;
14
+ }
15
+ export async function setupTestDatabase() {
16
+ const admin = postgres(adminConnectionString(), { max: 1 });
17
+ try {
18
+ await admin.unsafe(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${PG_TEST_DB}' AND pid <> pg_backend_pid()`);
19
+ await admin.unsafe(`DROP DATABASE IF EXISTS ${PG_TEST_DB}`);
20
+ await admin.unsafe(`CREATE DATABASE ${PG_TEST_DB}`);
21
+ }
22
+ finally {
23
+ await admin.end();
24
+ }
25
+ execSync(`PGPASSWORD=${PG_TEST_PASSWORD} psql -h ${PG_TEST_HOST} -p ${PG_TEST_PORT} -U ${PG_TEST_USER} -d ${PG_TEST_DB} -f ${ARCHIVE_DUMP_PATH}`, { stdio: 'pipe' });
26
+ const db = postgres(connectionString, { max: 1 });
27
+ try {
28
+ await db.unsafe(`
29
+ INSERT INTO blocks (
30
+ id, state_hash, parent_id, parent_hash, creator_id, block_winner_id,
31
+ last_vrf_output,
32
+ snarked_ledger_hash_id, staking_epoch_data_id, next_epoch_data_id,
33
+ min_window_density, sub_window_densities, total_currency,
34
+ ledger_hash, height, global_slot_since_hard_fork, global_slot_since_genesis,
35
+ protocol_version_id, proposed_protocol_version_id,
36
+ timestamp, chain_status
37
+ )
38
+ SELECT
39
+ (SELECT max(id) + 1 FROM blocks),
40
+ '3NKpending_test_state_hash_for_integration_tests',
41
+ id,
42
+ state_hash,
43
+ creator_id,
44
+ block_winner_id,
45
+ last_vrf_output,
46
+ snarked_ledger_hash_id,
47
+ staking_epoch_data_id,
48
+ next_epoch_data_id,
49
+ min_window_density,
50
+ sub_window_densities,
51
+ total_currency,
52
+ ledger_hash,
53
+ height + 1,
54
+ global_slot_since_hard_fork + 1,
55
+ global_slot_since_genesis + 1,
56
+ protocol_version_id,
57
+ proposed_protocol_version_id,
58
+ (timestamp::bigint + 60000)::text,
59
+ 'pending'
60
+ FROM blocks
61
+ WHERE height = (SELECT max(height) FROM blocks)
62
+ LIMIT 1
63
+ `);
64
+ }
65
+ finally {
66
+ await db.end();
67
+ }
68
+ }
69
+ export async function teardownTestDatabase() {
70
+ const admin = postgres(adminConnectionString(), { max: 1 });
71
+ try {
72
+ await admin.unsafe(`SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${PG_TEST_DB}' AND pid <> pg_backend_pid()`);
73
+ await admin.unsafe(`DROP DATABASE IF EXISTS ${PG_TEST_DB}`);
74
+ }
75
+ finally {
76
+ await admin.end();
77
+ }
78
+ }
79
+ export function createTestClient() {
80
+ return postgres(connectionString, { max: 5 });
81
+ }
82
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../tests/integration/setup.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,WAAW,CAAC;AAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC;AACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,UAAU,CAAC;AAC5D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,UAAU,CAAC;AACpE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,uBAAuB,CAAC;AAErE,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2CAA2C,CAAC,CAAC;AACnG,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;AAE7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,YAAY,IAAI,gBAAgB,IAAI,YAAY,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;AAE/H,SAAS,qBAAqB,CAAC,EAAE,GAAG,UAAU;IAC5C,OAAO,cAAc,YAAY,IAAI,gBAAgB,IAAI,YAAY,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC;QAEH,MAAM,KAAK,CAAC,MAAM,CAChB,2EAA2E,UAAU,+BAA+B,CACrH,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,KAAK,CAAC,MAAM,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IACtD,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAGD,QAAQ,CACN,cAAc,gBAAgB,YAAY,YAAY,OAAO,YAAY,OAAO,YAAY,OAAO,UAAU,OAAO,iBAAiB,EAAE,EACvI,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CAAC;IAGF,MAAM,EAAE,GAAG,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmCf,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAChB,2EAA2E,UAAU,+BAA+B,CACrH,CAAC;QACF,MAAM,KAAK,CAAC,MAAM,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,QAAQ,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { describe } from 'node:test';
2
+ describe('Actions', () => {
3
+ });
4
+ //# sourceMappingURL=actions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.test.js","sourceRoot":"","sources":["../../../tests/live-api/actions.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;AAEzB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,116 @@
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 endpoint = process.env.STAGING_GRAPHQL_ENDPOINT ||
6
+ 'http://archive-node-api.gcp.o1test.net/';
7
+ const client = new GraphQLClient(endpoint);
8
+ const blocksQuery = gql `
9
+ query getBlocks($limit: Int, $sortBy: BlockSortByInput) {
10
+ blocks(limit: $limit, sortBy: $sortBy) {
11
+ blockHeight
12
+ creator
13
+ stateHash
14
+ dateTime
15
+ transactions {
16
+ coinbase
17
+ userCommands {
18
+ hash
19
+ kind
20
+ from
21
+ to
22
+ amount
23
+ fee
24
+ memo
25
+ nonce
26
+ status
27
+ failureReason
28
+ }
29
+ zkappCommands {
30
+ hash
31
+ feePayer
32
+ fee
33
+ memo
34
+ status
35
+ failureReason
36
+ }
37
+ feeTransfer {
38
+ recipient
39
+ fee
40
+ type
41
+ }
42
+ }
43
+ }
44
+ }
45
+ `;
46
+ const blocksQueryWithFilter = gql `
47
+ query getBlocksFiltered(
48
+ $query: BlockQueryInput
49
+ $limit: Int
50
+ $sortBy: BlockSortByInput
51
+ ) {
52
+ blocks(query: $query, limit: $limit, sortBy: $sortBy) {
53
+ blockHeight
54
+ creator
55
+ stateHash
56
+ dateTime
57
+ transactions {
58
+ coinbase
59
+ }
60
+ }
61
+ }
62
+ `;
63
+ describe('Blocks', () => {
64
+ it('should return blocks with correct shape and coinbase', async () => {
65
+ const data = await client.request(blocksQuery, {
66
+ limit: 5,
67
+ sortBy: 'BLOCKHEIGHT_DESC',
68
+ });
69
+ assert(data.blocks.length > 0, 'Expected at least one block');
70
+ assert(data.blocks.length <= 5, 'Expected at most 5 blocks');
71
+ for (const block of data.blocks) {
72
+ assert.strictEqual(typeof block.blockHeight, 'number');
73
+ assert.strictEqual(typeof block.creator, 'string');
74
+ assert.strictEqual(typeof block.stateHash, 'string');
75
+ assert.strictEqual(typeof block.dateTime, 'string');
76
+ assert.strictEqual(typeof block.transactions.coinbase, 'string');
77
+ assert(block.transactions.coinbase.length > 0, 'Coinbase should not be empty');
78
+ assert(Array.isArray(block.transactions.userCommands));
79
+ assert(Array.isArray(block.transactions.zkappCommands));
80
+ assert(Array.isArray(block.transactions.feeTransfer));
81
+ }
82
+ });
83
+ it('should sort blocks descending by block height', async () => {
84
+ const data = await client.request(blocksQueryWithFilter, {
85
+ limit: 5,
86
+ sortBy: 'BLOCKHEIGHT_DESC',
87
+ });
88
+ for (let i = 1; i < data.blocks.length; i++) {
89
+ assert(data.blocks[i - 1].blockHeight >= data.blocks[i].blockHeight, `Block at index ${i - 1} (height ${data.blocks[i - 1].blockHeight}) should be >= block at index ${i} (height ${data.blocks[i].blockHeight})`);
90
+ }
91
+ });
92
+ it('should sort blocks ascending by block height', async () => {
93
+ const data = await client.request(blocksQueryWithFilter, {
94
+ limit: 5,
95
+ sortBy: 'BLOCKHEIGHT_ASC',
96
+ });
97
+ for (let i = 1; i < data.blocks.length; i++) {
98
+ assert(data.blocks[i - 1].blockHeight <= data.blocks[i].blockHeight, `Block at index ${i - 1} (height ${data.blocks[i - 1].blockHeight}) should be <= block at index ${i} (height ${data.blocks[i].blockHeight})`);
99
+ }
100
+ });
101
+ it('should filter blocks by height range', async () => {
102
+ const latest = await client.request(blocksQueryWithFilter, { limit: 1, sortBy: 'BLOCKHEIGHT_DESC' });
103
+ const maxHeight = latest.blocks[0].blockHeight;
104
+ const from = maxHeight - 5;
105
+ const to = maxHeight;
106
+ const data = await client.request(blocksQueryWithFilter, {
107
+ query: { blockHeight_gte: from, blockHeight_lt: to },
108
+ limit: 100,
109
+ sortBy: 'BLOCKHEIGHT_ASC',
110
+ });
111
+ for (const block of data.blocks) {
112
+ assert(block.blockHeight >= from && block.blockHeight < to, `Block height ${block.blockHeight} should be in range [${from}, ${to})`);
113
+ }
114
+ });
115
+ });
116
+ //# sourceMappingURL=blocks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.test.js","sourceRoot":"","sources":["../../../tests/live-api/blocks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import { gql } from 'graphql-tag';
2
+ import { GraphQLClient } from 'graphql-request';
3
+ import postgres from 'postgres';
4
+ import { getZkappsWithPendingEventsQuery } from '../../src/db/sql/events-actions/queries.js';
5
+ import { after, before, describe, it } from 'node:test';
6
+ import assert from 'node:assert';
7
+ import { readFileSync } from 'node:fs';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { dirname, join } from 'node:path';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const J1fu_65_66 = JSON.parse(readFileSync(join(__dirname, 'fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_65_66.json'), 'utf-8'));
12
+ const J1fu_84_83 = JSON.parse(readFileSync(join(__dirname, 'fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_84_83.json'), 'utf-8'));
13
+ let db_client;
14
+ let zkappsWithPendingEvents;
15
+ const endpoint = process.env.STAGING_GRAPHQL_ENDPOINT ||
16
+ 'http://archive-node-api.gcp.o1test.net/';
17
+ const client = new GraphQLClient(endpoint);
18
+ const getEventsQuery = gql `
19
+ query getEvents($input: EventFilterOptionsInput!) {
20
+ events(input: $input) {
21
+ blockInfo {
22
+ stateHash
23
+ height
24
+ parentHash
25
+ }
26
+ eventData {
27
+ data
28
+ transactionInfo {
29
+ status
30
+ hash
31
+ memo
32
+ }
33
+ }
34
+ }
35
+ }
36
+ `;
37
+ before(async () => {
38
+ if (process.env.PG_CONN) {
39
+ db_client = postgres(process.env.PG_CONN);
40
+ zkappsWithPendingEvents = (await getZkappsWithPendingEventsQuery(db_client).execute()).map((x) => x.public_key);
41
+ }
42
+ });
43
+ after(async () => {
44
+ if (db_client)
45
+ await db_client.end();
46
+ });
47
+ describe('Events', () => {
48
+ describe.skip('Pending Chain', () => {
49
+ it('Some of the zkapps with pending actions should be returned', async () => {
50
+ const totalEvents = [];
51
+ for (const publicKey of zkappsWithPendingEvents) {
52
+ const input = {
53
+ address: publicKey,
54
+ status: 'PENDING',
55
+ };
56
+ const data = await client.request(getEventsQuery, {
57
+ input,
58
+ });
59
+ totalEvents.concat(data);
60
+ }
61
+ console.log(totalEvents);
62
+ assert(totalEvents.length > 0, 'No events found for zkapps with pending actions');
63
+ });
64
+ });
65
+ describe('Canonical Chain', () => {
66
+ it('Block Filter', async () => {
67
+ const totalEvents = [];
68
+ const input = {
69
+ address: 'B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu',
70
+ from: 433465,
71
+ to: 433466,
72
+ };
73
+ const data = await client.request(getEventsQuery, {
74
+ input,
75
+ });
76
+ totalEvents.concat(data);
77
+ assert.deepStrictEqual(data, J1fu_65_66);
78
+ });
79
+ });
80
+ describe('Canonical Chain', () => {
81
+ it('Block Filter with several blocks', async () => {
82
+ const totalEvents = [];
83
+ const input = {
84
+ address: 'B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu',
85
+ to: 439983,
86
+ from: 429984,
87
+ };
88
+ const data = await client.request(getEventsQuery, {
89
+ input,
90
+ });
91
+ totalEvents.concat(data);
92
+ console.log(totalEvents);
93
+ assert.deepStrictEqual(data, J1fu_84_83);
94
+ });
95
+ });
96
+ });
97
+ //# sourceMappingURL=events.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../../tests/live-api/events.test.ts"],"names":[],"mappings":"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"}