envio 3.3.0-alpha.7 → 3.3.0-alpha.9

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.
Files changed (95) hide show
  1. package/index.d.ts +23 -5
  2. package/package.json +6 -6
  3. package/src/Api.res +1 -1
  4. package/src/Api.res.mjs +1 -1
  5. package/src/ChainFetching.res +21 -10
  6. package/src/ChainFetching.res.mjs +11 -10
  7. package/src/ChainState.res +401 -171
  8. package/src/ChainState.res.mjs +270 -104
  9. package/src/ChainState.resi +19 -7
  10. package/src/Config.res +11 -27
  11. package/src/Config.res.mjs +8 -7
  12. package/src/Core.res +7 -0
  13. package/src/CrossChainState.res +82 -82
  14. package/src/CrossChainState.res.mjs +52 -59
  15. package/src/CrossChainState.resi +1 -1
  16. package/src/Ecosystem.res +3 -3
  17. package/src/Ecosystem.res.mjs +3 -3
  18. package/src/Envio.res +14 -9
  19. package/src/EnvioGlobal.res +53 -0
  20. package/src/EnvioGlobal.res.mjs +31 -0
  21. package/src/EventConfigBuilder.res +117 -69
  22. package/src/EventConfigBuilder.res.mjs +71 -34
  23. package/src/EventProcessing.res +19 -15
  24. package/src/EventProcessing.res.mjs +13 -12
  25. package/src/FetchState.res +410 -185
  26. package/src/FetchState.res.mjs +268 -253
  27. package/src/HandlerLoader.res +8 -113
  28. package/src/HandlerLoader.res.mjs +2 -88
  29. package/src/HandlerRegister.res +518 -144
  30. package/src/HandlerRegister.res.mjs +285 -133
  31. package/src/HandlerRegister.resi +24 -8
  32. package/src/IndexerState.res +6 -3
  33. package/src/IndexerState.res.mjs +3 -3
  34. package/src/IndexerState.resi +1 -1
  35. package/src/IndexingAddresses.res +10 -7
  36. package/src/IndexingAddresses.res.mjs +8 -7
  37. package/src/IndexingAddresses.resi +3 -1
  38. package/src/Internal.res +104 -39
  39. package/src/Internal.res.mjs +11 -1
  40. package/src/LogSelection.res +102 -165
  41. package/src/LogSelection.res.mjs +101 -116
  42. package/src/Main.res +49 -164
  43. package/src/Main.res.mjs +39 -104
  44. package/src/Metrics.res +43 -2
  45. package/src/Metrics.res.mjs +39 -3
  46. package/src/Prometheus.res +0 -35
  47. package/src/Prometheus.res.mjs +33 -68
  48. package/src/RawEvent.res +7 -2
  49. package/src/RawEvent.res.mjs +4 -4
  50. package/src/RollbackCommit.res +4 -1
  51. package/src/RollbackCommit.res.mjs +3 -2
  52. package/src/SimulateItems.res +20 -7
  53. package/src/SimulateItems.res.mjs +7 -11
  54. package/src/TestIndexer.res +1 -1
  55. package/src/TestIndexer.res.mjs +1 -1
  56. package/src/sources/BlockStore.res +46 -0
  57. package/src/sources/BlockStore.res.mjs +24 -0
  58. package/src/sources/EventRouter.res +19 -12
  59. package/src/sources/EventRouter.res.mjs +7 -5
  60. package/src/sources/Evm.res +58 -5
  61. package/src/sources/Evm.res.mjs +44 -5
  62. package/src/sources/EvmChain.res +14 -18
  63. package/src/sources/EvmChain.res.mjs +12 -13
  64. package/src/sources/FieldMask.res +39 -0
  65. package/src/sources/FieldMask.res.mjs +42 -0
  66. package/src/sources/Fuel.res +8 -3
  67. package/src/sources/Fuel.res.mjs +5 -4
  68. package/src/sources/HyperFuelSource.res +31 -40
  69. package/src/sources/HyperFuelSource.res.mjs +52 -44
  70. package/src/sources/HyperSync.res +31 -9
  71. package/src/sources/HyperSync.res.mjs +47 -31
  72. package/src/sources/HyperSync.resi +10 -3
  73. package/src/sources/HyperSyncClient.res +15 -4
  74. package/src/sources/HyperSyncHeightStream.res +1 -8
  75. package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
  76. package/src/sources/HyperSyncSource.res +58 -90
  77. package/src/sources/HyperSyncSource.res.mjs +57 -66
  78. package/src/sources/RpcSource.res +118 -120
  79. package/src/sources/RpcSource.res.mjs +92 -74
  80. package/src/sources/RpcWebSocketHeightStream.res +0 -5
  81. package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
  82. package/src/sources/SimulateSource.res +5 -3
  83. package/src/sources/SimulateSource.res.mjs +12 -4
  84. package/src/sources/Source.res +19 -5
  85. package/src/sources/SourceManager.res +60 -10
  86. package/src/sources/SourceManager.res.mjs +54 -8
  87. package/src/sources/SourceManager.resi +10 -0
  88. package/src/sources/Svm.res +14 -10
  89. package/src/sources/Svm.res.mjs +23 -6
  90. package/src/sources/SvmHyperSyncClient.res +5 -6
  91. package/src/sources/SvmHyperSyncSource.res +82 -41
  92. package/src/sources/SvmHyperSyncSource.res.mjs +86 -41
  93. package/src/sources/TransactionStore.res +6 -107
  94. package/src/sources/TransactionStore.res.mjs +5 -86
  95. package/svm.schema.json +19 -0
@@ -72,117 +72,13 @@ let autoLoadFromSrcHandlers = async (~handlers: string) => {
72
72
  ->Promise.all
73
73
  }
74
74
 
75
- // EVM re-runs `parseEventFiltersOrThrow` with the registered `where:` JSON so
76
- // per-event filters propagate into `getEventFiltersOrThrow` / `filterByAddresses`
77
- // — which is why `evmEventConfig` has to retain `sighash` and `indexedParams`.
78
- // `dependsOnAddresses` is routed through `Internal.dependsOnAddresses` so the
79
- // formula stays in sync with `EventConfigBuilder.build{Evm,Fuel}EventConfig`.
80
- let applyRegistrations = (~config: Config.t): Config.t => {
81
- let newChainMap = config.chainMap->ChainMap.map(chain => {
82
- let newContracts = chain.contracts->Array.map(contract => {
83
- let newEvents = contract.events->Array.map(
84
- ev => {
85
- let isWildcard = HandlerRegister.isWildcard(
86
- ~contractName=ev.contractName,
87
- ~eventName=ev.name,
88
- )
89
- let handler = HandlerRegister.getHandler(
90
- ~contractName=ev.contractName,
91
- ~eventName=ev.name,
92
- )
93
- let contractRegister = HandlerRegister.getContractRegister(
94
- ~contractName=ev.contractName,
95
- ~eventName=ev.name,
96
- )
97
- switch config.ecosystem.name {
98
- | Fuel =>
99
- let fuelEv = ev->(Utils.magic: Internal.eventConfig => Internal.fuelEventConfig)
100
-
101
- ({
102
- ...fuelEv,
103
- isWildcard,
104
- handler,
105
- contractRegister,
106
- clientAddressFilter: ?EventConfigBuilder.buildAddressFilter([], ~isWildcard),
107
- dependsOnAddresses: Internal.dependsOnAddresses(
108
- ~isWildcard,
109
- ~filterByAddresses=false,
110
- ),
111
- } :> Internal.eventConfig)
112
- | Evm =>
113
- let evmEv = ev->(Utils.magic: Internal.eventConfig => Internal.evmEventConfig)
114
- let eventFilters = HandlerRegister.getOnEventWhere(
115
- ~contractName=ev.contractName,
116
- ~eventName=ev.name,
117
- )
118
- let indexedParams = evmEv.paramsMetadata->Array.filter(p => p.indexed)
119
- let {
120
- getEventFiltersOrThrow,
121
- filterByAddresses,
122
- addressFilterParamGroups,
123
- } = LogSelection.parseEventFiltersOrThrow(
124
- ~eventFilters,
125
- ~sighash=evmEv.sighash,
126
- ~params=indexedParams->Array.map(p => p.name),
127
- ~contractName=ev.contractName,
128
- ~probeChainId=chain.id,
129
- ~onEventBlockFilterSchema=config.ecosystem.onEventBlockFilterSchema,
130
- ~topic1=?indexedParams
131
- ->Array.get(0)
132
- ->Option.map(EventConfigBuilder.buildTopicGetter),
133
- ~topic2=?indexedParams
134
- ->Array.get(1)
135
- ->Option.map(EventConfigBuilder.buildTopicGetter),
136
- ~topic3=?indexedParams
137
- ->Array.get(2)
138
- ->Option.map(EventConfigBuilder.buildTopicGetter),
139
- )
140
-
141
- ({
142
- ...evmEv,
143
- isWildcard,
144
- handler,
145
- contractRegister,
146
- getEventFiltersOrThrow,
147
- filterByAddresses,
148
- clientAddressFilter: ?EventConfigBuilder.buildAddressFilter(
149
- addressFilterParamGroups,
150
- ~isWildcard,
151
- ),
152
- dependsOnAddresses: Internal.dependsOnAddresses(~isWildcard, ~filterByAddresses),
153
- } :> Internal.eventConfig)
154
- | Svm =>
155
- let svmEv =
156
- ev->(Utils.magic: Internal.eventConfig => Internal.svmInstructionEventConfig)
157
- ({
158
- ...svmEv,
159
- isWildcard,
160
- handler,
161
- contractRegister,
162
- clientAddressFilter: ?EventConfigBuilder.buildAddressFilter(
163
- [],
164
- ~isWildcard,
165
- ~srcAddressExpr="event.programId",
166
- ),
167
- dependsOnAddresses: Internal.dependsOnAddresses(
168
- ~isWildcard,
169
- ~filterByAddresses=false,
170
- ),
171
- } :> Internal.eventConfig)
172
- }
173
- },
174
- )
175
- {...contract, events: newEvents}
176
- })
177
- {...chain, contracts: newContracts}
178
- })
179
- {...config, chainMap: newChainMap}
180
- }
181
-
182
- // `Config` never reads `HandlerRegister`. The only way to get a config that
183
- // reflects registration state is through the returned value here.
184
- let registerAllHandlers = async (~config: Config.t) => {
185
- HandlerRegister.startRegistration(~ecosystem=config.ecosystem)
75
+ // `Config` holds only event definitions; handler + per-chain `where`
76
+ // registration state is layered on separately as `onEventRegistration`s by
77
+ // `HandlerRegister.finishRegistration`. This loads the user handler files
78
+ // (populating the global `HandlerRegister` registry as a side effect) and
79
+ // returns the resulting per-chain registrations.
80
+ let registerAllHandlers = async (~config: Config.t): HandlerRegister.registrationsByChainId => {
81
+ HandlerRegister.startRegistration(~config)
186
82
 
187
83
  // Auto-load all .js files from src/handlers directory
188
84
  await autoLoadFromSrcHandlers(~handlers=config.handlers)
@@ -194,6 +90,5 @@ let registerAllHandlers = async (~config: Config.t) => {
194
90
  })
195
91
  ->Promise.all
196
92
 
197
- let registrations = HandlerRegister.finishRegistration()
198
- (applyRegistrations(~config), registrations)
93
+ HandlerRegister.finishRegistration(~config)
199
94
  }
@@ -5,16 +5,11 @@ import * as Path from "path";
5
5
  import * as Utils from "./Utils.res.mjs";
6
6
  import * as Logging from "./Logging.res.mjs";
7
7
  import * as Process from "process";
8
- import * as ChainMap from "./ChainMap.res.mjs";
9
- import * as Internal from "./Internal.res.mjs";
10
8
  import * as Nodemodule from "node:module";
11
- import * as LogSelection from "./LogSelection.res.mjs";
12
- import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
13
9
  import * as Stdlib_JsError from "@rescript/runtime/lib/es6/Stdlib_JsError.js";
14
10
  import * as Stdlib_Promise from "@rescript/runtime/lib/es6/Stdlib_Promise.js";
15
11
  import * as HandlerRegister from "./HandlerRegister.res.mjs";
16
12
  import * as Promises from "node:fs/promises";
17
- import * as EventConfigBuilder from "./EventConfigBuilder.res.mjs";
18
13
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
19
14
 
20
15
  try {
@@ -61,98 +56,17 @@ async function autoLoadFromSrcHandlers(handlers) {
61
56
  })));
62
57
  }
63
58
 
64
- function applyRegistrations(config) {
65
- let newChainMap = ChainMap.map(config.chainMap, chain => {
66
- let newContracts = chain.contracts.map(contract => {
67
- let newEvents = contract.events.map(ev => {
68
- let isWildcard = HandlerRegister.isWildcard(ev.contractName, ev.name);
69
- let handler = HandlerRegister.getHandler(ev.contractName, ev.name);
70
- let contractRegister = HandlerRegister.getContractRegister(ev.contractName, ev.name);
71
- let match = config.ecosystem.name;
72
- switch (match) {
73
- case "evm" :
74
- let eventFilters = HandlerRegister.getOnEventWhere(ev.contractName, ev.name);
75
- let indexedParams = ev.paramsMetadata.filter(p => p.indexed);
76
- let match$1 = LogSelection.parseEventFiltersOrThrow(eventFilters, ev.sighash, indexedParams.map(p => p.name), ev.contractName, chain.id, config.ecosystem.onEventBlockFilterSchema, Stdlib_Option.map(indexedParams[0], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(indexedParams[1], EventConfigBuilder.buildTopicGetter), Stdlib_Option.map(indexedParams[2], EventConfigBuilder.buildTopicGetter));
77
- let filterByAddresses = match$1.filterByAddresses;
78
- let newrecord = {...ev};
79
- newrecord.getEventFiltersOrThrow = match$1.getEventFiltersOrThrow;
80
- newrecord.contractRegister = contractRegister;
81
- newrecord.handler = handler;
82
- newrecord.clientAddressFilter = EventConfigBuilder.buildAddressFilter(match$1.addressFilterParamGroups, isWildcard, undefined);
83
- newrecord.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, filterByAddresses);
84
- newrecord.filterByAddresses = filterByAddresses;
85
- newrecord.isWildcard = isWildcard;
86
- return newrecord;
87
- case "fuel" :
88
- let newrecord$1 = {...ev};
89
- newrecord$1.contractRegister = contractRegister;
90
- newrecord$1.handler = handler;
91
- newrecord$1.clientAddressFilter = EventConfigBuilder.buildAddressFilter([], isWildcard, undefined);
92
- newrecord$1.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, false);
93
- newrecord$1.isWildcard = isWildcard;
94
- return newrecord$1;
95
- case "svm" :
96
- let newrecord$2 = {...ev};
97
- newrecord$2.contractRegister = contractRegister;
98
- newrecord$2.handler = handler;
99
- newrecord$2.clientAddressFilter = EventConfigBuilder.buildAddressFilter([], isWildcard, "event.programId");
100
- newrecord$2.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, false);
101
- newrecord$2.isWildcard = isWildcard;
102
- return newrecord$2;
103
- }
104
- });
105
- return {
106
- name: contract.name,
107
- abi: contract.abi,
108
- addresses: contract.addresses,
109
- events: newEvents,
110
- startBlock: contract.startBlock
111
- };
112
- });
113
- let newrecord = {...chain};
114
- newrecord.contracts = newContracts;
115
- return newrecord;
116
- });
117
- return {
118
- name: config.name,
119
- description: config.description,
120
- handlers: config.handlers,
121
- contractHandlers: config.contractHandlers,
122
- shouldRollbackOnReorg: config.shouldRollbackOnReorg,
123
- shouldSaveFullHistory: config.shouldSaveFullHistory,
124
- storage: config.storage,
125
- chainMap: newChainMap,
126
- defaultChain: config.defaultChain,
127
- ecosystem: config.ecosystem,
128
- enableRawEvents: config.enableRawEvents,
129
- maxAddrInPartition: config.maxAddrInPartition,
130
- batchSize: config.batchSize,
131
- lowercaseAddresses: config.lowercaseAddresses,
132
- isDev: config.isDev,
133
- userEntitiesByName: config.userEntitiesByName,
134
- userEntities: config.userEntities,
135
- allEntities: config.allEntities,
136
- allEnums: config.allEnums
137
- };
138
- }
139
-
140
59
  async function registerAllHandlers(config) {
141
- HandlerRegister.startRegistration(config.ecosystem);
60
+ HandlerRegister.startRegistration(config);
142
61
  await autoLoadFromSrcHandlers(config.handlers);
143
62
  await Promise.all(config.contractHandlers.map(param => registerContractHandlers(param.name, param.handler)));
144
- let registrations = HandlerRegister.finishRegistration();
145
- return [
146
- applyRegistrations(config),
147
- registrations
148
- ];
63
+ return HandlerRegister.finishRegistration(config);
149
64
  }
150
65
 
151
66
  export {
152
67
  toImportUrl,
153
68
  registerContractHandlers,
154
69
  autoLoadFromSrcHandlers,
155
- applyRegistrations,
156
70
  registerAllHandlers,
157
71
  }
158
72
  /* Not a pure module */