@opendatalabs/vana-sdk 0.1.0-alpha.276ea01 → 0.1.0-alpha.2b6935d

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 (680) 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 +444 -191
  36. package/dist/controllers/data.cjs.map +1 -1
  37. package/dist/controllers/data.d.ts +149 -76
  38. package/dist/controllers/data.js +444 -191
  39. package/dist/controllers/data.js.map +1 -1
  40. package/dist/controllers/permissions.cjs +551 -395
  41. package/dist/controllers/permissions.cjs.map +1 -1
  42. package/dist/controllers/permissions.d.ts +1283 -25
  43. package/dist/controllers/permissions.js +551 -395
  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 +143 -60
  81. package/dist/core.cjs.map +1 -1
  82. package/dist/core.d.ts +42 -66
  83. package/dist/core.js +155 -85
  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/utils.cjs +2 -41
  114. package/dist/crypto/ecies/utils.cjs.map +1 -1
  115. package/dist/crypto/ecies/utils.d.ts +3 -40
  116. package/dist/crypto/ecies/utils.js +1 -35
  117. package/dist/crypto/ecies/utils.js.map +1 -1
  118. package/dist/crypto/services/WalletKeyEncryptionService.cjs +2 -2
  119. package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -1
  120. package/dist/crypto/services/WalletKeyEncryptionService.d.ts +3 -7
  121. package/dist/crypto/services/WalletKeyEncryptionService.js +5 -9
  122. package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -1
  123. package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
  124. package/dist/diagnostics.d.ts +1 -3
  125. package/dist/diagnostics.test.d.ts +1 -0
  126. package/dist/errors.cjs +16 -0
  127. package/dist/errors.cjs.map +1 -1
  128. package/dist/errors.d.ts +53 -15
  129. package/dist/errors.js +18 -6
  130. package/dist/errors.js.map +1 -1
  131. package/dist/generated/abi/ComputeEngineImplementation.d.ts +2 -3
  132. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +2 -3
  133. package/dist/generated/abi/DATFactoryImplementation.d.ts +2 -3
  134. package/dist/generated/abi/DATImplementation.d.ts +2 -3
  135. package/dist/generated/abi/DATPausableImplementation.d.ts +2 -3
  136. package/dist/generated/abi/DATVotesImplementation.d.ts +2 -3
  137. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +2 -3
  138. package/dist/generated/abi/DLPRegistryImplementation.d.ts +2 -3
  139. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +2 -3
  140. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +2 -3
  141. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +2 -3
  142. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +2 -3
  143. package/dist/generated/abi/DLPRootImplementation.d.ts +1 -3
  144. package/dist/generated/abi/DLPTreasuryImplementation.d.ts +2 -3
  145. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +1 -3
  146. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +2 -3
  147. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +2 -3
  148. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +2 -3
  149. package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +2 -3
  150. package/dist/generated/abi/DataRegistryImplementation.cjs +13 -0
  151. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
  152. package/dist/generated/abi/DataRegistryImplementation.d.ts +12 -3
  153. package/dist/generated/abi/DataRegistryImplementation.js +13 -0
  154. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
  155. package/dist/generated/abi/QueryEngineImplementation.d.ts +2 -3
  156. package/dist/generated/abi/SwapHelperImplementation.d.ts +2 -3
  157. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +2 -3
  158. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +2 -3
  159. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +2 -3
  160. package/dist/generated/abi/TeePoolImplementation.d.ts +2 -3
  161. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +2 -3
  162. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +2 -3
  163. package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +2 -3
  164. package/dist/generated/abi/VanaEpochImplementation.d.ts +2 -3
  165. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +2 -3
  166. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +2 -3
  167. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +2 -3
  168. package/dist/generated/abi/index.cjs +42 -0
  169. package/dist/generated/abi/index.cjs.map +1 -1
  170. package/dist/generated/abi/index.d.ts +47 -18
  171. package/dist/generated/abi/index.js +21 -0
  172. package/dist/generated/abi/index.js.map +1 -1
  173. package/dist/generated/event-types.cjs +17 -0
  174. package/dist/generated/event-types.cjs.map +1 -0
  175. package/dist/generated/event-types.d.ts +854 -0
  176. package/dist/generated/event-types.js +1 -0
  177. package/dist/generated/event-types.js.map +1 -0
  178. package/dist/generated/eventRegistry.cjs +3351 -0
  179. package/dist/generated/eventRegistry.cjs.map +1 -0
  180. package/dist/generated/eventRegistry.d.ts +14 -0
  181. package/dist/generated/eventRegistry.js +3326 -0
  182. package/dist/generated/eventRegistry.js.map +1 -0
  183. package/dist/generated/server/server-exports.d.ts +19 -21
  184. package/dist/generated/server/server.cjs.map +1 -1
  185. package/dist/generated/server/server.d.ts +113 -87
  186. package/dist/generated/subgraph.d.ts +329 -332
  187. package/dist/index.browser.d.ts +48 -73
  188. package/dist/index.browser.js +12 -0
  189. package/dist/index.browser.js.map +1 -1
  190. package/dist/index.cjs +3 -1
  191. package/dist/index.cjs.map +1 -1
  192. package/dist/index.d.ts +0 -2
  193. package/dist/index.js +3 -1
  194. package/dist/index.js.map +1 -1
  195. package/dist/index.node.cjs +12 -0
  196. package/dist/index.node.cjs.map +1 -1
  197. package/dist/index.node.d.ts +183 -64
  198. package/dist/index.node.js +12 -0
  199. package/dist/index.node.js.map +1 -1
  200. package/dist/node.d.ts +4 -2
  201. package/dist/platform/browser-only.d.ts +5 -8
  202. package/dist/platform/browser-only.test.d.ts +1 -0
  203. package/dist/platform/browser-safe.d.ts +6 -9
  204. package/dist/platform/browser-safe.test.d.ts +1 -0
  205. package/dist/platform/browser.cjs +7 -6
  206. package/dist/platform/browser.cjs.map +1 -1
  207. package/dist/platform/browser.d.ts +3 -6
  208. package/dist/platform/browser.js +19 -27
  209. package/dist/platform/browser.js.map +1 -1
  210. package/dist/platform/browser.test.d.ts +1 -0
  211. package/dist/platform/index.d.ts +11 -5
  212. package/dist/platform/interface.d.ts +6 -8
  213. package/dist/platform/node.d.ts +3 -7
  214. package/dist/platform/node.js +12 -19
  215. package/dist/platform/node.js.map +1 -1
  216. package/dist/platform/ports/openpgp-port.cjs +74 -0
  217. package/dist/platform/ports/openpgp-port.cjs.map +1 -0
  218. package/dist/platform/ports/openpgp-port.d.ts +13 -0
  219. package/dist/platform/ports/openpgp-port.js +59 -0
  220. package/dist/platform/ports/openpgp-port.js.map +1 -0
  221. package/dist/platform/ports/pgp-port.cjs +17 -0
  222. package/dist/platform/ports/pgp-port.cjs.map +1 -0
  223. package/dist/platform/ports/pgp-port.d.ts +35 -0
  224. package/dist/platform/ports/pgp-port.js +1 -0
  225. package/dist/platform/ports/pgp-port.js.map +1 -0
  226. package/dist/platform/shared/error-utils.d.ts +2 -4
  227. package/dist/platform/shared/pgp-utils.cjs +2 -2
  228. package/dist/platform/shared/pgp-utils.cjs.map +1 -1
  229. package/dist/platform/shared/pgp-utils.d.ts +3 -5
  230. package/dist/platform/shared/pgp-utils.js +2 -2
  231. package/dist/platform/shared/pgp-utils.js.map +1 -1
  232. package/dist/platform/shared/stream-utils.d.ts +1 -3
  233. package/dist/platform/utils.d.ts +6 -10
  234. package/dist/platform/utils.test.d.ts +1 -0
  235. package/dist/platform.browser.d.ts +9 -4
  236. package/dist/platform.d.ts +11 -5
  237. package/dist/platform.node.d.ts +10 -5
  238. package/dist/server/handler.cjs +7 -5
  239. package/dist/server/handler.cjs.map +1 -1
  240. package/dist/server/handler.d.ts +17 -204
  241. package/dist/server/handler.js +7 -5
  242. package/dist/server/handler.js.map +1 -1
  243. package/dist/server/relayerHandler.cjs +220 -0
  244. package/dist/server/relayerHandler.cjs.map +1 -0
  245. package/dist/server/relayerHandler.d.ts +37 -0
  246. package/dist/server/relayerHandler.js +195 -0
  247. package/dist/server/relayerHandler.js.map +1 -0
  248. package/dist/storage/index.d.ts +56 -10
  249. package/dist/storage/manager.cjs +2 -2
  250. package/dist/storage/manager.cjs.map +1 -1
  251. package/dist/storage/manager.d.ts +2 -5
  252. package/dist/storage/manager.js +5 -12
  253. package/dist/storage/manager.js.map +1 -1
  254. package/dist/storage/providers/callback-storage.cjs +3 -3
  255. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  256. package/dist/storage/providers/callback-storage.d.ts +3 -9
  257. package/dist/storage/providers/callback-storage.js +3 -3
  258. package/dist/storage/providers/callback-storage.js.map +1 -1
  259. package/dist/storage/providers/google-drive.cjs +2 -2
  260. package/dist/storage/providers/google-drive.cjs.map +1 -1
  261. package/dist/storage/providers/google-drive.d.ts +3 -7
  262. package/dist/storage/providers/google-drive.js +4 -7
  263. package/dist/storage/providers/google-drive.js.map +1 -1
  264. package/dist/storage/providers/google-drive.test.d.ts +1 -0
  265. package/dist/storage/providers/ipfs.cjs +5 -5
  266. package/dist/storage/providers/ipfs.cjs.map +1 -1
  267. package/dist/storage/providers/ipfs.d.ts +3 -6
  268. package/dist/storage/providers/ipfs.js +7 -10
  269. package/dist/storage/providers/ipfs.js.map +1 -1
  270. package/dist/storage/providers/pinata.cjs +6 -6
  271. package/dist/storage/providers/pinata.cjs.map +1 -1
  272. package/dist/storage/providers/pinata.d.ts +5 -8
  273. package/dist/storage/providers/pinata.js +8 -11
  274. package/dist/storage/providers/pinata.js.map +1 -1
  275. package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
  276. package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
  277. package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
  278. package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
  279. package/dist/storage/tests/storageManager.test.d.ts +1 -0
  280. package/dist/tests/abi.test.d.ts +1 -0
  281. package/dist/tests/chains-definitions.test.d.ts +1 -0
  282. package/dist/tests/core-encryption.test.d.ts +1 -0
  283. package/dist/tests/core-extended.test.d.ts +1 -0
  284. package/dist/tests/core-generics-coverage.test.d.ts +1 -0
  285. package/dist/tests/coverage-boost.test.d.ts +1 -0
  286. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
  287. package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
  288. package/dist/tests/data-additional-methods.test.d.ts +1 -0
  289. package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
  290. package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
  291. package/dist/tests/data-relayer.test.d.ts +1 -0
  292. package/dist/tests/data-schema-validation.test.d.ts +1 -0
  293. package/dist/tests/data-simple-methods.test.d.ts +1 -0
  294. package/dist/tests/data.test.d.ts +1 -0
  295. package/dist/tests/demo-integration.test.d.ts +1 -0
  296. package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
  297. package/dist/tests/download-relayer.test.d.ts +1 -0
  298. package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
  299. package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
  300. package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
  301. package/dist/tests/encryption-coverage.test.d.ts +1 -0
  302. package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
  303. package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
  304. package/dist/tests/errors-coverage.test.d.ts +1 -0
  305. package/dist/tests/errors.test.d.ts +1 -0
  306. package/dist/tests/factories/mockFactory.d.ts +316 -0
  307. package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
  308. package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
  309. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
  310. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
  311. package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
  312. package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
  313. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
  314. package/dist/tests/helper-methods.test.d.ts +1 -0
  315. package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
  316. package/dist/tests/helpers/typedMocks.d.ts +64 -0
  317. package/dist/tests/index-browser.test.d.ts +1 -0
  318. package/dist/tests/index-node.test.d.ts +1 -0
  319. package/dist/tests/index.test.d.ts +1 -0
  320. package/dist/tests/mocks/platformAdapter.d.ts +12 -0
  321. package/dist/tests/new-permissions-methods.test.d.ts +1 -0
  322. package/dist/tests/no-buffer-browser.test.d.ts +1 -0
  323. package/dist/tests/permissions-grantee.test.d.ts +1 -0
  324. package/dist/tests/permissions-revoke-relayer.test.d.ts +1 -0
  325. package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
  326. package/dist/tests/permissions-server-files.test.d.ts +1 -0
  327. package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
  328. package/dist/tests/permissions.test.d.ts +1 -0
  329. package/dist/tests/personal.test.d.ts +1 -0
  330. package/dist/tests/platform-browser.test.d.ts +1 -0
  331. package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
  332. package/dist/tests/platform-crypto.test.d.ts +1 -0
  333. package/dist/tests/platform-index.test.d.ts +1 -0
  334. package/dist/tests/platform-node.test.d.ts +1 -0
  335. package/dist/tests/platform-shared-utils.test.d.ts +1 -0
  336. package/dist/tests/platform-updated.test.d.ts +1 -0
  337. package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
  338. package/dist/tests/protocol.test.d.ts +1 -0
  339. package/dist/tests/read-only-mode.test.d.ts +1 -0
  340. package/dist/tests/relayer-integration.test.d.ts +1 -0
  341. package/dist/tests/relayer-unified.test.d.ts +1 -0
  342. package/dist/tests/schemas.test.d.ts +1 -0
  343. package/dist/tests/server-handler.test.d.ts +1 -0
  344. package/dist/tests/server-relayer-handler.test.d.ts +1 -0
  345. package/dist/tests/setup.d.ts +7 -0
  346. package/dist/tests/signatureFormatter.test.d.ts +1 -0
  347. package/dist/tests/trusted-server-queries.test.d.ts +1 -0
  348. package/dist/tests/typedDataConverter.test.d.ts +1 -0
  349. package/dist/tests/types-contracts.test.d.ts +1 -0
  350. package/dist/tests/types-data.test.d.ts +1 -0
  351. package/dist/tests/types-external-apis.test.d.ts +1 -0
  352. package/dist/tests/types-generics.test.d.ts +1 -0
  353. package/dist/tests/types-permissions.test.d.ts +1 -0
  354. package/dist/tests/types-upload-params.test.d.ts +1 -0
  355. package/dist/tests/types.test.d.ts +1 -0
  356. package/dist/tests/utils-formatters.test.d.ts +1 -0
  357. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
  358. package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
  359. package/dist/tests/utils-grantFiles.test.d.ts +1 -0
  360. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
  361. package/dist/tests/utils-grants.test.d.ts +1 -0
  362. package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
  363. package/dist/tests/utils-ipfs.test.d.ts +4 -0
  364. package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
  365. package/dist/tests/vana.test.d.ts +1 -0
  366. package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
  367. package/dist/types/blockchain.cjs +17 -0
  368. package/dist/types/blockchain.cjs.map +1 -0
  369. package/dist/types/blockchain.d.ts +57 -0
  370. package/dist/types/blockchain.js +1 -0
  371. package/dist/types/blockchain.js.map +1 -0
  372. package/dist/types/chains-additional.test.d.ts +1 -0
  373. package/dist/types/chains.d.ts +6 -9
  374. package/dist/types/config.cjs +10 -0
  375. package/dist/types/config.cjs.map +1 -1
  376. package/dist/types/config.d.ts +198 -238
  377. package/dist/types/config.js +8 -0
  378. package/dist/types/config.js.map +1 -1
  379. package/dist/types/contracts.cjs.map +1 -1
  380. package/dist/types/contracts.d.ts +8 -11
  381. package/dist/types/controller-context.cjs +17 -0
  382. package/dist/types/controller-context.cjs.map +1 -0
  383. package/dist/types/controller-context.d.ts +65 -0
  384. package/dist/types/controller-context.js +1 -0
  385. package/dist/types/controller-context.js.map +1 -0
  386. package/dist/types/data.cjs.map +1 -1
  387. package/dist/types/data.d.ts +107 -39
  388. package/dist/types/external-apis.d.ts +10 -12
  389. package/dist/types/generics.d.ts +35 -38
  390. package/dist/types/index.cjs +5 -4
  391. package/dist/types/index.cjs.map +1 -1
  392. package/dist/types/index.d.ts +20 -34
  393. package/dist/types/index.js +9 -2
  394. package/dist/types/index.js.map +1 -1
  395. package/dist/types/operations.cjs +2 -2
  396. package/dist/types/operations.cjs.map +1 -1
  397. package/dist/types/operations.d.ts +32 -28
  398. package/dist/types/operations.js +2 -2
  399. package/dist/types/operations.js.map +1 -1
  400. package/dist/types/permissions.d.ts +55 -58
  401. package/dist/types/personal.cjs.map +1 -1
  402. package/dist/types/personal.d.ts +6 -8
  403. package/dist/types/relayer.cjs.map +1 -1
  404. package/dist/types/relayer.d.ts +186 -39
  405. package/dist/types/storage.d.ts +6 -8
  406. package/dist/types/storage.js +2 -5
  407. package/dist/types/storage.js.map +1 -1
  408. package/dist/types/transactionResults.cjs.map +1 -1
  409. package/dist/types/transactionResults.d.ts +193 -25
  410. package/dist/types/utils.d.ts +21 -24
  411. package/dist/types.d.ts +4 -40
  412. package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
  413. package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
  414. package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
  415. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
  416. package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
  417. package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
  418. package/dist/utils/blockchain/registry.cjs +2 -2
  419. package/dist/utils/blockchain/registry.cjs.map +1 -1
  420. package/dist/utils/blockchain/registry.d.ts +6 -8
  421. package/dist/utils/blockchain/registry.js +2 -2
  422. package/dist/utils/blockchain/registry.js.map +1 -1
  423. package/dist/utils/blockchain/registry.test.d.ts +1 -0
  424. package/dist/utils/crypto-utils.cjs +0 -12
  425. package/dist/utils/crypto-utils.cjs.map +1 -1
  426. package/dist/utils/crypto-utils.d.ts +9 -27
  427. package/dist/utils/crypto-utils.js +0 -11
  428. package/dist/utils/crypto-utils.js.map +1 -1
  429. package/dist/utils/crypto-utils.test.d.ts +1 -0
  430. package/dist/utils/download.cjs +3 -3
  431. package/dist/utils/download.cjs.map +1 -1
  432. package/dist/utils/download.d.ts +13 -14
  433. package/dist/utils/download.js +2 -2
  434. package/dist/utils/download.js.map +1 -1
  435. package/dist/utils/encoding.cjs +1 -1
  436. package/dist/utils/encoding.cjs.map +1 -1
  437. package/dist/utils/encoding.d.ts +4 -6
  438. package/dist/utils/encoding.js +1 -1
  439. package/dist/utils/encoding.js.map +1 -1
  440. package/dist/utils/encoding.test.d.ts +1 -0
  441. package/dist/utils/encryption.cjs +16 -10
  442. package/dist/utils/encryption.cjs.map +1 -1
  443. package/dist/utils/encryption.d.ts +13 -17
  444. package/dist/utils/encryption.js +16 -10
  445. package/dist/utils/encryption.js.map +1 -1
  446. package/dist/utils/formatters.cjs +4 -2
  447. package/dist/utils/formatters.cjs.map +1 -1
  448. package/dist/utils/formatters.d.ts +4 -6
  449. package/dist/utils/formatters.js +4 -2
  450. package/dist/utils/formatters.js.map +1 -1
  451. package/dist/utils/grantFiles.cjs +7 -4
  452. package/dist/utils/grantFiles.cjs.map +1 -1
  453. package/dist/utils/grantFiles.d.ts +6 -10
  454. package/dist/utils/grantFiles.js +7 -4
  455. package/dist/utils/grantFiles.js.map +1 -1
  456. package/dist/utils/grantValidation.cjs +1 -1
  457. package/dist/utils/grantValidation.cjs.map +1 -1
  458. package/dist/utils/grantValidation.d.ts +14 -17
  459. package/dist/utils/grantValidation.js +1 -1
  460. package/dist/utils/grantValidation.js.map +1 -1
  461. package/dist/utils/grants.cjs +1 -1
  462. package/dist/utils/grants.cjs.map +1 -1
  463. package/dist/utils/grants.d.ts +10 -13
  464. package/dist/utils/grants.js +1 -1
  465. package/dist/utils/grants.js.map +1 -1
  466. package/dist/utils/ipfs.d.ts +8 -10
  467. package/dist/utils/lazy-import.cjs +4 -6
  468. package/dist/utils/lazy-import.cjs.map +1 -1
  469. package/dist/utils/lazy-import.d.ts +1 -3
  470. package/dist/utils/lazy-import.js +4 -6
  471. package/dist/utils/lazy-import.js.map +1 -1
  472. package/dist/utils/multicall.cjs +4 -2
  473. package/dist/utils/multicall.cjs.map +1 -1
  474. package/dist/utils/multicall.d.ts +5 -8
  475. package/dist/utils/multicall.js +4 -2
  476. package/dist/utils/multicall.js.map +1 -1
  477. package/dist/utils/parseTransactionPojo.cjs +87 -0
  478. package/dist/utils/parseTransactionPojo.cjs.map +1 -0
  479. package/dist/utils/parseTransactionPojo.d.ts +31 -0
  480. package/dist/utils/parseTransactionPojo.js +63 -0
  481. package/dist/utils/parseTransactionPojo.js.map +1 -0
  482. package/dist/utils/schemaValidation.cjs +5 -5
  483. package/dist/utils/schemaValidation.cjs.map +1 -1
  484. package/dist/utils/schemaValidation.d.ts +8 -12
  485. package/dist/utils/schemaValidation.js +7 -10
  486. package/dist/utils/schemaValidation.js.map +1 -1
  487. package/dist/utils/signatureCache.cjs +1 -2
  488. package/dist/utils/signatureCache.cjs.map +1 -1
  489. package/dist/utils/signatureCache.d.ts +4 -7
  490. package/dist/utils/signatureCache.js +4 -8
  491. package/dist/utils/signatureCache.js.map +1 -1
  492. package/dist/utils/signatureFormatter.cjs +6 -9
  493. package/dist/utils/signatureFormatter.cjs.map +1 -1
  494. package/dist/utils/signatureFormatter.d.ts +2 -5
  495. package/dist/utils/signatureFormatter.js +6 -9
  496. package/dist/utils/signatureFormatter.js.map +1 -1
  497. package/dist/utils/tests/multicall.test.d.ts +1 -0
  498. package/dist/utils/transactionHelpers.cjs +54 -0
  499. package/dist/utils/transactionHelpers.cjs.map +1 -0
  500. package/dist/utils/transactionHelpers.d.ts +80 -0
  501. package/dist/utils/transactionHelpers.js +29 -0
  502. package/dist/utils/transactionHelpers.js.map +1 -0
  503. package/dist/utils/typeGuards.cjs +109 -0
  504. package/dist/utils/typeGuards.cjs.map +1 -0
  505. package/dist/utils/typeGuards.d.ts +138 -0
  506. package/dist/utils/typeGuards.js +74 -0
  507. package/dist/utils/typeGuards.js.map +1 -0
  508. package/dist/utils/typedDataConverter.d.ts +3 -6
  509. package/dist/utils/urlResolver.cjs +1 -1
  510. package/dist/utils/urlResolver.cjs.map +1 -1
  511. package/dist/utils/urlResolver.d.ts +2 -4
  512. package/dist/utils/urlResolver.js +2 -2
  513. package/dist/utils/urlResolver.js.map +1 -1
  514. package/dist/utils/wallet.cjs +63 -0
  515. package/dist/utils/wallet.cjs.map +1 -0
  516. package/dist/utils/wallet.d.ts +32 -0
  517. package/dist/utils/wallet.js +37 -0
  518. package/dist/utils/wallet.js.map +1 -0
  519. package/dist/{chains.browser.cjs → utils/withEvents.cjs} +22 -15
  520. package/dist/utils/withEvents.cjs.map +1 -0
  521. package/dist/utils/withEvents.d.ts +56 -0
  522. package/dist/utils/withEvents.js +18 -0
  523. package/dist/utils/withEvents.js.map +1 -0
  524. package/package.json +23 -14
  525. package/dist/browser.d.cts +0 -2
  526. package/dist/chains/definitions.d.cts +0 -53
  527. package/dist/chains/index.d.cts +0 -2
  528. package/dist/chains.browser.cjs.map +0 -1
  529. package/dist/chains.browser.d.cts +0 -2
  530. package/dist/chains.d.cts +0 -2
  531. package/dist/chains.node.d.cts +0 -2
  532. package/dist/config/addresses.d.cts +0 -380
  533. package/dist/config/chains.d.cts +0 -85
  534. package/dist/config/eventMappings.cjs +0 -114
  535. package/dist/config/eventMappings.cjs.map +0 -1
  536. package/dist/config/eventMappings.d.cts +0 -108
  537. package/dist/config/eventMappings.d.ts +0 -108
  538. package/dist/config/eventMappings.js +0 -90
  539. package/dist/config/eventMappings.js.map +0 -1
  540. package/dist/config/features.d.cts +0 -64
  541. package/dist/contracts/contractController.d.cts +0 -96
  542. package/dist/controllers/data.d.cts +0 -941
  543. package/dist/controllers/permissions.d.cts +0 -25
  544. package/dist/controllers/protocol.d.cts +0 -167
  545. package/dist/controllers/schemas.d.cts +0 -272
  546. package/dist/controllers/server.d.cts +0 -243
  547. package/dist/core/apiClient.d.cts +0 -165
  548. package/dist/core/client.d.cts +0 -92
  549. package/dist/core/generics.d.cts +0 -120
  550. package/dist/core.d.cts +0 -466
  551. package/dist/crypto/ecies/__tests__/test-vectors.d.cts +0 -40
  552. package/dist/crypto/ecies/base.d.cts +0 -143
  553. package/dist/crypto/ecies/browser.d.cts +0 -48
  554. package/dist/crypto/ecies/constants.d.cts +0 -122
  555. package/dist/crypto/ecies/index.d.cts +0 -1
  556. package/dist/crypto/ecies/interface.d.cts +0 -176
  557. package/dist/crypto/ecies/node.d.cts +0 -50
  558. package/dist/crypto/ecies/test-vectors/eccrypto-vectors.d.cts +0 -76
  559. package/dist/crypto/ecies/test-vectors/eccrypto-vectors.d.ts +0 -76
  560. package/dist/crypto/ecies/utils.d.cts +0 -67
  561. package/dist/crypto/services/WalletKeyEncryptionService.d.cts +0 -92
  562. package/dist/diagnostics.d.cts +0 -26
  563. package/dist/errors.d.cts +0 -350
  564. package/dist/generated/abi/ComputeEngineImplementation.d.cts +0 -996
  565. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.cts +0 -545
  566. package/dist/generated/abi/DATFactoryImplementation.d.cts +0 -661
  567. package/dist/generated/abi/DATImplementation.d.cts +0 -693
  568. package/dist/generated/abi/DATPausableImplementation.d.cts +0 -1145
  569. package/dist/generated/abi/DATVotesImplementation.d.cts +0 -1095
  570. package/dist/generated/abi/DLPPerformanceImplementation.d.cts +0 -883
  571. package/dist/generated/abi/DLPRegistryImplementation.d.cts +0 -1123
  572. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.cts +0 -452
  573. package/dist/generated/abi/DLPRewardDeployerImplementation.d.cts +0 -714
  574. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.cts +0 -452
  575. package/dist/generated/abi/DLPRewardSwapImplementation.d.cts +0 -706
  576. package/dist/generated/abi/DLPRootImplementation.d.cts +0 -1248
  577. package/dist/generated/abi/DLPTreasuryImplementation.d.cts +0 -452
  578. package/dist/generated/abi/DataLiquidityPoolImplementation.d.cts +0 -737
  579. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.cts +0 -661
  580. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.cts +0 -989
  581. package/dist/generated/abi/DataPortabilityServersImplementation.d.cts +0 -1086
  582. package/dist/generated/abi/DataRefinerRegistryImplementation.d.cts +0 -737
  583. package/dist/generated/abi/DataRegistryImplementation.d.cts +0 -1004
  584. package/dist/generated/abi/QueryEngineImplementation.d.cts +0 -1001
  585. package/dist/generated/abi/SwapHelperImplementation.d.cts +0 -764
  586. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.cts +0 -701
  587. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.cts +0 -701
  588. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.cts +0 -701
  589. package/dist/generated/abi/TeePoolImplementation.d.cts +0 -993
  590. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.cts +0 -701
  591. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.cts +0 -701
  592. package/dist/generated/abi/TeePoolPhalaImplementation.d.cts +0 -993
  593. package/dist/generated/abi/VanaEpochImplementation.d.cts +0 -900
  594. package/dist/generated/abi/VanaPoolEntityImplementation.d.cts +0 -934
  595. package/dist/generated/abi/VanaPoolStakingImplementation.d.cts +0 -693
  596. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.cts +0 -394
  597. package/dist/generated/abi/index.d.cts +0 -26516
  598. package/dist/generated/server/server-exports.d.cts +0 -21
  599. package/dist/generated/server/server.d.cts +0 -512
  600. package/dist/generated/subgraph.d.cts +0 -5981
  601. package/dist/index.browser.cjs +0 -151
  602. package/dist/index.browser.cjs.map +0 -1
  603. package/dist/index.browser.d.cts +0 -177
  604. package/dist/index.d.cts +0 -2
  605. package/dist/index.node.d.cts +0 -64
  606. package/dist/node.d.cts +0 -2
  607. package/dist/permissions-DNKPu_G0.d.cts +0 -1666
  608. package/dist/permissions-eo8YeLGf.d.ts +0 -1666
  609. package/dist/platform/browser-only.d.cts +0 -25
  610. package/dist/platform/browser-safe.d.cts +0 -32
  611. package/dist/platform/browser.d.cts +0 -74
  612. package/dist/platform/index.d.cts +0 -5
  613. package/dist/platform/interface.d.cts +0 -218
  614. package/dist/platform/node.d.cts +0 -27
  615. package/dist/platform/shared/error-utils.d.cts +0 -25
  616. package/dist/platform/shared/pgp-utils.d.cts +0 -61
  617. package/dist/platform/shared/stream-utils.d.cts +0 -16
  618. package/dist/platform/utils.d.cts +0 -53
  619. package/dist/platform.browser.cjs +0 -41
  620. package/dist/platform.browser.cjs.map +0 -1
  621. package/dist/platform.browser.d.cts +0 -4
  622. package/dist/platform.d.cts +0 -5
  623. package/dist/platform.node.d.cts +0 -5
  624. package/dist/schemas/dataSchema.schema.d.cts +0 -88
  625. package/dist/schemas/dataSchema.schema.d.ts +0 -88
  626. package/dist/schemas/grantFile.schema.d.cts +0 -57
  627. package/dist/schemas/grantFile.schema.d.ts +0 -57
  628. package/dist/server/handler.d.cts +0 -282
  629. package/dist/storage/index.d.cts +0 -10
  630. package/dist/storage/manager.d.cts +0 -150
  631. package/dist/storage/providers/callback-storage.d.cts +0 -100
  632. package/dist/storage/providers/google-drive.d.cts +0 -156
  633. package/dist/storage/providers/ipfs.d.cts +0 -163
  634. package/dist/storage/providers/pinata.d.cts +0 -173
  635. package/dist/types/chains.d.cts +0 -34
  636. package/dist/types/config.d.cts +0 -726
  637. package/dist/types/contracts.d.cts +0 -68
  638. package/dist/types/data.d.cts +0 -694
  639. package/dist/types/eccrypto-js.d.d.cts +0 -13
  640. package/dist/types/eccrypto-js.d.d.ts +0 -13
  641. package/dist/types/external-apis.d.cts +0 -186
  642. package/dist/types/generics.d.cts +0 -450
  643. package/dist/types/index.d.cts +0 -34
  644. package/dist/types/operations.d.cts +0 -108
  645. package/dist/types/permissions.d.cts +0 -957
  646. package/dist/types/personal.d.cts +0 -40
  647. package/dist/types/relayer.d.cts +0 -284
  648. package/dist/types/storage.d.cts +0 -131
  649. package/dist/types/transactionResults.d.cts +0 -25
  650. package/dist/types/utils.d.cts +0 -819
  651. package/dist/types.d.cts +0 -66
  652. package/dist/utils/blockchain/registry.d.cts +0 -34
  653. package/dist/utils/crypto-utils.d.cts +0 -118
  654. package/dist/utils/download.d.cts +0 -41
  655. package/dist/utils/encoding.d.cts +0 -54
  656. package/dist/utils/encryption.d.cts +0 -275
  657. package/dist/utils/eventParsing.cjs +0 -111
  658. package/dist/utils/eventParsing.cjs.map +0 -1
  659. package/dist/utils/eventParsing.d.cts +0 -60
  660. package/dist/utils/eventParsing.d.ts +0 -60
  661. package/dist/utils/eventParsing.js +0 -86
  662. package/dist/utils/eventParsing.js.map +0 -1
  663. package/dist/utils/formatters.d.cts +0 -120
  664. package/dist/utils/grantFiles.d.cts +0 -186
  665. package/dist/utils/grantValidation.d.cts +0 -150
  666. package/dist/utils/grants.d.cts +0 -70
  667. package/dist/utils/ipfs.d.cts +0 -90
  668. package/dist/utils/lazy-import.d.cts +0 -20
  669. package/dist/utils/multicall.d.cts +0 -129
  670. package/dist/utils/schemaValidation.d.cts +0 -172
  671. package/dist/utils/signatureCache.d.cts +0 -134
  672. package/dist/utils/signatureFormatter.d.cts +0 -39
  673. package/dist/utils/transactionParsing.cjs +0 -84
  674. package/dist/utils/transactionParsing.cjs.map +0 -1
  675. package/dist/utils/transactionParsing.d.cts +0 -25
  676. package/dist/utils/transactionParsing.d.ts +0 -25
  677. package/dist/utils/transactionParsing.js +0 -62
  678. package/dist/utils/transactionParsing.js.map +0 -1
  679. package/dist/utils/typedDataConverter.d.cts +0 -13
  680. package/dist/utils/urlResolver.d.cts +0 -40
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/schemaValidation.ts"],"sourcesContent":["import Ajv, { type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport dataSchemaSchema from \"../schemas/dataSchema.schema.json\";\nimport type { Schema } from \"../types/data\";\n\n/**\n * Data schema interface following the Vana schema specification\n *\n * @category Configuration\n */\nexport interface DataSchema {\n /** The name of the data schema */\n name: string;\n /** The version of the data schema */\n version: string;\n /** Optional description of the data schema */\n description?: string;\n /** The dialect type - either SQLite or JSON */\n dialect: \"sqlite\" | \"json\";\n /** Optional version of the dialect */\n dialectVersion?: string;\n /** The actual schema definition as string or object */\n schema: string | object;\n}\n\n/**\n * Error thrown when schema validation fails\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public errors: Array<{\n instancePath: string;\n schemaPath: string;\n keyword: string;\n params: Record<string, unknown>;\n message?: string;\n }>,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/**\n * Data schema validation utility class\n */\nexport class SchemaValidator {\n private ajv: Ajv;\n private dataSchemaValidator: ValidateFunction;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n });\n\n // Add format validation (e.g., date, email, uri)\n addFormats(this.ajv);\n\n // Compile the data schema meta-schema validator\n this.dataSchemaValidator = this.ajv.compile(dataSchemaSchema);\n }\n\n /**\n * Validates a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * const schema = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * }\n * }\n * };\n *\n * validator.validateDataSchemaAgainstMetaSchema(schema); // throws if invalid\n * ```\n */\n validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n ): asserts schema is DataSchema {\n const isValid = this.dataSchemaValidator(schema);\n\n if (!isValid) {\n const errors = this.dataSchemaValidator.errors || [];\n const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n\n // Additional validation based on dialect\n const typedSchema = schema as DataSchema;\n if (\n typedSchema.dialect === \"json\" &&\n typeof typedSchema.schema === \"object\"\n ) {\n // Validate that the embedded JSON Schema is actually valid\n try {\n this.ajv.compile(typedSchema.schema);\n } catch (error) {\n const errorMessage = `Invalid JSON Schema in data schema: ${error instanceof Error ? error.message : \"Unknown schema compilation error\"}`;\n throw new SchemaValidationError(errorMessage, []);\n }\n } else if (\n typedSchema.dialect === \"sqlite\" &&\n typeof typedSchema.schema === \"string\"\n ) {\n // Validate SQLite DDL syntax\n this.validateSQLiteDDL(typedSchema.schema, typedSchema.dialectVersion);\n }\n }\n\n /**\n * Validates data against a JSON Schema\n *\n * @param data - The data to validate\n * @param schema - The schema containing the validation rules (must have been validated or fetched from chain)\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * // Works with Schema from schemas.get()\n * const schema = await vana.schemas.get(1);\n * validator.validateDataAgainstSchema(userData, schema);\n *\n * // Also works with pre-validated DataSchema object\n * const dataSchema = validator.validateDataSchemaAgainstMetaSchema({\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * });\n * validator.validateDataAgainstSchema(userData, dataSchema);\n * ```\n */\n validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void {\n if (schema.dialect !== \"json\") {\n console.warn(\n `[SchemaValidator] Data validation skipped: dialect '${schema.dialect}' does not support data validation. ` +\n `Only JSON schemas can validate data structure.`,\n );\n return;\n }\n\n if (typeof schema.schema !== \"object\") {\n throw new SchemaValidationError(\n \"JSON dialect schemas must have an object schema\",\n [],\n );\n }\n\n // Compile and validate against the data schema\n const dataValidator = this.ajv.compile(schema.schema);\n const isValid = dataValidator(data);\n\n if (!isValid) {\n const errors = dataValidator.errors || [];\n const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n }\n\n /**\n * Validates a SQLite DDL string for basic syntax\n * Note: This is a basic validation, full SQL parsing would require a proper SQL parser\n *\n * @param ddl - The DDL string to validate\n * @param dialectVersion - Optional SQLite version (e.g., \"3\" for SQLite v3)\n * @throws SchemaValidationError if invalid\n */\n validateSQLiteDDL(ddl: string, dialectVersion?: string): void {\n if (typeof ddl !== \"string\" || ddl.trim().length === 0) {\n throw new SchemaValidationError(\n \"SQLite DDL must be a non-empty string\",\n [],\n );\n }\n\n // Validate dialectVersion if provided\n if (dialectVersion !== undefined) {\n const supportedVersions = [\"3\"];\n if (!supportedVersions.includes(dialectVersion)) {\n throw new SchemaValidationError(\n `Unsupported SQLite dialect version: ${dialectVersion}. Supported versions: ${supportedVersions.join(\", \")}`,\n [],\n );\n }\n }\n\n // Basic validation - check for CREATE TABLE statements\n const normalizedDDL = ddl.trim().toUpperCase();\n if (!normalizedDDL.includes(\"CREATE TABLE\")) {\n throw new SchemaValidationError(\n \"SQLite DDL must contain at least one CREATE TABLE statement\",\n [],\n );\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of ddl) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n if (parenCount !== 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n /**\n * Fetches and validates a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n * const schema = await validator.fetchAndValidateSchema(\"https://example.com/schema.json\");\n * ```\n */\n async fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n ): Promise<DataSchema> {\n try {\n const { fetchWithRelayer } = await import(\"./download\");\n const response = await fetchWithRelayer(url, downloadRelayer);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const schema = await response.json();\n this.validateDataSchemaAgainstMetaSchema(schema);\n\n // Additional validation based on dialect\n if (schema.dialect === \"sqlite\" && typeof schema.schema === \"string\") {\n this.validateSQLiteDDL(schema.schema, schema.dialectVersion);\n }\n\n return schema;\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n\n throw new SchemaValidationError(\n `Failed to fetch and validate schema from ${url}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n [],\n );\n }\n }\n}\n\n/**\n * Global schema validator instance\n */\nexport const schemaValidator = new SchemaValidator();\n\n/**\n * Convenience function to validate a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @returns The validated DataSchema\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const schemaDefinition = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * };\n *\n * const validatedSchema = validateDataSchemaAgainstMetaSchema(schemaDefinition);\n * ```\n */\nexport function validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n): DataSchema {\n const validator: SchemaValidator = schemaValidator;\n validator.validateDataSchemaAgainstMetaSchema(schema);\n // If we get here, schema is valid and typed as DataSchema\n return schema as DataSchema;\n}\n\n/**\n * Convenience function to validate data against a schema\n *\n * @param data - The data to validate\n * @param schema - The data schema containing the schema\n * @returns void - Function doesn't return a value\n * @throws SchemaValidationError if invalid\n */\nexport function validateDataAgainstSchema(\n data: unknown,\n schema: DataSchema | Schema,\n): void {\n return schemaValidator.validateDataAgainstSchema(data, schema);\n}\n\n/**\n * Convenience function to fetch and validate a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n */\nexport function fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n): Promise<DataSchema> {\n return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);\n}\n"],"mappings":"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","names":["Ajv","addFormats","dataSchemaSchema"]}
1
+ {"version":3,"sources":["../../src/utils/schemaValidation.ts"],"sourcesContent":["import Ajv, { type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport dataSchemaSchema from \"../schemas/dataSchema.schema.json\";\nimport type { Schema } from \"../types/data\";\n\n/**\n * Data schema interface following the Vana schema specification\n *\n * @category Configuration\n */\nexport interface DataSchema {\n /** The name of the data schema */\n name: string;\n /** The version of the data schema */\n version: string;\n /** Optional description of the data schema */\n description?: string;\n /** The dialect type - either SQLite or JSON */\n dialect: \"sqlite\" | \"json\";\n /** Optional version of the dialect */\n dialectVersion?: string;\n /** The actual schema definition as string or object */\n schema: string | object;\n}\n\n/**\n * Error thrown when schema validation fails\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public errors: Array<{\n instancePath: string;\n schemaPath: string;\n keyword: string;\n params: Record<string, unknown>;\n message?: string;\n }>,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/**\n * Data schema validation utility class\n */\nexport class SchemaValidator {\n private ajv: Ajv;\n private dataSchemaValidator: ValidateFunction;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n });\n\n // Add format validation (e.g., date, email, uri)\n addFormats(this.ajv);\n\n // Compile the data schema meta-schema validator\n this.dataSchemaValidator = this.ajv.compile(dataSchemaSchema);\n }\n\n /**\n * Validates a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * const schema = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * }\n * }\n * };\n *\n * validator.validateDataSchemaAgainstMetaSchema(schema); // throws if invalid\n * ```\n */\n validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n ): asserts schema is DataSchema {\n const isValid = this.dataSchemaValidator(schema);\n\n if (!isValid) {\n const errors = this.dataSchemaValidator.errors ?? [];\n const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n\n // Additional validation based on dialect\n const typedSchema = schema as DataSchema;\n if (\n typedSchema.dialect === \"json\" &&\n typeof typedSchema.schema === \"object\"\n ) {\n // Validate that the embedded JSON Schema is actually valid\n try {\n this.ajv.compile(typedSchema.schema);\n } catch (error) {\n const errorMessage = `Invalid JSON Schema in data schema: ${error instanceof Error ? error.message : \"Unknown schema compilation error\"}`;\n throw new SchemaValidationError(errorMessage, []);\n }\n } else if (\n typedSchema.dialect === \"sqlite\" &&\n typeof typedSchema.schema === \"string\"\n ) {\n // Validate SQLite DDL syntax\n this.validateSQLiteDDL(typedSchema.schema, typedSchema.dialectVersion);\n }\n }\n\n /**\n * Validates data against a JSON Schema\n *\n * @param data - The data to validate\n * @param schema - The schema containing the validation rules (must have been validated or fetched from chain)\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * // Works with Schema from schemas.get()\n * const schema = await vana.schemas.get(1);\n * validator.validateDataAgainstSchema(userData, schema);\n *\n * // Also works with pre-validated DataSchema object\n * const dataSchema = validator.validateDataSchemaAgainstMetaSchema({\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * });\n * validator.validateDataAgainstSchema(userData, dataSchema);\n * ```\n */\n validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void {\n if (schema.dialect !== \"json\") {\n console.warn(\n `[SchemaValidator] Data validation skipped: dialect '${schema.dialect}' does not support data validation. ` +\n `Only JSON schemas can validate data structure.`,\n );\n return;\n }\n\n if (typeof schema.schema !== \"object\") {\n throw new SchemaValidationError(\n \"JSON dialect schemas must have an object schema\",\n [],\n );\n }\n\n // Compile and validate against the data schema\n const dataValidator = this.ajv.compile(schema.schema);\n const isValid = dataValidator(data);\n\n if (!isValid) {\n const errors = dataValidator.errors ?? [];\n const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n }\n\n /**\n * Validates a SQLite DDL string for basic syntax\n * Note: This is a basic validation, full SQL parsing would require a proper SQL parser\n *\n * @param ddl - The DDL string to validate\n * @param dialectVersion - Optional SQLite version (e.g., \"3\" for SQLite v3)\n * @throws SchemaValidationError if invalid\n */\n validateSQLiteDDL(ddl: string, dialectVersion?: string): void {\n if (typeof ddl !== \"string\" || ddl.trim().length === 0) {\n throw new SchemaValidationError(\n \"SQLite DDL must be a non-empty string\",\n [],\n );\n }\n\n // Validate dialectVersion if provided\n if (dialectVersion !== undefined) {\n const supportedVersions = [\"3\"];\n if (!supportedVersions.includes(dialectVersion)) {\n throw new SchemaValidationError(\n `Unsupported SQLite dialect version: ${dialectVersion}. Supported versions: ${supportedVersions.join(\", \")}`,\n [],\n );\n }\n }\n\n // Basic validation - check for CREATE TABLE statements\n const normalizedDDL = ddl.trim().toUpperCase();\n if (!normalizedDDL.includes(\"CREATE TABLE\")) {\n throw new SchemaValidationError(\n \"SQLite DDL must contain at least one CREATE TABLE statement\",\n [],\n );\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of ddl) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n if (parenCount !== 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n /**\n * Fetches and validates a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n * const schema = await validator.fetchAndValidateSchema(\"https://example.com/schema.json\");\n * ```\n */\n async fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n ): Promise<DataSchema> {\n try {\n const { universalFetch } = await import(\"./download\");\n const response = await universalFetch(url, downloadRelayer);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const schema = await response.json();\n this.validateDataSchemaAgainstMetaSchema(schema);\n\n // Additional validation based on dialect\n if (schema.dialect === \"sqlite\" && typeof schema.schema === \"string\") {\n this.validateSQLiteDDL(schema.schema, schema.dialectVersion);\n }\n\n return schema;\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n\n throw new SchemaValidationError(\n `Failed to fetch and validate schema from ${url}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n [],\n );\n }\n }\n}\n\n/**\n * Global schema validator instance\n */\nexport const schemaValidator = new SchemaValidator();\n\n/**\n * Convenience function to validate a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @returns The validated DataSchema\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const schemaDefinition = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * };\n *\n * const validatedSchema = validateDataSchemaAgainstMetaSchema(schemaDefinition);\n * ```\n */\nexport function validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n): DataSchema {\n const validator: SchemaValidator = schemaValidator;\n validator.validateDataSchemaAgainstMetaSchema(schema);\n // If we get here, schema is valid and typed as DataSchema\n return schema;\n}\n\n/**\n * Convenience function to validate data against a schema\n *\n * @param data - The data to validate\n * @param schema - The data schema containing the schema\n * @returns void - Function doesn't return a value\n * @throws SchemaValidationError if invalid\n */\nexport function validateDataAgainstSchema(\n data: unknown,\n schema: DataSchema | Schema,\n): void {\n schemaValidator.validateDataAgainstSchema(data, schema);\n}\n\n/**\n * Convenience function to fetch and validate a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n */\nexport function fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n): Promise<DataSchema> {\n return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);\n}\n"],"mappings":"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","names":["Ajv","addFormats","dataSchemaSchema"]}
@@ -1,12 +1,10 @@
1
- import { Schema } from '../types/data.js';
2
- import 'viem';
3
-
1
+ import type { Schema } from "../types/data";
4
2
  /**
5
3
  * Data schema interface following the Vana schema specification
6
4
  *
7
5
  * @category Configuration
8
6
  */
9
- interface DataSchema {
7
+ export interface DataSchema {
10
8
  /** The name of the data schema */
11
9
  name: string;
12
10
  /** The version of the data schema */
@@ -23,7 +21,7 @@ interface DataSchema {
23
21
  /**
24
22
  * Error thrown when schema validation fails
25
23
  */
26
- declare class SchemaValidationError extends Error {
24
+ export declare class SchemaValidationError extends Error {
27
25
  errors: Array<{
28
26
  instancePath: string;
29
27
  schemaPath: string;
@@ -42,7 +40,7 @@ declare class SchemaValidationError extends Error {
42
40
  /**
43
41
  * Data schema validation utility class
44
42
  */
45
- declare class SchemaValidator {
43
+ export declare class SchemaValidator {
46
44
  private ajv;
47
45
  private dataSchemaValidator;
48
46
  constructor();
@@ -127,7 +125,7 @@ declare class SchemaValidator {
127
125
  /**
128
126
  * Global schema validator instance
129
127
  */
130
- declare const schemaValidator: SchemaValidator;
128
+ export declare const schemaValidator: SchemaValidator;
131
129
  /**
132
130
  * Convenience function to validate a data schema definition against the Vana meta-schema
133
131
  *
@@ -146,7 +144,7 @@ declare const schemaValidator: SchemaValidator;
146
144
  * const validatedSchema = validateDataSchemaAgainstMetaSchema(schemaDefinition);
147
145
  * ```
148
146
  */
149
- declare function validateDataSchemaAgainstMetaSchema(schema: unknown): DataSchema;
147
+ export declare function validateDataSchemaAgainstMetaSchema(schema: unknown): DataSchema;
150
148
  /**
151
149
  * Convenience function to validate data against a schema
152
150
  *
@@ -155,7 +153,7 @@ declare function validateDataSchemaAgainstMetaSchema(schema: unknown): DataSchem
155
153
  * @returns void - Function doesn't return a value
156
154
  * @throws SchemaValidationError if invalid
157
155
  */
158
- declare function validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void;
156
+ export declare function validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void;
159
157
  /**
160
158
  * Convenience function to fetch and validate a data schema from a URL
161
159
  *
@@ -165,8 +163,6 @@ declare function validateDataAgainstSchema(data: unknown, schema: DataSchema | S
165
163
  * @returns The validated data schema
166
164
  * @throws SchemaValidationError if invalid or fetch fails
167
165
  */
168
- declare function fetchAndValidateSchema(url: string, downloadRelayer?: {
166
+ export declare function fetchAndValidateSchema(url: string, downloadRelayer?: {
169
167
  proxyDownload: (url: string) => Promise<Blob>;
170
168
  }): Promise<DataSchema>;
171
-
172
- export { type DataSchema, SchemaValidationError, SchemaValidator, fetchAndValidateSchema, schemaValidator, validateDataAgainstSchema, validateDataSchemaAgainstMetaSchema };
@@ -1,6 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
1
  import Ajv from "ajv";
5
2
  import addFormats from "ajv-formats";
6
3
  import dataSchemaSchema from "../schemas/dataSchema.schema.json";
@@ -12,9 +9,9 @@ class SchemaValidationError extends Error {
12
9
  }
13
10
  }
14
11
  class SchemaValidator {
12
+ ajv;
13
+ dataSchemaValidator;
15
14
  constructor() {
16
- __publicField(this, "ajv");
17
- __publicField(this, "dataSchemaValidator");
18
15
  this.ajv = new Ajv({
19
16
  allErrors: true,
20
17
  verbose: true,
@@ -51,7 +48,7 @@ class SchemaValidator {
51
48
  validateDataSchemaAgainstMetaSchema(schema) {
52
49
  const isValid = this.dataSchemaValidator(schema);
53
50
  if (!isValid) {
54
- const errors = this.dataSchemaValidator.errors || [];
51
+ const errors = this.dataSchemaValidator.errors ?? [];
55
52
  const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(", ")}`;
56
53
  throw new SchemaValidationError(errorMessage, errors);
57
54
  }
@@ -107,7 +104,7 @@ class SchemaValidator {
107
104
  const dataValidator = this.ajv.compile(schema.schema);
108
105
  const isValid = dataValidator(data);
109
106
  if (!isValid) {
110
- const errors = dataValidator.errors || [];
107
+ const errors = dataValidator.errors ?? [];
111
108
  const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(", ")}`;
112
109
  throw new SchemaValidationError(errorMessage, errors);
113
110
  }
@@ -177,8 +174,8 @@ class SchemaValidator {
177
174
  */
178
175
  async fetchAndValidateSchema(url, downloadRelayer) {
179
176
  try {
180
- const { fetchWithRelayer } = await import("./download");
181
- const response = await fetchWithRelayer(url, downloadRelayer);
177
+ const { universalFetch } = await import("./download");
178
+ const response = await universalFetch(url, downloadRelayer);
182
179
  if (!response.ok) {
183
180
  throw new Error(`HTTP ${response.status}: ${response.statusText}`);
184
181
  }
@@ -206,7 +203,7 @@ function validateDataSchemaAgainstMetaSchema(schema) {
206
203
  return schema;
207
204
  }
208
205
  function validateDataAgainstSchema(data, schema) {
209
- return schemaValidator.validateDataAgainstSchema(data, schema);
206
+ schemaValidator.validateDataAgainstSchema(data, schema);
210
207
  }
211
208
  function fetchAndValidateSchema(url, downloadRelayer) {
212
209
  return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/schemaValidation.ts"],"sourcesContent":["import Ajv, { type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport dataSchemaSchema from \"../schemas/dataSchema.schema.json\";\nimport type { Schema } from \"../types/data\";\n\n/**\n * Data schema interface following the Vana schema specification\n *\n * @category Configuration\n */\nexport interface DataSchema {\n /** The name of the data schema */\n name: string;\n /** The version of the data schema */\n version: string;\n /** Optional description of the data schema */\n description?: string;\n /** The dialect type - either SQLite or JSON */\n dialect: \"sqlite\" | \"json\";\n /** Optional version of the dialect */\n dialectVersion?: string;\n /** The actual schema definition as string or object */\n schema: string | object;\n}\n\n/**\n * Error thrown when schema validation fails\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public errors: Array<{\n instancePath: string;\n schemaPath: string;\n keyword: string;\n params: Record<string, unknown>;\n message?: string;\n }>,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/**\n * Data schema validation utility class\n */\nexport class SchemaValidator {\n private ajv: Ajv;\n private dataSchemaValidator: ValidateFunction;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n });\n\n // Add format validation (e.g., date, email, uri)\n addFormats(this.ajv);\n\n // Compile the data schema meta-schema validator\n this.dataSchemaValidator = this.ajv.compile(dataSchemaSchema);\n }\n\n /**\n * Validates a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * const schema = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * }\n * }\n * };\n *\n * validator.validateDataSchemaAgainstMetaSchema(schema); // throws if invalid\n * ```\n */\n validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n ): asserts schema is DataSchema {\n const isValid = this.dataSchemaValidator(schema);\n\n if (!isValid) {\n const errors = this.dataSchemaValidator.errors || [];\n const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n\n // Additional validation based on dialect\n const typedSchema = schema as DataSchema;\n if (\n typedSchema.dialect === \"json\" &&\n typeof typedSchema.schema === \"object\"\n ) {\n // Validate that the embedded JSON Schema is actually valid\n try {\n this.ajv.compile(typedSchema.schema);\n } catch (error) {\n const errorMessage = `Invalid JSON Schema in data schema: ${error instanceof Error ? error.message : \"Unknown schema compilation error\"}`;\n throw new SchemaValidationError(errorMessage, []);\n }\n } else if (\n typedSchema.dialect === \"sqlite\" &&\n typeof typedSchema.schema === \"string\"\n ) {\n // Validate SQLite DDL syntax\n this.validateSQLiteDDL(typedSchema.schema, typedSchema.dialectVersion);\n }\n }\n\n /**\n * Validates data against a JSON Schema\n *\n * @param data - The data to validate\n * @param schema - The schema containing the validation rules (must have been validated or fetched from chain)\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * // Works with Schema from schemas.get()\n * const schema = await vana.schemas.get(1);\n * validator.validateDataAgainstSchema(userData, schema);\n *\n * // Also works with pre-validated DataSchema object\n * const dataSchema = validator.validateDataSchemaAgainstMetaSchema({\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * });\n * validator.validateDataAgainstSchema(userData, dataSchema);\n * ```\n */\n validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void {\n if (schema.dialect !== \"json\") {\n console.warn(\n `[SchemaValidator] Data validation skipped: dialect '${schema.dialect}' does not support data validation. ` +\n `Only JSON schemas can validate data structure.`,\n );\n return;\n }\n\n if (typeof schema.schema !== \"object\") {\n throw new SchemaValidationError(\n \"JSON dialect schemas must have an object schema\",\n [],\n );\n }\n\n // Compile and validate against the data schema\n const dataValidator = this.ajv.compile(schema.schema);\n const isValid = dataValidator(data);\n\n if (!isValid) {\n const errors = dataValidator.errors || [];\n const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n }\n\n /**\n * Validates a SQLite DDL string for basic syntax\n * Note: This is a basic validation, full SQL parsing would require a proper SQL parser\n *\n * @param ddl - The DDL string to validate\n * @param dialectVersion - Optional SQLite version (e.g., \"3\" for SQLite v3)\n * @throws SchemaValidationError if invalid\n */\n validateSQLiteDDL(ddl: string, dialectVersion?: string): void {\n if (typeof ddl !== \"string\" || ddl.trim().length === 0) {\n throw new SchemaValidationError(\n \"SQLite DDL must be a non-empty string\",\n [],\n );\n }\n\n // Validate dialectVersion if provided\n if (dialectVersion !== undefined) {\n const supportedVersions = [\"3\"];\n if (!supportedVersions.includes(dialectVersion)) {\n throw new SchemaValidationError(\n `Unsupported SQLite dialect version: ${dialectVersion}. Supported versions: ${supportedVersions.join(\", \")}`,\n [],\n );\n }\n }\n\n // Basic validation - check for CREATE TABLE statements\n const normalizedDDL = ddl.trim().toUpperCase();\n if (!normalizedDDL.includes(\"CREATE TABLE\")) {\n throw new SchemaValidationError(\n \"SQLite DDL must contain at least one CREATE TABLE statement\",\n [],\n );\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of ddl) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n if (parenCount !== 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n /**\n * Fetches and validates a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n * const schema = await validator.fetchAndValidateSchema(\"https://example.com/schema.json\");\n * ```\n */\n async fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n ): Promise<DataSchema> {\n try {\n const { fetchWithRelayer } = await import(\"./download\");\n const response = await fetchWithRelayer(url, downloadRelayer);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const schema = await response.json();\n this.validateDataSchemaAgainstMetaSchema(schema);\n\n // Additional validation based on dialect\n if (schema.dialect === \"sqlite\" && typeof schema.schema === \"string\") {\n this.validateSQLiteDDL(schema.schema, schema.dialectVersion);\n }\n\n return schema;\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n\n throw new SchemaValidationError(\n `Failed to fetch and validate schema from ${url}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n [],\n );\n }\n }\n}\n\n/**\n * Global schema validator instance\n */\nexport const schemaValidator = new SchemaValidator();\n\n/**\n * Convenience function to validate a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @returns The validated DataSchema\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const schemaDefinition = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * };\n *\n * const validatedSchema = validateDataSchemaAgainstMetaSchema(schemaDefinition);\n * ```\n */\nexport function validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n): DataSchema {\n const validator: SchemaValidator = schemaValidator;\n validator.validateDataSchemaAgainstMetaSchema(schema);\n // If we get here, schema is valid and typed as DataSchema\n return schema as DataSchema;\n}\n\n/**\n * Convenience function to validate data against a schema\n *\n * @param data - The data to validate\n * @param schema - The data schema containing the schema\n * @returns void - Function doesn't return a value\n * @throws SchemaValidationError if invalid\n */\nexport function validateDataAgainstSchema(\n data: unknown,\n schema: DataSchema | Schema,\n): void {\n return schemaValidator.validateDataAgainstSchema(data, schema);\n}\n\n/**\n * Convenience function to fetch and validate a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n */\nexport function fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n): Promise<DataSchema> {\n return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/schemaValidation.ts"],"sourcesContent":["import Ajv, { type ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport dataSchemaSchema from \"../schemas/dataSchema.schema.json\";\nimport type { Schema } from \"../types/data\";\n\n/**\n * Data schema interface following the Vana schema specification\n *\n * @category Configuration\n */\nexport interface DataSchema {\n /** The name of the data schema */\n name: string;\n /** The version of the data schema */\n version: string;\n /** Optional description of the data schema */\n description?: string;\n /** The dialect type - either SQLite or JSON */\n dialect: \"sqlite\" | \"json\";\n /** Optional version of the dialect */\n dialectVersion?: string;\n /** The actual schema definition as string or object */\n schema: string | object;\n}\n\n/**\n * Error thrown when schema validation fails\n */\nexport class SchemaValidationError extends Error {\n constructor(\n message: string,\n public errors: Array<{\n instancePath: string;\n schemaPath: string;\n keyword: string;\n params: Record<string, unknown>;\n message?: string;\n }>,\n ) {\n super(message);\n this.name = \"SchemaValidationError\";\n }\n}\n\n/**\n * Data schema validation utility class\n */\nexport class SchemaValidator {\n private ajv: Ajv;\n private dataSchemaValidator: ValidateFunction;\n\n constructor() {\n this.ajv = new Ajv({\n allErrors: true,\n verbose: true,\n strict: false,\n });\n\n // Add format validation (e.g., date, email, uri)\n addFormats(this.ajv);\n\n // Compile the data schema meta-schema validator\n this.dataSchemaValidator = this.ajv.compile(dataSchemaSchema);\n }\n\n /**\n * Validates a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * const schema = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * }\n * }\n * };\n *\n * validator.validateDataSchemaAgainstMetaSchema(schema); // throws if invalid\n * ```\n */\n validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n ): asserts schema is DataSchema {\n const isValid = this.dataSchemaValidator(schema);\n\n if (!isValid) {\n const errors = this.dataSchemaValidator.errors ?? [];\n const errorMessage = `Data schema validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n\n // Additional validation based on dialect\n const typedSchema = schema as DataSchema;\n if (\n typedSchema.dialect === \"json\" &&\n typeof typedSchema.schema === \"object\"\n ) {\n // Validate that the embedded JSON Schema is actually valid\n try {\n this.ajv.compile(typedSchema.schema);\n } catch (error) {\n const errorMessage = `Invalid JSON Schema in data schema: ${error instanceof Error ? error.message : \"Unknown schema compilation error\"}`;\n throw new SchemaValidationError(errorMessage, []);\n }\n } else if (\n typedSchema.dialect === \"sqlite\" &&\n typeof typedSchema.schema === \"string\"\n ) {\n // Validate SQLite DDL syntax\n this.validateSQLiteDDL(typedSchema.schema, typedSchema.dialectVersion);\n }\n }\n\n /**\n * Validates data against a JSON Schema\n *\n * @param data - The data to validate\n * @param schema - The schema containing the validation rules (must have been validated or fetched from chain)\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n *\n * // Works with Schema from schemas.get()\n * const schema = await vana.schemas.get(1);\n * validator.validateDataAgainstSchema(userData, schema);\n *\n * // Also works with pre-validated DataSchema object\n * const dataSchema = validator.validateDataSchemaAgainstMetaSchema({\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * });\n * validator.validateDataAgainstSchema(userData, dataSchema);\n * ```\n */\n validateDataAgainstSchema(data: unknown, schema: DataSchema | Schema): void {\n if (schema.dialect !== \"json\") {\n console.warn(\n `[SchemaValidator] Data validation skipped: dialect '${schema.dialect}' does not support data validation. ` +\n `Only JSON schemas can validate data structure.`,\n );\n return;\n }\n\n if (typeof schema.schema !== \"object\") {\n throw new SchemaValidationError(\n \"JSON dialect schemas must have an object schema\",\n [],\n );\n }\n\n // Compile and validate against the data schema\n const dataValidator = this.ajv.compile(schema.schema);\n const isValid = dataValidator(data);\n\n if (!isValid) {\n const errors = dataValidator.errors ?? [];\n const errorMessage = `Data validation failed: ${errors.map((e) => `${e.instancePath} ${e.message}`).join(\", \")}`;\n throw new SchemaValidationError(errorMessage, errors);\n }\n }\n\n /**\n * Validates a SQLite DDL string for basic syntax\n * Note: This is a basic validation, full SQL parsing would require a proper SQL parser\n *\n * @param ddl - The DDL string to validate\n * @param dialectVersion - Optional SQLite version (e.g., \"3\" for SQLite v3)\n * @throws SchemaValidationError if invalid\n */\n validateSQLiteDDL(ddl: string, dialectVersion?: string): void {\n if (typeof ddl !== \"string\" || ddl.trim().length === 0) {\n throw new SchemaValidationError(\n \"SQLite DDL must be a non-empty string\",\n [],\n );\n }\n\n // Validate dialectVersion if provided\n if (dialectVersion !== undefined) {\n const supportedVersions = [\"3\"];\n if (!supportedVersions.includes(dialectVersion)) {\n throw new SchemaValidationError(\n `Unsupported SQLite dialect version: ${dialectVersion}. Supported versions: ${supportedVersions.join(\", \")}`,\n [],\n );\n }\n }\n\n // Basic validation - check for CREATE TABLE statements\n const normalizedDDL = ddl.trim().toUpperCase();\n if (!normalizedDDL.includes(\"CREATE TABLE\")) {\n throw new SchemaValidationError(\n \"SQLite DDL must contain at least one CREATE TABLE statement\",\n [],\n );\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of ddl) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n if (parenCount !== 0) {\n throw new SchemaValidationError(\n \"SQLite DDL has unbalanced parentheses\",\n [],\n );\n }\n }\n\n /**\n * Fetches and validates a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n * @example\n * ```typescript\n * const validator = new SchemaValidator();\n * const schema = await validator.fetchAndValidateSchema(\"https://example.com/schema.json\");\n * ```\n */\n async fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n ): Promise<DataSchema> {\n try {\n const { universalFetch } = await import(\"./download\");\n const response = await universalFetch(url, downloadRelayer);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const schema = await response.json();\n this.validateDataSchemaAgainstMetaSchema(schema);\n\n // Additional validation based on dialect\n if (schema.dialect === \"sqlite\" && typeof schema.schema === \"string\") {\n this.validateSQLiteDDL(schema.schema, schema.dialectVersion);\n }\n\n return schema;\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n\n throw new SchemaValidationError(\n `Failed to fetch and validate schema from ${url}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n [],\n );\n }\n }\n}\n\n/**\n * Global schema validator instance\n */\nexport const schemaValidator = new SchemaValidator();\n\n/**\n * Convenience function to validate a data schema definition against the Vana meta-schema\n *\n * @param schema - The data schema definition to validate\n * @returns The validated DataSchema\n * @throws SchemaValidationError if invalid\n * @example\n * ```typescript\n * const schemaDefinition = {\n * name: \"User Profile\",\n * version: \"1.0.0\",\n * dialect: \"json\",\n * schema: { type: \"object\", properties: { name: { type: \"string\" } } }\n * };\n *\n * const validatedSchema = validateDataSchemaAgainstMetaSchema(schemaDefinition);\n * ```\n */\nexport function validateDataSchemaAgainstMetaSchema(\n schema: unknown,\n): DataSchema {\n const validator: SchemaValidator = schemaValidator;\n validator.validateDataSchemaAgainstMetaSchema(schema);\n // If we get here, schema is valid and typed as DataSchema\n return schema;\n}\n\n/**\n * Convenience function to validate data against a schema\n *\n * @param data - The data to validate\n * @param schema - The data schema containing the schema\n * @returns void - Function doesn't return a value\n * @throws SchemaValidationError if invalid\n */\nexport function validateDataAgainstSchema(\n data: unknown,\n schema: DataSchema | Schema,\n): void {\n schemaValidator.validateDataAgainstSchema(data, schema);\n}\n\n/**\n * Convenience function to fetch and validate a data schema from a URL\n *\n * @param url - The URL to fetch the data schema from\n * @param downloadRelayer - Optional download relayer for CORS bypass\n * @param downloadRelayer.proxyDownload - Function to proxy downloads through application server\n * @returns The validated data schema\n * @throws SchemaValidationError if invalid or fetch fails\n */\nexport function fetchAndValidateSchema(\n url: string,\n downloadRelayer?: { proxyDownload: (url: string) => Promise<Blob> },\n): Promise<DataSchema> {\n return schemaValidator.fetchAndValidateSchema(url, downloadRelayer);\n}\n"],"mappings":"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","names":[]}
@@ -24,7 +24,6 @@ __export(signatureCache_exports, {
24
24
  module.exports = __toCommonJS(signatureCache_exports);
25
25
  var import_viem = require("viem");
26
26
  var import_sha256 = require("@noble/hashes/sha256");
27
- var import_utils = require("@noble/hashes/utils");
28
27
  class SignatureCache {
29
28
  static PREFIX = "vana_sig_";
30
29
  static DEFAULT_TTL_HOURS = 2;
@@ -143,7 +142,7 @@ class SignatureCache {
143
142
  static hashMessage(message) {
144
143
  const jsonString = JSON.stringify(message, this.deterministicReplacer);
145
144
  const hashBytes = (0, import_sha256.sha256)(new TextEncoder().encode(jsonString));
146
- return (0, import_utils.bytesToHex)(hashBytes);
145
+ return (0, import_viem.toHex)(hashBytes);
147
146
  }
148
147
  /**
149
148
  * Deterministic JSON replacer that handles BigInt values and sorts object keys
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/signatureCache.ts"],"sourcesContent":["import { Hash, getAddress } from \"viem\";\nimport type { VanaCacheAdapter } from \"../platform/interface\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\n\ninterface CachedSignature {\n signature: Hash;\n expires: number;\n}\n\n/**\n * Simple signature cache using platform cache adapter to avoid repeated signing of identical messages.\n *\n * @remarks\n * This cache significantly improves UX by avoiding repeated wallet signature prompts\n * for identical operations. It's particularly useful for operations that may be\n * retried or called multiple times with the same parameters.\n *\n * Features:\n * - Platform-appropriate storage (sessionStorage in browser, memory in Node.js)\n * - Configurable TTL (default 2 hours)\n * - Automatic cleanup of expired entries\n * - Cache keys based on wallet address + message hash\n *\n * @example\n * ```typescript\n * // Check cache before requesting signature\n * const cached = SignatureCache.get(cache, walletAddress, messageHash);\n * if (cached) {\n * return cached;\n * }\n *\n * // Request signature and cache it\n * const signature = await wallet.signTypedData(typedData);\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n * ```\n * @category Utilities\n */\nexport class SignatureCache {\n private static readonly PREFIX = \"vana_sig_\";\n private static readonly DEFAULT_TTL_HOURS = 2;\n\n /**\n * Get a cached signature if it exists and hasn't expired\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @returns The cached signature if valid, null if expired or not found\n * @example\n * ```typescript\n * const messageHash = SignatureCache.hashMessage(typedData);\n * const cached = SignatureCache.get(cache, '0x123...', messageHash);\n * if (cached) {\n * console.log('Using cached signature:', cached);\n * }\n * ```\n */\n static get(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n ): Hash | null {\n const key = this.getCacheKey(walletAddress, messageHash);\n\n try {\n const stored = cache.get(key);\n if (!stored) return null;\n\n const cached: CachedSignature = JSON.parse(stored);\n\n // Check if expired\n if (Date.now() > cached.expires) {\n cache.delete(key);\n return null;\n }\n\n return cached.signature;\n } catch {\n // Invalid JSON or storage error, clean up\n try {\n cache.delete(key);\n } catch {\n // Ignore cache cleanup errors\n }\n return null;\n }\n }\n\n /**\n * Store a signature in the cache with configurable TTL\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @param signature - The signature to cache\n * @param ttlHours - Time to live in hours (default: 2)\n * @example\n * ```typescript\n * const signature = await wallet.signTypedData(typedData);\n * const messageHash = SignatureCache.hashMessage(typedData);\n *\n * // Cache for default 2 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n *\n * // Cache for 24 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature, 24);\n * ```\n */\n static set(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n signature: Hash,\n ttlHours: number = this.DEFAULT_TTL_HOURS,\n ): void {\n const key = this.getCacheKey(walletAddress, messageHash);\n const cached: CachedSignature = {\n signature,\n expires: Date.now() + ttlHours * 3600000, // Convert hours to milliseconds\n };\n\n try {\n cache.set(key, JSON.stringify(cached));\n } catch {\n // Storage quota exceeded or other error, ignore silently\n // Better to continue without caching than to fail\n }\n }\n\n /**\n * Clear all cached signatures (useful for testing or explicit cleanup)\n *\n * @param cache - Platform cache adapter instance\n * @example\n * ```typescript\n * // Clear all signatures when user logs out\n * SignatureCache.clear(cache);\n *\n * // Clear before running tests\n * beforeEach(() => {\n * SignatureCache.clear(cache);\n * });\n * ```\n */\n static clear(cache: VanaCacheAdapter): void {\n try {\n cache.clear();\n } catch {\n // Ignore storage errors\n }\n }\n\n private static getCacheKey(\n walletAddress: string,\n messageHash: string,\n ): string {\n return `${this.PREFIX}${getAddress(walletAddress)}:${messageHash}`;\n }\n\n /**\n * Generate a deterministic hash of a message object for cache key generation\n *\n * @remarks\n * Creates a cryptographically secure hash from complex objects including EIP-712 typed data.\n * Uses SHA-256 for collision resistance and deterministic key generation.\n * Handles BigInt serialization and sorts object keys for consistency.\n *\n * @param message - The message object to hash (typically EIP-712 typed data)\n * @returns A hex string hash (SHA-256) suitable for cache keys\n * @example\n * ```typescript\n * const typedData = {\n * domain: { name: 'Vana', version: '1' },\n * message: { nonce: 123n, grant: '...' }\n * };\n *\n * const hash = SignatureCache.hashMessage(typedData);\n * // Returns SHA-256 hash like: \"a1b2c3d4e5f6...\"\n * ```\n */\n static hashMessage(message: object): string {\n // Deterministically stringify the object with sorted keys\n const jsonString = JSON.stringify(message, this.deterministicReplacer);\n\n // Use SHA-256 for cryptographic hashing\n const hashBytes = sha256(new TextEncoder().encode(jsonString));\n return bytesToHex(hashBytes);\n }\n\n /**\n * Deterministic JSON replacer that handles BigInt values and sorts object keys\n * This ensures consistent cache key generation for EIP-712 typed data\n *\n * @param _key - The object key being serialized (unused)\n * @param value - The value to serialize\n * @returns The serialized value with sorted keys for objects\n */\n private static deterministicReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return `__BIGINT__${value.toString()}`;\n }\n // Sort object keys for deterministic serialization\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n );\n }\n return value;\n }\n}\n\n/**\n * Wrapper function to cache signature operations\n *\n * @param cache - The cache adapter to use for storage\n * @param walletAddress - The wallet address signing the message\n * @param typedData - The EIP-712 typed data being signed\n * @param signFn - Function that performs the actual signing\n * @param ttlHours - Cache TTL in hours (default 2)\n * @returns The signature (cached or newly generated)\n */\nexport async function withSignatureCache(\n cache: VanaCacheAdapter,\n walletAddress: string,\n typedData: Record<string, unknown>,\n signFn: () => Promise<Hash>,\n ttlHours?: number,\n): Promise<Hash> {\n // Create a hash of the typed data for the cache key\n const messageHash = SignatureCache.hashMessage(typedData);\n\n // Try to get from cache first\n const cached = SignatureCache.get(cache, walletAddress, messageHash);\n if (cached) {\n return cached;\n }\n\n // Not in cache, sign and store\n const signature = await signFn();\n SignatureCache.set(cache, walletAddress, messageHash, signature, ttlHours);\n\n return signature;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiC;AAEjC,oBAAuB;AACvB,mBAA2B;AAmCpB,MAAM,eAAe;AAAA,EAC1B,OAAwB,SAAS;AAAA,EACjC,OAAwB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkB5C,OAAO,IACL,OACA,eACA,aACa;AACb,UAAM,MAAM,KAAK,YAAY,eAAe,WAAW;AAEvD,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,GAAG;AAC5B,UAAI,CAAC,OAAQ,QAAO;AAEpB,YAAM,SAA0B,KAAK,MAAM,MAAM;AAGjD,UAAI,KAAK,IAAI,IAAI,OAAO,SAAS;AAC/B,cAAM,OAAO,GAAG;AAChB,eAAO;AAAA,MACT;AAEA,aAAO,OAAO;AAAA,IAChB,QAAQ;AAEN,UAAI;AACF,cAAM,OAAO,GAAG;AAAA,MAClB,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO,IACL,OACA,eACA,aACA,WACA,WAAmB,KAAK,mBAClB;AACN,UAAM,MAAM,KAAK,YAAY,eAAe,WAAW;AACvD,UAAM,SAA0B;AAAA,MAC9B;AAAA,MACA,SAAS,KAAK,IAAI,IAAI,WAAW;AAAA;AAAA,IACnC;AAEA,QAAI;AACF,YAAM,IAAI,KAAK,KAAK,UAAU,MAAM,CAAC;AAAA,IACvC,QAAQ;AAAA,IAGR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,MAAM,OAA+B;AAC1C,QAAI;AACF,YAAM,MAAM;AAAA,IACd,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,OAAe,YACb,eACA,aACQ;AACR,WAAO,GAAG,KAAK,MAAM,OAAG,wBAAW,aAAa,CAAC,IAAI,WAAW;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,OAAO,YAAY,SAAyB;AAE1C,UAAM,aAAa,KAAK,UAAU,SAAS,KAAK,qBAAqB;AAGrE,UAAM,gBAAY,sBAAO,IAAI,YAAY,EAAE,OAAO,UAAU,CAAC;AAC7D,eAAO,yBAAW,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAe,sBAAsB,MAAc,OAAyB;AAC1E,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,aAAa,MAAM,SAAS,CAAC;AAAA,IACtC;AAEA,QAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACxE,aAAO,OAAO,KAAK,KAAgC,EAChD,KAAK,EACL;AAAA,QACC,CAAC,QAAQ,QAAQ;AACf,iBAAO,GAAG,IAAK,MAAkC,GAAG;AACpD,iBAAO;AAAA,QACT;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACJ;AACA,WAAO;AAAA,EACT;AACF;AAYA,eAAsB,mBACpB,OACA,eACA,WACA,QACA,UACe;AAEf,QAAM,cAAc,eAAe,YAAY,SAAS;AAGxD,QAAM,SAAS,eAAe,IAAI,OAAO,eAAe,WAAW;AACnE,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,MAAM,OAAO;AAC/B,iBAAe,IAAI,OAAO,eAAe,aAAa,WAAW,QAAQ;AAEzE,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/signatureCache.ts"],"sourcesContent":["import type { Hash } from \"viem\";\nimport { getAddress, toHex } from \"viem\";\nimport type { VanaCacheAdapter } from \"../platform/interface\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\ninterface CachedSignature {\n signature: Hash;\n expires: number;\n}\n\n/**\n * Simple signature cache using platform cache adapter to avoid repeated signing of identical messages.\n *\n * @remarks\n * This cache significantly improves UX by avoiding repeated wallet signature prompts\n * for identical operations. It's particularly useful for operations that may be\n * retried or called multiple times with the same parameters.\n *\n * Features:\n * - Platform-appropriate storage (sessionStorage in browser, memory in Node.js)\n * - Configurable TTL (default 2 hours)\n * - Automatic cleanup of expired entries\n * - Cache keys based on wallet address + message hash\n *\n * @example\n * ```typescript\n * // Check cache before requesting signature\n * const cached = SignatureCache.get(cache, walletAddress, messageHash);\n * if (cached) {\n * return cached;\n * }\n *\n * // Request signature and cache it\n * const signature = await wallet.signTypedData(typedData);\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n * ```\n * @category Utilities\n */\nexport class SignatureCache {\n private static readonly PREFIX = \"vana_sig_\";\n private static readonly DEFAULT_TTL_HOURS = 2;\n\n /**\n * Get a cached signature if it exists and hasn't expired\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @returns The cached signature if valid, null if expired or not found\n * @example\n * ```typescript\n * const messageHash = SignatureCache.hashMessage(typedData);\n * const cached = SignatureCache.get(cache, '0x123...', messageHash);\n * if (cached) {\n * console.log('Using cached signature:', cached);\n * }\n * ```\n */\n static get(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n ): Hash | null {\n const key = this.getCacheKey(walletAddress, messageHash);\n\n try {\n const stored = cache.get(key);\n if (!stored) return null;\n\n const cached: CachedSignature = JSON.parse(stored);\n\n // Check if expired\n if (Date.now() > cached.expires) {\n cache.delete(key);\n return null;\n }\n\n return cached.signature;\n } catch {\n // Invalid JSON or storage error, clean up\n try {\n cache.delete(key);\n } catch {\n // Ignore cache cleanup errors\n }\n return null;\n }\n }\n\n /**\n * Store a signature in the cache with configurable TTL\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @param signature - The signature to cache\n * @param ttlHours - Time to live in hours (default: 2)\n * @example\n * ```typescript\n * const signature = await wallet.signTypedData(typedData);\n * const messageHash = SignatureCache.hashMessage(typedData);\n *\n * // Cache for default 2 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n *\n * // Cache for 24 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature, 24);\n * ```\n */\n static set(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n signature: Hash,\n ttlHours: number = this.DEFAULT_TTL_HOURS,\n ): void {\n const key = this.getCacheKey(walletAddress, messageHash);\n const cached: CachedSignature = {\n signature,\n expires: Date.now() + ttlHours * 3600000, // Convert hours to milliseconds\n };\n\n try {\n cache.set(key, JSON.stringify(cached));\n } catch {\n // Storage quota exceeded or other error, ignore silently\n // Better to continue without caching than to fail\n }\n }\n\n /**\n * Clear all cached signatures (useful for testing or explicit cleanup)\n *\n * @param cache - Platform cache adapter instance\n * @example\n * ```typescript\n * // Clear all signatures when user logs out\n * SignatureCache.clear(cache);\n *\n * // Clear before running tests\n * beforeEach(() => {\n * SignatureCache.clear(cache);\n * });\n * ```\n */\n static clear(cache: VanaCacheAdapter): void {\n try {\n cache.clear();\n } catch {\n // Ignore storage errors\n }\n }\n\n private static getCacheKey(\n walletAddress: string,\n messageHash: string,\n ): string {\n return `${this.PREFIX}${getAddress(walletAddress)}:${messageHash}`;\n }\n\n /**\n * Generate a deterministic hash of a message object for cache key generation\n *\n * @remarks\n * Creates a cryptographically secure hash from complex objects including EIP-712 typed data.\n * Uses SHA-256 for collision resistance and deterministic key generation.\n * Handles BigInt serialization and sorts object keys for consistency.\n *\n * @param message - The message object to hash (typically EIP-712 typed data)\n * @returns A hex string hash (SHA-256) suitable for cache keys\n * @example\n * ```typescript\n * const typedData = {\n * domain: { name: 'Vana', version: '1' },\n * message: { nonce: 123n, grant: '...' }\n * };\n *\n * const hash = SignatureCache.hashMessage(typedData);\n * // Returns SHA-256 hash like: \"a1b2c3d4e5f6...\"\n * ```\n */\n static hashMessage(message: object): string {\n // Deterministically stringify the object with sorted keys\n const jsonString = JSON.stringify(message, this.deterministicReplacer);\n\n // Use SHA-256 for cryptographic hashing\n const hashBytes = sha256(new TextEncoder().encode(jsonString));\n return toHex(hashBytes);\n }\n\n /**\n * Deterministic JSON replacer that handles BigInt values and sorts object keys\n * This ensures consistent cache key generation for EIP-712 typed data\n *\n * @param _key - The object key being serialized (unused)\n * @param value - The value to serialize\n * @returns The serialized value with sorted keys for objects\n */\n private static deterministicReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return `__BIGINT__${value.toString()}`;\n }\n // Sort object keys for deterministic serialization\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n );\n }\n return value;\n }\n}\n\n/**\n * Wrapper function to cache signature operations\n *\n * @param cache - The cache adapter to use for storage\n * @param walletAddress - The wallet address signing the message\n * @param typedData - The EIP-712 typed data being signed\n * @param signFn - Function that performs the actual signing\n * @param ttlHours - Cache TTL in hours (default 2)\n * @returns The signature (cached or newly generated)\n */\nexport async function withSignatureCache(\n cache: VanaCacheAdapter,\n walletAddress: string,\n typedData: Record<string, unknown>,\n signFn: () => Promise<Hash>,\n ttlHours?: number,\n): Promise<Hash> {\n // Create a hash of the typed data for the cache key\n const messageHash = SignatureCache.hashMessage(typedData);\n\n // Try to get from cache first\n const cached = SignatureCache.get(cache, walletAddress, messageHash);\n if (cached) {\n return cached;\n }\n\n // Not in cache, sign and store\n const signature = await signFn();\n SignatureCache.set(cache, walletAddress, messageHash, signature, ttlHours);\n\n return signature;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,5 @@
1
- import { Hash } from 'viem';
2
- import { VanaCacheAdapter } from '../platform/interface.js';
3
-
1
+ import type { Hash } from "viem";
2
+ import type { VanaCacheAdapter } from "../platform/interface";
4
3
  /**
5
4
  * Simple signature cache using platform cache adapter to avoid repeated signing of identical messages.
6
5
  *
@@ -29,7 +28,7 @@ import { VanaCacheAdapter } from '../platform/interface.js';
29
28
  * ```
30
29
  * @category Utilities
31
30
  */
32
- declare class SignatureCache {
31
+ export declare class SignatureCache {
33
32
  private static readonly PREFIX;
34
33
  private static readonly DEFAULT_TTL_HOURS;
35
34
  /**
@@ -129,6 +128,4 @@ declare class SignatureCache {
129
128
  * @param ttlHours - Cache TTL in hours (default 2)
130
129
  * @returns The signature (cached or newly generated)
131
130
  */
132
- declare function withSignatureCache(cache: VanaCacheAdapter, walletAddress: string, typedData: Record<string, unknown>, signFn: () => Promise<Hash>, ttlHours?: number): Promise<Hash>;
133
-
134
- export { SignatureCache, withSignatureCache };
131
+ export declare function withSignatureCache(cache: VanaCacheAdapter, walletAddress: string, typedData: Record<string, unknown>, signFn: () => Promise<Hash>, ttlHours?: number): Promise<Hash>;
@@ -1,10 +1,8 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
- import { getAddress } from "viem";
1
+ import { getAddress, toHex } from "viem";
5
2
  import { sha256 } from "@noble/hashes/sha256";
6
- import { bytesToHex } from "@noble/hashes/utils";
7
3
  class SignatureCache {
4
+ static PREFIX = "vana_sig_";
5
+ static DEFAULT_TTL_HOURS = 2;
8
6
  /**
9
7
  * Get a cached signature if it exists and hasn't expired
10
8
  *
@@ -120,7 +118,7 @@ class SignatureCache {
120
118
  static hashMessage(message) {
121
119
  const jsonString = JSON.stringify(message, this.deterministicReplacer);
122
120
  const hashBytes = sha256(new TextEncoder().encode(jsonString));
123
- return bytesToHex(hashBytes);
121
+ return toHex(hashBytes);
124
122
  }
125
123
  /**
126
124
  * Deterministic JSON replacer that handles BigInt values and sorts object keys
@@ -146,8 +144,6 @@ class SignatureCache {
146
144
  return value;
147
145
  }
148
146
  }
149
- __publicField(SignatureCache, "PREFIX", "vana_sig_");
150
- __publicField(SignatureCache, "DEFAULT_TTL_HOURS", 2);
151
147
  async function withSignatureCache(cache, walletAddress, typedData, signFn, ttlHours) {
152
148
  const messageHash = SignatureCache.hashMessage(typedData);
153
149
  const cached = SignatureCache.get(cache, walletAddress, messageHash);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/signatureCache.ts"],"sourcesContent":["import { Hash, getAddress } from \"viem\";\nimport type { VanaCacheAdapter } from \"../platform/interface\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\n\ninterface CachedSignature {\n signature: Hash;\n expires: number;\n}\n\n/**\n * Simple signature cache using platform cache adapter to avoid repeated signing of identical messages.\n *\n * @remarks\n * This cache significantly improves UX by avoiding repeated wallet signature prompts\n * for identical operations. It's particularly useful for operations that may be\n * retried or called multiple times with the same parameters.\n *\n * Features:\n * - Platform-appropriate storage (sessionStorage in browser, memory in Node.js)\n * - Configurable TTL (default 2 hours)\n * - Automatic cleanup of expired entries\n * - Cache keys based on wallet address + message hash\n *\n * @example\n * ```typescript\n * // Check cache before requesting signature\n * const cached = SignatureCache.get(cache, walletAddress, messageHash);\n * if (cached) {\n * return cached;\n * }\n *\n * // Request signature and cache it\n * const signature = await wallet.signTypedData(typedData);\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n * ```\n * @category Utilities\n */\nexport class SignatureCache {\n private static readonly PREFIX = \"vana_sig_\";\n private static readonly DEFAULT_TTL_HOURS = 2;\n\n /**\n * Get a cached signature if it exists and hasn't expired\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @returns The cached signature if valid, null if expired or not found\n * @example\n * ```typescript\n * const messageHash = SignatureCache.hashMessage(typedData);\n * const cached = SignatureCache.get(cache, '0x123...', messageHash);\n * if (cached) {\n * console.log('Using cached signature:', cached);\n * }\n * ```\n */\n static get(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n ): Hash | null {\n const key = this.getCacheKey(walletAddress, messageHash);\n\n try {\n const stored = cache.get(key);\n if (!stored) return null;\n\n const cached: CachedSignature = JSON.parse(stored);\n\n // Check if expired\n if (Date.now() > cached.expires) {\n cache.delete(key);\n return null;\n }\n\n return cached.signature;\n } catch {\n // Invalid JSON or storage error, clean up\n try {\n cache.delete(key);\n } catch {\n // Ignore cache cleanup errors\n }\n return null;\n }\n }\n\n /**\n * Store a signature in the cache with configurable TTL\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @param signature - The signature to cache\n * @param ttlHours - Time to live in hours (default: 2)\n * @example\n * ```typescript\n * const signature = await wallet.signTypedData(typedData);\n * const messageHash = SignatureCache.hashMessage(typedData);\n *\n * // Cache for default 2 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n *\n * // Cache for 24 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature, 24);\n * ```\n */\n static set(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n signature: Hash,\n ttlHours: number = this.DEFAULT_TTL_HOURS,\n ): void {\n const key = this.getCacheKey(walletAddress, messageHash);\n const cached: CachedSignature = {\n signature,\n expires: Date.now() + ttlHours * 3600000, // Convert hours to milliseconds\n };\n\n try {\n cache.set(key, JSON.stringify(cached));\n } catch {\n // Storage quota exceeded or other error, ignore silently\n // Better to continue without caching than to fail\n }\n }\n\n /**\n * Clear all cached signatures (useful for testing or explicit cleanup)\n *\n * @param cache - Platform cache adapter instance\n * @example\n * ```typescript\n * // Clear all signatures when user logs out\n * SignatureCache.clear(cache);\n *\n * // Clear before running tests\n * beforeEach(() => {\n * SignatureCache.clear(cache);\n * });\n * ```\n */\n static clear(cache: VanaCacheAdapter): void {\n try {\n cache.clear();\n } catch {\n // Ignore storage errors\n }\n }\n\n private static getCacheKey(\n walletAddress: string,\n messageHash: string,\n ): string {\n return `${this.PREFIX}${getAddress(walletAddress)}:${messageHash}`;\n }\n\n /**\n * Generate a deterministic hash of a message object for cache key generation\n *\n * @remarks\n * Creates a cryptographically secure hash from complex objects including EIP-712 typed data.\n * Uses SHA-256 for collision resistance and deterministic key generation.\n * Handles BigInt serialization and sorts object keys for consistency.\n *\n * @param message - The message object to hash (typically EIP-712 typed data)\n * @returns A hex string hash (SHA-256) suitable for cache keys\n * @example\n * ```typescript\n * const typedData = {\n * domain: { name: 'Vana', version: '1' },\n * message: { nonce: 123n, grant: '...' }\n * };\n *\n * const hash = SignatureCache.hashMessage(typedData);\n * // Returns SHA-256 hash like: \"a1b2c3d4e5f6...\"\n * ```\n */\n static hashMessage(message: object): string {\n // Deterministically stringify the object with sorted keys\n const jsonString = JSON.stringify(message, this.deterministicReplacer);\n\n // Use SHA-256 for cryptographic hashing\n const hashBytes = sha256(new TextEncoder().encode(jsonString));\n return bytesToHex(hashBytes);\n }\n\n /**\n * Deterministic JSON replacer that handles BigInt values and sorts object keys\n * This ensures consistent cache key generation for EIP-712 typed data\n *\n * @param _key - The object key being serialized (unused)\n * @param value - The value to serialize\n * @returns The serialized value with sorted keys for objects\n */\n private static deterministicReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return `__BIGINT__${value.toString()}`;\n }\n // Sort object keys for deterministic serialization\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n );\n }\n return value;\n }\n}\n\n/**\n * Wrapper function to cache signature operations\n *\n * @param cache - The cache adapter to use for storage\n * @param walletAddress - The wallet address signing the message\n * @param typedData - The EIP-712 typed data being signed\n * @param signFn - Function that performs the actual signing\n * @param ttlHours - Cache TTL in hours (default 2)\n * @returns The signature (cached or newly generated)\n */\nexport async function withSignatureCache(\n cache: VanaCacheAdapter,\n walletAddress: string,\n typedData: Record<string, unknown>,\n signFn: () => Promise<Hash>,\n ttlHours?: number,\n): Promise<Hash> {\n // Create a hash of the typed data for the cache key\n const messageHash = SignatureCache.hashMessage(typedData);\n\n // Try to get from cache first\n const cached = SignatureCache.get(cache, walletAddress, messageHash);\n if (cached) {\n return cached;\n }\n\n // Not in cache, sign and store\n const signature = await signFn();\n SignatureCache.set(cache, walletAddress, messageHash, signature, ttlHours);\n\n return signature;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/utils/signatureCache.ts"],"sourcesContent":["import type { Hash } from \"viem\";\nimport { getAddress, toHex } from \"viem\";\nimport type { VanaCacheAdapter } from \"../platform/interface\";\nimport { sha256 } from \"@noble/hashes/sha256\";\n\ninterface CachedSignature {\n signature: Hash;\n expires: number;\n}\n\n/**\n * Simple signature cache using platform cache adapter to avoid repeated signing of identical messages.\n *\n * @remarks\n * This cache significantly improves UX by avoiding repeated wallet signature prompts\n * for identical operations. It's particularly useful for operations that may be\n * retried or called multiple times with the same parameters.\n *\n * Features:\n * - Platform-appropriate storage (sessionStorage in browser, memory in Node.js)\n * - Configurable TTL (default 2 hours)\n * - Automatic cleanup of expired entries\n * - Cache keys based on wallet address + message hash\n *\n * @example\n * ```typescript\n * // Check cache before requesting signature\n * const cached = SignatureCache.get(cache, walletAddress, messageHash);\n * if (cached) {\n * return cached;\n * }\n *\n * // Request signature and cache it\n * const signature = await wallet.signTypedData(typedData);\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n * ```\n * @category Utilities\n */\nexport class SignatureCache {\n private static readonly PREFIX = \"vana_sig_\";\n private static readonly DEFAULT_TTL_HOURS = 2;\n\n /**\n * Get a cached signature if it exists and hasn't expired\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @returns The cached signature if valid, null if expired or not found\n * @example\n * ```typescript\n * const messageHash = SignatureCache.hashMessage(typedData);\n * const cached = SignatureCache.get(cache, '0x123...', messageHash);\n * if (cached) {\n * console.log('Using cached signature:', cached);\n * }\n * ```\n */\n static get(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n ): Hash | null {\n const key = this.getCacheKey(walletAddress, messageHash);\n\n try {\n const stored = cache.get(key);\n if (!stored) return null;\n\n const cached: CachedSignature = JSON.parse(stored);\n\n // Check if expired\n if (Date.now() > cached.expires) {\n cache.delete(key);\n return null;\n }\n\n return cached.signature;\n } catch {\n // Invalid JSON or storage error, clean up\n try {\n cache.delete(key);\n } catch {\n // Ignore cache cleanup errors\n }\n return null;\n }\n }\n\n /**\n * Store a signature in the cache with configurable TTL\n *\n * @param cache - Platform cache adapter instance\n * @param walletAddress - Wallet address that created the signature\n * @param messageHash - Hash of the message that was signed\n * @param signature - The signature to cache\n * @param ttlHours - Time to live in hours (default: 2)\n * @example\n * ```typescript\n * const signature = await wallet.signTypedData(typedData);\n * const messageHash = SignatureCache.hashMessage(typedData);\n *\n * // Cache for default 2 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature);\n *\n * // Cache for 24 hours\n * SignatureCache.set(cache, walletAddress, messageHash, signature, 24);\n * ```\n */\n static set(\n cache: VanaCacheAdapter,\n walletAddress: string,\n messageHash: string,\n signature: Hash,\n ttlHours: number = this.DEFAULT_TTL_HOURS,\n ): void {\n const key = this.getCacheKey(walletAddress, messageHash);\n const cached: CachedSignature = {\n signature,\n expires: Date.now() + ttlHours * 3600000, // Convert hours to milliseconds\n };\n\n try {\n cache.set(key, JSON.stringify(cached));\n } catch {\n // Storage quota exceeded or other error, ignore silently\n // Better to continue without caching than to fail\n }\n }\n\n /**\n * Clear all cached signatures (useful for testing or explicit cleanup)\n *\n * @param cache - Platform cache adapter instance\n * @example\n * ```typescript\n * // Clear all signatures when user logs out\n * SignatureCache.clear(cache);\n *\n * // Clear before running tests\n * beforeEach(() => {\n * SignatureCache.clear(cache);\n * });\n * ```\n */\n static clear(cache: VanaCacheAdapter): void {\n try {\n cache.clear();\n } catch {\n // Ignore storage errors\n }\n }\n\n private static getCacheKey(\n walletAddress: string,\n messageHash: string,\n ): string {\n return `${this.PREFIX}${getAddress(walletAddress)}:${messageHash}`;\n }\n\n /**\n * Generate a deterministic hash of a message object for cache key generation\n *\n * @remarks\n * Creates a cryptographically secure hash from complex objects including EIP-712 typed data.\n * Uses SHA-256 for collision resistance and deterministic key generation.\n * Handles BigInt serialization and sorts object keys for consistency.\n *\n * @param message - The message object to hash (typically EIP-712 typed data)\n * @returns A hex string hash (SHA-256) suitable for cache keys\n * @example\n * ```typescript\n * const typedData = {\n * domain: { name: 'Vana', version: '1' },\n * message: { nonce: 123n, grant: '...' }\n * };\n *\n * const hash = SignatureCache.hashMessage(typedData);\n * // Returns SHA-256 hash like: \"a1b2c3d4e5f6...\"\n * ```\n */\n static hashMessage(message: object): string {\n // Deterministically stringify the object with sorted keys\n const jsonString = JSON.stringify(message, this.deterministicReplacer);\n\n // Use SHA-256 for cryptographic hashing\n const hashBytes = sha256(new TextEncoder().encode(jsonString));\n return toHex(hashBytes);\n }\n\n /**\n * Deterministic JSON replacer that handles BigInt values and sorts object keys\n * This ensures consistent cache key generation for EIP-712 typed data\n *\n * @param _key - The object key being serialized (unused)\n * @param value - The value to serialize\n * @returns The serialized value with sorted keys for objects\n */\n private static deterministicReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return `__BIGINT__${value.toString()}`;\n }\n // Sort object keys for deterministic serialization\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n return Object.keys(value as Record<string, unknown>)\n .sort()\n .reduce(\n (sorted, key) => {\n sorted[key] = (value as Record<string, unknown>)[key];\n return sorted;\n },\n {} as Record<string, unknown>,\n );\n }\n return value;\n }\n}\n\n/**\n * Wrapper function to cache signature operations\n *\n * @param cache - The cache adapter to use for storage\n * @param walletAddress - The wallet address signing the message\n * @param typedData - The EIP-712 typed data being signed\n * @param signFn - Function that performs the actual signing\n * @param ttlHours - Cache TTL in hours (default 2)\n * @returns The signature (cached or newly generated)\n */\nexport async function withSignatureCache(\n cache: VanaCacheAdapter,\n walletAddress: string,\n typedData: Record<string, unknown>,\n signFn: () => Promise<Hash>,\n ttlHours?: number,\n): Promise<Hash> {\n // Create a hash of the typed data for the cache key\n const messageHash = SignatureCache.hashMessage(typedData);\n\n // Try to get from cache first\n const cached = SignatureCache.get(cache, walletAddress, messageHash);\n if (cached) {\n return cached;\n }\n\n // Not in cache, sign and store\n const signature = await signFn();\n SignatureCache.set(cache, walletAddress, messageHash, signature, ttlHours);\n\n return signature;\n}\n"],"mappings":"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","names":[]}