@opendatalabs/vana-sdk 0.1.0-alpha.d7fc764 → 0.1.0-alpha.dc68f39

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 (667) hide show
  1. package/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
  2. package/dist/browser.d.ts +4 -2
  3. package/dist/chains/definitions.cjs +9 -6
  4. package/dist/chains/definitions.cjs.map +1 -1
  5. package/dist/chains/definitions.d.ts +9 -11
  6. package/dist/chains/definitions.js +9 -6
  7. package/dist/chains/definitions.js.map +1 -1
  8. package/dist/chains/index.d.ts +5 -2
  9. package/dist/chains.browser.d.ts +8 -2
  10. package/dist/chains.d.ts +8 -2
  11. package/dist/chains.node.d.ts +8 -2
  12. package/dist/config/addresses.d.ts +8 -24
  13. package/dist/config/chains.d.ts +9 -13
  14. package/dist/config/default-services.cjs +60 -0
  15. package/dist/config/default-services.cjs.map +1 -0
  16. package/dist/config/default-services.d.ts +46 -0
  17. package/dist/config/default-services.js +33 -0
  18. package/dist/config/default-services.js.map +1 -0
  19. package/dist/config/default-services.test.d.ts +1 -0
  20. package/dist/config/features.d.ts +1 -3
  21. package/dist/config/tests/addresses.test.d.ts +1 -0
  22. package/dist/contracts/contractController.cjs +3 -3
  23. package/dist/contracts/contractController.cjs.map +1 -1
  24. package/dist/contracts/contractController.d.ts +11 -28
  25. package/dist/contracts/contractController.js +4 -7
  26. package/dist/contracts/contractController.js.map +1 -1
  27. package/dist/contracts/tests/contractController.test.d.ts +1 -0
  28. package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
  29. package/dist/controllers/base.cjs +83 -0
  30. package/dist/controllers/base.cjs.map +1 -0
  31. package/dist/controllers/base.d.ts +84 -0
  32. package/dist/controllers/base.js +59 -0
  33. package/dist/controllers/base.js.map +1 -0
  34. package/dist/controllers/data-error-handling.test.d.ts +1 -0
  35. package/dist/controllers/data.cjs +415 -172
  36. package/dist/controllers/data.cjs.map +1 -1
  37. package/dist/controllers/data.d.ts +149 -76
  38. package/dist/controllers/data.js +415 -172
  39. package/dist/controllers/data.js.map +1 -1
  40. package/dist/controllers/permissions.cjs +508 -257
  41. package/dist/controllers/permissions.cjs.map +1 -1
  42. package/dist/controllers/permissions.d.ts +1348 -25
  43. package/dist/controllers/permissions.js +508 -257
  44. package/dist/controllers/permissions.js.map +1 -1
  45. package/dist/controllers/protocol.cjs +15 -11
  46. package/dist/controllers/protocol.cjs.map +1 -1
  47. package/dist/controllers/protocol.d.ts +7 -35
  48. package/dist/controllers/protocol.js +15 -14
  49. package/dist/controllers/protocol.js.map +1 -1
  50. package/dist/controllers/schemas.cjs +69 -54
  51. package/dist/controllers/schemas.cjs.map +1 -1
  52. package/dist/controllers/schemas.d.ts +9 -36
  53. package/dist/controllers/schemas.js +69 -54
  54. package/dist/controllers/schemas.js.map +1 -1
  55. package/dist/controllers/server-additional.test.d.ts +1 -0
  56. package/dist/controllers/server.cjs +15 -10
  57. package/dist/controllers/server.cjs.map +1 -1
  58. package/dist/controllers/server.d.ts +7 -33
  59. package/dist/controllers/server.js +15 -10
  60. package/dist/controllers/server.js.map +1 -1
  61. package/dist/core/apiClient.cjs +15 -12
  62. package/dist/core/apiClient.cjs.map +1 -1
  63. package/dist/core/apiClient.d.ts +5 -9
  64. package/dist/core/apiClient.js +19 -19
  65. package/dist/core/apiClient.js.map +1 -1
  66. package/dist/core/client.cjs +7 -7
  67. package/dist/core/client.cjs.map +1 -1
  68. package/dist/core/client.d.ts +6 -9
  69. package/dist/core/client.js +7 -7
  70. package/dist/core/client.js.map +1 -1
  71. package/dist/core/core.test.d.ts +1 -0
  72. package/dist/core/generics.cjs +11 -9
  73. package/dist/core/generics.cjs.map +1 -1
  74. package/dist/core/generics.d.ts +9 -13
  75. package/dist/core/generics.js +22 -29
  76. package/dist/core/generics.js.map +1 -1
  77. package/dist/core/tests/apiClient.test.d.ts +1 -0
  78. package/dist/core/tests/client.test.d.ts +1 -0
  79. package/dist/core/tests/generics.test.d.ts +1 -0
  80. package/dist/core.cjs +114 -48
  81. package/dist/core.cjs.map +1 -1
  82. package/dist/core.d.ts +40 -65
  83. package/dist/core.js +127 -74
  84. package/dist/core.js.map +1 -1
  85. package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
  86. package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
  87. package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
  88. package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
  89. package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
  90. package/dist/crypto/ecies/__tests__/test-vectors.d.ts +2 -4
  91. package/dist/crypto/ecies/base.cjs +4 -3
  92. package/dist/crypto/ecies/base.cjs.map +1 -1
  93. package/dist/crypto/ecies/base.d.ts +2 -5
  94. package/dist/crypto/ecies/base.js +12 -15
  95. package/dist/crypto/ecies/base.js.map +1 -1
  96. package/dist/crypto/ecies/browser.cjs +2 -1
  97. package/dist/crypto/ecies/browser.cjs.map +1 -1
  98. package/dist/crypto/ecies/browser.d.ts +2 -7
  99. package/dist/crypto/ecies/browser.js +2 -1
  100. package/dist/crypto/ecies/browser.js.map +1 -1
  101. package/dist/crypto/ecies/constants.d.ts +7 -9
  102. package/dist/crypto/ecies/index.d.ts +8 -1
  103. package/dist/crypto/ecies/interface.cjs +4 -5
  104. package/dist/crypto/ecies/interface.cjs.map +1 -1
  105. package/dist/crypto/ecies/interface.d.ts +9 -11
  106. package/dist/crypto/ecies/interface.js +4 -5
  107. package/dist/crypto/ecies/interface.js.map +1 -1
  108. package/dist/crypto/ecies/node.cjs +3 -2
  109. package/dist/crypto/ecies/node.cjs.map +1 -1
  110. package/dist/crypto/ecies/node.d.ts +2 -7
  111. package/dist/crypto/ecies/node.js +11 -16
  112. package/dist/crypto/ecies/node.js.map +1 -1
  113. package/dist/crypto/ecies/test-vectors/eccrypto-vectors.json +72 -0
  114. package/dist/crypto/ecies/utils.cjs +2 -41
  115. package/dist/crypto/ecies/utils.cjs.map +1 -1
  116. package/dist/crypto/ecies/utils.d.ts +3 -40
  117. package/dist/crypto/ecies/utils.js +1 -35
  118. package/dist/crypto/ecies/utils.js.map +1 -1
  119. package/dist/crypto/services/WalletKeyEncryptionService.cjs +2 -2
  120. package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -1
  121. package/dist/crypto/services/WalletKeyEncryptionService.d.ts +3 -7
  122. package/dist/crypto/services/WalletKeyEncryptionService.js +5 -9
  123. package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -1
  124. package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
  125. package/dist/diagnostics.d.ts +1 -3
  126. package/dist/diagnostics.test.d.ts +1 -0
  127. package/dist/errors.cjs +16 -0
  128. package/dist/errors.cjs.map +1 -1
  129. package/dist/errors.d.ts +53 -15
  130. package/dist/errors.js +18 -6
  131. package/dist/errors.js.map +1 -1
  132. package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
  133. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
  134. package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
  135. package/dist/generated/abi/DATImplementation.d.ts +2 -3
  136. package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
  137. package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
  138. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
  139. package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
  140. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
  141. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
  142. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
  143. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
  144. package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
  145. package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
  146. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
  147. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
  148. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
  149. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
  150. package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
  151. package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
  152. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
  153. package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
  154. package/dist/generated/abi/DataRegistryImplementation.js +13 -0
  155. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
  156. package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
  157. package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
  158. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
  159. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
  160. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
  161. package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
  162. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
  163. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
  164. package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
  165. package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
  166. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
  167. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
  168. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
  169. package/dist/generated/abi/index.cjs +42 -0
  170. package/dist/generated/abi/index.cjs.map +1 -1
  171. package/dist/generated/abi/index.d.ts +47 -18
  172. package/dist/generated/abi/index.js +21 -0
  173. package/dist/generated/abi/index.js.map +1 -1
  174. package/dist/generated/event-types.cjs +17 -0
  175. package/dist/generated/event-types.cjs.map +1 -0
  176. package/dist/generated/event-types.d.ts +854 -0
  177. package/dist/generated/event-types.js +1 -0
  178. package/dist/generated/event-types.js.map +1 -0
  179. package/dist/generated/eventRegistry.cjs +3351 -0
  180. package/dist/generated/eventRegistry.cjs.map +1 -0
  181. package/dist/generated/eventRegistry.d.ts +14 -0
  182. package/dist/generated/eventRegistry.js +3326 -0
  183. package/dist/generated/eventRegistry.js.map +1 -0
  184. package/dist/generated/server/server-exports.d.ts +19 -21
  185. package/dist/generated/server/server.cjs.map +1 -1
  186. package/dist/generated/server/server.d.ts +113 -87
  187. package/dist/generated/subgraph.d.ts +329 -332
  188. package/dist/index.browser.d.ts +48 -73
  189. package/dist/index.browser.js +12 -0
  190. package/dist/index.browser.js.map +1 -1
  191. package/dist/index.cjs +3 -1
  192. package/dist/index.cjs.map +1 -1
  193. package/dist/index.d.ts +0 -2
  194. package/dist/index.js +3 -1
  195. package/dist/index.js.map +1 -1
  196. package/dist/index.node.cjs +9 -0
  197. package/dist/index.node.cjs.map +1 -1
  198. package/dist/index.node.d.ts +181 -64
  199. package/dist/index.node.js +10 -0
  200. package/dist/index.node.js.map +1 -1
  201. package/dist/node.d.ts +4 -2
  202. package/dist/platform/browser-only.d.ts +5 -8
  203. package/dist/platform/browser-only.test.d.ts +1 -0
  204. package/dist/platform/browser-safe.d.ts +6 -9
  205. package/dist/platform/browser-safe.test.d.ts +1 -0
  206. package/dist/platform/browser.cjs +7 -6
  207. package/dist/platform/browser.cjs.map +1 -1
  208. package/dist/platform/browser.d.ts +3 -6
  209. package/dist/platform/browser.js +19 -27
  210. package/dist/platform/browser.js.map +1 -1
  211. package/dist/platform/browser.test.d.ts +1 -0
  212. package/dist/platform/index.d.ts +11 -5
  213. package/dist/platform/interface.d.ts +6 -8
  214. package/dist/platform/node.d.ts +3 -7
  215. package/dist/platform/node.js +12 -19
  216. package/dist/platform/node.js.map +1 -1
  217. package/dist/platform/ports/openpgp-port.cjs +74 -0
  218. package/dist/platform/ports/openpgp-port.cjs.map +1 -0
  219. package/dist/platform/ports/openpgp-port.d.ts +13 -0
  220. package/dist/platform/ports/openpgp-port.js +59 -0
  221. package/dist/platform/ports/openpgp-port.js.map +1 -0
  222. package/dist/platform/ports/pgp-port.cjs +17 -0
  223. package/dist/platform/ports/pgp-port.cjs.map +1 -0
  224. package/dist/platform/ports/pgp-port.d.ts +35 -0
  225. package/dist/platform/ports/pgp-port.js +1 -0
  226. package/dist/platform/ports/pgp-port.js.map +1 -0
  227. package/dist/platform/shared/error-utils.d.ts +2 -4
  228. package/dist/platform/shared/pgp-utils.cjs +2 -2
  229. package/dist/platform/shared/pgp-utils.cjs.map +1 -1
  230. package/dist/platform/shared/pgp-utils.d.ts +3 -5
  231. package/dist/platform/shared/pgp-utils.js +2 -2
  232. package/dist/platform/shared/pgp-utils.js.map +1 -1
  233. package/dist/platform/shared/stream-utils.d.ts +1 -3
  234. package/dist/platform/utils.d.ts +6 -10
  235. package/dist/platform/utils.test.d.ts +1 -0
  236. package/dist/platform.browser.d.ts +9 -4
  237. package/dist/platform.d.ts +11 -5
  238. package/dist/platform.node.d.ts +10 -5
  239. package/dist/schemas/dataSchema.schema.json +53 -0
  240. package/dist/schemas/grantFile.schema.json +43 -0
  241. package/dist/server/handler.cjs.map +1 -1
  242. package/dist/server/handler.d.ts +8 -203
  243. package/dist/server/handler.js.map +1 -1
  244. package/dist/storage/index.d.ts +56 -10
  245. package/dist/storage/manager.cjs +6 -6
  246. package/dist/storage/manager.cjs.map +1 -1
  247. package/dist/storage/manager.d.ts +2 -5
  248. package/dist/storage/manager.js +5 -12
  249. package/dist/storage/manager.js.map +1 -1
  250. package/dist/storage/providers/callback-storage.cjs +3 -3
  251. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  252. package/dist/storage/providers/callback-storage.d.ts +3 -9
  253. package/dist/storage/providers/callback-storage.js +3 -3
  254. package/dist/storage/providers/callback-storage.js.map +1 -1
  255. package/dist/storage/providers/google-drive.cjs +2 -2
  256. package/dist/storage/providers/google-drive.cjs.map +1 -1
  257. package/dist/storage/providers/google-drive.d.ts +3 -7
  258. package/dist/storage/providers/google-drive.js +4 -7
  259. package/dist/storage/providers/google-drive.js.map +1 -1
  260. package/dist/storage/providers/google-drive.test.d.ts +1 -0
  261. package/dist/storage/providers/ipfs.cjs +5 -5
  262. package/dist/storage/providers/ipfs.cjs.map +1 -1
  263. package/dist/storage/providers/ipfs.d.ts +3 -6
  264. package/dist/storage/providers/ipfs.js +7 -10
  265. package/dist/storage/providers/ipfs.js.map +1 -1
  266. package/dist/storage/providers/pinata.cjs +6 -6
  267. package/dist/storage/providers/pinata.cjs.map +1 -1
  268. package/dist/storage/providers/pinata.d.ts +5 -8
  269. package/dist/storage/providers/pinata.js +8 -11
  270. package/dist/storage/providers/pinata.js.map +1 -1
  271. package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
  272. package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
  273. package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
  274. package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
  275. package/dist/storage/tests/storageManager.test.d.ts +1 -0
  276. package/dist/tests/abi.test.d.ts +1 -0
  277. package/dist/tests/chains-definitions.test.d.ts +1 -0
  278. package/dist/tests/core-encryption.test.d.ts +1 -0
  279. package/dist/tests/core-extended.test.d.ts +1 -0
  280. package/dist/tests/core-generics-coverage.test.d.ts +1 -0
  281. package/dist/tests/coverage-boost.test.d.ts +1 -0
  282. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
  283. package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
  284. package/dist/tests/data-additional-methods.test.d.ts +1 -0
  285. package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
  286. package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
  287. package/dist/tests/data-relayer.test.d.ts +1 -0
  288. package/dist/tests/data-schema-validation.test.d.ts +1 -0
  289. package/dist/tests/data-simple-methods.test.d.ts +1 -0
  290. package/dist/tests/data.test.d.ts +1 -0
  291. package/dist/tests/demo-integration.test.d.ts +1 -0
  292. package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
  293. package/dist/tests/download-relayer.test.d.ts +1 -0
  294. package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
  295. package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
  296. package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
  297. package/dist/tests/encryption-coverage.test.d.ts +1 -0
  298. package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
  299. package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
  300. package/dist/tests/errors-coverage.test.d.ts +1 -0
  301. package/dist/tests/errors.test.d.ts +1 -0
  302. package/dist/tests/factories/mockFactory.d.ts +316 -0
  303. package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
  304. package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
  305. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
  306. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
  307. package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
  308. package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
  309. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
  310. package/dist/tests/helper-methods.test.d.ts +1 -0
  311. package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
  312. package/dist/tests/helpers/typedMocks.d.ts +64 -0
  313. package/dist/tests/index-browser.test.d.ts +1 -0
  314. package/dist/tests/index-node.test.d.ts +1 -0
  315. package/dist/tests/index.test.d.ts +1 -0
  316. package/dist/tests/mocks/platformAdapter.d.ts +12 -0
  317. package/dist/tests/new-permissions-methods.test.d.ts +1 -0
  318. package/dist/tests/no-buffer-browser.test.d.ts +1 -0
  319. package/dist/tests/permissions-grantee.test.d.ts +1 -0
  320. package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
  321. package/dist/tests/permissions-server-files.test.d.ts +1 -0
  322. package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
  323. package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
  324. package/dist/tests/permissions.test.d.ts +1 -0
  325. package/dist/tests/personal.test.d.ts +1 -0
  326. package/dist/tests/platform-browser.test.d.ts +1 -0
  327. package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
  328. package/dist/tests/platform-crypto.test.d.ts +1 -0
  329. package/dist/tests/platform-index.test.d.ts +1 -0
  330. package/dist/tests/platform-node.test.d.ts +1 -0
  331. package/dist/tests/platform-shared-utils.test.d.ts +1 -0
  332. package/dist/tests/platform-updated.test.d.ts +1 -0
  333. package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
  334. package/dist/tests/protocol.test.d.ts +1 -0
  335. package/dist/tests/read-only-mode.test.d.ts +1 -0
  336. package/dist/tests/schemas.test.d.ts +1 -0
  337. package/dist/tests/server-handler.test.d.ts +1 -0
  338. package/dist/tests/setup.d.ts +7 -0
  339. package/dist/tests/signatureFormatter.test.d.ts +1 -0
  340. package/dist/tests/trusted-server-queries.test.d.ts +1 -0
  341. package/dist/tests/typedDataConverter.test.d.ts +1 -0
  342. package/dist/tests/types-contracts.test.d.ts +1 -0
  343. package/dist/tests/types-data.test.d.ts +1 -0
  344. package/dist/tests/types-external-apis.test.d.ts +1 -0
  345. package/dist/tests/types-generics.test.d.ts +1 -0
  346. package/dist/tests/types-permissions.test.d.ts +1 -0
  347. package/dist/tests/types-upload-params.test.d.ts +1 -0
  348. package/dist/tests/types.test.d.ts +1 -0
  349. package/dist/tests/utils-formatters.test.d.ts +1 -0
  350. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
  351. package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
  352. package/dist/tests/utils-grantFiles.test.d.ts +1 -0
  353. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
  354. package/dist/tests/utils-grants.test.d.ts +1 -0
  355. package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
  356. package/dist/tests/utils-ipfs.test.d.ts +4 -0
  357. package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
  358. package/dist/tests/vana.test.d.ts +1 -0
  359. package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
  360. package/dist/types/blockchain.cjs +17 -0
  361. package/dist/types/blockchain.cjs.map +1 -0
  362. package/dist/types/blockchain.d.ts +57 -0
  363. package/dist/types/blockchain.js +1 -0
  364. package/dist/types/blockchain.js.map +1 -0
  365. package/dist/types/chains-additional.test.d.ts +1 -0
  366. package/dist/types/chains.d.ts +6 -9
  367. package/dist/types/config.cjs +10 -0
  368. package/dist/types/config.cjs.map +1 -1
  369. package/dist/types/config.d.ts +161 -54
  370. package/dist/types/config.js +8 -0
  371. package/dist/types/config.js.map +1 -1
  372. package/dist/types/contracts.cjs.map +1 -1
  373. package/dist/types/contracts.d.ts +8 -11
  374. package/dist/types/controller-context.cjs +17 -0
  375. package/dist/types/controller-context.cjs.map +1 -0
  376. package/dist/types/controller-context.d.ts +64 -0
  377. package/dist/types/controller-context.js +1 -0
  378. package/dist/types/controller-context.js.map +1 -0
  379. package/dist/types/data.cjs.map +1 -1
  380. package/dist/types/data.d.ts +107 -39
  381. package/dist/types/external-apis.d.ts +10 -12
  382. package/dist/types/generics.d.ts +35 -38
  383. package/dist/types/index.cjs +5 -4
  384. package/dist/types/index.cjs.map +1 -1
  385. package/dist/types/index.d.ts +20 -34
  386. package/dist/types/index.js +9 -2
  387. package/dist/types/index.js.map +1 -1
  388. package/dist/types/operations.cjs +2 -2
  389. package/dist/types/operations.cjs.map +1 -1
  390. package/dist/types/operations.d.ts +32 -28
  391. package/dist/types/operations.js +2 -2
  392. package/dist/types/operations.js.map +1 -1
  393. package/dist/types/permissions.d.ts +55 -58
  394. package/dist/types/personal.cjs.map +1 -1
  395. package/dist/types/personal.d.ts +6 -8
  396. package/dist/types/relayer.d.ts +15 -18
  397. package/dist/types/storage.d.ts +6 -8
  398. package/dist/types/storage.js +2 -5
  399. package/dist/types/storage.js.map +1 -1
  400. package/dist/types/transactionResults.cjs.map +1 -1
  401. package/dist/types/transactionResults.d.ts +193 -25
  402. package/dist/types/utils.cjs.map +1 -1
  403. package/dist/types/utils.d.ts +26 -25
  404. package/dist/types.d.ts +4 -40
  405. package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
  406. package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
  407. package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
  408. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
  409. package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
  410. package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
  411. package/dist/utils/blockchain/registry.cjs +2 -2
  412. package/dist/utils/blockchain/registry.cjs.map +1 -1
  413. package/dist/utils/blockchain/registry.d.ts +6 -8
  414. package/dist/utils/blockchain/registry.js +2 -2
  415. package/dist/utils/blockchain/registry.js.map +1 -1
  416. package/dist/utils/blockchain/registry.test.d.ts +1 -0
  417. package/dist/utils/crypto-utils.cjs +0 -12
  418. package/dist/utils/crypto-utils.cjs.map +1 -1
  419. package/dist/utils/crypto-utils.d.ts +9 -27
  420. package/dist/utils/crypto-utils.js +0 -11
  421. package/dist/utils/crypto-utils.js.map +1 -1
  422. package/dist/utils/crypto-utils.test.d.ts +1 -0
  423. package/dist/utils/download.cjs +3 -3
  424. package/dist/utils/download.cjs.map +1 -1
  425. package/dist/utils/download.d.ts +13 -14
  426. package/dist/utils/download.js +2 -2
  427. package/dist/utils/download.js.map +1 -1
  428. package/dist/utils/encoding.cjs +1 -1
  429. package/dist/utils/encoding.cjs.map +1 -1
  430. package/dist/utils/encoding.d.ts +4 -6
  431. package/dist/utils/encoding.js +1 -1
  432. package/dist/utils/encoding.js.map +1 -1
  433. package/dist/utils/encoding.test.d.ts +1 -0
  434. package/dist/utils/encryption.cjs +16 -10
  435. package/dist/utils/encryption.cjs.map +1 -1
  436. package/dist/utils/encryption.d.ts +13 -17
  437. package/dist/utils/encryption.js +16 -10
  438. package/dist/utils/encryption.js.map +1 -1
  439. package/dist/utils/formatters.cjs +4 -2
  440. package/dist/utils/formatters.cjs.map +1 -1
  441. package/dist/utils/formatters.d.ts +4 -6
  442. package/dist/utils/formatters.js +4 -2
  443. package/dist/utils/formatters.js.map +1 -1
  444. package/dist/utils/grantFiles.cjs +7 -4
  445. package/dist/utils/grantFiles.cjs.map +1 -1
  446. package/dist/utils/grantFiles.d.ts +6 -10
  447. package/dist/utils/grantFiles.js +7 -4
  448. package/dist/utils/grantFiles.js.map +1 -1
  449. package/dist/utils/grantValidation.cjs +1 -1
  450. package/dist/utils/grantValidation.cjs.map +1 -1
  451. package/dist/utils/grantValidation.d.ts +14 -17
  452. package/dist/utils/grantValidation.js +1 -1
  453. package/dist/utils/grantValidation.js.map +1 -1
  454. package/dist/utils/grants.cjs +1 -1
  455. package/dist/utils/grants.cjs.map +1 -1
  456. package/dist/utils/grants.d.ts +10 -13
  457. package/dist/utils/grants.js +1 -1
  458. package/dist/utils/grants.js.map +1 -1
  459. package/dist/utils/ipfs.d.ts +8 -10
  460. package/dist/utils/lazy-import.cjs +4 -6
  461. package/dist/utils/lazy-import.cjs.map +1 -1
  462. package/dist/utils/lazy-import.d.ts +1 -3
  463. package/dist/utils/lazy-import.js +4 -6
  464. package/dist/utils/lazy-import.js.map +1 -1
  465. package/dist/utils/multicall.cjs +4 -2
  466. package/dist/utils/multicall.cjs.map +1 -1
  467. package/dist/utils/multicall.d.ts +5 -8
  468. package/dist/utils/multicall.js +4 -2
  469. package/dist/utils/multicall.js.map +1 -1
  470. package/dist/utils/parseTransactionPojo.cjs +87 -0
  471. package/dist/utils/parseTransactionPojo.cjs.map +1 -0
  472. package/dist/utils/parseTransactionPojo.d.ts +31 -0
  473. package/dist/utils/parseTransactionPojo.js +63 -0
  474. package/dist/utils/parseTransactionPojo.js.map +1 -0
  475. package/dist/utils/schemaValidation.cjs +5 -5
  476. package/dist/utils/schemaValidation.cjs.map +1 -1
  477. package/dist/utils/schemaValidation.d.ts +8 -12
  478. package/dist/utils/schemaValidation.js +7 -10
  479. package/dist/utils/schemaValidation.js.map +1 -1
  480. package/dist/utils/signatureCache.cjs +1 -2
  481. package/dist/utils/signatureCache.cjs.map +1 -1
  482. package/dist/utils/signatureCache.d.ts +4 -7
  483. package/dist/utils/signatureCache.js +4 -8
  484. package/dist/utils/signatureCache.js.map +1 -1
  485. package/dist/utils/signatureFormatter.cjs +6 -9
  486. package/dist/utils/signatureFormatter.cjs.map +1 -1
  487. package/dist/utils/signatureFormatter.d.ts +2 -5
  488. package/dist/utils/signatureFormatter.js +6 -9
  489. package/dist/utils/signatureFormatter.js.map +1 -1
  490. package/dist/utils/tests/multicall.test.d.ts +1 -0
  491. package/dist/utils/transactionHelpers.cjs +54 -0
  492. package/dist/utils/transactionHelpers.cjs.map +1 -0
  493. package/dist/utils/transactionHelpers.d.ts +80 -0
  494. package/dist/utils/transactionHelpers.js +29 -0
  495. package/dist/utils/transactionHelpers.js.map +1 -0
  496. package/dist/utils/typeGuards.cjs +109 -0
  497. package/dist/utils/typeGuards.cjs.map +1 -0
  498. package/dist/utils/typeGuards.d.ts +138 -0
  499. package/dist/utils/typeGuards.js +74 -0
  500. package/dist/utils/typeGuards.js.map +1 -0
  501. package/dist/utils/typedDataConverter.d.ts +3 -6
  502. package/dist/utils/urlResolver.cjs +1 -1
  503. package/dist/utils/urlResolver.cjs.map +1 -1
  504. package/dist/utils/urlResolver.d.ts +2 -4
  505. package/dist/utils/urlResolver.js +2 -2
  506. package/dist/utils/urlResolver.js.map +1 -1
  507. package/dist/utils/wallet.cjs +62 -0
  508. package/dist/utils/wallet.cjs.map +1 -0
  509. package/dist/utils/wallet.d.ts +32 -0
  510. package/dist/utils/wallet.js +36 -0
  511. package/dist/utils/wallet.js.map +1 -0
  512. package/dist/{chains.browser.cjs → utils/withEvents.cjs} +22 -15
  513. package/dist/utils/withEvents.cjs.map +1 -0
  514. package/dist/utils/withEvents.d.ts +56 -0
  515. package/dist/utils/withEvents.js +18 -0
  516. package/dist/utils/withEvents.js.map +1 -0
  517. package/package.json +23 -13
  518. package/dist/browser.d.cts +0 -2
  519. package/dist/chains/definitions.d.cts +0 -53
  520. package/dist/chains/index.d.cts +0 -2
  521. package/dist/chains.browser.cjs.map +0 -1
  522. package/dist/chains.browser.d.cts +0 -2
  523. package/dist/chains.d.cts +0 -2
  524. package/dist/chains.node.d.cts +0 -2
  525. package/dist/config/addresses.d.cts +0 -380
  526. package/dist/config/chains.d.cts +0 -85
  527. package/dist/config/eventMappings.cjs +0 -114
  528. package/dist/config/eventMappings.cjs.map +0 -1
  529. package/dist/config/eventMappings.d.cts +0 -108
  530. package/dist/config/eventMappings.d.ts +0 -108
  531. package/dist/config/eventMappings.js +0 -90
  532. package/dist/config/eventMappings.js.map +0 -1
  533. package/dist/config/features.d.cts +0 -64
  534. package/dist/contracts/contractController.d.cts +0 -96
  535. package/dist/controllers/data.d.cts +0 -941
  536. package/dist/controllers/permissions.d.cts +0 -25
  537. package/dist/controllers/protocol.d.cts +0 -167
  538. package/dist/controllers/schemas.d.cts +0 -272
  539. package/dist/controllers/server.d.cts +0 -243
  540. package/dist/core/apiClient.d.cts +0 -165
  541. package/dist/core/client.d.cts +0 -92
  542. package/dist/core/generics.d.cts +0 -120
  543. package/dist/core.d.cts +0 -466
  544. package/dist/crypto/ecies/__tests__/test-vectors.d.cts +0 -40
  545. package/dist/crypto/ecies/base.d.cts +0 -143
  546. package/dist/crypto/ecies/browser.d.cts +0 -48
  547. package/dist/crypto/ecies/constants.d.cts +0 -122
  548. package/dist/crypto/ecies/index.d.cts +0 -1
  549. package/dist/crypto/ecies/interface.d.cts +0 -176
  550. package/dist/crypto/ecies/node.d.cts +0 -50
  551. package/dist/crypto/ecies/utils.d.cts +0 -67
  552. package/dist/crypto/services/WalletKeyEncryptionService.d.cts +0 -92
  553. package/dist/diagnostics.d.cts +0 -26
  554. package/dist/errors.d.cts +0 -350
  555. package/dist/generated/abi/ComputeEngineImplementation.d.cts +0 -996
  556. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.cts +0 -545
  557. package/dist/generated/abi/DATFactoryImplementation.d.cts +0 -661
  558. package/dist/generated/abi/DATImplementation.d.cts +0 -693
  559. package/dist/generated/abi/DATPausableImplementation.d.cts +0 -1145
  560. package/dist/generated/abi/DATVotesImplementation.d.cts +0 -1095
  561. package/dist/generated/abi/DLPPerformanceImplementation.d.cts +0 -883
  562. package/dist/generated/abi/DLPRegistryImplementation.d.cts +0 -1123
  563. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.cts +0 -452
  564. package/dist/generated/abi/DLPRewardDeployerImplementation.d.cts +0 -714
  565. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.cts +0 -452
  566. package/dist/generated/abi/DLPRewardSwapImplementation.d.cts +0 -706
  567. package/dist/generated/abi/DLPRootImplementation.d.cts +0 -1248
  568. package/dist/generated/abi/DLPTreasuryImplementation.d.cts +0 -452
  569. package/dist/generated/abi/DataLiquidityPoolImplementation.d.cts +0 -737
  570. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.cts +0 -661
  571. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.cts +0 -989
  572. package/dist/generated/abi/DataPortabilityServersImplementation.d.cts +0 -1086
  573. package/dist/generated/abi/DataRefinerRegistryImplementation.d.cts +0 -737
  574. package/dist/generated/abi/DataRegistryImplementation.d.cts +0 -1004
  575. package/dist/generated/abi/QueryEngineImplementation.d.cts +0 -1001
  576. package/dist/generated/abi/SwapHelperImplementation.d.cts +0 -764
  577. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.cts +0 -701
  578. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.cts +0 -701
  579. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.cts +0 -701
  580. package/dist/generated/abi/TeePoolImplementation.d.cts +0 -993
  581. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.cts +0 -701
  582. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.cts +0 -701
  583. package/dist/generated/abi/TeePoolPhalaImplementation.d.cts +0 -993
  584. package/dist/generated/abi/VanaEpochImplementation.d.cts +0 -900
  585. package/dist/generated/abi/VanaPoolEntityImplementation.d.cts +0 -934
  586. package/dist/generated/abi/VanaPoolStakingImplementation.d.cts +0 -693
  587. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.cts +0 -394
  588. package/dist/generated/abi/index.d.cts +0 -26516
  589. package/dist/generated/server/server-exports.d.cts +0 -21
  590. package/dist/generated/server/server.d.cts +0 -512
  591. package/dist/generated/subgraph.d.cts +0 -5981
  592. package/dist/index.browser.cjs +0 -151
  593. package/dist/index.browser.cjs.map +0 -1
  594. package/dist/index.browser.d.cts +0 -177
  595. package/dist/index.d.cts +0 -2
  596. package/dist/index.node.d.cts +0 -64
  597. package/dist/node.d.cts +0 -2
  598. package/dist/permissions-DNKPu_G0.d.cts +0 -1666
  599. package/dist/permissions-eo8YeLGf.d.ts +0 -1666
  600. package/dist/platform/browser-only.d.cts +0 -25
  601. package/dist/platform/browser-safe.d.cts +0 -32
  602. package/dist/platform/browser.d.cts +0 -74
  603. package/dist/platform/index.d.cts +0 -5
  604. package/dist/platform/interface.d.cts +0 -218
  605. package/dist/platform/node.d.cts +0 -27
  606. package/dist/platform/shared/error-utils.d.cts +0 -25
  607. package/dist/platform/shared/pgp-utils.d.cts +0 -61
  608. package/dist/platform/shared/stream-utils.d.cts +0 -16
  609. package/dist/platform/utils.d.cts +0 -53
  610. package/dist/platform.browser.cjs +0 -41
  611. package/dist/platform.browser.cjs.map +0 -1
  612. package/dist/platform.browser.d.cts +0 -4
  613. package/dist/platform.d.cts +0 -5
  614. package/dist/platform.node.d.cts +0 -5
  615. package/dist/server/handler.d.cts +0 -282
  616. package/dist/storage/index.d.cts +0 -10
  617. package/dist/storage/manager.d.cts +0 -150
  618. package/dist/storage/providers/callback-storage.d.cts +0 -100
  619. package/dist/storage/providers/google-drive.d.cts +0 -156
  620. package/dist/storage/providers/ipfs.d.cts +0 -163
  621. package/dist/storage/providers/pinata.d.cts +0 -173
  622. package/dist/types/chains.d.cts +0 -34
  623. package/dist/types/config.d.cts +0 -726
  624. package/dist/types/contracts.d.cts +0 -68
  625. package/dist/types/data.d.cts +0 -694
  626. package/dist/types/eccrypto-js.d.d.cts +0 -13
  627. package/dist/types/eccrypto-js.d.d.ts +0 -13
  628. package/dist/types/external-apis.d.cts +0 -186
  629. package/dist/types/generics.d.cts +0 -450
  630. package/dist/types/index.d.cts +0 -34
  631. package/dist/types/operations.d.cts +0 -108
  632. package/dist/types/permissions.d.cts +0 -957
  633. package/dist/types/personal.d.cts +0 -40
  634. package/dist/types/relayer.d.cts +0 -284
  635. package/dist/types/storage.d.cts +0 -131
  636. package/dist/types/transactionResults.d.cts +0 -25
  637. package/dist/types/utils.d.cts +0 -819
  638. package/dist/types.d.cts +0 -66
  639. package/dist/utils/blockchain/registry.d.cts +0 -34
  640. package/dist/utils/crypto-utils.d.cts +0 -118
  641. package/dist/utils/download.d.cts +0 -41
  642. package/dist/utils/encoding.d.cts +0 -54
  643. package/dist/utils/encryption.d.cts +0 -275
  644. package/dist/utils/eventParsing.cjs +0 -111
  645. package/dist/utils/eventParsing.cjs.map +0 -1
  646. package/dist/utils/eventParsing.d.cts +0 -60
  647. package/dist/utils/eventParsing.d.ts +0 -60
  648. package/dist/utils/eventParsing.js +0 -86
  649. package/dist/utils/eventParsing.js.map +0 -1
  650. package/dist/utils/formatters.d.cts +0 -120
  651. package/dist/utils/grantFiles.d.cts +0 -186
  652. package/dist/utils/grantValidation.d.cts +0 -150
  653. package/dist/utils/grants.d.cts +0 -70
  654. package/dist/utils/ipfs.d.cts +0 -90
  655. package/dist/utils/lazy-import.d.cts +0 -20
  656. package/dist/utils/multicall.d.cts +0 -129
  657. package/dist/utils/schemaValidation.d.cts +0 -172
  658. package/dist/utils/signatureCache.d.cts +0 -134
  659. package/dist/utils/signatureFormatter.d.cts +0 -39
  660. package/dist/utils/transactionParsing.cjs +0 -84
  661. package/dist/utils/transactionParsing.cjs.map +0 -1
  662. package/dist/utils/transactionParsing.d.cts +0 -25
  663. package/dist/utils/transactionParsing.d.ts +0 -25
  664. package/dist/utils/transactionParsing.js +0 -62
  665. package/dist/utils/transactionParsing.js.map +0 -1
  666. package/dist/utils/typedDataConverter.d.cts +0 -13
  667. package/dist/utils/urlResolver.d.cts +0 -40
@@ -15,6 +15,4 @@
15
15
  * const getOpenPGP = lazyImport(() => import('openpgp'));
16
16
  * const openpgp = await getOpenPGP();
17
17
  */
18
- declare function lazyImport<T>(importFn: () => Promise<T>): () => Promise<T>;
19
-
20
- export { lazyImport };
18
+ export declare function lazyImport<T>(importFn: () => Promise<T>): () => Promise<T>;
@@ -1,12 +1,10 @@
1
1
  function lazyImport(importFn) {
2
2
  let cached = null;
3
3
  return () => {
4
- if (!cached) {
5
- cached = importFn().catch((err) => {
6
- cached = null;
7
- throw new Error("Failed to load module", { cause: err });
8
- });
9
- }
4
+ cached ??= importFn().catch((err) => {
5
+ cached = null;
6
+ throw new Error("Failed to load module", { cause: err });
7
+ });
10
8
  return cached;
11
9
  };
12
10
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/lazy-import.ts"],"sourcesContent":["/**\n * Utility for lazy-loading modules to avoid Turbopack TDZ issues\n *\n * WARNING: This is a workaround for Turbopack's strict module initialization.\n * Dependencies that access globals during init must be dynamically imported.\n */\n\n/**\n * Creates a lazy import function that caches the promise (not the module)\n * to avoid race conditions on concurrent first calls\n *\n * @param importFn - Function that returns a dynamic import promise\n * @returns Function that returns the cached import promise\n *\n * @example\n * const getOpenPGP = lazyImport(() => import('openpgp'));\n * const openpgp = await getOpenPGP();\n */\nexport function lazyImport<T>(importFn: () => Promise<T>): () => Promise<T> {\n let cached: Promise<T> | null = null;\n\n return () => {\n if (!cached) {\n cached = importFn().catch((err) => {\n // Clear cache on error so next attempt can retry\n cached = null;\n throw new Error(\"Failed to load module\", { cause: err });\n });\n }\n return cached;\n };\n}\n"],"mappings":"AAkBO,SAAS,WAAc,UAA8C;AAC1E,MAAI,SAA4B;AAEhC,SAAO,MAAM;AACX,QAAI,CAAC,QAAQ;AACX,eAAS,SAAS,EAAE,MAAM,CAAC,QAAQ;AAEjC,iBAAS;AACT,cAAM,IAAI,MAAM,yBAAyB,EAAE,OAAO,IAAI,CAAC;AAAA,MACzD,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/lazy-import.ts"],"sourcesContent":["/**\n * Utility for lazy-loading modules to avoid Turbopack TDZ issues\n *\n * WARNING: This is a workaround for Turbopack's strict module initialization.\n * Dependencies that access globals during init must be dynamically imported.\n */\n\n/**\n * Creates a lazy import function that caches the promise (not the module)\n * to avoid race conditions on concurrent first calls\n *\n * @param importFn - Function that returns a dynamic import promise\n * @returns Function that returns the cached import promise\n *\n * @example\n * const getOpenPGP = lazyImport(() => import('openpgp'));\n * const openpgp = await getOpenPGP();\n */\nexport function lazyImport<T>(importFn: () => Promise<T>): () => Promise<T> {\n let cached: Promise<T> | null = null;\n\n return () => {\n cached ??= importFn().catch((err) => {\n // Clear cache on error so next attempt can retry\n cached = null;\n throw new Error(\"Failed to load module\", { cause: err });\n });\n return cached;\n };\n}\n"],"mappings":"AAkBO,SAAS,WAAc,UAA8C;AAC1E,MAAI,SAA4B;AAEhC,SAAO,MAAM;AACX,eAAW,SAAS,EAAE,MAAM,CAAC,QAAQ;AAEnC,eAAS;AACT,YAAM,IAAI,MAAM,yBAAyB,EAAE,OAAO,IAAI,CAAC;AAAA,IACzD,CAAC;AACD,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -38,7 +38,7 @@ const DEFAULT_OPTIONS = {
38
38
  };
39
39
  async function gasAwareMulticall(client, parameters, options = {}) {
40
40
  const chainId = await client.getChainId();
41
- const multicall3Address = options.multicallAddress || (0, import_addresses.getUtilityAddress)(chainId, "Multicall3");
41
+ const multicall3Address = options.multicallAddress ?? (0, import_addresses.getUtilityAddress)(chainId, "Multicall3");
42
42
  const opts = {
43
43
  ...DEFAULT_OPTIONS,
44
44
  ...options,
@@ -116,7 +116,9 @@ async function createBatches(client, contracts, options) {
116
116
  lastEstimatedGas = 0n;
117
117
  } else {
118
118
  if (!options.allowFailure) {
119
- throw new Error(`Gas estimation failed for call ${i}: ${error}`);
119
+ throw new Error(
120
+ `Gas estimation failed for call ${i}: ${String(error)}`
121
+ );
120
122
  }
121
123
  currentBatch = [];
122
124
  currentBytes = 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/multicall.ts"],"sourcesContent":["import type {\n Address,\n PublicClient,\n MulticallParameters,\n MulticallReturnType,\n EncodeFunctionDataParameters,\n Hex,\n Abi,\n} from \"viem\";\nimport { encodeFunctionData, size } from \"viem\";\nimport { getUtilityAddress } from \"../config/addresses\";\nimport type { VanaChainId } from \"../types\";\n\n/**\n * Type for a contract function configuration used in multicall\n */\nexport interface ContractFunctionConfig {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n}\n\n/**\n * Configuration options for gas-aware multicall batching.\n *\n * @remarks\n * These options control how the multicall utility splits large batches\n * to stay within gas and calldata limits. The defaults are conservative\n * to ensure compatibility across different chains and RPC providers.\n */\nexport interface GasAwareMulticallOptions {\n /**\n * Maximum gas per batch. Defaults to 10M (conservative for most chains).\n *\n * @remarks\n * This should be set below the block gas limit of your target chain.\n * Common values:\n * - Vana mainnet: 30M (use 25M for safety)\n * - Vana moksha: 30M (use 25M for safety)\n * - Ethereum mainnet: 30M (use 25M for safety)\n * - Arbitrum: 32M (use 25M for safety)\n */\n maxGasPerBatch?: bigint;\n\n /**\n * Maximum calldata size per batch in bytes. Defaults to 100KB.\n *\n * @remarks\n * This is particularly important for L2 chains where calldata is expensive.\n * Some RPC providers also have limits on request size.\n */\n maxCalldataBytes?: number;\n\n /**\n * How often to checkpoint gas estimates. Defaults to every 32 calls or 8KB.\n *\n * @remarks\n * More frequent checkpoints give more accurate batching but require more\n * RPC calls for gas estimation. The default balances accuracy vs performance.\n */\n checkpointFrequency?: {\n /** Checkpoint after this many calls */\n calls: number;\n /** Checkpoint after this many bytes of calldata */\n bytes: number;\n };\n\n /**\n * Whether to allow partial batch failures. Defaults to false.\n *\n * @remarks\n * When true, individual call failures won't fail the entire batch.\n * This matches viem's multicall behavior with allowFailure option.\n */\n allowFailure?: boolean;\n\n /**\n * Optional multicall3 contract address override.\n *\n * @remarks\n * By default, uses the standard multicall3 address deployed on most chains:\n * 0xcA11bde05977b3631167028862bE2a173976CA11\n */\n multicallAddress?: Address;\n\n /**\n * Optional callback for tracking batching progress.\n *\n * @remarks\n * Useful for showing progress in UI or debugging batch performance.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Internal configuration with defaults applied\n */\ninterface NormalizedOptions {\n maxGasPerBatch: bigint;\n maxCalldataBytes: number;\n checkpointFrequency: {\n calls: number;\n bytes: number;\n };\n allowFailure: boolean;\n multicallAddress: Address;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"multicallAddress\"> = {\n maxGasPerBatch: 10_000_000n, // 10M gas - conservative default\n maxCalldataBytes: 100_000, // 100KB - works with most RPC providers\n checkpointFrequency: {\n calls: 32,\n bytes: 8192, // 8KB\n },\n allowFailure: false,\n};\n\n/**\n * A gas-aware multicall function that automatically batches calls to stay within limits.\n *\n * @remarks\n * This function extends viem's multicall with intelligent batching based on:\n * - Actual gas costs (via periodic estimateGas calls)\n * - Calldata size limits\n * - Chain-specific constraints\n *\n * It uses a greedy algorithm with periodic checkpoints to efficiently determine\n * optimal batch sizes without making excessive RPC calls.\n *\n * @param client - The viem public client to use for RPC calls\n * @param parameters - The multicall parameters (same as viem's multicall)\n * @param options - Optional configuration for gas-aware batching\n * @returns The aggregated results from all batches\n *\n * @example\n * ```typescript\n * // Basic usage - drop-in replacement for viem's multicall\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: [\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address1] },\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address2] },\n * // ... hundreds more calls\n * ]\n * });\n *\n * // With custom limits for a specific chain\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: calls,\n * }, {\n * maxGasPerBatch: 25_000_000n, // 25M for mainnet\n * maxCalldataBytes: 128_000, // 128KB\n * onProgress: (done, total) => console.log(`Progress: ${done}/${total}`)\n * });\n * ```\n */\nexport async function gasAwareMulticall<\n TContracts extends readonly ContractFunctionConfig[],\n TAllowFailure extends boolean = false,\n>(\n client: PublicClient,\n parameters: MulticallParameters<TContracts, TAllowFailure>,\n options: GasAwareMulticallOptions = {},\n): Promise<MulticallReturnType<TContracts, TAllowFailure>> {\n // Get the chain-specific Multicall3 address\n const chainId = await client.getChainId();\n const multicall3Address =\n options.multicallAddress ||\n getUtilityAddress(chainId as VanaChainId, \"Multicall3\");\n\n // Normalize options with defaults\n const opts: NormalizedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n multicallAddress: multicall3Address,\n checkpointFrequency: {\n ...DEFAULT_OPTIONS.checkpointFrequency,\n ...options.checkpointFrequency,\n },\n };\n\n // Override allowFailure if specified in parameters\n if (parameters.allowFailure !== undefined) {\n opts.allowFailure = parameters.allowFailure;\n }\n\n const { contracts } = parameters;\n if (!contracts || contracts.length === 0) {\n return [] as unknown as MulticallReturnType<TContracts, TAllowFailure>;\n }\n\n // Execute batching algorithm\n const batches = await createBatches(\n client,\n contracts as readonly ContractFunctionConfig[],\n opts,\n );\n\n // Execute all batches in parallel\n const batchResults = await Promise.all(\n batches.map((batch, index) => {\n // Report progress if callback provided\n if (opts.onProgress && index > 0) {\n const completed = batches\n .slice(0, index)\n .reduce((sum, b) => sum + b.length, 0);\n opts.onProgress(completed, contracts.length);\n }\n\n // Execute batch using viem's multicall\n return client.multicall({\n ...parameters,\n contracts: batch as typeof contracts,\n multicallAddress: opts.multicallAddress,\n allowFailure: opts.allowFailure,\n });\n }),\n );\n\n // Report final progress\n if (opts.onProgress) {\n opts.onProgress(contracts.length, contracts.length);\n }\n\n // Flatten results\n return batchResults.flat() as MulticallReturnType<TContracts, TAllowFailure>;\n}\n\n/**\n * Creates optimally-sized batches using greedy algorithm with checkpoints.\n *\n * @param client - The viem public client for making RPC calls\n * @param contracts - Array of contract function configurations to batch\n * @param options - Normalized batching options with limits and settings\n * @returns Array of optimally-sized contract function configuration batches\n */\nasync function createBatches(\n client: PublicClient,\n contracts: readonly ContractFunctionConfig[],\n options: NormalizedOptions,\n): Promise<ContractFunctionConfig[][]> {\n const batches: ContractFunctionConfig[][] = [];\n let currentBatch: ContractFunctionConfig[] = [];\n let currentBytes = 0;\n let lastCheckpointIndex = 0;\n let lastCheckpointBytes = 0;\n let lastEstimatedGas = 0n;\n\n for (let i = 0; i < contracts.length; i++) {\n const contract = contracts[i];\n\n // Calculate encoded size for this call\n const encoded = encodeContractCall(contract);\n const callBytes = size(encoded);\n\n // Check if we need a gas checkpoint\n const callsSinceCheckpoint = i - lastCheckpointIndex;\n const bytesSinceCheckpoint = currentBytes - lastCheckpointBytes;\n\n const needsCheckpoint =\n callsSinceCheckpoint >= options.checkpointFrequency.calls ||\n bytesSinceCheckpoint >= options.checkpointFrequency.bytes;\n\n // Perform checkpoint if needed\n if (needsCheckpoint && currentBatch.length > 0) {\n try {\n lastEstimatedGas = await estimateBatchGas(\n client,\n currentBatch,\n options.multicallAddress,\n );\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n } catch (error) {\n // If estimation fails, finalize current batch to be safe\n if (currentBatch.length > 1) {\n // Try with half the batch\n const halfBatch = currentBatch.slice(\n 0,\n Math.floor(currentBatch.length / 2),\n );\n batches.push(halfBatch);\n currentBatch = currentBatch.slice(halfBatch.length);\n currentBytes = calculateBatchSize(currentBatch);\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n lastEstimatedGas = 0n;\n } else {\n // Single call failed, skip it or throw based on allowFailure\n if (!options.allowFailure) {\n throw new Error(`Gas estimation failed for call ${i}: ${error}`);\n }\n currentBatch = [];\n currentBytes = 0;\n continue;\n }\n }\n }\n\n // Check if adding this call would exceed limits\n const wouldExceedCalldata =\n currentBytes + callBytes > options.maxCalldataBytes;\n const wouldExceedGas =\n lastEstimatedGas > 0n &&\n estimateNextGas(lastEstimatedGas, callsSinceCheckpoint + 1) >\n options.maxGasPerBatch;\n\n // If we would exceed limits, finalize current batch\n if ((wouldExceedCalldata || wouldExceedGas) && currentBatch.length > 0) {\n batches.push(currentBatch);\n currentBatch = [];\n currentBytes = 0;\n lastCheckpointIndex = i;\n lastCheckpointBytes = 0;\n lastEstimatedGas = 0n;\n }\n\n // Add call to current batch\n currentBatch.push(contract);\n currentBytes += callBytes;\n }\n\n // Add final batch if not empty\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\n/**\n * Encodes a contract call to measure its calldata size.\n *\n * @param contract - The contract function configuration to encode\n * @returns Hex-encoded function data\n */\nfunction encodeContractCall(contract: ContractFunctionConfig): Hex {\n const { abi, functionName, args } = contract;\n\n return encodeFunctionData({\n abi,\n functionName,\n args,\n } as EncodeFunctionDataParameters);\n}\n\n/**\n * Calculates total encoded size of a batch.\n *\n * @param batch - Array of contract function configurations to measure\n * @returns Total size in bytes of all encoded calls in the batch\n */\nfunction calculateBatchSize(batch: ContractFunctionConfig[]): number {\n return batch.reduce((total, contract) => {\n const encoded = encodeContractCall(contract);\n return total + size(encoded);\n }, 0);\n}\n\n/**\n * Estimates gas for a batch of calls via multicall3.\n *\n * @param client - The viem public client for gas estimation\n * @param batch - Array of contract calls to estimate gas for\n * @param multicallAddress - The multicall3 contract address to use\n * @returns Estimated gas cost for executing the batch\n */\nasync function estimateBatchGas(\n client: PublicClient,\n batch: ContractFunctionConfig[],\n multicallAddress: Address,\n): Promise<bigint> {\n // Encode batch as multicall3 aggregate3 call\n const calls = batch.map((contract) => ({\n target: contract.address,\n allowFailure: false,\n callData: encodeContractCall(contract),\n }));\n\n // Estimate gas for the multicall\n const gas = await client.estimateGas({\n to: multicallAddress,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [calls],\n }),\n });\n\n return gas;\n}\n\n/**\n * Extrapolates gas usage for calls added since last checkpoint.\n *\n * @remarks\n * Uses a conservative 1.1x multiplier for safety to account for gas usage variations.\n *\n * @param lastGas - The gas estimate from the last checkpoint\n * @param callsSinceCheckpoint - Number of calls added since the checkpoint\n * @returns Extrapolated gas estimate with safety margin\n */\nfunction estimateNextGas(\n lastGas: bigint,\n callsSinceCheckpoint: number,\n): bigint {\n if (callsSinceCheckpoint === 0) return lastGas;\n\n // Assume linear scaling with safety factor\n const avgGasPerCall = lastGas / BigInt(Math.max(1, callsSinceCheckpoint - 1));\n const estimatedGas = lastGas + avgGasPerCall;\n\n // Apply 10% safety margin\n return (estimatedGas * 110n) / 100n;\n}\n\n/**\n * Minimal multicall3 ABI for gas estimation\n */\nconst multicall3Abi = [\n {\n name: \"aggregate3\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"allowFailure\", type: \"bool\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * Utility function to analyze calls and predict optimal batch configuration\n *\n * @remarks\n * This function helps determine the best configuration for a specific set of calls\n * by analyzing their characteristics. Useful for optimizing repeated operations.\n *\n * @param contracts - The calls to analyze\n * @returns Suggested configuration based on call analysis\n */\nexport function analyzeCallsForOptimalConfig(\n contracts: readonly ContractFunctionConfig[],\n): Pick<GasAwareMulticallOptions, \"checkpointFrequency\" | \"maxCalldataBytes\"> {\n // Calculate average call size\n const totalBytes = contracts.reduce((sum, contract) => {\n const encoded = encodeContractCall(contract);\n return sum + size(encoded);\n }, 0);\n\n const avgBytesPerCall = totalBytes / contracts.length;\n\n // Suggest checkpoint frequency based on call density\n const checkpointFrequency = {\n calls: avgBytesPerCall > 500 ? 16 : 32, // More frequent for large calls\n bytes: avgBytesPerCall > 500 ? 4096 : 8192,\n };\n\n // Suggest calldata limit based on total size\n // For 1000 calls with small arrays, totalBytes will be much less than 500KB,\n // so use number of contracts as additional signal\n const maxCalldataBytes =\n totalBytes > 50_000 || contracts.length > 500 ? 128_000 : 100_000;\n\n return {\n checkpointFrequency,\n maxCalldataBytes,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/multicall.ts"],"sourcesContent":["import type {\n Address,\n PublicClient,\n MulticallParameters,\n MulticallReturnType,\n EncodeFunctionDataParameters,\n Hex,\n Abi,\n} from \"viem\";\nimport { encodeFunctionData, size } from \"viem\";\nimport { getUtilityAddress } from \"../config/addresses\";\nimport type { VanaChainId } from \"../types\";\n\n/**\n * Type for a contract function configuration used in multicall\n */\nexport interface ContractFunctionConfig {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n}\n\n/**\n * Configuration options for gas-aware multicall batching.\n *\n * @remarks\n * These options control how the multicall utility splits large batches\n * to stay within gas and calldata limits. The defaults are conservative\n * to ensure compatibility across different chains and RPC providers.\n */\nexport interface GasAwareMulticallOptions {\n /**\n * Maximum gas per batch. Defaults to 10M (conservative for most chains).\n *\n * @remarks\n * This should be set below the block gas limit of your target chain.\n * Common values:\n * - Vana mainnet: 30M (use 25M for safety)\n * - Vana moksha: 30M (use 25M for safety)\n * - Ethereum mainnet: 30M (use 25M for safety)\n * - Arbitrum: 32M (use 25M for safety)\n */\n maxGasPerBatch?: bigint;\n\n /**\n * Maximum calldata size per batch in bytes. Defaults to 100KB.\n *\n * @remarks\n * This is particularly important for L2 chains where calldata is expensive.\n * Some RPC providers also have limits on request size.\n */\n maxCalldataBytes?: number;\n\n /**\n * How often to checkpoint gas estimates. Defaults to every 32 calls or 8KB.\n *\n * @remarks\n * More frequent checkpoints give more accurate batching but require more\n * RPC calls for gas estimation. The default balances accuracy vs performance.\n */\n checkpointFrequency?: {\n /** Checkpoint after this many calls */\n calls: number;\n /** Checkpoint after this many bytes of calldata */\n bytes: number;\n };\n\n /**\n * Whether to allow partial batch failures. Defaults to false.\n *\n * @remarks\n * When true, individual call failures won't fail the entire batch.\n * This matches viem's multicall behavior with allowFailure option.\n */\n allowFailure?: boolean;\n\n /**\n * Optional multicall3 contract address override.\n *\n * @remarks\n * By default, uses the standard multicall3 address deployed on most chains:\n * 0xcA11bde05977b3631167028862bE2a173976CA11\n */\n multicallAddress?: Address;\n\n /**\n * Optional callback for tracking batching progress.\n *\n * @remarks\n * Useful for showing progress in UI or debugging batch performance.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Internal configuration with defaults applied\n */\ninterface NormalizedOptions {\n maxGasPerBatch: bigint;\n maxCalldataBytes: number;\n checkpointFrequency: {\n calls: number;\n bytes: number;\n };\n allowFailure: boolean;\n multicallAddress: Address;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"multicallAddress\"> = {\n maxGasPerBatch: 10_000_000n, // 10M gas - conservative default\n maxCalldataBytes: 100_000, // 100KB - works with most RPC providers\n checkpointFrequency: {\n calls: 32,\n bytes: 8192, // 8KB\n },\n allowFailure: false,\n};\n\n/**\n * A gas-aware multicall function that automatically batches calls to stay within limits.\n *\n * @remarks\n * This function extends viem's multicall with intelligent batching based on:\n * - Actual gas costs (via periodic estimateGas calls)\n * - Calldata size limits\n * - Chain-specific constraints\n *\n * It uses a greedy algorithm with periodic checkpoints to efficiently determine\n * optimal batch sizes without making excessive RPC calls.\n *\n * @param client - The viem public client to use for RPC calls\n * @param parameters - The multicall parameters (same as viem's multicall)\n * @param options - Optional configuration for gas-aware batching\n * @returns The aggregated results from all batches\n *\n * @example\n * ```typescript\n * // Basic usage - drop-in replacement for viem's multicall\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: [\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address1] },\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address2] },\n * // ... hundreds more calls\n * ]\n * });\n *\n * // With custom limits for a specific chain\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: calls,\n * }, {\n * maxGasPerBatch: 25_000_000n, // 25M for mainnet\n * maxCalldataBytes: 128_000, // 128KB\n * onProgress: (done, total) => console.log(`Progress: ${done}/${total}`)\n * });\n * ```\n */\nexport async function gasAwareMulticall<\n TContracts extends readonly ContractFunctionConfig[],\n TAllowFailure extends boolean = false,\n>(\n client: PublicClient,\n parameters: MulticallParameters<TContracts, TAllowFailure>,\n options: GasAwareMulticallOptions = {},\n): Promise<MulticallReturnType<TContracts, TAllowFailure>> {\n // Get the chain-specific Multicall3 address\n const chainId = await client.getChainId();\n const multicall3Address =\n options.multicallAddress ??\n getUtilityAddress(chainId as VanaChainId, \"Multicall3\");\n\n // Normalize options with defaults\n const opts: NormalizedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n multicallAddress: multicall3Address,\n checkpointFrequency: {\n ...DEFAULT_OPTIONS.checkpointFrequency,\n ...options.checkpointFrequency,\n },\n };\n\n // Override allowFailure if specified in parameters\n if (parameters.allowFailure !== undefined) {\n opts.allowFailure = parameters.allowFailure;\n }\n\n const { contracts } = parameters;\n if (!contracts || contracts.length === 0) {\n // TODO(TYPES): Empty array needs to match complex generic return type.\n // Future improvement: Use conditional types to properly type empty results\n // based on TAllowFailure parameter. Consider creating utility type helper.\n return [] as unknown as MulticallReturnType<TContracts, TAllowFailure>;\n }\n\n // Execute batching algorithm\n const batches = await createBatches(\n client,\n contracts as readonly ContractFunctionConfig[],\n opts,\n );\n\n // Execute all batches in parallel\n const batchResults = await Promise.all(\n batches.map((batch, index) => {\n // Report progress if callback provided\n if (opts.onProgress && index > 0) {\n const completed = batches\n .slice(0, index)\n .reduce((sum, b) => sum + b.length, 0);\n opts.onProgress(completed, contracts.length);\n }\n\n // Execute batch using viem's multicall\n return client.multicall({\n ...parameters,\n contracts: batch as typeof contracts,\n multicallAddress: opts.multicallAddress,\n allowFailure: opts.allowFailure,\n });\n }),\n );\n\n // Report final progress\n if (opts.onProgress) {\n opts.onProgress(contracts.length, contracts.length);\n }\n\n // Flatten results\n return batchResults.flat() as MulticallReturnType<TContracts, TAllowFailure>;\n}\n\n/**\n * Creates optimally-sized batches using greedy algorithm with checkpoints.\n *\n * @param client - The viem public client for making RPC calls\n * @param contracts - Array of contract function configurations to batch\n * @param options - Normalized batching options with limits and settings\n * @returns Array of optimally-sized contract function configuration batches\n */\nasync function createBatches(\n client: PublicClient,\n contracts: readonly ContractFunctionConfig[],\n options: NormalizedOptions,\n): Promise<ContractFunctionConfig[][]> {\n const batches: ContractFunctionConfig[][] = [];\n let currentBatch: ContractFunctionConfig[] = [];\n let currentBytes = 0;\n let lastCheckpointIndex = 0;\n let lastCheckpointBytes = 0;\n let lastEstimatedGas = 0n;\n\n for (let i = 0; i < contracts.length; i++) {\n const contract = contracts[i];\n\n // Calculate encoded size for this call\n const encoded = encodeContractCall(contract);\n const callBytes = size(encoded);\n\n // Check if we need a gas checkpoint\n const callsSinceCheckpoint = i - lastCheckpointIndex;\n const bytesSinceCheckpoint = currentBytes - lastCheckpointBytes;\n\n const needsCheckpoint =\n callsSinceCheckpoint >= options.checkpointFrequency.calls ||\n bytesSinceCheckpoint >= options.checkpointFrequency.bytes;\n\n // Perform checkpoint if needed\n if (needsCheckpoint && currentBatch.length > 0) {\n try {\n lastEstimatedGas = await estimateBatchGas(\n client,\n currentBatch,\n options.multicallAddress,\n );\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n } catch (error) {\n // If estimation fails, finalize current batch to be safe\n if (currentBatch.length > 1) {\n // Try with half the batch\n const halfBatch = currentBatch.slice(\n 0,\n Math.floor(currentBatch.length / 2),\n );\n batches.push(halfBatch);\n currentBatch = currentBatch.slice(halfBatch.length);\n currentBytes = calculateBatchSize(currentBatch);\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n lastEstimatedGas = 0n;\n } else {\n // Single call failed, skip it or throw based on allowFailure\n if (!options.allowFailure) {\n throw new Error(\n `Gas estimation failed for call ${i}: ${String(error)}`,\n );\n }\n currentBatch = [];\n currentBytes = 0;\n continue;\n }\n }\n }\n\n // Check if adding this call would exceed limits\n const wouldExceedCalldata =\n currentBytes + callBytes > options.maxCalldataBytes;\n const wouldExceedGas =\n lastEstimatedGas > 0n &&\n estimateNextGas(lastEstimatedGas, callsSinceCheckpoint + 1) >\n options.maxGasPerBatch;\n\n // If we would exceed limits, finalize current batch\n if ((wouldExceedCalldata || wouldExceedGas) && currentBatch.length > 0) {\n batches.push(currentBatch);\n currentBatch = [];\n currentBytes = 0;\n lastCheckpointIndex = i;\n lastCheckpointBytes = 0;\n lastEstimatedGas = 0n;\n }\n\n // Add call to current batch\n currentBatch.push(contract);\n currentBytes += callBytes;\n }\n\n // Add final batch if not empty\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\n/**\n * Encodes a contract call to measure its calldata size.\n *\n * @param contract - The contract function configuration to encode\n * @returns Hex-encoded function data\n */\nfunction encodeContractCall(contract: ContractFunctionConfig): Hex {\n const { abi, functionName, args } = contract;\n\n return encodeFunctionData({\n abi,\n functionName,\n args,\n } as EncodeFunctionDataParameters);\n}\n\n/**\n * Calculates total encoded size of a batch.\n *\n * @param batch - Array of contract function configurations to measure\n * @returns Total size in bytes of all encoded calls in the batch\n */\nfunction calculateBatchSize(batch: ContractFunctionConfig[]): number {\n return batch.reduce((total, contract) => {\n const encoded = encodeContractCall(contract);\n return total + size(encoded);\n }, 0);\n}\n\n/**\n * Estimates gas for a batch of calls via multicall3.\n *\n * @param client - The viem public client for gas estimation\n * @param batch - Array of contract calls to estimate gas for\n * @param multicallAddress - The multicall3 contract address to use\n * @returns Estimated gas cost for executing the batch\n */\nasync function estimateBatchGas(\n client: PublicClient,\n batch: ContractFunctionConfig[],\n multicallAddress: Address,\n): Promise<bigint> {\n // Encode batch as multicall3 aggregate3 call\n const calls = batch.map((contract) => ({\n target: contract.address,\n allowFailure: false,\n callData: encodeContractCall(contract),\n }));\n\n // Estimate gas for the multicall\n const gas = await client.estimateGas({\n to: multicallAddress,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [calls],\n }),\n });\n\n return gas;\n}\n\n/**\n * Extrapolates gas usage for calls added since last checkpoint.\n *\n * @remarks\n * Uses a conservative 1.1x multiplier for safety to account for gas usage variations.\n *\n * @param lastGas - The gas estimate from the last checkpoint\n * @param callsSinceCheckpoint - Number of calls added since the checkpoint\n * @returns Extrapolated gas estimate with safety margin\n */\nfunction estimateNextGas(\n lastGas: bigint,\n callsSinceCheckpoint: number,\n): bigint {\n if (callsSinceCheckpoint === 0) return lastGas;\n\n // Assume linear scaling with safety factor\n const avgGasPerCall = lastGas / BigInt(Math.max(1, callsSinceCheckpoint - 1));\n const estimatedGas = lastGas + avgGasPerCall;\n\n // Apply 10% safety margin\n return (estimatedGas * 110n) / 100n;\n}\n\n/**\n * Minimal multicall3 ABI for gas estimation\n */\nconst multicall3Abi = [\n {\n name: \"aggregate3\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"allowFailure\", type: \"bool\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * Utility function to analyze calls and predict optimal batch configuration\n *\n * @remarks\n * This function helps determine the best configuration for a specific set of calls\n * by analyzing their characteristics. Useful for optimizing repeated operations.\n *\n * @param contracts - The calls to analyze\n * @returns Suggested configuration based on call analysis\n */\nexport function analyzeCallsForOptimalConfig(\n contracts: readonly ContractFunctionConfig[],\n): Pick<GasAwareMulticallOptions, \"checkpointFrequency\" | \"maxCalldataBytes\"> {\n // Calculate average call size\n const totalBytes = contracts.reduce((sum, contract) => {\n const encoded = encodeContractCall(contract);\n return sum + size(encoded);\n }, 0);\n\n const avgBytesPerCall = totalBytes / contracts.length;\n\n // Suggest checkpoint frequency based on call density\n const checkpointFrequency = {\n calls: avgBytesPerCall > 500 ? 16 : 32, // More frequent for large calls\n bytes: avgBytesPerCall > 500 ? 4096 : 8192,\n };\n\n // Suggest calldata limit based on total size\n // For 1000 calls with small arrays, totalBytes will be much less than 500KB,\n // so use number of contracts as additional signal\n const maxCalldataBytes =\n totalBytes > 50_000 || contracts.length > 500 ? 128_000 : 100_000;\n\n return {\n checkpointFrequency,\n maxCalldataBytes,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,kBAAyC;AACzC,uBAAkC;AAuGlC,MAAM,kBAA+D;AAAA,EACnE,gBAAgB;AAAA;AAAA,EAChB,kBAAkB;AAAA;AAAA,EAClB,qBAAqB;AAAA,IACnB,OAAO;AAAA,IACP,OAAO;AAAA;AAAA,EACT;AAAA,EACA,cAAc;AAChB;AAwCA,eAAsB,kBAIpB,QACA,YACA,UAAoC,CAAC,GACoB;AAEzD,QAAM,UAAU,MAAM,OAAO,WAAW;AACxC,QAAM,oBACJ,QAAQ,wBACR,oCAAkB,SAAwB,YAAY;AAGxD,QAAM,OAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,GAAG;AAAA,IACH,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,MACnB,GAAG,gBAAgB;AAAA,MACnB,GAAG,QAAQ;AAAA,IACb;AAAA,EACF;AAGA,MAAI,WAAW,iBAAiB,QAAW;AACzC,SAAK,eAAe,WAAW;AAAA,EACjC;AAEA,QAAM,EAAE,UAAU,IAAI;AACtB,MAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AAIxC,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,eAAe,MAAM,QAAQ;AAAA,IACjC,QAAQ,IAAI,CAAC,OAAO,UAAU;AAE5B,UAAI,KAAK,cAAc,QAAQ,GAAG;AAChC,cAAM,YAAY,QACf,MAAM,GAAG,KAAK,EACd,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,CAAC;AACvC,aAAK,WAAW,WAAW,UAAU,MAAM;AAAA,MAC7C;AAGA,aAAO,OAAO,UAAU;AAAA,QACtB,GAAG;AAAA,QACH,WAAW;AAAA,QACX,kBAAkB,KAAK;AAAA,QACvB,cAAc,KAAK;AAAA,MACrB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,YAAY;AACnB,SAAK,WAAW,UAAU,QAAQ,UAAU,MAAM;AAAA,EACpD;AAGA,SAAO,aAAa,KAAK;AAC3B;AAUA,eAAe,cACb,QACA,WACA,SACqC;AACrC,QAAM,UAAsC,CAAC;AAC7C,MAAI,eAAyC,CAAC;AAC9C,MAAI,eAAe;AACnB,MAAI,sBAAsB;AAC1B,MAAI,sBAAsB;AAC1B,MAAI,mBAAmB;AAEvB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,WAAW,UAAU,CAAC;AAG5B,UAAM,UAAU,mBAAmB,QAAQ;AAC3C,UAAM,gBAAY,kBAAK,OAAO;AAG9B,UAAM,uBAAuB,IAAI;AACjC,UAAM,uBAAuB,eAAe;AAE5C,UAAM,kBACJ,wBAAwB,QAAQ,oBAAoB,SACpD,wBAAwB,QAAQ,oBAAoB;AAGtD,QAAI,mBAAmB,aAAa,SAAS,GAAG;AAC9C,UAAI;AACF,2BAAmB,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,QACV;AACA,8BAAsB;AACtB,8BAAsB;AAAA,MACxB,SAAS,OAAO;AAEd,YAAI,aAAa,SAAS,GAAG;AAE3B,gBAAM,YAAY,aAAa;AAAA,YAC7B;AAAA,YACA,KAAK,MAAM,aAAa,SAAS,CAAC;AAAA,UACpC;AACA,kBAAQ,KAAK,SAAS;AACtB,yBAAe,aAAa,MAAM,UAAU,MAAM;AAClD,yBAAe,mBAAmB,YAAY;AAC9C,gCAAsB;AACtB,gCAAsB;AACtB,6BAAmB;AAAA,QACrB,OAAO;AAEL,cAAI,CAAC,QAAQ,cAAc;AACzB,kBAAM,IAAI;AAAA,cACR,kCAAkC,CAAC,KAAK,OAAO,KAAK,CAAC;AAAA,YACvD;AAAA,UACF;AACA,yBAAe,CAAC;AAChB,yBAAe;AACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,sBACJ,eAAe,YAAY,QAAQ;AACrC,UAAM,iBACJ,mBAAmB,MACnB,gBAAgB,kBAAkB,uBAAuB,CAAC,IACxD,QAAQ;AAGZ,SAAK,uBAAuB,mBAAmB,aAAa,SAAS,GAAG;AACtE,cAAQ,KAAK,YAAY;AACzB,qBAAe,CAAC;AAChB,qBAAe;AACf,4BAAsB;AACtB,4BAAsB;AACtB,yBAAmB;AAAA,IACrB;AAGA,iBAAa,KAAK,QAAQ;AAC1B,oBAAgB;AAAA,EAClB;AAGA,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,KAAK,YAAY;AAAA,EAC3B;AAEA,SAAO;AACT;AAQA,SAAS,mBAAmB,UAAuC;AACjE,QAAM,EAAE,KAAK,cAAc,KAAK,IAAI;AAEpC,aAAO,gCAAmB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAiC;AACnC;AAQA,SAAS,mBAAmB,OAAyC;AACnE,SAAO,MAAM,OAAO,CAAC,OAAO,aAAa;AACvC,UAAM,UAAU,mBAAmB,QAAQ;AAC3C,WAAO,YAAQ,kBAAK,OAAO;AAAA,EAC7B,GAAG,CAAC;AACN;AAUA,eAAe,iBACb,QACA,OACA,kBACiB;AAEjB,QAAM,QAAQ,MAAM,IAAI,CAAC,cAAc;AAAA,IACrC,QAAQ,SAAS;AAAA,IACjB,cAAc;AAAA,IACd,UAAU,mBAAmB,QAAQ;AAAA,EACvC,EAAE;AAGF,QAAM,MAAM,MAAM,OAAO,YAAY;AAAA,IACnC,IAAI;AAAA,IACJ,UAAM,gCAAmB;AAAA,MACvB,KAAK;AAAA,MACL,cAAc;AAAA,MACd,MAAM,CAAC,KAAK;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;AAYA,SAAS,gBACP,SACA,sBACQ;AACR,MAAI,yBAAyB,EAAG,QAAO;AAGvC,QAAM,gBAAgB,UAAU,OAAO,KAAK,IAAI,GAAG,uBAAuB,CAAC,CAAC;AAC5E,QAAM,eAAe,UAAU;AAG/B,SAAQ,eAAe,OAAQ;AACjC;AAKA,MAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,UAClC,EAAE,MAAM,gBAAgB,MAAM,OAAO;AAAA,UACrC,EAAE,MAAM,YAAY,MAAM,QAAQ;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,WAAW,MAAM,OAAO;AAAA,UAChC,EAAE,MAAM,cAAc,MAAM,QAAQ;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAYO,SAAS,6BACd,WAC4E;AAE5E,QAAM,aAAa,UAAU,OAAO,CAAC,KAAK,aAAa;AACrD,UAAM,UAAU,mBAAmB,QAAQ;AAC3C,WAAO,UAAM,kBAAK,OAAO;AAAA,EAC3B,GAAG,CAAC;AAEJ,QAAM,kBAAkB,aAAa,UAAU;AAG/C,QAAM,sBAAsB;AAAA,IAC1B,OAAO,kBAAkB,MAAM,KAAK;AAAA;AAAA,IACpC,OAAO,kBAAkB,MAAM,OAAO;AAAA,EACxC;AAKA,QAAM,mBACJ,aAAa,OAAU,UAAU,SAAS,MAAM,QAAU;AAE5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -1,9 +1,8 @@
1
- import { Address, Abi, PublicClient, MulticallParameters, MulticallReturnType } from 'viem';
2
-
1
+ import type { Address, PublicClient, MulticallParameters, MulticallReturnType, Abi } from "viem";
3
2
  /**
4
3
  * Type for a contract function configuration used in multicall
5
4
  */
6
- interface ContractFunctionConfig {
5
+ export interface ContractFunctionConfig {
7
6
  address: Address;
8
7
  abi: Abi;
9
8
  functionName: string;
@@ -17,7 +16,7 @@ interface ContractFunctionConfig {
17
16
  * to stay within gas and calldata limits. The defaults are conservative
18
17
  * to ensure compatibility across different chains and RPC providers.
19
18
  */
20
- interface GasAwareMulticallOptions {
19
+ export interface GasAwareMulticallOptions {
21
20
  /**
22
21
  * Maximum gas per batch. Defaults to 10M (conservative for most chains).
23
22
  *
@@ -113,7 +112,7 @@ interface GasAwareMulticallOptions {
113
112
  * });
114
113
  * ```
115
114
  */
116
- declare function gasAwareMulticall<TContracts extends readonly ContractFunctionConfig[], TAllowFailure extends boolean = false>(client: PublicClient, parameters: MulticallParameters<TContracts, TAllowFailure>, options?: GasAwareMulticallOptions): Promise<MulticallReturnType<TContracts, TAllowFailure>>;
115
+ export declare function gasAwareMulticall<TContracts extends readonly ContractFunctionConfig[], TAllowFailure extends boolean = false>(client: PublicClient, parameters: MulticallParameters<TContracts, TAllowFailure>, options?: GasAwareMulticallOptions): Promise<MulticallReturnType<TContracts, TAllowFailure>>;
117
116
  /**
118
117
  * Utility function to analyze calls and predict optimal batch configuration
119
118
  *
@@ -124,6 +123,4 @@ declare function gasAwareMulticall<TContracts extends readonly ContractFunctionC
124
123
  * @param contracts - The calls to analyze
125
124
  * @returns Suggested configuration based on call analysis
126
125
  */
127
- declare function analyzeCallsForOptimalConfig(contracts: readonly ContractFunctionConfig[]): Pick<GasAwareMulticallOptions, "checkpointFrequency" | "maxCalldataBytes">;
128
-
129
- export { type ContractFunctionConfig, type GasAwareMulticallOptions, analyzeCallsForOptimalConfig, gasAwareMulticall };
126
+ export declare function analyzeCallsForOptimalConfig(contracts: readonly ContractFunctionConfig[]): Pick<GasAwareMulticallOptions, "checkpointFrequency" | "maxCalldataBytes">;
@@ -14,7 +14,7 @@ const DEFAULT_OPTIONS = {
14
14
  };
15
15
  async function gasAwareMulticall(client, parameters, options = {}) {
16
16
  const chainId = await client.getChainId();
17
- const multicall3Address = options.multicallAddress || getUtilityAddress(chainId, "Multicall3");
17
+ const multicall3Address = options.multicallAddress ?? getUtilityAddress(chainId, "Multicall3");
18
18
  const opts = {
19
19
  ...DEFAULT_OPTIONS,
20
20
  ...options,
@@ -92,7 +92,9 @@ async function createBatches(client, contracts, options) {
92
92
  lastEstimatedGas = 0n;
93
93
  } else {
94
94
  if (!options.allowFailure) {
95
- throw new Error(`Gas estimation failed for call ${i}: ${error}`);
95
+ throw new Error(
96
+ `Gas estimation failed for call ${i}: ${String(error)}`
97
+ );
96
98
  }
97
99
  currentBatch = [];
98
100
  currentBytes = 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/multicall.ts"],"sourcesContent":["import type {\n Address,\n PublicClient,\n MulticallParameters,\n MulticallReturnType,\n EncodeFunctionDataParameters,\n Hex,\n Abi,\n} from \"viem\";\nimport { encodeFunctionData, size } from \"viem\";\nimport { getUtilityAddress } from \"../config/addresses\";\nimport type { VanaChainId } from \"../types\";\n\n/**\n * Type for a contract function configuration used in multicall\n */\nexport interface ContractFunctionConfig {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n}\n\n/**\n * Configuration options for gas-aware multicall batching.\n *\n * @remarks\n * These options control how the multicall utility splits large batches\n * to stay within gas and calldata limits. The defaults are conservative\n * to ensure compatibility across different chains and RPC providers.\n */\nexport interface GasAwareMulticallOptions {\n /**\n * Maximum gas per batch. Defaults to 10M (conservative for most chains).\n *\n * @remarks\n * This should be set below the block gas limit of your target chain.\n * Common values:\n * - Vana mainnet: 30M (use 25M for safety)\n * - Vana moksha: 30M (use 25M for safety)\n * - Ethereum mainnet: 30M (use 25M for safety)\n * - Arbitrum: 32M (use 25M for safety)\n */\n maxGasPerBatch?: bigint;\n\n /**\n * Maximum calldata size per batch in bytes. Defaults to 100KB.\n *\n * @remarks\n * This is particularly important for L2 chains where calldata is expensive.\n * Some RPC providers also have limits on request size.\n */\n maxCalldataBytes?: number;\n\n /**\n * How often to checkpoint gas estimates. Defaults to every 32 calls or 8KB.\n *\n * @remarks\n * More frequent checkpoints give more accurate batching but require more\n * RPC calls for gas estimation. The default balances accuracy vs performance.\n */\n checkpointFrequency?: {\n /** Checkpoint after this many calls */\n calls: number;\n /** Checkpoint after this many bytes of calldata */\n bytes: number;\n };\n\n /**\n * Whether to allow partial batch failures. Defaults to false.\n *\n * @remarks\n * When true, individual call failures won't fail the entire batch.\n * This matches viem's multicall behavior with allowFailure option.\n */\n allowFailure?: boolean;\n\n /**\n * Optional multicall3 contract address override.\n *\n * @remarks\n * By default, uses the standard multicall3 address deployed on most chains:\n * 0xcA11bde05977b3631167028862bE2a173976CA11\n */\n multicallAddress?: Address;\n\n /**\n * Optional callback for tracking batching progress.\n *\n * @remarks\n * Useful for showing progress in UI or debugging batch performance.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Internal configuration with defaults applied\n */\ninterface NormalizedOptions {\n maxGasPerBatch: bigint;\n maxCalldataBytes: number;\n checkpointFrequency: {\n calls: number;\n bytes: number;\n };\n allowFailure: boolean;\n multicallAddress: Address;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"multicallAddress\"> = {\n maxGasPerBatch: 10_000_000n, // 10M gas - conservative default\n maxCalldataBytes: 100_000, // 100KB - works with most RPC providers\n checkpointFrequency: {\n calls: 32,\n bytes: 8192, // 8KB\n },\n allowFailure: false,\n};\n\n/**\n * A gas-aware multicall function that automatically batches calls to stay within limits.\n *\n * @remarks\n * This function extends viem's multicall with intelligent batching based on:\n * - Actual gas costs (via periodic estimateGas calls)\n * - Calldata size limits\n * - Chain-specific constraints\n *\n * It uses a greedy algorithm with periodic checkpoints to efficiently determine\n * optimal batch sizes without making excessive RPC calls.\n *\n * @param client - The viem public client to use for RPC calls\n * @param parameters - The multicall parameters (same as viem's multicall)\n * @param options - Optional configuration for gas-aware batching\n * @returns The aggregated results from all batches\n *\n * @example\n * ```typescript\n * // Basic usage - drop-in replacement for viem's multicall\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: [\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address1] },\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address2] },\n * // ... hundreds more calls\n * ]\n * });\n *\n * // With custom limits for a specific chain\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: calls,\n * }, {\n * maxGasPerBatch: 25_000_000n, // 25M for mainnet\n * maxCalldataBytes: 128_000, // 128KB\n * onProgress: (done, total) => console.log(`Progress: ${done}/${total}`)\n * });\n * ```\n */\nexport async function gasAwareMulticall<\n TContracts extends readonly ContractFunctionConfig[],\n TAllowFailure extends boolean = false,\n>(\n client: PublicClient,\n parameters: MulticallParameters<TContracts, TAllowFailure>,\n options: GasAwareMulticallOptions = {},\n): Promise<MulticallReturnType<TContracts, TAllowFailure>> {\n // Get the chain-specific Multicall3 address\n const chainId = await client.getChainId();\n const multicall3Address =\n options.multicallAddress ||\n getUtilityAddress(chainId as VanaChainId, \"Multicall3\");\n\n // Normalize options with defaults\n const opts: NormalizedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n multicallAddress: multicall3Address,\n checkpointFrequency: {\n ...DEFAULT_OPTIONS.checkpointFrequency,\n ...options.checkpointFrequency,\n },\n };\n\n // Override allowFailure if specified in parameters\n if (parameters.allowFailure !== undefined) {\n opts.allowFailure = parameters.allowFailure;\n }\n\n const { contracts } = parameters;\n if (!contracts || contracts.length === 0) {\n return [] as unknown as MulticallReturnType<TContracts, TAllowFailure>;\n }\n\n // Execute batching algorithm\n const batches = await createBatches(\n client,\n contracts as readonly ContractFunctionConfig[],\n opts,\n );\n\n // Execute all batches in parallel\n const batchResults = await Promise.all(\n batches.map((batch, index) => {\n // Report progress if callback provided\n if (opts.onProgress && index > 0) {\n const completed = batches\n .slice(0, index)\n .reduce((sum, b) => sum + b.length, 0);\n opts.onProgress(completed, contracts.length);\n }\n\n // Execute batch using viem's multicall\n return client.multicall({\n ...parameters,\n contracts: batch as typeof contracts,\n multicallAddress: opts.multicallAddress,\n allowFailure: opts.allowFailure,\n });\n }),\n );\n\n // Report final progress\n if (opts.onProgress) {\n opts.onProgress(contracts.length, contracts.length);\n }\n\n // Flatten results\n return batchResults.flat() as MulticallReturnType<TContracts, TAllowFailure>;\n}\n\n/**\n * Creates optimally-sized batches using greedy algorithm with checkpoints.\n *\n * @param client - The viem public client for making RPC calls\n * @param contracts - Array of contract function configurations to batch\n * @param options - Normalized batching options with limits and settings\n * @returns Array of optimally-sized contract function configuration batches\n */\nasync function createBatches(\n client: PublicClient,\n contracts: readonly ContractFunctionConfig[],\n options: NormalizedOptions,\n): Promise<ContractFunctionConfig[][]> {\n const batches: ContractFunctionConfig[][] = [];\n let currentBatch: ContractFunctionConfig[] = [];\n let currentBytes = 0;\n let lastCheckpointIndex = 0;\n let lastCheckpointBytes = 0;\n let lastEstimatedGas = 0n;\n\n for (let i = 0; i < contracts.length; i++) {\n const contract = contracts[i];\n\n // Calculate encoded size for this call\n const encoded = encodeContractCall(contract);\n const callBytes = size(encoded);\n\n // Check if we need a gas checkpoint\n const callsSinceCheckpoint = i - lastCheckpointIndex;\n const bytesSinceCheckpoint = currentBytes - lastCheckpointBytes;\n\n const needsCheckpoint =\n callsSinceCheckpoint >= options.checkpointFrequency.calls ||\n bytesSinceCheckpoint >= options.checkpointFrequency.bytes;\n\n // Perform checkpoint if needed\n if (needsCheckpoint && currentBatch.length > 0) {\n try {\n lastEstimatedGas = await estimateBatchGas(\n client,\n currentBatch,\n options.multicallAddress,\n );\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n } catch (error) {\n // If estimation fails, finalize current batch to be safe\n if (currentBatch.length > 1) {\n // Try with half the batch\n const halfBatch = currentBatch.slice(\n 0,\n Math.floor(currentBatch.length / 2),\n );\n batches.push(halfBatch);\n currentBatch = currentBatch.slice(halfBatch.length);\n currentBytes = calculateBatchSize(currentBatch);\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n lastEstimatedGas = 0n;\n } else {\n // Single call failed, skip it or throw based on allowFailure\n if (!options.allowFailure) {\n throw new Error(`Gas estimation failed for call ${i}: ${error}`);\n }\n currentBatch = [];\n currentBytes = 0;\n continue;\n }\n }\n }\n\n // Check if adding this call would exceed limits\n const wouldExceedCalldata =\n currentBytes + callBytes > options.maxCalldataBytes;\n const wouldExceedGas =\n lastEstimatedGas > 0n &&\n estimateNextGas(lastEstimatedGas, callsSinceCheckpoint + 1) >\n options.maxGasPerBatch;\n\n // If we would exceed limits, finalize current batch\n if ((wouldExceedCalldata || wouldExceedGas) && currentBatch.length > 0) {\n batches.push(currentBatch);\n currentBatch = [];\n currentBytes = 0;\n lastCheckpointIndex = i;\n lastCheckpointBytes = 0;\n lastEstimatedGas = 0n;\n }\n\n // Add call to current batch\n currentBatch.push(contract);\n currentBytes += callBytes;\n }\n\n // Add final batch if not empty\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\n/**\n * Encodes a contract call to measure its calldata size.\n *\n * @param contract - The contract function configuration to encode\n * @returns Hex-encoded function data\n */\nfunction encodeContractCall(contract: ContractFunctionConfig): Hex {\n const { abi, functionName, args } = contract;\n\n return encodeFunctionData({\n abi,\n functionName,\n args,\n } as EncodeFunctionDataParameters);\n}\n\n/**\n * Calculates total encoded size of a batch.\n *\n * @param batch - Array of contract function configurations to measure\n * @returns Total size in bytes of all encoded calls in the batch\n */\nfunction calculateBatchSize(batch: ContractFunctionConfig[]): number {\n return batch.reduce((total, contract) => {\n const encoded = encodeContractCall(contract);\n return total + size(encoded);\n }, 0);\n}\n\n/**\n * Estimates gas for a batch of calls via multicall3.\n *\n * @param client - The viem public client for gas estimation\n * @param batch - Array of contract calls to estimate gas for\n * @param multicallAddress - The multicall3 contract address to use\n * @returns Estimated gas cost for executing the batch\n */\nasync function estimateBatchGas(\n client: PublicClient,\n batch: ContractFunctionConfig[],\n multicallAddress: Address,\n): Promise<bigint> {\n // Encode batch as multicall3 aggregate3 call\n const calls = batch.map((contract) => ({\n target: contract.address,\n allowFailure: false,\n callData: encodeContractCall(contract),\n }));\n\n // Estimate gas for the multicall\n const gas = await client.estimateGas({\n to: multicallAddress,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [calls],\n }),\n });\n\n return gas;\n}\n\n/**\n * Extrapolates gas usage for calls added since last checkpoint.\n *\n * @remarks\n * Uses a conservative 1.1x multiplier for safety to account for gas usage variations.\n *\n * @param lastGas - The gas estimate from the last checkpoint\n * @param callsSinceCheckpoint - Number of calls added since the checkpoint\n * @returns Extrapolated gas estimate with safety margin\n */\nfunction estimateNextGas(\n lastGas: bigint,\n callsSinceCheckpoint: number,\n): bigint {\n if (callsSinceCheckpoint === 0) return lastGas;\n\n // Assume linear scaling with safety factor\n const avgGasPerCall = lastGas / BigInt(Math.max(1, callsSinceCheckpoint - 1));\n const estimatedGas = lastGas + avgGasPerCall;\n\n // Apply 10% safety margin\n return (estimatedGas * 110n) / 100n;\n}\n\n/**\n * Minimal multicall3 ABI for gas estimation\n */\nconst multicall3Abi = [\n {\n name: \"aggregate3\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"allowFailure\", type: \"bool\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * Utility function to analyze calls and predict optimal batch configuration\n *\n * @remarks\n * This function helps determine the best configuration for a specific set of calls\n * by analyzing their characteristics. Useful for optimizing repeated operations.\n *\n * @param contracts - The calls to analyze\n * @returns Suggested configuration based on call analysis\n */\nexport function analyzeCallsForOptimalConfig(\n contracts: readonly ContractFunctionConfig[],\n): Pick<GasAwareMulticallOptions, \"checkpointFrequency\" | \"maxCalldataBytes\"> {\n // Calculate average call size\n const totalBytes = contracts.reduce((sum, contract) => {\n const encoded = encodeContractCall(contract);\n return sum + size(encoded);\n }, 0);\n\n const avgBytesPerCall = totalBytes / contracts.length;\n\n // Suggest checkpoint frequency based on call density\n const checkpointFrequency = {\n calls: avgBytesPerCall > 500 ? 16 : 32, // More frequent for large calls\n bytes: avgBytesPerCall > 500 ? 4096 : 8192,\n };\n\n // Suggest calldata limit based on total size\n // For 1000 calls with small arrays, totalBytes will be much less than 500KB,\n // so use number of contracts as additional signal\n const maxCalldataBytes =\n totalBytes > 50_000 || contracts.length > 500 ? 128_000 : 100_000;\n\n return {\n checkpointFrequency,\n maxCalldataBytes,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/multicall.ts"],"sourcesContent":["import type {\n Address,\n PublicClient,\n MulticallParameters,\n MulticallReturnType,\n EncodeFunctionDataParameters,\n Hex,\n Abi,\n} from \"viem\";\nimport { encodeFunctionData, size } from \"viem\";\nimport { getUtilityAddress } from \"../config/addresses\";\nimport type { VanaChainId } from \"../types\";\n\n/**\n * Type for a contract function configuration used in multicall\n */\nexport interface ContractFunctionConfig {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n}\n\n/**\n * Configuration options for gas-aware multicall batching.\n *\n * @remarks\n * These options control how the multicall utility splits large batches\n * to stay within gas and calldata limits. The defaults are conservative\n * to ensure compatibility across different chains and RPC providers.\n */\nexport interface GasAwareMulticallOptions {\n /**\n * Maximum gas per batch. Defaults to 10M (conservative for most chains).\n *\n * @remarks\n * This should be set below the block gas limit of your target chain.\n * Common values:\n * - Vana mainnet: 30M (use 25M for safety)\n * - Vana moksha: 30M (use 25M for safety)\n * - Ethereum mainnet: 30M (use 25M for safety)\n * - Arbitrum: 32M (use 25M for safety)\n */\n maxGasPerBatch?: bigint;\n\n /**\n * Maximum calldata size per batch in bytes. Defaults to 100KB.\n *\n * @remarks\n * This is particularly important for L2 chains where calldata is expensive.\n * Some RPC providers also have limits on request size.\n */\n maxCalldataBytes?: number;\n\n /**\n * How often to checkpoint gas estimates. Defaults to every 32 calls or 8KB.\n *\n * @remarks\n * More frequent checkpoints give more accurate batching but require more\n * RPC calls for gas estimation. The default balances accuracy vs performance.\n */\n checkpointFrequency?: {\n /** Checkpoint after this many calls */\n calls: number;\n /** Checkpoint after this many bytes of calldata */\n bytes: number;\n };\n\n /**\n * Whether to allow partial batch failures. Defaults to false.\n *\n * @remarks\n * When true, individual call failures won't fail the entire batch.\n * This matches viem's multicall behavior with allowFailure option.\n */\n allowFailure?: boolean;\n\n /**\n * Optional multicall3 contract address override.\n *\n * @remarks\n * By default, uses the standard multicall3 address deployed on most chains:\n * 0xcA11bde05977b3631167028862bE2a173976CA11\n */\n multicallAddress?: Address;\n\n /**\n * Optional callback for tracking batching progress.\n *\n * @remarks\n * Useful for showing progress in UI or debugging batch performance.\n */\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Internal configuration with defaults applied\n */\ninterface NormalizedOptions {\n maxGasPerBatch: bigint;\n maxCalldataBytes: number;\n checkpointFrequency: {\n calls: number;\n bytes: number;\n };\n allowFailure: boolean;\n multicallAddress: Address;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_OPTIONS: Omit<NormalizedOptions, \"multicallAddress\"> = {\n maxGasPerBatch: 10_000_000n, // 10M gas - conservative default\n maxCalldataBytes: 100_000, // 100KB - works with most RPC providers\n checkpointFrequency: {\n calls: 32,\n bytes: 8192, // 8KB\n },\n allowFailure: false,\n};\n\n/**\n * A gas-aware multicall function that automatically batches calls to stay within limits.\n *\n * @remarks\n * This function extends viem's multicall with intelligent batching based on:\n * - Actual gas costs (via periodic estimateGas calls)\n * - Calldata size limits\n * - Chain-specific constraints\n *\n * It uses a greedy algorithm with periodic checkpoints to efficiently determine\n * optimal batch sizes without making excessive RPC calls.\n *\n * @param client - The viem public client to use for RPC calls\n * @param parameters - The multicall parameters (same as viem's multicall)\n * @param options - Optional configuration for gas-aware batching\n * @returns The aggregated results from all batches\n *\n * @example\n * ```typescript\n * // Basic usage - drop-in replacement for viem's multicall\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: [\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address1] },\n * { address: '0x...', abi: erc20Abi, functionName: 'balanceOf', args: [address2] },\n * // ... hundreds more calls\n * ]\n * });\n *\n * // With custom limits for a specific chain\n * const results = await gasAwareMulticall(publicClient, {\n * contracts: calls,\n * }, {\n * maxGasPerBatch: 25_000_000n, // 25M for mainnet\n * maxCalldataBytes: 128_000, // 128KB\n * onProgress: (done, total) => console.log(`Progress: ${done}/${total}`)\n * });\n * ```\n */\nexport async function gasAwareMulticall<\n TContracts extends readonly ContractFunctionConfig[],\n TAllowFailure extends boolean = false,\n>(\n client: PublicClient,\n parameters: MulticallParameters<TContracts, TAllowFailure>,\n options: GasAwareMulticallOptions = {},\n): Promise<MulticallReturnType<TContracts, TAllowFailure>> {\n // Get the chain-specific Multicall3 address\n const chainId = await client.getChainId();\n const multicall3Address =\n options.multicallAddress ??\n getUtilityAddress(chainId as VanaChainId, \"Multicall3\");\n\n // Normalize options with defaults\n const opts: NormalizedOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n multicallAddress: multicall3Address,\n checkpointFrequency: {\n ...DEFAULT_OPTIONS.checkpointFrequency,\n ...options.checkpointFrequency,\n },\n };\n\n // Override allowFailure if specified in parameters\n if (parameters.allowFailure !== undefined) {\n opts.allowFailure = parameters.allowFailure;\n }\n\n const { contracts } = parameters;\n if (!contracts || contracts.length === 0) {\n // TODO(TYPES): Empty array needs to match complex generic return type.\n // Future improvement: Use conditional types to properly type empty results\n // based on TAllowFailure parameter. Consider creating utility type helper.\n return [] as unknown as MulticallReturnType<TContracts, TAllowFailure>;\n }\n\n // Execute batching algorithm\n const batches = await createBatches(\n client,\n contracts as readonly ContractFunctionConfig[],\n opts,\n );\n\n // Execute all batches in parallel\n const batchResults = await Promise.all(\n batches.map((batch, index) => {\n // Report progress if callback provided\n if (opts.onProgress && index > 0) {\n const completed = batches\n .slice(0, index)\n .reduce((sum, b) => sum + b.length, 0);\n opts.onProgress(completed, contracts.length);\n }\n\n // Execute batch using viem's multicall\n return client.multicall({\n ...parameters,\n contracts: batch as typeof contracts,\n multicallAddress: opts.multicallAddress,\n allowFailure: opts.allowFailure,\n });\n }),\n );\n\n // Report final progress\n if (opts.onProgress) {\n opts.onProgress(contracts.length, contracts.length);\n }\n\n // Flatten results\n return batchResults.flat() as MulticallReturnType<TContracts, TAllowFailure>;\n}\n\n/**\n * Creates optimally-sized batches using greedy algorithm with checkpoints.\n *\n * @param client - The viem public client for making RPC calls\n * @param contracts - Array of contract function configurations to batch\n * @param options - Normalized batching options with limits and settings\n * @returns Array of optimally-sized contract function configuration batches\n */\nasync function createBatches(\n client: PublicClient,\n contracts: readonly ContractFunctionConfig[],\n options: NormalizedOptions,\n): Promise<ContractFunctionConfig[][]> {\n const batches: ContractFunctionConfig[][] = [];\n let currentBatch: ContractFunctionConfig[] = [];\n let currentBytes = 0;\n let lastCheckpointIndex = 0;\n let lastCheckpointBytes = 0;\n let lastEstimatedGas = 0n;\n\n for (let i = 0; i < contracts.length; i++) {\n const contract = contracts[i];\n\n // Calculate encoded size for this call\n const encoded = encodeContractCall(contract);\n const callBytes = size(encoded);\n\n // Check if we need a gas checkpoint\n const callsSinceCheckpoint = i - lastCheckpointIndex;\n const bytesSinceCheckpoint = currentBytes - lastCheckpointBytes;\n\n const needsCheckpoint =\n callsSinceCheckpoint >= options.checkpointFrequency.calls ||\n bytesSinceCheckpoint >= options.checkpointFrequency.bytes;\n\n // Perform checkpoint if needed\n if (needsCheckpoint && currentBatch.length > 0) {\n try {\n lastEstimatedGas = await estimateBatchGas(\n client,\n currentBatch,\n options.multicallAddress,\n );\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n } catch (error) {\n // If estimation fails, finalize current batch to be safe\n if (currentBatch.length > 1) {\n // Try with half the batch\n const halfBatch = currentBatch.slice(\n 0,\n Math.floor(currentBatch.length / 2),\n );\n batches.push(halfBatch);\n currentBatch = currentBatch.slice(halfBatch.length);\n currentBytes = calculateBatchSize(currentBatch);\n lastCheckpointIndex = i;\n lastCheckpointBytes = currentBytes;\n lastEstimatedGas = 0n;\n } else {\n // Single call failed, skip it or throw based on allowFailure\n if (!options.allowFailure) {\n throw new Error(\n `Gas estimation failed for call ${i}: ${String(error)}`,\n );\n }\n currentBatch = [];\n currentBytes = 0;\n continue;\n }\n }\n }\n\n // Check if adding this call would exceed limits\n const wouldExceedCalldata =\n currentBytes + callBytes > options.maxCalldataBytes;\n const wouldExceedGas =\n lastEstimatedGas > 0n &&\n estimateNextGas(lastEstimatedGas, callsSinceCheckpoint + 1) >\n options.maxGasPerBatch;\n\n // If we would exceed limits, finalize current batch\n if ((wouldExceedCalldata || wouldExceedGas) && currentBatch.length > 0) {\n batches.push(currentBatch);\n currentBatch = [];\n currentBytes = 0;\n lastCheckpointIndex = i;\n lastCheckpointBytes = 0;\n lastEstimatedGas = 0n;\n }\n\n // Add call to current batch\n currentBatch.push(contract);\n currentBytes += callBytes;\n }\n\n // Add final batch if not empty\n if (currentBatch.length > 0) {\n batches.push(currentBatch);\n }\n\n return batches;\n}\n\n/**\n * Encodes a contract call to measure its calldata size.\n *\n * @param contract - The contract function configuration to encode\n * @returns Hex-encoded function data\n */\nfunction encodeContractCall(contract: ContractFunctionConfig): Hex {\n const { abi, functionName, args } = contract;\n\n return encodeFunctionData({\n abi,\n functionName,\n args,\n } as EncodeFunctionDataParameters);\n}\n\n/**\n * Calculates total encoded size of a batch.\n *\n * @param batch - Array of contract function configurations to measure\n * @returns Total size in bytes of all encoded calls in the batch\n */\nfunction calculateBatchSize(batch: ContractFunctionConfig[]): number {\n return batch.reduce((total, contract) => {\n const encoded = encodeContractCall(contract);\n return total + size(encoded);\n }, 0);\n}\n\n/**\n * Estimates gas for a batch of calls via multicall3.\n *\n * @param client - The viem public client for gas estimation\n * @param batch - Array of contract calls to estimate gas for\n * @param multicallAddress - The multicall3 contract address to use\n * @returns Estimated gas cost for executing the batch\n */\nasync function estimateBatchGas(\n client: PublicClient,\n batch: ContractFunctionConfig[],\n multicallAddress: Address,\n): Promise<bigint> {\n // Encode batch as multicall3 aggregate3 call\n const calls = batch.map((contract) => ({\n target: contract.address,\n allowFailure: false,\n callData: encodeContractCall(contract),\n }));\n\n // Estimate gas for the multicall\n const gas = await client.estimateGas({\n to: multicallAddress,\n data: encodeFunctionData({\n abi: multicall3Abi,\n functionName: \"aggregate3\",\n args: [calls],\n }),\n });\n\n return gas;\n}\n\n/**\n * Extrapolates gas usage for calls added since last checkpoint.\n *\n * @remarks\n * Uses a conservative 1.1x multiplier for safety to account for gas usage variations.\n *\n * @param lastGas - The gas estimate from the last checkpoint\n * @param callsSinceCheckpoint - Number of calls added since the checkpoint\n * @returns Extrapolated gas estimate with safety margin\n */\nfunction estimateNextGas(\n lastGas: bigint,\n callsSinceCheckpoint: number,\n): bigint {\n if (callsSinceCheckpoint === 0) return lastGas;\n\n // Assume linear scaling with safety factor\n const avgGasPerCall = lastGas / BigInt(Math.max(1, callsSinceCheckpoint - 1));\n const estimatedGas = lastGas + avgGasPerCall;\n\n // Apply 10% safety margin\n return (estimatedGas * 110n) / 100n;\n}\n\n/**\n * Minimal multicall3 ABI for gas estimation\n */\nconst multicall3Abi = [\n {\n name: \"aggregate3\",\n type: \"function\",\n stateMutability: \"payable\",\n inputs: [\n {\n name: \"calls\",\n type: \"tuple[]\",\n components: [\n { name: \"target\", type: \"address\" },\n { name: \"allowFailure\", type: \"bool\" },\n { name: \"callData\", type: \"bytes\" },\n ],\n },\n ],\n outputs: [\n {\n name: \"returnData\",\n type: \"tuple[]\",\n components: [\n { name: \"success\", type: \"bool\" },\n { name: \"returnData\", type: \"bytes\" },\n ],\n },\n ],\n },\n] as const;\n\n/**\n * Utility function to analyze calls and predict optimal batch configuration\n *\n * @remarks\n * This function helps determine the best configuration for a specific set of calls\n * by analyzing their characteristics. Useful for optimizing repeated operations.\n *\n * @param contracts - The calls to analyze\n * @returns Suggested configuration based on call analysis\n */\nexport function analyzeCallsForOptimalConfig(\n contracts: readonly ContractFunctionConfig[],\n): Pick<GasAwareMulticallOptions, \"checkpointFrequency\" | \"maxCalldataBytes\"> {\n // Calculate average call size\n const totalBytes = contracts.reduce((sum, contract) => {\n const encoded = encodeContractCall(contract);\n return sum + size(encoded);\n }, 0);\n\n const avgBytesPerCall = totalBytes / contracts.length;\n\n // Suggest checkpoint frequency based on call density\n const checkpointFrequency = {\n calls: avgBytesPerCall > 500 ? 16 : 32, // More frequent for large calls\n bytes: avgBytesPerCall > 500 ? 4096 : 8192,\n };\n\n // Suggest calldata limit based on total size\n // For 1000 calls with small arrays, totalBytes will be much less than 500KB,\n // so use number of contracts as additional signal\n const maxCalldataBytes =\n totalBytes > 50_000 || contracts.length > 500 ? 128_000 : 100_000;\n\n return {\n checkpointFrequency,\n maxCalldataBytes,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var parseTransactionPojo_exports = {};
20
+ __export(parseTransactionPojo_exports, {
21
+ parseTransaction: () => parseTransaction
22
+ });
23
+ module.exports = __toCommonJS(parseTransactionPojo_exports);
24
+ var import_viem = require("viem");
25
+ var import_eventRegistry = require("../generated/eventRegistry");
26
+ function parseTransaction(transactionResult, receipt) {
27
+ const { contract: contractName, fn: functionName } = transactionResult;
28
+ const registryKey = `${contractName}.${functionName}`;
29
+ const registry = import_eventRegistry.EVENT_REGISTRY[registryKey];
30
+ const expectedEvents = {};
31
+ const allEvents = [];
32
+ let hasExpectedEvents = false;
33
+ if (receipt.logs) {
34
+ for (const log of receipt.logs) {
35
+ if (!log.topics || log.topics.length === 0) {
36
+ continue;
37
+ }
38
+ const eventTopic = log.topics[0];
39
+ const abiCandidates = import_eventRegistry.TOPIC_TO_ABIS.get(eventTopic);
40
+ if (abiCandidates && abiCandidates.length > 0) {
41
+ for (const abiEvent of abiCandidates) {
42
+ try {
43
+ const decoded = (0, import_viem.decodeEventLog)({
44
+ abi: [abiEvent],
45
+ data: log.data,
46
+ topics: log.topics
47
+ });
48
+ allEvents.push({
49
+ contractAddress: log.address || "",
50
+ eventName: decoded.eventName,
51
+ args: decoded.args,
52
+ logIndex: log.logIndex ?? 0
53
+ });
54
+ if (registry && registry.eventNames.includes(decoded.eventName)) {
55
+ expectedEvents[decoded.eventName] = decoded.args;
56
+ hasExpectedEvents = true;
57
+ }
58
+ break;
59
+ } catch {
60
+ continue;
61
+ }
62
+ }
63
+ } else {
64
+ allEvents.push({
65
+ contractAddress: log.address || "",
66
+ eventName: "Unknown",
67
+ args: { topic0: eventTopic, data: log.data },
68
+ logIndex: log.logIndex ?? 0
69
+ });
70
+ }
71
+ }
72
+ }
73
+ return {
74
+ hash: transactionResult.hash,
75
+ from: transactionResult.from,
76
+ contract: contractName,
77
+ fn: functionName,
78
+ expectedEvents,
79
+ allEvents,
80
+ hasExpectedEvents
81
+ };
82
+ }
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ parseTransaction
86
+ });
87
+ //# sourceMappingURL=parseTransactionPojo.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/parseTransactionPojo.ts"],"sourcesContent":["/**\n * Transaction parsing with POJO support and NO heuristics.\n *\n * @remarks\n * This is the new POJO-based parser that works with TransactionResult objects.\n * Principle: Explicit over implicit, guarantees over guesses.\n */\n\nimport { decodeEventLog, type TransactionReceipt } from \"viem\";\nimport type { TransactionResult } from \"../types/operations\";\nimport type {\n TypedTransactionResult,\n Contract,\n Fn,\n ExpectedEvents,\n} from \"../generated/event-types\";\nimport { EVENT_REGISTRY, TOPIC_TO_ABIS } from \"../generated/eventRegistry\";\n\n/**\n * Parses a transaction using TransactionResult POJO with ZERO heuristics.\n *\n * @remarks\n * - Uses function-scoped event registry for O(1) lookups\n * - Only expects events explicitly mapped for this contract.function\n * - Returns typed events matching the exact TypedTransactionResult interface\n *\n * @param transactionResult - The TransactionResult POJO with context\n * @param transactionResult.hash - Transaction hash\n * @param transactionResult.from - Transaction sender address\n * @param transactionResult.contract - Contract name\n * @param transactionResult.fn - Function name\n * @param transactionResult.chainId - Optional chain ID\n * @param transactionResult.value - Optional transaction value\n * @param transactionResult.nonce - Optional nonce\n * @param transactionResult.to - Optional recipient address\n * @param receipt - The transaction receipt from the blockchain\n * @returns Typed transaction result with parsed events\n */\nexport function parseTransaction<C extends Contract, F extends Fn<C>>(\n transactionResult: TransactionResult<C, F>,\n receipt: TransactionReceipt,\n): TypedTransactionResult<C, F> {\n const { contract: contractName, fn: functionName } = transactionResult;\n\n // Look up expected events from the function-specific registry\n const registryKey = `${contractName}.${functionName}`;\n const registry = EVENT_REGISTRY[registryKey];\n\n // Initialize the expected events object with proper types\n const expectedEvents: Record<string, unknown> = {};\n const allEvents: Array<{\n contractAddress: string;\n eventName: string;\n args: Record<string, unknown>;\n logIndex: number;\n }> = [];\n\n let hasExpectedEvents = false;\n\n if (receipt.logs) {\n // Parse logs using the function-scoped registry\n for (const log of receipt.logs) {\n if (!log.topics || log.topics.length === 0) {\n // Skip malformed logs\n continue;\n }\n\n const eventTopic = log.topics[0] as `0x${string}`;\n\n // Try to decode using TOPIC_TO_ABIS for O(1) lookup\n const abiCandidates = TOPIC_TO_ABIS.get(eventTopic);\n\n if (abiCandidates && abiCandidates.length > 0) {\n // Try each ABI variant (handles collisions)\n for (const abiEvent of abiCandidates) {\n try {\n const decoded = decodeEventLog({\n abi: [abiEvent],\n data: log.data,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n\n // Add to allEvents\n allEvents.push({\n contractAddress: log.address || \"\",\n eventName: decoded.eventName,\n args: decoded.args as Record<string, unknown>,\n logIndex: log.logIndex ?? 0,\n });\n\n // If this event is expected for this function, add to expectedEvents\n if (registry && registry.eventNames.includes(decoded.eventName)) {\n expectedEvents[decoded.eventName] = decoded.args;\n hasExpectedEvents = true;\n }\n\n break; // Successfully decoded, don't try other variants\n } catch {\n // Try next ABI variant\n continue;\n }\n }\n } else {\n // Event not decodable, add as unknown\n allEvents.push({\n contractAddress: log.address || \"\",\n eventName: \"Unknown\",\n args: { topic0: eventTopic, data: log.data },\n logIndex: log.logIndex ?? 0,\n });\n }\n }\n }\n\n // Return a properly typed TypedTransactionResult\n return {\n hash: transactionResult.hash,\n from: transactionResult.from,\n contract: contractName,\n fn: functionName,\n expectedEvents: expectedEvents as ExpectedEvents<C, F>,\n allEvents,\n hasExpectedEvents,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,kBAAwD;AAQxD,2BAA8C;AAsBvC,SAAS,iBACd,mBACA,SAC8B;AAC9B,QAAM,EAAE,UAAU,cAAc,IAAI,aAAa,IAAI;AAGrD,QAAM,cAAc,GAAG,YAAY,IAAI,YAAY;AACnD,QAAM,WAAW,oCAAe,WAAW;AAG3C,QAAM,iBAA0C,CAAC;AACjD,QAAM,YAKD,CAAC;AAEN,MAAI,oBAAoB;AAExB,MAAI,QAAQ,MAAM;AAEhB,eAAW,OAAO,QAAQ,MAAM;AAC9B,UAAI,CAAC,IAAI,UAAU,IAAI,OAAO,WAAW,GAAG;AAE1C;AAAA,MACF;AAEA,YAAM,aAAa,IAAI,OAAO,CAAC;AAG/B,YAAM,gBAAgB,mCAAc,IAAI,UAAU;AAElD,UAAI,iBAAiB,cAAc,SAAS,GAAG;AAE7C,mBAAW,YAAY,eAAe;AACpC,cAAI;AACF,kBAAM,cAAU,4BAAe;AAAA,cAC7B,KAAK,CAAC,QAAQ;AAAA,cACd,MAAM,IAAI;AAAA,cACV,QAAQ,IAAI;AAAA,YACd,CAAC;AAGD,sBAAU,KAAK;AAAA,cACb,iBAAiB,IAAI,WAAW;AAAA,cAChC,WAAW,QAAQ;AAAA,cACnB,MAAM,QAAQ;AAAA,cACd,UAAU,IAAI,YAAY;AAAA,YAC5B,CAAC;AAGD,gBAAI,YAAY,SAAS,WAAW,SAAS,QAAQ,SAAS,GAAG;AAC/D,6BAAe,QAAQ,SAAS,IAAI,QAAQ;AAC5C,kCAAoB;AAAA,YACtB;AAEA;AAAA,UACF,QAAQ;AAEN;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,kBAAU,KAAK;AAAA,UACb,iBAAiB,IAAI,WAAW;AAAA,UAChC,WAAW;AAAA,UACX,MAAM,EAAE,QAAQ,YAAY,MAAM,IAAI,KAAK;AAAA,UAC3C,UAAU,IAAI,YAAY;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM,kBAAkB;AAAA,IACxB,MAAM,kBAAkB;AAAA,IACxB,UAAU;AAAA,IACV,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Transaction parsing with POJO support and NO heuristics.
3
+ *
4
+ * @remarks
5
+ * This is the new POJO-based parser that works with TransactionResult objects.
6
+ * Principle: Explicit over implicit, guarantees over guesses.
7
+ */
8
+ import { type TransactionReceipt } from "viem";
9
+ import type { TransactionResult } from "../types/operations";
10
+ import type { TypedTransactionResult, Contract, Fn } from "../generated/event-types";
11
+ /**
12
+ * Parses a transaction using TransactionResult POJO with ZERO heuristics.
13
+ *
14
+ * @remarks
15
+ * - Uses function-scoped event registry for O(1) lookups
16
+ * - Only expects events explicitly mapped for this contract.function
17
+ * - Returns typed events matching the exact TypedTransactionResult interface
18
+ *
19
+ * @param transactionResult - The TransactionResult POJO with context
20
+ * @param transactionResult.hash - Transaction hash
21
+ * @param transactionResult.from - Transaction sender address
22
+ * @param transactionResult.contract - Contract name
23
+ * @param transactionResult.fn - Function name
24
+ * @param transactionResult.chainId - Optional chain ID
25
+ * @param transactionResult.value - Optional transaction value
26
+ * @param transactionResult.nonce - Optional nonce
27
+ * @param transactionResult.to - Optional recipient address
28
+ * @param receipt - The transaction receipt from the blockchain
29
+ * @returns Typed transaction result with parsed events
30
+ */
31
+ export declare function parseTransaction<C extends Contract, F extends Fn<C>>(transactionResult: TransactionResult<C, F>, receipt: TransactionReceipt): TypedTransactionResult<C, F>;
@@ -0,0 +1,63 @@
1
+ import { decodeEventLog } from "viem";
2
+ import { EVENT_REGISTRY, TOPIC_TO_ABIS } from "../generated/eventRegistry";
3
+ function parseTransaction(transactionResult, receipt) {
4
+ const { contract: contractName, fn: functionName } = transactionResult;
5
+ const registryKey = `${contractName}.${functionName}`;
6
+ const registry = EVENT_REGISTRY[registryKey];
7
+ const expectedEvents = {};
8
+ const allEvents = [];
9
+ let hasExpectedEvents = false;
10
+ if (receipt.logs) {
11
+ for (const log of receipt.logs) {
12
+ if (!log.topics || log.topics.length === 0) {
13
+ continue;
14
+ }
15
+ const eventTopic = log.topics[0];
16
+ const abiCandidates = TOPIC_TO_ABIS.get(eventTopic);
17
+ if (abiCandidates && abiCandidates.length > 0) {
18
+ for (const abiEvent of abiCandidates) {
19
+ try {
20
+ const decoded = decodeEventLog({
21
+ abi: [abiEvent],
22
+ data: log.data,
23
+ topics: log.topics
24
+ });
25
+ allEvents.push({
26
+ contractAddress: log.address || "",
27
+ eventName: decoded.eventName,
28
+ args: decoded.args,
29
+ logIndex: log.logIndex ?? 0
30
+ });
31
+ if (registry && registry.eventNames.includes(decoded.eventName)) {
32
+ expectedEvents[decoded.eventName] = decoded.args;
33
+ hasExpectedEvents = true;
34
+ }
35
+ break;
36
+ } catch {
37
+ continue;
38
+ }
39
+ }
40
+ } else {
41
+ allEvents.push({
42
+ contractAddress: log.address || "",
43
+ eventName: "Unknown",
44
+ args: { topic0: eventTopic, data: log.data },
45
+ logIndex: log.logIndex ?? 0
46
+ });
47
+ }
48
+ }
49
+ }
50
+ return {
51
+ hash: transactionResult.hash,
52
+ from: transactionResult.from,
53
+ contract: contractName,
54
+ fn: functionName,
55
+ expectedEvents,
56
+ allEvents,
57
+ hasExpectedEvents
58
+ };
59
+ }
60
+ export {
61
+ parseTransaction
62
+ };
63
+ //# sourceMappingURL=parseTransactionPojo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/parseTransactionPojo.ts"],"sourcesContent":["/**\n * Transaction parsing with POJO support and NO heuristics.\n *\n * @remarks\n * This is the new POJO-based parser that works with TransactionResult objects.\n * Principle: Explicit over implicit, guarantees over guesses.\n */\n\nimport { decodeEventLog, type TransactionReceipt } from \"viem\";\nimport type { TransactionResult } from \"../types/operations\";\nimport type {\n TypedTransactionResult,\n Contract,\n Fn,\n ExpectedEvents,\n} from \"../generated/event-types\";\nimport { EVENT_REGISTRY, TOPIC_TO_ABIS } from \"../generated/eventRegistry\";\n\n/**\n * Parses a transaction using TransactionResult POJO with ZERO heuristics.\n *\n * @remarks\n * - Uses function-scoped event registry for O(1) lookups\n * - Only expects events explicitly mapped for this contract.function\n * - Returns typed events matching the exact TypedTransactionResult interface\n *\n * @param transactionResult - The TransactionResult POJO with context\n * @param transactionResult.hash - Transaction hash\n * @param transactionResult.from - Transaction sender address\n * @param transactionResult.contract - Contract name\n * @param transactionResult.fn - Function name\n * @param transactionResult.chainId - Optional chain ID\n * @param transactionResult.value - Optional transaction value\n * @param transactionResult.nonce - Optional nonce\n * @param transactionResult.to - Optional recipient address\n * @param receipt - The transaction receipt from the blockchain\n * @returns Typed transaction result with parsed events\n */\nexport function parseTransaction<C extends Contract, F extends Fn<C>>(\n transactionResult: TransactionResult<C, F>,\n receipt: TransactionReceipt,\n): TypedTransactionResult<C, F> {\n const { contract: contractName, fn: functionName } = transactionResult;\n\n // Look up expected events from the function-specific registry\n const registryKey = `${contractName}.${functionName}`;\n const registry = EVENT_REGISTRY[registryKey];\n\n // Initialize the expected events object with proper types\n const expectedEvents: Record<string, unknown> = {};\n const allEvents: Array<{\n contractAddress: string;\n eventName: string;\n args: Record<string, unknown>;\n logIndex: number;\n }> = [];\n\n let hasExpectedEvents = false;\n\n if (receipt.logs) {\n // Parse logs using the function-scoped registry\n for (const log of receipt.logs) {\n if (!log.topics || log.topics.length === 0) {\n // Skip malformed logs\n continue;\n }\n\n const eventTopic = log.topics[0] as `0x${string}`;\n\n // Try to decode using TOPIC_TO_ABIS for O(1) lookup\n const abiCandidates = TOPIC_TO_ABIS.get(eventTopic);\n\n if (abiCandidates && abiCandidates.length > 0) {\n // Try each ABI variant (handles collisions)\n for (const abiEvent of abiCandidates) {\n try {\n const decoded = decodeEventLog({\n abi: [abiEvent],\n data: log.data,\n topics: log.topics as [`0x${string}`, ...`0x${string}`[]],\n });\n\n // Add to allEvents\n allEvents.push({\n contractAddress: log.address || \"\",\n eventName: decoded.eventName,\n args: decoded.args as Record<string, unknown>,\n logIndex: log.logIndex ?? 0,\n });\n\n // If this event is expected for this function, add to expectedEvents\n if (registry && registry.eventNames.includes(decoded.eventName)) {\n expectedEvents[decoded.eventName] = decoded.args;\n hasExpectedEvents = true;\n }\n\n break; // Successfully decoded, don't try other variants\n } catch {\n // Try next ABI variant\n continue;\n }\n }\n } else {\n // Event not decodable, add as unknown\n allEvents.push({\n contractAddress: log.address || \"\",\n eventName: \"Unknown\",\n args: { topic0: eventTopic, data: log.data },\n logIndex: log.logIndex ?? 0,\n });\n }\n }\n }\n\n // Return a properly typed TypedTransactionResult\n return {\n hash: transactionResult.hash,\n from: transactionResult.from,\n contract: contractName,\n fn: functionName,\n expectedEvents: expectedEvents as ExpectedEvents<C, F>,\n allEvents,\n hasExpectedEvents,\n };\n}\n"],"mappings":"AAQA,SAAS,sBAA+C;AAQxD,SAAS,gBAAgB,qBAAqB;AAsBvC,SAAS,iBACd,mBACA,SAC8B;AAC9B,QAAM,EAAE,UAAU,cAAc,IAAI,aAAa,IAAI;AAGrD,QAAM,cAAc,GAAG,YAAY,IAAI,YAAY;AACnD,QAAM,WAAW,eAAe,WAAW;AAG3C,QAAM,iBAA0C,CAAC;AACjD,QAAM,YAKD,CAAC;AAEN,MAAI,oBAAoB;AAExB,MAAI,QAAQ,MAAM;AAEhB,eAAW,OAAO,QAAQ,MAAM;AAC9B,UAAI,CAAC,IAAI,UAAU,IAAI,OAAO,WAAW,GAAG;AAE1C;AAAA,MACF;AAEA,YAAM,aAAa,IAAI,OAAO,CAAC;AAG/B,YAAM,gBAAgB,cAAc,IAAI,UAAU;AAElD,UAAI,iBAAiB,cAAc,SAAS,GAAG;AAE7C,mBAAW,YAAY,eAAe;AACpC,cAAI;AACF,kBAAM,UAAU,eAAe;AAAA,cAC7B,KAAK,CAAC,QAAQ;AAAA,cACd,MAAM,IAAI;AAAA,cACV,QAAQ,IAAI;AAAA,YACd,CAAC;AAGD,sBAAU,KAAK;AAAA,cACb,iBAAiB,IAAI,WAAW;AAAA,cAChC,WAAW,QAAQ;AAAA,cACnB,MAAM,QAAQ;AAAA,cACd,UAAU,IAAI,YAAY;AAAA,YAC5B,CAAC;AAGD,gBAAI,YAAY,SAAS,WAAW,SAAS,QAAQ,SAAS,GAAG;AAC/D,6BAAe,QAAQ,SAAS,IAAI,QAAQ;AAC5C,kCAAoB;AAAA,YACtB;AAEA;AAAA,UACF,QAAQ;AAEN;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,kBAAU,KAAK;AAAA,UACb,iBAAiB,IAAI,WAAW;AAAA,UAChC,WAAW;AAAA,UACX,MAAM,EAAE,QAAQ,YAAY,MAAM,IAAI,KAAK;AAAA,UAC3C,UAAU,IAAI,YAAY;AAAA,QAC5B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM,kBAAkB;AAAA,IACxB,MAAM,kBAAkB;AAAA,IACxB,UAAU;AAAA,IACV,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -86,7 +86,7 @@ class SchemaValidator {
86
86
  validateDataSchemaAgainstMetaSchema(schema) {
87
87
  const isValid = this.dataSchemaValidator(schema);
88
88
  if (!isValid) {
89
- const errors = this.dataSchemaValidator.errors || [];
89
+ const errors = this.dataSchemaValidator.errors ?? [];
90
90
  const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(", ")}`;
91
91
  throw new SchemaValidationError(errorMessage, errors);
92
92
  }
@@ -142,7 +142,7 @@ class SchemaValidator {
142
142
  const dataValidator = this.ajv.compile(schema.schema);
143
143
  const isValid = dataValidator(data);
144
144
  if (!isValid) {
145
- const errors = dataValidator.errors || [];
145
+ const errors = dataValidator.errors ?? [];
146
146
  const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(", ")}`;
147
147
  throw new SchemaValidationError(errorMessage, errors);
148
148
  }
@@ -212,8 +212,8 @@ class SchemaValidator {
212
212
  */
213
213
  async fetchAndValidateSchema(url, downloadRelayer) {
214
214
  try {
215
- const { fetchWithRelayer } = await import("./download");
216
- const response = await fetchWithRelayer(url, downloadRelayer);
215
+ const { universalFetch } = await import("./download");
216
+ const response = await universalFetch(url, downloadRelayer);
217
217
  if (!response.ok) {
218
218
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
219
219
  }
@@ -241,7 +241,7 @@ function validateDataSchemaAgainstMetaSchema(schema) {
241
241
  return schema;
242
242
  }
243
243
  function validateDataAgainstSchema(data, schema) {
244
- return schemaValidator.validateDataAgainstSchema(data, schema);
244
+ schemaValidator.validateDataAgainstSchema(data, schema);
245
245
  }
246
246
  function fetchAndValidateSchema(url, downloadRelayer) {
247
247
  return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);