@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.
- package/README.md +321 -0
- package/build/benchmark/setup.js +32 -0
- package/build/benchmark/setup.js.map +1 -0
- package/build/src/blockchain/constants.js +2 -0
- package/build/src/blockchain/constants.js.map +1 -0
- package/build/src/blockchain/types.js +7 -0
- package/build/src/blockchain/types.js.map +1 -0
- package/build/src/blockchain/utils.js +39 -0
- package/build/src/blockchain/utils.js.map +1 -0
- package/build/src/consensus/mina-consensus.js +59 -0
- package/build/src/consensus/mina-consensus.js.map +1 -0
- package/build/src/context.js +10 -0
- package/build/src/context.js.map +1 -0
- package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js +2 -0
- package/build/src/db/archive-node-adapter/archive-node-adapter.interface.js.map +1 -0
- package/build/src/db/archive-node-adapter/archive-node-adapter.js +47 -0
- package/build/src/db/archive-node-adapter/archive-node-adapter.js.map +1 -0
- package/build/src/db/sql/events-actions/queries.js +438 -0
- package/build/src/db/sql/events-actions/queries.js.map +1 -0
- package/build/src/db/sql/events-actions/types.js +2 -0
- package/build/src/db/sql/events-actions/types.js.map +1 -0
- package/build/src/errors/error.js +17 -0
- package/build/src/errors/error.js.map +1 -0
- package/build/src/index.js +27 -0
- package/build/src/index.js.map +1 -0
- package/build/src/resolvers-types.js +8 -0
- package/build/src/resolvers-types.js.map +1 -0
- package/build/src/resolvers.js +67 -0
- package/build/src/resolvers.js.map +1 -0
- package/build/src/server/plugins.js +39 -0
- package/build/src/server/plugins.js.map +1 -0
- package/build/src/server/server.js +25 -0
- package/build/src/server/server.js.map +1 -0
- package/build/src/services/actions-service/actions-service.interface.js +2 -0
- package/build/src/services/actions-service/actions-service.interface.js.map +1 -0
- package/build/src/services/actions-service/actions-service.js +94 -0
- package/build/src/services/actions-service/actions-service.js.map +1 -0
- package/build/src/services/blocks-service/blocks-service.interface.js +2 -0
- package/build/src/services/blocks-service/blocks-service.interface.js.map +1 -0
- package/build/src/services/blocks-service/blocks-service.js +263 -0
- package/build/src/services/blocks-service/blocks-service.js.map +1 -0
- package/build/src/services/data-adapters/database-row-adapters.js +116 -0
- package/build/src/services/data-adapters/database-row-adapters.js.map +1 -0
- package/build/src/services/events-service/events-service.interface.js +2 -0
- package/build/src/services/events-service/events-service.interface.js.map +1 -0
- package/build/src/services/events-service/events-service.js +64 -0
- package/build/src/services/events-service/events-service.js.map +1 -0
- package/build/src/services/network-service/network-service.interface.js +2 -0
- package/build/src/services/network-service/network-service.interface.js.map +1 -0
- package/build/src/services/network-service/network-service.js +31 -0
- package/build/src/services/network-service/network-service.js.map +1 -0
- package/build/src/tracing/jaeger-setup.js +39 -0
- package/build/src/tracing/jaeger-setup.js.map +1 -0
- package/build/src/tracing/jaeger-tracing.js +29 -0
- package/build/src/tracing/jaeger-tracing.js.map +1 -0
- package/build/src/tracing/tracer.js +31 -0
- package/build/src/tracing/tracer.js.map +1 -0
- package/build/tests/__mocks__/generate_mock_data.js +13 -0
- package/build/tests/__mocks__/generate_mock_data.js.map +1 -0
- package/build/tests/consensus/run-compare.js +40 -0
- package/build/tests/consensus/run-compare.js.map +1 -0
- package/build/tests/consensus/select-consensus-precomputed.js +80 -0
- package/build/tests/consensus/select-consensus-precomputed.js.map +1 -0
- package/build/tests/consensus/types.js +15 -0
- package/build/tests/consensus/types.js.map +1 -0
- package/build/tests/devnet-dump/devnet-dump.test.js +311 -0
- package/build/tests/devnet-dump/devnet-dump.test.js.map +1 -0
- package/build/tests/devnet-dump/setup.js +58 -0
- package/build/tests/devnet-dump/setup.js.map +1 -0
- package/build/tests/integration/integration.test.js +226 -0
- package/build/tests/integration/integration.test.js.map +1 -0
- package/build/tests/integration/setup.js +82 -0
- package/build/tests/integration/setup.js.map +1 -0
- package/build/tests/live-api/actions.test.js +4 -0
- package/build/tests/live-api/actions.test.js.map +1 -0
- package/build/tests/live-api/blocks.test.js +116 -0
- package/build/tests/live-api/blocks.test.js.map +1 -0
- package/build/tests/live-api/events.test.js +97 -0
- package/build/tests/live-api/events.test.js.map +1 -0
- package/build/tests/live-api/networkState.test.js +27 -0
- package/build/tests/live-api/networkState.test.js.map +1 -0
- package/build/tests/live-network/live-network.test.js +144 -0
- package/build/tests/live-network/live-network.test.js.map +1 -0
- package/build/tests/live-network/setup.js +206 -0
- package/build/tests/live-network/setup.js.map +1 -0
- package/build/tests/resolvers.test.js +475 -0
- package/build/tests/resolvers.test.js.map +1 -0
- package/build/tests/services/actions-service/actions-service.test.js +124 -0
- package/build/tests/services/actions-service/actions-service.test.js.map +1 -0
- package/build/tests/services/blocks-service/blocks-service.test.js +348 -0
- package/build/tests/services/blocks-service/blocks-service.test.js.map +1 -0
- package/build/tests/services/events-service/events-service.test.js +185 -0
- package/build/tests/services/events-service/events-service.test.js.map +1 -0
- package/build/tests/test-helpers.js +11 -0
- package/build/tests/test-helpers.js.map +1 -0
- package/build/tests/unit/blockchain-utils.test.js +106 -0
- package/build/tests/unit/blockchain-utils.test.js.map +1 -0
- package/build/tests/unit/consensus.test.js +154 -0
- package/build/tests/unit/consensus.test.js.map +1 -0
- package/build/tests/unit/error-handling.test.js +52 -0
- package/build/tests/unit/error-handling.test.js.map +1 -0
- package/build/tests/utils.test.js +313 -0
- package/build/tests/utils.test.js.map +1 -0
- package/build/zkapp/contract.js +144 -0
- package/build/zkapp/contract.js.map +1 -0
- package/build/zkapp/utils.js +174 -0
- package/build/zkapp/utils.js.map +1 -0
- package/package.json +85 -0
- package/schema.graphql +221 -0
- package/src/blockchain/constants.ts +2 -0
- package/src/blockchain/types.ts +121 -0
- package/src/blockchain/utils.ts +54 -0
- package/src/consensus/mina-consensus.ts +137 -0
- package/src/context.ts +18 -0
- package/src/db/archive-node-adapter/archive-node-adapter.interface.ts +23 -0
- package/src/db/archive-node-adapter/archive-node-adapter.ts +101 -0
- package/src/db/sql/events-actions/queries.ts +490 -0
- package/src/db/sql/events-actions/types.ts +208 -0
- package/src/envionment.d.ts +18 -0
- package/src/errors/error.ts +20 -0
- package/src/index.ts +31 -0
- package/src/resolvers-types.ts +754 -0
- package/src/resolvers.ts +102 -0
- package/src/server/plugins.ts +56 -0
- package/src/server/server.ts +30 -0
- package/src/services/actions-service/actions-service.interface.ts +9 -0
- package/src/services/actions-service/actions-service.ts +195 -0
- package/src/services/blocks-service/blocks-service.interface.ts +11 -0
- package/src/services/blocks-service/blocks-service.ts +407 -0
- package/src/services/data-adapters/database-row-adapters.ts +261 -0
- package/src/services/events-service/events-service.interface.ts +6 -0
- package/src/services/events-service/events-service.ts +118 -0
- package/src/services/network-service/network-service.interface.ts +5 -0
- package/src/services/network-service/network-service.ts +53 -0
- package/src/tracing/jaeger-setup.ts +65 -0
- package/src/tracing/jaeger-tracing.ts +44 -0
- package/src/tracing/tracer.ts +52 -0
- package/tsconfig.json +104 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { request } from 'node:http';
|
|
2
|
+
export { validateJaegerConfig, parseEndpoint, checkJaegerEndpointAvailability };
|
|
3
|
+
function validateJaegerConfig(endpoint) {
|
|
4
|
+
if (!endpoint) {
|
|
5
|
+
throw new Error('Jaeger was enabled but no endpoint was specified. Please ensure that the Jaeger endpoint is properly configured and available.');
|
|
6
|
+
}
|
|
7
|
+
if (!process.env.JAEGER_SERVICE_NAME) {
|
|
8
|
+
throw new Error('Jaeger was enabled but no service name was specified. Please ensure that the Jaeger service name is properly configured.');
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function parseEndpoint(endpoint) {
|
|
12
|
+
const strippedEndpoint = endpoint.replace(/(^\w+:|^)\/\//, '');
|
|
13
|
+
const [hostname, portSegment] = strippedEndpoint.split(':');
|
|
14
|
+
const port = portSegment?.split('/')[0];
|
|
15
|
+
return { hostname, port };
|
|
16
|
+
}
|
|
17
|
+
function checkJaegerEndpointAvailability({ hostname, port, }) {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const req = request({
|
|
20
|
+
hostname,
|
|
21
|
+
method: 'GET',
|
|
22
|
+
port,
|
|
23
|
+
path: '/',
|
|
24
|
+
timeout: 2000,
|
|
25
|
+
});
|
|
26
|
+
req.on('error', () => {
|
|
27
|
+
reject(new Error('Jaeger endpoint not available. Please ensure that the Jaeger endpoint is properly configured and available.'));
|
|
28
|
+
});
|
|
29
|
+
req.on('timeout', () => {
|
|
30
|
+
reject(new Error('Jaeger endpoint timed out. Please ensure that the Jaeger endpoint is properly configured and available.'));
|
|
31
|
+
});
|
|
32
|
+
req.on('response', () => {
|
|
33
|
+
resolve();
|
|
34
|
+
req.end();
|
|
35
|
+
});
|
|
36
|
+
req.end();
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=jaeger-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jaeger-setup.js","sourceRoot":"","sources":["../../../src/tracing/jaeger-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,+BAA+B,EAAE,CAAC;AAEhF,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,gIAAgI,CACjI,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,0HAA0H,CAC3H,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,+BAA+B,CAAC,EACvC,QAAQ,EACR,IAAI,GAIL;IACC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,QAAQ;YACR,MAAM,EAAE,KAAK;YACb,IAAI;YACJ,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,MAAM,CACJ,IAAI,KAAK,CACP,6GAA6G,CAC9G,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACrB,MAAM,CACJ,IAAI,KAAK,CACP,yGAAyG,CAC1G,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE;YACtB,OAAO,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { trace } from '@opentelemetry/api';
|
|
2
|
+
import { BatchSpanProcessor, BasicTracerProvider, } from '@opentelemetry/sdk-trace-base';
|
|
3
|
+
import { JaegerExporter } from '@opentelemetry/exporter-jaeger';
|
|
4
|
+
import { validateJaegerConfig, parseEndpoint, checkJaegerEndpointAvailability, } from './jaeger-setup.js';
|
|
5
|
+
export { initJaegerProvider };
|
|
6
|
+
function createJaegerExporter(endpoint) {
|
|
7
|
+
return new JaegerExporter({ endpoint });
|
|
8
|
+
}
|
|
9
|
+
async function initJaegerProvider() {
|
|
10
|
+
const jaegerEndpoint = process.env.JAEGER_ENDPOINT;
|
|
11
|
+
if (!process.env.ENABLE_JAEGER || !jaegerEndpoint) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
validateJaegerConfig(jaegerEndpoint);
|
|
15
|
+
const exporter = createJaegerExporter(jaegerEndpoint);
|
|
16
|
+
const endpointParts = parseEndpoint(jaegerEndpoint);
|
|
17
|
+
await checkJaegerEndpointAvailability(endpointParts);
|
|
18
|
+
return buildProvider(exporter);
|
|
19
|
+
}
|
|
20
|
+
function buildProvider(exporter) {
|
|
21
|
+
const provider = new BasicTracerProvider();
|
|
22
|
+
provider.resource.attributes['service.name'] =
|
|
23
|
+
process.env.JAEGER_SERVICE_NAME ?? 'archive';
|
|
24
|
+
provider.addSpanProcessor(new BatchSpanProcessor(exporter));
|
|
25
|
+
provider.register();
|
|
26
|
+
trace.setGlobalTracerProvider(provider);
|
|
27
|
+
return provider;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=jaeger-tracing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jaeger-tracing.js","sourceRoot":"","sources":["../../../src/tracing/jaeger-tracing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,+BAA+B,GAChC,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,SAAS,oBAAoB,CAAC,QAAgB;IAC5C,OAAO,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IAEpD,MAAM,+BAA+B,CAAC,aAAa,CAAC,CAAC;IACrD,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,QAAsB;IAC3C,MAAM,QAAQ,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,SAAS,CAAC;IAE/C,QAAQ,CAAC,gBAAgB,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACpB,KAAK,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { context, trace } from '@opentelemetry/api';
|
|
2
|
+
export { TracingState, extractTraceStateFromOptions, setSpanNameFromGraphQLContext, };
|
|
3
|
+
class TracingState {
|
|
4
|
+
constructor(parentSpan) {
|
|
5
|
+
this.tracer = getGlobalTracer();
|
|
6
|
+
this.tracingContext = trace.setSpan(context.active(), parentSpan);
|
|
7
|
+
}
|
|
8
|
+
startSpan(name) {
|
|
9
|
+
return this.tracer.startSpan(name, undefined, this.tracingContext);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function getGlobalTracer() {
|
|
13
|
+
return trace.getTracer('graphql');
|
|
14
|
+
}
|
|
15
|
+
function extractTraceStateFromOptions(options) {
|
|
16
|
+
if (options && typeof options === 'object' && 'tracingState' in options) {
|
|
17
|
+
return options.tracingState;
|
|
18
|
+
}
|
|
19
|
+
throw new Error('tracingState not found in options');
|
|
20
|
+
}
|
|
21
|
+
function getCurrentSpanFromGraphQLContext(context) {
|
|
22
|
+
const openTelemetrySymbol = Object.getOwnPropertySymbols(context).find((symbol) => symbol.description === 'OPEN_TELEMETRY_GRAPHQL');
|
|
23
|
+
return openTelemetrySymbol ? context[openTelemetrySymbol] : undefined;
|
|
24
|
+
}
|
|
25
|
+
function setSpanNameFromGraphQLContext(graphQLContext, spanName) {
|
|
26
|
+
const graphQLSpan = getCurrentSpanFromGraphQLContext(graphQLContext) ||
|
|
27
|
+
getGlobalTracer().startSpan(spanName, {}, context.active());
|
|
28
|
+
graphQLSpan.updateName(spanName);
|
|
29
|
+
return graphQLSpan;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../src/tracing/tracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAyB,MAAM,oBAAoB,CAAC;AAI3E,OAAO,EACL,YAAY,EACZ,4BAA4B,EAC5B,6BAA6B,GAC9B,CAAC;AAEF,MAAM,YAAY;IAIhB,YAAY,UAAgB;QAC1B,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACrE,CAAC;CACF;AAED,SAAS,eAAe;IACtB,OAAO,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAgB;IACpD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,cAAc,IAAI,OAAO,EAAE,CAAC;QACxE,OAAO,OAAO,CAAC,YAA4B,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gCAAgC,CAAC,OAAuB;IAC/D,MAAM,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,IAAI,CACpE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,wBAAwB,CAC5D,CAAC;IACF,OAAO,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAED,SAAS,6BAA6B,CACpC,cAA8B,EAC9B,QAAgB;IAEhB,MAAM,WAAW,GACf,gCAAgC,CAAC,cAAc,CAAC;QAChD,eAAe,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import postgres from 'postgres';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { getEventsQuery, getActionsQuery, } from '../../src/db/sql/events-actions/queries.js';
|
|
4
|
+
import { BlockStatusFilter } from '../../src/blockchain/types.js';
|
|
5
|
+
(async function main() {
|
|
6
|
+
const sql = postgres('postgres://postgres:password@localhost:5432/archive');
|
|
7
|
+
const eventsQuery = await getEventsQuery(sql, 'B62qpS7LDaLc7ZYSbKXDDWJQ4mFbHYQwsivyKyRtjz8e1BjmAjJBJMe', 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf', BlockStatusFilter.all);
|
|
8
|
+
const actionsQuery = await getActionsQuery(sql, 'B62qpS7LDaLc7ZYSbKXDDWJQ4mFbHYQwsivyKyRtjz8e1BjmAjJBJMe', 'wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf', BlockStatusFilter.all);
|
|
9
|
+
fs.writeFileSync('./tests/mocked_sql/database_mock_events.json', JSON.stringify(eventsQuery, null, 2));
|
|
10
|
+
fs.writeFileSync('./tests/mocked_sql/database_mock_actions.json', JSON.stringify(actionsQuery, null, 2));
|
|
11
|
+
process.exit(0);
|
|
12
|
+
})();
|
|
13
|
+
//# sourceMappingURL=generate_mock_data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate_mock_data.js","sourceRoot":"","sources":["../../../tests/__mocks__/generate_mock_data.ts"],"names":[],"mappings":"AAKA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EACL,cAAc,EACd,eAAe,GAChB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,CAAC,KAAK,UAAU,IAAI;IAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,qDAAqD,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,MAAM,cAAc,CACtC,GAAG,EACH,yDAAyD,EACzD,oDAAoD,EACpD,iBAAiB,CAAC,GAAG,CACtB,CAAC;IACF,MAAM,YAAY,GAAG,MAAM,eAAe,CACxC,GAAG,EACH,yDAAyD,EACzD,oDAAoD,EACpD,iBAAiB,CAAC,GAAG,CACtB,CAAC;IACF,EAAE,CAAC,aAAa,CACd,8CAA8C,EAC9C,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CACrC,CAAC;IACF,EAAE,CAAC,aAAa,CACd,+CAA+C,EAC/C,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CACtC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import pwd from 'process';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
const TYPESCRIPT_OUTPUT_DIR_NAME = process.env.TYPESCRIPT_OUTPUT_DIR_NAME || 'precomputed_ts';
|
|
5
|
+
const OCAML_OUTPUT_DIR_NAME = process.env.OCAML_OUTPUT_DIR_NAME || 'precomputed_ocaml';
|
|
6
|
+
const TYPESCRIPT_DIR = path.join(pwd.cwd(), TYPESCRIPT_OUTPUT_DIR_NAME);
|
|
7
|
+
const OCAML_DIR = path.join(pwd.cwd(), OCAML_OUTPUT_DIR_NAME);
|
|
8
|
+
async function compareFiles() {
|
|
9
|
+
const typescriptFiles = await fs.readdir(TYPESCRIPT_DIR);
|
|
10
|
+
const ocamlFiles = await fs.readdir(OCAML_DIR);
|
|
11
|
+
if (typescriptFiles.length !== ocamlFiles.length) {
|
|
12
|
+
console.error('Directories do not contain the same number of files!');
|
|
13
|
+
console.error(`TypeScript: ${typescriptFiles.length}`);
|
|
14
|
+
console.error(`OCaml: ${ocamlFiles.length}`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
for (let i = 0; i < typescriptFiles.length; i++) {
|
|
18
|
+
const tsFile = typescriptFiles[i];
|
|
19
|
+
const ocamlFile = ocamlFiles[i];
|
|
20
|
+
if (tsFile !== ocamlFile) {
|
|
21
|
+
console.error(`File names do not match! (${tsFile} vs ${ocamlFile})`);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const tsContent = await fs.readFile(path.join(TYPESCRIPT_DIR, tsFile), 'utf-8');
|
|
25
|
+
const ocamlContent = await fs.readFile(path.join(OCAML_DIR, ocamlFile), 'utf-8');
|
|
26
|
+
const tsContentJson = JSON.parse(tsContent);
|
|
27
|
+
const ocamlContentJson = JSON.parse(ocamlContent);
|
|
28
|
+
if (tsContentJson['height'] !== ocamlContentJson['height'] ||
|
|
29
|
+
tsContentJson['previous_state_hash'] !==
|
|
30
|
+
ocamlContentJson['previous_state_hash']) {
|
|
31
|
+
console.error(`File contents do not match! (${tsFile}), (${ocamlFile}})`);
|
|
32
|
+
console.error(`TypeScript: ${JSON.stringify(tsContentJson)}`);
|
|
33
|
+
console.error(`OCaml: ${JSON.stringify(ocamlContentJson)}`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
console.log('🎉 All files match!');
|
|
38
|
+
}
|
|
39
|
+
compareFiles();
|
|
40
|
+
//# sourceMappingURL=run-compare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-compare.js","sourceRoot":"","sources":["../../../tests/consensus/run-compare.ts"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,SAAS,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAE7B,MAAM,0BAA0B,GAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,gBAAgB,CAAC;AAC7D,MAAM,qBAAqB,GACzB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,mBAAmB,CAAC;AAE3D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;AACxE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAE9D,KAAK,UAAU,YAAY;IACzB,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAG/C,IAAI,eAAe,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,eAAe,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,KAAK,CAAC,UAAU,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAGD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAGhC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,OAAO,SAAS,GAAG,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EACjC,OAAO,CACR,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CACpC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAC/B,OAAO,CACR,CAAC;QAEF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAGlD,IACE,aAAa,CAAC,QAAQ,CAAC,KAAK,gBAAgB,CAAC,QAAQ,CAAC;YACtD,aAAa,CAAC,qBAAqB,CAAC;gBAClC,gBAAgB,CAAC,qBAAqB,CAAC,EACzC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,gCAAgC,MAAM,OAAO,SAAS,IAAI,CAAC,CAAC;YAC1E,OAAO,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC;AAED,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { select } from '../../src/consensus/mina-consensus.js';
|
|
4
|
+
import { GetSlot, } from './types.js';
|
|
5
|
+
const outputDir = process.env.OUTPUT_DIR || 'precomputed_ts';
|
|
6
|
+
function readPrecomputedBlocks() {
|
|
7
|
+
const directoryPath = path.join(process.cwd(), 'precomputed_berkeley');
|
|
8
|
+
const files = fs.readdirSync(directoryPath);
|
|
9
|
+
const blocks = [];
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
const data = fs.readFileSync(path.join(directoryPath, file));
|
|
12
|
+
const block = mapPrecomputedToBlockInfo(data.toString());
|
|
13
|
+
blocks.push(block);
|
|
14
|
+
}
|
|
15
|
+
blocks.sort((a, b) => {
|
|
16
|
+
if (a.height < b.height)
|
|
17
|
+
return -1;
|
|
18
|
+
if (a.height > b.height)
|
|
19
|
+
return 1;
|
|
20
|
+
if (a.timestamp < b.timestamp)
|
|
21
|
+
return -1;
|
|
22
|
+
if (a.timestamp > b.timestamp)
|
|
23
|
+
return 1;
|
|
24
|
+
return 0;
|
|
25
|
+
});
|
|
26
|
+
return blocks;
|
|
27
|
+
}
|
|
28
|
+
function mapPrecomputedToBlockInfo(block) {
|
|
29
|
+
const json = JSON.parse(block);
|
|
30
|
+
return {
|
|
31
|
+
height: parseInt(json.data.protocol_state.body.consensus_state.blockchain_length),
|
|
32
|
+
parentHash: json.data.protocol_state.previous_state_hash,
|
|
33
|
+
ledgerHash: json.data.protocol_state.body.blockchain_state.staged_ledger_hash
|
|
34
|
+
.non_snark.ledger_hash,
|
|
35
|
+
chainStatus: '',
|
|
36
|
+
timestamp: json.data.protocol_state.body.constants.genesis_state_timestamp,
|
|
37
|
+
globalSlotSinceHardfork: GetSlot(json.data.protocol_state.body.consensus_state.curr_global_slot.slot_number),
|
|
38
|
+
globalSlotSinceGenesis: GetSlot(json.data.protocol_state.body.consensus_state.global_slot_since_genesis),
|
|
39
|
+
lastVrfOutput: json.data.protocol_state.body.consensus_state.last_vrf_output,
|
|
40
|
+
stateHash: '',
|
|
41
|
+
distanceFromMaxBlockHeight: 0,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function runSelect(candidate, currentChain) {
|
|
45
|
+
const existing = currentChain[currentChain.length - 1];
|
|
46
|
+
const newBlock = select({ blockInfo: existing }, { blockInfo: candidate });
|
|
47
|
+
if (newBlock.blockInfo.height > existing.height) {
|
|
48
|
+
currentChain.push(newBlock.blockInfo);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (newBlock.blockInfo.height === existing.height) {
|
|
52
|
+
currentChain[currentChain.length - 1] = newBlock.blockInfo;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function writeBlocksOutput(blocks) {
|
|
57
|
+
if (!fs.existsSync(outputDir)) {
|
|
58
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
61
|
+
const block = blocks[i];
|
|
62
|
+
const json = {
|
|
63
|
+
height: block.height,
|
|
64
|
+
previous_state_hash: block.parentHash,
|
|
65
|
+
};
|
|
66
|
+
fs.writeFileSync(path.join(process.cwd(), outputDir, `block_${i}.json`), JSON.stringify(json));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function main() {
|
|
70
|
+
const precomputed_blocks = readPrecomputedBlocks();
|
|
71
|
+
const [firstBlock, ...restOfPrecomputedBlocks] = precomputed_blocks;
|
|
72
|
+
const currentChain = [];
|
|
73
|
+
currentChain.push(firstBlock);
|
|
74
|
+
for (const precomputed_block of restOfPrecomputedBlocks) {
|
|
75
|
+
runSelect(precomputed_block, currentChain);
|
|
76
|
+
}
|
|
77
|
+
writeBlocksOutput(currentChain);
|
|
78
|
+
}
|
|
79
|
+
main();
|
|
80
|
+
//# sourceMappingURL=select-consensus-precomputed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-consensus-precomputed.js","sourceRoot":"","sources":["../../../tests/consensus/select-consensus-precomputed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export var Permission;
|
|
2
|
+
(function (Permission) {
|
|
3
|
+
Permission["None"] = "None";
|
|
4
|
+
Permission["Signature"] = "Signature";
|
|
5
|
+
})(Permission || (Permission = {}));
|
|
6
|
+
export function GetSlot(slot) {
|
|
7
|
+
for (let i = 0; i < slot.length; i++) {
|
|
8
|
+
const slotElement = parseInt(slot[i]);
|
|
9
|
+
if (!isNaN(slotElement)) {
|
|
10
|
+
return slotElement;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
throw new Error('Invalid slot');
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../tests/consensus/types.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAN,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,qCAAuB,CAAA;AACzB,CAAC,EAHW,UAAU,KAAV,UAAU,QAGrB;AAsGD,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACxB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { describe, test, before, after } from 'node:test';
|
|
2
|
+
import assert from 'node:assert';
|
|
3
|
+
import { BlocksService } from '../../src/services/blocks-service/blocks-service.js';
|
|
4
|
+
import { NetworkService } from '../../src/services/network-service/network-service.js';
|
|
5
|
+
import { EventsService } from '../../src/services/events-service/events-service.js';
|
|
6
|
+
import { ActionsService } from '../../src/services/actions-service/actions-service.js';
|
|
7
|
+
import { TracingState } from '../../src/tracing/tracer.js';
|
|
8
|
+
import { setupTestDatabase, teardownTestDatabase, createTestClient, } from './setup.js';
|
|
9
|
+
const nullOptions = { tracingState: new TracingState(undefined) };
|
|
10
|
+
let client;
|
|
11
|
+
let blocksService;
|
|
12
|
+
let networkService;
|
|
13
|
+
let eventsService;
|
|
14
|
+
let actionsService;
|
|
15
|
+
let maxCanonicalHeight;
|
|
16
|
+
let minHeight;
|
|
17
|
+
before(async () => {
|
|
18
|
+
await setupTestDatabase();
|
|
19
|
+
client = createTestClient();
|
|
20
|
+
blocksService = new BlocksService(client);
|
|
21
|
+
networkService = new NetworkService(client);
|
|
22
|
+
eventsService = new EventsService(client);
|
|
23
|
+
actionsService = new ActionsService(client);
|
|
24
|
+
const state = await networkService.getNetworkState(nullOptions);
|
|
25
|
+
maxCanonicalHeight = state.maxBlockHeight.canonicalMaxBlockHeight;
|
|
26
|
+
const minRow = await client `SELECT MIN(height) as min_height FROM blocks WHERE chain_status = 'canonical'`;
|
|
27
|
+
minHeight = Number(minRow[0].min_height);
|
|
28
|
+
console.log(`Devnet chain: canonical heights ${minHeight} to ${maxCanonicalHeight}`);
|
|
29
|
+
}, { timeout: 900000 });
|
|
30
|
+
after(async () => {
|
|
31
|
+
if (client)
|
|
32
|
+
await client.end();
|
|
33
|
+
await teardownTestDatabase();
|
|
34
|
+
});
|
|
35
|
+
describe('NetworkState (devnet dump)', () => {
|
|
36
|
+
test('returns valid max block heights', async () => {
|
|
37
|
+
const state = await networkService.getNetworkState(nullOptions);
|
|
38
|
+
assert.ok(state.maxBlockHeight, 'should have maxBlockHeight');
|
|
39
|
+
assert.ok(state.maxBlockHeight.canonicalMaxBlockHeight > 0, `canonical max height should be positive, got ${state.maxBlockHeight.canonicalMaxBlockHeight}`);
|
|
40
|
+
assert.ok(state.maxBlockHeight.canonicalMaxBlockHeight > 1000, `devnet should have >1000 blocks, got ${state.maxBlockHeight.canonicalMaxBlockHeight}`);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe('Oldest blocks (devnet dump)', () => {
|
|
44
|
+
test('can query the very first blocks', async () => {
|
|
45
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: minHeight, blockHeight_lt: minHeight + 5, canonical: true }, null, 'BLOCKHEIGHT_ASC', nullOptions);
|
|
46
|
+
assert.ok(blocks.length > 0, `should return blocks near genesis (height ${minHeight})`);
|
|
47
|
+
for (const block of blocks) {
|
|
48
|
+
assert.ok(block.stateHash, 'stateHash should be present');
|
|
49
|
+
assert.ok(block.creator.startsWith('B62q'), `creator should be a B62 key, got ${block.creator}`);
|
|
50
|
+
assert.ok(block.dateTime, 'dateTime should be present');
|
|
51
|
+
const date = new Date(block.dateTime);
|
|
52
|
+
assert.ok(!isNaN(date.getTime()), `dateTime should be valid ISO, got ${block.dateTime}`);
|
|
53
|
+
assert.ok(block.transactions, 'transactions should be present');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
test('first block has valid timestamp', async () => {
|
|
57
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: minHeight, blockHeight_lt: minHeight + 1, canonical: true }, 1, null, nullOptions);
|
|
58
|
+
assert.strictEqual(blocks.length, 1);
|
|
59
|
+
const date = new Date(blocks[0].dateTime);
|
|
60
|
+
assert.ok(date.getFullYear() >= 2023, `genesis date should be >= 2023, got ${date}`);
|
|
61
|
+
});
|
|
62
|
+
test('block details for very old block (height ~10)', async () => {
|
|
63
|
+
const targetHeight = minHeight + 10;
|
|
64
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: targetHeight, blockHeight_lt: targetHeight + 1, canonical: true }, 1, null, nullOptions);
|
|
65
|
+
assert.strictEqual(blocks.length, 1, `should find exactly one canonical block at height ${targetHeight}`);
|
|
66
|
+
const block = blocks[0];
|
|
67
|
+
assert.strictEqual(Number(block.blockHeight), targetHeight);
|
|
68
|
+
assert.ok(block.stateHash.length > 10, 'stateHash should be a real hash');
|
|
69
|
+
assert.ok(block.creator.startsWith('B62q'), 'creator should be valid');
|
|
70
|
+
assert.ok(block.transactions, 'transactions object should exist');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('Newest blocks (devnet dump)', () => {
|
|
74
|
+
test('can query the most recent canonical blocks', async () => {
|
|
75
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: maxCanonicalHeight - 5, canonical: true }, null, 'BLOCKHEIGHT_DESC', nullOptions);
|
|
76
|
+
assert.ok(blocks.length > 0, 'should return recent blocks');
|
|
77
|
+
assert.strictEqual(Number(blocks[0].blockHeight), maxCanonicalHeight, 'first result in DESC should be the max height');
|
|
78
|
+
});
|
|
79
|
+
test('newest block has recent timestamp', async () => {
|
|
80
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: maxCanonicalHeight, canonical: true }, 1, null, nullOptions);
|
|
81
|
+
assert.strictEqual(blocks.length, 1);
|
|
82
|
+
const date = new Date(blocks[0].dateTime);
|
|
83
|
+
const now = new Date();
|
|
84
|
+
const daysDiff = (now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24);
|
|
85
|
+
assert.ok(daysDiff < 5, `newest block should be recent, but is ${daysDiff.toFixed(1)} days old`);
|
|
86
|
+
});
|
|
87
|
+
test('newest block details are complete', async () => {
|
|
88
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: maxCanonicalHeight, blockHeight_lt: maxCanonicalHeight + 1, canonical: true }, 1, null, nullOptions);
|
|
89
|
+
assert.strictEqual(blocks.length, 1);
|
|
90
|
+
const block = blocks[0];
|
|
91
|
+
assert.ok(block.stateHash, 'stateHash present');
|
|
92
|
+
assert.ok(block.creator.startsWith('B62q'), 'creator valid');
|
|
93
|
+
assert.ok(block.dateTime, 'dateTime present');
|
|
94
|
+
assert.ok(block.transactions, 'transactions present');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('Block details across height ranges (devnet dump)', () => {
|
|
98
|
+
test('query blocks at 10% height mark', async () => {
|
|
99
|
+
const targetHeight = Math.floor(maxCanonicalHeight * 0.1);
|
|
100
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: targetHeight, blockHeight_lt: targetHeight + 3, canonical: true }, null, null, nullOptions);
|
|
101
|
+
assert.ok(blocks.length > 0, `should have blocks around height ${targetHeight}`);
|
|
102
|
+
for (const block of blocks) {
|
|
103
|
+
assert.ok(block.stateHash, 'stateHash should be present');
|
|
104
|
+
assert.ok(block.creator, 'creator should be present');
|
|
105
|
+
assert.ok(block.dateTime, 'dateTime should be present');
|
|
106
|
+
assert.ok(block.transactions, 'transactions should be present');
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
test('query blocks at 50% height mark', async () => {
|
|
110
|
+
const targetHeight = Math.floor(maxCanonicalHeight * 0.5);
|
|
111
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: targetHeight, blockHeight_lt: targetHeight + 3, canonical: true }, null, null, nullOptions);
|
|
112
|
+
assert.ok(blocks.length > 0, `should have blocks around height ${targetHeight}`);
|
|
113
|
+
for (const block of blocks) {
|
|
114
|
+
assert.ok(block.stateHash, 'stateHash should be present');
|
|
115
|
+
assert.ok(block.creator, 'creator should be present');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
test('large range query returns blocks with limit', async () => {
|
|
119
|
+
const blocks = await blocksService.getBlocks({ canonical: true }, 50, 'BLOCKHEIGHT_DESC', nullOptions);
|
|
120
|
+
assert.strictEqual(blocks.length, 50, 'should respect limit=50');
|
|
121
|
+
for (let i = 1; i < blocks.length; i++) {
|
|
122
|
+
assert.ok(Number(blocks[i].blockHeight) <= Number(blocks[i - 1].blockHeight), 'blocks should be in descending height order');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
test('ASC ordering works across full chain', async () => {
|
|
126
|
+
const blocks = await blocksService.getBlocks({ canonical: true }, 50, 'BLOCKHEIGHT_ASC', nullOptions);
|
|
127
|
+
assert.strictEqual(blocks.length, 50);
|
|
128
|
+
for (let i = 1; i < blocks.length; i++) {
|
|
129
|
+
assert.ok(Number(blocks[i].blockHeight) >= Number(blocks[i - 1].blockHeight), 'blocks should be in ascending height order');
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
test('dateTime filtering works on real data', async () => {
|
|
133
|
+
const midHeight = Math.floor(maxCanonicalHeight * 0.5);
|
|
134
|
+
const midBlocks = await blocksService.getBlocks({ blockHeight_gte: midHeight, blockHeight_lt: midHeight + 1, canonical: true }, 1, null, nullOptions);
|
|
135
|
+
assert.ok(midBlocks.length === 1, 'should find the mid-chain block');
|
|
136
|
+
const midTime = new Date(midBlocks[0].dateTime);
|
|
137
|
+
const windowStart = new Date(midTime.getTime() - 3600000);
|
|
138
|
+
const windowEnd = new Date(midTime.getTime() + 3600000);
|
|
139
|
+
const blocks = await blocksService.getBlocks({
|
|
140
|
+
dateTime_gte: windowStart.toISOString(),
|
|
141
|
+
dateTime_lt: windowEnd.toISOString(),
|
|
142
|
+
canonical: true,
|
|
143
|
+
}, null, null, nullOptions);
|
|
144
|
+
assert.ok(blocks.length > 0, 'should find blocks in the time window');
|
|
145
|
+
for (const block of blocks) {
|
|
146
|
+
const blockTime = new Date(block.dateTime);
|
|
147
|
+
assert.ok(blockTime >= windowStart && blockTime < windowEnd, `block time ${block.dateTime} should be within window`);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
test('coinbase is present on canonical blocks', async () => {
|
|
151
|
+
const blocks = await blocksService.getBlocks({ canonical: true, blockHeight_gte: 100, blockHeight_lt: 120 }, null, null, nullOptions);
|
|
152
|
+
assert.ok(blocks.length > 0, 'should have blocks in range 100-120');
|
|
153
|
+
const withCoinbase = blocks.filter(b => b.transactions.coinbase !== '0');
|
|
154
|
+
assert.ok(withCoinbase.length > 0, 'at least some blocks in range should have a coinbase reward');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
const RANDOM_BLOCK_COUNT = 20;
|
|
158
|
+
const RANDOM_RANGE_COUNT = 10;
|
|
159
|
+
function randomInt(min, max) {
|
|
160
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
161
|
+
}
|
|
162
|
+
describe(`Quickcheck: ${RANDOM_BLOCK_COUNT} random individual blocks (devnet dump)`, () => {
|
|
163
|
+
let randomHeights;
|
|
164
|
+
before(() => {
|
|
165
|
+
randomHeights = Array.from({ length: RANDOM_BLOCK_COUNT }, () => randomInt(minHeight, maxCanonicalHeight));
|
|
166
|
+
console.log(` Sampled heights: ${randomHeights.join(', ')}`);
|
|
167
|
+
});
|
|
168
|
+
test('every sampled block returns valid data', async () => {
|
|
169
|
+
for (const height of randomHeights) {
|
|
170
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: height, blockHeight_lt: height + 1, canonical: true }, 1, null, nullOptions);
|
|
171
|
+
assert.ok(blocks.length <= 1, `height ${height}: expected 0 or 1 block, got ${blocks.length}`);
|
|
172
|
+
if (blocks.length === 0)
|
|
173
|
+
continue;
|
|
174
|
+
const block = blocks[0];
|
|
175
|
+
assert.strictEqual(Number(block.blockHeight), height, `height mismatch at ${height}`);
|
|
176
|
+
assert.ok(block.stateHash?.length > 10, `height ${height}: stateHash too short`);
|
|
177
|
+
assert.ok(block.creator?.startsWith('B62q'), `height ${height}: creator should be B62, got ${block.creator}`);
|
|
178
|
+
const date = new Date(block.dateTime);
|
|
179
|
+
assert.ok(!isNaN(date.getTime()), `height ${height}: invalid dateTime ${block.dateTime}`);
|
|
180
|
+
assert.ok(date.getFullYear() >= 2023, `height ${height}: dateTime year should be >= 2023, got ${date.getFullYear()}`);
|
|
181
|
+
assert.ok(block.transactions, `height ${height}: transactions missing`);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe(`Quickcheck: ${RANDOM_RANGE_COUNT} random block ranges (devnet dump)`, () => {
|
|
186
|
+
let ranges;
|
|
187
|
+
before(() => {
|
|
188
|
+
ranges = Array.from({ length: RANDOM_RANGE_COUNT }, () => {
|
|
189
|
+
const from = randomInt(minHeight, maxCanonicalHeight - 10);
|
|
190
|
+
const span = randomInt(2, 20);
|
|
191
|
+
return { from, to: Math.min(from + span, maxCanonicalHeight + 1) };
|
|
192
|
+
});
|
|
193
|
+
console.log(` Sampled ranges: ${ranges.map(r => `[${r.from},${r.to})`).join(', ')}`);
|
|
194
|
+
});
|
|
195
|
+
test('every range query returns consistent results', async () => {
|
|
196
|
+
for (const { from, to } of ranges) {
|
|
197
|
+
const blocks = await blocksService.getBlocks({ blockHeight_gte: from, blockHeight_lt: to, canonical: true }, null, 'BLOCKHEIGHT_ASC', nullOptions);
|
|
198
|
+
for (const block of blocks) {
|
|
199
|
+
const h = Number(block.blockHeight);
|
|
200
|
+
assert.ok(h >= from && h < to, `range [${from},${to}): block height ${h} out of bounds`);
|
|
201
|
+
assert.ok(block.stateHash, `range [${from},${to}) h=${h}: missing stateHash`);
|
|
202
|
+
assert.ok(block.creator, `range [${from},${to}) h=${h}: missing creator`);
|
|
203
|
+
assert.ok(block.dateTime, `range [${from},${to}) h=${h}: missing dateTime`);
|
|
204
|
+
}
|
|
205
|
+
for (let i = 1; i < blocks.length; i++) {
|
|
206
|
+
assert.ok(Number(blocks[i].blockHeight) >= Number(blocks[i - 1].blockHeight), `range [${from},${to}): not in ASC order`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
test('DESC ordering matches ASC for same random range', async () => {
|
|
211
|
+
const { from, to } = ranges[0];
|
|
212
|
+
const asc = await blocksService.getBlocks({ blockHeight_gte: from, blockHeight_lt: to, canonical: true }, null, 'BLOCKHEIGHT_ASC', nullOptions);
|
|
213
|
+
const desc = await blocksService.getBlocks({ blockHeight_gte: from, blockHeight_lt: to, canonical: true }, null, 'BLOCKHEIGHT_DESC', nullOptions);
|
|
214
|
+
assert.strictEqual(asc.length, desc.length, 'ASC and DESC should return same count');
|
|
215
|
+
const ascHashes = asc.map(b => b.stateHash);
|
|
216
|
+
const descHashes = desc.map(b => b.stateHash).reverse();
|
|
217
|
+
assert.deepStrictEqual(ascHashes, descHashes, 'reversed DESC should equal ASC');
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe('Quickcheck: random zkApp addresses (devnet dump)', () => {
|
|
221
|
+
test('events and actions queries succeed for random zkApp addresses', async () => {
|
|
222
|
+
const rows = await client `
|
|
223
|
+
SELECT DISTINCT pk.value as address
|
|
224
|
+
FROM account_identifiers ai
|
|
225
|
+
JOIN public_keys pk ON ai.public_key_id = pk.id
|
|
226
|
+
JOIN zkapp_accounts za ON ai.id = za.account_identifier_id
|
|
227
|
+
ORDER BY random()
|
|
228
|
+
LIMIT 10
|
|
229
|
+
`;
|
|
230
|
+
if (rows.length === 0) {
|
|
231
|
+
console.log(' No zkApp accounts in dump, skipping');
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
console.log(` Testing ${rows.length} random zkApp addresses`);
|
|
235
|
+
for (const row of rows) {
|
|
236
|
+
const address = row.address;
|
|
237
|
+
const events = await eventsService.getEvents({ address }, nullOptions);
|
|
238
|
+
assert.ok(Array.isArray(events), `events for ${address.slice(0, 15)}... should be array`);
|
|
239
|
+
const actions = await actionsService.getActions({ address }, nullOptions);
|
|
240
|
+
assert.ok(Array.isArray(actions), `actions for ${address.slice(0, 15)}... should be array`);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe('Events and Actions (devnet dump)', () => {
|
|
245
|
+
test('events query works with real addresses from the chain', async () => {
|
|
246
|
+
const rows = await client `
|
|
247
|
+
SELECT pk.value as address
|
|
248
|
+
FROM account_identifiers ai
|
|
249
|
+
JOIN public_keys pk ON ai.public_key_id = pk.id
|
|
250
|
+
JOIN zkapp_accounts za ON ai.id = za.account_identifier_id
|
|
251
|
+
LIMIT 1
|
|
252
|
+
`;
|
|
253
|
+
if (rows.length === 0) {
|
|
254
|
+
console.log(' No zkApp accounts in dump, skipping events test');
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
const address = rows[0].address;
|
|
258
|
+
console.log(` Testing events for zkApp: ${address.slice(0, 20)}...`);
|
|
259
|
+
const events = await eventsService.getEvents({ address }, nullOptions);
|
|
260
|
+
assert.ok(Array.isArray(events), 'events should be an array');
|
|
261
|
+
});
|
|
262
|
+
test('actions query works with real addresses from the chain', async () => {
|
|
263
|
+
const rows = await client `
|
|
264
|
+
SELECT pk.value as address
|
|
265
|
+
FROM account_identifiers ai
|
|
266
|
+
JOIN public_keys pk ON ai.public_key_id = pk.id
|
|
267
|
+
JOIN zkapp_accounts za ON ai.id = za.account_identifier_id
|
|
268
|
+
LIMIT 1
|
|
269
|
+
`;
|
|
270
|
+
if (rows.length === 0) {
|
|
271
|
+
console.log(' No zkApp accounts in dump, skipping actions test');
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const address = rows[0].address;
|
|
275
|
+
console.log(` Testing actions for zkApp: ${address.slice(0, 20)}...`);
|
|
276
|
+
const actions = await actionsService.getActions({ address }, nullOptions);
|
|
277
|
+
assert.ok(Array.isArray(actions), 'actions should be an array');
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
describe('Schema validation (devnet dump)', () => {
|
|
281
|
+
test('all required tables exist in devnet dump', async () => {
|
|
282
|
+
const tables = await client `
|
|
283
|
+
SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'
|
|
284
|
+
`;
|
|
285
|
+
const tableNames = tables.map((t) => t.tablename);
|
|
286
|
+
const required = [
|
|
287
|
+
'blocks',
|
|
288
|
+
'account_identifiers',
|
|
289
|
+
'accounts_accessed',
|
|
290
|
+
'blocks_zkapp_commands',
|
|
291
|
+
'zkapp_commands',
|
|
292
|
+
'zkapp_account_update',
|
|
293
|
+
'zkapp_account_update_body',
|
|
294
|
+
'zkapp_events',
|
|
295
|
+
'zkapp_field_array',
|
|
296
|
+
'zkapp_field',
|
|
297
|
+
'zkapp_accounts',
|
|
298
|
+
'zkapp_action_states',
|
|
299
|
+
];
|
|
300
|
+
for (const table of required) {
|
|
301
|
+
assert.ok(tableNames.includes(table), `table ${table} should exist`);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
test('blocks table has substantial data', async () => {
|
|
305
|
+
const countResult = await client `SELECT COUNT(*) as cnt FROM blocks`;
|
|
306
|
+
const count = Number(countResult[0].cnt);
|
|
307
|
+
assert.ok(count > 1000, `devnet should have >1000 blocks, got ${count}`);
|
|
308
|
+
console.log(` Total blocks in dump: ${count}`);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
//# sourceMappingURL=devnet-dump.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devnet-dump.test.js","sourceRoot":"","sources":["../../../tests/devnet-dump/devnet-dump.test.ts"],"names":[],"mappings":"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"}
|