envio 3.3.0-alpha.1 → 3.3.0-alpha.11

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 (143) hide show
  1. package/evm.schema.json +10 -0
  2. package/index.d.ts +45 -25
  3. package/licenses/CLA.md +35 -0
  4. package/licenses/EULA.md +67 -0
  5. package/licenses/LICENSE.md +45 -0
  6. package/licenses/README.md +35 -0
  7. package/package.json +10 -9
  8. package/src/Address.res +5 -2
  9. package/src/Address.res.mjs +3 -1
  10. package/src/Api.res +1 -1
  11. package/src/Api.res.mjs +1 -1
  12. package/src/Batch.res +0 -6
  13. package/src/Batch.res.mjs +1 -12
  14. package/src/BatchProcessing.res +7 -12
  15. package/src/BatchProcessing.res.mjs +8 -7
  16. package/src/Bin.res +3 -0
  17. package/src/Bin.res.mjs +4 -0
  18. package/src/ChainFetching.res +53 -16
  19. package/src/ChainFetching.res.mjs +37 -19
  20. package/src/ChainMetadata.res +1 -11
  21. package/src/ChainMetadata.res.mjs +1 -10
  22. package/src/ChainState.res +630 -161
  23. package/src/ChainState.res.mjs +438 -101
  24. package/src/ChainState.resi +77 -4
  25. package/src/Config.res +70 -38
  26. package/src/Config.res.mjs +52 -12
  27. package/src/ContractRegisterContext.res +2 -12
  28. package/src/ContractRegisterContext.res.mjs +3 -5
  29. package/src/Core.res +34 -3
  30. package/src/Core.res.mjs +12 -0
  31. package/src/CrossChainState.res +130 -89
  32. package/src/CrossChainState.res.mjs +66 -61
  33. package/src/CrossChainState.resi +1 -1
  34. package/src/Ecosystem.res +5 -6
  35. package/src/Ecosystem.res.mjs +3 -3
  36. package/src/Envio.res +17 -11
  37. package/src/EnvioGlobal.res +53 -0
  38. package/src/EnvioGlobal.res.mjs +31 -0
  39. package/src/EventConfigBuilder.res +191 -127
  40. package/src/EventConfigBuilder.res.mjs +116 -66
  41. package/src/EventProcessing.res +77 -28
  42. package/src/EventProcessing.res.mjs +56 -29
  43. package/src/ExitOnCaughtUp.res +10 -2
  44. package/src/ExitOnCaughtUp.res.mjs +10 -1
  45. package/src/FetchState.res +684 -415
  46. package/src/FetchState.res.mjs +505 -486
  47. package/src/HandlerLoader.res +8 -104
  48. package/src/HandlerLoader.res.mjs +2 -81
  49. package/src/HandlerRegister.res +520 -144
  50. package/src/HandlerRegister.res.mjs +286 -133
  51. package/src/HandlerRegister.resi +24 -8
  52. package/src/IndexerState.res +10 -3
  53. package/src/IndexerState.res.mjs +11 -4
  54. package/src/IndexerState.resi +2 -1
  55. package/src/IndexingAddresses.res +108 -0
  56. package/src/IndexingAddresses.res.mjs +101 -0
  57. package/src/IndexingAddresses.resi +34 -0
  58. package/src/Internal.res +166 -48
  59. package/src/Internal.res.mjs +30 -2
  60. package/src/LoadLayer.res +5 -5
  61. package/src/LoadLayer.res.mjs +6 -6
  62. package/src/LogSelection.res +92 -217
  63. package/src/LogSelection.res.mjs +95 -184
  64. package/src/Main.res +71 -236
  65. package/src/Main.res.mjs +60 -145
  66. package/src/Metrics.res +74 -0
  67. package/src/Metrics.res.mjs +75 -0
  68. package/src/PgStorage.res +4 -4
  69. package/src/PgStorage.res.mjs +5 -5
  70. package/src/Prometheus.res +10 -63
  71. package/src/Prometheus.res.mjs +124 -171
  72. package/src/PruneStaleHistory.res +2 -2
  73. package/src/PruneStaleHistory.res.mjs +3 -3
  74. package/src/RawEvent.res +7 -2
  75. package/src/RawEvent.res.mjs +4 -4
  76. package/src/Rollback.res +3 -3
  77. package/src/Rollback.res.mjs +4 -4
  78. package/src/RollbackCommit.res +4 -1
  79. package/src/RollbackCommit.res.mjs +3 -2
  80. package/src/SimulateDeadInputTracker.res +85 -0
  81. package/src/SimulateDeadInputTracker.res.mjs +73 -0
  82. package/src/SimulateDeadInputTracker.resi +12 -0
  83. package/src/SimulateItems.res +128 -28
  84. package/src/SimulateItems.res.mjs +82 -40
  85. package/src/TestIndexer.res +55 -41
  86. package/src/TestIndexer.res.mjs +39 -32
  87. package/src/TopicFilter.res +1 -25
  88. package/src/TopicFilter.res.mjs +0 -74
  89. package/src/bindings/Performance.res +7 -0
  90. package/src/bindings/Performance.res.mjs +21 -0
  91. package/src/bindings/Performance.resi +7 -0
  92. package/src/bindings/Viem.res +0 -46
  93. package/src/bindings/Viem.res.mjs +1 -43
  94. package/src/sources/BlockStore.res +46 -0
  95. package/src/sources/BlockStore.res.mjs +24 -0
  96. package/src/sources/EventRouter.res +31 -49
  97. package/src/sources/EventRouter.res.mjs +12 -25
  98. package/src/sources/Evm.res +83 -72
  99. package/src/sources/Evm.res.mjs +53 -69
  100. package/src/sources/EvmChain.res +7 -34
  101. package/src/sources/EvmChain.res.mjs +6 -27
  102. package/src/sources/EvmRpcClient.res +71 -5
  103. package/src/sources/EvmRpcClient.res.mjs +13 -4
  104. package/src/sources/FieldMask.res +39 -0
  105. package/src/sources/FieldMask.res.mjs +42 -0
  106. package/src/sources/Fuel.res +9 -6
  107. package/src/sources/Fuel.res.mjs +5 -10
  108. package/src/sources/HyperFuelSource.res +46 -50
  109. package/src/sources/HyperFuelSource.res.mjs +64 -54
  110. package/src/sources/HyperSync.res +45 -42
  111. package/src/sources/HyperSync.res.mjs +68 -60
  112. package/src/sources/HyperSync.resi +14 -4
  113. package/src/sources/HyperSyncClient.res +107 -119
  114. package/src/sources/HyperSyncClient.res.mjs +36 -31
  115. package/src/sources/HyperSyncHeightStream.res +1 -8
  116. package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
  117. package/src/sources/HyperSyncSource.res +60 -254
  118. package/src/sources/HyperSyncSource.res.mjs +57 -180
  119. package/src/sources/Rpc.res +15 -79
  120. package/src/sources/Rpc.res.mjs +25 -101
  121. package/src/sources/RpcSource.res +221 -514
  122. package/src/sources/RpcSource.res.mjs +216 -411
  123. package/src/sources/RpcWebSocketHeightStream.res +0 -5
  124. package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
  125. package/src/sources/SimulateSource.res +44 -20
  126. package/src/sources/SimulateSource.res.mjs +41 -14
  127. package/src/sources/Source.res +34 -6
  128. package/src/sources/SourceManager.res +77 -19
  129. package/src/sources/SourceManager.res.mjs +63 -21
  130. package/src/sources/SourceManager.resi +10 -0
  131. package/src/sources/Svm.res +31 -16
  132. package/src/sources/Svm.res.mjs +36 -13
  133. package/src/sources/SvmHyperSyncClient.res +5 -32
  134. package/src/sources/SvmHyperSyncSource.res +159 -134
  135. package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
  136. package/src/sources/TransactionStore.res +49 -0
  137. package/src/sources/TransactionStore.res.mjs +30 -0
  138. package/src/tui/Tui.res +13 -16
  139. package/src/tui/Tui.res.mjs +12 -14
  140. package/svm.schema.json +49 -37
  141. package/src/bindings/Hrtime.res +0 -58
  142. package/src/bindings/Hrtime.res.mjs +0 -90
  143. package/src/bindings/Hrtime.resi +0 -30
@@ -72,108 +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
- dependsOnAddresses: Internal.dependsOnAddresses(
107
- ~isWildcard,
108
- ~filterByAddresses=false,
109
- ),
110
- } :> Internal.eventConfig)
111
- | Evm =>
112
- let evmEv = ev->(Utils.magic: Internal.eventConfig => Internal.evmEventConfig)
113
- let eventFilters = HandlerRegister.getOnEventWhere(
114
- ~contractName=ev.contractName,
115
- ~eventName=ev.name,
116
- )
117
- let indexedParams = evmEv.paramsMetadata->Array.filter(p => p.indexed)
118
- let {
119
- getEventFiltersOrThrow,
120
- filterByAddresses,
121
- addressFilterParamGroups,
122
- } = LogSelection.parseEventFiltersOrThrow(
123
- ~eventFilters,
124
- ~sighash=evmEv.sighash,
125
- ~params=indexedParams->Array.map(p => p.name),
126
- ~contractName=ev.contractName,
127
- ~probeChainId=chain.id,
128
- ~onEventBlockFilterSchema=config.ecosystem.onEventBlockFilterSchema,
129
- ~topic1=?indexedParams
130
- ->Array.get(0)
131
- ->Option.map(EventConfigBuilder.buildTopicGetter),
132
- ~topic2=?indexedParams
133
- ->Array.get(1)
134
- ->Option.map(EventConfigBuilder.buildTopicGetter),
135
- ~topic3=?indexedParams
136
- ->Array.get(2)
137
- ->Option.map(EventConfigBuilder.buildTopicGetter),
138
- )
139
-
140
- ({
141
- ...evmEv,
142
- isWildcard,
143
- handler,
144
- contractRegister,
145
- getEventFiltersOrThrow,
146
- filterByAddresses,
147
- clientAddressFilter: ?EventConfigBuilder.buildAddressFilter(addressFilterParamGroups),
148
- dependsOnAddresses: Internal.dependsOnAddresses(~isWildcard, ~filterByAddresses),
149
- } :> Internal.eventConfig)
150
- | Svm =>
151
- let svmEv =
152
- ev->(Utils.magic: Internal.eventConfig => Internal.svmInstructionEventConfig)
153
- ({
154
- ...svmEv,
155
- isWildcard,
156
- handler,
157
- contractRegister,
158
- dependsOnAddresses: Internal.dependsOnAddresses(
159
- ~isWildcard,
160
- ~filterByAddresses=false,
161
- ),
162
- } :> Internal.eventConfig)
163
- }
164
- },
165
- )
166
- {...contract, events: newEvents}
167
- })
168
- {...chain, contracts: newContracts}
169
- })
170
- {...config, chainMap: newChainMap}
171
- }
172
-
173
- // `Config` never reads `HandlerRegister`. The only way to get a config that
174
- // reflects registration state is through the returned value here.
175
- let registerAllHandlers = async (~config: Config.t) => {
176
- 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)
177
82
 
178
83
  // Auto-load all .js files from src/handlers directory
179
84
  await autoLoadFromSrcHandlers(~handlers=config.handlers)
@@ -185,6 +90,5 @@ let registerAllHandlers = async (~config: Config.t) => {
185
90
  })
186
91
  ->Promise.all
187
92
 
188
- let registrations = HandlerRegister.finishRegistration()
189
- (applyRegistrations(~config), registrations)
93
+ HandlerRegister.finishRegistration(~config)
190
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,91 +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);
83
- newrecord.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, filterByAddresses);
84
- newrecord.filterByAddresses = filterByAddresses;
85
- newrecord.isWildcard = isWildcard;
86
- return newrecord;
87
- case "fuel" :
88
- case "svm" :
89
- break;
90
- }
91
- let newrecord$1 = {...ev};
92
- newrecord$1.contractRegister = contractRegister;
93
- newrecord$1.handler = handler;
94
- newrecord$1.dependsOnAddresses = Internal.dependsOnAddresses(isWildcard, false);
95
- newrecord$1.isWildcard = isWildcard;
96
- return newrecord$1;
97
- });
98
- return {
99
- name: contract.name,
100
- abi: contract.abi,
101
- addresses: contract.addresses,
102
- events: newEvents,
103
- startBlock: contract.startBlock
104
- };
105
- });
106
- let newrecord = {...chain};
107
- newrecord.contracts = newContracts;
108
- return newrecord;
109
- });
110
- return {
111
- name: config.name,
112
- description: config.description,
113
- handlers: config.handlers,
114
- contractHandlers: config.contractHandlers,
115
- shouldRollbackOnReorg: config.shouldRollbackOnReorg,
116
- shouldSaveFullHistory: config.shouldSaveFullHistory,
117
- storage: config.storage,
118
- chainMap: newChainMap,
119
- defaultChain: config.defaultChain,
120
- ecosystem: config.ecosystem,
121
- enableRawEvents: config.enableRawEvents,
122
- maxAddrInPartition: config.maxAddrInPartition,
123
- batchSize: config.batchSize,
124
- lowercaseAddresses: config.lowercaseAddresses,
125
- isDev: config.isDev,
126
- userEntitiesByName: config.userEntitiesByName,
127
- userEntities: config.userEntities,
128
- allEntities: config.allEntities,
129
- allEnums: config.allEnums
130
- };
131
- }
132
-
133
59
  async function registerAllHandlers(config) {
134
- HandlerRegister.startRegistration(config.ecosystem);
60
+ HandlerRegister.startRegistration(config);
135
61
  await autoLoadFromSrcHandlers(config.handlers);
136
62
  await Promise.all(config.contractHandlers.map(param => registerContractHandlers(param.name, param.handler)));
137
- let registrations = HandlerRegister.finishRegistration();
138
- return [
139
- applyRegistrations(config),
140
- registrations
141
- ];
63
+ return HandlerRegister.finishRegistration(config);
142
64
  }
143
65
 
144
66
  export {
145
67
  toImportUrl,
146
68
  registerContractHandlers,
147
69
  autoLoadFromSrcHandlers,
148
- applyRegistrations,
149
70
  registerAllHandlers,
150
71
  }
151
72
  /* Not a pure module */