@opendatalabs/vana-sdk 0.1.0-alpha.fd33fc9 → 2.0.0

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 (351) hide show
  1. package/dist/browser.cjs.map +1 -1
  2. package/dist/browser.d.ts +33 -1
  3. package/dist/browser.js.map +1 -1
  4. package/dist/chains/index.cjs.map +1 -1
  5. package/dist/chains/index.d.ts +30 -1
  6. package/dist/chains/index.js.map +1 -1
  7. package/dist/client/__tests__/enhancedResponse.test.d.ts +1 -0
  8. package/dist/client/enhancedResponse.cjs +164 -0
  9. package/dist/client/enhancedResponse.cjs.map +1 -0
  10. package/dist/client/enhancedResponse.d.ts +120 -0
  11. package/dist/client/enhancedResponse.js +138 -0
  12. package/dist/client/enhancedResponse.js.map +1 -0
  13. package/dist/config/chains.cjs.map +1 -1
  14. package/dist/config/chains.d.ts +99 -0
  15. package/dist/config/chains.js.map +1 -1
  16. package/dist/contracts/contractController.cjs.map +1 -1
  17. package/dist/contracts/contractController.d.ts +66 -10
  18. package/dist/contracts/contractController.js.map +1 -1
  19. package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
  20. package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
  21. package/dist/controllers/base.cjs +33 -0
  22. package/dist/controllers/base.cjs.map +1 -1
  23. package/dist/controllers/base.d.ts +10 -0
  24. package/dist/controllers/base.js +33 -0
  25. package/dist/controllers/base.js.map +1 -1
  26. package/dist/controllers/data.cjs +417 -276
  27. package/dist/controllers/data.cjs.map +1 -1
  28. package/dist/controllers/data.d.ts +246 -193
  29. package/dist/controllers/data.js +430 -279
  30. package/dist/controllers/data.js.map +1 -1
  31. package/dist/controllers/operations.cjs +430 -0
  32. package/dist/controllers/operations.cjs.map +1 -0
  33. package/dist/controllers/operations.d.ts +229 -0
  34. package/dist/controllers/operations.js +406 -0
  35. package/dist/controllers/operations.js.map +1 -0
  36. package/dist/controllers/permissions.cjs +690 -209
  37. package/dist/controllers/permissions.cjs.map +1 -1
  38. package/dist/controllers/permissions.d.ts +196 -68
  39. package/dist/controllers/permissions.js +690 -209
  40. package/dist/controllers/permissions.js.map +1 -1
  41. package/dist/controllers/protocol.cjs.map +1 -1
  42. package/dist/controllers/protocol.d.ts +27 -28
  43. package/dist/controllers/protocol.js.map +1 -1
  44. package/dist/controllers/schemas.cjs +104 -25
  45. package/dist/controllers/schemas.cjs.map +1 -1
  46. package/dist/controllers/schemas.d.ts +88 -40
  47. package/dist/controllers/schemas.js +104 -25
  48. package/dist/controllers/schemas.js.map +1 -1
  49. package/dist/controllers/server.cjs +269 -58
  50. package/dist/controllers/server.cjs.map +1 -1
  51. package/dist/controllers/server.d.ts +157 -52
  52. package/dist/controllers/server.js +269 -58
  53. package/dist/controllers/server.js.map +1 -1
  54. package/dist/core/__tests__/health.test.d.ts +1 -0
  55. package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
  56. package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
  57. package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
  58. package/dist/core/apiClient.cjs +53 -3
  59. package/dist/core/apiClient.cjs.map +1 -1
  60. package/dist/core/apiClient.d.ts +132 -7
  61. package/dist/core/apiClient.js +53 -3
  62. package/dist/core/apiClient.js.map +1 -1
  63. package/dist/core/generics.cjs +30 -3
  64. package/dist/core/generics.cjs.map +1 -1
  65. package/dist/core/generics.d.ts +95 -6
  66. package/dist/core/generics.js +30 -3
  67. package/dist/core/generics.js.map +1 -1
  68. package/dist/core/health.cjs +289 -0
  69. package/dist/core/health.cjs.map +1 -0
  70. package/dist/core/health.d.ts +143 -0
  71. package/dist/core/health.js +265 -0
  72. package/dist/core/health.js.map +1 -0
  73. package/dist/core/inMemoryNonceManager.cjs +138 -0
  74. package/dist/core/inMemoryNonceManager.cjs.map +1 -0
  75. package/dist/core/inMemoryNonceManager.d.ts +69 -0
  76. package/dist/core/inMemoryNonceManager.js +114 -0
  77. package/dist/core/inMemoryNonceManager.js.map +1 -0
  78. package/dist/core/nonceManager.cjs +304 -0
  79. package/dist/core/nonceManager.cjs.map +1 -0
  80. package/dist/core/nonceManager.d.ts +116 -0
  81. package/dist/core/nonceManager.js +280 -0
  82. package/dist/core/nonceManager.js.map +1 -0
  83. package/dist/core/pollingManager.cjs +292 -0
  84. package/dist/core/pollingManager.cjs.map +1 -0
  85. package/dist/core/pollingManager.d.ts +120 -0
  86. package/dist/core/pollingManager.js +268 -0
  87. package/dist/core/pollingManager.js.map +1 -0
  88. package/dist/core.cjs +55 -1
  89. package/dist/core.cjs.map +1 -1
  90. package/dist/core.d.ts +54 -3
  91. package/dist/core.js +55 -1
  92. package/dist/core.js.map +1 -1
  93. package/dist/crypto/ecies/base.cjs +16 -3
  94. package/dist/crypto/ecies/base.cjs.map +1 -1
  95. package/dist/crypto/ecies/base.js +16 -3
  96. package/dist/crypto/ecies/base.js.map +1 -1
  97. package/dist/errors.cjs +29 -0
  98. package/dist/errors.cjs.map +1 -1
  99. package/dist/errors.d.ts +64 -0
  100. package/dist/errors.js +28 -0
  101. package/dist/errors.js.map +1 -1
  102. package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs.map +1 -1
  103. package/dist/generated/abi/ComputeInstructionRegistryImplementation.js.map +1 -1
  104. package/dist/generated/abi/DLPPerformanceImplementation.cjs +42 -0
  105. package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +1 -1
  106. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +32 -0
  107. package/dist/generated/abi/DLPPerformanceImplementation.js +42 -0
  108. package/dist/generated/abi/DLPPerformanceImplementation.js.map +1 -1
  109. package/dist/generated/abi/DLPRegistryImplementation.cjs +5 -5
  110. package/dist/generated/abi/DLPRegistryImplementation.cjs.map +1 -1
  111. package/dist/generated/abi/DLPRegistryImplementation.d.ts +4 -4
  112. package/dist/generated/abi/DLPRegistryImplementation.js +5 -5
  113. package/dist/generated/abi/DLPRegistryImplementation.js.map +1 -1
  114. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +166 -2
  115. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +1 -1
  116. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +129 -2
  117. package/dist/generated/abi/DLPRewardDeployerImplementation.js +166 -2
  118. package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +1 -1
  119. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs +167 -19
  120. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs.map +1 -1
  121. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +127 -14
  122. package/dist/generated/abi/DataPortabilityGranteesImplementation.js +167 -19
  123. package/dist/generated/abi/DataPortabilityGranteesImplementation.js.map +1 -1
  124. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs +0 -19
  125. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs.map +1 -1
  126. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +0 -14
  127. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js +0 -19
  128. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js.map +1 -1
  129. package/dist/generated/abi/DataPortabilityServersImplementation.cjs +0 -19
  130. package/dist/generated/abi/DataPortabilityServersImplementation.cjs.map +1 -1
  131. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +0 -14
  132. package/dist/generated/abi/DataPortabilityServersImplementation.js +0 -19
  133. package/dist/generated/abi/DataPortabilityServersImplementation.js.map +1 -1
  134. package/dist/generated/abi/DataRegistryImplementation.cjs +0 -13
  135. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -1
  136. package/dist/generated/abi/DataRegistryImplementation.d.ts +0 -10
  137. package/dist/generated/abi/DataRegistryImplementation.js +0 -13
  138. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -1
  139. package/dist/generated/abi/SwapHelperImplementation.cjs +0 -43
  140. package/dist/generated/abi/SwapHelperImplementation.cjs.map +1 -1
  141. package/dist/generated/abi/SwapHelperImplementation.d.ts +0 -35
  142. package/dist/generated/abi/SwapHelperImplementation.js +0 -43
  143. package/dist/generated/abi/SwapHelperImplementation.js.map +1 -1
  144. package/dist/generated/abi/VanaEpochImplementation.cjs +195 -0
  145. package/dist/generated/abi/VanaEpochImplementation.cjs.map +1 -1
  146. package/dist/generated/abi/VanaEpochImplementation.d.ts +151 -0
  147. package/dist/generated/abi/VanaEpochImplementation.js +195 -0
  148. package/dist/generated/abi/VanaEpochImplementation.js.map +1 -1
  149. package/dist/generated/abi/VanaPoolEntityImplementation.cjs +22 -65
  150. package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -1
  151. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +17 -51
  152. package/dist/generated/abi/VanaPoolEntityImplementation.js +22 -65
  153. package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -1
  154. package/dist/generated/abi/VanaPoolStakingImplementation.cjs +113 -1
  155. package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -1
  156. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +85 -1
  157. package/dist/generated/abi/VanaPoolStakingImplementation.js +113 -1
  158. package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -1
  159. package/dist/generated/abi/index.d.ts +546 -146
  160. package/dist/generated/event-types.cjs.map +1 -1
  161. package/dist/generated/event-types.d.ts +14 -8
  162. package/dist/generated/eventRegistry.cjs +42 -18
  163. package/dist/generated/eventRegistry.cjs.map +1 -1
  164. package/dist/generated/eventRegistry.js +42 -18
  165. package/dist/generated/eventRegistry.js.map +1 -1
  166. package/dist/generated/server/server-exports.cjs +22 -0
  167. package/dist/generated/server/server-exports.cjs.map +1 -1
  168. package/dist/generated/server/server-exports.d.ts +27 -10
  169. package/dist/generated/server/server-exports.js +17 -0
  170. package/dist/generated/server/server-exports.js.map +1 -1
  171. package/dist/generated/server/server.cjs.map +1 -1
  172. package/dist/generated/server/server.d.ts +771 -402
  173. package/dist/generated/subgraph.cjs +797 -32
  174. package/dist/generated/subgraph.cjs.map +1 -1
  175. package/dist/generated/subgraph.d.ts +135 -0
  176. package/dist/generated/subgraph.js +792 -32
  177. package/dist/generated/subgraph.js.map +1 -1
  178. package/dist/index.browser.d.ts +2 -0
  179. package/dist/index.browser.js +10 -0
  180. package/dist/index.browser.js.map +1 -1
  181. package/dist/index.cjs.map +1 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/index.node.cjs +26 -0
  184. package/dist/index.node.cjs.map +1 -1
  185. package/dist/index.node.d.ts +49 -5
  186. package/dist/index.node.js +25 -1
  187. package/dist/index.node.js.map +1 -1
  188. package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
  189. package/dist/lib/redisAtomicStore.cjs +201 -0
  190. package/dist/lib/redisAtomicStore.cjs.map +1 -0
  191. package/dist/lib/redisAtomicStore.d.ts +120 -0
  192. package/dist/lib/redisAtomicStore.js +177 -0
  193. package/dist/lib/redisAtomicStore.js.map +1 -0
  194. package/dist/node.cjs.map +1 -1
  195. package/dist/node.d.ts +39 -1
  196. package/dist/node.js.map +1 -1
  197. package/dist/platform/browser.cjs +160 -2
  198. package/dist/platform/browser.cjs.map +1 -1
  199. package/dist/platform/browser.d.ts +232 -12
  200. package/dist/platform/browser.js +160 -2
  201. package/dist/platform/browser.js.map +1 -1
  202. package/dist/platform/interface.cjs.map +1 -1
  203. package/dist/platform/interface.d.ts +283 -90
  204. package/dist/platform/node.cjs +163 -2
  205. package/dist/platform/node.cjs.map +1 -1
  206. package/dist/platform/node.d.ts +69 -6
  207. package/dist/platform/node.js +163 -2
  208. package/dist/platform/node.js.map +1 -1
  209. package/dist/server/relayerHandler.cjs +315 -81
  210. package/dist/server/relayerHandler.cjs.map +1 -1
  211. package/dist/server/relayerHandler.d.ts +35 -2
  212. package/dist/server/relayerHandler.js +315 -81
  213. package/dist/server/relayerHandler.js.map +1 -1
  214. package/dist/storage/index.cjs +3 -0
  215. package/dist/storage/index.cjs.map +1 -1
  216. package/dist/storage/index.d.ts +1 -0
  217. package/dist/storage/index.js +2 -0
  218. package/dist/storage/index.js.map +1 -1
  219. package/dist/storage/manager.cjs +108 -25
  220. package/dist/storage/manager.cjs.map +1 -1
  221. package/dist/storage/manager.d.ts +119 -25
  222. package/dist/storage/manager.js +108 -25
  223. package/dist/storage/manager.js.map +1 -1
  224. package/dist/storage/providers/callback-storage.cjs +86 -15
  225. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  226. package/dist/storage/providers/callback-storage.d.ts +109 -20
  227. package/dist/storage/providers/callback-storage.js +86 -15
  228. package/dist/storage/providers/callback-storage.js.map +1 -1
  229. package/dist/storage/providers/dropbox.cjs +237 -0
  230. package/dist/storage/providers/dropbox.cjs.map +1 -0
  231. package/dist/storage/providers/dropbox.d.ts +39 -0
  232. package/dist/storage/providers/dropbox.js +215 -0
  233. package/dist/storage/providers/dropbox.js.map +1 -0
  234. package/dist/storage/providers/dropbox.test.d.ts +1 -0
  235. package/dist/storage/providers/pinata.cjs.map +1 -1
  236. package/dist/storage/providers/pinata.d.ts +12 -14
  237. package/dist/storage/providers/pinata.js.map +1 -1
  238. package/dist/tests/data-upload-owner-validation.test.d.ts +1 -0
  239. package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
  240. package/dist/types/atomicStore.cjs +31 -0
  241. package/dist/types/atomicStore.cjs.map +1 -0
  242. package/dist/types/atomicStore.d.ts +236 -0
  243. package/dist/types/atomicStore.js +7 -0
  244. package/dist/types/atomicStore.js.map +1 -0
  245. package/dist/types/blockchain.cjs.map +1 -1
  246. package/dist/types/blockchain.d.ts +39 -11
  247. package/dist/types/chains.cjs.map +1 -1
  248. package/dist/types/chains.d.ts +74 -7
  249. package/dist/types/chains.js.map +1 -1
  250. package/dist/types/config.cjs.map +1 -1
  251. package/dist/types/config.d.ts +38 -4
  252. package/dist/types/config.js.map +1 -1
  253. package/dist/types/contracts.cjs.map +1 -1
  254. package/dist/types/contracts.d.ts +71 -7
  255. package/dist/types/controller-context.cjs.map +1 -1
  256. package/dist/types/controller-context.d.ts +4 -1
  257. package/dist/types/data.cjs.map +1 -1
  258. package/dist/types/data.d.ts +11 -10
  259. package/dist/types/generics.cjs.map +1 -1
  260. package/dist/types/generics.d.ts +81 -10
  261. package/dist/types/index.cjs.map +1 -1
  262. package/dist/types/index.d.ts +31 -3
  263. package/dist/types/index.js.map +1 -1
  264. package/dist/types/operationStore.cjs +17 -0
  265. package/dist/types/operationStore.cjs.map +1 -0
  266. package/dist/types/operationStore.d.ts +171 -0
  267. package/dist/types/operationStore.js +1 -0
  268. package/dist/types/operationStore.js.map +1 -0
  269. package/dist/types/operations.cjs +3 -15
  270. package/dist/types/operations.cjs.map +1 -1
  271. package/dist/types/operations.d.ts +131 -39
  272. package/dist/types/operations.js +2 -13
  273. package/dist/types/operations.js.map +1 -1
  274. package/dist/types/options.cjs +17 -0
  275. package/dist/types/options.cjs.map +1 -0
  276. package/dist/types/options.d.ts +308 -0
  277. package/dist/types/options.js +1 -0
  278. package/dist/types/options.js.map +1 -0
  279. package/dist/types/permissions.cjs.map +1 -1
  280. package/dist/types/permissions.d.ts +19 -20
  281. package/dist/types/personal.cjs.map +1 -1
  282. package/dist/types/personal.d.ts +150 -14
  283. package/dist/types/relayer.cjs.map +1 -1
  284. package/dist/types/relayer.d.ts +145 -24
  285. package/dist/types/storage.cjs.map +1 -1
  286. package/dist/types/storage.d.ts +9 -21
  287. package/dist/types/storage.js.map +1 -1
  288. package/dist/types/utils.cjs.map +1 -1
  289. package/dist/types/utils.d.ts +0 -45
  290. package/dist/utils/__tests__/chainQuery.test.d.ts +1 -0
  291. package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
  292. package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
  293. package/dist/utils/chainQuery.cjs +107 -0
  294. package/dist/utils/chainQuery.cjs.map +1 -0
  295. package/dist/utils/chainQuery.d.ts +31 -0
  296. package/dist/utils/chainQuery.js +82 -0
  297. package/dist/utils/chainQuery.js.map +1 -0
  298. package/dist/utils/grantFiles.cjs +4 -1
  299. package/dist/utils/grantFiles.cjs.map +1 -1
  300. package/dist/utils/grantFiles.d.ts +10 -20
  301. package/dist/utils/grantFiles.js +4 -1
  302. package/dist/utils/grantFiles.js.map +1 -1
  303. package/dist/utils/grantValidation.cjs.map +1 -1
  304. package/dist/utils/grantValidation.d.ts +95 -16
  305. package/dist/utils/grantValidation.js.map +1 -1
  306. package/dist/utils/grants.cjs.map +1 -1
  307. package/dist/utils/grants.d.ts +93 -12
  308. package/dist/utils/grants.js.map +1 -1
  309. package/dist/utils/ipfs.cjs +2 -4
  310. package/dist/utils/ipfs.cjs.map +1 -1
  311. package/dist/utils/ipfs.d.ts +1 -1
  312. package/dist/utils/ipfs.js +2 -4
  313. package/dist/utils/ipfs.js.map +1 -1
  314. package/dist/utils/lazy-import.cjs.map +1 -1
  315. package/dist/utils/lazy-import.d.ts +32 -7
  316. package/dist/utils/lazy-import.js.map +1 -1
  317. package/dist/utils/signatureCache.cjs +8 -2
  318. package/dist/utils/signatureCache.cjs.map +1 -1
  319. package/dist/utils/signatureCache.d.ts +49 -8
  320. package/dist/utils/signatureCache.js +8 -2
  321. package/dist/utils/signatureCache.js.map +1 -1
  322. package/dist/utils/subgraphConsistency.cjs +184 -0
  323. package/dist/utils/subgraphConsistency.cjs.map +1 -0
  324. package/dist/utils/subgraphConsistency.d.ts +65 -0
  325. package/dist/utils/subgraphConsistency.js +155 -0
  326. package/dist/utils/subgraphConsistency.js.map +1 -0
  327. package/dist/utils/subgraphMetaCache.cjs +101 -0
  328. package/dist/utils/subgraphMetaCache.cjs.map +1 -0
  329. package/dist/utils/subgraphMetaCache.d.ts +56 -0
  330. package/dist/utils/subgraphMetaCache.js +76 -0
  331. package/dist/utils/subgraphMetaCache.js.map +1 -0
  332. package/dist/utils/subgraphPagination.cjs +104 -0
  333. package/dist/utils/subgraphPagination.cjs.map +1 -0
  334. package/dist/utils/subgraphPagination.d.ts +78 -0
  335. package/dist/utils/subgraphPagination.js +78 -0
  336. package/dist/utils/subgraphPagination.js.map +1 -0
  337. package/dist/utils/transactionHelpers.cjs.map +1 -1
  338. package/dist/utils/transactionHelpers.d.ts +12 -12
  339. package/dist/utils/transactionHelpers.js.map +1 -1
  340. package/dist/utils/typedDataConverter.cjs.map +1 -1
  341. package/dist/utils/typedDataConverter.d.ts +39 -3
  342. package/dist/utils/typedDataConverter.js.map +1 -1
  343. package/dist/utils/urlResolver.cjs +7 -0
  344. package/dist/utils/urlResolver.cjs.map +1 -1
  345. package/dist/utils/urlResolver.d.ts +22 -4
  346. package/dist/utils/urlResolver.js +7 -0
  347. package/dist/utils/urlResolver.js.map +1 -1
  348. package/dist/utils/wallet.cjs.map +1 -1
  349. package/dist/utils/wallet.d.ts +78 -16
  350. package/dist/utils/wallet.js.map +1 -1
  351. package/package.json +3 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/protocol.ts"],"sourcesContent":["import type { ContractInfo, VanaChainId } from \"../types/index\";\nimport type { VanaContract, ContractAbis } from \"../generated/abi\";\nimport { ContractNotFoundError } from \"../errors\";\nimport {\n getContractController,\n getContractInfo,\n ContractFactory,\n} from \"../contracts/contractController\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport type { GetContractReturnType } from \"viem\";\nimport { BaseController } from \"./base\";\n\n/**\n * Provides direct, low-level access to all Vana protocol smart contracts.\n *\n * @remarks\n * This controller serves as the designated \"escape hatch\" for advanced developers who need\n * to interact directly with the underlying blockchain contracts. It provides access to\n * contract addresses, ABIs, and factory methods for creating typed contract instances.\n * Most developers should use the higher-level DataController and PermissionsController\n * instead of this advanced API.\n *\n * **Contract Selection:**\n * The controller automatically handles chain detection and provides only contracts that\n * are deployed on the current network. All contract instances are fully typed for\n * enhanced developer experience and type safety.\n *\n * **Method Selection:**\n * - `getContract()` retrieves contract address and ABI for manual interaction\n * - `createContract()` returns fully typed contract instance with read/write methods\n * - `getAvailableContracts()` lists all contracts deployed on current chain\n * - `isContractAvailable()` checks if specific contract exists on current chain\n * - `getChainId()` and `getChainName()` provide current network information\n *\n * **Usage Guidelines:**\n * Use this controller when high-level controllers don't provide needed functionality.\n * Most developers should use `vana.data.*` for files and `vana.permissions.*` for access control.\n *\n * **Type Safety:**\n * Use `as const` assertion with contract names for full TypeScript type inference.\n * Contract instances provide complete typing for all methods, parameters, and return values.\n *\n * @example\n * ```typescript\n * // Get contract info for direct interaction\n * const registry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Access contract address and ABI with full typing\n * console.log(registry.address); // Contract address on current chain\n * console.log(registry.abi); // Fully typed contract ABI\n *\n * // Create a typed contract instance\n * const contract = vana.protocol.createContract(\"DataRegistry\" as const);\n * const fileCount = await contract.read.filesCount();\n * ```\n * @category Advanced\n * @see {@link https://docs.vana.com/developer/protocol/contracts | Vana Protocol Contracts} for contract specifications\n */\nexport class ProtocolController extends BaseController {\n private readonly contractFactory: ContractFactory;\n\n constructor(context: ControllerContext) {\n super(context);\n this.contractFactory = new ContractFactory(\n context.walletClient ?? context.publicClient,\n );\n }\n\n /**\n * Retrieves the address and ABI for a specific Vana protocol contract.\n *\n * @remarks\n * This method provides direct access to contract addresses and ABIs for the current\n * chain. It includes full TypeScript type inference when using const assertions,\n * enabling type-safe contract interactions. The method only returns contracts that\n * are actually deployed on the current network.\n * @param contractName - The name of the Vana contract to retrieve (use const assertion for full typing)\n * @returns An object containing the contract's address and fully typed ABI\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain.\n * Verify contract name spelling and check current network with `getChainId()`.\n * @example\n * ```typescript\n * // Get contract info with full type inference\n * const dataRegistry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Now dataRegistry.abi is fully typed for the DataRegistry contract\n * console.log(dataRegistry.address); // \"0x123...\"\n * console.log(dataRegistry.abi.length); // Full ABI array\n * ```\n */\n getContract<T extends VanaContract>(\n contractName: T,\n ): ContractInfo<ContractAbis[T]> {\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n\n if (!chainId) {\n throw new ContractNotFoundError(contractName, 0);\n }\n\n return getContractInfo(contractName, chainId as VanaChainId);\n } catch (error) {\n if (error instanceof ContractNotFoundError) {\n throw error;\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n let chainId = 0;\n try {\n chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id ??\n 0;\n } catch {\n // Use 0 as fallback if chain ID access fails\n chainId = 0;\n }\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(`Failed to get contract ${contractName}: Unknown error`);\n }\n }\n\n /**\n * Creates a fully typed contract instance ready for blockchain interaction.\n *\n * @remarks\n * This method creates a contract instance with complete type safety for all contract\n * methods including read operations, write operations, and event handling. The instance\n * is pre-configured with the correct address, ABI, and wallet client for immediate use.\n * All method parameters and return types are fully typed based on the contract ABI.\n * @param contractName - The name of the Vana contract (use const assertion for full typing)\n * @returns A fully typed contract instance with read/write methods and event handling\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain\n * @example\n * ```typescript\n * // Create typed contract instance\n * const dataRegistry = vana.protocol.createContract(\"DataRegistry\" as const);\n *\n * // Full type safety for all operations\n * const fileCount = await dataRegistry.read.filesCount(); // Type: bigint\n * const txHash = await dataRegistry.write.addFile([\"ipfs://...\"]); // Typed parameters\n *\n * // Listen to events with full typing\n * const logs = await dataRegistry.getEvents.FileAdded();\n * ```\n */\n createContract<T extends VanaContract>(\n contractName: T,\n ): GetContractReturnType<ContractAbis[T]> {\n this.assertWallet();\n try {\n return getContractController(contractName, this.context.walletClient);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n const chainId = this.context.walletClient.chain?.id ?? 0;\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(\n `Failed to create contract ${contractName}: Unknown error`,\n );\n }\n }\n\n /**\n * Gets all available contract names that can be used with getContract().\n * Returns only contracts that are actually deployed on the current chain.\n *\n * @returns Array of all available contract names for the current chain\n */\n getAvailableContracts(): VanaContract[] {\n return this.contractFactory.getAvailableContracts();\n }\n\n /**\n * Checks if a specific contract is available on the current chain.\n *\n * @param contractName - The contract name to check\n * @returns Whether the contract is deployed on the current chain\n */\n isContractAvailable(contractName: VanaContract): boolean {\n const availableContracts = this.getAvailableContracts();\n return availableContracts.includes(contractName);\n }\n\n /**\n * Gets the contract factory instance for advanced usage.\n * This provides access to additional contract management methods.\n *\n * @returns The contract factory instance\n */\n getContractFactory(): ContractFactory {\n return this.contractFactory;\n }\n\n /**\n * Gets the current chain ID from the wallet client.\n *\n * @returns The chain ID\n * @throws {Error} When chain ID is not available from wallet client\n */\n getChainId(): number {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available from client\");\n }\n return chainId;\n }\n\n /**\n * Gets the current chain name from the wallet client.\n *\n * @returns The chain name\n * @throws {Error} When chain name is not available from wallet client\n */\n getChainName(): string {\n const chainName =\n this.context.walletClient?.chain?.name ??\n this.context.publicClient.chain?.name;\n if (!chainName) {\n throw new Error(\"Chain name not available from client\");\n }\n return chainName;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAsC;AACtC,gCAIO;AAGP,kBAA+B;AAgDxB,MAAM,2BAA2B,2BAAe;AAAA,EACpC;AAAA,EAEjB,YAAY,SAA4B;AACtC,UAAM,OAAO;AACb,SAAK,kBAAkB,IAAI;AAAA,MACzB,QAAQ,gBAAgB,QAAQ;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,YACE,cAC+B;AAC/B,QAAI;AACF,YAAM,UACJ,KAAK,QAAQ,cAAc,OAAO,MAClC,KAAK,QAAQ,aAAa,OAAO;AAEnC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,oCAAsB,cAAc,CAAC;AAAA,MACjD;AAEA,iBAAO,2CAAgB,cAAc,OAAsB;AAAA,IAC7D,SAAS,OAAO;AACd,UAAI,iBAAiB,qCAAuB;AAC1C,cAAM;AAAA,MACR;AACA,UAAI,iBAAiB,OAAO;AAC1B,YAAI,MAAM,QAAQ,SAAS,4BAA4B,GAAG;AACxD,cAAI,UAAU;AACd,cAAI;AACF,sBACE,KAAK,QAAQ,cAAc,OAAO,MAClC,KAAK,QAAQ,aAAa,OAAO,MACjC;AAAA,UACJ,QAAQ;AAEN,sBAAU;AAAA,UACZ;AACA,gBAAM,IAAI,oCAAsB,cAAc,OAAO;AAAA,QACvD;AACA,cAAM;AAAA,MACR;AACA,YAAM,IAAI,MAAM,0BAA0B,YAAY,iBAAiB;AAAA,IACzE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,eACE,cACwC;AACxC,SAAK,aAAa;AAClB,QAAI;AACF,iBAAO,iDAAsB,cAAc,KAAK,QAAQ,YAAY;AAAA,IACtE,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,YAAI,MAAM,QAAQ,SAAS,4BAA4B,GAAG;AACxD,gBAAM,UAAU,KAAK,QAAQ,aAAa,OAAO,MAAM;AACvD,gBAAM,IAAI,oCAAsB,cAAc,OAAO;AAAA,QACvD;AACA,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,6BAA6B,YAAY;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,wBAAwC;AACtC,WAAO,KAAK,gBAAgB,sBAAsB;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoB,cAAqC;AACvD,UAAM,qBAAqB,KAAK,sBAAsB;AACtD,WAAO,mBAAmB,SAAS,YAAY;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAsC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAqB;AACnB,UAAM,UACJ,KAAK,QAAQ,cAAc,OAAO,MAClC,KAAK,QAAQ,aAAa,OAAO;AACnC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAuB;AACrB,UAAM,YACJ,KAAK,QAAQ,cAAc,OAAO,QAClC,KAAK,QAAQ,aAAa,OAAO;AACnC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/protocol.ts"],"sourcesContent":["import type { ContractInfo, VanaChainId } from \"../types/index\";\nimport type { VanaContract, ContractAbis } from \"../generated/abi\";\nimport { ContractNotFoundError } from \"../errors\";\nimport {\n getContractController,\n getContractInfo,\n ContractFactory,\n} from \"../contracts/contractController\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport type { GetContractReturnType } from \"viem\";\nimport { BaseController } from \"./base\";\n\n/**\n * Provides low-level access to Vana protocol smart contracts.\n *\n * @remarks\n * Advanced API for direct contract interaction. Most developers should use\n * higher-level controllers (DataController, PermissionsController) instead.\n * This controller serves as an escape hatch when high-level APIs lack needed\n * functionality.\n *\n * **Architecture:**\n * Automatically detects current chain and provides only deployed contracts.\n * Full TypeScript type safety through contract ABIs and const assertions.\n *\n * **Method Selection:**\n * - `getContract()` - Retrieve address and ABI for manual interaction\n * - `createContract()` - Get typed contract instance with read/write methods\n * - `getAvailableContracts()` - List all contracts on current chain\n * - `isContractAvailable()` - Check contract deployment status\n * - `getChainId()`/`getChainName()` - Current network information\n *\n * **When to Use:**\n * - Custom contract interactions not covered by high-level APIs\n * - Direct contract event listening\n * - Advanced protocol operations\n *\n * **Type Safety:**\n * Always use `as const` with contract names for full type inference.\n *\n * @example\n * ```typescript\n * // Get contract info with typed ABI\n * const registry = vana.protocol.getContract(\"DataRegistry\" as const);\n * console.log(`Contract at ${registry.address}`);\n *\n * // Create typed contract instance\n * const contract = vana.protocol.createContract(\"DataRegistry\" as const);\n * const count = await contract.read.filesCount(); // Returns: bigint\n *\n * // Write operations with full typing\n * const hash = await contract.write.addFile([\"ipfs://...\"]);\n * ```\n *\n * @category Advanced\n * @see For contract specifications, visit {@link https://docs.vana.org/docs/protocol-contracts}\n */\nexport class ProtocolController extends BaseController {\n private readonly contractFactory: ContractFactory;\n\n constructor(context: ControllerContext) {\n super(context);\n this.contractFactory = new ContractFactory(\n context.walletClient ?? context.publicClient,\n );\n }\n\n /**\n * Retrieves the address and ABI for a specific Vana protocol contract.\n *\n * @remarks\n * This method provides direct access to contract addresses and ABIs for the current\n * chain. It includes full TypeScript type inference when using const assertions,\n * enabling type-safe contract interactions. The method only returns contracts that\n * are actually deployed on the current network.\n * @param contractName - The name of the Vana contract to retrieve (use const assertion for full typing)\n * @returns An object containing the contract's address and fully typed ABI\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain.\n * Verify contract name spelling and check current network with `getChainId()`.\n * @example\n * ```typescript\n * // Get contract info with full type inference\n * const dataRegistry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Now dataRegistry.abi is fully typed for the DataRegistry contract\n * console.log(dataRegistry.address); // \"0x123...\"\n * console.log(dataRegistry.abi.length); // Full ABI array\n * ```\n */\n getContract<T extends VanaContract>(\n contractName: T,\n ): ContractInfo<ContractAbis[T]> {\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n\n if (!chainId) {\n throw new ContractNotFoundError(contractName, 0);\n }\n\n return getContractInfo(contractName, chainId as VanaChainId);\n } catch (error) {\n if (error instanceof ContractNotFoundError) {\n throw error;\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n let chainId = 0;\n try {\n chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id ??\n 0;\n } catch {\n // Use 0 as fallback if chain ID access fails\n chainId = 0;\n }\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(`Failed to get contract ${contractName}: Unknown error`);\n }\n }\n\n /**\n * Creates a fully typed contract instance ready for blockchain interaction.\n *\n * @remarks\n * This method creates a contract instance with complete type safety for all contract\n * methods including read operations, write operations, and event handling. The instance\n * is pre-configured with the correct address, ABI, and wallet client for immediate use.\n * All method parameters and return types are fully typed based on the contract ABI.\n * @param contractName - The name of the Vana contract (use const assertion for full typing)\n * @returns A fully typed contract instance with read/write methods and event handling\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain\n * @example\n * ```typescript\n * // Create typed contract instance\n * const dataRegistry = vana.protocol.createContract(\"DataRegistry\" as const);\n *\n * // Full type safety for all operations\n * const fileCount = await dataRegistry.read.filesCount(); // Type: bigint\n * const txHash = await dataRegistry.write.addFile([\"ipfs://...\"]); // Typed parameters\n *\n * // Listen to events with full typing\n * const logs = await dataRegistry.getEvents.FileAdded();\n * ```\n */\n createContract<T extends VanaContract>(\n contractName: T,\n ): GetContractReturnType<ContractAbis[T]> {\n this.assertWallet();\n try {\n return getContractController(contractName, this.context.walletClient);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n const chainId = this.context.walletClient.chain?.id ?? 0;\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(\n `Failed to create contract ${contractName}: Unknown error`,\n );\n }\n }\n\n /**\n * Gets all available contract names that can be used with getContract().\n * Returns only contracts that are actually deployed on the current chain.\n *\n * @returns Array of all available contract names for the current chain\n */\n getAvailableContracts(): VanaContract[] {\n return this.contractFactory.getAvailableContracts();\n }\n\n /**\n * Checks if a specific contract is available on the current chain.\n *\n * @param contractName - The contract name to check\n * @returns Whether the contract is deployed on the current chain\n */\n isContractAvailable(contractName: VanaContract): boolean {\n const availableContracts = this.getAvailableContracts();\n return availableContracts.includes(contractName);\n }\n\n /**\n * Gets the contract factory instance for advanced usage.\n * This provides access to additional contract management methods.\n *\n * @returns The contract factory instance\n */\n getContractFactory(): ContractFactory {\n return this.contractFactory;\n }\n\n /**\n * Gets the current chain ID from the wallet client.\n *\n * @returns The chain ID\n * @throws {Error} When chain ID is not available from wallet client\n */\n getChainId(): number {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available from client\");\n }\n return chainId;\n }\n\n /**\n * Gets the current chain name from the wallet client.\n *\n * @returns The chain name\n * @throws {Error} When chain name is not available from wallet client\n */\n getChainName(): string {\n const chainName =\n this.context.walletClient?.chain?.name ??\n this.context.publicClient.chain?.name;\n if (!chainName) {\n throw new Error(\"Chain name not available from client\");\n }\n return chainName;\n }\n}\n"],"mappings":"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","names":[]}
@@ -5,50 +5,49 @@ import type { ControllerContext } from "../types/controller-context";
5
5
  import type { GetContractReturnType } from "viem";
6
6
  import { BaseController } from "./base";
7
7
  /**
8
- * Provides direct, low-level access to all Vana protocol smart contracts.
8
+ * Provides low-level access to Vana protocol smart contracts.
9
9
  *
10
10
  * @remarks
11
- * This controller serves as the designated "escape hatch" for advanced developers who need
12
- * to interact directly with the underlying blockchain contracts. It provides access to
13
- * contract addresses, ABIs, and factory methods for creating typed contract instances.
14
- * Most developers should use the higher-level DataController and PermissionsController
15
- * instead of this advanced API.
11
+ * Advanced API for direct contract interaction. Most developers should use
12
+ * higher-level controllers (DataController, PermissionsController) instead.
13
+ * This controller serves as an escape hatch when high-level APIs lack needed
14
+ * functionality.
16
15
  *
17
- * **Contract Selection:**
18
- * The controller automatically handles chain detection and provides only contracts that
19
- * are deployed on the current network. All contract instances are fully typed for
20
- * enhanced developer experience and type safety.
16
+ * **Architecture:**
17
+ * Automatically detects current chain and provides only deployed contracts.
18
+ * Full TypeScript type safety through contract ABIs and const assertions.
21
19
  *
22
20
  * **Method Selection:**
23
- * - `getContract()` retrieves contract address and ABI for manual interaction
24
- * - `createContract()` returns fully typed contract instance with read/write methods
25
- * - `getAvailableContracts()` lists all contracts deployed on current chain
26
- * - `isContractAvailable()` checks if specific contract exists on current chain
27
- * - `getChainId()` and `getChainName()` provide current network information
21
+ * - `getContract()` - Retrieve address and ABI for manual interaction
22
+ * - `createContract()` - Get typed contract instance with read/write methods
23
+ * - `getAvailableContracts()` - List all contracts on current chain
24
+ * - `isContractAvailable()` - Check contract deployment status
25
+ * - `getChainId()`/`getChainName()` - Current network information
28
26
  *
29
- * **Usage Guidelines:**
30
- * Use this controller when high-level controllers don't provide needed functionality.
31
- * Most developers should use `vana.data.*` for files and `vana.permissions.*` for access control.
27
+ * **When to Use:**
28
+ * - Custom contract interactions not covered by high-level APIs
29
+ * - Direct contract event listening
30
+ * - Advanced protocol operations
32
31
  *
33
32
  * **Type Safety:**
34
- * Use `as const` assertion with contract names for full TypeScript type inference.
35
- * Contract instances provide complete typing for all methods, parameters, and return values.
33
+ * Always use `as const` with contract names for full type inference.
36
34
  *
37
35
  * @example
38
36
  * ```typescript
39
- * // Get contract info for direct interaction
37
+ * // Get contract info with typed ABI
40
38
  * const registry = vana.protocol.getContract("DataRegistry" as const);
39
+ * console.log(`Contract at ${registry.address}`);
41
40
  *
42
- * // Access contract address and ABI with full typing
43
- * console.log(registry.address); // Contract address on current chain
44
- * console.log(registry.abi); // Fully typed contract ABI
45
- *
46
- * // Create a typed contract instance
41
+ * // Create typed contract instance
47
42
  * const contract = vana.protocol.createContract("DataRegistry" as const);
48
- * const fileCount = await contract.read.filesCount();
43
+ * const count = await contract.read.filesCount(); // Returns: bigint
44
+ *
45
+ * // Write operations with full typing
46
+ * const hash = await contract.write.addFile(["ipfs://..."]);
49
47
  * ```
48
+ *
50
49
  * @category Advanced
51
- * @see {@link https://docs.vana.com/developer/protocol/contracts | Vana Protocol Contracts} for contract specifications
50
+ * @see For contract specifications, visit {@link https://docs.vana.org/docs/protocol-contracts}
52
51
  */
53
52
  export declare class ProtocolController extends BaseController {
54
53
  private readonly contractFactory;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/protocol.ts"],"sourcesContent":["import type { ContractInfo, VanaChainId } from \"../types/index\";\nimport type { VanaContract, ContractAbis } from \"../generated/abi\";\nimport { ContractNotFoundError } from \"../errors\";\nimport {\n getContractController,\n getContractInfo,\n ContractFactory,\n} from \"../contracts/contractController\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport type { GetContractReturnType } from \"viem\";\nimport { BaseController } from \"./base\";\n\n/**\n * Provides direct, low-level access to all Vana protocol smart contracts.\n *\n * @remarks\n * This controller serves as the designated \"escape hatch\" for advanced developers who need\n * to interact directly with the underlying blockchain contracts. It provides access to\n * contract addresses, ABIs, and factory methods for creating typed contract instances.\n * Most developers should use the higher-level DataController and PermissionsController\n * instead of this advanced API.\n *\n * **Contract Selection:**\n * The controller automatically handles chain detection and provides only contracts that\n * are deployed on the current network. All contract instances are fully typed for\n * enhanced developer experience and type safety.\n *\n * **Method Selection:**\n * - `getContract()` retrieves contract address and ABI for manual interaction\n * - `createContract()` returns fully typed contract instance with read/write methods\n * - `getAvailableContracts()` lists all contracts deployed on current chain\n * - `isContractAvailable()` checks if specific contract exists on current chain\n * - `getChainId()` and `getChainName()` provide current network information\n *\n * **Usage Guidelines:**\n * Use this controller when high-level controllers don't provide needed functionality.\n * Most developers should use `vana.data.*` for files and `vana.permissions.*` for access control.\n *\n * **Type Safety:**\n * Use `as const` assertion with contract names for full TypeScript type inference.\n * Contract instances provide complete typing for all methods, parameters, and return values.\n *\n * @example\n * ```typescript\n * // Get contract info for direct interaction\n * const registry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Access contract address and ABI with full typing\n * console.log(registry.address); // Contract address on current chain\n * console.log(registry.abi); // Fully typed contract ABI\n *\n * // Create a typed contract instance\n * const contract = vana.protocol.createContract(\"DataRegistry\" as const);\n * const fileCount = await contract.read.filesCount();\n * ```\n * @category Advanced\n * @see {@link https://docs.vana.com/developer/protocol/contracts | Vana Protocol Contracts} for contract specifications\n */\nexport class ProtocolController extends BaseController {\n private readonly contractFactory: ContractFactory;\n\n constructor(context: ControllerContext) {\n super(context);\n this.contractFactory = new ContractFactory(\n context.walletClient ?? context.publicClient,\n );\n }\n\n /**\n * Retrieves the address and ABI for a specific Vana protocol contract.\n *\n * @remarks\n * This method provides direct access to contract addresses and ABIs for the current\n * chain. It includes full TypeScript type inference when using const assertions,\n * enabling type-safe contract interactions. The method only returns contracts that\n * are actually deployed on the current network.\n * @param contractName - The name of the Vana contract to retrieve (use const assertion for full typing)\n * @returns An object containing the contract's address and fully typed ABI\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain.\n * Verify contract name spelling and check current network with `getChainId()`.\n * @example\n * ```typescript\n * // Get contract info with full type inference\n * const dataRegistry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Now dataRegistry.abi is fully typed for the DataRegistry contract\n * console.log(dataRegistry.address); // \"0x123...\"\n * console.log(dataRegistry.abi.length); // Full ABI array\n * ```\n */\n getContract<T extends VanaContract>(\n contractName: T,\n ): ContractInfo<ContractAbis[T]> {\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n\n if (!chainId) {\n throw new ContractNotFoundError(contractName, 0);\n }\n\n return getContractInfo(contractName, chainId as VanaChainId);\n } catch (error) {\n if (error instanceof ContractNotFoundError) {\n throw error;\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n let chainId = 0;\n try {\n chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id ??\n 0;\n } catch {\n // Use 0 as fallback if chain ID access fails\n chainId = 0;\n }\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(`Failed to get contract ${contractName}: Unknown error`);\n }\n }\n\n /**\n * Creates a fully typed contract instance ready for blockchain interaction.\n *\n * @remarks\n * This method creates a contract instance with complete type safety for all contract\n * methods including read operations, write operations, and event handling. The instance\n * is pre-configured with the correct address, ABI, and wallet client for immediate use.\n * All method parameters and return types are fully typed based on the contract ABI.\n * @param contractName - The name of the Vana contract (use const assertion for full typing)\n * @returns A fully typed contract instance with read/write methods and event handling\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain\n * @example\n * ```typescript\n * // Create typed contract instance\n * const dataRegistry = vana.protocol.createContract(\"DataRegistry\" as const);\n *\n * // Full type safety for all operations\n * const fileCount = await dataRegistry.read.filesCount(); // Type: bigint\n * const txHash = await dataRegistry.write.addFile([\"ipfs://...\"]); // Typed parameters\n *\n * // Listen to events with full typing\n * const logs = await dataRegistry.getEvents.FileAdded();\n * ```\n */\n createContract<T extends VanaContract>(\n contractName: T,\n ): GetContractReturnType<ContractAbis[T]> {\n this.assertWallet();\n try {\n return getContractController(contractName, this.context.walletClient);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n const chainId = this.context.walletClient.chain?.id ?? 0;\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(\n `Failed to create contract ${contractName}: Unknown error`,\n );\n }\n }\n\n /**\n * Gets all available contract names that can be used with getContract().\n * Returns only contracts that are actually deployed on the current chain.\n *\n * @returns Array of all available contract names for the current chain\n */\n getAvailableContracts(): VanaContract[] {\n return this.contractFactory.getAvailableContracts();\n }\n\n /**\n * Checks if a specific contract is available on the current chain.\n *\n * @param contractName - The contract name to check\n * @returns Whether the contract is deployed on the current chain\n */\n isContractAvailable(contractName: VanaContract): boolean {\n const availableContracts = this.getAvailableContracts();\n return availableContracts.includes(contractName);\n }\n\n /**\n * Gets the contract factory instance for advanced usage.\n * This provides access to additional contract management methods.\n *\n * @returns The contract factory instance\n */\n getContractFactory(): ContractFactory {\n return this.contractFactory;\n }\n\n /**\n * Gets the current chain ID from the wallet client.\n *\n * @returns The chain ID\n * @throws {Error} When chain ID is not available from wallet client\n */\n getChainId(): number {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available from client\");\n }\n return chainId;\n }\n\n /**\n * Gets the current chain name from the wallet client.\n *\n * @returns The chain name\n * @throws {Error} When chain name is not available from wallet client\n */\n getChainName(): string {\n const chainName =\n this.context.walletClient?.chain?.name ??\n this.context.publicClient.chain?.name;\n if (!chainName) {\n throw new Error(\"Chain name not available from client\");\n }\n return chainName;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/protocol.ts"],"sourcesContent":["import type { ContractInfo, VanaChainId } from \"../types/index\";\nimport type { VanaContract, ContractAbis } from \"../generated/abi\";\nimport { ContractNotFoundError } from \"../errors\";\nimport {\n getContractController,\n getContractInfo,\n ContractFactory,\n} from \"../contracts/contractController\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport type { GetContractReturnType } from \"viem\";\nimport { BaseController } from \"./base\";\n\n/**\n * Provides low-level access to Vana protocol smart contracts.\n *\n * @remarks\n * Advanced API for direct contract interaction. Most developers should use\n * higher-level controllers (DataController, PermissionsController) instead.\n * This controller serves as an escape hatch when high-level APIs lack needed\n * functionality.\n *\n * **Architecture:**\n * Automatically detects current chain and provides only deployed contracts.\n * Full TypeScript type safety through contract ABIs and const assertions.\n *\n * **Method Selection:**\n * - `getContract()` - Retrieve address and ABI for manual interaction\n * - `createContract()` - Get typed contract instance with read/write methods\n * - `getAvailableContracts()` - List all contracts on current chain\n * - `isContractAvailable()` - Check contract deployment status\n * - `getChainId()`/`getChainName()` - Current network information\n *\n * **When to Use:**\n * - Custom contract interactions not covered by high-level APIs\n * - Direct contract event listening\n * - Advanced protocol operations\n *\n * **Type Safety:**\n * Always use `as const` with contract names for full type inference.\n *\n * @example\n * ```typescript\n * // Get contract info with typed ABI\n * const registry = vana.protocol.getContract(\"DataRegistry\" as const);\n * console.log(`Contract at ${registry.address}`);\n *\n * // Create typed contract instance\n * const contract = vana.protocol.createContract(\"DataRegistry\" as const);\n * const count = await contract.read.filesCount(); // Returns: bigint\n *\n * // Write operations with full typing\n * const hash = await contract.write.addFile([\"ipfs://...\"]);\n * ```\n *\n * @category Advanced\n * @see For contract specifications, visit {@link https://docs.vana.org/docs/protocol-contracts}\n */\nexport class ProtocolController extends BaseController {\n private readonly contractFactory: ContractFactory;\n\n constructor(context: ControllerContext) {\n super(context);\n this.contractFactory = new ContractFactory(\n context.walletClient ?? context.publicClient,\n );\n }\n\n /**\n * Retrieves the address and ABI for a specific Vana protocol contract.\n *\n * @remarks\n * This method provides direct access to contract addresses and ABIs for the current\n * chain. It includes full TypeScript type inference when using const assertions,\n * enabling type-safe contract interactions. The method only returns contracts that\n * are actually deployed on the current network.\n * @param contractName - The name of the Vana contract to retrieve (use const assertion for full typing)\n * @returns An object containing the contract's address and fully typed ABI\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain.\n * Verify contract name spelling and check current network with `getChainId()`.\n * @example\n * ```typescript\n * // Get contract info with full type inference\n * const dataRegistry = vana.protocol.getContract(\"DataRegistry\" as const);\n *\n * // Now dataRegistry.abi is fully typed for the DataRegistry contract\n * console.log(dataRegistry.address); // \"0x123...\"\n * console.log(dataRegistry.abi.length); // Full ABI array\n * ```\n */\n getContract<T extends VanaContract>(\n contractName: T,\n ): ContractInfo<ContractAbis[T]> {\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n\n if (!chainId) {\n throw new ContractNotFoundError(contractName, 0);\n }\n\n return getContractInfo(contractName, chainId as VanaChainId);\n } catch (error) {\n if (error instanceof ContractNotFoundError) {\n throw error;\n }\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n let chainId = 0;\n try {\n chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id ??\n 0;\n } catch {\n // Use 0 as fallback if chain ID access fails\n chainId = 0;\n }\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(`Failed to get contract ${contractName}: Unknown error`);\n }\n }\n\n /**\n * Creates a fully typed contract instance ready for blockchain interaction.\n *\n * @remarks\n * This method creates a contract instance with complete type safety for all contract\n * methods including read operations, write operations, and event handling. The instance\n * is pre-configured with the correct address, ABI, and wallet client for immediate use.\n * All method parameters and return types are fully typed based on the contract ABI.\n * @param contractName - The name of the Vana contract (use const assertion for full typing)\n * @returns A fully typed contract instance with read/write methods and event handling\n * @throws {ContractNotFoundError} When the contract is not deployed on the current chain\n * @example\n * ```typescript\n * // Create typed contract instance\n * const dataRegistry = vana.protocol.createContract(\"DataRegistry\" as const);\n *\n * // Full type safety for all operations\n * const fileCount = await dataRegistry.read.filesCount(); // Type: bigint\n * const txHash = await dataRegistry.write.addFile([\"ipfs://...\"]); // Typed parameters\n *\n * // Listen to events with full typing\n * const logs = await dataRegistry.getEvents.FileAdded();\n * ```\n */\n createContract<T extends VanaContract>(\n contractName: T,\n ): GetContractReturnType<ContractAbis[T]> {\n this.assertWallet();\n try {\n return getContractController(contractName, this.context.walletClient);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes(\"Contract address not found\")) {\n const chainId = this.context.walletClient.chain?.id ?? 0;\n throw new ContractNotFoundError(contractName, chainId);\n }\n throw error;\n }\n throw new Error(\n `Failed to create contract ${contractName}: Unknown error`,\n );\n }\n }\n\n /**\n * Gets all available contract names that can be used with getContract().\n * Returns only contracts that are actually deployed on the current chain.\n *\n * @returns Array of all available contract names for the current chain\n */\n getAvailableContracts(): VanaContract[] {\n return this.contractFactory.getAvailableContracts();\n }\n\n /**\n * Checks if a specific contract is available on the current chain.\n *\n * @param contractName - The contract name to check\n * @returns Whether the contract is deployed on the current chain\n */\n isContractAvailable(contractName: VanaContract): boolean {\n const availableContracts = this.getAvailableContracts();\n return availableContracts.includes(contractName);\n }\n\n /**\n * Gets the contract factory instance for advanced usage.\n * This provides access to additional contract management methods.\n *\n * @returns The contract factory instance\n */\n getContractFactory(): ContractFactory {\n return this.contractFactory;\n }\n\n /**\n * Gets the current chain ID from the wallet client.\n *\n * @returns The chain ID\n * @throws {Error} When chain ID is not available from wallet client\n */\n getChainId(): number {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available from client\");\n }\n return chainId;\n }\n\n /**\n * Gets the current chain name from the wallet client.\n *\n * @returns The chain name\n * @throws {Error} When chain name is not available from wallet client\n */\n getChainName(): string {\n const chainName =\n this.context.walletClient?.chain?.name ??\n this.context.publicClient.chain?.name;\n if (!chainName) {\n throw new Error(\"Chain name not available from client\");\n }\n return chainName;\n }\n}\n"],"mappings":"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","names":[]}
@@ -45,40 +45,42 @@ class SchemaController extends import_base.BaseController {
45
45
  super(context);
46
46
  }
47
47
  /**
48
- * Creates a new schema with automatic validation and IPFS upload.
48
+ * Creates a schema with validation and IPFS upload.
49
49
  *
50
50
  * @remarks
51
- * This is the primary method for creating schemas on the Vana network. It handles
52
- * the complete workflow including schema validation, IPFS upload, and blockchain
53
- * registration. The schema definition is stored unencrypted on IPFS to enable
54
- * public access and reusability.
51
+ * Primary method for schema creation. Validates definition,
52
+ * uploads to IPFS (unencrypted for reusability), and registers
53
+ * on blockchain. Schema becomes immediately available network-wide.
55
54
  *
56
- * The method automatically:
57
- * - Validates the schema definition against the Vana metaschema
58
- * - Uploads the definition to IPFS to generate a permanent URL
59
- * - Registers the schema on the blockchain with the generated URL
55
+ * @param params - Creation configuration
56
+ * @param params.name - Human-readable schema name
57
+ * @param params.dialect - Schema format (`"json"` or `"sqlite"`)
58
+ * @param params.schema - Definition object or JSON string
59
+ *
60
+ * @returns Schema ID, IPFS URL, and transaction hash
61
+ *
62
+ * @throws {SchemaValidationError} Invalid schema definition.
63
+ * Verify schema follows JSON Schema or SQLite format.
64
+ * @throws {Error} Storage not configured.
65
+ * Configure storage providers in VanaConfig.
66
+ * @throws {Error} IPFS upload failed.
67
+ * Check network and storage provider status.
60
68
  *
61
- * @param params - Schema creation parameters including name, dialect, and definition
62
- * @returns Promise resolving to creation results with schema ID and transaction hash
63
- * @throws {SchemaValidationError} When the schema definition is invalid
64
- * @throws {Error} When IPFS upload or blockchain registration fails
65
69
  * @example
66
70
  * ```typescript
67
- * // Create a JSON schema for user profiles
68
71
  * const result = await vana.schemas.create({
69
72
  * name: "User Profile",
70
73
  * dialect: "json",
71
74
  * schema: {
72
75
  * type: "object",
73
76
  * properties: {
74
- * name: { type: "string" },
77
+ * name: { type: "string", minLength: 1 },
75
78
  * age: { type: "number", minimum: 0 }
76
79
  * },
77
80
  * required: ["name"]
78
81
  * }
79
82
  * });
80
- *
81
- * console.log(`Schema created with ID: ${result.schemaId}`);
83
+ * console.log(`Schema ${result.schemaId} at ${result.definitionUrl}`);
82
84
  * ```
83
85
  */
84
86
  async create(params) {
@@ -120,9 +122,7 @@ class SchemaController extends import_base.BaseController {
120
122
  });
121
123
  const uploadResult = await this.context.storageManager.upload(
122
124
  schemaBlob,
123
- `${name.replace(/[^a-zA-Z0-9]/g, "_")}.json`,
124
- "ipfs"
125
- // Use IPFS for public schema storage
125
+ `${name.replace(/[^a-zA-Z0-9]/g, "_")}.json`
126
126
  );
127
127
  const chainId = this.context.walletClient?.chain?.id ?? this.context.publicClient.chain?.id;
128
128
  if (!chainId) {
@@ -133,14 +133,14 @@ class SchemaController extends import_base.BaseController {
133
133
  "DataRefinerRegistry"
134
134
  );
135
135
  const dataRefinerRegistryAbi = (0, import_abi.getAbi)("DataRefinerRegistry");
136
- const account = this.context.walletClient.account;
136
+ const account = this.context.walletClient.account ?? this.context.userAddress;
137
137
  const from = typeof account === "string" ? account : account?.address;
138
138
  const hash = await this.context.walletClient.writeContract({
139
139
  address: dataRefinerRegistryAddress,
140
140
  abi: dataRefinerRegistryAbi,
141
141
  functionName: "addSchema",
142
142
  args: [name, dialect, uploadResult.url],
143
- account: account ?? null,
143
+ account,
144
144
  chain: this.context.walletClient.chain ?? null
145
145
  });
146
146
  const { tx } = await import("../utils/transactionHelpers");
@@ -302,8 +302,18 @@ class SchemaController extends import_base.BaseController {
302
302
  * ```
303
303
  */
304
304
  async list(options = {}) {
305
- const { limit = 100, offset = 0, includeDefinitions = false } = options;
305
+ const {
306
+ limit = 100,
307
+ offset = 0,
308
+ includeDefinitions = false,
309
+ minBlock,
310
+ waitForSync
311
+ } = options;
306
312
  const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;
313
+ if (subgraphUrl && (minBlock || waitForSync)) {
314
+ const { checkSubgraphConsistency } = await import("../utils/subgraphConsistency");
315
+ await checkSubgraphConsistency(subgraphUrl, { minBlock, waitForSync });
316
+ }
307
317
  if (subgraphUrl) {
308
318
  try {
309
319
  return await this._listSchemasViaSubgraph({
@@ -374,6 +384,75 @@ class SchemaController extends import_base.BaseController {
374
384
  );
375
385
  }
376
386
  }
387
+ /**
388
+ * Retrieves schema definition content directly from a URL.
389
+ *
390
+ * @remarks
391
+ * Use this method to fetch and format schema definitions from IPFS or HTTP URLs.
392
+ * Automatically uses the SDK's configured download proxy to bypass CORS restrictions.
393
+ * Returns formatted JSON string if content is valid JSON, otherwise raw content.
394
+ *
395
+ * @param url - The definition URL (typically from schema.definitionUrl)
396
+ * @returns Promise resolving to the formatted definition content
397
+ * @throws {Error} When the content cannot be fetched or network errors occur
398
+ * @example
399
+ * ```typescript
400
+ * const schema = await vana.schemas.get(1);
401
+ * const definition = await vana.schemas.retrieveDefinition(schema.definitionUrl);
402
+ * console.log(definition); // Pretty-printed JSON
403
+ * ```
404
+ */
405
+ async retrieveDefinition(url) {
406
+ try {
407
+ const { universalFetch } = await import("../utils/download");
408
+ const response = await universalFetch(url, this.context.downloadRelayer);
409
+ if (!response.ok) {
410
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
411
+ }
412
+ const text = await response.text();
413
+ try {
414
+ const json = JSON.parse(text);
415
+ return JSON.stringify(json, null, 2);
416
+ } catch {
417
+ return text;
418
+ }
419
+ } catch (error) {
420
+ throw new Error(
421
+ `Failed to retrieve schema definition: ${error instanceof Error ? error.message : "Unknown error"}`
422
+ );
423
+ }
424
+ }
425
+ /**
426
+ * Retrieves refinement instruction content from a URL.
427
+ *
428
+ * @remarks
429
+ * Use this method to fetch refinement instructions from IPFS or HTTP URLs.
430
+ * Temporarily housed in SchemaController since refiners use schemas and we don't
431
+ * have a dedicated RefinerController yet. Uses the SDK's configured download proxy.
432
+ *
433
+ * @param url - The instruction URL (typically from refiner.refinementInstructionUrl)
434
+ * @returns Promise resolving to the formatted instruction content
435
+ * @throws {Error} When the content cannot be fetched or network errors occur
436
+ * @example
437
+ * ```typescript
438
+ * const instructions = await vana.schemas.retrieveRefinementInstructions(
439
+ * refiner.refinementInstructionUrl
440
+ * );
441
+ * console.log(instructions);
442
+ * ```
443
+ */
444
+ async retrieveRefinementInstructions(url) {
445
+ try {
446
+ return await this.retrieveDefinition(url);
447
+ } catch (error) {
448
+ throw new Error(
449
+ `Failed to retrieve refinement instructions: ${error instanceof Error ? error.message.replace(
450
+ "Failed to retrieve schema definition: ",
451
+ ""
452
+ ) : "Unknown error"}`
453
+ );
454
+ }
455
+ }
377
456
  /**
378
457
  * Adds a schema using the legacy method (low-level API).
379
458
  *
@@ -393,14 +472,14 @@ class SchemaController extends import_base.BaseController {
393
472
  "DataRefinerRegistry"
394
473
  );
395
474
  const dataRefinerRegistryAbi = (0, import_abi.getAbi)("DataRefinerRegistry");
396
- const account = this.context.walletClient.account;
475
+ const account = this.context.walletClient.account ?? this.context.userAddress;
397
476
  const from = typeof account === "string" ? account : account?.address;
398
477
  const hash = await this.context.walletClient.writeContract({
399
478
  address: dataRefinerRegistryAddress,
400
479
  abi: dataRefinerRegistryAbi,
401
480
  functionName: "addSchema",
402
481
  args: [params.name, params.dialect, params.definitionUrl],
403
- account: account ?? null,
482
+ account,
404
483
  chain: this.context.walletClient.chain ?? null
405
484
  });
406
485
  const { tx } = await import("../utils/transactionHelpers");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/schemas.ts"],"sourcesContent":["import type {\n Schema,\n SchemaMetadata,\n CompleteSchema,\n AddSchemaParams,\n} from \"../types/index\";\n// import type { TransactionResult } from \"../types/operations\";\nimport type { SchemaAddedResult } from \"../types/transactionResults\";\nimport type { ControllerContext } from \"./permissions\";\nimport { BaseController } from \"./base\";\nimport { getContractAddress } from \"../config/addresses\";\nimport { getAbi } from \"../generated/abi\";\nimport { gasAwareMulticall } from \"../utils/multicall\";\nimport {\n validateDataSchemaAgainstMetaSchema,\n SchemaValidationError,\n type DataSchema,\n} from \"../utils/schemaValidation\";\nimport {\n fetchSchemaFromChain,\n fetchSchemaCountFromChain,\n} from \"../utils/blockchain/registry\";\nimport {\n GetSchemaDocument,\n ListSchemasDocument,\n CountSchemasDocument,\n type GetSchemaQuery,\n type ListSchemasQuery,\n type CountSchemasQuery,\n} from \"../generated/subgraph\";\nimport { print } from \"graphql\";\nimport { fetchFromUrl, UrlResolutionError } from \"../utils/urlResolver\";\n\n/**\n * Parameters for creating a new schema with automatic IPFS upload.\n *\n * @remarks\n * This interface is used with the high-level `schemas.create()` method which\n * automatically uploads the schema definition to IPFS and registers it on-chain.\n * @category Schema Management\n */\nexport interface CreateSchemaParams {\n /** The name of the schema */\n name: string;\n /** The dialect of the schema (e.g., 'json' or 'sqlite') */\n dialect: \"json\" | \"sqlite\";\n /** The schema definition object or JSON string */\n schema: object | string;\n}\n\n/**\n * Result of creating a new schema.\n *\n * @remarks\n * Returned by the `schemas.create()` method after successful upload and registration.\n * @category Schema Management\n */\nexport interface CreateSchemaResult {\n /** The schema ID assigned by the contract */\n schemaId: bigint;\n /** The IPFS URL where the schema definition is stored */\n definitionUrl: string;\n /** The transaction hash of the schema registration */\n transactionHash: string;\n}\n\n/**\n * Manages data schemas and refiners on the Vana network.\n *\n * @remarks\n * This controller handles the complete lifecycle of data schemas including creation,\n * validation, IPFS upload, and blockchain registration. It provides methods for managing\n * both schemas (data structure definitions) and refiners (data processing definitions).\n *\n * **Schema Storage:**\n * Schemas are stored unencrypted on IPFS for public access and reusability across the network.\n * Schema definitions use JSON Schema format for data validation and structure definition.\n *\n * **Method Selection:**\n * - `create()` validates, uploads to IPFS, and registers new schemas on blockchain\n * - `get()` retrieves existing schema metadata by ID from blockchain contracts\n * - `count()` returns total number of registered schemas for pagination\n * - `list()` provides paginated access to all schemas with optional filtering\n * - `addSchema()` provides lower-level schema registration with pre-uploaded URLs\n *\n * **Storage Requirements:**\n * Methods requiring storage configuration: `create()`\n * Methods working without storage: `get()`, `count()`, `list()`, `addSchema()`\n *\n * @example\n * ```typescript\n * // Create a new schema with automatic IPFS upload\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\" }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * // Get an existing schema\n * const schema = await vana.schemas.get(1);\n *\n * // List all schemas\n * const count = await vana.schemas.count();\n * ```\n * @category Schema Management\n */\nexport class SchemaController extends BaseController {\n constructor(context: ControllerContext) {\n super(context);\n }\n\n /**\n * Creates a new schema with automatic validation and IPFS upload.\n *\n * @remarks\n * This is the primary method for creating schemas on the Vana network. It handles\n * the complete workflow including schema validation, IPFS upload, and blockchain\n * registration. The schema definition is stored unencrypted on IPFS to enable\n * public access and reusability.\n *\n * The method automatically:\n * - Validates the schema definition against the Vana metaschema\n * - Uploads the definition to IPFS to generate a permanent URL\n * - Registers the schema on the blockchain with the generated URL\n *\n * @param params - Schema creation parameters including name, dialect, and definition\n * @returns Promise resolving to creation results with schema ID and transaction hash\n * @throws {SchemaValidationError} When the schema definition is invalid\n * @throws {Error} When IPFS upload or blockchain registration fails\n * @example\n * ```typescript\n * // Create a JSON schema for user profiles\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\" },\n * age: { type: \"number\", minimum: 0 }\n * },\n * required: [\"name\"]\n * }\n * });\n *\n * console.log(`Schema created with ID: ${result.schemaId}`);\n * ```\n */\n async create(params: CreateSchemaParams): Promise<CreateSchemaResult> {\n this.assertWallet();\n const { name, dialect, schema } = params;\n\n try {\n // Step 1: Normalize and validate the schema definition\n let schemaDefinition: object;\n if (typeof schema === \"string\") {\n try {\n schemaDefinition = JSON.parse(schema);\n } catch {\n throw new SchemaValidationError(\n \"Invalid JSON in schema definition\",\n [],\n );\n }\n } else {\n schemaDefinition = schema;\n }\n\n // Step 2: Validate against metaschema\n const dataSchema: DataSchema = {\n name,\n version: \"1.0.0\",\n dialect,\n schema: schemaDefinition,\n };\n\n validateDataSchemaAgainstMetaSchema(dataSchema);\n\n // Step 3: Upload to IPFS (unencrypted for public access)\n if (!this.context.storageManager) {\n // Use centralized validation if available, otherwise fall back to old behavior\n if (this.context.validateStorageRequired) {\n this.context.validateStorageRequired();\n // The validateStorageRequired method throws, so this line should never be reached\n // but TypeScript doesn't know that, so we need this fallback\n throw new Error(\"Storage validation failed\");\n } else {\n throw new Error(\n \"Storage manager not configured. Please provide storage providers in VanaConfig.\",\n );\n }\n }\n\n const schemaBlob = new Blob([JSON.stringify(dataSchema)], {\n type: \"application/json\",\n });\n\n const uploadResult = await this.context.storageManager.upload(\n schemaBlob,\n `${name.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`,\n \"ipfs\", // Use IPFS for public schema storage\n );\n\n // Step 4: Register on blockchain\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account = this.context.walletClient.account;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [name, dialect, uploadResult.url],\n account: account ?? null,\n chain: this.context.walletClient.chain ?? null,\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n return {\n schemaId: event.schemaId,\n definitionUrl: uploadResult.url,\n transactionHash: hash,\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw new Error(\n `Schema creation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves a complete schema by its ID with definition fetched and flattened.\n *\n * @param schemaId - The ID of the schema to retrieve\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the complete schema object with all fields populated\n * @throws {Error} When the schema is not found, definition cannot be fetched, or chain is unavailable\n * @example\n * ```typescript\n * const schema = await vana.schemas.get(1);\n * console.log(`Schema: ${schema.name} (${schema.dialect})`);\n * console.log(`Version: ${schema.version}`);\n * console.log(`Description: ${schema.description}`);\n * console.log('Schema:', schema.schema);\n *\n * // Use directly with validator (schema has all required fields)\n * validator.validateDataAgainstSchema(data, schema);\n * ```\n */\n async get(\n schemaId: number,\n options: { subgraphUrl?: string } = {},\n ): Promise<CompleteSchema> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n let metadata: SchemaMetadata;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n metadata = await this._getSchemaViaSubgraph({ schemaId, subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (rpcError) {\n throw new Error(\n `Failed to get schema: ${rpcError instanceof Error ? rpcError.message : \"Unknown error\"}`,\n );\n }\n }\n } else {\n // Use RPC directly\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (error) {\n throw new Error(\n `Failed to get schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n // Fetch the definition (should be a complete DataSchema)\n const definition = await fetchFromUrl(\n metadata.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (!definition || typeof definition !== \"object\") {\n throw new Error(\n `Invalid schema definition format for schema ${schemaId}`,\n );\n }\n\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Verify on-chain and off-chain data match\n if (dataSchema.name !== metadata.name) {\n console.warn(\n `Schema name mismatch for ID ${schemaId}: on-chain=\"${metadata.name}\" off-chain=\"${dataSchema.name}\" (using on-chain value)`,\n );\n }\n if (dataSchema.dialect !== metadata.dialect) {\n console.warn(\n `Schema dialect mismatch for ID ${schemaId}: on-chain=\"${metadata.dialect}\" off-chain=\"${dataSchema.dialect}\" (using on-chain value)`,\n );\n }\n\n // Return using on-chain values as authoritative source\n return {\n ...metadata,\n version: dataSchema.version,\n description: dataSchema.description,\n schema: dataSchema.schema,\n };\n }\n\n /**\n * Gets the total number of schemas registered on the network.\n *\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the total schema count\n * @throws {Error} When the count cannot be retrieved\n * @example\n * ```typescript\n * const count = await vana.schemas.count();\n * console.log(`Total schemas: ${count}`);\n *\n * // With custom subgraph\n * const count = await vana.schemas.count({\n * subgraphUrl: 'https://custom-subgraph.com/graphql'\n * });\n * ```\n */\n async count(options: { subgraphUrl?: string } = {}): Promise<number> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._countSchemasViaSubgraph({ subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n // Use RPC (as fallback or primary method)\n try {\n return await fetchSchemaCountFromChain(this.context);\n } catch (error) {\n throw new Error(\n `Failed to get schemas count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Lists all schemas with pagination.\n *\n * @param options - Optional parameters for listing schemas\n * @param options.limit - Maximum number of schemas to return\n * @param options.offset - Number of schemas to skip\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @param options.includeDefinitions - Whether to fetch and include schema definitions (default: false for performance)\n * @returns Promise resolving to an array of schemas\n * @example\n * ```typescript\n * // Get all schemas (without definitions for performance)\n * const schemas = await vana.schemas.list();\n *\n * // Get schemas with definitions\n * const schemas = await vana.schemas.list({ includeDefinitions: true });\n *\n * // Get schemas with pagination\n * const schemas = await vana.schemas.list({ limit: 10, offset: 0 });\n * ```\n */\n async list(\n options: {\n limit?: number;\n offset?: number;\n subgraphUrl?: string;\n includeDefinitions?: boolean;\n } = {},\n ): Promise<Schema[]> {\n const { limit = 100, offset = 0, includeDefinitions = false } = options;\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._listSchemasViaSubgraph({\n limit,\n offset,\n subgraphUrl,\n });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n try {\n const totalCount = await this.count();\n const start = offset;\n const end = Math.min(start + limit, totalCount);\n\n if (end <= start) {\n return [];\n }\n\n // Get contract address and ABI\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n // Build multicall batch for fetching schemas\n const schemaCalls = [];\n for (let i = start; i < end; i++) {\n schemaCalls.push({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"schemas\",\n args: [BigInt(i + 1)], // Schema IDs are 1-based\n } as const);\n }\n\n // Fetch all schemas in batches using gasAwareMulticall\n const schemaResults = await gasAwareMulticall<\n typeof schemaCalls,\n true // Allow failures for individual schema lookups\n >(this.context.publicClient, {\n contracts: schemaCalls,\n allowFailure: true,\n });\n\n // Process results\n const schemas: Schema[] = [];\n schemaResults.forEach((result, index) => {\n if (result.status === \"success\" && result.result) {\n const schemaId = start + index + 1; // Schema IDs are 1-based\n const schemaData = result.result as {\n name: string;\n dialect: string;\n definitionUrl: string;\n };\n\n if (\n schemaData.name &&\n schemaData.dialect &&\n schemaData.definitionUrl\n ) {\n schemas.push({\n id: schemaId,\n name: schemaData.name,\n dialect: schemaData.dialect as \"json\" | \"sqlite\",\n definitionUrl: schemaData.definitionUrl,\n });\n } else {\n console.warn(`Incomplete schema data for ID ${schemaId}`);\n }\n } else {\n // Skip schemas that can't be retrieved\n console.warn(`Failed to retrieve schema ${start + index + 1}`);\n }\n });\n\n // Optionally fetch definitions for all schemas\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n } catch (error) {\n throw new Error(\n `Failed to list schemas: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Adds a schema using the legacy method (low-level API).\n *\n * @deprecated Use create() instead for the high-level API with automatic IPFS upload\n * @param params - Schema parameters including pre-generated definition URL\n * @returns Promise resolving to the add schema result\n */\n async addSchema(params: AddSchemaParams): Promise<SchemaAddedResult> {\n this.assertWallet();\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account = this.context.walletClient.account;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [params.name, params.dialect, params.definitionUrl],\n account: account ?? null,\n chain: this.context.walletClient.chain ?? null,\n });\n\n // Create TransactionResult POJO\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash,\n });\n\n return {\n transactionHash: hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n schemaId: event.schemaId,\n name: event.name,\n dialect: event.dialect,\n definitionUrl: event.definitionUrl,\n };\n } catch (error) {\n throw new Error(\n `Failed to add schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Internal method: Query schema via subgraph\n *\n * @param params - Query parameters\n * @param params.schemaId - The ID of the schema to retrieve\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the schema object\n * @private\n */\n private async _getSchemaViaSubgraph(params: {\n schemaId: number;\n subgraphUrl: string;\n }): Promise<SchemaMetadata> {\n const { schemaId, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(GetSchemaDocument),\n variables: { id: schemaId.toString() },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: GetSchemaQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schema) {\n throw new Error(`Schema ${schemaId} not found in subgraph`);\n }\n\n // Map subgraph schema to SDK schema type\n const subgraphSchema = result.data.schema;\n return {\n id: parseInt(subgraphSchema.id),\n name: subgraphSchema.name,\n dialect: subgraphSchema.dialect as \"json\" | \"sqlite\",\n definitionUrl: subgraphSchema.definitionUrl,\n };\n }\n\n /**\n * Internal method: List schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.limit - Maximum number of schemas to return\n * @param params.offset - Number of schemas to skip\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to an array of schemas\n * @private\n */\n private async _listSchemasViaSubgraph(params: {\n limit: number;\n offset: number;\n subgraphUrl: string;\n }): Promise<Schema[]> {\n const { limit, offset, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(ListSchemasDocument),\n variables: { first: limit, skip: offset },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: ListSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schemas) {\n return [];\n }\n\n // Map subgraph schemas to SDK schema type\n const schemas = result.data.schemas.map((schema) => ({\n id: parseInt(schema.id),\n name: schema.name,\n dialect: schema.dialect as \"json\" | \"sqlite\",\n definitionUrl: schema.definitionUrl,\n }));\n\n // Optionally fetch definitions if requested\n const { includeDefinitions } = params as { includeDefinitions?: boolean };\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n }\n\n /**\n * Internal method: Count schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the total schema count\n * @private\n */\n private async _countSchemasViaSubgraph(params: {\n subgraphUrl: string;\n }): Promise<number> {\n const { subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(CountSchemasDocument),\n variables: {},\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: CountSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n return result.data?.schemas?.length ?? 0;\n }\n\n /**\n * Gets the user's wallet address.\n *\n * @private\n * @returns Promise resolving to the user's address\n */\n\n /**\n * Fetches and attaches definitions to an array of schemas.\n *\n * @param schemas - Array of schemas to fetch definitions for\n * @private\n */\n private async _fetchDefinitionsForSchemas(schemas: Schema[]): Promise<void> {\n // Fetch definitions concurrently for performance\n await Promise.all(\n schemas.map(async (schema) => {\n if (!schema.definitionUrl) return;\n\n try {\n const definition = await fetchFromUrl(\n schema.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (definition && typeof definition === \"object\") {\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Populate flat fields\n schema.version = dataSchema.version;\n schema.description = dataSchema.description;\n schema.schema = dataSchema.schema;\n }\n } catch (error) {\n // Don't fail the entire list operation if one definition fails\n console.error(\n `Failed to fetch/validate definition for schema ${schema.id}:`,\n error instanceof UrlResolutionError ||\n error instanceof SchemaValidationError\n ? error.message\n : error,\n );\n }\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/schemas.ts"],"sourcesContent":["import type {\n Schema,\n SchemaMetadata,\n CompleteSchema,\n AddSchemaParams,\n} from \"../types/index\";\n// import type { TransactionResult } from \"../types/operations\";\nimport type { SchemaAddedResult } from \"../types/transactionResults\";\nimport type { ControllerContext } from \"./permissions\";\nimport { BaseController } from \"./base\";\nimport { getContractAddress } from \"../config/addresses\";\nimport { getAbi } from \"../generated/abi\";\nimport { gasAwareMulticall } from \"../utils/multicall\";\nimport {\n validateDataSchemaAgainstMetaSchema,\n SchemaValidationError,\n type DataSchema,\n} from \"../utils/schemaValidation\";\nimport {\n fetchSchemaFromChain,\n fetchSchemaCountFromChain,\n} from \"../utils/blockchain/registry\";\nimport {\n GetSchemaDocument,\n ListSchemasDocument,\n CountSchemasDocument,\n type GetSchemaQuery,\n type ListSchemasQuery,\n type CountSchemasQuery,\n} from \"../generated/subgraph\";\nimport { print } from \"graphql\";\nimport { fetchFromUrl, UrlResolutionError } from \"../utils/urlResolver\";\n\n/**\n * Parameters for creating a new schema with automatic IPFS upload.\n *\n * @remarks\n * This interface is used with the high-level `schemas.create()` method which\n * automatically uploads the schema definition to IPFS and registers it on-chain.\n * @category Schema Management\n */\nexport interface CreateSchemaParams {\n /** The name of the schema */\n name: string;\n /** The dialect of the schema (e.g., 'json' or 'sqlite') */\n dialect: \"json\" | \"sqlite\";\n /** The schema definition object or JSON string */\n schema: object | string;\n}\n\n/**\n * Result of creating a new schema.\n *\n * @remarks\n * Returned by the `schemas.create()` method after successful upload and registration.\n * @category Schema Management\n */\nexport interface CreateSchemaResult {\n /** The schema ID assigned by the contract */\n schemaId: bigint;\n /** The IPFS URL where the schema definition is stored */\n definitionUrl: string;\n /** The transaction hash of the schema registration */\n transactionHash: string;\n}\n\n/**\n * Manages data schemas for validation and structure definition on Vana.\n *\n * @remarks\n * Handles schema lifecycle from creation through registration. Schemas define\n * data structure and validation rules, ensuring consistency across the network.\n * Stored unencrypted on IPFS for public reusability.\n *\n * **Architecture:**\n * Schemas use dual storage: definitions on IPFS (public), metadata on blockchain.\n * Supports JSON Schema and SQLite dialects for flexible data modeling.\n *\n * **Method Selection:**\n * - `create()` - Validate, upload to IPFS, register on blockchain\n * - `get()` - Retrieve schema with definition by ID\n * - `list()` - Paginated schema browsing with metadata\n * - `count()` - Total schemas for pagination\n * - `addSchema()` - Low-level registration with pre-uploaded URL\n *\n * **Storage Requirements:**\n * - Methods requiring storage: `create()`\n * - Methods without storage: `get()`, `list()`, `count()`, `addSchema()`\n *\n * @example\n * ```typescript\n * // Create schema with validation rules\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\", minLength: 1 },\n * age: { type: \"number\", minimum: 0, maximum: 150 }\n * },\n * required: [\"name\"]\n * }\n * });\n * console.log(`Schema ${result.schemaId} created`);\n *\n * // Retrieve for validation\n * const schema = await vana.schemas.get(result.schemaId);\n * console.log(`Schema: ${schema.name} (${schema.dialect})`);\n *\n * // Browse available schemas\n * const schemas = await vana.schemas.list({ limit: 10 });\n * schemas.forEach(s => console.log(`${s.id}: ${s.name}`));\n * ```\n *\n * @category Schema Management\n * @see For conceptual overview, visit {@link https://docs.vana.org/docs/schemas}\n */\nexport class SchemaController extends BaseController {\n constructor(context: ControllerContext) {\n super(context);\n }\n\n /**\n * Creates a schema with validation and IPFS upload.\n *\n * @remarks\n * Primary method for schema creation. Validates definition,\n * uploads to IPFS (unencrypted for reusability), and registers\n * on blockchain. Schema becomes immediately available network-wide.\n *\n * @param params - Creation configuration\n * @param params.name - Human-readable schema name\n * @param params.dialect - Schema format (`\"json\"` or `\"sqlite\"`)\n * @param params.schema - Definition object or JSON string\n *\n * @returns Schema ID, IPFS URL, and transaction hash\n *\n * @throws {SchemaValidationError} Invalid schema definition.\n * Verify schema follows JSON Schema or SQLite format.\n * @throws {Error} Storage not configured.\n * Configure storage providers in VanaConfig.\n * @throws {Error} IPFS upload failed.\n * Check network and storage provider status.\n *\n * @example\n * ```typescript\n * const result = await vana.schemas.create({\n * name: \"User Profile\",\n * dialect: \"json\",\n * schema: {\n * type: \"object\",\n * properties: {\n * name: { type: \"string\", minLength: 1 },\n * age: { type: \"number\", minimum: 0 }\n * },\n * required: [\"name\"]\n * }\n * });\n * console.log(`Schema ${result.schemaId} at ${result.definitionUrl}`);\n * ```\n */\n async create(params: CreateSchemaParams): Promise<CreateSchemaResult> {\n this.assertWallet();\n const { name, dialect, schema } = params;\n\n try {\n // Step 1: Normalize and validate the schema definition\n let schemaDefinition: object;\n if (typeof schema === \"string\") {\n try {\n schemaDefinition = JSON.parse(schema);\n } catch {\n throw new SchemaValidationError(\n \"Invalid JSON in schema definition\",\n [],\n );\n }\n } else {\n schemaDefinition = schema;\n }\n\n // Step 2: Validate against metaschema\n const dataSchema: DataSchema = {\n name,\n version: \"1.0.0\",\n dialect,\n schema: schemaDefinition,\n };\n\n validateDataSchemaAgainstMetaSchema(dataSchema);\n\n // Step 3: Upload to IPFS (unencrypted for public access)\n if (!this.context.storageManager) {\n // Use centralized validation if available, otherwise fall back to old behavior\n if (this.context.validateStorageRequired) {\n this.context.validateStorageRequired();\n // The validateStorageRequired method throws, so this line should never be reached\n // but TypeScript doesn't know that, so we need this fallback\n throw new Error(\"Storage validation failed\");\n } else {\n throw new Error(\n \"Storage manager not configured. Please provide storage providers in VanaConfig.\",\n );\n }\n }\n\n const schemaBlob = new Blob([JSON.stringify(dataSchema)], {\n type: \"application/json\",\n });\n\n const uploadResult = await this.context.storageManager.upload(\n schemaBlob,\n `${name.replace(/[^a-zA-Z0-9]/g, \"_\")}.json`,\n );\n\n // Step 4: Register on blockchain\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account =\n this.context.walletClient.account ?? this.context.userAddress;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [name, dialect, uploadResult.url],\n account,\n chain: this.context.walletClient.chain ?? null,\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n return {\n schemaId: event.schemaId,\n definitionUrl: uploadResult.url,\n transactionHash: hash,\n };\n } catch (error) {\n if (error instanceof SchemaValidationError) {\n throw error;\n }\n throw new Error(\n `Schema creation failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves a complete schema by its ID with definition fetched and flattened.\n *\n * @param schemaId - The ID of the schema to retrieve\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the complete schema object with all fields populated\n * @throws {Error} When the schema is not found, definition cannot be fetched, or chain is unavailable\n * @example\n * ```typescript\n * const schema = await vana.schemas.get(1);\n * console.log(`Schema: ${schema.name} (${schema.dialect})`);\n * console.log(`Version: ${schema.version}`);\n * console.log(`Description: ${schema.description}`);\n * console.log('Schema:', schema.schema);\n *\n * // Use directly with validator (schema has all required fields)\n * validator.validateDataAgainstSchema(data, schema);\n * ```\n */\n async get(\n schemaId: number,\n options: { subgraphUrl?: string } = {},\n ): Promise<CompleteSchema> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n let metadata: SchemaMetadata;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n metadata = await this._getSchemaViaSubgraph({ schemaId, subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (rpcError) {\n throw new Error(\n `Failed to get schema: ${rpcError instanceof Error ? rpcError.message : \"Unknown error\"}`,\n );\n }\n }\n } else {\n // Use RPC directly\n try {\n metadata = await fetchSchemaFromChain(this.context, schemaId);\n } catch (error) {\n throw new Error(\n `Failed to get schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n // Fetch the definition (should be a complete DataSchema)\n const definition = await fetchFromUrl(\n metadata.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (!definition || typeof definition !== \"object\") {\n throw new Error(\n `Invalid schema definition format for schema ${schemaId}`,\n );\n }\n\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Verify on-chain and off-chain data match\n if (dataSchema.name !== metadata.name) {\n console.warn(\n `Schema name mismatch for ID ${schemaId}: on-chain=\"${metadata.name}\" off-chain=\"${dataSchema.name}\" (using on-chain value)`,\n );\n }\n if (dataSchema.dialect !== metadata.dialect) {\n console.warn(\n `Schema dialect mismatch for ID ${schemaId}: on-chain=\"${metadata.dialect}\" off-chain=\"${dataSchema.dialect}\" (using on-chain value)`,\n );\n }\n\n // Return using on-chain values as authoritative source\n return {\n ...metadata,\n version: dataSchema.version,\n description: dataSchema.description,\n schema: dataSchema.schema,\n };\n }\n\n /**\n * Gets the total number of schemas registered on the network.\n *\n * @param options - Optional parameters\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @returns Promise resolving to the total schema count\n * @throws {Error} When the count cannot be retrieved\n * @example\n * ```typescript\n * const count = await vana.schemas.count();\n * console.log(`Total schemas: ${count}`);\n *\n * // With custom subgraph\n * const count = await vana.schemas.count({\n * subgraphUrl: 'https://custom-subgraph.com/graphql'\n * });\n * ```\n */\n async count(options: { subgraphUrl?: string } = {}): Promise<number> {\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._countSchemasViaSubgraph({ subgraphUrl });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n // Use RPC (as fallback or primary method)\n try {\n return await fetchSchemaCountFromChain(this.context);\n } catch (error) {\n throw new Error(\n `Failed to get schemas count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Lists all schemas with pagination.\n *\n * @param options - Optional parameters for listing schemas\n * @param options.limit - Maximum number of schemas to return\n * @param options.offset - Number of schemas to skip\n * @param options.subgraphUrl - Custom subgraph URL to use instead of default\n * @param options.includeDefinitions - Whether to fetch and include schema definitions (default: false for performance)\n * @returns Promise resolving to an array of schemas\n * @example\n * ```typescript\n * // Get all schemas (without definitions for performance)\n * const schemas = await vana.schemas.list();\n *\n * // Get schemas with definitions\n * const schemas = await vana.schemas.list({ includeDefinitions: true });\n *\n * // Get schemas with pagination\n * const schemas = await vana.schemas.list({ limit: 10, offset: 0 });\n * ```\n */\n async list(\n options: {\n limit?: number;\n offset?: number;\n subgraphUrl?: string;\n includeDefinitions?: boolean;\n minBlock?: number;\n waitForSync?: number;\n } = {},\n ): Promise<Schema[]> {\n const {\n limit = 100,\n offset = 0,\n includeDefinitions = false,\n minBlock,\n waitForSync,\n } = options;\n const subgraphUrl = options.subgraphUrl ?? this.context.subgraphUrl;\n\n // Check consistency requirements if using subgraph\n if (subgraphUrl && (minBlock || waitForSync)) {\n const { checkSubgraphConsistency } = await import(\n \"../utils/subgraphConsistency\"\n );\n await checkSubgraphConsistency(subgraphUrl, { minBlock, waitForSync });\n }\n\n // Try subgraph first if available\n if (subgraphUrl) {\n try {\n return await this._listSchemasViaSubgraph({\n limit,\n offset,\n subgraphUrl,\n });\n } catch (error) {\n console.debug(\"Subgraph query failed, falling back to RPC:\", error);\n // Fall through to RPC\n }\n }\n\n try {\n const totalCount = await this.count();\n const start = offset;\n const end = Math.min(start + limit, totalCount);\n\n if (end <= start) {\n return [];\n }\n\n // Get contract address and ABI\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n // Build multicall batch for fetching schemas\n const schemaCalls = [];\n for (let i = start; i < end; i++) {\n schemaCalls.push({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"schemas\",\n args: [BigInt(i + 1)], // Schema IDs are 1-based\n } as const);\n }\n\n // Fetch all schemas in batches using gasAwareMulticall\n const schemaResults = await gasAwareMulticall<\n typeof schemaCalls,\n true // Allow failures for individual schema lookups\n >(this.context.publicClient, {\n contracts: schemaCalls,\n allowFailure: true,\n });\n\n // Process results\n const schemas: Schema[] = [];\n schemaResults.forEach((result, index) => {\n if (result.status === \"success\" && result.result) {\n const schemaId = start + index + 1; // Schema IDs are 1-based\n const schemaData = result.result as {\n name: string;\n dialect: string;\n definitionUrl: string;\n };\n\n if (\n schemaData.name &&\n schemaData.dialect &&\n schemaData.definitionUrl\n ) {\n schemas.push({\n id: schemaId,\n name: schemaData.name,\n dialect: schemaData.dialect as \"json\" | \"sqlite\",\n definitionUrl: schemaData.definitionUrl,\n });\n } else {\n console.warn(`Incomplete schema data for ID ${schemaId}`);\n }\n } else {\n // Skip schemas that can't be retrieved\n console.warn(`Failed to retrieve schema ${start + index + 1}`);\n }\n });\n\n // Optionally fetch definitions for all schemas\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n } catch (error) {\n throw new Error(\n `Failed to list schemas: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves schema definition content directly from a URL.\n *\n * @remarks\n * Use this method to fetch and format schema definitions from IPFS or HTTP URLs.\n * Automatically uses the SDK's configured download proxy to bypass CORS restrictions.\n * Returns formatted JSON string if content is valid JSON, otherwise raw content.\n *\n * @param url - The definition URL (typically from schema.definitionUrl)\n * @returns Promise resolving to the formatted definition content\n * @throws {Error} When the content cannot be fetched or network errors occur\n * @example\n * ```typescript\n * const schema = await vana.schemas.get(1);\n * const definition = await vana.schemas.retrieveDefinition(schema.definitionUrl);\n * console.log(definition); // Pretty-printed JSON\n * ```\n */\n async retrieveDefinition(url: string): Promise<string> {\n try {\n const { universalFetch } = await import(\"../utils/download\");\n const response = await universalFetch(url, this.context.downloadRelayer);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const text = await response.text();\n\n // Try to parse and format as JSON for better readability\n try {\n const json = JSON.parse(text);\n return JSON.stringify(json, null, 2);\n } catch {\n // Not JSON, return as-is\n return text;\n }\n } catch (error) {\n throw new Error(\n `Failed to retrieve schema definition: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves refinement instruction content from a URL.\n *\n * @remarks\n * Use this method to fetch refinement instructions from IPFS or HTTP URLs.\n * Temporarily housed in SchemaController since refiners use schemas and we don't\n * have a dedicated RefinerController yet. Uses the SDK's configured download proxy.\n *\n * @param url - The instruction URL (typically from refiner.refinementInstructionUrl)\n * @returns Promise resolving to the formatted instruction content\n * @throws {Error} When the content cannot be fetched or network errors occur\n * @example\n * ```typescript\n * const instructions = await vana.schemas.retrieveRefinementInstructions(\n * refiner.refinementInstructionUrl\n * );\n * console.log(instructions);\n * ```\n */\n async retrieveRefinementInstructions(url: string): Promise<string> {\n try {\n // Reuse the same logic as retrieveDefinition\n return await this.retrieveDefinition(url);\n } catch (error) {\n // Re-throw with more specific error message\n throw new Error(\n `Failed to retrieve refinement instructions: ${\n error instanceof Error\n ? error.message.replace(\n \"Failed to retrieve schema definition: \",\n \"\",\n )\n : \"Unknown error\"\n }`,\n );\n }\n }\n\n /**\n * Adds a schema using the legacy method (low-level API).\n *\n * @deprecated Use create() instead for the high-level API with automatic IPFS upload\n * @param params - Schema parameters including pre-generated definition URL\n * @returns Promise resolving to the add schema result\n */\n async addSchema(params: AddSchemaParams): Promise<SchemaAddedResult> {\n this.assertWallet();\n try {\n const chainId =\n this.context.walletClient?.chain?.id ??\n this.context.publicClient.chain?.id;\n if (!chainId) {\n throw new Error(\"Chain ID not available\");\n }\n\n const dataRefinerRegistryAddress = getContractAddress(\n chainId,\n \"DataRefinerRegistry\",\n );\n const dataRefinerRegistryAbi = getAbi(\"DataRefinerRegistry\");\n\n const account =\n this.context.walletClient.account ?? this.context.userAddress;\n const from = typeof account === \"string\" ? account : account?.address;\n\n const hash = await this.context.walletClient.writeContract({\n address: dataRefinerRegistryAddress,\n abi: dataRefinerRegistryAbi,\n functionName: \"addSchema\",\n args: [params.name, params.dialect, params.definitionUrl],\n account,\n chain: this.context.walletClient.chain ?? null,\n });\n\n // Create TransactionResult POJO\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash,\n from: from!,\n contract: \"DataRefinerRegistry\",\n fn: \"addSchema\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new Error(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.SchemaAdded;\n if (!event) {\n throw new Error(\"SchemaAdded event not found in transaction\");\n }\n\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash,\n });\n\n return {\n transactionHash: hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n schemaId: event.schemaId,\n name: event.name,\n dialect: event.dialect,\n definitionUrl: event.definitionUrl,\n };\n } catch (error) {\n throw new Error(\n `Failed to add schema: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Internal method: Query schema via subgraph\n *\n * @param params - Query parameters\n * @param params.schemaId - The ID of the schema to retrieve\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the schema object\n * @private\n */\n private async _getSchemaViaSubgraph(params: {\n schemaId: number;\n subgraphUrl: string;\n }): Promise<SchemaMetadata> {\n const { schemaId, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(GetSchemaDocument),\n variables: { id: schemaId.toString() },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: GetSchemaQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schema) {\n throw new Error(`Schema ${schemaId} not found in subgraph`);\n }\n\n // Map subgraph schema to SDK schema type\n const subgraphSchema = result.data.schema;\n return {\n id: parseInt(subgraphSchema.id),\n name: subgraphSchema.name,\n dialect: subgraphSchema.dialect as \"json\" | \"sqlite\",\n definitionUrl: subgraphSchema.definitionUrl,\n };\n }\n\n /**\n * Internal method: List schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.limit - Maximum number of schemas to return\n * @param params.offset - Number of schemas to skip\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to an array of schemas\n * @private\n */\n private async _listSchemasViaSubgraph(params: {\n limit: number;\n offset: number;\n subgraphUrl: string;\n }): Promise<Schema[]> {\n const { limit, offset, subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(ListSchemasDocument),\n variables: { first: limit, skip: offset },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: ListSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n if (!result.data?.schemas) {\n return [];\n }\n\n // Map subgraph schemas to SDK schema type\n const schemas = result.data.schemas.map((schema) => ({\n id: parseInt(schema.id),\n name: schema.name,\n dialect: schema.dialect as \"json\" | \"sqlite\",\n definitionUrl: schema.definitionUrl,\n }));\n\n // Optionally fetch definitions if requested\n const { includeDefinitions } = params as { includeDefinitions?: boolean };\n if (includeDefinitions) {\n await this._fetchDefinitionsForSchemas(schemas);\n }\n\n return schemas;\n }\n\n /**\n * Internal method: Count schemas via subgraph\n *\n * @param params - Query parameters\n * @param params.subgraphUrl - The subgraph URL to query\n * @returns Promise resolving to the total schema count\n * @private\n */\n private async _countSchemasViaSubgraph(params: {\n subgraphUrl: string;\n }): Promise<number> {\n const { subgraphUrl } = params;\n\n const response = await fetch(subgraphUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: print(CountSchemasDocument),\n variables: {},\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n data?: CountSchemasQuery;\n errors?: { message: string }[];\n };\n\n if (result.errors) {\n throw new Error(\n `Subgraph query errors: ${result.errors.map((e) => e.message).join(\", \")}`,\n );\n }\n\n return result.data?.schemas?.length ?? 0;\n }\n\n /**\n * Gets the user's wallet address.\n *\n * @private\n * @returns Promise resolving to the user's address\n */\n\n /**\n * Fetches and attaches definitions to an array of schemas.\n *\n * @param schemas - Array of schemas to fetch definitions for\n * @private\n */\n private async _fetchDefinitionsForSchemas(schemas: Schema[]): Promise<void> {\n // Fetch definitions concurrently for performance\n await Promise.all(\n schemas.map(async (schema) => {\n if (!schema.definitionUrl) return;\n\n try {\n const definition = await fetchFromUrl(\n schema.definitionUrl,\n this.context.downloadRelayer,\n );\n\n if (definition && typeof definition === \"object\") {\n // Validate the fetched DataSchema\n validateDataSchemaAgainstMetaSchema(definition);\n const dataSchema = definition as DataSchema;\n\n // Populate flat fields\n schema.version = dataSchema.version;\n schema.description = dataSchema.description;\n schema.schema = dataSchema.schema;\n }\n } catch (error) {\n // Don't fail the entire list operation if one definition fails\n console.error(\n `Failed to fetch/validate definition for schema ${schema.id}:`,\n error instanceof UrlResolutionError ||\n error instanceof SchemaValidationError\n ? error.message\n : error,\n );\n }\n }),\n );\n }\n}\n"],"mappings":"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","names":[]}