UNPKG

envio

Version:

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

167 lines (151 loc) 4.71 kB
// Generated by ReScript, PLEASE EDIT WITH CARE import * as ChainMap from "../ChainMap.res.mjs"; import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js"; import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js"; import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js"; import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js"; let EventDuplicate = /* @__PURE__ */Primitive_exceptions.create("EventRouter.EventDuplicate"); let WildcardCollision = /* @__PURE__ */Primitive_exceptions.create("EventRouter.WildcardCollision"); function empty() { return { wildcard: undefined, byContractName: {} }; } function addOrThrow(group, event, contractName, isWildcard) { let wildcard = group.wildcard; let byContractName = group.byContractName; let match = byContractName[contractName]; if (match !== undefined) { throw { RE_EXN_ID: EventDuplicate, Error: new Error() }; } if (isWildcard && Stdlib_Option.isSome(wildcard)) { throw { RE_EXN_ID: WildcardCollision, Error: new Error() }; } if (isWildcard) { group.wildcard = Primitive_option.some(event); } byContractName[contractName] = event; } function get(group, contractAddress, blockNumber, indexingAddresses) { let wildcard = group.wildcard; let indexingContract = indexingAddresses[contractAddress]; if (indexingContract === undefined) { return wildcard; } if (indexingContract.effectiveStartBlock > blockNumber) { return; } let event = group.byContractName[indexingContract.contractName]; if (event !== undefined) { return event; } else { return wildcard; } } let Group = { empty: empty, addOrThrow: addOrThrow, get: get }; function empty$1() { return {}; } function addOrThrow$1(router, eventId, event, contractName, isWildcard, eventName, chain) { let group = router[eventId]; let group$1; if (group !== undefined) { group$1 = group; } else { let group$2 = { wildcard: undefined, byContractName: {} }; router[eventId] = group$2; group$1 = group$2; } try { return addOrThrow(group$1, event, contractName, isWildcard); } catch (raw_exn) { let exn = Primitive_exceptions.internalToException(raw_exn); if (exn.RE_EXN_ID === EventDuplicate) { return Stdlib_JsError.throwWithMessage(`Duplicate event detected: ` + eventName + ` for contract ` + contractName + ` on chain ` + ChainMap.Chain.toString(chain)); } if (exn.RE_EXN_ID === WildcardCollision) { return Stdlib_JsError.throwWithMessage(`Another event is already registered with the same signature that would interfer with wildcard filtering: ` + eventName + ` for contract ` + contractName + ` on chain ` + ChainMap.Chain.toString(chain)); } throw exn; } } function get$1(router, tag, contractAddress, blockNumber, indexingAddresses) { let group = router[tag]; if (group !== undefined) { return get(group, contractAddress, blockNumber, indexingAddresses); } } function getEvmEventId(sighash, topicCount) { return sighash + "_" + topicCount.toString(); } function fromEvmEventModsOrThrow(events, chain) { let router = {}; events.forEach(config => addOrThrow$1(router, config.id, config, config.contractName, config.isWildcard, config.name, chain)); return router; } function getSvmEventId(programId, discriminator) { if (discriminator !== undefined) { return programId + "_" + discriminator; } else { return programId + "_none"; } } function fromSvmEventConfigsOrThrow(events, chain) { let router = {}; events.forEach(config => { let routerTag = getSvmEventId(config.programId, config.discriminator); addOrThrow$1(router, routerTag, config, config.contractName, config.isWildcard, config.name, chain); }); let byProgram = {}; events.forEach(config => { let key = config.programId; let s = byProgram[key]; let set; if (s !== undefined) { set = Primitive_option.valFromOption(s); } else { let s$1 = new Set(); byProgram[key] = s$1; set = s$1; } set.add(config.discriminatorByteLen); }); let ordering = Object.entries(byProgram).map(param => { let sorted = Array.from(param[1]).toSorted((a, b) => b - a | 0); return { programId: param[0], byteLengthsDesc: sorted }; }); return [ router, ordering ]; } export { EventDuplicate, WildcardCollision, Group, empty$1 as empty, addOrThrow$1 as addOrThrow, get$1 as get, getEvmEventId, fromEvmEventModsOrThrow, getSvmEventId, fromSvmEventConfigsOrThrow, } /* ChainMap Not a pure module */