envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
397 lines (347 loc) • 21.4 kB
JavaScript
// 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 */