UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

397 lines (347 loc) • 21.4 kB
// Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; var Table = require("./Table.res.js"); var Utils = require("../Utils.res.js"); var Js_exn = require("rescript/lib/js/js_exn.js"); var Address = require("../Address.res.js"); var Js_dict = require("rescript/lib/js/js_dict.js"); var Js_null = require("rescript/lib/js/js_null.js"); var Belt_Array = require("rescript/lib/js/belt_Array.js"); var EntityHistory = require("./EntityHistory.res.js"); var S$RescriptSchema = require("rescript-schema/src/S.res.js"); var name = "dynamic_contract_registry"; function makeId(chainId, contractAddress) { return String(chainId) + "-" + contractAddress; } var schema = S$RescriptSchema.schema(function (s) { return { id: s.m(S$RescriptSchema.string), chain_id: s.m(S$RescriptSchema.$$int), registering_event_block_number: s.m(S$RescriptSchema.$$int), registering_event_log_index: s.m(S$RescriptSchema.$$int), registering_event_block_timestamp: s.m(S$RescriptSchema.$$int), registering_event_contract_name: s.m(S$RescriptSchema.string), registering_event_name: s.m(S$RescriptSchema.string), registering_event_src_address: s.m(Address.schema), contract_address: s.m(Address.schema), contract_name: s.m(S$RescriptSchema.string) }; }); var rowsSchema = S$RescriptSchema.array(schema); var table = Table.mkTable(name, undefined, [ Table.mkField("id", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, true, undefined, undefined), Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_log_index", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_block_timestamp", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("registering_event_src_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("contract_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined) ]); var entityHistory = EntityHistory.fromTable(table, schema, -1); var config = { name: name, index: -1, schema: schema, rowsSchema: rowsSchema, table: table, entityHistory: entityHistory }; var DynamicContractRegistry = { name: name, index: -1, makeId: makeId, schema: schema, rowsSchema: rowsSchema, table: table, entityHistory: entityHistory, config: config }; var fields = [ "id", "start_block", "end_block", "max_reorg_depth", "source_block", "first_event_block", "buffer_block", "progress_block", "ready_at", "events_processed", "_is_hyper_sync", "_num_batches_fetched" ]; var table$1 = Table.mkTable("envio_chains", undefined, [ Table.mkField("id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined), Table.mkField("start_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("end_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined), Table.mkField("max_reorg_depth", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("buffer_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("source_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("first_event_block", "INTEGER", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, undefined, undefined, undefined), Table.mkField("ready_at", "TIMESTAMP WITH TIME ZONE NULL", S$RescriptSchema.$$null(Utils.Schema.dbDate), undefined, undefined, true, undefined, undefined, undefined), Table.mkField("events_processed", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("_is_hyper_sync", "BOOLEAN", S$RescriptSchema.bool, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("progress_block", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("_num_batches_fetched", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined) ]); function initialFromConfig(chainConfig) { return { id: chainConfig.id, start_block: chainConfig.startBlock, end_block: Js_null.fromOption(chainConfig.endBlock), max_reorg_depth: chainConfig.maxReorgDepth, progress_block: -1, events_processed: 0, first_event_block: null, buffer_block: -1, source_block: 0, ready_at: null, _is_hyper_sync: false, _num_batches_fetched: 0 }; } function makeInitialValuesQuery(pgSchema, chainConfigs) { if (chainConfigs.length === 0) { return ; } var columnNames = Belt_Array.map(fields, (function (field) { return "\"" + field + "\""; })); var valuesRows = Belt_Array.map(chainConfigs, (function (chainConfig) { var initialValues = initialFromConfig(chainConfig); var values = Belt_Array.map(fields, (function (field) { var value = Js_dict.get(initialValues, field); var match = typeof value; switch (match) { case "boolean" : if (value) { return "true"; } else { return "false"; } case "number" : return String(value); case "object" : return "NULL"; default: return Js_exn.raiseError("Invalid envio_chains value type"); } })); return "(" + values.join(", ") + ")"; })); return "INSERT INTO \"" + pgSchema + "\".\"" + table$1.tableName + "\" (" + columnNames.join(", ") + ")\nVALUES " + valuesRows.join(",\n ") + ";"; } var metaFields = [ "source_block", "buffer_block", "first_event_block", "ready_at", "_is_hyper_sync", "_num_batches_fetched" ]; function makeMetaFieldsUpdateQuery(pgSchema) { var setClauses = Belt_Array.mapWithIndex(metaFields, (function (index, field) { var paramIndex = index + 2 | 0; return "\"" + field + "\" = $" + String(paramIndex); })); return "UPDATE \"" + pgSchema + "\".\"" + table$1.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"" + "id" + "\" = $1;"; } function makeGetInitialStateQuery(pgSchema) { return "SELECT \"" + "id" + "\" as \"id\",\n\"" + "start_block" + "\" as \"startBlock\",\n\"" + "end_block" + "\" as \"endBlock\",\n\"" + "max_reorg_depth" + "\" as \"maxReorgDepth\",\n\"" + "first_event_block" + "\" as \"firstEventBlockNumber\",\n\"" + "ready_at" + "\" as \"timestampCaughtUpToHeadOrEndblock\",\n\"" + "events_processed" + "\" as \"numEventsProcessed\",\n\"" + "progress_block" + "\" as \"progressBlockNumber\",\n(\n SELECT COALESCE(json_agg(json_build_object(\n 'address', \"contract_address\",\n 'contractName', \"contract_name\",\n 'startBlock', \"registering_event_block_number\",\n 'registrationBlock', \"registering_event_block_number\"\n )), '[]'::json)\n FROM \"" + pgSchema + "\".\"" + table.tableName + "\"\n WHERE \"chain_id\" = chains.\"" + "id" + "\"\n) as \"dynamicContracts\"\nFROM \"" + pgSchema + "\".\"" + table$1.tableName + "\" as chains;"; } function getInitialState(sql, pgSchema) { return sql.unsafe(makeGetInitialStateQuery(pgSchema)); } var progressFields = [ "progress_block", "events_processed" ]; function makeProgressFieldsUpdateQuery(pgSchema) { var setClauses = Belt_Array.mapWithIndex(progressFields, (function (index, field) { var paramIndex = index + 2 | 0; return "\"" + field + "\" = $" + String(paramIndex); })); return "UPDATE \"" + pgSchema + "\".\"" + table$1.tableName + "\"\nSET " + setClauses.join(",\n ") + "\nWHERE \"id\" = $1;"; } function setMeta(sql, pgSchema, chainsData) { var query = makeMetaFieldsUpdateQuery(pgSchema); var promises = []; Utils.Dict.forEachWithKey(chainsData, (function (data, chainId) { var params = []; params.push(chainId); metaFields.forEach(function (field) { var value = data[field]; params.push(value); }); promises.push(sql.unsafe(query, params, {prepare: true})); })); return Promise.all(promises); } function setProgressedChains(sql, pgSchema, progressedChains) { var query = makeProgressFieldsUpdateQuery(pgSchema); var promises = []; progressedChains.forEach(function (data) { var params = []; params.push(data.chainId); progressFields.forEach(function (field) { params.push(field === "progress_block" ? data.progressBlockNumber : data.totalEventsProcessed); }); promises.push(sql.unsafe(query, params, {prepare: true})); }); return Promise.all(promises); } var Chains = { fields: fields, table: table$1, initialFromConfig: initialFromConfig, makeInitialValuesQuery: makeInitialValuesQuery, metaFields: metaFields, makeMetaFieldsUpdateQuery: makeMetaFieldsUpdateQuery, makeGetInitialStateQuery: makeGetInitialStateQuery, getInitialState: getInitialState, progressFields: progressFields, makeProgressFieldsUpdateQuery: makeProgressFieldsUpdateQuery, setMeta: setMeta, setProgressedChains: setProgressedChains }; var table$2 = Table.mkTable("persisted_state", undefined, [ Table.mkField("id", "SERIAL", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined), Table.mkField("envio_version", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("config_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("schema_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("handler_files_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("abi_files_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined) ]); var PersistedState = { table: table$2 }; var table$3 = Table.mkTable("envio_checkpoints", undefined, [ Table.mkField("id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, true, undefined, undefined), Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_hash", "TEXT", S$RescriptSchema.$$null(S$RescriptSchema.string), undefined, undefined, true, undefined, undefined, undefined), Table.mkField("events_processed", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined) ]); function makeGetReorgCheckpointsQuery(pgSchema) { return "WITH reorg_chains AS (\n SELECT \n \"" + "id" + "\" as id,\n \"" + "source_block" + "\" - \"" + "max_reorg_depth" + "\" AS safe_block\n FROM \"" + pgSchema + "\".\"" + table$1.tableName + "\"\n WHERE \"" + "max_reorg_depth" + "\" > 0\n AND \"" + "progress_block" + "\" > \"" + "source_block" + "\" - \"" + "max_reorg_depth" + "\"\n)\nSELECT \n cp.\"" + "id" + "\", \n cp.\"" + "chain_id" + "\", \n cp.\"" + "block_number" + "\", \n cp.\"" + "block_hash" + "\"\nFROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" cp\nINNER JOIN reorg_chains rc \n ON cp.\"" + "chain_id" + "\" = rc.id\nWHERE cp.\"" + "block_hash" + "\" IS NOT NULL\n AND cp.\"" + "block_number" + "\" >= rc.safe_block;"; } function makeCommitedCheckpointIdQuery(pgSchema) { return "SELECT COALESCE(MAX(" + "id" + "), " + String(0) + ") AS id FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\";"; } function makeInsertCheckpointQuery(pgSchema) { return "INSERT INTO \"" + pgSchema + "\".\"" + table$3.tableName + "\" (\"" + "id" + "\", \"" + "chain_id" + "\", \"" + "block_number" + "\", \"" + "block_hash" + "\", \"" + "events_processed" + "\")\nSELECT * FROM unnest($1::INTEGER[],$2::INTEGER[],$3::INTEGER[],$4::TEXT[],$5::INTEGER[]);"; } function insert(sql, pgSchema, checkpointIds, checkpointChainIds, checkpointBlockNumbers, checkpointBlockHashes, checkpointEventsProcessed) { var query = makeInsertCheckpointQuery(pgSchema); return sql.unsafe(query, [ checkpointIds, checkpointChainIds, checkpointBlockNumbers, checkpointBlockHashes, checkpointEventsProcessed ], {prepare: true}); } function rollback(sql, pgSchema, rollbackTargetCheckpointId) { return sql.unsafe("DELETE FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" WHERE \"" + "id" + "\" > $1;", [rollbackTargetCheckpointId], {prepare: true}); } function makePruneStaleCheckpointsQuery(pgSchema) { return "DELETE FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\" WHERE \"" + "id" + "\" < $1;"; } function pruneStaleCheckpoints(sql, pgSchema, safeCheckpointId) { return sql.unsafe(makePruneStaleCheckpointsQuery(pgSchema), [safeCheckpointId], {prepare: true}); } function makeGetRollbackTargetCheckpointQuery(pgSchema) { return "SELECT \"" + "id" + "\" FROM \"" + pgSchema + "\".\"" + table$3.tableName + "\"\nWHERE \n \"" + "chain_id" + "\" = $1 AND\n \"" + "block_number" + "\" <= $2\nORDER BY \"" + "id" + "\" DESC\nLIMIT 1;"; } function getRollbackTargetCheckpoint(sql, pgSchema, reorgChainId, lastKnownValidBlockNumber) { return sql.unsafe(makeGetRollbackTargetCheckpointQuery(pgSchema), [ reorgChainId, lastKnownValidBlockNumber ], {prepare: true}); } function makeGetRollbackProgressDiffQuery(pgSchema) { return "SELECT \n \"" + "chain_id" + "\",\n SUM(\"" + "events_processed" + "\") as events_processed_diff,\n MIN(\"" + "block_number" + "\") - 1 as new_progress_block_number\nFROM \"" + pgSchema + "\".\"" + table$3.tableName + "\"\nWHERE \"" + "id" + "\" > $1\nGROUP BY \"" + "chain_id" + "\";"; } function getRollbackProgressDiff(sql, pgSchema, rollbackTargetCheckpointId) { return sql.unsafe(makeGetRollbackProgressDiffQuery(pgSchema), [rollbackTargetCheckpointId], {prepare: true}); } var Checkpoints = { initialCheckpointId: 0, table: table$3, makeGetReorgCheckpointsQuery: makeGetReorgCheckpointsQuery, makeCommitedCheckpointIdQuery: makeCommitedCheckpointIdQuery, makeInsertCheckpointQuery: makeInsertCheckpointQuery, insert: insert, rollback: rollback, makePruneStaleCheckpointsQuery: makePruneStaleCheckpointsQuery, pruneStaleCheckpoints: pruneStaleCheckpoints, makeGetRollbackTargetCheckpointQuery: makeGetRollbackTargetCheckpointQuery, getRollbackTargetCheckpoint: getRollbackTargetCheckpoint, makeGetRollbackProgressDiffQuery: makeGetRollbackProgressDiffQuery, getRollbackProgressDiff: getRollbackProgressDiff }; var schema$1 = S$RescriptSchema.schema(function (s) { return { chain_id: s.m(S$RescriptSchema.$$int), event_id: s.m(S$RescriptSchema.bigint), event_name: s.m(S$RescriptSchema.string), contract_name: s.m(S$RescriptSchema.string), block_number: s.m(S$RescriptSchema.$$int), log_index: s.m(S$RescriptSchema.$$int), src_address: s.m(Address.schema), block_hash: s.m(S$RescriptSchema.string), block_timestamp: s.m(S$RescriptSchema.$$int), block_fields: s.m(S$RescriptSchema.json(false)), transaction_fields: s.m(S$RescriptSchema.json(false)), params: s.m(S$RescriptSchema.json(false)) }; }); var table$4 = Table.mkTable("raw_events", undefined, [ Table.mkField("chain_id", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("event_id", "NUMERIC", S$RescriptSchema.bigint, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("event_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("contract_name", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_number", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("log_index", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("src_address", "TEXT", Address.schema, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_hash", "TEXT", S$RescriptSchema.string, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_timestamp", "INTEGER", S$RescriptSchema.$$int, undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("block_fields", "JSONB", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("transaction_fields", "JSONB", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("params", "JSONB", S$RescriptSchema.json(false), undefined, undefined, undefined, undefined, undefined, undefined), Table.mkField("serial", "SERIAL", S$RescriptSchema.$$null(S$RescriptSchema.$$int), undefined, undefined, true, true, undefined, undefined) ]); var RawEvents = { schema: schema$1, table: table$4 }; var metaViewName = "_meta"; var chainMetadataViewName = "chain_metadata"; function makeMetaViewQuery(pgSchema) { return "CREATE VIEW \"" + pgSchema + "\".\"" + metaViewName + "\" AS \nSELECT \n \"" + "id" + "\" AS \"chainId\",\n \"" + "start_block" + "\" AS \"startBlock\", \n \"" + "end_block" + "\" AS \"endBlock\",\n \"" + "progress_block" + "\" AS \"progressBlock\",\n \"" + "buffer_block" + "\" AS \"bufferBlock\",\n \"" + "first_event_block" + "\" AS \"firstEventBlock\",\n \"" + "events_processed" + "\" AS \"eventsProcessed\",\n \"" + "source_block" + "\" AS \"sourceBlock\",\n \"" + "ready_at" + "\" AS \"readyAt\",\n (\"" + "ready_at" + "\" IS NOT NULL) AS \"isReady\"\nFROM \"" + pgSchema + "\".\"" + table$1.tableName + "\"\nORDER BY \"" + "id" + "\";"; } function makeChainMetadataViewQuery(pgSchema) { return "CREATE VIEW \"" + pgSchema + "\".\"" + chainMetadataViewName + "\" AS \nSELECT \n \"" + "source_block" + "\" AS \"block_height\",\n \"" + "id" + "\" AS \"chain_id\",\n \"" + "end_block" + "\" AS \"end_block\", \n \"" + "first_event_block" + "\" AS \"first_event_block_number\",\n \"" + "_is_hyper_sync" + "\" AS \"is_hyper_sync\",\n \"" + "buffer_block" + "\" AS \"latest_fetched_block_number\",\n \"" + "progress_block" + "\" AS \"latest_processed_block\",\n \"" + "_num_batches_fetched" + "\" AS \"num_batches_fetched\",\n \"" + "events_processed" + "\" AS \"num_events_processed\",\n \"" + "start_block" + "\" AS \"start_block\",\n \"" + "ready_at" + "\" AS \"timestamp_caught_up_to_head_or_endblock\"\nFROM \"" + pgSchema + "\".\"" + table$1.tableName + "\";"; } var Views = { metaViewName: metaViewName, chainMetadataViewName: chainMetadataViewName, makeMetaViewQuery: makeMetaViewQuery, makeChainMetadataViewQuery: makeChainMetadataViewQuery }; var isPrimaryKey = true; var isNullable = true; var isIndex = true; exports.isPrimaryKey = isPrimaryKey; exports.isNullable = isNullable; exports.isIndex = isIndex; exports.DynamicContractRegistry = DynamicContractRegistry; exports.Chains = Chains; exports.PersistedState = PersistedState; exports.Checkpoints = Checkpoints; exports.RawEvents = RawEvents; exports.Views = Views; /* schema Not a pure module */