diff --git a/.env.example.compose b/.env.example.compose index 27b87b2..7ed39de 100644 --- a/.env.example.compose +++ b/.env.example.compose @@ -20,6 +20,7 @@ PGURI=postgres://postgres:5432/archive PG_CONN=postgres://${PGUSER}:${PGPASSWORD}@postgres:5432/${PGDATABASE} PG_DUMP="archive.sql" PGDATA=/var/lib/postgresql/data +PGPORT=5432 # Local port for postgres - it will always be 5432 inside the container # Fields for Jaeger (Required) JAEGER=jaegertracing/all-in-one:latest diff --git a/docker-compose.yml b/docker-compose.yml index 19a4c74..239e613 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,7 +41,7 @@ services: image: ${POSTGRES} container_name: postgres ports: - - '5432:5432' + - '${PGPORT}:5432' env_file: - ./.env environment: @@ -49,6 +49,7 @@ services: POSTGRES_PASSWORD: ${PGPASSWORD} POSTGRES_DB: ${PGDATABASE} PGDATA: ${PGDATA} + PGPORT: 5432 volumes: - './data/${PG_DUMP}:/data/${PG_DUMP}' - './scripts/init_docker_compose.sh:/docker-entrypoint-initdb.d/init.sh' diff --git a/src/db/sql/events-actions/queries.ts b/src/db/sql/events-actions/queries.ts index 5a932ab..35de3ad 100644 --- a/src/db/sql/events-actions/queries.ts +++ b/src/db/sql/events-actions/queries.ts @@ -440,3 +440,51 @@ export const USED_TABLES = [ 'zkapp_accounts', 'zkapp_action_states', ] as const; + +export function getZkappsWithPendingEventsQuery(db_client: postgres.Sql) { + return db_client` + WITH RECURSIVE pending_chain(id, parent_id, chain_status) AS ( + -- start at the tip + SELECT id, parent_id, chain_status + FROM blocks + WHERE height = (SELECT MAX(height) FROM blocks) + + UNION ALL + + -- walk back until we re-join the canonical branch + SELECT b.id, b.parent_id, b.chain_status + FROM blocks b + JOIN pending_chain pc + ON b.id = pc.parent_id + WHERE pc.id <> pc.parent_id + AND pc.chain_status <> 'canonical' +) +SELECT DISTINCT + pk.value AS public_key +FROM + pending_chain pc + + -- only commands in this block that didn’t fail + JOIN blocks_zkapp_commands bzc + ON bzc.block_id = pc.id + AND bzc.status <> 'failed' + + -- get the command, then unwind its array of account-update IDs + JOIN zkapp_commands zkc + ON zkc.id = bzc.zkapp_command_id + JOIN LATERAL UNNEST(zkc.zkapp_account_updates_ids) AS upd(id) ON TRUE + + -- pick up the body, but only if it actually emitted events + JOIN zkapp_account_update au + ON au.id = upd.id + JOIN zkapp_account_update_body aub + ON aub.id = au.body_id + AND aub.events_id IS NOT NULL + + -- map back to the account’s public key + JOIN account_identifiers ai + ON ai.id = aub.account_identifier_id + JOIN public_keys pk + ON pk.id = ai.public_key_id; + `; +} diff --git a/tests/live-api/actions.test.ts b/tests/live-api/actions.test.ts new file mode 100644 index 0000000..42641ba --- /dev/null +++ b/tests/live-api/actions.test.ts @@ -0,0 +1,4 @@ +import { describe } from 'node:test'; +describe('Actions', () => { + // TODO: Find mainnet ZkApps with actions +}); diff --git a/tests/live-api/events.test.ts b/tests/live-api/events.test.ts new file mode 100644 index 0000000..d6bac86 --- /dev/null +++ b/tests/live-api/events.test.ts @@ -0,0 +1,106 @@ +import { gql } from 'graphql-tag'; +import { GraphQLClient } from 'graphql-request'; +import postgres from 'postgres'; +import { getZkappsWithPendingEventsQuery } from '../../src/db/sql/events-actions/queries.js'; +import { after, describe, it } from 'node:test'; +import { EventOutput } from 'src/resolvers-types.js'; +import assert from 'node:assert'; + +// Fixtures +import J1fu_65_66 from './fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_65_66.json' with { type: "json" }; +import J1fu_84_83 from './fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_84_83.json' with { type: "json" }; + +const db_client = postgres(process.env.PG_CONN); +/** + * This gets all the public keys of accounts with events. + * + * TODO: This returns ZkApps and validators for some reason. Ideally it would only return ZkApps. + */ +const zkappsWithPendingEvents = ( + await getZkappsWithPendingEventsQuery(db_client).execute() +).map((x) => x.public_key); + +const endpoint = + process.env.STAGING_GRAPHQL_ENDPOINT || + 'http://archive-node-api.gcp.o1test.net/'; +const client = new GraphQLClient(endpoint); + +const getEventsQuery = gql` + query getEvents($input: EventFilterOptionsInput!) { + events(input: $input) { + blockInfo { + stateHash + height + parentHash + } + eventData { + data + transactionInfo { + status + hash + memo + } + } + } + } +`; + +after(async () => { + await db_client.end(); +}); + +describe('Events', () => { + // Skipping until we configure a DB connection for CI + describe.skip('Pending Chain', () => { + // Only some, because some of the addresses are not ZkApps, which should be fixed long term. + it('Some of the zkapps with pending actions should be returned', async () => { + const totalEvents: any[] = []; + for (const publicKey of zkappsWithPendingEvents) { + const input = { + address: publicKey, + status: 'PENDING', + }; + const data: [EventOutput] = await client.request(getEventsQuery, { + input, + }); + totalEvents.concat(data); + } + console.log(totalEvents); + assert( + totalEvents.length > 0, + 'No events found for zkapps with pending actions' + ); + }); + }); + describe('Canonical Chain', () => { + it('Block Filter', async () => { + const totalEvents: any[] = []; + const input = { + address: 'B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu', + from: 433465, + to: 433466, + }; + const data: [EventOutput] = await client.request(getEventsQuery, { + input, + }); + totalEvents.concat(data); + assert.deepStrictEqual(data, J1fu_65_66); + }); + }); + describe('Canonical Chain', () => { + it('Block Filter with several blocks', async () => { + const totalEvents: any[] = []; + const input = { + address: 'B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu', + to: 439983, + from: 429984, + }; + const data: [EventOutput] = await client.request(getEventsQuery, { + input, + }); + totalEvents.concat(data); + console.log(totalEvents); + assert.deepStrictEqual(data, J1fu_84_83); + }); + }); +}); diff --git a/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_65_66.json b/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_65_66.json new file mode 100644 index 0000000..3b404d1 --- /dev/null +++ b/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_65_66.json @@ -0,0 +1,27 @@ +{ + "events": [ + { + "blockInfo": { + "stateHash": "3NLrHxJXQbR3AHRjUMfLz1iy96xt1CDouJLFarkQfUKvodybLhJ5", + "height": 433465, + "parentHash": "3NLQFTnTGmHNnbiEWzeyuw1aaCCBQmB1knxQVPZ83U3gL5nckZmP" + }, + "eventData": [ + { + "data": [ + "54", + "21418505143439845619563268510404671261197295135579508033453569377868703098897", + "1", + "5209626664266657802284133885362614683421727910483159025584204599078514592235", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtYELUSVwo8HFC3rbNSdFyTHWorAUPSfJ1VgnJ8GNZACLh2yZ4S", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + } + ] +} diff --git a/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_84_83.json b/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_84_83.json new file mode 100644 index 0000000..da85c79 --- /dev/null +++ b/tests/live-api/fixtures/B62qpHtWX41NstxzzUe8xooKogqomDwgJ4CN8J3V2274v5B9dnfJ1fu_84_83.json @@ -0,0 +1,855 @@ +{ + "events": [ + { + "blockInfo": { + "stateHash": "3NKWkjhcWsWNSNk673s7hXf6eymD9osXVaySdwtQfYe6UdXj81ni", + "height": 430261, + "parentHash": "3NKMB2tAHZq6AA6pdu8CMH7fYPueTeaS3B49TonBkygu9rCH24Vt" + }, + "eventData": [ + { + "data": [ + "40", + "998060867817496498208504185475974107940064532813474477005066298119996398698", + "0", + "4673692790514424018183677684752781732568591194081896236442357716719562711198", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuJ1Luww8zVshc1mKBptyadm8cEupmrs9Sm21MQ8XhmgWuC3EmT", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLYUESvJ3hj2cjWeAt4PLtw25kPg4u4JZttDtsdw4967c4jaDEW", + "height": 430330, + "parentHash": "3NKSpKqySfucXNPaDgTGMD6vgur5HGC7s2uZvWe5UYReprVsPHLE" + }, + "eventData": [ + { + "data": [ + "41", + "24703041182309128762896333004030210544819998858106011058241983351942988555191", + "1", + "10592935791526799177353446188960335252717421457227575597515423909751476219224", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtVQd5ajTrTvSojU6vHLVPHeX7SqvxbszT1P93AjcRTBhybePHa", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKvLBpmB2s2NuB2N84iCNm5rEMJtUaVCQH6M2VV7h8pjqEFxi2e", + "height": 430393, + "parentHash": "3NKAGYEE2145W3Mvh6afnsRhZAAZVFenoT4pWMzXhTaFCGJpjTUB" + }, + "eventData": [ + { + "data": [ + "42", + "1874634228347807419289344791550457142138304726290605776124663592758981048070", + "0", + "3722285512882194141676947367408492880901199329290511650433622239714551472058", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtfxHGUT3AgmKi7n1STvz5MMSQMQyiqwJ2cyR1NsrTHzjSxNP6g", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLZ7fraytwNgjJw8W5erWgq3JGL1Jbktf9cqyxL9Q3CEDCprQLX", + "height": 430596, + "parentHash": "3NKRZEuoGJrghniZ7yfEchX84PaU4wPVF2yJrYiPXPNBFQVnJnHH" + }, + "eventData": [ + { + "data": [ + "43", + "14993655798376653739663471458401888052980840695426322078455691487187810400427", + "1", + "18065741608653951493862400666528803363944691007228171182569397410134760793634", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JvLd4MJawXhw3r81Z4LRhbMDE4u34KG5RPEobewBAT39zMspci2", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKXYLYSXNshTeYbXjV69mYD8Ub7VUGUrk8Zfy8RBrjdovtf6Wbh", + "height": 430839, + "parentHash": "3NL3UPPW6dj6W3Vo5oNJPmyAtaq3oxi63zP9rmeS2TBLNnQL3o5h" + }, + "eventData": [ + { + "data": [ + "44", + "28873276942849084122641800890841920628065564811904333543692543868142451426185", + "0", + "9229586440269504673349055117074337884842776103240443121532529805967653051010", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JujH9hUQb2Y9gFpSKjZ6h1oPsAjT1K9aKKvEipWJxNBZfuY4kU7", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKV7pXkKvyVKkhni4nMxY1ThXZLwiMvRhP2N1Vw6VcNii5JzFVj", + "height": 431174, + "parentHash": "3NKVz8WpGThKXtgoH1Vn3JQSCYocFVSKhg9QoRqzkQcKoTaoACg6" + }, + "eventData": [ + { + "data": [ + "45", + "23697581145683735916087535802168116503572072031110899396463507686121577409075", + "0", + "23666630648850032978989226502157965981436289709672009641864076696173153153365", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuPcT5qDvrE8RRs9JCCMUBpEncxxJMrP8RsrWnrbvNDhucKzmVf", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLoDvjeWjRgWYpDWt8AHho6XPMhGAkdzcZGmM2FiJcGYjkZ4R6M", + "height": 431373, + "parentHash": "3NKxcTrUKnJZgQxSP5Z7jwYeNUykK3Q1GWKJm9ecJ1qQZTVheqvj" + }, + "eventData": [ + { + "data": [ + "46", + "1792879701475538380736372505180945606920539219179585739547632477255168028209", + "0", + "2511510605913989649736583957769257167811111032875502755829737456032575643078", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Jv9PJixZMzvHGEHnqXttssGxr5eeU88f3Arp5G6Fhi9jaXWkxtM", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKSehsgWY8662SB8iuFAzSJCtmD4RDyopBUiCXsCxu2kHBBS6H4", + "height": 431680, + "parentHash": "3NLKhZ5HqHmJM8aWR7pNiWJP1kPs2FP2iAibNtWdXkuCDnYCEwDG" + }, + "eventData": [ + { + "data": [ + "47", + "21718625877385310979598298359648046129177469084166092942665774667976723659457", + "1", + "26759958969151755450797654334741409861475061777779470521287893102614854688599", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Ju1NXEkjHrnNbozp61peAKxSj9PDAniFGKtVieu5C45tjWXHkET", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKXg7K5iR3g69PdeXVhKSJZDm7JATuNa5g6JDpWRmc6Fh7NSB3F", + "height": 431937, + "parentHash": "3NLjVAUpaF8xzAia3j6ekQBcPWagSfWL3F1CvcVJGMjeRJLmzTF9" + }, + "eventData": [ + { + "data": [ + "48", + "13360147481661774357202127723496119237548306719657640036598202680458593078656", + "0", + "24943016373465175819991070745625909142680271825270340628827476272303661152918", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JvQ9PdGDSf4zSD2v4xNazE1Nx71PhUEAQGsZTzAXJrmtY8UMFqG", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLNu25EJagiiutBQuX6uvoB1yL78M5c7YBgPCxSxQ1pDBM3nnx4", + "height": 432141, + "parentHash": "3NK6of2sABZGjBy83FvohRyKJsThQa9ZL7RFZkzrY4Qz5XQX221M" + }, + "eventData": [ + { + "data": [ + "49", + "17624495655902484438654558287271433165193723942244522236148819196926757392665", + "0", + "2476344857050466730959524845248215453580004336344116560422523424733413954957", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Juz5KdgJV5VDbkf75UwAvp7XvD2Nky8UBxuH5gZmZGrGsYTCSPf", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKVEtoGsatbkBLomsYTvLxbwPTefgkJxAoG5eMZ4rBmyBCVNbvA", + "height": 432415, + "parentHash": "3NKLvPGuFW8HAa8T1JfTHfkL6KJHAgZrRjVxuaRAWw1NTtPQQapS" + }, + "eventData": [ + { + "data": [ + "50", + "25232642655811716209554841794087641504848712867371947993931913170989941903504", + "0", + "26763641867036195346531953989526720762788607046108900143316742822895564356796", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Ju5Rv6Sv3p6TkBDV6nR7JCbcoAbiXP1evrMy3YRd1J8fGgLbL5k", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKoyxvZAE2FUUqGUYyMBGzR2tgrPrWqwah53cmqBBmBbaqH11Tf", + "height": 432684, + "parentHash": "3NL1DBbEc7ySD7zvhVZyhviPEk46T9VAt3WVxn8vW32ycC1vLtKj" + }, + "eventData": [ + { + "data": [ + "51", + "2634103911522893352661017578596461338429604266661454161682658754556917374781", + "0", + "10909279592663175686712527457198816183492860439782169642320687613164248181099", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Jucv3NhR2pYMcW5P5mUniUwU3GsusvinkgpQXKJuHi1KM3yzzWK", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLUfxQgnQDdYuMQCnRPpYWdWt88Tzw6pFSRVYDgt56oJpGMYFsa", + "height": 432945, + "parentHash": "3NLSjUHMZ4FAAUKHYVcAN8Jhe3qZWD8XnKN988EscjLEnfaCY7Vb" + }, + "eventData": [ + { + "data": [ + "52", + "4527029860752386812200760247361454573222964481071868069586868835180423682305", + "1", + "6299664138971168870942489149638826490939114499841612917761418424535264196907", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JudGqFtdEmT7S5AFAWwfEEQGeyGH66M29uZxLXEdz59KuVAafhL", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLQiVGpR7UBmRoFRNRaUpBoW6Mm4rXktbKfiqvKAFzB8BfFeZFk", + "height": 433207, + "parentHash": "3NK9xbMC3rTk2zwUmTsyPjGp6iM8TeavmPFSgEmozRB3TihSnwwf" + }, + "eventData": [ + { + "data": [ + "53", + "929707172699100237910284160359915331367495225407403439108102389737995932195", + "1", + "9863055425161329055466495031097820172924481647004250720444760986183053417528", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Jv51HQcZVPNxXmBgpeY5Dr8pum4wK3EYLzERKUgksadsq4wrLyE", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLrHxJXQbR3AHRjUMfLz1iy96xt1CDouJLFarkQfUKvodybLhJ5", + "height": 433465, + "parentHash": "3NLQFTnTGmHNnbiEWzeyuw1aaCCBQmB1knxQVPZ83U3gL5nckZmP" + }, + "eventData": [ + { + "data": [ + "54", + "21418505143439845619563268510404671261197295135579508033453569377868703098897", + "1", + "5209626664266657802284133885362614683421727910483159025584204599078514592235", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtYELUSVwo8HFC3rbNSdFyTHWorAUPSfJ1VgnJ8GNZACLh2yZ4S", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLMXhEh3wJZHee6czaidhCmGnLWSwSwUsQqUP7D9pULDWHxELm3", + "height": 433728, + "parentHash": "3NLySAatAXRorTz5aGnkEh68wMmsxTdhBajDHbeKED8oBf23wkaJ" + }, + "eventData": [ + { + "data": [ + "55", + "3912362415126922426025707742040128828796470920662065841087989901485385594921", + "1", + "19249645896567517505667366190366249438794929158220769240288235870017200271103", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JvDfVHbcoPgHu8EMQTp7QCCf8XQQpaAt9UrRan4YStNX7KZAVZ1", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKyRX4BW4iRrSfJC5aAvJYBAmA5qvgVQ9WgLqo8R2jZ34usS1uk", + "height": 434007, + "parentHash": "3NKkSqMwpLYEDrL6ULqd4wQk6ZW3fzwRy5mJc1o8TCg2hCkgxmzu" + }, + "eventData": [ + { + "data": [ + "56", + "5265280413486636830196161113075448875176266463303802214625527567279495893574", + "0", + "6671088489569443570903246373937348874680747028108273464044676729497502670111", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtfZFqQLdJEmkVGh8hHQyboFBgZgEA8A1o9hAeWvcGUir3BQ7vo", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLGT4UqeGSKWxWDSmP5LXQVok9omPGcuYKrw5ynu7xiZAdHXoWu", + "height": 434271, + "parentHash": "3NKCQNMarCDS4EYJR7mEiA8kKmk4smnfGvXpwcBMYdjrx1CG8P96" + }, + "eventData": [ + { + "data": [ + "57", + "23159383323971077001050582188708984380145328545514929299519641384628041194283", + "0", + "16743220956644420799020092142443849734429123297726493101413419207341256911947", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtX6nTn2vVbxE7AkESGbUwfd94iPhUZLxvoTC5wakkpCFssEwQc", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NL84tR6nfhoR3jxT1NzqmnkUPRYRRVHxzFNH1bMWE1kCRdjTh9x", + "height": 434534, + "parentHash": "3NLr7Mbi12PAGh4AELDSMCfxTaYgqYazPBLCEWsyN8s9ZesW8bZW" + }, + "eventData": [ + { + "data": [ + "58", + "12979341738218958886237712805253050203888433613248112627945962591908113566784", + "0", + "8605961328361905007936992953703940463443980558707641974260785689577325008847", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtdjpS1X2Jgiz2qRAqErXjfYTvA7YaQLz1jXNBTTaxydFgBQ7UW", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKcs8arGRGBzcgn3ju2V1i4xMUkZdeq9NVBGbVW27RHGcUcExLd", + "height": 434799, + "parentHash": "3NKj7TaGLnS4NndBpm58t8kow9zsgoXDD4SiMc5RNxLERrRFPknu" + }, + "eventData": [ + { + "data": [ + "59", + "25985952763037278706160688688971666541055567503189964631816504684928044789530", + "1", + "26244724614027158326845670795470298693035541264002759221693109075293364707290", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JudHmFEg9PPqvW5D3JZ9ugPvP51RWpUD2UshUMaPAk4YaxMMWB8", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKbfncdYcAr8RdMUtk5ybAgqfRm9J8bLrdHbicVLRtGJJ3rzpds", + "height": 435072, + "parentHash": "3NKKhgjr2ooB6yzhCRrena1KF4CFiCj1QJbi9PYj7hCoGbjRYMry" + }, + "eventData": [ + { + "data": [ + "60", + "25290059719143925274162442525696112141012678878673963708397026612452536898860", + "0", + "103885441330339476504130531258431028452559648019695521153035185085474784203", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtW28QhecbhTxCJKR3iQwye3Zsm5LfxpsqRkY9hoejQDJNZtdS5", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKWrgsh1oSRSAjVCLcfYrUAnwvLi7BCRbT4YFnfAgCofEdKtW4w", + "height": 435803, + "parentHash": "3NL8sFtqL9Pq39UXHtvKGZj7sZaT2ZCh7kmkVcx2sevYasFBDLWt" + }, + "eventData": [ + { + "data": [ + "61", + "6765117672295461011971813360736653016376638070406430178109681172670115976029", + "1", + "24346417571211418441333233319858141826675903170781391123586724925452196509915", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JurkbYxSGD6q6eqynjoYzHvMctnoRFTSMin3dWdSGsz4zPtUekq", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLkEoMYbsmkZVb5vXYqGZEw1bdYKu78X6BJv61URERHmUrnChN9", + "height": 435873, + "parentHash": "3NKsWzSLLM1oKSzgspxduAkG1uCUwjpat7rZcaHzisEWb6PfouQn" + }, + "eventData": [ + { + "data": [ + "62", + "11071380475097925376662362488384910487700202735789086833923525401311342651968", + "0", + "19567614800894648095317347707227199147020517096242408946425310839618045515037", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtXwxtvwcZZpKfVLpZwuWyLhySgMqQWmyjqS3uqGJ2DjYd6eUEs", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKTEmkj7GzXk9H7Y3pR1H8QN2ERvNd4W4TKqDeHVq2WvzfDbGo7", + "height": 435935, + "parentHash": "3NLmnhzAcNSU3ZGus5gwGLKMst9DRekGEzPXkbE5uTJ9NLXK1RFD" + }, + "eventData": [ + { + "data": [ + "63", + "25495429428250607059295226951822736918249742461080668278959321120506289629299", + "0", + "17340184072778012121985080112749294794959987627885034599413775592146426405511", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JujMC8GJcHqH8dzesbqVgKSTqepN15FnsaJcJ36owXU8sZ5wSJv", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKgvyrbeaNqSfP8C5VJhisR173DYcg4L3iZ2AHSp1oG2UbwGUTK", + "height": 436130, + "parentHash": "3NKiYPvJhZgaasjbWq6qiqUWKNcWEtEXQaRLciYMfvEt9VWVweYi" + }, + "eventData": [ + { + "data": [ + "64", + "20338767870048189178036254838571931767115520044705213792373644201378932445665", + "1", + "7185887875163514921184214631553389499810507267901979892508684582575503618706", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JvHCzxLhcw4uWhuPTDnS1RwefP8LX8sSdNpUxxDHU1QRqL68yJu", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLAxaN1zxhNftHwM794dpYWTeUPGMmxub4vfe8EQZZ4SuXP11y4", + "height": 436342, + "parentHash": "3NKxGMWskoZx6RxUke3fVFVbcHdbWYz6gLvEhxL29eRk82cYzRGv" + }, + "eventData": [ + { + "data": [ + "65", + "18163505696761657597846274899494203132582449308236435392229981285182141355414", + "0", + "13824700862936851946566883382250016827046039121620632916229935281553383063929", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuTYnxw3yRhjdMcHQsh93KYAnKbBzj3GoNqL37GwrNHXWJEeyJp", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKWNkMvcYhX7h1Tm3Mu767odTc6kq49wiQzuyqntYGQEUrYCrf2", + "height": 436609, + "parentHash": "3NLHEeY6bi8Nstazn2zmGiadMaPdPYGLerKXCrGLJpHZuhYvkLim" + }, + "eventData": [ + { + "data": [ + "66", + "7181050065201396822593769219180550922008907088057933271745413692612803831371", + "1", + "27794896531299705806139408336817480374917316291052466023178282593379037562470", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuVFbNrPdYmt8R6Zak4413HcY1ckS69796ZSZgTmxqPqn5SWPS7", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKuDjtUFTgXRzkovoD4zbKwT9ZwhmyMVSeEmKLXdiQL7CTocnHS", + "height": 436893, + "parentHash": "3NL5w4N7hP3ZuSHHBrsXBmMMTSu9P6RVrpfc3ok1ceCojczmTURf" + }, + "eventData": [ + { + "data": [ + "67", + "25823298362468427847546207117668362101677677370443351812264532470871426569517", + "1", + "206729574652245297926665972459155532322824656922179190820951305986089784465", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Ju3Noszr6Ha1vEF6Ejbwkz6oXi6t36wRJqpMLvHdehYSvrMs4hn", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLpGq7ab2uFr2414xqjaxYVYrymQohCE7XzZRWqNz2ZGbpTN2yk", + "height": 437164, + "parentHash": "3NLWaShQdaQNKqz3NCzKMssLDLmaZPACjeptw4efJnp462VaWnh4" + }, + "eventData": [ + { + "data": [ + "68", + "15267312820436981322068135089335058734438610751370213591082994422226400027001", + "0", + "22669731018512537532596127702100734919795396359890120757376615519883578053765", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtsfjSpHKQqX55qeXjxUzPQyBtzDg3w217XcPApPDq7v7Kd1Gdf", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKfiCuvqzwEkkXYg5xKQ1p2rLGKaiDvscfHRgqtX7eoMe2qdkRH", + "height": 437429, + "parentHash": "3NLehkh9P8iDGh5rErTz634gE4vwJvEgzhiMRKSCn9tmrFLiN2KP" + }, + "eventData": [ + { + "data": [ + "69", + "26499628646879107390900886493557673651047876562110812899348843088434034074716", + "1", + "8108421122271090512356066957754246419332464450959693259114175576191407134589", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuE5cXdA1v3RsGZA6iJijWLwauJuAi4hwQs76E9m5mqx3rCB6hP", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLKFJ8PfRhbcMVRw3mm7pu16ViH6mRwmoNLgcKDrHNBaenM5yC5", + "height": 437677, + "parentHash": "3NLZfx1UxLzPiTzgDta2tE4aobJW8y8avTQn9X46g56HKZn4xmqm" + }, + "eventData": [ + { + "data": [ + "70", + "27434551641332846795823972831243676284840431034644109698434541703004536961063", + "0", + "4425668813331313427410977950081739566840335273664182444211700621973852530152", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5Jv2mYzwYA4URkGFBJsafBBNSU2tRK5mStMgXcE5dwEzZ9Ru4KuR", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLpmK28CnMDgdhoJt4y2sivrwcZoZr7DVUnXNUGA5wS62wyUbW7", + "height": 437932, + "parentHash": "3NK9KkiConU7zfNJhs6LXVNAyuMSFdGAsNNRgcp74RTsprHG6BoT" + }, + "eventData": [ + { + "data": [ + "71", + "26777915948636627944754769232443870958544530946242136921062720707584456635228", + "1", + "14196337274254372366639345143744717762738496680570850649344074488871923868645", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtVxZTuChPkqEmYiyYFm2g1UmHafeQa8W8WWicR2XxdT9YReC8J", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLSSVNeByzfVF2jMLAwWYSMU5XBoi1F73h4Wnp4pguALQxbURjZ", + "height": 438186, + "parentHash": "3NKARTzhFTHN2GtgwVJxNakHADjzGK4JSVhM13zGcFHCUS6mkWzU" + }, + "eventData": [ + { + "data": [ + "72", + "1386572568683467683026743713861371538299147106976112428216242531985281486553", + "1", + "16384958409216330154204331117635847552387518511585875866589734938674525835887", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JtgWQvWBiA1D2jTuFJQSU1z3zvVKmV3hqMFc1Nr72CQ7UWh5Y8u", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLQi2jmEmA4kgXC2W26bK7uNKhaWwCy5JSJ4UUwRGmnUWBXabYd", + "height": 438439, + "parentHash": "3NLs74CzY8CL81K7Vzzir1aPQRYSfvJnG55VG5ZkzCm5eZCr7Uq8" + }, + "eventData": [ + { + "data": [ + "73", + "26452876988364278078216648508614242450457036858883398844394579866209736630335", + "0", + "5896635647244262525101318381891019289701022076142500915902368554881441058072", + "0" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuQpmoUDpgoWzARDghSnB36vAMiuN5dsLR4G3DFJ6A2sPFYEo6m", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NLJ8KVmpuvGdMwQyET6dPfAeXifeyShjmU1dV8dSBthjdTaYQU7", + "height": 438747, + "parentHash": "3NKxEFhBfT1t7qfrrZnb4ZYYttU7NrBnNsXNn3pM8wJb63qGPsQv" + }, + "eventData": [ + { + "data": [ + "74", + "23813163096724185551598351576416045569735903230321978043736921792604649589986", + "1", + "7354003218369834649983933537834326653677904609220889440180102245074233442765", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuniZ4veNhsnKfhikzpBP8r84wTHZNBYip9pJwq6DCv4b8yxMPv", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NKyAeDEcXRjk287QSs58qqBV9HG82YS5vLowcmcAG3f2v5dmEEV", + "height": 438952, + "parentHash": "3NL42ctEi3t4rYqDMvn2nFUf1QVdSVXiqKKRSxuRmosuj21Wjm4c" + }, + "eventData": [ + { + "data": [ + "75", + "14126529401576091414188702622843818888574559688510035072773938087655712009396", + "1", + "8891132027670143322039890806761356545604658222997502910989100958204921965181", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JuvgCpzisRRtJZs4juopjdcmQoNHo53NPZBUmtU3FiWvz9aak8c", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + }, + { + "blockInfo": { + "stateHash": "3NL4yf7wxCbfK2zwPHYNDwAvRzqSSt4S7Wv49NrFZYJrfW3di4Ze", + "height": 439206, + "parentHash": "3NKLQChx3jQJHkhNuY1J7NkBRB8fmrCN3U3na1HumDRX7MsTVs1F" + }, + "eventData": [ + { + "data": [ + "76", + "14790650538903111146533119204778731820344270887926546132796053516178462048198", + "0", + "17035572608813472391326444000489610404854913142470192572983573767001845841802", + "1" + ], + "transactionInfo": { + "status": "applied", + "hash": "5JvNnVAmMK7NwQ8DeN49adYqa9jJ1g8oqKRbXxsF9HytaxgkM7Av", + "memo": "E4ZANcKkkEtax1nEzsSw3o23y3vLHjF2ZB6eMqZV4ik52mSq1yHYn" + } + } + ] + } + ] +} diff --git a/tests/live-api/networkState.test.ts b/tests/live-api/networkState.test.ts new file mode 100644 index 0000000..4fe5eb9 --- /dev/null +++ b/tests/live-api/networkState.test.ts @@ -0,0 +1,33 @@ +import { gql } from 'graphql-tag'; +import { GraphQLClient } from 'graphql-request'; +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import { NetworkState } from 'src/blockchain/types.js'; + +const K = 290; // Consensus parameter meaning length of chain required for a block to become canonical +const endpoint = + process.env.STAGING_GRAPHQL_ENDPOINT || + 'http://archive-node-api.gcp.o1test.net/'; +const client = new GraphQLClient(endpoint); + +const networkStateQuery = gql` + query { + networkState { + maxBlockHeight { + canonicalMaxBlockHeight + pendingMaxBlockHeight + } + } + } +`; + +describe('Network State', () => { + it('should return the network state', async () => { + const data: { networkState: NetworkState } = + await client.request(networkStateQuery); + const { maxBlockHeight } = data.networkState; + const { canonicalMaxBlockHeight, pendingMaxBlockHeight } = maxBlockHeight; + + assert.strictEqual(pendingMaxBlockHeight - canonicalMaxBlockHeight, K); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index 61dd342..0c428bc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -100,5 +100,5 @@ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ }, - "include": ["src/**/*", "tests/**/*", "zkapp/**/*", "benchmark/**/*" ] + "include": ["src/**/*", "tests/**/*", "zkapp/**/*", "benchmark/**/*" ] }