@opendatalabs/vana-sdk 0.1.0-alpha.ffe4659 → 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 (907) hide show
  1. package/README.md +13 -4
  2. package/dist/__tests__/waitForTransactionEvents.test.d.ts +1 -0
  3. package/dist/browser.cjs +29 -0
  4. package/dist/browser.cjs.map +1 -0
  5. package/dist/browser.d.ts +36 -1
  6. package/dist/browser.js +1 -305
  7. package/dist/browser.js.map +1 -1
  8. package/dist/{chains.browser.cjs → chains/definitions.cjs} +16 -17
  9. package/dist/chains/definitions.cjs.map +1 -0
  10. package/dist/{chains.browser.d.cts → chains/definitions.d.ts} +9 -11
  11. package/dist/chains/definitions.js +67 -0
  12. package/dist/chains/definitions.js.map +1 -0
  13. package/dist/chains/index.cjs +37 -0
  14. package/dist/chains/index.cjs.map +1 -0
  15. package/dist/chains/index.d.ts +34 -0
  16. package/dist/chains/index.js +15 -0
  17. package/dist/chains/index.js.map +1 -0
  18. package/dist/chains.browser.d.ts +5 -50
  19. package/dist/chains.browser.js +7 -57
  20. package/dist/chains.browser.js.map +1 -1
  21. package/dist/chains.cjs +6 -65
  22. package/dist/chains.cjs.map +1 -1
  23. package/dist/chains.d.ts +8 -2
  24. package/dist/chains.js +7 -57
  25. package/dist/chains.js.map +1 -1
  26. package/dist/chains.node.cjs +6 -65
  27. package/dist/chains.node.cjs.map +1 -1
  28. package/dist/chains.node.d.ts +8 -2
  29. package/dist/chains.node.js +7 -57
  30. package/dist/chains.node.js.map +1 -1
  31. package/dist/client/__tests__/enhancedResponse.test.d.ts +1 -0
  32. package/dist/client/enhancedResponse.cjs +164 -0
  33. package/dist/client/enhancedResponse.cjs.map +1 -0
  34. package/dist/client/enhancedResponse.d.ts +120 -0
  35. package/dist/client/enhancedResponse.js +138 -0
  36. package/dist/client/enhancedResponse.js.map +1 -0
  37. package/dist/config/addresses.cjs +325 -0
  38. package/dist/config/addresses.cjs.map +1 -0
  39. package/dist/config/addresses.d.ts +364 -0
  40. package/dist/config/addresses.js +295 -0
  41. package/dist/config/addresses.js.map +1 -0
  42. package/dist/config/chains.cjs +93 -0
  43. package/dist/config/chains.cjs.map +1 -0
  44. package/dist/config/chains.d.ts +180 -0
  45. package/dist/config/chains.js +67 -0
  46. package/dist/config/chains.js.map +1 -0
  47. package/dist/config/default-services.cjs +60 -0
  48. package/dist/config/default-services.cjs.map +1 -0
  49. package/dist/config/default-services.d.ts +46 -0
  50. package/dist/config/default-services.js +33 -0
  51. package/dist/config/default-services.js.map +1 -0
  52. package/dist/config/default-services.test.d.ts +1 -0
  53. package/dist/config/features.cjs +52 -0
  54. package/dist/config/features.cjs.map +1 -0
  55. package/dist/config/features.d.ts +62 -0
  56. package/dist/config/features.js +28 -0
  57. package/dist/config/features.js.map +1 -0
  58. package/dist/config/tests/addresses.test.d.ts +1 -0
  59. package/dist/contracts/contractController.cjs +126 -0
  60. package/dist/contracts/contractController.cjs.map +1 -0
  61. package/dist/contracts/contractController.d.ts +135 -0
  62. package/dist/contracts/contractController.js +100 -0
  63. package/dist/contracts/contractController.js.map +1 -0
  64. package/dist/contracts/tests/contractController.test.d.ts +1 -0
  65. package/dist/controllers/__tests__/data-consistency-integration.test.d.ts +7 -0
  66. package/dist/controllers/__tests__/operations.processQueue.test.d.ts +1 -0
  67. package/dist/controllers/__tests__/schemas-edge-cases.test.d.ts +1 -0
  68. package/dist/controllers/base.cjs +116 -0
  69. package/dist/controllers/base.cjs.map +1 -0
  70. package/dist/controllers/base.d.ts +94 -0
  71. package/dist/controllers/base.js +92 -0
  72. package/dist/controllers/base.js.map +1 -0
  73. package/dist/controllers/data-error-handling.test.d.ts +1 -0
  74. package/dist/controllers/data.cjs +2633 -0
  75. package/dist/controllers/data.cjs.map +1 -0
  76. package/dist/controllers/data.d.ts +1067 -0
  77. package/dist/controllers/data.js +2626 -0
  78. package/dist/controllers/data.js.map +1 -0
  79. package/dist/controllers/operations.cjs +430 -0
  80. package/dist/controllers/operations.cjs.map +1 -0
  81. package/dist/controllers/operations.d.ts +229 -0
  82. package/dist/controllers/operations.js +406 -0
  83. package/dist/controllers/operations.js.map +1 -0
  84. package/dist/controllers/permissions.cjs +4363 -0
  85. package/dist/controllers/permissions.cjs.map +1 -0
  86. package/dist/controllers/permissions.d.ts +1411 -0
  87. package/dist/controllers/permissions.js +4339 -0
  88. package/dist/controllers/permissions.js.map +1 -0
  89. package/dist/controllers/protocol.cjs +183 -0
  90. package/dist/controllers/protocol.cjs.map +1 -0
  91. package/dist/controllers/protocol.d.ts +138 -0
  92. package/dist/controllers/protocol.js +163 -0
  93. package/dist/controllers/protocol.js.map +1 -0
  94. package/dist/controllers/schemas.cjs +678 -0
  95. package/dist/controllers/schemas.cjs.map +1 -0
  96. package/dist/controllers/schemas.d.ts +293 -0
  97. package/dist/controllers/schemas.js +654 -0
  98. package/dist/controllers/schemas.js.map +1 -0
  99. package/dist/controllers/server-additional.test.d.ts +1 -0
  100. package/dist/controllers/server.cjs +643 -0
  101. package/dist/controllers/server.cjs.map +1 -0
  102. package/dist/controllers/server.d.ts +322 -0
  103. package/dist/controllers/server.js +624 -0
  104. package/dist/controllers/server.js.map +1 -0
  105. package/dist/core/__tests__/health.test.d.ts +1 -0
  106. package/dist/core/__tests__/inMemoryNonceManager.test.d.ts +1 -0
  107. package/dist/core/__tests__/nonceManager.test.d.ts +1 -0
  108. package/dist/core/__tests__/pollingManager.test.d.ts +4 -0
  109. package/dist/core/apiClient.cjs +378 -0
  110. package/dist/core/apiClient.cjs.map +1 -0
  111. package/dist/core/apiClient.d.ts +286 -0
  112. package/dist/core/apiClient.js +359 -0
  113. package/dist/core/apiClient.js.map +1 -0
  114. package/dist/core/client.cjs +70 -0
  115. package/dist/core/client.cjs.map +1 -0
  116. package/dist/core/client.d.ts +89 -0
  117. package/dist/core/client.js +47 -0
  118. package/dist/core/client.js.map +1 -0
  119. package/dist/core/core.test.d.ts +1 -0
  120. package/dist/core/generics.cjs +417 -0
  121. package/dist/core/generics.cjs.map +1 -0
  122. package/dist/core/generics.d.ts +205 -0
  123. package/dist/core/generics.js +386 -0
  124. package/dist/core/generics.js.map +1 -0
  125. package/dist/core/health.cjs +289 -0
  126. package/dist/core/health.cjs.map +1 -0
  127. package/dist/core/health.d.ts +143 -0
  128. package/dist/core/health.js +265 -0
  129. package/dist/core/health.js.map +1 -0
  130. package/dist/core/inMemoryNonceManager.cjs +138 -0
  131. package/dist/core/inMemoryNonceManager.cjs.map +1 -0
  132. package/dist/core/inMemoryNonceManager.d.ts +69 -0
  133. package/dist/core/inMemoryNonceManager.js +114 -0
  134. package/dist/core/inMemoryNonceManager.js.map +1 -0
  135. package/dist/core/nonceManager.cjs +304 -0
  136. package/dist/core/nonceManager.cjs.map +1 -0
  137. package/dist/core/nonceManager.d.ts +116 -0
  138. package/dist/core/nonceManager.js +280 -0
  139. package/dist/core/nonceManager.js.map +1 -0
  140. package/dist/core/pollingManager.cjs +292 -0
  141. package/dist/core/pollingManager.cjs.map +1 -0
  142. package/dist/core/pollingManager.d.ts +120 -0
  143. package/dist/core/pollingManager.js +268 -0
  144. package/dist/core/pollingManager.js.map +1 -0
  145. package/dist/core/tests/apiClient.test.d.ts +1 -0
  146. package/dist/core/tests/client.test.d.ts +1 -0
  147. package/dist/core/tests/generics.test.d.ts +1 -0
  148. package/dist/core.cjs +777 -0
  149. package/dist/core.cjs.map +1 -0
  150. package/dist/core.d.ts +493 -0
  151. package/dist/core.js +752 -0
  152. package/dist/core.js.map +1 -0
  153. package/dist/crypto/ecies/__tests__/base.test.d.ts +4 -0
  154. package/dist/crypto/ecies/__tests__/compatibility.test.d.ts +8 -0
  155. package/dist/crypto/ecies/__tests__/constants.test.d.ts +4 -0
  156. package/dist/crypto/ecies/__tests__/native-parity.test.d.ts +7 -0
  157. package/dist/crypto/ecies/__tests__/normalization.test.d.ts +1 -0
  158. package/dist/crypto/ecies/__tests__/test-vectors.cjs +102 -0
  159. package/dist/crypto/ecies/__tests__/test-vectors.cjs.map +1 -0
  160. package/dist/crypto/ecies/__tests__/test-vectors.d.ts +38 -0
  161. package/dist/crypto/ecies/__tests__/test-vectors.js +77 -0
  162. package/dist/crypto/ecies/__tests__/test-vectors.js.map +1 -0
  163. package/dist/crypto/ecies/base.cjs +245 -0
  164. package/dist/crypto/ecies/base.cjs.map +1 -0
  165. package/dist/crypto/ecies/base.d.ts +140 -0
  166. package/dist/crypto/ecies/base.js +221 -0
  167. package/dist/crypto/ecies/base.js.map +1 -0
  168. package/dist/crypto/ecies/browser.cjs +165 -0
  169. package/dist/crypto/ecies/browser.cjs.map +1 -0
  170. package/dist/crypto/ecies/browser.d.ts +43 -0
  171. package/dist/crypto/ecies/browser.js +131 -0
  172. package/dist/crypto/ecies/browser.js.map +1 -0
  173. package/dist/crypto/ecies/constants.cjs +131 -0
  174. package/dist/crypto/ecies/constants.cjs.map +1 -0
  175. package/dist/crypto/ecies/constants.d.ts +120 -0
  176. package/dist/crypto/ecies/constants.js +101 -0
  177. package/dist/crypto/ecies/constants.js.map +1 -0
  178. package/dist/crypto/ecies/index.cjs +35 -0
  179. package/dist/crypto/ecies/index.cjs.map +1 -0
  180. package/dist/crypto/ecies/index.d.ts +8 -0
  181. package/dist/crypto/ecies/index.js +13 -0
  182. package/dist/crypto/ecies/index.js.map +1 -0
  183. package/dist/crypto/ecies/interface.cjs +87 -0
  184. package/dist/crypto/ecies/interface.cjs.map +1 -0
  185. package/dist/crypto/ecies/interface.d.ts +174 -0
  186. package/dist/crypto/ecies/interface.js +60 -0
  187. package/dist/crypto/ecies/interface.js.map +1 -0
  188. package/dist/crypto/ecies/node.cjs +167 -0
  189. package/dist/crypto/ecies/node.cjs.map +1 -0
  190. package/dist/crypto/ecies/node.d.ts +45 -0
  191. package/dist/crypto/ecies/node.js +139 -0
  192. package/dist/crypto/ecies/node.js.map +1 -0
  193. package/dist/crypto/ecies/test-vectors/eccrypto-vectors.json +72 -0
  194. package/dist/crypto/ecies/utils.cjs +52 -0
  195. package/dist/crypto/ecies/utils.cjs.map +1 -0
  196. package/dist/crypto/ecies/utils.d.ts +30 -0
  197. package/dist/crypto/ecies/utils.js +26 -0
  198. package/dist/crypto/ecies/utils.js.map +1 -0
  199. package/dist/crypto/services/WalletKeyEncryptionService.cjs +128 -0
  200. package/dist/crypto/services/WalletKeyEncryptionService.cjs.map +1 -0
  201. package/dist/crypto/services/WalletKeyEncryptionService.d.ts +88 -0
  202. package/dist/crypto/services/WalletKeyEncryptionService.js +108 -0
  203. package/dist/crypto/services/WalletKeyEncryptionService.js.map +1 -0
  204. package/dist/crypto/services/WalletKeyEncryptionService.test.d.ts +1 -0
  205. package/dist/diagnostics.cjs +37 -0
  206. package/dist/diagnostics.cjs.map +1 -0
  207. package/dist/diagnostics.d.ts +24 -0
  208. package/dist/diagnostics.js +13 -0
  209. package/dist/diagnostics.js.map +1 -0
  210. package/dist/diagnostics.test.d.ts +1 -0
  211. package/dist/errors.cjs +186 -0
  212. package/dist/errors.cjs.map +1 -0
  213. package/dist/errors.d.ts +452 -0
  214. package/dist/errors.js +148 -0
  215. package/dist/errors.js.map +1 -0
  216. package/dist/generated/abi/ComputeEngineImplementation.cjs +1313 -0
  217. package/dist/generated/abi/ComputeEngineImplementation.cjs.map +1 -0
  218. package/dist/generated/abi/ComputeEngineImplementation.d.ts +995 -0
  219. package/dist/generated/abi/ComputeEngineImplementation.js +1289 -0
  220. package/dist/generated/abi/ComputeEngineImplementation.js.map +1 -0
  221. package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs +734 -0
  222. package/dist/generated/abi/ComputeInstructionRegistryImplementation.cjs.map +1 -0
  223. package/dist/generated/abi/ComputeInstructionRegistryImplementation.d.ts +544 -0
  224. package/dist/generated/abi/ComputeInstructionRegistryImplementation.js +710 -0
  225. package/dist/generated/abi/ComputeInstructionRegistryImplementation.js.map +1 -0
  226. package/dist/generated/abi/DATFactoryImplementation.cjs +882 -0
  227. package/dist/generated/abi/DATFactoryImplementation.cjs.map +1 -0
  228. package/dist/generated/abi/DATFactoryImplementation.d.ts +660 -0
  229. package/dist/generated/abi/DATFactoryImplementation.js +858 -0
  230. package/dist/generated/abi/DATFactoryImplementation.js.map +1 -0
  231. package/dist/generated/abi/DATImplementation.cjs +934 -0
  232. package/dist/generated/abi/DATImplementation.cjs.map +1 -0
  233. package/dist/generated/abi/DATImplementation.d.ts +692 -0
  234. package/dist/generated/abi/DATImplementation.js +910 -0
  235. package/dist/generated/abi/DATImplementation.js.map +1 -0
  236. package/dist/generated/abi/DATPausableImplementation.cjs +1523 -0
  237. package/dist/generated/abi/DATPausableImplementation.cjs.map +1 -0
  238. package/dist/generated/abi/DATPausableImplementation.d.ts +1144 -0
  239. package/dist/generated/abi/DATPausableImplementation.js +1499 -0
  240. package/dist/generated/abi/DATPausableImplementation.js.map +1 -0
  241. package/dist/generated/abi/DATVotesImplementation.cjs +1460 -0
  242. package/dist/generated/abi/DATVotesImplementation.cjs.map +1 -0
  243. package/dist/generated/abi/DATVotesImplementation.d.ts +1094 -0
  244. package/dist/generated/abi/DATVotesImplementation.js +1436 -0
  245. package/dist/generated/abi/DATVotesImplementation.js.map +1 -0
  246. package/dist/generated/abi/DLPPerformanceImplementation.cjs +1202 -0
  247. package/dist/generated/abi/DLPPerformanceImplementation.cjs.map +1 -0
  248. package/dist/generated/abi/DLPPerformanceImplementation.d.ts +914 -0
  249. package/dist/generated/abi/DLPPerformanceImplementation.js +1178 -0
  250. package/dist/generated/abi/DLPPerformanceImplementation.js.map +1 -0
  251. package/dist/generated/abi/DLPRegistryImplementation.cjs +1469 -0
  252. package/dist/generated/abi/DLPRegistryImplementation.cjs.map +1 -0
  253. package/dist/generated/abi/DLPRegistryImplementation.d.ts +1122 -0
  254. package/dist/generated/abi/DLPRegistryImplementation.js +1445 -0
  255. package/dist/generated/abi/DLPRegistryImplementation.js.map +1 -0
  256. package/dist/generated/abi/DLPRegistryTreasuryImplementation.cjs +612 -0
  257. package/dist/generated/abi/DLPRegistryTreasuryImplementation.cjs.map +1 -0
  258. package/dist/generated/abi/DLPRegistryTreasuryImplementation.d.ts +451 -0
  259. package/dist/generated/abi/DLPRegistryTreasuryImplementation.js +588 -0
  260. package/dist/generated/abi/DLPRegistryTreasuryImplementation.js.map +1 -0
  261. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs +1112 -0
  262. package/dist/generated/abi/DLPRewardDeployerImplementation.cjs.map +1 -0
  263. package/dist/generated/abi/DLPRewardDeployerImplementation.d.ts +840 -0
  264. package/dist/generated/abi/DLPRewardDeployerImplementation.js +1088 -0
  265. package/dist/generated/abi/DLPRewardDeployerImplementation.js.map +1 -0
  266. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs +612 -0
  267. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.cjs.map +1 -0
  268. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.d.ts +451 -0
  269. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js +588 -0
  270. package/dist/generated/abi/DLPRewardDeployerTreasuryImplementation.js.map +1 -0
  271. package/dist/generated/abi/DLPRewardSwapImplementation.cjs +939 -0
  272. package/dist/generated/abi/DLPRewardSwapImplementation.cjs.map +1 -0
  273. package/dist/generated/abi/DLPRewardSwapImplementation.d.ts +705 -0
  274. package/dist/generated/abi/DLPRewardSwapImplementation.js +915 -0
  275. package/dist/generated/abi/DLPRewardSwapImplementation.js.map +1 -0
  276. package/dist/generated/abi/DLPRootImplementation.cjs +1644 -0
  277. package/dist/generated/abi/DLPRootImplementation.cjs.map +1 -0
  278. package/dist/generated/abi/DLPRootImplementation.d.ts +1246 -0
  279. package/dist/generated/abi/DLPRootImplementation.js +1620 -0
  280. package/dist/generated/abi/DLPRootImplementation.js.map +1 -0
  281. package/dist/generated/abi/DLPTreasuryImplementation.cjs +612 -0
  282. package/dist/generated/abi/DLPTreasuryImplementation.cjs.map +1 -0
  283. package/dist/generated/abi/DLPTreasuryImplementation.d.ts +451 -0
  284. package/dist/generated/abi/DLPTreasuryImplementation.js +588 -0
  285. package/dist/generated/abi/DLPTreasuryImplementation.js.map +1 -0
  286. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs +985 -0
  287. package/dist/generated/abi/DataLiquidityPoolImplementation.cjs.map +1 -0
  288. package/dist/generated/abi/DataLiquidityPoolImplementation.d.ts +735 -0
  289. package/dist/generated/abi/DataLiquidityPoolImplementation.js +961 -0
  290. package/dist/generated/abi/DataLiquidityPoolImplementation.js.map +1 -0
  291. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs +1036 -0
  292. package/dist/generated/abi/DataPortabilityGranteesImplementation.cjs.map +1 -0
  293. package/dist/generated/abi/DataPortabilityGranteesImplementation.d.ts +773 -0
  294. package/dist/generated/abi/DataPortabilityGranteesImplementation.js +1012 -0
  295. package/dist/generated/abi/DataPortabilityGranteesImplementation.js.map +1 -0
  296. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs +1298 -0
  297. package/dist/generated/abi/DataPortabilityPermissionsImplementation.cjs.map +1 -0
  298. package/dist/generated/abi/DataPortabilityPermissionsImplementation.d.ts +974 -0
  299. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js +1274 -0
  300. package/dist/generated/abi/DataPortabilityPermissionsImplementation.js.map +1 -0
  301. package/dist/generated/abi/DataPortabilityServersImplementation.cjs +1419 -0
  302. package/dist/generated/abi/DataPortabilityServersImplementation.cjs.map +1 -0
  303. package/dist/generated/abi/DataPortabilityServersImplementation.d.ts +1071 -0
  304. package/dist/generated/abi/DataPortabilityServersImplementation.js +1395 -0
  305. package/dist/generated/abi/DataPortabilityServersImplementation.js.map +1 -0
  306. package/dist/generated/abi/DataRefinerRegistryImplementation.cjs +984 -0
  307. package/dist/generated/abi/DataRefinerRegistryImplementation.cjs.map +1 -0
  308. package/dist/generated/abi/DataRefinerRegistryImplementation.d.ts +736 -0
  309. package/dist/generated/abi/DataRefinerRegistryImplementation.js +960 -0
  310. package/dist/generated/abi/DataRefinerRegistryImplementation.js.map +1 -0
  311. package/dist/generated/abi/DataRegistryImplementation.cjs +1328 -0
  312. package/dist/generated/abi/DataRegistryImplementation.cjs.map +1 -0
  313. package/dist/generated/abi/DataRegistryImplementation.d.ts +1003 -0
  314. package/dist/generated/abi/DataRegistryImplementation.js +1304 -0
  315. package/dist/generated/abi/DataRegistryImplementation.js.map +1 -0
  316. package/dist/generated/abi/QueryEngineImplementation.cjs +1319 -0
  317. package/dist/generated/abi/QueryEngineImplementation.cjs.map +1 -0
  318. package/dist/generated/abi/QueryEngineImplementation.d.ts +1000 -0
  319. package/dist/generated/abi/QueryEngineImplementation.js +1295 -0
  320. package/dist/generated/abi/QueryEngineImplementation.js.map +1 -0
  321. package/dist/generated/abi/SwapHelperImplementation.cjs +976 -0
  322. package/dist/generated/abi/SwapHelperImplementation.cjs.map +1 -0
  323. package/dist/generated/abi/SwapHelperImplementation.d.ts +728 -0
  324. package/dist/generated/abi/SwapHelperImplementation.js +952 -0
  325. package/dist/generated/abi/SwapHelperImplementation.js.map +1 -0
  326. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.cjs +936 -0
  327. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.cjs.map +1 -0
  328. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.d.ts +700 -0
  329. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.js +912 -0
  330. package/dist/generated/abi/TeePoolDedicatedGpuImplementation.js.map +1 -0
  331. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.cjs +936 -0
  332. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.cjs.map +1 -0
  333. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.d.ts +700 -0
  334. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.js +912 -0
  335. package/dist/generated/abi/TeePoolDedicatedStandardImplementation.js.map +1 -0
  336. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.cjs +936 -0
  337. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.cjs.map +1 -0
  338. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.d.ts +700 -0
  339. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.js +912 -0
  340. package/dist/generated/abi/TeePoolEphemeralStandardImplementation.js.map +1 -0
  341. package/dist/generated/abi/TeePoolImplementation.cjs +1313 -0
  342. package/dist/generated/abi/TeePoolImplementation.cjs.map +1 -0
  343. package/dist/generated/abi/TeePoolImplementation.d.ts +992 -0
  344. package/dist/generated/abi/TeePoolImplementation.js +1289 -0
  345. package/dist/generated/abi/TeePoolImplementation.js.map +1 -0
  346. package/dist/generated/abi/TeePoolPersistentGpuImplementation.cjs +936 -0
  347. package/dist/generated/abi/TeePoolPersistentGpuImplementation.cjs.map +1 -0
  348. package/dist/generated/abi/TeePoolPersistentGpuImplementation.d.ts +700 -0
  349. package/dist/generated/abi/TeePoolPersistentGpuImplementation.js +912 -0
  350. package/dist/generated/abi/TeePoolPersistentGpuImplementation.js.map +1 -0
  351. package/dist/generated/abi/TeePoolPersistentStandardImplementation.cjs +936 -0
  352. package/dist/generated/abi/TeePoolPersistentStandardImplementation.cjs.map +1 -0
  353. package/dist/generated/abi/TeePoolPersistentStandardImplementation.d.ts +700 -0
  354. package/dist/generated/abi/TeePoolPersistentStandardImplementation.js +912 -0
  355. package/dist/generated/abi/TeePoolPersistentStandardImplementation.js.map +1 -0
  356. package/dist/generated/abi/TeePoolPhalaImplementation.cjs +1313 -0
  357. package/dist/generated/abi/TeePoolPhalaImplementation.cjs.map +1 -0
  358. package/dist/generated/abi/TeePoolPhalaImplementation.d.ts +992 -0
  359. package/dist/generated/abi/TeePoolPhalaImplementation.js +1289 -0
  360. package/dist/generated/abi/TeePoolPhalaImplementation.js.map +1 -0
  361. package/dist/generated/abi/VanaEpochImplementation.cjs +1383 -0
  362. package/dist/generated/abi/VanaEpochImplementation.cjs.map +1 -0
  363. package/dist/generated/abi/VanaEpochImplementation.d.ts +1050 -0
  364. package/dist/generated/abi/VanaEpochImplementation.js +1359 -0
  365. package/dist/generated/abi/VanaEpochImplementation.js.map +1 -0
  366. package/dist/generated/abi/VanaPoolEntityImplementation.cjs +1191 -0
  367. package/dist/generated/abi/VanaPoolEntityImplementation.cjs.map +1 -0
  368. package/dist/generated/abi/VanaPoolEntityImplementation.d.ts +899 -0
  369. package/dist/generated/abi/VanaPoolEntityImplementation.js +1167 -0
  370. package/dist/generated/abi/VanaPoolEntityImplementation.js.map +1 -0
  371. package/dist/generated/abi/VanaPoolStakingImplementation.cjs +1033 -0
  372. package/dist/generated/abi/VanaPoolStakingImplementation.cjs.map +1 -0
  373. package/dist/generated/abi/VanaPoolStakingImplementation.d.ts +776 -0
  374. package/dist/generated/abi/VanaPoolStakingImplementation.js +1009 -0
  375. package/dist/generated/abi/VanaPoolStakingImplementation.js.map +1 -0
  376. package/dist/generated/abi/VanaPoolTreasuryImplementation.cjs +538 -0
  377. package/dist/generated/abi/VanaPoolTreasuryImplementation.cjs.map +1 -0
  378. package/dist/generated/abi/VanaPoolTreasuryImplementation.d.ts +393 -0
  379. package/dist/generated/abi/VanaPoolTreasuryImplementation.js +514 -0
  380. package/dist/generated/abi/VanaPoolTreasuryImplementation.js.map +1 -0
  381. package/dist/generated/abi/index.cjs +177 -0
  382. package/dist/generated/abi/index.cjs.map +1 -0
  383. package/dist/{index.node.d.cts → generated/abi/index.d.ts} +26941 -37486
  384. package/dist/generated/abi/index.js +120 -0
  385. package/dist/generated/abi/index.js.map +1 -0
  386. package/dist/generated/event-types.cjs +17 -0
  387. package/dist/generated/event-types.cjs.map +1 -0
  388. package/dist/generated/event-types.d.ts +860 -0
  389. package/dist/generated/event-types.js +1 -0
  390. package/dist/generated/event-types.js.map +1 -0
  391. package/dist/generated/eventRegistry.cjs +3375 -0
  392. package/dist/generated/eventRegistry.cjs.map +1 -0
  393. package/dist/generated/eventRegistry.d.ts +14 -0
  394. package/dist/generated/eventRegistry.js +3350 -0
  395. package/dist/generated/eventRegistry.js.map +1 -0
  396. package/dist/generated/server/server-exports.cjs +45 -0
  397. package/dist/generated/server/server-exports.cjs.map +1 -0
  398. package/dist/generated/server/server-exports.d.ts +36 -0
  399. package/dist/generated/server/server-exports.js +19 -0
  400. package/dist/generated/server/server-exports.js.map +1 -0
  401. package/dist/generated/server/server.cjs +17 -0
  402. package/dist/generated/server/server.cjs.map +1 -0
  403. package/dist/generated/server/server.d.ts +907 -0
  404. package/dist/generated/server/server.js +1 -0
  405. package/dist/generated/server/server.js.map +1 -0
  406. package/dist/generated/subgraph.cjs +1440 -0
  407. package/dist/generated/subgraph.cjs.map +1 -0
  408. package/dist/generated/subgraph.d.ts +6113 -0
  409. package/dist/generated/subgraph.js +1404 -0
  410. package/dist/generated/subgraph.js.map +1 -0
  411. package/dist/index.browser.d.ts +48 -37223
  412. package/dist/index.browser.js +86 -46352
  413. package/dist/index.browser.js.map +1 -1
  414. package/dist/index.cjs +5 -0
  415. package/dist/index.cjs.map +1 -0
  416. package/dist/index.d.ts +0 -0
  417. package/dist/index.js +4 -0
  418. package/dist/index.js.map +1 -0
  419. package/dist/index.node.cjs +123 -46839
  420. package/dist/index.node.cjs.map +1 -1
  421. package/dist/index.node.d.ts +92 -37358
  422. package/dist/index.node.js +103 -46726
  423. package/dist/index.node.js.map +1 -1
  424. package/dist/lib/__tests__/redisAtomicStore.test.d.ts +1 -0
  425. package/dist/lib/redisAtomicStore.cjs +201 -0
  426. package/dist/lib/redisAtomicStore.cjs.map +1 -0
  427. package/dist/lib/redisAtomicStore.d.ts +120 -0
  428. package/dist/lib/redisAtomicStore.js +177 -0
  429. package/dist/lib/redisAtomicStore.js.map +1 -0
  430. package/dist/node.cjs +2 -321
  431. package/dist/node.cjs.map +1 -1
  432. package/dist/node.d.ts +42 -1
  433. package/dist/node.js +1 -307
  434. package/dist/node.js.map +1 -1
  435. package/dist/platform/browser-only.cjs +37 -0
  436. package/dist/platform/browser-only.cjs.map +1 -0
  437. package/dist/platform/browser-only.d.ts +22 -0
  438. package/dist/platform/browser-only.js +12 -0
  439. package/dist/platform/browser-only.js.map +1 -0
  440. package/dist/platform/browser-only.test.d.ts +1 -0
  441. package/dist/platform/browser-safe.cjs +57 -0
  442. package/dist/platform/browser-safe.cjs.map +1 -0
  443. package/dist/platform/browser-safe.d.ts +29 -0
  444. package/dist/platform/browser-safe.js +31 -0
  445. package/dist/platform/browser-safe.js.map +1 -0
  446. package/dist/platform/browser-safe.test.d.ts +1 -0
  447. package/dist/platform/browser.cjs +488 -0
  448. package/dist/platform/browser.cjs.map +1 -0
  449. package/dist/platform/browser.d.ts +291 -0
  450. package/dist/platform/browser.js +454 -0
  451. package/dist/platform/browser.js.map +1 -0
  452. package/dist/platform/browser.test.d.ts +1 -0
  453. package/dist/platform/index.cjs +50 -0
  454. package/dist/platform/index.cjs.map +1 -0
  455. package/dist/platform/index.d.ts +11 -0
  456. package/dist/platform/index.js +27 -0
  457. package/dist/platform/index.js.map +1 -0
  458. package/dist/platform/interface.cjs +17 -0
  459. package/dist/platform/interface.cjs.map +1 -0
  460. package/dist/platform/interface.d.ts +409 -0
  461. package/dist/platform/interface.js +1 -0
  462. package/dist/platform/interface.js.map +1 -0
  463. package/dist/platform/node.cjs +512 -0
  464. package/dist/platform/node.cjs.map +1 -0
  465. package/dist/platform/node.d.ts +86 -0
  466. package/dist/platform/node.js +481 -0
  467. package/dist/platform/node.js.map +1 -0
  468. package/dist/platform/ports/openpgp-port.cjs +74 -0
  469. package/dist/platform/ports/openpgp-port.cjs.map +1 -0
  470. package/dist/platform/ports/openpgp-port.d.ts +13 -0
  471. package/dist/platform/ports/openpgp-port.js +59 -0
  472. package/dist/platform/ports/openpgp-port.js.map +1 -0
  473. package/dist/platform/ports/pgp-port.cjs +17 -0
  474. package/dist/platform/ports/pgp-port.cjs.map +1 -0
  475. package/dist/platform/ports/pgp-port.d.ts +35 -0
  476. package/dist/platform/ports/pgp-port.js +1 -0
  477. package/dist/platform/ports/pgp-port.js.map +1 -0
  478. package/dist/platform/shared/error-utils.cjs +43 -0
  479. package/dist/platform/shared/error-utils.cjs.map +1 -0
  480. package/dist/platform/shared/error-utils.d.ts +23 -0
  481. package/dist/platform/shared/error-utils.js +18 -0
  482. package/dist/platform/shared/error-utils.js.map +1 -0
  483. package/dist/platform/shared/pgp-utils.cjs +55 -0
  484. package/dist/platform/shared/pgp-utils.cjs.map +1 -0
  485. package/dist/platform/shared/pgp-utils.d.ts +59 -0
  486. package/dist/platform/shared/pgp-utils.js +29 -0
  487. package/dist/platform/shared/pgp-utils.js.map +1 -0
  488. package/dist/platform/shared/stream-utils.cjs +49 -0
  489. package/dist/platform/shared/stream-utils.cjs.map +1 -0
  490. package/dist/platform/shared/stream-utils.d.ts +14 -0
  491. package/dist/platform/shared/stream-utils.js +25 -0
  492. package/dist/platform/shared/stream-utils.js.map +1 -0
  493. package/dist/platform/utils.cjs +114 -0
  494. package/dist/platform/utils.cjs.map +1 -0
  495. package/dist/platform/utils.d.ts +49 -0
  496. package/dist/platform/utils.js +76 -0
  497. package/dist/platform/utils.js.map +1 -0
  498. package/dist/platform/utils.test.d.ts +1 -0
  499. package/dist/platform.browser.d.ts +6 -57
  500. package/dist/platform.browser.js +10 -379
  501. package/dist/platform.browser.js.map +1 -1
  502. package/dist/platform.cjs +14 -708
  503. package/dist/platform.cjs.map +1 -1
  504. package/dist/platform.d.ts +11 -2
  505. package/dist/platform.js +14 -694
  506. package/dist/platform.js.map +1 -1
  507. package/dist/platform.node.cjs +14 -708
  508. package/dist/platform.node.cjs.map +1 -1
  509. package/dist/platform.node.d.ts +7 -102
  510. package/dist/platform.node.js +14 -694
  511. package/dist/platform.node.js.map +1 -1
  512. package/dist/schemas/dataSchema.schema.json +53 -0
  513. package/dist/schemas/grantFile.schema.json +43 -0
  514. package/dist/server/relayerHandler.cjs +452 -0
  515. package/dist/server/relayerHandler.cjs.map +1 -0
  516. package/dist/server/relayerHandler.d.ts +69 -0
  517. package/dist/server/relayerHandler.js +428 -0
  518. package/dist/server/relayerHandler.js.map +1 -0
  519. package/dist/storage/index.cjs +47 -0
  520. package/dist/storage/index.cjs.map +1 -0
  521. package/dist/storage/index.d.ts +57 -0
  522. package/dist/storage/index.js +17 -0
  523. package/dist/storage/index.js.map +1 -0
  524. package/dist/storage/manager.cjs +272 -0
  525. package/dist/storage/manager.cjs.map +1 -0
  526. package/dist/storage/manager.d.ts +241 -0
  527. package/dist/storage/manager.js +248 -0
  528. package/dist/storage/manager.js.map +1 -0
  529. package/dist/storage/providers/callback-storage.cjs +248 -0
  530. package/dist/storage/providers/callback-storage.cjs.map +1 -0
  531. package/dist/storage/providers/callback-storage.d.ts +183 -0
  532. package/dist/storage/providers/callback-storage.js +226 -0
  533. package/dist/storage/providers/callback-storage.js.map +1 -0
  534. package/dist/storage/providers/dropbox.cjs +237 -0
  535. package/dist/storage/providers/dropbox.cjs.map +1 -0
  536. package/dist/storage/providers/dropbox.d.ts +39 -0
  537. package/dist/storage/providers/dropbox.js +215 -0
  538. package/dist/storage/providers/dropbox.js.map +1 -0
  539. package/dist/storage/providers/dropbox.test.d.ts +1 -0
  540. package/dist/storage/providers/google-drive.cjs +516 -0
  541. package/dist/storage/providers/google-drive.cjs.map +1 -0
  542. package/dist/storage/providers/google-drive.d.ts +152 -0
  543. package/dist/storage/providers/google-drive.js +494 -0
  544. package/dist/storage/providers/google-drive.js.map +1 -0
  545. package/dist/storage/providers/google-drive.test.d.ts +1 -0
  546. package/dist/storage/providers/ipfs.cjs +283 -0
  547. package/dist/storage/providers/ipfs.cjs.map +1 -0
  548. package/dist/storage/providers/ipfs.d.ts +160 -0
  549. package/dist/storage/providers/ipfs.js +261 -0
  550. package/dist/storage/providers/ipfs.js.map +1 -0
  551. package/dist/storage/providers/pinata.cjs +339 -0
  552. package/dist/storage/providers/pinata.cjs.map +1 -0
  553. package/dist/storage/providers/pinata.d.ts +168 -0
  554. package/dist/storage/providers/pinata.js +317 -0
  555. package/dist/storage/providers/pinata.js.map +1 -0
  556. package/dist/storage/tests/callbackStorage.test.d.ts +1 -0
  557. package/dist/storage/tests/googleDriveStorage.test.d.ts +1 -0
  558. package/dist/storage/tests/ipfsStorage.test.d.ts +1 -0
  559. package/dist/storage/tests/pinataStorage.test.d.ts +1 -0
  560. package/dist/storage/tests/storageManager.test.d.ts +1 -0
  561. package/dist/tests/abi.test.d.ts +1 -0
  562. package/dist/tests/chains-definitions.test.d.ts +1 -0
  563. package/dist/tests/core-encryption.test.d.ts +1 -0
  564. package/dist/tests/core-extended.test.d.ts +1 -0
  565. package/dist/tests/core-generics-coverage.test.d.ts +1 -0
  566. package/dist/tests/coverage-boost.test.d.ts +1 -0
  567. package/dist/tests/crypto-cross-platform-compatibility.test.d.ts +1 -0
  568. package/dist/tests/data-addfile-permissions-schema.test.d.ts +1 -0
  569. package/dist/tests/data-additional-methods.test.d.ts +1 -0
  570. package/dist/tests/data-controller-edge-cases.test.d.ts +1 -0
  571. package/dist/tests/data-ipfs-gateways.test.d.ts +1 -0
  572. package/dist/tests/data-relayer.test.d.ts +1 -0
  573. package/dist/tests/data-schema-validation.test.d.ts +1 -0
  574. package/dist/tests/data-simple-methods.test.d.ts +1 -0
  575. package/dist/tests/data-upload-owner-validation.test.d.ts +1 -0
  576. package/dist/tests/data.test.d.ts +1 -0
  577. package/dist/tests/demo-integration.test.d.ts +1 -0
  578. package/dist/tests/demo-trusted-server-integration.test.d.ts +1 -0
  579. package/dist/tests/download-relayer.test.d.ts +1 -0
  580. package/dist/tests/dual-mode-permissions.test.d.ts +1 -0
  581. package/dist/tests/dual-mode-trusted-servers.test.d.ts +1 -0
  582. package/dist/tests/encryption-correct-implementation.test.d.ts +1 -0
  583. package/dist/tests/encryption-coverage.test.d.ts +1 -0
  584. package/dist/tests/encryption-edge-cases.test.d.ts +1 -0
  585. package/dist/tests/encryption-utils-updated.test.d.ts +1 -0
  586. package/dist/tests/errors-coverage.test.d.ts +1 -0
  587. package/dist/tests/errors.test.d.ts +1 -0
  588. package/dist/tests/factories/mockFactory.d.ts +316 -0
  589. package/dist/tests/fakes/FakeStorageManager.d.ts +200 -0
  590. package/dist/tests/fakes/FakeStorageManager.test.d.ts +1 -0
  591. package/dist/tests/fakes/FakeWaitForTransactionEvents.d.ts +170 -0
  592. package/dist/tests/fakes/FakeWaitForTransactionEvents.test.d.ts +1 -0
  593. package/dist/tests/fakes/fake-pgp-port.d.ts +13 -0
  594. package/dist/tests/grantValidation-edge-cases.test.d.ts +1 -0
  595. package/dist/tests/grantValidation-unreachable-branch.test.d.ts +1 -0
  596. package/dist/tests/helper-methods.test.d.ts +1 -0
  597. package/dist/tests/helpers/platformTestHelpers.d.ts +106 -0
  598. package/dist/tests/helpers/typedMocks.d.ts +64 -0
  599. package/dist/tests/index-browser.test.d.ts +1 -0
  600. package/dist/tests/index-node.test.d.ts +1 -0
  601. package/dist/tests/index.test.d.ts +1 -0
  602. package/dist/tests/mocks/platformAdapter.d.ts +12 -0
  603. package/dist/tests/new-permissions-methods.test.d.ts +1 -0
  604. package/dist/tests/no-buffer-browser.test.d.ts +1 -0
  605. package/dist/tests/permissions-grantee.test.d.ts +1 -0
  606. package/dist/tests/permissions-revoke-relayer.test.d.ts +1 -0
  607. package/dist/tests/permissions-schema-validation.test.d.ts +1 -0
  608. package/dist/tests/permissions-server-files.test.d.ts +1 -0
  609. package/dist/tests/permissions-transaction-options.test.d.ts +1 -0
  610. package/dist/tests/permissions-trust-servers.test.d.ts +1 -0
  611. package/dist/tests/permissions.test.d.ts +1 -0
  612. package/dist/tests/personal.test.d.ts +1 -0
  613. package/dist/tests/platform-browser.test.d.ts +1 -0
  614. package/dist/tests/platform-crypto-expanded.test.d.ts +1 -0
  615. package/dist/tests/platform-crypto.test.d.ts +1 -0
  616. package/dist/tests/platform-index.test.d.ts +1 -0
  617. package/dist/tests/platform-node.test.d.ts +1 -0
  618. package/dist/tests/platform-shared-utils.test.d.ts +1 -0
  619. package/dist/tests/platform-updated.test.d.ts +1 -0
  620. package/dist/tests/protocol-additional-methods.test.d.ts +1 -0
  621. package/dist/tests/protocol.test.d.ts +1 -0
  622. package/dist/tests/read-only-mode.test.d.ts +1 -0
  623. package/dist/tests/relayer-integration.test.d.ts +1 -0
  624. package/dist/tests/relayer-unified.test.d.ts +1 -0
  625. package/dist/tests/schemas.test.d.ts +1 -0
  626. package/dist/tests/server-relayer-handler.test.d.ts +1 -0
  627. package/dist/tests/setup.d.ts +7 -0
  628. package/dist/tests/signatureFormatter.test.d.ts +1 -0
  629. package/dist/tests/trusted-server-queries.test.d.ts +1 -0
  630. package/dist/tests/typedDataConverter.test.d.ts +1 -0
  631. package/dist/tests/types-contracts.test.d.ts +1 -0
  632. package/dist/tests/types-data.test.d.ts +1 -0
  633. package/dist/tests/types-external-apis.test.d.ts +1 -0
  634. package/dist/tests/types-generics.test.d.ts +1 -0
  635. package/dist/tests/types-permissions.test.d.ts +1 -0
  636. package/dist/tests/types-upload-params.test.d.ts +1 -0
  637. package/dist/tests/types.test.d.ts +1 -0
  638. package/dist/tests/utils-formatters.test.d.ts +1 -0
  639. package/dist/tests/utils-grantFiles-edge-cases.test.d.ts +1 -0
  640. package/dist/tests/utils-grantFiles-validation.test.d.ts +1 -0
  641. package/dist/tests/utils-grantFiles.test.d.ts +1 -0
  642. package/dist/tests/utils-grantValidation-consolidated.test.d.ts +1 -0
  643. package/dist/tests/utils-grants.test.d.ts +1 -0
  644. package/dist/tests/utils-ipfs-additional.test.d.ts +1 -0
  645. package/dist/tests/utils-ipfs.test.d.ts +4 -0
  646. package/dist/tests/utils-schemaValidation.test.d.ts +1 -0
  647. package/dist/tests/vana.test.d.ts +1 -0
  648. package/dist/tests/wallet-crypto-compatibility.test.d.ts +1 -0
  649. package/dist/types/atomicStore.cjs +31 -0
  650. package/dist/types/atomicStore.cjs.map +1 -0
  651. package/dist/types/atomicStore.d.ts +236 -0
  652. package/dist/types/atomicStore.js +7 -0
  653. package/dist/types/atomicStore.js.map +1 -0
  654. package/dist/types/blockchain.cjs +17 -0
  655. package/dist/types/blockchain.cjs.map +1 -0
  656. package/dist/types/blockchain.d.ts +85 -0
  657. package/dist/types/blockchain.js +1 -0
  658. package/dist/types/blockchain.js.map +1 -0
  659. package/dist/types/chains-additional.test.d.ts +1 -0
  660. package/dist/types/chains.cjs +36 -0
  661. package/dist/types/chains.cjs.map +1 -0
  662. package/dist/types/chains.d.ts +98 -0
  663. package/dist/types/chains.js +11 -0
  664. package/dist/types/chains.js.map +1 -0
  665. package/dist/types/config.cjs +51 -0
  666. package/dist/types/config.cjs.map +1 -0
  667. package/dist/types/config.d.ts +720 -0
  668. package/dist/types/config.js +23 -0
  669. package/dist/types/config.js.map +1 -0
  670. package/dist/types/contracts.cjs +17 -0
  671. package/dist/types/contracts.cjs.map +1 -0
  672. package/dist/types/contracts.d.ts +129 -0
  673. package/dist/types/contracts.js +1 -0
  674. package/dist/types/contracts.js.map +1 -0
  675. package/dist/types/controller-context.cjs +17 -0
  676. package/dist/types/controller-context.cjs.map +1 -0
  677. package/dist/types/controller-context.d.ts +68 -0
  678. package/dist/types/controller-context.js +1 -0
  679. package/dist/types/controller-context.js.map +1 -0
  680. package/dist/types/data.cjs +17 -0
  681. package/dist/types/data.cjs.map +1 -0
  682. package/dist/types/data.d.ts +763 -0
  683. package/dist/types/data.js +1 -0
  684. package/dist/types/data.js.map +1 -0
  685. package/dist/types/eccrypto-js.d.cjs +2 -0
  686. package/dist/types/eccrypto-js.d.cjs.map +1 -0
  687. package/dist/types/eccrypto-js.d.js +1 -0
  688. package/dist/types/eccrypto-js.d.js.map +1 -0
  689. package/dist/types/external-apis.cjs +61 -0
  690. package/dist/types/external-apis.cjs.map +1 -0
  691. package/dist/types/external-apis.d.ts +184 -0
  692. package/dist/types/external-apis.js +34 -0
  693. package/dist/types/external-apis.js.map +1 -0
  694. package/dist/types/generics.cjs +17 -0
  695. package/dist/types/generics.cjs.map +1 -0
  696. package/dist/types/generics.d.ts +518 -0
  697. package/dist/types/generics.js +1 -0
  698. package/dist/types/generics.js.map +1 -0
  699. package/dist/types/index.cjs +65 -0
  700. package/dist/types/index.cjs.map +1 -0
  701. package/dist/types/index.d.ts +48 -0
  702. package/dist/types/index.js +42 -0
  703. package/dist/types/index.js.map +1 -0
  704. package/dist/types/operationStore.cjs +17 -0
  705. package/dist/types/operationStore.cjs.map +1 -0
  706. package/dist/types/operationStore.d.ts +171 -0
  707. package/dist/types/operationStore.js +1 -0
  708. package/dist/types/operationStore.js.map +1 -0
  709. package/dist/types/operations.cjs +53 -0
  710. package/dist/types/operations.cjs.map +1 -0
  711. package/dist/types/operations.d.ts +204 -0
  712. package/dist/types/operations.js +26 -0
  713. package/dist/types/operations.js.map +1 -0
  714. package/dist/types/options.cjs +17 -0
  715. package/dist/types/options.cjs.map +1 -0
  716. package/dist/types/options.d.ts +308 -0
  717. package/dist/types/options.js +1 -0
  718. package/dist/types/options.js.map +1 -0
  719. package/dist/types/permissions.cjs +17 -0
  720. package/dist/types/permissions.cjs.map +1 -0
  721. package/dist/types/permissions.d.ts +953 -0
  722. package/dist/types/permissions.js +1 -0
  723. package/dist/types/permissions.js.map +1 -0
  724. package/dist/types/personal.cjs +17 -0
  725. package/dist/types/personal.cjs.map +1 -0
  726. package/dist/types/personal.d.ts +174 -0
  727. package/dist/types/personal.js +1 -0
  728. package/dist/types/personal.js.map +1 -0
  729. package/dist/types/relayer.cjs +17 -0
  730. package/dist/types/relayer.cjs.map +1 -0
  731. package/dist/types/relayer.d.ts +552 -0
  732. package/dist/types/relayer.js +1 -0
  733. package/dist/types/relayer.js.map +1 -0
  734. package/dist/types/storage.cjs +39 -0
  735. package/dist/types/storage.cjs.map +1 -0
  736. package/dist/types/storage.d.ts +117 -0
  737. package/dist/types/storage.js +15 -0
  738. package/dist/types/storage.js.map +1 -0
  739. package/dist/types/transactionResults.cjs +17 -0
  740. package/dist/types/transactionResults.cjs.map +1 -0
  741. package/dist/types/transactionResults.d.ts +193 -0
  742. package/dist/types/transactionResults.js +1 -0
  743. package/dist/types/transactionResults.js.map +1 -0
  744. package/dist/types/utils.cjs +17 -0
  745. package/dist/types/utils.cjs.map +1 -0
  746. package/dist/types/utils.d.ts +771 -0
  747. package/dist/types/utils.js +1 -0
  748. package/dist/types/utils.js.map +1 -0
  749. package/dist/types.cjs +23 -0
  750. package/dist/types.cjs.map +1 -0
  751. package/dist/types.d.ts +30 -0
  752. package/dist/types.js +2 -0
  753. package/dist/types.js.map +1 -0
  754. package/dist/utils/__tests__/chainQuery.test.d.ts +1 -0
  755. package/dist/utils/__tests__/parseTransaction.test.d.ts +1 -0
  756. package/dist/utils/__tests__/pojo-serialization.test.d.ts +1 -0
  757. package/dist/utils/__tests__/signatureCache.test.d.ts +1 -0
  758. package/dist/utils/__tests__/subgraphConsistency.test.d.ts +4 -0
  759. package/dist/utils/__tests__/subgraphPagination.test.d.ts +4 -0
  760. package/dist/utils/__tests__/transaction-edge-cases.test.d.ts +1 -0
  761. package/dist/utils/__tests__/transactionHelpers.test.d.ts +1 -0
  762. package/dist/utils/__tests__/urlResolver.test.d.ts +4 -0
  763. package/dist/utils/blockchain/registry.cjs +81 -0
  764. package/dist/utils/blockchain/registry.cjs.map +1 -0
  765. package/dist/utils/blockchain/registry.d.ts +32 -0
  766. package/dist/utils/blockchain/registry.js +56 -0
  767. package/dist/utils/blockchain/registry.js.map +1 -0
  768. package/dist/utils/blockchain/registry.test.d.ts +1 -0
  769. package/dist/utils/chainQuery.cjs +107 -0
  770. package/dist/utils/chainQuery.cjs.map +1 -0
  771. package/dist/utils/chainQuery.d.ts +31 -0
  772. package/dist/utils/chainQuery.js +82 -0
  773. package/dist/utils/chainQuery.js.map +1 -0
  774. package/dist/utils/crypto-utils.cjs +108 -0
  775. package/dist/utils/crypto-utils.cjs.map +1 -0
  776. package/dist/utils/crypto-utils.d.ts +100 -0
  777. package/dist/utils/crypto-utils.js +76 -0
  778. package/dist/utils/crypto-utils.js.map +1 -0
  779. package/dist/utils/crypto-utils.test.d.ts +1 -0
  780. package/dist/utils/download.cjs +69 -0
  781. package/dist/utils/download.cjs.map +1 -0
  782. package/dist/utils/download.d.ts +40 -0
  783. package/dist/utils/download.js +45 -0
  784. package/dist/utils/download.js.map +1 -0
  785. package/dist/utils/encoding.cjs +66 -0
  786. package/dist/utils/encoding.cjs.map +1 -0
  787. package/dist/utils/encoding.d.ts +52 -0
  788. package/dist/utils/encoding.js +39 -0
  789. package/dist/utils/encoding.js.map +1 -0
  790. package/dist/utils/encoding.test.d.ts +1 -0
  791. package/dist/utils/encryption.cjs +176 -0
  792. package/dist/utils/encryption.cjs.map +1 -0
  793. package/dist/utils/encryption.d.ts +271 -0
  794. package/dist/utils/encryption.js +142 -0
  795. package/dist/utils/encryption.js.map +1 -0
  796. package/dist/utils/formatters.cjs +55 -0
  797. package/dist/utils/formatters.cjs.map +1 -0
  798. package/dist/utils/formatters.d.ts +118 -0
  799. package/dist/utils/formatters.js +28 -0
  800. package/dist/utils/formatters.js.map +1 -0
  801. package/dist/utils/grantFiles.cjs +181 -0
  802. package/dist/utils/grantFiles.cjs.map +1 -0
  803. package/dist/utils/grantFiles.d.ts +172 -0
  804. package/dist/utils/grantFiles.js +143 -0
  805. package/dist/utils/grantFiles.js.map +1 -0
  806. package/dist/utils/grantValidation.cjs +243 -0
  807. package/dist/utils/grantValidation.cjs.map +1 -0
  808. package/dist/utils/grantValidation.d.ts +226 -0
  809. package/dist/utils/grantValidation.js +201 -0
  810. package/dist/utils/grantValidation.js.map +1 -0
  811. package/dist/utils/grants.cjs +108 -0
  812. package/dist/utils/grants.cjs.map +1 -0
  813. package/dist/utils/grants.d.ts +148 -0
  814. package/dist/utils/grants.js +82 -0
  815. package/dist/utils/grants.js.map +1 -0
  816. package/dist/utils/ipfs.cjs +128 -0
  817. package/dist/utils/ipfs.cjs.map +1 -0
  818. package/dist/utils/ipfs.d.ts +88 -0
  819. package/dist/utils/ipfs.js +97 -0
  820. package/dist/utils/ipfs.js.map +1 -0
  821. package/dist/utils/lazy-import.cjs +38 -0
  822. package/dist/utils/lazy-import.cjs.map +1 -0
  823. package/dist/utils/lazy-import.d.ts +43 -0
  824. package/dist/utils/lazy-import.js +14 -0
  825. package/dist/utils/lazy-import.js.map +1 -0
  826. package/dist/utils/multicall.cjs +233 -0
  827. package/dist/utils/multicall.cjs.map +1 -0
  828. package/dist/utils/multicall.d.ts +126 -0
  829. package/dist/utils/multicall.js +208 -0
  830. package/dist/utils/multicall.js.map +1 -0
  831. package/dist/utils/parseTransactionPojo.cjs +87 -0
  832. package/dist/utils/parseTransactionPojo.cjs.map +1 -0
  833. package/dist/utils/parseTransactionPojo.d.ts +31 -0
  834. package/dist/utils/parseTransactionPojo.js +63 -0
  835. package/dist/utils/parseTransactionPojo.js.map +1 -0
  836. package/dist/utils/schemaValidation.cjs +258 -0
  837. package/dist/utils/schemaValidation.cjs.map +1 -0
  838. package/dist/utils/schemaValidation.d.ts +168 -0
  839. package/dist/utils/schemaValidation.js +219 -0
  840. package/dist/utils/schemaValidation.js.map +1 -0
  841. package/dist/utils/signatureCache.cjs +192 -0
  842. package/dist/utils/signatureCache.cjs.map +1 -0
  843. package/dist/utils/signatureCache.d.ts +172 -0
  844. package/dist/utils/signatureCache.js +167 -0
  845. package/dist/utils/signatureCache.js.map +1 -0
  846. package/dist/utils/signatureFormatter.cjs +42 -0
  847. package/dist/utils/signatureFormatter.cjs.map +1 -0
  848. package/dist/utils/signatureFormatter.d.ts +36 -0
  849. package/dist/utils/signatureFormatter.js +18 -0
  850. package/dist/utils/signatureFormatter.js.map +1 -0
  851. package/dist/utils/subgraphConsistency.cjs +184 -0
  852. package/dist/utils/subgraphConsistency.cjs.map +1 -0
  853. package/dist/utils/subgraphConsistency.d.ts +65 -0
  854. package/dist/utils/subgraphConsistency.js +155 -0
  855. package/dist/utils/subgraphConsistency.js.map +1 -0
  856. package/dist/utils/subgraphMetaCache.cjs +101 -0
  857. package/dist/utils/subgraphMetaCache.cjs.map +1 -0
  858. package/dist/utils/subgraphMetaCache.d.ts +56 -0
  859. package/dist/utils/subgraphMetaCache.js +76 -0
  860. package/dist/utils/subgraphMetaCache.js.map +1 -0
  861. package/dist/utils/subgraphPagination.cjs +104 -0
  862. package/dist/utils/subgraphPagination.cjs.map +1 -0
  863. package/dist/utils/subgraphPagination.d.ts +78 -0
  864. package/dist/utils/subgraphPagination.js +78 -0
  865. package/dist/utils/subgraphPagination.js.map +1 -0
  866. package/dist/utils/tests/multicall.test.d.ts +1 -0
  867. package/dist/utils/transactionHelpers.cjs +54 -0
  868. package/dist/utils/transactionHelpers.cjs.map +1 -0
  869. package/dist/utils/transactionHelpers.d.ts +80 -0
  870. package/dist/utils/transactionHelpers.js +29 -0
  871. package/dist/utils/transactionHelpers.js.map +1 -0
  872. package/dist/utils/typeGuards.cjs +109 -0
  873. package/dist/utils/typeGuards.cjs.map +1 -0
  874. package/dist/utils/typeGuards.d.ts +138 -0
  875. package/dist/utils/typeGuards.js +74 -0
  876. package/dist/utils/typeGuards.js.map +1 -0
  877. package/dist/utils/typedDataConverter.cjs +43 -0
  878. package/dist/utils/typedDataConverter.cjs.map +1 -0
  879. package/dist/utils/typedDataConverter.d.ts +46 -0
  880. package/dist/utils/typedDataConverter.js +19 -0
  881. package/dist/utils/typedDataConverter.js.map +1 -0
  882. package/dist/utils/urlResolver.cjs +62 -0
  883. package/dist/utils/urlResolver.cjs.map +1 -0
  884. package/dist/utils/urlResolver.d.ts +56 -0
  885. package/dist/utils/urlResolver.js +37 -0
  886. package/dist/utils/urlResolver.js.map +1 -0
  887. package/dist/utils/wallet.cjs +63 -0
  888. package/dist/utils/wallet.cjs.map +1 -0
  889. package/dist/utils/wallet.d.ts +94 -0
  890. package/dist/utils/wallet.js +37 -0
  891. package/dist/utils/wallet.js.map +1 -0
  892. package/dist/utils/withEvents.cjs +44 -0
  893. package/dist/utils/withEvents.cjs.map +1 -0
  894. package/dist/utils/withEvents.d.ts +56 -0
  895. package/dist/utils/withEvents.js +18 -0
  896. package/dist/utils/withEvents.js.map +1 -0
  897. package/package.json +63 -29
  898. package/dist/browser-DY8XDblx.d.ts +0 -241
  899. package/dist/chains.browser.cjs.map +0 -1
  900. package/dist/chains.d.cts +0 -2
  901. package/dist/chains.node.d.cts +0 -2
  902. package/dist/index.d.cts +0 -2
  903. package/dist/node-D9-F9uEP.d.cts +0 -238
  904. package/dist/node-D9-F9uEP.d.ts +0 -238
  905. package/dist/node.d.cts +0 -1
  906. package/dist/platform.d.cts +0 -2
  907. package/dist/platform.node.d.cts +0 -105
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/controllers/permissions.ts"],"sourcesContent":["import type { Address, Hash } from \"viem\";\nimport { getAddress } from \"viem\";\nimport type {\n TransactionOptions,\n TransactionResult,\n} from \"../types/operations\";\n\nimport { gasAwareMulticall } from \"../utils/multicall\";\nimport { PollingManager } from \"../core/pollingManager\";\nimport type {\n GrantPermissionParams,\n RevokePermissionParams,\n PermissionGrantTypedData,\n GenericTypedData,\n RevokePermissionTypedData,\n OnChainPermissionGrant,\n GetUserPermissionsOptions,\n AddAndTrustServerParams,\n TrustServerParams,\n UntrustServerParams,\n AddAndTrustServerInput,\n TrustServerInput,\n UntrustServerInput,\n AddAndTrustServerTypedData,\n TrustServerTypedData,\n UntrustServerTypedData,\n Server,\n TrustedServerInfo,\n PaginatedTrustedServers,\n TrustedServerQueryOptions,\n BatchServerInfoResult,\n ServerTrustStatus,\n GrantFile,\n Grantee,\n GranteeInfo,\n RegisterGranteeParams,\n GranteeQueryOptions,\n PaginatedGrantees,\n ServerInfo,\n ServerFilesAndPermissionParams,\n ServerFilesAndPermissionTypedData,\n Permission,\n} from \"../types/index\";\nimport type {\n PermissionGrantResult,\n PermissionRevokeResult,\n ServerTrustResult,\n} from \"../types/transactionResults\";\nimport type { PermissionInfo } from \"../types/permissions\";\nimport type { UnifiedRelayerRequest } from \"../types/relayer\";\nimport {\n RelayerError,\n UserRejectedRequestError,\n SerializationError,\n SignatureError,\n NetworkError,\n NonceError,\n BlockchainError,\n ServerUrlMismatchError,\n PermissionError,\n} from \"../errors\";\nimport { getContractAddress } from \"../config/addresses\";\nimport { getAbi } from \"../generated/abi\";\nimport { createGrantFile, getGrantFileHash } from \"../utils/grantFiles\";\nimport { validateGrant } from \"../utils/grantValidation\";\nimport { withSignatureCache } from \"../utils/signatureCache\";\nimport { formatSignatureForContract } from \"../utils/signatureFormatter\";\nimport { toViemTypedDataDefinition } from \"../utils/typedDataConverter\";\nimport type { GetUserPermissionsQuery } from \"../generated/subgraph\";\n\n// Wrapper type for GraphQL responses with potential errors\ntype SubgraphPermissionsResponse = {\n data?: GetUserPermissionsQuery;\n errors?: Array<{ message: string }>;\n};\n\n/**\n * Provides shared configuration and services for all SDK controllers.\n *\n * @remarks\n * This interface defines the foundational blockchain and storage services that all\n * controllers require for operation. The main Vana SDK class automatically creates\n * this context during initialization and passes it to each controller. It includes\n * wallet clients for transaction signing, storage managers for file operations,\n * and platform adapters for environment-specific functionality.\n * @category Configuration\n */\n// Import the shared ControllerContext from single source of truth\nimport type { ControllerContext } from \"../types/controller-context\";\nimport { BaseController } from \"./base\";\nexport type { ControllerContext };\n\n/**\n * Manages data access permissions and trusted server operations with gasless transaction support.\n *\n * @remarks\n * Enables applications to access user data through EIP-712 signatures, eliminating gas fees\n * for users. Handles permission lifecycle from creation through revocation, plus trusted\n * server management for data processing operations.\n *\n * **Architecture:**\n * Permissions use dual storage: complex parameters on IPFS, references on blockchain.\n * This minimizes on-chain data while maintaining decentralization and auditability.\n *\n * **Method Selection:**\n * - `grant()` - Create permissions with automatic IPFS upload and blockchain registration\n * - `prepareGrant()` - Preview permission structure before signing\n * - `revoke()` - Remove permissions by ID (gasless or direct)\n * - `getUserPermissionGrantsOnChain()` - Query active permissions\n * - `trustServer()`/`untrustServer()` - Manage server access\n *\n * **Gasless Support:**\n * All permission methods support both gasless (via relayer) and direct transactions.\n * Configure relayer callbacks in Vana initialization for gasless operations.\n *\n * @example\n * ```typescript\n * // Grant data access permission\n * const result = await vana.permissions.grant({\n * grantee: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\",\n * operation: \"llm_inference\",\n * fileIds: [1, 2, 3],\n * parameters: { model: \"gpt-4\", maxTokens: 1000 }\n * });\n * console.log(`Permission ${result.permissionId} granted`);\n *\n * // Trust server for processing\n * await vana.permissions.trustServer({\n * serverAddress: \"0x123...\",\n * serverUrl: \"https://personal-server.vana.org\"\n * });\n *\n * // Query active permissions\n * const permissions = await vana.permissions.getUserPermissionGrantsOnChain();\n * permissions.forEach(p => console.log(`Permission ${p.id}: ${p.grantee}`));\n * ```\n *\n * @category Permissions\n * @see For conceptual overview, visit {@link https://docs.vana.org/docs/permissions}\n */\nexport class PermissionsController extends BaseController {\n constructor(context: ControllerContext) {\n super(context);\n }\n\n /**\n * Grants permission for an application to access user data with gasless transactions.\n *\n * This method provides a complete end-to-end permission grant flow that returns\n * the permission ID and other relevant data immediately after successful submission.\n * For advanced users who need more control over the transaction lifecycle, use\n * `submitPermissionGrant()` instead.\n *\n * @param params - The permission grant configuration object\n * @returns Promise resolving to permission data from the PermissionAdded event\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {SerializationError} When grant data cannot be serialized\n * @throws {BlockchainError} When permission grant fails or event parsing fails\n * @throws {NetworkError} When transaction confirmation times out\n * @example\n * ```typescript\n * const result = await vana.permissions.grant({\n * grantee: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\",\n * operation: \"llm_inference\",\n * parameters: {\n * model: \"gpt-4\",\n * maxTokens: 1000,\n * temperature: 0.7,\n * },\n * });\n *\n * console.log(`Permission ${result.permissionId} granted to ${result.user}`);\n * console.log(`Transaction: ${result.transactionHash}`);\n *\n * // Can immediately use the permission ID for other operations\n * await vana.permissions.revoke({ permissionId: result.permissionId });\n * ```\n */\n async grant(\n params: GrantPermissionParams,\n options?: TransactionOptions,\n ): Promise<PermissionGrantResult> {\n this.assertWallet();\n // Submit the transaction and wait for events internally\n const { typedData, signature } = await this.createAndSign(params);\n const result = await this.submitSignedGrantWithEvents(\n typedData,\n signature,\n options,\n );\n return result;\n }\n\n /**\n * Submits a permission grant transaction and returns a handle for flexible result access.\n *\n * @remarks\n * This lower-level method provides maximum control over transaction timing.\n * Returns a TransactionResult that can be serialized and passed across API boundaries.\n * Use this when handling multiple transactions or when you need granular control.\n *\n * @param params - The permission grant configuration object\n * @returns Promise resolving to TransactionResult with hash and event parsing capabilities\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {SerializationError} When grant data cannot be serialized\n * @throws {BlockchainError} When permission grant preparation fails\n * @example\n * ```typescript\n * // Submit transaction and get immediate hash access\n * const tx = await vana.permissions.submitPermissionGrant(params);\n * console.log(`Transaction submitted: ${tx.hash}`);\n *\n * // To wait for events, use SDK's waitForTransactionEvents\n * const eventData = await vana.waitForTransactionEvents(tx.hash);\n * console.log(`Permission ID: ${eventData.permissionId}`);\n * ```\n */\n async submitPermissionGrant(\n params: GrantPermissionParams,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n this.assertWallet();\n const { typedData, signature } = await this.createAndSign(params);\n return await this.submitSignedGrant(typedData, signature, options);\n }\n\n /**\n * Prepares a permission grant with preview before signing.\n *\n * @remarks\n * This method implements a two-phase commit workflow that allows applications\n * to show users a preview of what they're authorizing before requesting a signature.\n * Unlike `createAndSign()`, this method does NOT upload to IPFS or prompt for signatures\n * until the returned `confirm()` function is called.\n * @param params - The permission grant parameters\n * @returns A promise resolving to a preview object and confirm function\n * @throws {SerializationError} When grant parameters are invalid or cannot be serialized\n * @throws {BlockchainError} When grant validation fails or preparation encounters an error\n * @example\n * ```typescript\n * const { preview, confirm } = await vana.permissions.prepareGrant({\n * grantee: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\",\n * operation: \"llm_inference\",\n * files: [1, 2, 3],\n * parameters: { model: \"gpt-4\", prompt: \"Analyze my social media data\" }\n * });\n *\n * console.log(`Granting ${preview.operation} access to ${preview.files?.length} files`);\n * const transactionHash = await confirm();\n * ```\n */\n async prepareGrant(\n params: GrantPermissionParams,\n options?: TransactionOptions,\n ): Promise<{\n preview: GrantFile;\n confirm: () => Promise<PermissionGrantResult>;\n }> {\n this.assertWallet();\n try {\n // Step 1: Create grant file in memory (no IPFS upload yet)\n const grantFile = createGrantFile(params);\n\n // Step 2: Validate the grant file against our JSON schema\n validateGrant(grantFile);\n\n // Step 3: Return preview and confirm function\n return {\n preview: grantFile,\n confirm: async (): Promise<PermissionGrantResult> => {\n // Phase 2: Now we upload, sign, and submit\n return await this.confirmGrantInternalWithEvents(\n params,\n grantFile,\n options,\n );\n },\n };\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n // Wrap unknown errors\n throw new BlockchainError(\n `Permission grant preparation failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\n \"Permission grant preparation failed with unknown error\",\n );\n }\n }\n\n /**\n * Completes the grant process after user confirmation.\n *\n * @remarks\n * This internal method is called by the confirm() function returned from prepareGrant().\n * It handles IPFS upload, signature creation, and transaction submission.\n *\n * @param params - The permission grant parameters containing user and operation details\n * @param grantFile - The prepared grant file with permissions and metadata\n * @returns Promise resolving to TransactionResult for flexible result access\n * @throws {BlockchainError} When permission grant confirmation fails\n * @throws {NetworkError} When IPFS upload fails\n * @throws {SignatureError} When user rejects the signature\n */\n private async confirmGrantInternal(\n params: GrantPermissionParams,\n grantFile: GrantFile,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n try {\n // Step 1: Use provided grantUrl or store grant file in IPFS\n let { grantUrl } = params;\n console.debug(\"🔍 Debug - Grant URL from params:\", grantUrl);\n if (!grantUrl) {\n // Validate storage is available using the centralized validation method\n const canStoreViaRelayer = this.context.relayer !== undefined;\n if (!canStoreViaRelayer && !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 } else {\n throw new Error(\n \"No storage available. Provide a grantUrl, configure relayer, or storageManager.\",\n );\n }\n }\n if (canStoreViaRelayer && this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"direct\",\n operation: \"storeGrantFile\",\n params: grantFile,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new Error(response.error);\n }\n if (\n response.type === \"direct\" &&\n typeof response.result === \"object\" &&\n response.result !== null &&\n \"url\" in response.result\n ) {\n grantUrl = response.result.url as string;\n } else {\n throw new Error(\"Invalid response from relayer for grant storage\");\n }\n } else if (this.context.storageManager) {\n // Store using local storage manager if available\n const blob = new Blob([JSON.stringify(grantFile)], {\n type: \"application/json\",\n });\n const result = await this.context.storageManager.upload(\n blob,\n `grant-${Date.now()}.json`,\n );\n grantUrl = result.url;\n }\n\n if (!grantUrl) {\n throw new Error(\"Failed to store grant file - no URL returned\");\n }\n }\n\n // Step 2: Get user nonce\n const nonce = await this.getPermissionsUserNonce();\n\n // Step 3: Create EIP-712 message with compatibility placeholders\n console.debug(\n \"🔍 Debug - Final grant URL being passed to compose:\",\n grantUrl,\n );\n const typedData = await this.composePermissionGrantMessage({\n grantee: params.grantee,\n operation: params.operation, // Placeholder - real data is in IPFS\n files: params.files, // Placeholder - real data is in IPFS\n grantUrl,\n serializedParameters: getGrantFileHash(grantFile), // Hash as placeholder\n nonce,\n });\n\n // Step 4: User signature\n const signature = await this.signTypedData(typedData);\n\n // Step 5: Submit the signed grant\n return await this.submitSignedGrant(typedData, signature, options);\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n // Wrap unknown errors\n throw new BlockchainError(\n `Permission grant confirmation failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\n \"Permission grant confirmation failed with unknown error\",\n );\n }\n }\n\n /**\n * Creates typed data and signature for a permission grant without submitting.\n *\n * @remarks\n * This method handles the first phase of permission granting: creating the grant file,\n * storing it on IPFS, and generating the user's EIP-712 signature. Use this when you\n * want to handle submission separately or batch multiple operations. The method validates\n * the grant file against the JSON schema before creating the signature.\n *\n * For interactive user flows, consider using `prepareGrant()` instead,\n * which allows showing a preview before signing.\n * @param params - The permission grant configuration object\n * @returns A promise resolving to the typed data structure and signature for gasless submission\n * @throws {SignatureError} When the user rejects the signature request\n * @throws {SerializationError} When grant data cannot be properly formatted\n * @throws {BlockchainError} When permission grant preparation fails\n * @throws {NetworkError} When storage operations fail\n * @example\n * ```typescript\n * const { typedData, signature } = await vana.permissions.createAndSign({\n * grantee: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\",\n * operation: \"data_analysis\",\n * parameters: { analysisType: \"sentiment\" },\n * });\n *\n * const transactionHash = await vana.permissions.submitSignedGrant(typedData, signature);\n * ```\n */\n async createAndSign(params: GrantPermissionParams): Promise<{\n typedData: PermissionGrantTypedData;\n signature: Hash;\n }> {\n this.assertWallet();\n try {\n // Step 1: Create grant file with all the real data\n const grantFile = createGrantFile(params);\n\n // Step 1.5: Validate the grant file against our JSON schema\n validateGrant(grantFile);\n\n // Step 2: Use provided grantUrl or store grant file in IPFS\n let { grantUrl } = params;\n console.debug(\"🔍 Debug - Grant URL from params:\", grantUrl);\n if (!grantUrl) {\n // Validate storage is available using the centralized validation method\n const canStoreViaRelayer = this.context.relayer !== undefined;\n if (!canStoreViaRelayer && !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 } else {\n throw new Error(\n \"No storage available. Provide a grantUrl, configure relayer, or storageManager.\",\n );\n }\n }\n if (canStoreViaRelayer && this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"direct\",\n operation: \"storeGrantFile\",\n params: grantFile,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new Error(response.error);\n }\n if (\n response.type === \"direct\" &&\n typeof response.result === \"object\" &&\n response.result !== null &&\n \"url\" in response.result\n ) {\n grantUrl = response.result.url as string;\n } else {\n throw new Error(\"Invalid response from relayer for grant storage\");\n }\n } else if (this.context.storageManager) {\n // Store using local storage manager if available\n const blob = new Blob([JSON.stringify(grantFile)], {\n type: \"application/json\",\n });\n const result = await this.context.storageManager.upload(\n blob,\n `grant-${Date.now()}.json`,\n );\n grantUrl = result.url;\n }\n\n if (!grantUrl) {\n throw new Error(\"Failed to store grant file - no URL returned\");\n }\n }\n\n // Step 3: Get user nonce\n const nonce = await this.getPermissionsUserNonce();\n\n // Step 4: Create EIP-712 message with compatibility placeholders\n console.debug(\n \"🔍 Debug - Final grant URL being passed to compose:\",\n grantUrl,\n );\n const typedData = await this.composePermissionGrantMessage({\n grantee: params.grantee,\n operation: params.operation, // Placeholder - real data is in IPFS\n files: params.files, // Placeholder - real data is in IPFS\n grantUrl,\n serializedParameters: getGrantFileHash(grantFile), // Hash as placeholder\n nonce,\n });\n\n // Step 5: User signature\n const signature = await this.signTypedData(typedData);\n\n return { typedData, signature };\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n // Wrap unknown errors\n throw new BlockchainError(\n `Permission grant preparation failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\n \"Permission grant preparation failed with unknown error\",\n );\n }\n }\n\n /**\n * Submits an already-signed permission grant to the blockchain.\n *\n * @remarks\n * This method supports both relayer-based gasless transactions and direct transactions.\n * It automatically converts `bigint` values to JSON-safe strings when using relayer\n * callbacks and handles transaction submission with proper error handling and retry logic.\n * @param typedData - The EIP-712 typed data structure for the permission grant\n * @param signature - The user's signature as a hex string\n * @returns A Promise that resolves to the transaction hash\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {BlockchainError} When permission submission fails\n * @throws {NetworkError} When network communication fails\n * @example\n * ```typescript\n * const txHash = await vana.permissions.submitSignedGrant(\n * typedData,\n * \"0x1234...\"\n * );\n * ```\n */\n async submitSignedGrant(\n typedData: PermissionGrantTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n try {\n console.debug(\n \"🔍 Debug - submitSignedGrant called with typed data:\",\n JSON.stringify(\n typedData,\n (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value,\n 2,\n ),\n );\n\n // Use relayer callback or direct transaction\n if (this.context.relayer) {\n const response = await this.context.relayer({\n type: \"signed\",\n operation: \"submitAddPermission\",\n typedData,\n signature,\n expectedUserAddress: this.context.userAddress,\n });\n\n // Handle different response types\n if (response.type === \"error\") {\n throw new Error(`Relayer error: ${response.error}`);\n }\n\n let finalHash: Hash;\n\n if (response.type === \"submitted\") {\n // --- SIMPLE RELAYER PATH ---\n finalHash = response.hash;\n } else if (response.type === \"pending\") {\n // --- ROBUST RELAYER PATH ---\n const pollResult = await this.pollRelayerForConfirmation(\n response.operationId,\n options,\n );\n finalHash = pollResult.hash;\n } else if (response.type === \"confirmed\") {\n // Transaction confirmed immediately\n finalHash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n finalHash = response.hash;\n } else {\n throw new Error(\n \"Invalid response from relayer: unexpected response type\",\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash: finalHash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"addPermission\",\n });\n } else {\n return await this.submitDirectTransaction(\n typedData,\n signature,\n options,\n );\n }\n } catch (error) {\n // Re-throw known Vana errors directly to preserve error types\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Permission submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits an already-signed trust server transaction to the blockchain.\n *\n * @remarks\n * This method extracts the trust server input from typed data and submits it directly.\n * Used internally by trust server methods after signature collection.\n *\n * @param typedData - The EIP-712 typed data for TrustServer\n * @param signature - The user's signature obtained via `signTypedData()`\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When contract submission fails\n * @throws {NetworkError} When blockchain communication fails\n * @example\n * ```typescript\n * const txHandle = await vana.permissions.submitSignedTrustServer(\n * typedData,\n * \"0x1234...\"\n * );\n * const result = await txHandle.waitForEvents();\n * ```\n */\n async submitSignedTrustServer(\n typedData: TrustServerTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\"DataPortabilityServers\", \"trustServerWithSignature\">\n > {\n try {\n const trustServerInput: TrustServerInput = {\n nonce: BigInt(typedData.message.nonce),\n serverId: typedData.message.serverId,\n };\n\n const hash = await this.submitTrustServerTransaction(\n trustServerInput,\n signature,\n options,\n );\n const account = this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: account,\n contract: \"DataPortabilityServers\",\n fn: \"trustServerWithSignature\",\n });\n } catch (error) {\n // Re-throw known Vana errors directly to preserve error types\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n\n // Check for specific contract errors\n if (\n error instanceof Error &&\n error.message.includes(\"ServerUrlMismatch\")\n ) {\n const match = error.message.match(\n /ServerUrlMismatch\\(string existingUrl, string providedUrl\\)\\s+\\(([^,]+),\\s*([^)]+)\\)/,\n );\n if (match) {\n const existingUrl = match[1].trim();\n const providedUrl = match[2].trim();\n throw new ServerUrlMismatchError(\n existingUrl,\n providedUrl,\n typedData.message.serverId.toString(),\n );\n }\n }\n\n throw new BlockchainError(\n `Trust server submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits an already-signed add and trust server transaction to the blockchain.\n *\n * @remarks\n * This method extracts the add and trust server input from typed data and submits it directly.\n * Combines server registration and trust operations in a single transaction.\n *\n * @param typedData - The EIP-712 typed data for AddAndTrustServer\n * @param signature - The user's signature obtained via `signTypedData()`\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When contract submission fails\n * @throws {NetworkError} When blockchain communication fails\n * @example\n * ```typescript\n * const txHandle = await vana.permissions.submitSignedAddAndTrustServer(\n * typedData,\n * \"0x1234...\"\n * );\n * const result = await txHandle.waitForEvents();\n * ```\n */\n async submitSignedAddAndTrustServer(\n typedData: AddAndTrustServerTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityServers\",\n \"addAndTrustServerWithSignature\"\n >\n > {\n try {\n const addAndTrustServerInput: AddAndTrustServerInput = {\n nonce: BigInt(typedData.message.nonce),\n serverAddress: typedData.message.serverAddress,\n serverUrl: typedData.message.serverUrl,\n publicKey: typedData.message.publicKey,\n };\n\n const hash = await this.submitAddAndTrustServerTransaction(\n addAndTrustServerInput,\n signature,\n options,\n );\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"addAndTrustServerWithSignature\",\n });\n } catch (error) {\n // Re-throw known Vana errors directly to preserve error types\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n\n throw new BlockchainError(\n `Add and trust server submission failed444444: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Internal method to submit a signed grant and wait for events.\n *\n * @internal\n * @param typedData - The EIP-712 typed data for the permission grant\n * @param signature - The user's signature authorizing the transaction\n * @returns Promise resolving to PermissionGrantResult with parsed events\n */\n private async submitSignedGrantWithEvents(\n typedData: PermissionGrantTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<PermissionGrantResult> {\n const txResult = await this.submitSignedGrant(\n typedData,\n signature,\n options,\n );\n\n if (!this.context.waitForTransactionEvents) {\n throw new BlockchainError(\"waitForTransactionEvents not configured\");\n }\n\n // Now TypeScript knows this is a DataPortabilityPermissions.addPermission transaction\n const result = await this.context.waitForTransactionEvents(txResult);\n\n // TypeScript knows exactly what events are possible!\n const event = result.expectedEvents.PermissionAdded;\n if (!event) {\n throw new BlockchainError(\n \"PermissionAdded event not found in transaction\",\n );\n }\n\n // Need to get receipt for block number and gas used\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash: result.hash,\n });\n\n return {\n transactionHash: result.hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n permissionId: event.permissionId,\n user: event.user,\n grant: event.grant,\n fileIds: event.fileIds,\n };\n }\n\n /**\n * Internal method for confirm grant with events.\n *\n * @internal\n * @param params - The permission grant parameters\n * @param grantFile - The pre-created grant file object\n * @returns Promise resolving to PermissionGrantResult with parsed events\n */\n private async confirmGrantInternalWithEvents(\n params: GrantPermissionParams,\n grantFile: GrantFile,\n options?: TransactionOptions,\n ): Promise<PermissionGrantResult> {\n const txResult = await this.confirmGrantInternal(\n params,\n grantFile,\n options,\n );\n\n if (!this.context.waitForTransactionEvents) {\n throw new BlockchainError(\"waitForTransactionEvents not configured\");\n }\n\n // Wait for transaction events\n const result = await this.context.waitForTransactionEvents(txResult);\n\n // Extract the expected event\n const event = result.expectedEvents.PermissionAdded;\n if (!event) {\n throw new BlockchainError(\n \"PermissionAdded event not found in transaction\",\n );\n }\n\n // Get receipt for block number and gas used\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash: result.hash,\n });\n\n return {\n transactionHash: result.hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n permissionId: event.permissionId,\n user: event.user,\n grant: event.grant,\n fileIds: event.fileIds,\n };\n }\n\n /**\n * Polls the relayer for confirmation of a pending operation.\n *\n * @param operationId - The operation ID to poll\n * @param options - Polling configuration including status updates and cancellation\n * @returns Promise resolving to the confirmed hash and receipt\n * @throws {TransactionPendingError} When the operation times out\n * @throws {Error} When the operation fails or is cancelled\n * @internal\n */\n private async pollRelayerForConfirmation(\n operationId: string,\n options?: TransactionOptions,\n ): Promise<{ hash: Hash; receipt?: unknown }> {\n if (!this.context.relayer) {\n throw new Error(\"Relayer not configured for polling\");\n }\n\n const pollingManager = new PollingManager(this.context.relayer);\n\n return await pollingManager.startPolling(operationId, {\n signal: options?.signal,\n onStatusUpdate: options?.onStatusUpdate,\n ...options?.pollingOptions,\n });\n }\n\n /**\n * Submits an already-signed permission revoke transaction to the blockchain.\n *\n * @remarks\n * This method handles the revocation of previously granted permissions.\n * Used internally by revocation methods after signature collection.\n *\n * @param typedData - The EIP-712 typed data for PermissionRevoke\n * @param signature - The user's signature obtained via `signTypedData()`\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When contract submission fails\n * @throws {NetworkError} When blockchain communication fails\n * @example\n * ```typescript\n * const txHandle = await vana.permissions.submitSignedRevoke(\n * typedData,\n * \"0x1234...\"\n * );\n * const result = await txHandle.waitForEvents();\n * ```\n */\n async submitSignedRevoke(\n typedData: GenericTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityPermissions\",\n \"revokePermissionWithSignature\"\n >\n > {\n try {\n // Use relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const response = await this.context.relayer({\n type: \"signed\",\n operation: \"submitPermissionRevoke\",\n typedData,\n signature,\n expectedUserAddress: this.context.userAddress,\n });\n\n // Handle different response types\n if (response.type === \"error\") {\n throw new Error(`Relayer error: ${response.error}`);\n }\n\n if (response.type === \"submitted\") {\n // --- SIMPLE RELAYER PATH ---\n hash = response.hash;\n } else if (response.type === \"pending\") {\n // --- ROBUST RELAYER PATH ---\n const pollResult = await this.pollRelayerForConfirmation(\n response.operationId,\n options,\n );\n hash = pollResult.hash;\n } else if (response.type === \"confirmed\") {\n // Transaction confirmed immediately\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\n \"Invalid response from relayer: unexpected response type\",\n );\n }\n } else {\n hash = await this.submitDirectRevokeTransaction(\n typedData as RevokePermissionTypedData,\n signature,\n options,\n );\n }\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"revokePermissionWithSignature\",\n });\n } catch (error) {\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Permission revoke submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits an already-signed untrust server transaction to the blockchain.\n *\n * @remarks\n * This method handles the removal of trusted servers.\n * Used internally by untrust server methods after signature collection.\n *\n * @param typedData - The EIP-712 typed data for UntrustServer\n * @param signature - The user's signature obtained via `signTypedData()`\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When contract submission fails\n * @throws {NetworkError} When blockchain communication fails\n * @example\n * ```typescript\n * const txHandle = await vana.permissions.submitSignedUntrustServer(\n * typedData,\n * \"0x1234...\"\n * );\n * const result = await txHandle.waitForEvents();\n * ```\n */\n async submitSignedUntrustServer(\n typedData: GenericTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\"DataPortabilityServers\", \"untrustServerWithSignature\">\n > {\n try {\n // Use relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const response = await this.context.relayer({\n type: \"signed\",\n operation: \"submitUntrustServer\",\n typedData,\n signature,\n expectedUserAddress: this.context.userAddress,\n });\n\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else if (response.type === \"error\") {\n throw new Error(`Relayer error: ${response.error}`);\n } else {\n throw new Error(\n \"Invalid response from relayer: expected signed transaction\",\n );\n }\n } else {\n hash = await this.submitSignedUntrustTransaction(\n typedData as UntrustServerTypedData,\n signature,\n options,\n );\n }\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"untrustServerWithSignature\",\n });\n } catch (error) {\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Untrust server submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits a signed transaction directly to the blockchain.\n *\n * @remarks\n * Internal method used when relayer callbacks are not available. Formats the signature\n * and submits the permission grant directly to the smart contract.\n *\n * @param typedData - The typed data structure for the permission grant\n * @param signature - The cryptographic signature authorizing the transaction\n * @returns Promise resolving to the transaction hash\n * @throws {BlockchainError} When contract submission fails\n */\n private async submitDirectTransaction(\n typedData: PermissionGrantTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n this.assertWallet();\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\"DataPortabilityPermissions\");\n\n // Prepare the PermissionInput struct\n const permissionInput = {\n nonce: typedData.message.nonce,\n granteeId: typedData.message.granteeId,\n grant: typedData.message.grant,\n fileIds: typedData.message.fileIds,\n };\n\n console.debug(\"🔍 Debug - Permission input being sent to contract:\", {\n nonce: permissionInput.nonce.toString(),\n grant: permissionInput.grant,\n fileIds: permissionInput.fileIds.map((id) => id.toString()),\n });\n console.debug(\"🔍 Debug - Grant field value:\", typedData.message.grant);\n console.debug(\n \"🔍 Debug - Grant field length:\",\n typedData.message.grant?.length ?? 0,\n );\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n // Submit directly to the contract using the provided wallet client\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"addPermission\",\n args: [permissionInput, formattedSignature],\n account,\n chain: this.context.walletClient?.chain ?? null,\n ...this.spreadTransactionOptions(options),\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash: txHash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"addPermission\",\n });\n }\n\n /**\n * Revokes a previously granted permission.\n *\n * This method provides complete revocation with automatic event parsing to confirm\n * the permission was successfully revoked. For advanced users who need more control,\n * use `submitPermissionRevoke()` instead.\n *\n * @param params - Parameters for revoking the permission\n * @param params.permissionId - Permission identifier (accepts bigint, number, or string).\n * Obtain from permission grants via `getUserPermissionGrantsOnChain()`.\n * @returns Promise resolving to revocation data from PermissionRevoked event\n * @throws {BlockchainError} When revocation fails or event parsing fails\n * @throws {UserRejectedRequestError} When user rejects the transaction\n * @throws {NetworkError} When transaction confirmation times out\n * @example\n * ```typescript\n * // Revoke a permission and get confirmation\n * const result = await vana.permissions.revoke({\n * permissionId: 123n\n * });\n * console.log(`Permission ${result.permissionId} revoked in transaction ${result.transactionHash}`);\n * console.log(`Revoked in block ${result.blockNumber}`);\n * ```\n */\n async revoke(\n params: RevokePermissionParams,\n ): Promise<PermissionRevokeResult> {\n this.assertWallet();\n const txResult = await this.submitPermissionRevoke(params);\n\n if (!this.context.waitForTransactionEvents) {\n throw new BlockchainError(\"waitForTransactionEvents not configured\");\n }\n\n // Wait for transaction events\n const result = await this.context.waitForTransactionEvents(txResult);\n\n // Extract the expected event\n const event = result.expectedEvents.PermissionRevoked;\n if (!event) {\n throw new BlockchainError(\n \"PermissionRevoked event not found in transaction\",\n );\n }\n\n // Get receipt for block number and gas used\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash: result.hash,\n });\n\n return {\n transactionHash: result.hash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n permissionId: event.permissionId,\n };\n }\n\n /**\n * Submits a permission revocation transaction and returns the transaction hash immediately.\n *\n * This is the lower-level method that provides maximum control over transaction timing.\n * Use this when you want to handle transaction confirmation and event parsing separately.\n *\n * @param params - Parameters for revoking the permission\n * @param options - Optional transaction options for gas parameters and timeout\n * @returns Promise resolving to the transaction hash when successfully submitted\n * @throws {BlockchainError} When revocation transaction fails\n * @throws {UserRejectedRequestError} When user rejects the transaction\n * @example\n * ```typescript\n * // Submit revocation and handle confirmation later\n * const txHash = await vana.permissions.submitPermissionRevoke({\n * permissionId: 123n\n * });\n * console.log(`Revocation submitted: ${txHash}`);\n * ```\n */\n async submitPermissionRevoke(\n params: RevokePermissionParams,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\"DataPortabilityPermissions\", \"revokePermission\">\n > {\n this.assertWallet();\n try {\n // Check chain ID availability early\n if (!this.context.walletClient?.chain?.id) {\n throw new BlockchainError(\"Chain ID not available\");\n }\n\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n // Direct contract call for revocation\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"revokePermission\",\n args: [params.permissionId],\n account,\n chain: this.context.walletClient?.chain ?? null,\n ...(options?.gas && { gas: options.gas }),\n ...(options?.nonce && { nonce: options.nonce }),\n // Use EIP-1559 if available, otherwise fall back to legacy gasPrice\n ...(options?.maxFeePerGas || options?.maxPriorityFeePerGas\n ? {\n ...(options.maxFeePerGas && {\n maxFeePerGas: options.maxFeePerGas,\n }),\n ...(options.maxPriorityFeePerGas && {\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }),\n }\n : options?.gasPrice && { gasPrice: options.gasPrice }),\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash: txHash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"revokePermission\",\n });\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Permission revoke failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\"Permission revoke failed with unknown error\");\n }\n }\n\n /**\n * Revokes a permission with a signature for gasless transactions.\n *\n * @remarks\n * This method creates an EIP-712 signature for permission revocation and submits\n * it either through relayer callbacks or directly to the blockchain. Provides\n * gasless revocation when relayer is configured.\n *\n * @param params - Parameters for revoking the permission\n * @param params.permissionId - Permission identifier to revoke (accepts bigint, number, or string)\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When chain ID is not available\n * @throws {NonceError} When retrieving user nonce fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {RelayerError} When gasless submission fails\n * @throws {PermissionError} When revocation fails for any other reason\n * @example\n * ```typescript\n * const txHandle = await vana.permissions.submitRevokeWithSignature({\n * permissionId: 123n\n * });\n * const result = await txHandle.waitForEvents();\n * console.log(`Permission ${result.permissionId} revoked`);\n * ```\n */\n async submitRevokeWithSignature(\n params: RevokePermissionParams,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityPermissions\",\n \"revokePermissionWithSignature\"\n >\n > {\n this.assertWallet();\n try {\n // Check chain ID availability early\n if (!this.context.walletClient?.chain?.id) {\n throw new BlockchainError(\"Chain ID not available\");\n }\n\n const nonce = await this.getPermissionsUserNonce();\n\n // Create revoke permission input\n const revokePermissionInput = {\n nonce,\n permissionId: params.permissionId,\n };\n\n // Create typed data for revoke\n const typedData = {\n domain: await this.getPermissionDomain(),\n types: {\n RevokePermission: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"permissionId\", type: \"uint256\" },\n ],\n },\n primaryType: \"RevokePermission\" as const,\n message: revokePermissionInput,\n };\n\n const signature = await this.signTypedData(typedData);\n\n // Submit via relayer callback or directly\n let hash: Hash;\n if (this.context.relayer) {\n const response = await this.context.relayer({\n type: \"signed\",\n operation: \"submitPermissionRevoke\",\n typedData,\n signature,\n expectedUserAddress: this.context.userAddress,\n });\n\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else if (response.type === \"error\") {\n throw new Error(`Relayer error: ${response.error}`);\n } else {\n throw new Error(\n \"Invalid response from relayer: expected signed transaction\",\n );\n }\n } else {\n hash = await this.submitDirectRevokeTransaction(\n typedData as RevokePermissionTypedData,\n signature,\n options,\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"revokePermissionWithSignature\",\n });\n } catch (error) {\n throw new PermissionError(\n `Failed to revoke permission with signature: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Retrieves the user's current nonce from the DataPortabilityServers contract.\n * This nonce is used for server-related operations (AddAndTrustServer, TrustServer, UntrustServer).\n *\n * @returns Promise resolving to the current servers nonce\n * @throws {NonceError} When reading nonce from contract fails\n * @private\n *\n * @example\n * ```typescript\n * const nonce = await this.getServersUserNonce();\n * console.log(`Current servers nonce: ${nonce}`);\n * ```\n */\n /**\n * Retrieves the user's current nonce from the DataPortabilityServers contract.\n *\n * @remarks\n * Used for server-related operations (trust/untrust) to prevent replay attacks.\n * The nonce must be incremented with each server operation.\n *\n * @returns Promise resolving to the user's current nonce as a bigint\n * @throws {NonceError} When retrieving the nonce fails\n */\n private async getServersUserNonce(): Promise<bigint> {\n try {\n const userAddress = this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const [nonce] = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"users\",\n args: [userAddress],\n });\n\n return nonce;\n } catch (error) {\n throw new NonceError(\n `Failed to retrieve server nonce: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Retrieves the user's current nonce from the DataPortabilityPermissions contract.\n * This nonce is used for permission-related operations (addPermission, addServerFilesAndPermissions).\n *\n * @returns Promise resolving to the current permissions nonce\n * @throws {NonceError} When reading nonce from contract fails\n * @private\n *\n * @example\n * ```typescript\n * const nonce = await this.getPermissionsUserNonce();\n * console.log(`Current permissions nonce: ${nonce}`);\n * ```\n */\n /**\n * Retrieves the user's current nonce from the DataPortabilityPermissions contract.\n *\n * @remarks\n * Used for permission-related operations (grant/revoke) to prevent replay attacks.\n * The nonce must be incremented with each permission operation.\n *\n * @returns Promise resolving to the user's current nonce as a bigint\n * @throws {NonceError} When retrieving the nonce fails\n */\n private async getPermissionsUserNonce(): Promise<bigint> {\n try {\n const userAddress = this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const nonce = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userNonce\",\n args: [userAddress],\n });\n\n return nonce;\n } catch (error) {\n throw new NonceError(\n `Failed to retrieve permissions nonce: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Composes the EIP-712 typed data for PermissionGrant (new simplified format).\n *\n * @param params - The parameters for composing the permission grant message\n * @param params.grantee - The recipient address for the permission grant\n * @param params.operation - The type of operation being granted permission for\n * @param params.files - Array of file IDs that the permission applies to\n * @param params.grantUrl - URL where the grant details are stored\n * @param params.serializedParameters - Serialized parameters for the operation\n * @param params.nonce - Unique number to prevent replay attacks\n * @returns Promise resolving to the typed data structure\n */\n private async composePermissionGrantMessage(params: {\n grantee: Address;\n operation: string;\n files: number[];\n grantUrl: string;\n serializedParameters: string;\n nonce: bigint;\n }): Promise<PermissionGrantTypedData> {\n const domain = await this.getPermissionDomain();\n\n console.debug(\n \"🔍 Debug - Composing permission message with grantUrl:\",\n params.grantUrl,\n );\n\n // Get granteeId from grantee address\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n const granteeId = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteeAddressToId\",\n args: [params.grantee],\n });\n\n // Warn if using HTTP gateway URL instead of ipfs:// protocol for on-chain storage\n if (\n !params.grantUrl.startsWith(\"ipfs://\") &&\n params.grantUrl.includes(\"/ipfs/\")\n ) {\n const { extractIpfsHash } = await import(\"../utils/ipfs\");\n const hash = extractIpfsHash(params.grantUrl);\n if (hash) {\n console.warn(\n `⚠️ Storing HTTP gateway URL on-chain instead of ipfs:// protocol. ` +\n `Found: ${params.grantUrl}. ` +\n `Consider using ipfs://${hash} for better protocol-agnostic on-chain storage.`,\n );\n }\n }\n\n return {\n domain,\n types: {\n Permission: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"granteeId\", type: \"uint256\" },\n { name: \"grant\", type: \"string\" },\n { name: \"fileIds\", type: \"uint256[]\" },\n ],\n },\n primaryType: \"Permission\",\n message: {\n nonce: params.nonce,\n granteeId,\n grant: params.grantUrl,\n fileIds: params.files.map((fileId) => BigInt(fileId)),\n },\n };\n }\n\n /**\n * Creates EIP-712 typed data structure for server files and permissions.\n *\n * @param params - Parameters for the server files and permissions message\n * @param params.granteeId - Grantee ID\n * @param params.grant - Grant URL or grant data\n * @param params.fileUrls - Array of file URLs\n * @param params.schemaIds - Schema IDs for each file\n * @param params.serverAddress - Server address\n * @param params.serverUrl - Server URL\n * @param params.serverPublicKey - Server public key\n * @param params.filePermissions - File permissions array\n * @param params.nonce - Unique number to prevent replay attacks\n * @returns Promise resolving to the typed data structure\n */\n private async composeServerFilesAndPermissionMessage(params: {\n granteeId: bigint;\n grant: string;\n fileUrls: string[];\n schemaIds: number[];\n serverAddress: Address;\n serverUrl: string;\n serverPublicKey: string;\n filePermissions: Permission[][];\n nonce: bigint;\n }): Promise<ServerFilesAndPermissionTypedData> {\n const domain = await this.getPermissionDomain();\n\n console.debug(\n \"🔍 Debug - Composing server files and permission message with grant:\",\n params.grant,\n );\n\n // Warn if using HTTP gateway URL instead of ipfs:// protocol for on-chain storage\n if (\n !params.grant.startsWith(\"ipfs://\") &&\n params.grant.includes(\"/ipfs/\")\n ) {\n const { extractIpfsHash } = await import(\"../utils/ipfs\");\n const hash = extractIpfsHash(params.grant);\n if (hash) {\n console.warn(\n `⚠️ Storing HTTP gateway URL on-chain instead of ipfs:// protocol. ` +\n `Found: ${params.grant}. ` +\n `Consider using ipfs://${hash} for better protocol-agnostic on-chain storage.`,\n );\n }\n }\n\n return {\n domain,\n types: {\n Permission: [\n { name: \"account\", type: \"address\" },\n { name: \"key\", type: \"string\" },\n ],\n ServerFilesAndPermission: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"granteeId\", type: \"uint256\" },\n { name: \"grant\", type: \"string\" },\n { name: \"fileUrls\", type: \"string[]\" },\n { name: \"schemaIds\", type: \"uint256[]\" },\n { name: \"serverAddress\", type: \"address\" },\n { name: \"serverUrl\", type: \"string\" },\n { name: \"serverPublicKey\", type: \"string\" },\n { name: \"filePermissions\", type: \"Permission[][]\" },\n ],\n },\n primaryType: \"ServerFilesAndPermission\",\n message: {\n nonce: params.nonce,\n granteeId: params.granteeId,\n grant: params.grant,\n fileUrls: params.fileUrls,\n schemaIds: params.schemaIds.map((id) => BigInt(id)),\n serverAddress: params.serverAddress,\n serverUrl: params.serverUrl,\n serverPublicKey: params.serverPublicKey,\n filePermissions: params.filePermissions,\n },\n };\n }\n\n /**\n * Gets the EIP-712 domain for PermissionGrant signatures.\n *\n * @returns Promise resolving to the EIP-712 domain configuration\n */\n private async getPermissionDomain() {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n\n return {\n name: \"VanaDataPortabilityPermissions\",\n version: \"1\",\n chainId,\n verifyingContract: DataPortabilityPermissionsAddress,\n };\n }\n\n /**\n * Signs typed data using the wallet client with signature caching.\n *\n * @param typedData - The EIP-712 typed data structure to sign\n * @returns Promise resolving to the cryptographic signature\n */\n private async signTypedData(typedData: GenericTypedData): Promise<Hash> {\n this.assertWallet();\n try {\n // Get wallet address for cache key - use account if available, otherwise get from wallet\n const walletAddress =\n this.context.walletClient.account?.address ?? this.context.userAddress;\n\n // Use signature cache to avoid repeated signing of identical messages\n return await withSignatureCache(\n this.context.platform.cache,\n walletAddress,\n typedData as Record<string, unknown>,\n async () => {\n const viemCompatibleTypedData = toViemTypedDataDefinition(typedData);\n return await this.context.walletClient.signTypedData({\n ...viemCompatibleTypedData,\n // Use the account if available, otherwise use the wallet address\n // This follows the same pattern used throughout this file\n account: this.context.walletClient.account ?? walletAddress,\n });\n },\n );\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"rejected\")) {\n throw new UserRejectedRequestError();\n }\n throw new SignatureError(\n `Failed to sign typed data: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Gets the user's address from the context.\n *\n * @returns The user's address\n */\n\n /**\n * Gets on-chain permission grant data without expensive off-chain resolution.\n *\n * @remarks\n * This method provides a fast, performance-focused way to retrieve permission grants\n * by querying only the subgraph without making expensive IPFS or individual contract calls.\n * It eliminates the N+1 query problem of the legacy `getUserPermissions()` method.\n *\n * The returned data contains all on-chain information but does NOT include resolved\n * operation details, parameters, or file IDs. Use `retrieveGrantFile()` separately\n * for specific grants when detailed data is needed.\n *\n * **Performance**: Completes in ~100-500ms regardless of permission count.\n * **Reliability**: Single point of failure (subgraph) with clear RPC fallback path.\n *\n * @param options - Options for retrieving permissions (limit, subgraph URL)\n * @returns A Promise that resolves to an array of `OnChainPermissionGrant` objects\n * @throws {BlockchainError} When subgraph query fails\n * @throws {NetworkError} When network requests fail\n * @example\n * ```typescript\n * // Fast: Get all on-chain permission data\n * const grants = await vana.permissions.getUserPermissionGrantsOnChain({ limit: 20 });\n *\n * // Display in UI immediately\n * grants.forEach(grant => {\n * console.log(`Permission ${grant.id}: ${grant.grantUrl}`);\n * });\n *\n * // Lazy load detailed data for specific permission when user clicks\n * const grantFile = await retrieveGrantFile(grants[0].grantUrl);\n * console.log(`Operation: ${grantFile.operation}`);\n * console.log(`Parameters:`, grantFile.parameters);\n * ```\n */\n async getUserPermissionGrantsOnChain(\n options: GetUserPermissionsOptions = {},\n ): Promise<OnChainPermissionGrant[]> {\n const { limit = 50, fetchAll = false, subgraphUrl } = options;\n const pageSize = fetchAll ? 100 : limit; // Query efficiently based on mode\n const maxResults = fetchAll ? 10000 : limit; // Reasonable max for fetchAll\n\n try {\n const userAddress = this.context.userAddress;\n\n // Use provided subgraph URL or default from context\n const graphqlEndpoint = subgraphUrl ?? this.context.subgraphUrl;\n\n if (!graphqlEndpoint) {\n throw new BlockchainError(\n \"subgraphUrl is required. Please provide a valid subgraph endpoint or configure it in Vana constructor.\",\n );\n }\n\n // Query the subgraph for user's permissions with pagination\n const query = `\n query GetUserPermissions($userId: ID!, $first: Int!, $skip: Int!) {\n user(id: $userId) {\n id\n permissions(first: $first, skip: $skip, orderBy: addedAtBlock, orderDirection: desc) {\n id\n grant\n nonce\n signature\n startBlock\n endBlock\n addedAtBlock\n addedAtTimestamp\n transactionHash\n grantee {\n id\n address\n }\n }\n }\n }\n `;\n\n const allPermissions: any[] = [];\n let currentOffset = 0;\n\n // If not fetching all, just get the requested limit in one query\n if (!fetchAll) {\n const response = await fetch(graphqlEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables: {\n userId: userAddress.toLowerCase(),\n first: limit,\n skip: 0,\n },\n }),\n });\n\n if (!response.ok) {\n throw new BlockchainError(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as SubgraphPermissionsResponse;\n\n if (result.errors) {\n throw new BlockchainError(\n `Subgraph errors: ${result.errors.map((e: { message: string }) => e.message).join(\", \")}`,\n );\n }\n\n const userData = result.data?.user;\n\n // If no permissions found, return empty array\n if (!userData?.permissions?.length) {\n return [];\n }\n\n allPermissions.push(...userData.permissions);\n } else {\n // Fetch permissions in batches for fetchAll\n while (allPermissions.length < maxResults) {\n const currentLimit = Math.min(\n pageSize,\n maxResults - allPermissions.length,\n );\n\n const response = await fetch(graphqlEndpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n query,\n variables: {\n userId: userAddress.toLowerCase(),\n first: currentLimit,\n skip: currentOffset,\n },\n }),\n });\n\n if (!response.ok) {\n throw new BlockchainError(\n `Subgraph request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as SubgraphPermissionsResponse;\n\n if (result.errors) {\n throw new BlockchainError(\n `Subgraph errors: ${result.errors.map((e: { message: string }) => e.message).join(\", \")}`,\n );\n }\n\n const userData = result.data?.user;\n\n // If no permissions found in this batch, we're done\n if (!userData?.permissions?.length) {\n break;\n }\n\n // Add permissions from this batch\n allPermissions.push(...userData.permissions);\n\n // If we got fewer permissions than requested, we've reached the end\n if (userData.permissions.length < currentLimit) {\n break;\n }\n\n // Move to next batch\n currentOffset += userData.permissions.length;\n }\n }\n\n // Process all permissions without expensive network calls - FAST PATH\n const onChainGrants: OnChainPermissionGrant[] = allPermissions.map(\n (permission: any) => ({\n id: BigInt(permission.id),\n grantUrl: permission.grant,\n grantSignature: permission.signature,\n nonce: BigInt(permission.nonce),\n startBlock: BigInt(permission.startBlock),\n addedAtBlock: BigInt(permission.addedAtBlock),\n addedAtTimestamp: BigInt(permission.addedAtTimestamp ?? \"0\"),\n transactionHash: permission.transactionHash ?? \"\",\n grantor: userAddress,\n grantee: permission.grantee,\n active: !permission.endBlock || BigInt(permission.endBlock) === 0n, // Active if no end block or end block is 0\n }),\n );\n\n return onChainGrants.sort((a, b) => {\n // Sort by ID - most recent first\n if (a.id < b.id) return 1;\n if (a.id > b.id) return -1;\n return 0;\n });\n } catch (error) {\n if (error instanceof BlockchainError || error instanceof NetworkError) {\n throw error;\n }\n throw new BlockchainError(\n `Failed to fetch user permission grants: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n }\n\n /**\n * Registers a new server and immediately trusts it in the DataPortabilityServers contract.\n *\n * This is a combined operation that both registers a new data portability server\n * and adds it to the user's trusted servers list in a single transaction.\n * Trusted servers can handle data export and portability requests from the user.\n *\n * @param params - Parameters for adding and trusting the server\n * @param params.serverAddress - Ethereum address of the server\n * @param params.serverUrl - HTTPS URL where the server can be reached\n * @param params.publicKey - Server's public key for encryption (hex string)\n * @returns Promise resolving to transaction hash\n * @throws {UserRejectedRequestError} When user rejects the transaction\n * @throws {BlockchainError} When chain ID is unavailable or transaction fails\n * @throws {ServerAlreadyRegisteredError} When server address is already registered\n * @throws {Error} When wallet account is not available\n *\n * @example\n * ```typescript\n * // Add and trust a server by providing all required details\n * const txHash = await vana.permissions.addAndTrustServer({\n * owner: '0x1234567890abcdef1234567890abcdef12345678',\n * serverAddress: '0x742d35Cc6634C0532925a3b8D4C9db96C4b4d8b6',\n * serverUrl: 'https://myserver.example.com',\n * publicKey: '0x456789abcdef456789abcdef456789abcdef456789abcdef'\n * });\n * console.log('Server added and trusted in transaction:', txHash);\n *\n * // Verify the server is now trusted\n * const trustedServers = await vana.permissions.getTrustedServers();\n * console.log('Now trusting servers:', trustedServers);\n * ```\n */\n async addAndTrustServer(\n params: AddAndTrustServerParams,\n ): Promise<ServerTrustResult> {\n this.assertWallet();\n try {\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Submit directly to the contract\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const userAddress =\n typeof account === \"string\" ? account : account.address;\n const normalizedUserAddress = getAddress(userAddress);\n const normalizedServerAddress = getAddress(params.serverAddress);\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"addAndTrustServerByManager\",\n args: [\n normalizedUserAddress,\n {\n serverAddress: normalizedServerAddress,\n serverUrl: params.serverUrl,\n publicKey: params.publicKey,\n },\n ],\n account,\n chain: this.context.walletClient?.chain ?? null,\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n const txResult = tx({\n hash: txHash,\n from: userAddress,\n contract: \"DataPortabilityServers\",\n fn: \"addAndTrustServerByManager\",\n });\n\n // Wait for events and extract domain data\n if (!this.context.waitForTransactionEvents) {\n throw new BlockchainError(\"waitForTransactionEvents not configured\");\n }\n\n const result = await this.context.waitForTransactionEvents(txResult);\n const event = result.expectedEvents.ServerTrusted;\n if (!event) {\n throw new BlockchainError(\n \"ServerTrusted event not found in transaction\",\n );\n }\n\n const receipt = await this.context.publicClient.getTransactionReceipt({\n hash: txHash,\n });\n\n return {\n transactionHash: txHash,\n blockNumber: receipt.blockNumber,\n gasUsed: receipt.gasUsed,\n user: event.user,\n serverId: event.serverId, // bigint from event\n serverAddress: normalizedServerAddress, // derived from params\n serverUrl: params.serverUrl, // provided in params\n };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"rejected\")) {\n throw new UserRejectedRequestError();\n }\n throw new BlockchainError(\n `Failed to add and trust server: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Trusts a server for data processing (legacy method).\n *\n * @param params - Parameters for trusting the server\n * @returns Promise resolving to transaction hash\n * @deprecated Use addAndTrustServer instead\n */\n async submitTrustServer(\n params: TrustServerParams,\n ): Promise<TransactionResult<\"DataPortabilityServers\", \"trustServer\">> {\n this.assertWallet();\n try {\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Submit directly to the contract using trustServer method\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"trustServer\",\n args: [BigInt(params.serverId)],\n account,\n chain: this.context.walletClient?.chain ?? null,\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash: txHash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"trustServer\",\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"rejected\")) {\n throw new UserRejectedRequestError();\n }\n throw new BlockchainError(\n `Failed to trust server: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Adds and trusts a server using a signature (gasless transaction).\n *\n * @param params - Parameters for adding and trusting the server\n * @returns Promise resolving to TransactionResult with ServerTrustResult event data\n */\n async submitAddAndTrustServerWithSignature(\n params: AddAndTrustServerParams,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityServers\",\n \"addAndTrustServerWithSignature\"\n >\n > {\n this.assertWallet();\n try {\n const nonce = await this.getServersUserNonce();\n\n // Create add and trust server message\n const serverAddress = getAddress(params.serverAddress);\n\n const addAndTrustServerInput: AddAndTrustServerInput = {\n nonce,\n serverAddress,\n publicKey: params.publicKey,\n serverUrl: params.serverUrl,\n };\n\n // Create typed data\n const typedData = await this.composeAddAndTrustServerMessage(\n addAndTrustServerInput,\n );\n\n console.debug(\"🔍 AddAndTrustServer Debug Info:\", {\n nonce: nonce.toString(),\n serverAddress: params.serverAddress,\n publicKey: params.publicKey,\n serverUrl: params.serverUrl,\n domain: typedData.domain,\n typedDataMessage: typedData.message,\n });\n\n // Sign the typed data\n const signature = await this.signTypedData(typedData);\n\n console.debug(\"🔍 Generated signature:\", signature);\n\n // Submit via unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"signed\",\n operation: \"submitAddAndTrustServer\",\n typedData,\n signature,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n hash = await this.submitAddAndTrustServerTransaction(\n addAndTrustServerInput,\n signature,\n options,\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"addAndTrustServerWithSignature\",\n });\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Add and trust server failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\n \"Add and trust server failed with unknown error\",\n );\n }\n }\n\n /**\n * Trusts a server using a signature (gasless transaction - legacy method).\n *\n * @param params - Parameters for trusting the server\n * @returns Promise resolving to transaction hash\n * @deprecated Use addAndTrustServerWithSignature instead\n * @throws {BlockchainError} When chain ID is not available\n * @throws {NonceError} When retrieving user nonce fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {RelayerError} When gasless submission fails\n * @throws {ServerUrlMismatchError} When server URL doesn't match existing registration\n * @throws {BlockchainError} When trust operation fails for any other reason\n */\n async submitTrustServerWithSignature(\n params: TrustServerParams,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\"DataPortabilityServers\", \"trustServerWithSignature\">\n > {\n this.assertWallet();\n try {\n const nonce = await this.getServersUserNonce();\n\n // Create trust server message\n const trustServerInput: TrustServerInput = {\n nonce,\n serverId: params.serverId,\n };\n\n // Create typed data\n const typedData = await this.composeTrustServerMessage(trustServerInput);\n\n // Sign the typed data\n const signature = await this.signTypedData(typedData);\n\n // Submit via unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"signed\",\n operation: \"submitTrustServer\",\n typedData,\n signature,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n hash = await this.submitTrustServerTransaction(\n trustServerInput,\n signature,\n options,\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"trustServerWithSignature\",\n });\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Trust server failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\"Trust server failed with unknown error\");\n }\n }\n\n /**\n * Submits a direct untrust server transaction (without signature).\n *\n * @param params - The untrust server parameters containing server details\n * @returns Promise resolving to the transaction hash\n */\n /**\n * Submits an untrust server transaction directly to the blockchain.\n *\n * @remarks\n * Internal method used for direct blockchain submission of untrust server operations\n * when relayer callbacks are not available.\n *\n * @param params - The untrust server parameters\n * @returns Promise resolving to TransactionResult for transaction tracking\n * @throws {BlockchainError} When contract submission fails\n */\n private async submitDirectUntrustTransaction(\n params: UntrustServerInput,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityServers\", \"untrustServer\">> {\n this.assertWallet();\n try {\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Submit directly to the contract\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"untrustServer\",\n args: [BigInt(params.serverId)],\n account,\n chain: this.context.walletClient?.chain ?? null,\n ...(options?.gas && { gas: options.gas }),\n ...(options?.nonce && { nonce: options.nonce }),\n // Use EIP-1559 if available, otherwise fall back to legacy gasPrice\n ...(options?.maxFeePerGas || options?.maxPriorityFeePerGas\n ? {\n ...(options.maxFeePerGas && {\n maxFeePerGas: options.maxFeePerGas,\n }),\n ...(options.maxPriorityFeePerGas && {\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }),\n }\n : options?.gasPrice && { gasPrice: options.gasPrice }),\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash: txHash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"untrustServer\",\n });\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"rejected\")) {\n throw new UserRejectedRequestError();\n }\n throw new BlockchainError(\n `Failed to untrust server: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Removes a server from the user's trusted servers list in the DataPortabilityServers contract.\n *\n * This revokes the server's authorization to handle data portability requests for the user.\n * The server remains registered in the system but will no longer be trusted by this user.\n *\n * @param params - Parameters for untrusting the server\n * @param params.serverId - The numeric ID of the server to untrust\n * @param options - Optional transaction options for gas parameters and timeout\n * @returns Promise resolving to transaction hash\n * @throws {Error} When wallet account is not available\n * @throws {NonceError} When retrieving user nonce fails\n * @throws {UserRejectedRequestError} When user rejects the transaction\n * @throws {ServerNotTrustedError} When the server is not currently trusted\n * @throws {BlockchainError} When untrust transaction fails\n *\n * @example\n * ```typescript\n * // Untrust a specific server\n * const txHash = await vana.permissions.untrustServer({\n * serverId: 1\n * });\n * console.log('Server untrusted in transaction:', txHash);\n *\n * // Verify the server is no longer trusted\n * const trustedServers = await vana.permissions.getTrustedServers();\n * console.log('Still trusting servers:', trustedServers);\n * ```\n */\n async submitUntrustServer(\n params: UntrustServerParams,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityServers\", \"untrustServer\">> {\n this.assertWallet();\n // Convert UntrustServerParams to UntrustServerInput by adding nonce\n const nonce = await this.getServersUserNonce();\n const untrustServerInput: UntrustServerInput = {\n nonce,\n serverId: params.serverId,\n };\n\n return await this.submitDirectUntrustTransaction(\n untrustServerInput,\n options,\n );\n }\n\n /**\n * Untrusts a server using a signature (gasless transaction).\n *\n * @param params - Parameters for untrusting the server\n * @param params.serverId - The server's Ethereum address to untrust\n * @returns Promise resolving to transaction hash\n * @throws {Error} When wallet account is not available\n * @throws {NonceError} When retrieving user nonce fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {RelayerError} When gasless submission fails\n * @throws {BlockchainError} When untrust transaction fails\n */\n async submitUntrustServerWithSignature(\n params: UntrustServerParams,\n ): Promise<\n TransactionResult<\"DataPortabilityServers\", \"untrustServerWithSignature\">\n > {\n this.assertWallet();\n try {\n const nonce = await this.getServersUserNonce();\n\n // Create untrust server message\n const untrustServerInput: UntrustServerInput = {\n nonce,\n serverId: params.serverId,\n };\n\n // Create typed data\n const typedData =\n await this.composeUntrustServerMessage(untrustServerInput);\n\n // Sign the typed data\n const signature = await this.signTypedData(typedData);\n\n // Submit via unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"signed\",\n operation: \"submitUntrustServer\",\n typedData,\n signature,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n hash = await this.submitSignedUntrustTransaction(typedData, signature);\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"untrustServerWithSignature\",\n });\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Untrust server failed: ${error.message}`,\n error,\n );\n }\n throw new BlockchainError(\"Untrust server failed with unknown error\");\n }\n }\n\n /**\n * Retrieves all servers trusted by a user from the DataPortabilityServers contract.\n *\n * Returns an array of server IDs that the specified user has explicitly trusted.\n * Trusted servers are those that users have authorized to handle their data portability requests.\n *\n * @param userAddress - Optional user address to query (defaults to current wallet user)\n * @returns Promise resolving to array of trusted server IDs (numeric)\n * @throws {BlockchainError} When reading from contract fails or chain is unavailable\n * @throws {NetworkError} When unable to connect to the blockchain network\n *\n * @example\n * ```typescript\n * // Get trusted servers for current user\n * const myServers = await vana.permissions.getTrustedServers();\n * console.log(`I trust ${myServers.length} servers: ${myServers.join(', ')}`);\n *\n * // Get trusted servers for another user\n * const userServers = await vana.permissions.getTrustedServers(\"0x1234...\");\n * console.log(`User trusts servers: ${userServers.join(', ')}`);\n * ```\n */\n async getTrustedServers(userAddress?: Address): Promise<number[]> {\n try {\n const user = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverIds = (await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsValues\",\n args: [user],\n })) as bigint[];\n\n return serverIds.map((id) => Number(id));\n } catch (error) {\n throw new BlockchainError(\n `Failed to get trusted servers: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Gets the total count of trusted servers for a user.\n *\n * @param userAddress - Optional user address (defaults to current user)\n * @returns Promise resolving to the number of trusted servers\n * @throws {BlockchainError} When reading from contract fails or chain is unavailable\n */\n async getTrustedServersCount(userAddress?: Address): Promise<number> {\n try {\n const user = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const count = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsLength\",\n args: [user],\n });\n\n return Number(count);\n } catch (error) {\n throw new BlockchainError(\n `Failed to get trusted servers count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Gets trusted servers with pagination support.\n *\n * @param options - Query options including pagination parameters\n * @returns Promise resolving to paginated trusted servers\n * @throws {BlockchainError} When reading from contract fails or chain is unavailable\n */\n async getTrustedServersPaginated(\n options: TrustedServerQueryOptions = {},\n ): Promise<PaginatedTrustedServers> {\n try {\n const user = options.userAddress ?? this.context.userAddress;\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Get total count first\n const totalCount = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsLength\",\n args: [user],\n });\n\n const total = Number(totalCount);\n\n // If offset is beyond available servers, return empty result\n if (offset >= total) {\n return {\n servers: [],\n total,\n offset,\n limit,\n hasMore: false,\n };\n }\n\n // Calculate how many servers to fetch\n const endIndex = Math.min(offset + limit, total);\n\n // Build multicall batch for fetching server IDs\n const serverIdCalls = [];\n for (let i = offset; i < endIndex; i++) {\n serverIdCalls.push({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsAt\",\n args: [user, BigInt(i)],\n } as const);\n }\n\n // Fetch all server IDs in batches using gasAwareMulticall\n const serverIdResults = await gasAwareMulticall<\n typeof serverIdCalls,\n false\n >(this.context.publicClient, {\n contracts: serverIdCalls,\n });\n\n // Extract server IDs from results\n const servers = serverIdResults\n .map((result) => Number(result))\n .filter((id) => id > 0);\n\n return {\n servers,\n total,\n offset,\n limit,\n hasMore: offset + limit < total,\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get paginated trusted servers: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Gets trusted servers with their complete information.\n *\n * @param options - Query options\n * @returns Promise resolving to array of trusted server info\n * @throws {BlockchainError} When reading from contract fails or chain is unavailable\n */\n async getTrustedServersWithInfo(\n options: TrustedServerQueryOptions = {},\n ): Promise<TrustedServerInfo[]> {\n try {\n // Get paginated server IDs\n const paginatedResult = await this.getTrustedServersPaginated(options);\n\n // Get contract addresses and ABIs\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Build multicall batch for fetching server info\n const serverInfoCalls = paginatedResult.servers.map(\n (serverId) =>\n ({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"servers\",\n args: [BigInt(serverId)],\n }) as const,\n );\n\n // Fetch all server info in batches using gasAwareMulticall\n const serverInfoResults = await gasAwareMulticall<\n typeof serverInfoCalls,\n true // Allow failures for individual server lookups\n >(this.context.publicClient, {\n contracts: serverInfoCalls,\n allowFailure: true,\n });\n\n // Process results\n return serverInfoResults.map((result, index) => {\n const serverId = paginatedResult.servers[index];\n\n if (result.status === \"success\" && result.result) {\n const serverInfo = result.result as {\n id: bigint;\n owner: Address;\n serverAddress: Address;\n publicKey: string;\n url: string;\n };\n\n return {\n id: BigInt(serverId),\n owner: serverInfo.owner,\n serverAddress: serverInfo.serverAddress,\n publicKey: serverInfo.publicKey,\n url: serverInfo.url,\n startBlock: 0n, // We don't have this info from the old method structure\n endBlock: 0n, // 0 means still active\n };\n } else {\n // If server info fails, return basic info\n return {\n id: BigInt(serverId),\n owner: \"0x0000000000000000000000000000000000000000\",\n serverAddress: \"0x0000000000000000000000000000000000000000\",\n publicKey: \"\",\n url: \"\",\n startBlock: 0n,\n endBlock: 0n,\n };\n }\n });\n } catch (error) {\n throw new BlockchainError(\n `Failed to get trusted servers with info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Gets server information for multiple servers efficiently.\n *\n * @remarks\n * This method uses multicall to fetch information for multiple servers in a single\n * blockchain call, improving performance when querying many servers. Failed lookups\n * are returned separately for error handling.\n *\n * @param serverIds - Array of numeric server IDs to query\n * @returns Promise resolving to batch result containing successful lookups and failed IDs\n * @throws {BlockchainError} When reading from contract fails or chain is unavailable\n * @example\n * ```typescript\n * const result = await vana.permissions.getServerInfoBatch([1, 2, 3, 999]);\n *\n * // Process successful lookups\n * result.servers.forEach((server, id) => {\n * console.log(`Server ${id}: ${server.url}`);\n * });\n *\n * // Handle failed lookups\n * if (result.failed.length > 0) {\n * console.log(`Failed to fetch: ${result.failed.join(', ')}`);\n * }\n * ```\n */\n async getServerInfoBatch(\n serverIds: number[],\n ): Promise<BatchServerInfoResult> {\n if (serverIds.length === 0) {\n return {\n servers: new Map(),\n failed: [],\n };\n }\n\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Build multicall batch for fetching server info\n const serverInfoCalls = serverIds.map(\n (serverId) =>\n ({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"servers\",\n args: [BigInt(serverId)],\n }) as const,\n );\n\n // Fetch all server info in batches using gasAwareMulticall\n const serverInfoResults = await gasAwareMulticall<\n typeof serverInfoCalls,\n true // Allow failures for individual server lookups\n >(this.context.publicClient, {\n contracts: serverInfoCalls,\n allowFailure: true,\n });\n\n // Process results\n const results = serverInfoResults.map((result, index) => {\n const serverId = serverIds[index];\n\n if (result.status === \"success\" && result.result) {\n const serverInfo = result.result as {\n id: bigint;\n owner: Address;\n url: string;\n serverAddress: Address;\n publicKey: string;\n };\n\n const server: Server = {\n id: Number(serverInfo.id),\n owner: serverInfo.owner,\n url: serverInfo.url,\n serverAddress: serverInfo.serverAddress,\n publicKey: serverInfo.publicKey,\n };\n\n return { serverId, server, success: true };\n } else {\n return { serverId, server: null, success: false };\n }\n });\n\n // Separate successful and failed requests\n const servers = new Map<number, Server>();\n const failed: number[] = [];\n\n for (const result of results) {\n if (result.success && result.server) {\n servers.set(result.serverId, result.server);\n } else {\n failed.push(result.serverId);\n }\n }\n\n return { servers, failed };\n } catch (error) {\n throw new BlockchainError(\n `Failed to batch get server info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Checks whether a specific server is trusted by a user.\n *\n * @remarks\n * This method queries the user's trusted server list and checks if the specified\n * server is present. Returns both the trust status and the index in the trust list\n * if trusted.\n *\n * @param serverId - Numeric server ID to check\n * @param userAddress - Optional user address (defaults to current user)\n * @returns Promise resolving to server trust status with trust index if applicable\n * @throws {BlockchainError} When reading from contract fails\n * @example\n * ```typescript\n * const status = await vana.permissions.checkServerTrustStatus(1);\n * if (status.isTrusted) {\n * console.log(`Server is trusted at index ${status.trustIndex}`);\n * } else {\n * console.log('Server is not trusted');\n * }\n * ```\n */\n async checkServerTrustStatus(\n serverId: number,\n userAddress?: Address,\n ): Promise<ServerTrustStatus> {\n try {\n const user = userAddress ?? this.context.userAddress;\n const trustedServers = await this.getTrustedServers(user);\n\n const trustIndex = trustedServers.findIndex(\n (server) => server === serverId,\n );\n\n return {\n serverId,\n isTrusted: trustIndex !== -1,\n trustIndex: trustIndex !== -1 ? trustIndex : undefined,\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to check server trust status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Composes EIP-712 typed data for AddAndTrustServer.\n *\n * @remarks\n * Creates the complete typed data structure required for EIP-712 signature generation\n * when adding and trusting a new server in a single transaction.\n *\n * @param input - The add and trust server input data containing server details\n * @returns Promise resolving to the typed data structure for server add and trust\n */\n private async composeAddAndTrustServerMessage(\n input: AddAndTrustServerInput,\n ): Promise<AddAndTrustServerTypedData> {\n const domain = await this.getServersDomain();\n\n console.debug(domain);\n\n return {\n domain,\n types: {\n AddServer: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"serverAddress\", type: \"address\" },\n { name: \"publicKey\", type: \"string\" },\n { name: \"serverUrl\", type: \"string\" },\n ],\n },\n primaryType: \"AddServer\",\n message: input,\n };\n }\n\n /**\n * Composes EIP-712 typed data for TrustServer.\n *\n * @param input - The trust server input data containing server details\n * @returns Promise resolving to the typed data structure for server trust\n */\n private async composeTrustServerMessage(\n input: TrustServerInput,\n ): Promise<TrustServerTypedData> {\n const domain = await this.getServersDomain();\n\n return {\n domain,\n types: {\n TrustServer: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"serverId\", type: \"uint256\" },\n ],\n },\n primaryType: \"TrustServer\",\n message: input,\n };\n }\n\n /**\n * Composes EIP-712 typed data for UntrustServer.\n *\n * @param input - The untrust server input data containing server details\n * @returns Promise resolving to the typed data structure for server untrust\n */\n private async composeUntrustServerMessage(\n input: UntrustServerInput,\n ): Promise<UntrustServerTypedData> {\n const domain = await this.getServersDomain();\n\n return {\n domain,\n types: {\n UntrustServer: [\n { name: \"nonce\", type: \"uint256\" },\n { name: \"serverId\", type: \"uint256\" },\n ],\n },\n primaryType: \"UntrustServer\",\n message: input,\n };\n }\n\n /**\n * Gets the EIP-712 domain for DataPortabilityServers signatures.\n *\n * @returns Promise resolving to the EIP-712 domain configuration\n */\n private async getServersDomain() {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n\n return {\n name: \"VanaDataPortabilityServers\",\n version: \"1\",\n chainId,\n verifyingContract: DataPortabilityServersAddress,\n };\n }\n\n /**\n * Submits an add and trust server transaction directly to the blockchain.\n *\n * @param addAndTrustServerInput - The add and trust server input data containing server details\n * @param signature - The cryptographic signature for the transaction\n * @returns Promise resolving to the transaction hash\n */\n private async submitAddAndTrustServerTransaction(\n addAndTrustServerInput: AddAndTrustServerInput,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n console.debug(\"🔍 Transaction Debug Info:\", {\n chainId,\n contractAddress: DataPortabilityServersAddress,\n input: {\n nonce: addAndTrustServerInput.nonce.toString(),\n serverAddress: addAndTrustServerInput.serverAddress,\n publicKey: addAndTrustServerInput.publicKey,\n serverUrl: addAndTrustServerInput.serverUrl,\n },\n signature,\n });\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"addAndTrustServerWithSignature\",\n args: [\n {\n nonce: addAndTrustServerInput.nonce,\n serverAddress: addAndTrustServerInput.serverAddress,\n publicKey: addAndTrustServerInput.publicKey,\n serverUrl: addAndTrustServerInput.serverUrl,\n },\n formattedSignature,\n ],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...(options && {\n gas: options.gas,\n nonce: options.nonce,\n // Use EIP-1559 gas pricing if available, otherwise legacy\n ...(options.maxFeePerGas || options.maxPriorityFeePerGas\n ? {\n maxFeePerGas: options.maxFeePerGas,\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }\n : options.gasPrice\n ? { gasPrice: options.gasPrice }\n : {}),\n }),\n });\n\n return txHash;\n }\n\n /**\n * Submits a trust server transaction directly to the blockchain.\n *\n * @param trustServerInput - The trust server input data containing server details\n * @param signature - The cryptographic signature for the transaction\n * @returns Promise resolving to the transaction hash\n */\n private async submitTrustServerTransaction(\n trustServerInput: TrustServerInput,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"trustServerWithSignature\",\n args: [\n {\n nonce: trustServerInput.nonce,\n serverId: BigInt(trustServerInput.serverId),\n },\n formattedSignature,\n ],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...this.spreadTransactionOptions(options),\n });\n\n return txHash;\n }\n\n /**\n * Submits a revoke transaction directly to the blockchain with signature.\n *\n * @param typedData - The EIP-712 typed data structure for the revoke operation\n * @param signature - The cryptographic signature authorizing the revoke\n * @returns Promise resolving to the transaction hash\n */\n private async submitDirectRevokeTransaction(\n typedData: RevokePermissionTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\"DataPortabilityPermissions\");\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"revokePermissionWithSignature\",\n args: [typedData.message, formattedSignature],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...(options && {\n gas: options.gas,\n nonce: options.nonce,\n // Use EIP-1559 gas pricing if available, otherwise legacy\n ...(options.maxFeePerGas || options.maxPriorityFeePerGas\n ? {\n maxFeePerGas: options.maxFeePerGas,\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }\n : options.gasPrice\n ? { gasPrice: options.gasPrice }\n : {}),\n }),\n });\n\n return txHash;\n }\n\n /**\n * Submits an untrust server transaction with signature.\n *\n * @param typedData - The EIP-712 typed data structure for the untrust operation\n * @param signature - The cryptographic signature authorizing the untrust\n * @returns Promise resolving to the transaction hash\n */\n private async submitSignedUntrustTransaction(\n typedData: UntrustServerTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n // Convert serverId to bigint for contract compatibility\n const contractMessage = {\n nonce: typedData.message.nonce,\n serverId: BigInt(typedData.message.serverId),\n };\n\n // Submit with signature to verify user authorization\n const txHash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"untrustServerWithSignature\",\n args: [contractMessage, formattedSignature],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...(options && {\n gas: options.gas,\n nonce: options.nonce,\n // Use EIP-1559 gas pricing if available, otherwise legacy\n ...(options.maxFeePerGas || options.maxPriorityFeePerGas\n ? {\n maxFeePerGas: options.maxFeePerGas,\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }\n : options.gasPrice\n ? { gasPrice: options.gasPrice }\n : {}),\n }),\n });\n\n return txHash;\n }\n\n // ===========================\n // GRANTEE METHODS\n // ===========================\n\n /**\n * Registers a new grantee in the DataPortabilityGrantees contract.\n *\n * A grantee is an entity (like an application) that can receive data permissions\n * from users. Once registered, users can grant the grantee access to their data.\n *\n * This method supports gasless transactions via relayer when configured.\n * If no relayer is available, it falls back to direct wallet transactions.\n *\n * @param params - Parameters for registering the grantee\n * @param params.owner - The Ethereum address that will own this grantee registration\n * @param params.granteeAddress - The Ethereum address of the grantee (application)\n * @param params.publicKey - The public key used for data encryption/decryption (hex string)\n * @param options - Optional transaction options for gas parameters and timeout\n * @returns Promise resolving to the transaction hash\n * @throws {BlockchainError} When the grantee registration transaction fails\n * @throws {UserRejectedRequestError} When user rejects the transaction\n * @throws {RelayerError} When gasless transaction submission fails\n *\n * @example\n * ```typescript\n * const txHash = await vana.permissions.registerGrantee({\n * owner: \"0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36\",\n * granteeAddress: \"0xApp1234567890123456789012345678901234567890\",\n * publicKey: \"0x1234567890abcdef...\"\n * });\n * console.log(`Grantee registered in transaction: ${txHash}`);\n * ```\n */\n async submitRegisterGrantee(\n params: RegisterGranteeParams,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityGrantees\", \"registerGrantee\">> {\n try {\n // Submit via unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"direct\",\n operation: \"submitRegisterGrantee\",\n params: {\n owner: params.owner,\n granteeAddress: params.granteeAddress,\n publicKey: params.publicKey,\n },\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"direct\") {\n const result = response.result as { transactionHash: Hash };\n hash = result.transactionHash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n // Fall back to direct wallet transaction\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n const ownerAddress = getAddress(params.owner);\n const granteeAddress = getAddress(params.granteeAddress);\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n hash = await this.context.walletClient.writeContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"registerGrantee\",\n args: [ownerAddress, granteeAddress, params.publicKey],\n account,\n chain: this.context.walletClient?.chain ?? null,\n ...this.spreadTransactionOptions(options),\n });\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityGrantees\",\n fn: \"registerGrantee\",\n });\n } catch (error) {\n if (error instanceof Error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof BlockchainError\n ) {\n throw error;\n }\n\n // Handle viem contract errors\n if (error.name === \"ContractFunctionExecutionError\") {\n throw new BlockchainError(\n `Grantee registration failed: ${error.message}`,\n error,\n );\n }\n\n // Handle user rejection\n if (error.name === \"UserRejectedRequestError\") {\n throw new UserRejectedRequestError(\n \"User rejected the grantee registration transaction\",\n );\n }\n\n // Handle other blockchain errors\n throw new BlockchainError(\n `Failed to register grantee: ${error.message}`,\n error,\n );\n }\n\n // Handle non-Error objects\n throw new BlockchainError(`Failed to register grantee: ${String(error)}`);\n }\n }\n\n // TODO: When DataPortabilityGrantees contract adds registerGranteeWithSignature function,\n // implement submitRegisterGranteeWithSignature and submitSignedRegisterGrantee methods\n // to support EIP-712 signed gasless transactions via relayer.\n // Current implementation above supports direct gasless transactions (relayer pays gas directly).\n\n /**\n * Retrieves all registered grantees from the DataPortabilityGrantees contract.\n *\n * Returns a paginated list of all grantees (applications) that have been registered\n * in the system and can receive data permissions from users.\n *\n * @param options - Query options for pagination and filtering\n * @param options.limit - Maximum number of grantees to return (default: 50)\n * @param options.offset - Number of grantees to skip for pagination (default: 0)\n * @returns Promise resolving to paginated grantees with metadata\n * @throws {BlockchainError} When contract read operation fails\n * @throws {NetworkError} When unable to connect to the blockchain network\n *\n * @example\n * ```typescript\n * // Get first 10 grantees\n * const result = await vana.permissions.getGrantees({\n * limit: 10,\n * offset: 0\n * });\n *\n * console.log(`Found ${result.total} total grantees`);\n * result.grantees.forEach(grantee => {\n * console.log(`Grantee ${grantee.id}: ${grantee.granteeAddress}`);\n * });\n *\n * // Check if there are more results\n * if (result.hasMore) {\n * console.log('More grantees available');\n * }\n * ```\n */\n async getGrantees(\n options: GranteeQueryOptions = {},\n ): Promise<PaginatedGrantees> {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n // Get total count\n const totalCount = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteesCount\",\n });\n\n const total = Number(totalCount);\n const limit = options.limit ?? 50;\n const offset = options.offset ?? 0;\n const includePermissions = options.includePermissions ?? true; // Default to true for backward compatibility\n\n const startId = total - offset;\n const endId = Math.max(startId - limit + 1, 1);\n const granteeIds = Array.from(\n { length: startId - endId + 1 },\n (_, i) => startId - i, // Generate IDs in descending order\n );\n\n let grantees: Grantee[];\n\n if (includePermissions) {\n const granteePromises = granteeIds.map((granteeId) =>\n this.getGranteeById(granteeId),\n );\n\n const granteeResults = await Promise.all(granteePromises);\n\n // Filter out null results\n grantees = granteeResults.filter(\n (grantee): grantee is Grantee => grantee !== null,\n );\n } else {\n type GranteeV2Info = {\n owner: Address;\n granteeAddress: Address;\n publicKey: string;\n permissionsCount: bigint;\n };\n\n const granteeInfoPromises = granteeIds.map(\n async (granteeId): Promise<Grantee | null> => {\n try {\n const granteeInfo = (await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteesV2\",\n args: [BigInt(granteeId)],\n })) as GranteeV2Info;\n\n const grantee: Grantee = {\n id: granteeId,\n owner: granteeInfo.owner,\n address: granteeInfo.granteeAddress,\n publicKey: granteeInfo.publicKey,\n permissionIds: [], // TypeScript infers number[] from Grantee type\n };\n\n return grantee;\n } catch (error) {\n console.warn(`Failed to fetch grantee ${granteeId}:`, error);\n return null;\n }\n },\n );\n\n const granteeInfoResults = await Promise.all(granteeInfoPromises);\n\n // Filter out null results\n grantees = granteeInfoResults.filter(\n (grantee): grantee is Grantee => grantee !== null,\n );\n }\n\n return {\n grantees,\n total,\n offset,\n limit,\n hasMore: offset + limit < total,\n };\n }\n\n /**\n * Retrieves a specific grantee by their Ethereum wallet address.\n *\n * @remarks\n * Looks up a registered grantee (application) using their Ethereum address\n * and returns their complete registration information including all associated permissions.\n *\n * Returns `null` if the address is not registered as a grantee or if an error occurs.\n *\n * @param granteeAddress - Ethereum wallet address of the grantee to query\n * @returns Grantee information including ID, addresses, public key, and permission IDs, or `null` if not found\n *\n * @example\n * ```typescript\n * const granteeAddress = \"0xApp1234567890123456789012345678901234567890\";\n * const grantee = await vana.permissions.getGranteeByAddress(granteeAddress);\n *\n * if (grantee) {\n * console.log(`Found grantee ${grantee.id}`);\n * console.log(`Owner: ${grantee.owner}`);\n * console.log(`Public Key: ${grantee.publicKey}`);\n * console.log(`Permissions: ${grantee.permissionIds.join(', ')}`);\n * } else {\n * console.log('Grantee not found');\n * }\n * ```\n */\n async getGranteeByAddress(granteeAddress: Address): Promise<Grantee | null> {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n try {\n // Get the grantee ID from the address\n const granteeId = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteeAddressToId\",\n args: [granteeAddress],\n });\n\n // If granteeId is 0, the address is not registered\n if (granteeId === 0n) {\n return null;\n }\n\n // Use getGranteeById to fetch the complete grantee information with permissions\n return await this.getGranteeById(Number(granteeId));\n } catch (error) {\n console.warn(`Failed to fetch grantee ${granteeAddress}:`, error);\n return null;\n }\n }\n\n /**\n * Retrieves a specific grantee by their unique ID.\n *\n * @remarks\n * Looks up a registered grantee (application) using their numeric ID assigned during\n * registration and returns their complete information including all associated permissions.\n *\n * Returns `null` if the grantee is not found or if an error occurs during fetching.\n *\n * @param granteeId - Unique numeric ID of the grantee (1-indexed)\n * @returns Grantee information including ID, addresses, public key, and permission IDs, or `null` if not found\n *\n * @example\n * ```typescript\n * const grantee = await vana.permissions.getGranteeById(1);\n *\n * if (grantee) {\n * console.log(`Grantee ID: ${grantee.id}`);\n * console.log(`Address: ${grantee.address}`);\n * console.log(`Owner: ${grantee.owner}`);\n * console.log(`Total permissions: ${grantee.permissionIds.length}`);\n * } else {\n * console.log('Grantee with ID 1 not found');\n * }\n * ```\n */\n async getGranteeById(granteeId: number): Promise<Grantee | null> {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n try {\n // Define contract return type for granteesV2\n type GranteeV2Info = {\n owner: Address;\n granteeAddress: Address;\n publicKey: string;\n permissionsCount: bigint;\n };\n\n // First, get the grantee info (now with permissionsCount instead of permissionIds)\n const granteeInfoResult = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteesV2\",\n args: [BigInt(granteeId)],\n });\n\n const granteeInfo = granteeInfoResult as GranteeV2Info;\n\n // Fetch all permission IDs using pagination\n const allPermissionIdsResult = await this.getGranteePermissionsPaginated(\n BigInt(granteeId),\n );\n\n const allPermissionIds = allPermissionIdsResult as bigint[];\n\n return {\n id: granteeId,\n owner: granteeInfo.owner,\n address: granteeInfo.granteeAddress,\n publicKey: granteeInfo.publicKey,\n permissionIds: allPermissionIds.map((id) => Number(id)),\n };\n } catch (error) {\n console.warn(`Failed to fetch grantee ${granteeId}:`, error);\n return null;\n }\n }\n\n // ===========================\n // DATA PORTABILITY SERVERS HELPER METHODS\n // ===========================\n\n /**\n * Get all trusted server IDs for a user\n *\n * @param userAddress - User address to query (defaults to current user)\n * @returns Promise resolving to array of server IDs\n */\n async getUserServerIds(userAddress?: Address): Promise<bigint[]> {\n try {\n const targetAddress = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverIds = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsValues\",\n args: [targetAddress],\n });\n\n return [...serverIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get server ID at specific index for a user\n *\n * @param userAddress - User address to query\n * @param serverIndex - Index in the user's server list\n * @returns Promise resolving to server ID\n */\n async getUserServerIdAt(\n userAddress: Address,\n serverIndex: bigint,\n ): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverId = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsAt\",\n args: [userAddress, serverIndex],\n });\n\n return serverId;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server ID at index: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get the number of trusted servers for a user\n *\n * @param userAddress - User address to query (defaults to current user)\n * @returns Promise resolving to number of trusted servers\n */\n async getUserServerCount(userAddress?: Address): Promise<bigint> {\n try {\n const targetAddress = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const count = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsLength\",\n args: [targetAddress],\n });\n\n return count;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get detailed information about trusted servers for a user\n *\n * @param userAddress - User address to query (defaults to current user)\n * @returns Promise resolving to array of trusted server info\n */\n async getUserTrustedServers(\n userAddress?: Address,\n ): Promise<TrustedServerInfo[]> {\n try {\n const targetAddress = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const servers = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerValues\",\n args: [targetAddress],\n });\n\n return [...servers];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user trusted servers: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get trusted server info for a specific server ID and user\n *\n * @param userAddress - User address to query\n * @param serverId - Server ID to get info for\n * @returns Promise resolving to trusted server info\n */\n async getUserTrustedServer(\n userAddress: Address,\n serverId: bigint,\n ): Promise<TrustedServerInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServers\",\n args: [userAddress, serverId],\n });\n\n return serverInfo;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user trusted server: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get server information by server ID\n *\n * @param serverId - Server ID to get info for\n * @returns Promise resolving to server info\n */\n async getServerInfo(serverId: bigint): Promise<ServerInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"servers\",\n args: [serverId],\n });\n\n return serverInfo;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get server info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get server information by server address\n *\n * @param serverAddress - Server address to get info for\n * @returns Promise resolving to server info\n */\n async getServerInfoByAddress(serverAddress: Address): Promise<ServerInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"serverByAddress\",\n args: [serverAddress],\n });\n\n return serverInfo;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get server info by address: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n // ===========================\n // DATA PORTABILITY PERMISSIONS HELPER METHODS\n // ===========================\n\n /**\n * Get all permission IDs for a user\n *\n * @param userAddress - User address to query (defaults to current user)\n * @returns Promise resolving to array of permission IDs\n */\n async getUserPermissionIds(userAddress?: Address): Promise<bigint[]> {\n try {\n const targetAddress = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionIds = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsValues\",\n args: [targetAddress],\n });\n\n return [...permissionIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get permission ID at specific index for a user\n *\n * @param userAddress - User address to query\n * @param permissionIndex - Index in the user's permission list\n * @returns Promise resolving to permission ID\n */\n async getUserPermissionIdAt(\n userAddress: Address,\n permissionIndex: bigint,\n ): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionId = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsAt\",\n args: [userAddress, permissionIndex],\n });\n\n return permissionId;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission ID at index: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get the number of permissions for a user\n *\n * @param userAddress - User address to query (defaults to current user)\n * @returns Promise resolving to number of permissions\n */\n async getUserPermissionCount(userAddress?: Address): Promise<bigint> {\n try {\n const targetAddress = userAddress ?? this.context.userAddress;\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const count = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsLength\",\n args: [targetAddress],\n });\n\n return count;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission count: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get detailed permission information by permission ID\n *\n * @param permissionId - Permission ID to get info for\n * @returns Promise resolving to permission info\n */\n async getPermissionInfo(permissionId: bigint): Promise<PermissionInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionInfo = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"permissions\",\n args: [permissionId],\n });\n\n return permissionInfo;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get permission info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get all permission IDs for a specific file\n *\n * @param fileId - File ID to get permissions for\n * @returns Promise resolving to array of permission IDs\n */\n async getFilePermissionIds(fileId: bigint): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionIds = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"filePermissionIds\",\n args: [fileId],\n });\n\n return [...permissionIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get file permission IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get all file IDs for a specific permission\n *\n * @param permissionId - Permission ID to get files for\n * @returns Promise resolving to array of file IDs\n */\n async getPermissionFileIds(permissionId: bigint): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const fileIds = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"permissionFileIds\",\n args: [permissionId],\n });\n\n return [...fileIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get permission file IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Retrieves detailed grant file data from IPFS or HTTP storage.\n *\n * @remarks\n * This method automatically uses the SDK's configured downloadRelayer to bypass CORS restrictions.\n * Use this instead of importing the standalone `retrieveGrantFile` utility.\n *\n * @param grantUrl - The grant file URL (from OnChainPermissionGrant.grantUrl)\n * @returns Promise resolving to the complete grant file with operation details\n * @throws {NetworkError} When all retrieval attempts fail\n * @example\n * ```typescript\n * const grants = await vana.permissions.getUserPermissionGrantsOnChain();\n * const grantFile = await vana.permissions.retrieveGrantFile(grants[0].grantUrl);\n * console.log(`Operation: ${grantFile.operation}`);\n * ```\n */\n async retrieveGrantFile(grantUrl: string): Promise<GrantFile> {\n const { retrieveGrantFile: retrieveGrantFileUtil } = await import(\n \"../utils/grantFiles\"\n );\n return retrieveGrantFileUtil(\n grantUrl,\n undefined,\n this.context.downloadRelayer,\n );\n }\n\n /**\n * Get all permissions for a specific file (alias for getFilePermissionIds)\n *\n * @param fileId - File ID to get permissions for\n * @returns Promise resolving to array of permission IDs\n */\n async getFilePermissions(fileId: bigint): Promise<bigint[]> {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\"DataPortabilityPermissions\");\n\n const permissions = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"filePermissions\",\n args: [fileId],\n });\n\n return [...permissions];\n }\n\n // ===========================\n // DATA PORTABILITY GRANTEES HELPER METHODS\n // ===========================\n\n /**\n * Retrieves detailed grantee information including all associated permissions.\n *\n * @remarks\n * Returns grantee metadata and associated permission IDs. Uses the newer\n * paginated contract method internally for efficient permission fetching.\n *\n * @param granteeId - Unique grantee identifier as bigint\n * @returns Grantee information containing owner address, grantee address, public key, and permission IDs\n * @throws {BlockchainError} When grantee ID is not found or contract read fails\n *\n * @example\n * ```typescript\n * const granteeInfo = await vana.permissions.getGranteeInfo(BigInt(1));\n * console.log(`Grantee ${granteeInfo.granteeAddress} has ${granteeInfo.permissionIds.length} permissions`);\n * ```\n */\n async getGranteeInfo(granteeId: bigint): Promise<GranteeInfo> {\n try {\n // Use getGranteeById to fetch the complete grantee information\n const grantee = await this.getGranteeById(Number(granteeId));\n\n if (!grantee) {\n throw new Error(\"Grantee not found\");\n }\n\n // Return as GranteeInfo (without the id field)\n return {\n owner: grantee.owner,\n granteeAddress: grantee.address,\n publicKey: grantee.publicKey,\n permissionIds: grantee.permissionIds.map((id) => BigInt(id)),\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get grantee info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Retrieves detailed grantee information by wallet address.\n *\n * @remarks\n * Looks up the grantee ID from the provided address, then fetches complete\n * grantee information including all associated permissions.\n *\n * @param granteeAddress - Ethereum wallet address of the grantee to query\n * @returns Grantee information containing owner address, grantee address, public key, and permission IDs\n * @throws {BlockchainError} When grantee address is not registered or contract read fails\n *\n * @example\n * ```typescript\n * const granteeInfo = await vana.permissions.getGranteeInfoByAddress(\"0x742d35Cc6634c0532925a3b844Bc9e8e1ee3b2De\");\n * console.log(`Found grantee with ${granteeInfo.permissionIds.length} permissions`);\n * ```\n */\n async getGranteeInfoByAddress(granteeAddress: Address): Promise<GranteeInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n // Get the grantee ID from the address\n const granteeIdResult = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteeAddressToId\",\n args: [granteeAddress],\n });\n\n const granteeId = granteeIdResult as bigint;\n\n // If granteeId is 0, the address is not registered\n if (granteeId === 0n) {\n throw new Error(\"Grantee not found\");\n }\n\n // Use getGranteeById to fetch the complete grantee information\n const grantee = await this.getGranteeById(Number(granteeId));\n\n if (!grantee) {\n throw new Error(\"Grantee not found\");\n }\n\n // Return as GranteeInfo (without the id field)\n return {\n owner: grantee.owner,\n granteeAddress: grantee.address,\n publicKey: grantee.publicKey,\n permissionIds: grantee.permissionIds.map((id) => BigInt(id)),\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get grantee info by address: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get all permission IDs for a specific grantee\n *\n * @param granteeId - Grantee ID to get permissions for\n * @returns Promise resolving to array of permission IDs\n */\n async getGranteePermissionIds(granteeId: bigint): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n const permissionIds = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteePermissionIds\",\n args: [granteeId],\n });\n\n return [...permissionIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get grantee permission IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get all permissions for a specific grantee (alias for getGranteePermissionIds)\n *\n * @param granteeId - Grantee ID to get permissions for\n * @returns Promise resolving to array of permission IDs\n */\n async getGranteePermissions(granteeId: bigint): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n const permissions = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteePermissions\",\n args: [granteeId],\n });\n\n return [...permissions];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get grantee permissions: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Retrieves permission IDs for a specific grantee with flexible pagination.\n *\n * @remarks\n * **Pagination Behavior:**\n * Returns different types based on parameters:\n * - Without offset/limit: Returns `bigint[]` of all permissions using batched multicall\n * - With offset/limit: Returns paginated object with `permissionIds`, `totalCount`, and `hasMore`\n *\n * Uses gas-aware multicall for efficient batch fetching when retrieving all permissions.\n *\n * @param granteeId - Grantee ID to get permissions for\n * @param options - Optional pagination parameters\n * @param options.offset - Zero-based starting index for pagination. Defaults to 0 when fetching all permissions. Required for single-page requests.\n * @param options.limit - Maximum number of permission IDs to return per page. Defaults to 100 when fetching all permissions. Required for single-page requests.\n * @returns When called without options: Array of all permission IDs as `bigint[]`.\n * When called with offset and limit: Paginated result object containing `permissionIds` array,\n * `totalCount`, and `hasMore` boolean.\n * @throws {BlockchainError} When contract read operation fails\n *\n * @example\n * ```typescript\n * // Fetch all permissions (no pagination params)\n * const allPermissions = await vana.permissions.getGranteePermissionsPaginated(BigInt(1));\n * console.log(`Total permissions: ${allPermissions.length}`);\n *\n * // Fetch a specific page (with pagination params)\n * const page = await vana.permissions.getGranteePermissionsPaginated(BigInt(1), {\n * offset: BigInt(0),\n * limit: BigInt(100)\n * });\n * console.log(`Fetched ${page.permissionIds.length} permissions`);\n * console.log(`Total: ${page.totalCount}, Has more: ${page.hasMore}`);\n *\n * // Fetch next page\n * if (page.hasMore) {\n * const nextPage = await vana.permissions.getGranteePermissionsPaginated(BigInt(1), {\n * offset: BigInt(100),\n * limit: BigInt(100)\n * });\n * }\n * ```\n */\n async getGranteePermissionsPaginated(\n granteeId: bigint,\n options?: {\n offset?: bigint;\n limit?: bigint;\n },\n ): Promise<\n | bigint[] // When fetching all (no options)\n | {\n // When fetching a specific page (with options)\n permissionIds: bigint[];\n totalCount: bigint;\n hasMore: boolean;\n }\n > {\n // Define contract return type once for all uses\n type PaginatedResult = readonly [\n permissionIds: readonly bigint[],\n totalCount: bigint,\n hasMore: boolean,\n ];\n\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityGranteesAddress = getContractAddress(\n chainId,\n \"DataPortabilityGrantees\",\n );\n const DataPortabilityGranteesAbi = getAbi(\"DataPortabilityGrantees\");\n\n // If both offset and limit are provided, fetch just that page\n const fetchOnlyOnePage =\n options?.offset !== undefined && options?.limit !== undefined;\n\n if (fetchOnlyOnePage) {\n // For single page requests, make a direct contract call\n const result = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteePermissionsPaginated\",\n args: [granteeId, options.offset!, options.limit!],\n });\n\n const [permissionIds, totalCount, hasMore] = result as PaginatedResult;\n\n return {\n permissionIds: [...permissionIds],\n totalCount,\n hasMore,\n };\n }\n\n // For fetching all permissions, use gasAwareMulticall to batch pagination calls\n // First, make an initial call to get the total count\n const countResult = await this.context.publicClient.readContract({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteePermissionsPaginated\",\n args: [granteeId, BigInt(0), BigInt(1)],\n });\n\n const [, totalCount] = countResult as PaginatedResult;\n\n // If no permissions exist, return early\n if (totalCount === BigInt(0)) {\n return [];\n }\n\n // Build multicall contracts for all pages\n const batchSize = options?.limit ?? BigInt(100);\n const startOffset = options?.offset ?? BigInt(0);\n const endOffset = totalCount;\n const numBatches = Math.ceil(\n Number(endOffset - startOffset) / Number(batchSize),\n );\n const paginationCalls = Array.from({ length: numBatches }, (_, i) => ({\n address: DataPortabilityGranteesAddress,\n abi: DataPortabilityGranteesAbi,\n functionName: \"granteePermissionsPaginated\" as const,\n args: [\n granteeId,\n startOffset + BigInt(i) * batchSize,\n batchSize,\n ] as const,\n }));\n\n // Execute all pagination calls in parallel using gasAwareMulticall\n const results = await gasAwareMulticall<typeof paginationCalls, false>(\n this.context.publicClient,\n {\n contracts: paginationCalls,\n },\n );\n\n // Flatten all permission IDs from all pages\n const allPermissionIds: bigint[] = [];\n for (const result of results) {\n const [permissionIds] = result as PaginatedResult;\n allPermissionIds.push(...permissionIds);\n }\n\n return allPermissionIds;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get grantee permissions: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n // ===== DataPortabilityServersImplementation Methods =====\n\n /**\n * Get all server IDs for a user\n *\n * @param userAddress - User address to get server IDs for\n * @returns Promise resolving to array of server IDs\n */\n async getUserServerIdsValues(userAddress: Address): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverIds = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsValues\",\n args: [userAddress],\n });\n\n return [...serverIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get server ID at specific index for a user\n *\n * @param userAddress - User address\n * @param serverIndex - Index of the server ID\n * @returns Promise resolving to server ID\n */\n async getUserServerIdsAt(\n userAddress: Address,\n serverIndex: bigint,\n ): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverId = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsAt\",\n args: [userAddress, serverIndex],\n });\n\n return serverId;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server ID at index: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get the number of servers a user has\n *\n * @param userAddress - User address\n * @returns Promise resolving to number of servers\n */\n async getUserServerIdsLength(userAddress: Address): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const length = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServerIdsLength\",\n args: [userAddress],\n });\n\n return length;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server IDs length: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get trusted server info for a specific user and server ID\n *\n * @param userAddress - User address\n * @param serverId - Server ID\n * @returns Promise resolving to trusted server info\n */\n async getUserServers(\n userAddress: Address,\n serverId: bigint,\n ): Promise<TrustedServerInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"userServers\",\n args: [userAddress, serverId],\n });\n\n return {\n id: serverInfo.id,\n owner: serverInfo.owner,\n serverAddress: serverInfo.serverAddress,\n publicKey: serverInfo.publicKey,\n url: serverInfo.url,\n startBlock: serverInfo.startBlock,\n endBlock: serverInfo.endBlock,\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user server info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get server info by server ID\n *\n * @param serverId - Server ID\n * @returns Promise resolving to server info\n */\n async getServers(serverId: bigint): Promise<ServerInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const serverInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"servers\",\n args: [serverId],\n });\n\n return {\n id: serverInfo.id,\n owner: serverInfo.owner,\n serverAddress: serverInfo.serverAddress,\n publicKey: serverInfo.publicKey,\n url: serverInfo.url,\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get server info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get user info including nonce and trusted server IDs\n *\n * @param userAddress - User address\n * @returns Promise resolving to user info\n */\n async getUsers(\n userAddress: Address,\n ): Promise<{ nonce: bigint; trustedServerIds: bigint[] }> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const userInfo = await this.context.publicClient.readContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"users\",\n args: [userAddress],\n });\n\n return {\n nonce: userInfo[0],\n trustedServerIds: [...userInfo[1]],\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Update server URL\n *\n * @param serverId - Server ID to update\n * @param url - New URL for the server\n * @param options - Optional transaction options for gas parameters and timeout\n * @returns Promise resolving to transaction hash\n */\n async submitUpdateServer(\n serverId: bigint,\n url: string,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityServers\", \"updateServer\">> {\n this.assertWallet();\n try {\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityServersAddress = getContractAddress(\n chainId,\n \"DataPortabilityServers\",\n );\n const DataPortabilityServersAbi = getAbi(\"DataPortabilityServers\");\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n\n const hash = await this.context.walletClient.writeContract({\n address: DataPortabilityServersAddress,\n abi: DataPortabilityServersAbi,\n functionName: \"updateServer\",\n args: [serverId, url],\n chain: this.context.walletClient?.chain,\n account,\n ...(options?.gas && { gas: options.gas }),\n ...(options?.nonce && { nonce: options.nonce }),\n // Use EIP-1559 if available, otherwise fall back to legacy gasPrice\n ...(options?.maxFeePerGas || options?.maxPriorityFeePerGas\n ? {\n ...(options.maxFeePerGas && {\n maxFeePerGas: options.maxFeePerGas,\n }),\n ...(options.maxPriorityFeePerGas && {\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }),\n }\n : options?.gasPrice && { gasPrice: options.gasPrice }),\n });\n\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityServers\",\n fn: \"updateServer\",\n });\n } catch (error) {\n throw new BlockchainError(\n `Failed to update server: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n // ===== DataPortabilityPermissionsImplementation Methods =====\n\n /**\n * Get all permission IDs for a user\n *\n * @param userAddress - User address to get permission IDs for\n * @returns Promise resolving to array of permission IDs\n */\n async getUserPermissionIdsValues(userAddress: Address): Promise<bigint[]> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionIds = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsValues\",\n args: [userAddress],\n });\n\n return [...permissionIds];\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission IDs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get permission ID at specific index for a user\n *\n * @param userAddress - User address\n * @param permissionIndex - Index of the permission ID\n * @returns Promise resolving to permission ID\n */\n async getUserPermissionIdsAt(\n userAddress: Address,\n permissionIndex: bigint,\n ): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionId = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsAt\",\n args: [userAddress, permissionIndex],\n });\n\n return permissionId;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission ID at index: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get the number of permissions a user has\n *\n * @param userAddress - User address\n * @returns Promise resolving to number of permissions\n */\n async getUserPermissionIdsLength(userAddress: Address): Promise<bigint> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const length = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"userPermissionIdsLength\",\n args: [userAddress],\n });\n\n return length;\n } catch (error) {\n throw new BlockchainError(\n `Failed to get user permission IDs length: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Get permission info by permission ID\n *\n * @param permissionId - Permission ID\n * @returns Promise resolving to permission info\n */\n async getPermissions(permissionId: bigint): Promise<PermissionInfo> {\n try {\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const permissionInfo = await this.context.publicClient.readContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"permissions\",\n args: [permissionId],\n });\n\n return {\n id: permissionInfo.id,\n grantor: permissionInfo.grantor,\n nonce: permissionInfo.nonce,\n granteeId: permissionInfo.granteeId,\n grant: permissionInfo.grant,\n startBlock: permissionInfo.startBlock,\n endBlock: permissionInfo.endBlock,\n fileIds: [...permissionInfo.fileIds],\n };\n } catch (error) {\n throw new BlockchainError(\n `Failed to get permission info: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submit permission with signature to the blockchain (supports gasless transactions)\n *\n * @param params - Parameters for adding permission\n * @returns Promise resolving to transaction hash\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {SignatureError} When user rejects the signature request\n * @throws {BlockchainError} When permission addition fails\n * @throws {NetworkError} When network communication fails\n */\n async submitAddPermission(\n params: ServerFilesAndPermissionParams,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n this.assertWallet();\n try {\n const nonce = await this.getPermissionsUserNonce();\n\n // Create add permission input\n const addPermissionInput = {\n nonce,\n granteeId: params.granteeId,\n grant: params.grant,\n fileUrls: params.fileUrls,\n schemaIds: params.schemaIds,\n serverAddress: params.serverAddress,\n serverUrl: params.serverUrl,\n serverPublicKey: params.serverPublicKey,\n filePermissions: params.filePermissions,\n };\n\n // Create and sign typed data\n const typedData =\n await this.composeServerFilesAndPermissionMessage(addPermissionInput);\n const signature = await this.signTypedData(typedData);\n\n // Use the signed relay method to support gasless transactions\n return await this.submitSignedAddPermission(typedData, signature);\n } catch (error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Failed to add permission: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits an already-signed add permission transaction to the blockchain.\n * This method supports both relayer-based gasless transactions and direct transactions.\n *\n * @param typedData - The EIP-712 typed data for AddPermission\n * @param signature - The user's signature\n * @returns Promise resolving to TransactionResult with PermissionGrantResult event data\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {BlockchainError} When permission addition fails\n * @throws {NetworkError} When network communication fails\n */\n async submitSignedAddPermission(\n typedData: GenericTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<TransactionResult<\"DataPortabilityPermissions\", \"addPermission\">> {\n this.assertWallet();\n try {\n // Use unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n const request: UnifiedRelayerRequest = {\n type: \"signed\",\n operation: \"submitAddPermission\",\n typedData,\n signature,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n hash = await this.submitDirectAddPermissionTransaction(\n typedData,\n signature,\n options,\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"addPermission\",\n });\n } catch (error) {\n // Re-throw known Vana errors directly to preserve error types\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Add permission submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits server files and permissions with signature to the blockchain, supporting schema validation and gasless transactions.\n *\n * @remarks\n * This method validates files against their specified schemas before submission.\n * Schema validation ensures data conforms to expected formats before on-chain registration.\n * Files with schemaId = 0 bypass validation. The method supports atomic batch operations\n * where all files and permissions are registered in a single transaction.\n *\n * @param params - Parameters for adding server files and permissions\n * @param params.granteeId - The ID of the permission grantee\n * @param params.grant - Grant URL containing permission parameters (typically IPFS)\n * @param params.fileUrls - Array of file URLs to register\n * @param params.schemaIds - Schema IDs for each file. Use 0 for files without schema validation.\n * Array length must match fileUrls length.\n * @param params.serverAddress - Server wallet address for decryption permissions\n * @param params.serverUrl - Server endpoint URL\n * @param params.serverPublicKey - Server's public key for encryption.\n * Obtain via `vana.server.getIdentity(userAddress).publicKey`.\n * @param params.filePermissions - Nested array of permissions for each file\n * @param options - Optional transaction options for gas parameters and timeout.\n * Note: These options are only applied for direct blockchain transactions.\n * When using relayer callbacks (gasless transactions), these options are ignored.\n * @returns TransactionResult with immediate hash access and optional event data\n * @throws {Error} When schemaIds array length doesn't match fileUrls array length\n * @throws {SchemaValidationError} When file data doesn't match the specified schema.\n * Verify data structure matches schema definition from `vana.schemas.get(schemaId)`.\n * @throws {RelayerError} When gasless transaction submission fails.\n * Retry without relayer configuration to submit direct transaction.\n * @throws {SignatureError} When user rejects the signature request\n * @throws {BlockchainError} When server files and permissions addition fails\n * @throws {NetworkError} When network communication fails.\n * Check network connection or configure alternative gateways.\n *\n * @example\n * ```typescript\n * // Submit with custom gas parameters and timeout\n * const result = await vana.permissions.submitAddServerFilesAndPermissions({\n * granteeId: BigInt(1),\n * grant: \"ipfs://QmXxx...\",\n * fileUrls: [\"https://storage.example.com/data.json\"],\n * schemaIds: [123], // LinkedIn profile schema ID\n * serverAddress: \"0x742d35Cc6634C0532925a3b844Bc9e7595f0b0Bb\",\n * serverUrl: \"https://server.example.com\",\n * serverPublicKey: serverInfo.publicKey,\n * filePermissions: [[{\n * account: \"0x742d35Cc6634C0532925a3b844Bc9e7595f0b0Bb\",\n * key: encryptedKey\n * }]]\n * }, {\n * maxFeePerGas: 100n * 10n ** 9n, // 100 gwei\n * maxPriorityFeePerGas: 2n * 10n ** 9n, // 2 gwei tip\n * });\n *\n * // Wait for confirmation with custom timeout\n * const receipt = await vana.waitForTransactionReceipt(result, {\n * timeout: 180000 // 3 minutes\n * });\n * console.log(`Transaction confirmed: ${receipt.transactionHash}`);\n * ```\n */\n async submitAddServerFilesAndPermissions(\n params: ServerFilesAndPermissionParams,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityPermissions\",\n \"addServerFilesAndPermissions\"\n >\n > {\n this.assertWallet();\n try {\n // Validate that schemaIds array has same length as fileUrls\n if (params.schemaIds.length !== params.fileUrls.length) {\n throw new Error(\n `schemaIds array length (${params.schemaIds.length}) must match fileUrls array length (${params.fileUrls.length})`,\n );\n }\n\n // Schema validation should happen at upload time, not permission time\n // The SDK's data.upload() validates before uploading\n // External uploaders are responsible for their own validation\n\n const nonce = await this.getPermissionsUserNonce();\n\n // Create server files and permission input\n const serverFilesAndPermissionInput = {\n nonce,\n granteeId: params.granteeId,\n grant: params.grant,\n fileUrls: params.fileUrls,\n schemaIds: params.schemaIds,\n serverAddress: params.serverAddress,\n serverUrl: params.serverUrl,\n serverPublicKey: params.serverPublicKey,\n filePermissions: params.filePermissions,\n };\n\n // Create and sign typed data\n const typedData = await this.composeServerFilesAndPermissionMessage(\n serverFilesAndPermissionInput,\n );\n const signature = await this.signTypedData(typedData);\n\n // Use the signed relay method to support gasless transactions\n return await this.submitSignedAddServerFilesAndPermissions(\n typedData,\n signature,\n options,\n );\n } catch (error) {\n // Re-throw known Vana errors directly\n if (\n error instanceof RelayerError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SerializationError ||\n error instanceof SignatureError ||\n error instanceof NetworkError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Failed to add server files and permissions: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits an already-signed add server files and permissions transaction to the blockchain.\n *\n * @remarks\n * This method returns a TransactionResult that provides immediate access to the transaction hash.\n * The eventData field may contain parsed event details after transaction confirmation.\n *\n * @param typedData - The EIP-712 typed data for AddServerFilesAndPermissions\n * @param signature - The user's signature\n * @param options - Optional transaction options for gas parameters and timeout.\n * Note: These options are only applied for direct blockchain transactions.\n * When using relayer callbacks (gasless transactions), these options are ignored.\n * @returns TransactionResult with immediate hash access and optional event data\n * @throws {RelayerError} When gasless transaction submission fails\n * @throws {BlockchainError} When server files and permissions addition fails\n * @throws {NetworkError} When network communication fails\n *\n * @example\n * ```typescript\n * const tx = await vana.permissions.submitSignedAddServerFilesAndPermissions(\n * typedData,\n * signature\n * );\n * console.log(`Transaction submitted: ${tx.hash}`);\n *\n * // Wait for confirmation and get the permission ID\n * const { permissionId } = await tx.waitForEvents();\n * console.log(`Permission created with ID: ${permissionId}`);\n * ```\n */\n async submitSignedAddServerFilesAndPermissions(\n typedData: ServerFilesAndPermissionTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\n \"DataPortabilityPermissions\",\n \"addServerFilesAndPermissions\"\n >\n > {\n this.assertWallet();\n try {\n // Use unified relayer callback or direct transaction\n let hash: Hash;\n if (this.context.relayer) {\n console.debug(\n \"🚀 Using relayer for submitAddServerFilesAndPermissions\",\n );\n const request: UnifiedRelayerRequest = {\n type: \"signed\",\n operation: \"submitAddServerFilesAndPermissions\",\n typedData,\n signature,\n };\n const response = await this.context.relayer(request);\n if (response.type === \"error\") {\n throw new RelayerError(response.error);\n }\n if (response.type === \"submitted\") {\n hash = response.hash;\n } else if (response.type === \"signed\") {\n // Legacy response format\n hash = response.hash;\n } else {\n throw new Error(\"Unexpected response type from relayer\");\n }\n } else {\n console.debug(\n \"📝 Using direct transaction for submitAddServerFilesAndPermissions\",\n );\n hash = await this.submitDirectAddServerFilesAndPermissionsTransaction(\n typedData,\n signature,\n options,\n );\n }\n\n const account =\n this.context.walletClient?.account ?? this.context.userAddress;\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"addServerFilesAndPermissions\",\n });\n } catch (error) {\n // Re-throw known Vana errors directly to preserve error types\n if (\n error instanceof RelayerError ||\n error instanceof NetworkError ||\n error instanceof UserRejectedRequestError ||\n error instanceof SignatureError ||\n error instanceof NonceError\n ) {\n throw error;\n }\n throw new BlockchainError(\n `Add server files and permissions submission failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submit permission revocation with signature to the blockchain\n *\n * @param permissionId - Permission ID to revoke\n * @param options - Optional transaction options for gas parameters and timeout\n * @returns Promise resolving to transaction hash\n */\n async submitRevokePermission(\n permissionId: bigint,\n options?: TransactionOptions,\n ): Promise<\n TransactionResult<\"DataPortabilityPermissions\", \"revokePermission\">\n > {\n this.assertWallet();\n try {\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\n \"DataPortabilityPermissions\",\n );\n\n const { account } = this.context.walletClient;\n if (!account) {\n throw new Error(\"No wallet account connected\");\n }\n\n const hash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"revokePermission\",\n args: [permissionId],\n chain: this.context.walletClient?.chain,\n account,\n ...(options?.gas && { gas: options.gas }),\n ...(options?.nonce && { nonce: options.nonce }),\n // Use EIP-1559 if available, otherwise fall back to legacy gasPrice\n ...(options?.maxFeePerGas || options?.maxPriorityFeePerGas\n ? {\n ...(options.maxFeePerGas && {\n maxFeePerGas: options.maxFeePerGas,\n }),\n ...(options.maxPriorityFeePerGas && {\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }),\n }\n : options?.gasPrice && { gasPrice: options.gasPrice }),\n });\n\n // Return the strongly-typed, self-describing POJO\n const { tx } = await import(\"../utils/transactionHelpers\");\n return tx({\n hash,\n from: typeof account === \"string\" ? account : account.address,\n contract: \"DataPortabilityPermissions\",\n fn: \"revokePermission\",\n });\n } catch (error) {\n throw new BlockchainError(\n `Failed to revoke permission: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n error as Error,\n );\n }\n }\n\n /**\n * Submits a signed add permission transaction directly to the blockchain.\n *\n * @param typedData - The typed data structure for the permission addition\n * @param signature - The cryptographic signature authorizing the transaction\n * @returns Promise resolving to the transaction hash\n */\n private async submitDirectAddPermissionTransaction(\n typedData: GenericTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.walletClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\"DataPortabilityPermissions\");\n\n // Prepare the PermissionInput struct from the typed data message\n const permissionInput = {\n nonce: typedData.message.nonce as bigint,\n granteeId: typedData.message.granteeId as bigint,\n grant: typedData.message.grant as string,\n fileIds: (typedData.message.fileIds as bigint[]) ?? [],\n };\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n const hash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"addPermission\",\n args: [permissionInput, formattedSignature],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...this.spreadTransactionOptions(options),\n });\n\n return hash;\n }\n\n /**\n * Submits a signed add server files and permissions transaction directly to the blockchain.\n *\n * @param typedData - The typed data structure for the server files and permissions addition\n * @param signature - The cryptographic signature authorizing the transaction\n * @returns Promise resolving to the transaction hash\n */\n private async submitDirectAddServerFilesAndPermissionsTransaction(\n typedData: ServerFilesAndPermissionTypedData,\n signature: Hash,\n options?: TransactionOptions,\n ): Promise<Hash> {\n this.assertWallet();\n const chainId = await this.context.publicClient.getChainId();\n const DataPortabilityPermissionsAddress = getContractAddress(\n chainId,\n \"DataPortabilityPermissions\",\n );\n const DataPortabilityPermissionsAbi = getAbi(\"DataPortabilityPermissions\");\n\n // Prepare the ServerFilesAndPermissionInput struct from the typed data message\n const serverFilesAndPermissionInput = {\n nonce: typedData.message.nonce,\n granteeId: typedData.message.granteeId,\n grant: typedData.message.grant,\n fileUrls: typedData.message.fileUrls,\n schemaIds: typedData.message.schemaIds,\n serverAddress: typedData.message.serverAddress,\n serverUrl: typedData.message.serverUrl,\n serverPublicKey: typedData.message.serverPublicKey,\n filePermissions: typedData.message.filePermissions,\n };\n\n // Format signature for contract compatibility\n const formattedSignature = formatSignatureForContract(signature);\n\n const hash = await this.context.walletClient.writeContract({\n address: DataPortabilityPermissionsAddress,\n abi: DataPortabilityPermissionsAbi,\n functionName: \"addServerFilesAndPermissions\",\n args: [serverFilesAndPermissionInput, formattedSignature],\n account: this.context.walletClient?.account ?? this.context.userAddress,\n chain: this.context.walletClient?.chain ?? null,\n ...(options?.value && { value: options.value }),\n ...this.spreadTransactionOptions(options),\n });\n\n return hash;\n }\n}\n"],"mappings":"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","names":["account","totalCount"]}