envio 3.3.0-alpha.1 → 3.3.0-alpha.10

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 (136) hide show
  1. package/evm.schema.json +10 -0
  2. package/index.d.ts +45 -25
  3. package/package.json +7 -7
  4. package/src/Address.res +5 -2
  5. package/src/Address.res.mjs +3 -1
  6. package/src/Api.res +1 -1
  7. package/src/Api.res.mjs +1 -1
  8. package/src/Batch.res +0 -6
  9. package/src/Batch.res.mjs +1 -12
  10. package/src/BatchProcessing.res +7 -12
  11. package/src/BatchProcessing.res.mjs +8 -7
  12. package/src/Bin.res +3 -0
  13. package/src/Bin.res.mjs +4 -0
  14. package/src/ChainFetching.res +43 -9
  15. package/src/ChainFetching.res.mjs +34 -15
  16. package/src/ChainMetadata.res +1 -11
  17. package/src/ChainMetadata.res.mjs +1 -10
  18. package/src/ChainState.res +605 -151
  19. package/src/ChainState.res.mjs +427 -104
  20. package/src/ChainState.resi +72 -4
  21. package/src/Config.res +61 -33
  22. package/src/Config.res.mjs +50 -10
  23. package/src/ContractRegisterContext.res +2 -12
  24. package/src/ContractRegisterContext.res.mjs +3 -5
  25. package/src/Core.res +14 -3
  26. package/src/CrossChainState.res +113 -89
  27. package/src/CrossChainState.res.mjs +64 -60
  28. package/src/CrossChainState.resi +1 -1
  29. package/src/Ecosystem.res +5 -6
  30. package/src/Ecosystem.res.mjs +3 -3
  31. package/src/Envio.res +17 -11
  32. package/src/EnvioGlobal.res +53 -0
  33. package/src/EnvioGlobal.res.mjs +31 -0
  34. package/src/EventConfigBuilder.res +177 -88
  35. package/src/EventConfigBuilder.res.mjs +99 -42
  36. package/src/EventProcessing.res +74 -28
  37. package/src/EventProcessing.res.mjs +55 -29
  38. package/src/ExitOnCaughtUp.res +10 -2
  39. package/src/ExitOnCaughtUp.res.mjs +10 -1
  40. package/src/FetchState.res +544 -356
  41. package/src/FetchState.res.mjs +412 -471
  42. package/src/HandlerLoader.res +8 -104
  43. package/src/HandlerLoader.res.mjs +2 -81
  44. package/src/HandlerRegister.res +518 -144
  45. package/src/HandlerRegister.res.mjs +285 -133
  46. package/src/HandlerRegister.resi +24 -8
  47. package/src/IndexerState.res +10 -3
  48. package/src/IndexerState.res.mjs +11 -4
  49. package/src/IndexerState.resi +2 -1
  50. package/src/IndexingAddresses.res +108 -0
  51. package/src/IndexingAddresses.res.mjs +101 -0
  52. package/src/IndexingAddresses.resi +34 -0
  53. package/src/Internal.res +155 -46
  54. package/src/Internal.res.mjs +30 -2
  55. package/src/LoadLayer.res +5 -5
  56. package/src/LoadLayer.res.mjs +6 -6
  57. package/src/LogSelection.res +102 -165
  58. package/src/LogSelection.res.mjs +101 -116
  59. package/src/Main.res +71 -236
  60. package/src/Main.res.mjs +60 -145
  61. package/src/Metrics.res +74 -0
  62. package/src/Metrics.res.mjs +75 -0
  63. package/src/PgStorage.res +4 -4
  64. package/src/PgStorage.res.mjs +5 -5
  65. package/src/Prometheus.res +10 -63
  66. package/src/Prometheus.res.mjs +124 -171
  67. package/src/PruneStaleHistory.res +2 -2
  68. package/src/PruneStaleHistory.res.mjs +3 -3
  69. package/src/RawEvent.res +7 -2
  70. package/src/RawEvent.res.mjs +4 -4
  71. package/src/Rollback.res +3 -3
  72. package/src/Rollback.res.mjs +4 -4
  73. package/src/RollbackCommit.res +4 -1
  74. package/src/RollbackCommit.res.mjs +3 -2
  75. package/src/SimulateDeadInputTracker.res +85 -0
  76. package/src/SimulateDeadInputTracker.res.mjs +73 -0
  77. package/src/SimulateDeadInputTracker.resi +12 -0
  78. package/src/SimulateItems.res +91 -23
  79. package/src/SimulateItems.res.mjs +55 -32
  80. package/src/TestIndexer.res +54 -40
  81. package/src/TestIndexer.res.mjs +37 -30
  82. package/src/bindings/Performance.res +7 -0
  83. package/src/bindings/Performance.res.mjs +21 -0
  84. package/src/bindings/Performance.resi +7 -0
  85. package/src/bindings/Viem.res +0 -41
  86. package/src/bindings/Viem.res.mjs +1 -43
  87. package/src/sources/BlockStore.res +46 -0
  88. package/src/sources/BlockStore.res.mjs +24 -0
  89. package/src/sources/EventRouter.res +36 -33
  90. package/src/sources/EventRouter.res.mjs +13 -14
  91. package/src/sources/Evm.res +83 -72
  92. package/src/sources/Evm.res.mjs +53 -69
  93. package/src/sources/EvmChain.res +18 -20
  94. package/src/sources/EvmChain.res.mjs +15 -15
  95. package/src/sources/EvmRpcClient.res +74 -5
  96. package/src/sources/EvmRpcClient.res.mjs +13 -4
  97. package/src/sources/FieldMask.res +39 -0
  98. package/src/sources/FieldMask.res.mjs +42 -0
  99. package/src/sources/Fuel.res +9 -6
  100. package/src/sources/Fuel.res.mjs +5 -10
  101. package/src/sources/HyperFuelSource.res +46 -50
  102. package/src/sources/HyperFuelSource.res.mjs +64 -54
  103. package/src/sources/HyperSync.res +39 -7
  104. package/src/sources/HyperSync.res.mjs +57 -37
  105. package/src/sources/HyperSync.resi +12 -2
  106. package/src/sources/HyperSyncClient.res +22 -111
  107. package/src/sources/HyperSyncClient.res.mjs +2 -30
  108. package/src/sources/HyperSyncHeightStream.res +1 -8
  109. package/src/sources/HyperSyncHeightStream.res.mjs +0 -2
  110. package/src/sources/HyperSyncSource.res +94 -107
  111. package/src/sources/HyperSyncSource.res.mjs +82 -86
  112. package/src/sources/Rpc.res +15 -47
  113. package/src/sources/Rpc.res.mjs +25 -56
  114. package/src/sources/RpcSource.res +320 -467
  115. package/src/sources/RpcSource.res.mjs +268 -385
  116. package/src/sources/RpcWebSocketHeightStream.res +0 -5
  117. package/src/sources/RpcWebSocketHeightStream.res.mjs +0 -2
  118. package/src/sources/SimulateSource.res +10 -4
  119. package/src/sources/SimulateSource.res.mjs +16 -6
  120. package/src/sources/Source.res +34 -6
  121. package/src/sources/SourceManager.res +77 -19
  122. package/src/sources/SourceManager.res.mjs +63 -21
  123. package/src/sources/SourceManager.resi +10 -0
  124. package/src/sources/Svm.res +31 -16
  125. package/src/sources/Svm.res.mjs +36 -13
  126. package/src/sources/SvmHyperSyncClient.res +5 -32
  127. package/src/sources/SvmHyperSyncSource.res +159 -134
  128. package/src/sources/SvmHyperSyncSource.res.mjs +164 -129
  129. package/src/sources/TransactionStore.res +49 -0
  130. package/src/sources/TransactionStore.res.mjs +30 -0
  131. package/src/tui/Tui.res +13 -16
  132. package/src/tui/Tui.res.mjs +12 -14
  133. package/svm.schema.json +49 -37
  134. package/src/bindings/Hrtime.res +0 -58
  135. package/src/bindings/Hrtime.res.mjs +0 -90
  136. 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 */