@opendatalabs/vana-sdk 0.1.0-alpha.a25bcc7 → 0.1.0-alpha.a27f5bd

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 (175) hide show
  1. package/dist/browser.cjs.map +1 -1
  2. package/dist/browser.d.ts +33 -1
  3. package/dist/browser.js.map +1 -1
  4. package/dist/chains/index.cjs.map +1 -1
  5. package/dist/chains/index.d.ts +30 -1
  6. package/dist/chains/index.js.map +1 -1
  7. package/dist/config/chains.cjs.map +1 -1
  8. package/dist/config/chains.d.ts +99 -0
  9. package/dist/config/chains.js.map +1 -1
  10. package/dist/contracts/contractController.cjs.map +1 -1
  11. package/dist/contracts/contractController.d.ts +66 -10
  12. package/dist/contracts/contractController.js.map +1 -1
  13. package/dist/controllers/base.cjs +33 -0
  14. package/dist/controllers/base.cjs.map +1 -1
  15. package/dist/controllers/base.d.ts +10 -0
  16. package/dist/controllers/base.js +33 -0
  17. package/dist/controllers/base.js.map +1 -1
  18. package/dist/controllers/data.cjs +195 -156
  19. package/dist/controllers/data.cjs.map +1 -1
  20. package/dist/controllers/data.d.ts +222 -184
  21. package/dist/controllers/data.js +195 -156
  22. package/dist/controllers/data.js.map +1 -1
  23. package/dist/controllers/permissions.cjs +311 -244
  24. package/dist/controllers/permissions.cjs.map +1 -1
  25. package/dist/controllers/permissions.d.ts +48 -83
  26. package/dist/controllers/permissions.js +311 -244
  27. package/dist/controllers/permissions.js.map +1 -1
  28. package/dist/controllers/protocol.cjs.map +1 -1
  29. package/dist/controllers/protocol.d.ts +27 -28
  30. package/dist/controllers/protocol.js.map +1 -1
  31. package/dist/controllers/schemas.cjs +19 -17
  32. package/dist/controllers/schemas.cjs.map +1 -1
  33. package/dist/controllers/schemas.d.ts +47 -40
  34. package/dist/controllers/schemas.js +19 -17
  35. package/dist/controllers/schemas.js.map +1 -1
  36. package/dist/controllers/server.cjs +17 -15
  37. package/dist/controllers/server.cjs.map +1 -1
  38. package/dist/controllers/server.d.ts +46 -38
  39. package/dist/controllers/server.js +17 -15
  40. package/dist/controllers/server.js.map +1 -1
  41. package/dist/core/apiClient.cjs +53 -3
  42. package/dist/core/apiClient.cjs.map +1 -1
  43. package/dist/core/apiClient.d.ts +132 -7
  44. package/dist/core/apiClient.js +53 -3
  45. package/dist/core/apiClient.js.map +1 -1
  46. package/dist/core/generics.cjs +30 -3
  47. package/dist/core/generics.cjs.map +1 -1
  48. package/dist/core/generics.d.ts +95 -6
  49. package/dist/core/generics.js +30 -3
  50. package/dist/core/generics.js.map +1 -1
  51. package/dist/core.cjs +33 -13
  52. package/dist/core.cjs.map +1 -1
  53. package/dist/core.d.ts +4 -2
  54. package/dist/core.js +33 -13
  55. package/dist/core.js.map +1 -1
  56. package/dist/index.cjs.map +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/index.node.cjs +5 -3
  59. package/dist/index.node.cjs.map +1 -1
  60. package/dist/index.node.d.ts +35 -13
  61. package/dist/index.node.js +4 -2
  62. package/dist/index.node.js.map +1 -1
  63. package/dist/node.cjs.map +1 -1
  64. package/dist/node.d.ts +39 -1
  65. package/dist/node.js.map +1 -1
  66. package/dist/platform/browser.cjs +160 -2
  67. package/dist/platform/browser.cjs.map +1 -1
  68. package/dist/platform/browser.d.ts +232 -12
  69. package/dist/platform/browser.js +160 -2
  70. package/dist/platform/browser.js.map +1 -1
  71. package/dist/platform/interface.cjs.map +1 -1
  72. package/dist/platform/interface.d.ts +283 -90
  73. package/dist/platform/node.cjs +163 -2
  74. package/dist/platform/node.cjs.map +1 -1
  75. package/dist/platform/node.d.ts +69 -6
  76. package/dist/platform/node.js +163 -2
  77. package/dist/platform/node.js.map +1 -1
  78. package/dist/server/relayerHandler.cjs +258 -0
  79. package/dist/server/relayerHandler.cjs.map +1 -0
  80. package/dist/server/relayerHandler.d.ts +38 -0
  81. package/dist/server/relayerHandler.js +234 -0
  82. package/dist/server/relayerHandler.js.map +1 -0
  83. package/dist/storage/manager.cjs +108 -25
  84. package/dist/storage/manager.cjs.map +1 -1
  85. package/dist/storage/manager.d.ts +119 -25
  86. package/dist/storage/manager.js +108 -25
  87. package/dist/storage/manager.js.map +1 -1
  88. package/dist/storage/providers/callback-storage.cjs +86 -15
  89. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  90. package/dist/storage/providers/callback-storage.d.ts +109 -20
  91. package/dist/storage/providers/callback-storage.js +86 -15
  92. package/dist/storage/providers/callback-storage.js.map +1 -1
  93. package/dist/storage/providers/pinata.cjs.map +1 -1
  94. package/dist/storage/providers/pinata.d.ts +12 -14
  95. package/dist/storage/providers/pinata.js.map +1 -1
  96. package/dist/tests/factories/mockFactory.d.ts +2 -2
  97. package/dist/tests/relayer-integration.test.d.ts +1 -0
  98. package/dist/tests/relayer-unified.test.d.ts +1 -0
  99. package/dist/tests/server-relayer-handler.test.d.ts +1 -0
  100. package/dist/types/blockchain.cjs.map +1 -1
  101. package/dist/types/blockchain.d.ts +39 -11
  102. package/dist/types/chains.cjs.map +1 -1
  103. package/dist/types/chains.d.ts +74 -7
  104. package/dist/types/chains.js.map +1 -1
  105. package/dist/types/config.cjs.map +1 -1
  106. package/dist/types/config.d.ts +78 -191
  107. package/dist/types/config.js.map +1 -1
  108. package/dist/types/contracts.cjs.map +1 -1
  109. package/dist/types/contracts.d.ts +71 -7
  110. package/dist/types/controller-context.cjs.map +1 -1
  111. package/dist/types/controller-context.d.ts +6 -3
  112. package/dist/types/data.cjs.map +1 -1
  113. package/dist/types/data.d.ts +4 -6
  114. package/dist/types/generics.cjs.map +1 -1
  115. package/dist/types/generics.d.ts +81 -10
  116. package/dist/types/index.cjs.map +1 -1
  117. package/dist/types/index.d.ts +29 -3
  118. package/dist/types/index.js.map +1 -1
  119. package/dist/types/operations.cjs.map +1 -1
  120. package/dist/types/operations.d.ts +178 -15
  121. package/dist/types/operations.js.map +1 -1
  122. package/dist/types/permissions.cjs.map +1 -1
  123. package/dist/types/permissions.d.ts +15 -20
  124. package/dist/types/personal.cjs.map +1 -1
  125. package/dist/types/personal.d.ts +131 -14
  126. package/dist/types/relayer.cjs.map +1 -1
  127. package/dist/types/relayer.d.ts +281 -35
  128. package/dist/types/storage.cjs.map +1 -1
  129. package/dist/types/storage.d.ts +9 -21
  130. package/dist/types/storage.js.map +1 -1
  131. package/dist/utils/grantFiles.cjs.map +1 -1
  132. package/dist/utils/grantFiles.d.ts +10 -20
  133. package/dist/utils/grantFiles.js.map +1 -1
  134. package/dist/utils/grantValidation.cjs.map +1 -1
  135. package/dist/utils/grantValidation.d.ts +95 -16
  136. package/dist/utils/grantValidation.js.map +1 -1
  137. package/dist/utils/grants.cjs.map +1 -1
  138. package/dist/utils/grants.d.ts +93 -12
  139. package/dist/utils/grants.js.map +1 -1
  140. package/dist/utils/ipfs.cjs +2 -4
  141. package/dist/utils/ipfs.cjs.map +1 -1
  142. package/dist/utils/ipfs.d.ts +1 -1
  143. package/dist/utils/ipfs.js +2 -4
  144. package/dist/utils/ipfs.js.map +1 -1
  145. package/dist/utils/lazy-import.cjs.map +1 -1
  146. package/dist/utils/lazy-import.d.ts +32 -7
  147. package/dist/utils/lazy-import.js.map +1 -1
  148. package/dist/utils/signatureCache.cjs +8 -2
  149. package/dist/utils/signatureCache.cjs.map +1 -1
  150. package/dist/utils/signatureCache.d.ts +49 -8
  151. package/dist/utils/signatureCache.js +8 -2
  152. package/dist/utils/signatureCache.js.map +1 -1
  153. package/dist/utils/transactionHelpers.cjs.map +1 -1
  154. package/dist/utils/transactionHelpers.d.ts +12 -12
  155. package/dist/utils/transactionHelpers.js.map +1 -1
  156. package/dist/utils/typedDataConverter.cjs.map +1 -1
  157. package/dist/utils/typedDataConverter.d.ts +39 -3
  158. package/dist/utils/typedDataConverter.js.map +1 -1
  159. package/dist/utils/urlResolver.cjs +7 -0
  160. package/dist/utils/urlResolver.cjs.map +1 -1
  161. package/dist/utils/urlResolver.d.ts +22 -4
  162. package/dist/utils/urlResolver.js +7 -0
  163. package/dist/utils/urlResolver.js.map +1 -1
  164. package/dist/utils/wallet.cjs +2 -1
  165. package/dist/utils/wallet.cjs.map +1 -1
  166. package/dist/utils/wallet.d.ts +78 -16
  167. package/dist/utils/wallet.js +2 -1
  168. package/dist/utils/wallet.js.map +1 -1
  169. package/package.json +3 -1
  170. package/dist/server/handler.cjs +0 -101
  171. package/dist/server/handler.cjs.map +0 -1
  172. package/dist/server/handler.d.ts +0 -87
  173. package/dist/server/handler.js +0 -77
  174. package/dist/server/handler.js.map +0 -1
  175. /package/dist/tests/{server-handler.test.d.ts → permissions-revoke-relayer.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts"],"sourcesContent":["/**\n * Re-export Browser platform adapter for dynamic imports\n */\nexport { BrowserPlatformAdapter } from \"./platform/browser\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAAuC;","names":[]}
1
+ {"version":3,"sources":["../src/browser.ts"],"sourcesContent":["/**\n * Browser-specific entry point for the Vana SDK.\n *\n * @remarks\n * This module provides the browser implementation of the Vana SDK,\n * optimized for web applications and browser environments. It includes\n * platform-specific implementations using Web APIs for cryptography,\n * storage, and networking operations.\n *\n * Import this module when building web applications:\n * ```typescript\n * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';\n * ```\n *\n * Features:\n * - Web Crypto API for encryption operations\n * - SessionStorage for caching\n * - Fetch API for HTTP requests\n * - Optimized bundle size for browser deployment\n *\n * @example\n * ```typescript\n * // In a React/Vue/Angular application\n * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';\n * import { Vana } from '@opendatalabs/vana-sdk-experimental';\n *\n * const vana = new Vana({\n * platform: new BrowserPlatformAdapter(),\n * network: 'moksha'\n * });\n * ```\n *\n * @category Browser\n * @module browser\n */\nexport { BrowserPlatformAdapter } from \"./platform/browser\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCA,qBAAuC;","names":[]}
package/dist/browser.d.ts CHANGED
@@ -1,4 +1,36 @@
1
1
  /**
2
- * Re-export Browser platform adapter for dynamic imports
2
+ * Browser-specific entry point for the Vana SDK.
3
+ *
4
+ * @remarks
5
+ * This module provides the browser implementation of the Vana SDK,
6
+ * optimized for web applications and browser environments. It includes
7
+ * platform-specific implementations using Web APIs for cryptography,
8
+ * storage, and networking operations.
9
+ *
10
+ * Import this module when building web applications:
11
+ * ```typescript
12
+ * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';
13
+ * ```
14
+ *
15
+ * Features:
16
+ * - Web Crypto API for encryption operations
17
+ * - SessionStorage for caching
18
+ * - Fetch API for HTTP requests
19
+ * - Optimized bundle size for browser deployment
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // In a React/Vue/Angular application
24
+ * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';
25
+ * import { Vana } from '@opendatalabs/vana-sdk-experimental';
26
+ *
27
+ * const vana = new Vana({
28
+ * platform: new BrowserPlatformAdapter(),
29
+ * network: 'moksha'
30
+ * });
31
+ * ```
32
+ *
33
+ * @category Browser
34
+ * @module browser
3
35
  */
4
36
  export { BrowserPlatformAdapter } from "./platform/browser";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts"],"sourcesContent":["/**\n * Re-export Browser platform adapter for dynamic imports\n */\nexport { BrowserPlatformAdapter } from \"./platform/browser\";\n"],"mappings":"AAGA,SAAS,8BAA8B;","names":[]}
1
+ {"version":3,"sources":["../src/browser.ts"],"sourcesContent":["/**\n * Browser-specific entry point for the Vana SDK.\n *\n * @remarks\n * This module provides the browser implementation of the Vana SDK,\n * optimized for web applications and browser environments. It includes\n * platform-specific implementations using Web APIs for cryptography,\n * storage, and networking operations.\n *\n * Import this module when building web applications:\n * ```typescript\n * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';\n * ```\n *\n * Features:\n * - Web Crypto API for encryption operations\n * - SessionStorage for caching\n * - Fetch API for HTTP requests\n * - Optimized bundle size for browser deployment\n *\n * @example\n * ```typescript\n * // In a React/Vue/Angular application\n * import { BrowserPlatformAdapter } from '@opendatalabs/vana-sdk/browser';\n * import { Vana } from '@opendatalabs/vana-sdk-experimental';\n *\n * const vana = new Vana({\n * platform: new BrowserPlatformAdapter(),\n * network: 'moksha'\n * });\n * ```\n *\n * @category Browser\n * @module browser\n */\nexport { BrowserPlatformAdapter } from \"./platform/browser\";\n"],"mappings":"AAmCA,SAAS,8BAA8B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Chain configuration exports\n */\n\nexport type { VanaChainConfig } from \"./definitions\";\nexport {\n vanaMainnet,\n moksha,\n mokshaTestnet,\n getChainConfig,\n getAllChains,\n} from \"./definitions\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,yBAMO;","names":[]}
1
+ {"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Provides chain configurations for the Vana network ecosystem.\n *\n * @remarks\n * This module exports all chain definitions and utilities needed to connect\n * to Vana networks. It includes configurations for mainnet and testnet\n * environments with their respective RPC endpoints, contract addresses,\n * and network parameters.\n *\n * Available networks:\n * - **Vana Mainnet** (chainId: 1480) - Production network\n * - **Moksha Testnet** (chainId: 14800) - Test network\n *\n * @example\n * ```typescript\n * import { moksha, vanaMainnet, getChainConfig } from '@opendatalabs/vana-sdk/chains';\n * import { createPublicClient, http } from 'viem';\n *\n * // Connect to moksha testnet\n * const client = createPublicClient({\n * chain: moksha,\n * transport: http()\n * });\n *\n * // Get chain config by ID\n * const config = getChainConfig(14800);\n * console.log(config?.name); // \"Moksha Testnet\"\n * ```\n *\n * @category Chains\n * @module chains\n */\n\nexport type { VanaChainConfig } from \"./definitions\";\nexport {\n vanaMainnet,\n moksha,\n mokshaTestnet,\n getChainConfig,\n getAllChains,\n} from \"./definitions\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCA,yBAMO;","names":[]}
@@ -1,5 +1,34 @@
1
1
  /**
2
- * Chain configuration exports
2
+ * Provides chain configurations for the Vana network ecosystem.
3
+ *
4
+ * @remarks
5
+ * This module exports all chain definitions and utilities needed to connect
6
+ * to Vana networks. It includes configurations for mainnet and testnet
7
+ * environments with their respective RPC endpoints, contract addresses,
8
+ * and network parameters.
9
+ *
10
+ * Available networks:
11
+ * - **Vana Mainnet** (chainId: 1480) - Production network
12
+ * - **Moksha Testnet** (chainId: 14800) - Test network
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { moksha, vanaMainnet, getChainConfig } from '@opendatalabs/vana-sdk/chains';
17
+ * import { createPublicClient, http } from 'viem';
18
+ *
19
+ * // Connect to moksha testnet
20
+ * const client = createPublicClient({
21
+ * chain: moksha,
22
+ * transport: http()
23
+ * });
24
+ *
25
+ * // Get chain config by ID
26
+ * const config = getChainConfig(14800);
27
+ * console.log(config?.name); // "Moksha Testnet"
28
+ * ```
29
+ *
30
+ * @category Chains
31
+ * @module chains
3
32
  */
4
33
  export type { VanaChainConfig } from "./definitions";
5
34
  export { vanaMainnet, moksha, mokshaTestnet, getChainConfig, getAllChains, } from "./definitions";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Chain configuration exports\n */\n\nexport type { VanaChainConfig } from \"./definitions\";\nexport {\n vanaMainnet,\n moksha,\n mokshaTestnet,\n getChainConfig,\n getAllChains,\n} from \"./definitions\";\n"],"mappings":"AAKA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
1
+ {"version":3,"sources":["../../src/chains/index.ts"],"sourcesContent":["/**\n * Provides chain configurations for the Vana network ecosystem.\n *\n * @remarks\n * This module exports all chain definitions and utilities needed to connect\n * to Vana networks. It includes configurations for mainnet and testnet\n * environments with their respective RPC endpoints, contract addresses,\n * and network parameters.\n *\n * Available networks:\n * - **Vana Mainnet** (chainId: 1480) - Production network\n * - **Moksha Testnet** (chainId: 14800) - Test network\n *\n * @example\n * ```typescript\n * import { moksha, vanaMainnet, getChainConfig } from '@opendatalabs/vana-sdk/chains';\n * import { createPublicClient, http } from 'viem';\n *\n * // Connect to moksha testnet\n * const client = createPublicClient({\n * chain: moksha,\n * transport: http()\n * });\n *\n * // Get chain config by ID\n * const config = getChainConfig(14800);\n * console.log(config?.name); // \"Moksha Testnet\"\n * ```\n *\n * @category Chains\n * @module chains\n */\n\nexport type { VanaChainConfig } from \"./definitions\";\nexport {\n vanaMainnet,\n moksha,\n mokshaTestnet,\n getChainConfig,\n getAllChains,\n} from \"./definitions\";\n"],"mappings":"AAkCA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/chains.ts"],"sourcesContent":["import type { Abi, Chain } from \"viem\";\nimport { defineChain } from \"viem\";\n\nexport const mokshaTestnet = defineChain({\n id: 14800,\n caipNetworkId: \"eip155:14800\",\n chainNamespace: \"eip155\",\n name: \"Moksha Testnet\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.moksha.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n blockscout: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n },\n contracts: {},\n abis: {},\n});\n\nexport const vanaMainnet = defineChain({\n id: 1480,\n caipNetworkId: \"eip155:1480\",\n chainNamespace: \"eip155\",\n name: \"Vana\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n blockscout: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n },\n contracts: {},\n abis: {},\n});\n\nexport interface Chains {\n [key: number]: Chain & { abis?: Record<string, Abi> };\n}\n\nexport const chains: Chains = {\n [mokshaTestnet.id]: mokshaTestnet,\n [vanaMainnet.id]: vanaMainnet,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAA4B;AAErB,MAAM,oBAAgB,yBAAY;AAAA,EACvC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,6BAA6B;AAAA,IACtC;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAEM,MAAM,kBAAc,yBAAY;AAAA,EACrC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,sBAAsB;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAMM,MAAM,SAAiB;AAAA,EAC5B,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,YAAY,EAAE,GAAG;AACpB;","names":[]}
1
+ {"version":3,"sources":["../../src/config/chains.ts"],"sourcesContent":["/**\n * Defines the supported Vana blockchain networks and their configurations.\n *\n * @remarks\n * This module provides the canonical chain definitions for the Vana protocol.\n * Each chain configuration includes RPC endpoints, block explorers, and network\n * metadata required for SDK operations. Use these definitions when configuring\n * wallet clients or checking network compatibility.\n *\n * @category Blockchain\n * @module chains\n */\n\nimport type { Abi, Chain } from \"viem\";\nimport { defineChain } from \"viem\";\n\n/**\n * Moksha testnet configuration for development and testing.\n *\n * @remarks\n * The Moksha testnet is Vana's primary test network for application development.\n * It provides a safe environment for testing smart contracts and SDK features\n * before mainnet deployment. Test VANA tokens can be obtained from the faucet.\n *\n * **Network Details:**\n * - Chain ID: 14800\n * - Currency: Test VANA (18 decimals)\n * - RPC: https://rpc.moksha.vana.org\n * - Explorer: https://moksha.vanascan.io\n *\n * @example\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { mokshaTestnet } from '@opendatalabs/vana-sdk';\n *\n * const client = createWalletClient({\n * chain: mokshaTestnet,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const mokshaTestnet = defineChain({\n id: 14800,\n caipNetworkId: \"eip155:14800\",\n chainNamespace: \"eip155\",\n name: \"Moksha Testnet\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.moksha.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n blockscout: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n },\n contracts: {},\n abis: {},\n});\n\n/**\n * Vana mainnet configuration for production deployments.\n *\n * @remarks\n * The Vana mainnet is the production network where real value transactions occur.\n * Use this chain for production applications after thorough testing on Moksha.\n * Requires real VANA tokens for gas fees and transactions.\n *\n * **Network Details:**\n * - Chain ID: 1480\n * - Currency: VANA (18 decimals)\n * - RPC: https://rpc.vana.org\n * - Explorer: https://vanascan.io\n *\n * @example\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { vanaMainnet } from '@opendatalabs/vana-sdk';\n *\n * const client = createWalletClient({\n * chain: vanaMainnet,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const vanaMainnet = defineChain({\n id: 1480,\n caipNetworkId: \"eip155:1480\",\n chainNamespace: \"eip155\",\n name: \"Vana\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n blockscout: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n },\n contracts: {},\n abis: {},\n});\n\n/**\n * Maps chain IDs to their complete configurations with optional ABIs.\n *\n * @remarks\n * Extends viem's Chain type to include optional contract ABIs for each network.\n * This allows dynamic chain selection based on runtime configuration.\n *\n * @category Blockchain\n */\nexport interface Chains {\n [key: number]: Chain & { abis?: Record<string, Abi> };\n}\n\n/**\n * Registry of all supported Vana chains indexed by chain ID.\n *\n * @remarks\n * Provides runtime access to chain configurations for dynamic network selection.\n * Use this when you need to select chains based on user input or environment variables.\n *\n * @example\n * ```typescript\n * const chainId = parseInt(process.env.CHAIN_ID || '14800');\n * const chain = chains[chainId];\n *\n * if (!chain) {\n * throw new Error(`Unsupported chain ID: ${chainId}`);\n * }\n *\n * const client = createPublicClient({\n * chain,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const chains: Chains = {\n [mokshaTestnet.id]: mokshaTestnet,\n [vanaMainnet.id]: vanaMainnet,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,kBAA4B;AA6BrB,MAAM,oBAAgB,yBAAY;AAAA,EACvC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,6BAA6B;AAAA,IACtC;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AA6BM,MAAM,kBAAc,yBAAY;AAAA,EACrC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,sBAAsB;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAuCM,MAAM,SAAiB;AAAA,EAC5B,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,YAAY,EAAE,GAAG;AACpB;","names":[]}
@@ -1,4 +1,43 @@
1
+ /**
2
+ * Defines the supported Vana blockchain networks and their configurations.
3
+ *
4
+ * @remarks
5
+ * This module provides the canonical chain definitions for the Vana protocol.
6
+ * Each chain configuration includes RPC endpoints, block explorers, and network
7
+ * metadata required for SDK operations. Use these definitions when configuring
8
+ * wallet clients or checking network compatibility.
9
+ *
10
+ * @category Blockchain
11
+ * @module chains
12
+ */
1
13
  import type { Abi, Chain } from "viem";
14
+ /**
15
+ * Moksha testnet configuration for development and testing.
16
+ *
17
+ * @remarks
18
+ * The Moksha testnet is Vana's primary test network for application development.
19
+ * It provides a safe environment for testing smart contracts and SDK features
20
+ * before mainnet deployment. Test VANA tokens can be obtained from the faucet.
21
+ *
22
+ * **Network Details:**
23
+ * - Chain ID: 14800
24
+ * - Currency: Test VANA (18 decimals)
25
+ * - RPC: https://rpc.moksha.vana.org
26
+ * - Explorer: https://moksha.vanascan.io
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * import { createWalletClient, http } from 'viem';
31
+ * import { mokshaTestnet } from '@opendatalabs/vana-sdk';
32
+ *
33
+ * const client = createWalletClient({
34
+ * chain: mokshaTestnet,
35
+ * transport: http()
36
+ * });
37
+ * ```
38
+ *
39
+ * @category Blockchain
40
+ */
2
41
  export declare const mokshaTestnet: {
3
42
  blockExplorers: {
4
43
  readonly default: {
@@ -36,6 +75,33 @@ export declare const mokshaTestnet: {
36
75
  readonly chainNamespace: "eip155";
37
76
  readonly abis: {};
38
77
  };
78
+ /**
79
+ * Vana mainnet configuration for production deployments.
80
+ *
81
+ * @remarks
82
+ * The Vana mainnet is the production network where real value transactions occur.
83
+ * Use this chain for production applications after thorough testing on Moksha.
84
+ * Requires real VANA tokens for gas fees and transactions.
85
+ *
86
+ * **Network Details:**
87
+ * - Chain ID: 1480
88
+ * - Currency: VANA (18 decimals)
89
+ * - RPC: https://rpc.vana.org
90
+ * - Explorer: https://vanascan.io
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * import { createWalletClient, http } from 'viem';
95
+ * import { vanaMainnet } from '@opendatalabs/vana-sdk';
96
+ *
97
+ * const client = createWalletClient({
98
+ * chain: vanaMainnet,
99
+ * transport: http()
100
+ * });
101
+ * ```
102
+ *
103
+ * @category Blockchain
104
+ */
39
105
  export declare const vanaMainnet: {
40
106
  blockExplorers: {
41
107
  readonly default: {
@@ -73,9 +139,42 @@ export declare const vanaMainnet: {
73
139
  readonly chainNamespace: "eip155";
74
140
  readonly abis: {};
75
141
  };
142
+ /**
143
+ * Maps chain IDs to their complete configurations with optional ABIs.
144
+ *
145
+ * @remarks
146
+ * Extends viem's Chain type to include optional contract ABIs for each network.
147
+ * This allows dynamic chain selection based on runtime configuration.
148
+ *
149
+ * @category Blockchain
150
+ */
76
151
  export interface Chains {
77
152
  [key: number]: Chain & {
78
153
  abis?: Record<string, Abi>;
79
154
  };
80
155
  }
156
+ /**
157
+ * Registry of all supported Vana chains indexed by chain ID.
158
+ *
159
+ * @remarks
160
+ * Provides runtime access to chain configurations for dynamic network selection.
161
+ * Use this when you need to select chains based on user input or environment variables.
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * const chainId = parseInt(process.env.CHAIN_ID || '14800');
166
+ * const chain = chains[chainId];
167
+ *
168
+ * if (!chain) {
169
+ * throw new Error(`Unsupported chain ID: ${chainId}`);
170
+ * }
171
+ *
172
+ * const client = createPublicClient({
173
+ * chain,
174
+ * transport: http()
175
+ * });
176
+ * ```
177
+ *
178
+ * @category Blockchain
179
+ */
81
180
  export declare const chains: Chains;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/chains.ts"],"sourcesContent":["import type { Abi, Chain } from \"viem\";\nimport { defineChain } from \"viem\";\n\nexport const mokshaTestnet = defineChain({\n id: 14800,\n caipNetworkId: \"eip155:14800\",\n chainNamespace: \"eip155\",\n name: \"Moksha Testnet\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.moksha.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n blockscout: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n },\n contracts: {},\n abis: {},\n});\n\nexport const vanaMainnet = defineChain({\n id: 1480,\n caipNetworkId: \"eip155:1480\",\n chainNamespace: \"eip155\",\n name: \"Vana\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n blockscout: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n },\n contracts: {},\n abis: {},\n});\n\nexport interface Chains {\n [key: number]: Chain & { abis?: Record<string, Abi> };\n}\n\nexport const chains: Chains = {\n [mokshaTestnet.id]: mokshaTestnet,\n [vanaMainnet.id]: vanaMainnet,\n};\n"],"mappings":"AACA,SAAS,mBAAmB;AAErB,MAAM,gBAAgB,YAAY;AAAA,EACvC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,6BAA6B;AAAA,IACtC;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAEM,MAAM,cAAc,YAAY;AAAA,EACrC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,sBAAsB;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAMM,MAAM,SAAiB;AAAA,EAC5B,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,YAAY,EAAE,GAAG;AACpB;","names":[]}
1
+ {"version":3,"sources":["../../src/config/chains.ts"],"sourcesContent":["/**\n * Defines the supported Vana blockchain networks and their configurations.\n *\n * @remarks\n * This module provides the canonical chain definitions for the Vana protocol.\n * Each chain configuration includes RPC endpoints, block explorers, and network\n * metadata required for SDK operations. Use these definitions when configuring\n * wallet clients or checking network compatibility.\n *\n * @category Blockchain\n * @module chains\n */\n\nimport type { Abi, Chain } from \"viem\";\nimport { defineChain } from \"viem\";\n\n/**\n * Moksha testnet configuration for development and testing.\n *\n * @remarks\n * The Moksha testnet is Vana's primary test network for application development.\n * It provides a safe environment for testing smart contracts and SDK features\n * before mainnet deployment. Test VANA tokens can be obtained from the faucet.\n *\n * **Network Details:**\n * - Chain ID: 14800\n * - Currency: Test VANA (18 decimals)\n * - RPC: https://rpc.moksha.vana.org\n * - Explorer: https://moksha.vanascan.io\n *\n * @example\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { mokshaTestnet } from '@opendatalabs/vana-sdk';\n *\n * const client = createWalletClient({\n * chain: mokshaTestnet,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const mokshaTestnet = defineChain({\n id: 14800,\n caipNetworkId: \"eip155:14800\",\n chainNamespace: \"eip155\",\n name: \"Moksha Testnet\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.moksha.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n blockscout: {\n url: \"https://moksha.vanascan.io\",\n name: \"Vanascan - Moksha\",\n },\n },\n contracts: {},\n abis: {},\n});\n\n/**\n * Vana mainnet configuration for production deployments.\n *\n * @remarks\n * The Vana mainnet is the production network where real value transactions occur.\n * Use this chain for production applications after thorough testing on Moksha.\n * Requires real VANA tokens for gas fees and transactions.\n *\n * **Network Details:**\n * - Chain ID: 1480\n * - Currency: VANA (18 decimals)\n * - RPC: https://rpc.vana.org\n * - Explorer: https://vanascan.io\n *\n * @example\n * ```typescript\n * import { createWalletClient, http } from 'viem';\n * import { vanaMainnet } from '@opendatalabs/vana-sdk';\n *\n * const client = createWalletClient({\n * chain: vanaMainnet,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const vanaMainnet = defineChain({\n id: 1480,\n caipNetworkId: \"eip155:1480\",\n chainNamespace: \"eip155\",\n name: \"Vana\",\n nativeCurrency: {\n name: \"VANA\",\n symbol: \"VANA\",\n decimals: 18,\n },\n rpcUrls: {\n default: {\n http: [\"https://rpc.vana.org\"],\n },\n },\n blockExplorers: {\n default: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n blockscout: {\n url: \"https://vanascan.io\",\n name: \"Vanascan\",\n },\n },\n contracts: {},\n abis: {},\n});\n\n/**\n * Maps chain IDs to their complete configurations with optional ABIs.\n *\n * @remarks\n * Extends viem's Chain type to include optional contract ABIs for each network.\n * This allows dynamic chain selection based on runtime configuration.\n *\n * @category Blockchain\n */\nexport interface Chains {\n [key: number]: Chain & { abis?: Record<string, Abi> };\n}\n\n/**\n * Registry of all supported Vana chains indexed by chain ID.\n *\n * @remarks\n * Provides runtime access to chain configurations for dynamic network selection.\n * Use this when you need to select chains based on user input or environment variables.\n *\n * @example\n * ```typescript\n * const chainId = parseInt(process.env.CHAIN_ID || '14800');\n * const chain = chains[chainId];\n *\n * if (!chain) {\n * throw new Error(`Unsupported chain ID: ${chainId}`);\n * }\n *\n * const client = createPublicClient({\n * chain,\n * transport: http()\n * });\n * ```\n *\n * @category Blockchain\n */\nexport const chains: Chains = {\n [mokshaTestnet.id]: mokshaTestnet,\n [vanaMainnet.id]: vanaMainnet,\n};\n"],"mappings":"AAcA,SAAS,mBAAmB;AA6BrB,MAAM,gBAAgB,YAAY;AAAA,EACvC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,6BAA6B;AAAA,IACtC;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AA6BM,MAAM,cAAc,YAAY;AAAA,EACrC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,MACP,MAAM,CAAC,sBAAsB;AAAA,IAC/B;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,MACP,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,IACA,YAAY;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,WAAW,CAAC;AAAA,EACZ,MAAM,CAAC;AACT,CAAC;AAuCM,MAAM,SAAiB;AAAA,EAC5B,CAAC,cAAc,EAAE,GAAG;AAAA,EACpB,CAAC,YAAY,EAAE,GAAG;AACpB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contracts/contractController.ts"],"sourcesContent":["import type { Abi } from \"abitype\";\nimport {\n getContract,\n type GetContractReturnType,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport { type ContractAbis, getAbi, type VanaContract } from \"../generated/abi\";\nimport type { VanaChainId, ContractInfo } from \"../types/index\";\nimport { getContractAddress, CONTRACT_ADDRESSES } from \"../config/addresses\";\nimport { createClient } from \"../core/client\";\nimport { vanaMainnet } from \"../config/chains\";\n\n// Cache for contract instances - keyed by contract name and chain ID\nconst contractCache = new Map<string, GetContractReturnType<Abi>>();\n\n// Export cache for testing\nexport const contractCacheForTesting = contractCache;\n\n/**\n * Creates a cache key for contract instances\n *\n * @param contract - The contract name to create a cache key for\n * @param chainId - The chain ID to include in the cache key\n * @returns A string cache key combining contract name and chain ID\n */\nfunction createCacheKey(contract: VanaContract, chainId: number): string {\n return `${contract}:${chainId}`;\n}\n\n/**\n * Gets a typed contract instance for the specified contract name with full type inference.\n * This function provides complete type safety following viem's patterns.\n *\n * @param contract - Name of the contract to instantiate (must be a const assertion for full typing)\n * @param client - Optional viem client instance\n * @returns A fully typed contract instance with methods corresponding to the contract's ABI\n * @example\n * ```typescript\n * // Full type inference with const assertion\n * const dataRegistry = getContractController(\"DataRegistry\" as const, client);\n *\n * // Now dataRegistry has full type inference for all methods\n * const result = await dataRegistry.read.getFileCount(); // Type: bigint\n * await dataRegistry.write.addFile([url, proof]); // Typed parameters\n * ```\n */\nexport function getContractController<T extends VanaContract>(\n contract: T,\n client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient> = createClient(),\n): GetContractReturnType<ContractAbis[T]> {\n const chainId = client.chain?.id ?? vanaMainnet.id;\n const cacheKey = createCacheKey(contract, chainId);\n\n let controller = contractCache.get(cacheKey);\n\n if (!controller) {\n controller = getContract({\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n client,\n }) as GetContractReturnType<ContractAbis[T]>;\n\n contractCache.set(cacheKey, controller);\n }\n\n return controller as GetContractReturnType<ContractAbis[T]>;\n}\n\n/**\n * Gets contract information (address and ABI) without creating a contract instance.\n * Useful for cases where you need contract details but don't want to create a client connection.\n *\n * @param contract - Name of the contract\n * @param chainId - Chain ID (defaults to Vana mainnet)\n * @returns Contract information with typed ABI\n * @example\n * ```typescript\n * const info = getContractInfo(\"DataRegistry\" as const, 14800);\n * console.log(info.address); // Typed as Address\n * console.log(info.abi); // Fully typed ABI\n * ```\n */\nexport function getContractInfo<T extends VanaContract>(\n contract: T,\n chainId: VanaChainId = vanaMainnet.id as VanaChainId,\n): ContractInfo<ContractAbis[T]> {\n return {\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n };\n}\n\n/**\n * Type-safe contract factory that creates contract instances with full type inference.\n * This provides an alternative API that's more explicit about typing.\n */\nexport class ContractFactory {\n private readonly client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient>;\n private readonly chainId: number;\n\n constructor(\n client: PublicClient | WalletClient | ReturnType<typeof createClient>,\n ) {\n this.client = client;\n try {\n this.chainId = client.chain?.id ?? vanaMainnet.id;\n } catch {\n this.chainId = vanaMainnet.id;\n }\n }\n\n /**\n * Creates a typed contract instance\n *\n * @param contract - Contract name (use const assertion for full typing)\n * @returns Fully typed contract instance\n */\n create<T extends VanaContract>(\n contract: T,\n ): GetContractReturnType<ContractAbis[T]> {\n return getContractController(contract, this.client);\n }\n\n /**\n * Gets contract information without creating an instance\n *\n * @param contract - Contract name\n * @returns Contract information with typed ABI\n */\n getInfo<T extends VanaContract>(contract: T): ContractInfo<ContractAbis[T]> {\n return getContractInfo(contract, this.chainId as VanaChainId);\n }\n\n /**\n * Lists all available contracts for the current chain\n *\n * @returns Array of contract names available on this chain\n */\n getAvailableContracts(): VanaContract[] {\n // Return all contract names that have addresses on this chain\n const chainAddresses = CONTRACT_ADDRESSES[this.chainId];\n if (!chainAddresses) return [];\n\n return Object.keys(chainAddresses) as VanaContract[];\n }\n}\n\n/**\n * Clears the contract cache. Useful for testing or when chain configurations change.\n *\n * @param contract - Optional specific contract to clear, or clear all if not provided\n * @param chainId - Optional specific chain to clear, or clear all if not provided\n */\nexport function clearContractCache(\n contract?: VanaContract,\n chainId?: number,\n): void {\n if (contract && chainId) {\n const cacheKey = createCacheKey(contract, chainId);\n contractCache.delete(cacheKey);\n } else if (contract) {\n // Clear all instances of this contract across all chains\n for (const key of contractCache.keys()) {\n if (key.startsWith(`${contract}:`)) {\n contractCache.delete(key);\n }\n }\n } else if (chainId) {\n // Clear all contracts for this chain\n for (const key of contractCache.keys()) {\n if (key.endsWith(`:${chainId}`)) {\n contractCache.delete(key);\n }\n }\n } else {\n // Clear entire cache\n contractCache.clear();\n }\n}\n\n// Function is already exported above, no need for redundant export\n\n// Type-only exports for enhanced type safety\nexport type { GetContractReturnType } from \"viem\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAKO;AACP,iBAA6D;AAE7D,uBAAuD;AACvD,oBAA6B;AAC7B,oBAA4B;AAG5B,MAAM,gBAAgB,oBAAI,IAAwC;AAG3D,MAAM,0BAA0B;AASvC,SAAS,eAAe,UAAwB,SAAyB;AACvE,SAAO,GAAG,QAAQ,IAAI,OAAO;AAC/B;AAmBO,SAAS,sBACd,UACA,aAGsC,4BAAa,GACX;AACxC,QAAM,UAAU,OAAO,OAAO,MAAM,0BAAY;AAChD,QAAM,WAAW,eAAe,UAAU,OAAO;AAEjD,MAAI,aAAa,cAAc,IAAI,QAAQ;AAE3C,MAAI,CAAC,YAAY;AACf,qBAAa,yBAAY;AAAA,MACvB,aAAS,qCAAmB,SAAS,QAAQ;AAAA,MAC7C,SAAK,mBAAO,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,kBAAc,IAAI,UAAU,UAAU;AAAA,EACxC;AAEA,SAAO;AACT;AAgBO,SAAS,gBACd,UACA,UAAuB,0BAAY,IACJ;AAC/B,SAAO;AAAA,IACL,aAAS,qCAAmB,SAAS,QAAQ;AAAA,IAC7C,SAAK,mBAAO,QAAQ;AAAA,EACtB;AACF;AAMO,MAAM,gBAAgB;AAAA,EACV;AAAA,EAIA;AAAA,EAEjB,YACE,QACA;AACA,SAAK,SAAS;AACd,QAAI;AACF,WAAK,UAAU,OAAO,OAAO,MAAM,0BAAY;AAAA,IACjD,QAAQ;AACN,WAAK,UAAU,0BAAY;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,UACwC;AACxC,WAAO,sBAAsB,UAAU,KAAK,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAgC,UAA4C;AAC1E,WAAO,gBAAgB,UAAU,KAAK,OAAsB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwC;AAEtC,UAAM,iBAAiB,oCAAmB,KAAK,OAAO;AACtD,QAAI,CAAC,eAAgB,QAAO,CAAC;AAE7B,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AACF;AAQO,SAAS,mBACd,UACA,SACM;AACN,MAAI,YAAY,SAAS;AACvB,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,kBAAc,OAAO,QAAQ;AAAA,EAC/B,WAAW,UAAU;AAEnB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,WAAW,GAAG,QAAQ,GAAG,GAAG;AAClC,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,WAAW,SAAS;AAElB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,SAAS,IAAI,OAAO,EAAE,GAAG;AAC/B,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,kBAAc,MAAM;AAAA,EACtB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/contracts/contractController.ts"],"sourcesContent":["/**\n * Provides type-safe contract interaction utilities for the Vana protocol.\n *\n * @remarks\n * This module enables strongly-typed smart contract interactions with automatic\n * ABI loading, address resolution, and instance caching. It follows viem's patterns\n * for contract typing while providing Vana-specific conveniences.\n *\n * @category Contracts\n * @module contractController\n */\n\nimport type { Abi } from \"abitype\";\nimport {\n getContract,\n type GetContractReturnType,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport { type ContractAbis, getAbi, type VanaContract } from \"../generated/abi\";\nimport type { VanaChainId, ContractInfo } from \"../types/index\";\nimport { getContractAddress, CONTRACT_ADDRESSES } from \"../config/addresses\";\nimport { createClient } from \"../core/client\";\nimport { vanaMainnet } from \"../config/chains\";\n\n// Cache for contract instances - keyed by contract name and chain ID\nconst contractCache = new Map<string, GetContractReturnType<Abi>>();\n\n// Export cache for testing\nexport const contractCacheForTesting = contractCache;\n\n/**\n * Creates a cache key for contract instances.\n *\n * @remarks\n * Generates unique keys for caching contract instances per chain to prevent\n * cross-chain contamination and improve performance.\n *\n * @param contract - The contract name to create a cache key for\n * @param chainId - The chain ID to include in the cache key\n * @returns A string cache key combining contract name and chain ID\n *\n * @internal\n */\nfunction createCacheKey(contract: VanaContract, chainId: number): string {\n return `${contract}:${chainId}`;\n}\n\n/**\n * Gets a typed contract instance for the specified contract name.\n *\n * @remarks\n * Provides complete type safety following viem's patterns with automatic\n * ABI loading and address resolution. Contract instances are cached per\n * chain for performance. Use const assertion for full type inference.\n *\n * @param contract - Name of the contract to instantiate.\n * Use const assertion for full typing: `\"DataRegistry\" as const`\n * @param client - Optional viem client instance.\n * Defaults to auto-configured client. Obtain via `createClient()` or viem.\n * @returns A fully typed contract instance with methods corresponding to the contract's ABI\n *\n * @example\n * ```typescript\n * // Full type inference with const assertion\n * const dataRegistry = getContractController(\"DataRegistry\" as const, client);\n *\n * // Now dataRegistry has full type inference for all methods\n * const result = await dataRegistry.read.getFileCount(); // Type: bigint\n * await dataRegistry.write.addFile([url, proof]); // Typed parameters\n *\n * // Auto-configured client\n * const permissions = getContractController(\"DataPortabilityPermissions\" as const);\n * const granted = await permissions.read.hasPermission([grantor, grantee]);\n * ```\n *\n * @category Contracts\n */\nexport function getContractController<T extends VanaContract>(\n contract: T,\n client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient> = createClient(),\n): GetContractReturnType<ContractAbis[T]> {\n const chainId = client.chain?.id ?? vanaMainnet.id;\n const cacheKey = createCacheKey(contract, chainId);\n\n let controller = contractCache.get(cacheKey);\n\n if (!controller) {\n controller = getContract({\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n client,\n }) as GetContractReturnType<ContractAbis[T]>;\n\n contractCache.set(cacheKey, controller);\n }\n\n return controller as GetContractReturnType<ContractAbis[T]>;\n}\n\n/**\n * Gets contract information without creating a contract instance.\n *\n * @remarks\n * Returns contract address and ABI for manual contract interaction or\n * custom client configuration. Useful when you need contract details\n * but don't want to create a client connection.\n *\n * @param contract - Name of the contract.\n * Use const assertion for typed ABI.\n * @param chainId - Chain ID to get contract info for.\n * Defaults to Vana mainnet (1480).\n * @returns Contract information with typed ABI\n *\n * @example\n * ```typescript\n * const info = getContractInfo(\"DataRegistry\" as const, 14800);\n * console.log(info.address); // Typed as Address\n * console.log(info.abi); // Fully typed ABI\n *\n * // Use with custom viem client\n * const contract = getContract({\n * ...info,\n * client: customClient\n * });\n * ```\n *\n * @category Contracts\n */\nexport function getContractInfo<T extends VanaContract>(\n contract: T,\n chainId: VanaChainId = vanaMainnet.id as VanaChainId,\n): ContractInfo<ContractAbis[T]> {\n return {\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n };\n}\n\n/**\n * Provides type-safe contract factory for creating multiple contract instances.\n *\n * @remarks\n * Alternative API for applications that need to create multiple contracts\n * with the same client. The factory pattern reduces boilerplate and ensures\n * consistent client configuration across contracts.\n *\n * @example\n * ```typescript\n * const factory = new ContractFactory(client);\n *\n * const dataRegistry = factory.create(\"DataRegistry\" as const);\n * const permissions = factory.create(\"DataPortabilityPermissions\" as const);\n *\n * // List available contracts\n * const contracts = factory.getAvailableContracts();\n * ```\n *\n * @category Contracts\n */\nexport class ContractFactory {\n private readonly client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient>;\n private readonly chainId: number;\n\n constructor(\n client: PublicClient | WalletClient | ReturnType<typeof createClient>,\n ) {\n this.client = client;\n try {\n this.chainId = client.chain?.id ?? vanaMainnet.id;\n } catch {\n this.chainId = vanaMainnet.id;\n }\n }\n\n /**\n * Creates a typed contract instance\n *\n * @param contract - Contract name (use const assertion for full typing)\n * @returns Fully typed contract instance\n */\n create<T extends VanaContract>(\n contract: T,\n ): GetContractReturnType<ContractAbis[T]> {\n return getContractController(contract, this.client);\n }\n\n /**\n * Gets contract information without creating an instance\n *\n * @param contract - Contract name\n * @returns Contract information with typed ABI\n */\n getInfo<T extends VanaContract>(contract: T): ContractInfo<ContractAbis[T]> {\n return getContractInfo(contract, this.chainId as VanaChainId);\n }\n\n /**\n * Lists all available contracts for the current chain\n *\n * @returns Array of contract names available on this chain\n */\n getAvailableContracts(): VanaContract[] {\n // Return all contract names that have addresses on this chain\n const chainAddresses = CONTRACT_ADDRESSES[this.chainId];\n if (!chainAddresses) return [];\n\n return Object.keys(chainAddresses) as VanaContract[];\n }\n}\n\n/**\n * Clears the contract cache. Useful for testing or when chain configurations change.\n *\n * @param contract - Optional specific contract to clear, or clear all if not provided\n * @param chainId - Optional specific chain to clear, or clear all if not provided\n */\nexport function clearContractCache(\n contract?: VanaContract,\n chainId?: number,\n): void {\n if (contract && chainId) {\n const cacheKey = createCacheKey(contract, chainId);\n contractCache.delete(cacheKey);\n } else if (contract) {\n // Clear all instances of this contract across all chains\n for (const key of contractCache.keys()) {\n if (key.startsWith(`${contract}:`)) {\n contractCache.delete(key);\n }\n }\n } else if (chainId) {\n // Clear all contracts for this chain\n for (const key of contractCache.keys()) {\n if (key.endsWith(`:${chainId}`)) {\n contractCache.delete(key);\n }\n }\n } else {\n // Clear entire cache\n contractCache.clear();\n }\n}\n\n// Function is already exported above, no need for redundant export\n\n// Type-only exports for enhanced type safety\nexport type { GetContractReturnType } from \"viem\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,kBAKO;AACP,iBAA6D;AAE7D,uBAAuD;AACvD,oBAA6B;AAC7B,oBAA4B;AAG5B,MAAM,gBAAgB,oBAAI,IAAwC;AAG3D,MAAM,0BAA0B;AAevC,SAAS,eAAe,UAAwB,SAAyB;AACvE,SAAO,GAAG,QAAQ,IAAI,OAAO;AAC/B;AAgCO,SAAS,sBACd,UACA,aAGsC,4BAAa,GACX;AACxC,QAAM,UAAU,OAAO,OAAO,MAAM,0BAAY;AAChD,QAAM,WAAW,eAAe,UAAU,OAAO;AAEjD,MAAI,aAAa,cAAc,IAAI,QAAQ;AAE3C,MAAI,CAAC,YAAY;AACf,qBAAa,yBAAY;AAAA,MACvB,aAAS,qCAAmB,SAAS,QAAQ;AAAA,MAC7C,SAAK,mBAAO,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,kBAAc,IAAI,UAAU,UAAU;AAAA,EACxC;AAEA,SAAO;AACT;AA+BO,SAAS,gBACd,UACA,UAAuB,0BAAY,IACJ;AAC/B,SAAO;AAAA,IACL,aAAS,qCAAmB,SAAS,QAAQ;AAAA,IAC7C,SAAK,mBAAO,QAAQ;AAAA,EACtB;AACF;AAuBO,MAAM,gBAAgB;AAAA,EACV;AAAA,EAIA;AAAA,EAEjB,YACE,QACA;AACA,SAAK,SAAS;AACd,QAAI;AACF,WAAK,UAAU,OAAO,OAAO,MAAM,0BAAY;AAAA,IACjD,QAAQ;AACN,WAAK,UAAU,0BAAY;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,UACwC;AACxC,WAAO,sBAAsB,UAAU,KAAK,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAgC,UAA4C;AAC1E,WAAO,gBAAgB,UAAU,KAAK,OAAsB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwC;AAEtC,UAAM,iBAAiB,oCAAmB,KAAK,OAAO;AACtD,QAAI,CAAC,eAAgB,QAAO,CAAC;AAE7B,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AACF;AAQO,SAAS,mBACd,UACA,SACM;AACN,MAAI,YAAY,SAAS;AACvB,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,kBAAc,OAAO,QAAQ;AAAA,EAC/B,WAAW,UAAU;AAEnB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,WAAW,GAAG,QAAQ,GAAG,GAAG;AAClC,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,WAAW,SAAS;AAElB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,SAAS,IAAI,OAAO,EAAE,GAAG;AAC/B,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,kBAAc,MAAM;AAAA,EACtB;AACF;","names":[]}
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Provides type-safe contract interaction utilities for the Vana protocol.
3
+ *
4
+ * @remarks
5
+ * This module enables strongly-typed smart contract interactions with automatic
6
+ * ABI loading, address resolution, and instance caching. It follows viem's patterns
7
+ * for contract typing while providing Vana-specific conveniences.
8
+ *
9
+ * @category Contracts
10
+ * @module contractController
11
+ */
1
12
  import type { Abi } from "abitype";
2
13
  import { type GetContractReturnType, type PublicClient, type WalletClient } from "viem";
3
14
  import { type ContractAbis, type VanaContract } from "../generated/abi";
@@ -8,12 +19,19 @@ export declare const contractCacheForTesting: Map<string, {
8
19
  abi: Abi;
9
20
  }>;
10
21
  /**
11
- * Gets a typed contract instance for the specified contract name with full type inference.
12
- * This function provides complete type safety following viem's patterns.
22
+ * Gets a typed contract instance for the specified contract name.
23
+ *
24
+ * @remarks
25
+ * Provides complete type safety following viem's patterns with automatic
26
+ * ABI loading and address resolution. Contract instances are cached per
27
+ * chain for performance. Use const assertion for full type inference.
13
28
  *
14
- * @param contract - Name of the contract to instantiate (must be a const assertion for full typing)
15
- * @param client - Optional viem client instance
29
+ * @param contract - Name of the contract to instantiate.
30
+ * Use const assertion for full typing: `"DataRegistry" as const`
31
+ * @param client - Optional viem client instance.
32
+ * Defaults to auto-configured client. Obtain via `createClient()` or viem.
16
33
  * @returns A fully typed contract instance with methods corresponding to the contract's ABI
34
+ *
17
35
  * @example
18
36
  * ```typescript
19
37
  * // Full type inference with const assertion
@@ -22,27 +40,65 @@ export declare const contractCacheForTesting: Map<string, {
22
40
  * // Now dataRegistry has full type inference for all methods
23
41
  * const result = await dataRegistry.read.getFileCount(); // Type: bigint
24
42
  * await dataRegistry.write.addFile([url, proof]); // Typed parameters
43
+ *
44
+ * // Auto-configured client
45
+ * const permissions = getContractController("DataPortabilityPermissions" as const);
46
+ * const granted = await permissions.read.hasPermission([grantor, grantee]);
25
47
  * ```
48
+ *
49
+ * @category Contracts
26
50
  */
27
51
  export declare function getContractController<T extends VanaContract>(contract: T, client?: PublicClient | WalletClient | ReturnType<typeof createClient>): GetContractReturnType<ContractAbis[T]>;
28
52
  /**
29
- * Gets contract information (address and ABI) without creating a contract instance.
30
- * Useful for cases where you need contract details but don't want to create a client connection.
53
+ * Gets contract information without creating a contract instance.
31
54
  *
32
- * @param contract - Name of the contract
33
- * @param chainId - Chain ID (defaults to Vana mainnet)
55
+ * @remarks
56
+ * Returns contract address and ABI for manual contract interaction or
57
+ * custom client configuration. Useful when you need contract details
58
+ * but don't want to create a client connection.
59
+ *
60
+ * @param contract - Name of the contract.
61
+ * Use const assertion for typed ABI.
62
+ * @param chainId - Chain ID to get contract info for.
63
+ * Defaults to Vana mainnet (1480).
34
64
  * @returns Contract information with typed ABI
65
+ *
35
66
  * @example
36
67
  * ```typescript
37
68
  * const info = getContractInfo("DataRegistry" as const, 14800);
38
69
  * console.log(info.address); // Typed as Address
39
70
  * console.log(info.abi); // Fully typed ABI
71
+ *
72
+ * // Use with custom viem client
73
+ * const contract = getContract({
74
+ * ...info,
75
+ * client: customClient
76
+ * });
40
77
  * ```
78
+ *
79
+ * @category Contracts
41
80
  */
42
81
  export declare function getContractInfo<T extends VanaContract>(contract: T, chainId?: VanaChainId): ContractInfo<ContractAbis[T]>;
43
82
  /**
44
- * Type-safe contract factory that creates contract instances with full type inference.
45
- * This provides an alternative API that's more explicit about typing.
83
+ * Provides type-safe contract factory for creating multiple contract instances.
84
+ *
85
+ * @remarks
86
+ * Alternative API for applications that need to create multiple contracts
87
+ * with the same client. The factory pattern reduces boilerplate and ensures
88
+ * consistent client configuration across contracts.
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const factory = new ContractFactory(client);
93
+ *
94
+ * const dataRegistry = factory.create("DataRegistry" as const);
95
+ * const permissions = factory.create("DataPortabilityPermissions" as const);
96
+ *
97
+ * // List available contracts
98
+ * const contracts = factory.getAvailableContracts();
99
+ * ```
100
+ *
101
+ * @category Contracts
46
102
  */
47
103
  export declare class ContractFactory {
48
104
  private readonly client;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/contracts/contractController.ts"],"sourcesContent":["import type { Abi } from \"abitype\";\nimport {\n getContract,\n type GetContractReturnType,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport { type ContractAbis, getAbi, type VanaContract } from \"../generated/abi\";\nimport type { VanaChainId, ContractInfo } from \"../types/index\";\nimport { getContractAddress, CONTRACT_ADDRESSES } from \"../config/addresses\";\nimport { createClient } from \"../core/client\";\nimport { vanaMainnet } from \"../config/chains\";\n\n// Cache for contract instances - keyed by contract name and chain ID\nconst contractCache = new Map<string, GetContractReturnType<Abi>>();\n\n// Export cache for testing\nexport const contractCacheForTesting = contractCache;\n\n/**\n * Creates a cache key for contract instances\n *\n * @param contract - The contract name to create a cache key for\n * @param chainId - The chain ID to include in the cache key\n * @returns A string cache key combining contract name and chain ID\n */\nfunction createCacheKey(contract: VanaContract, chainId: number): string {\n return `${contract}:${chainId}`;\n}\n\n/**\n * Gets a typed contract instance for the specified contract name with full type inference.\n * This function provides complete type safety following viem's patterns.\n *\n * @param contract - Name of the contract to instantiate (must be a const assertion for full typing)\n * @param client - Optional viem client instance\n * @returns A fully typed contract instance with methods corresponding to the contract's ABI\n * @example\n * ```typescript\n * // Full type inference with const assertion\n * const dataRegistry = getContractController(\"DataRegistry\" as const, client);\n *\n * // Now dataRegistry has full type inference for all methods\n * const result = await dataRegistry.read.getFileCount(); // Type: bigint\n * await dataRegistry.write.addFile([url, proof]); // Typed parameters\n * ```\n */\nexport function getContractController<T extends VanaContract>(\n contract: T,\n client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient> = createClient(),\n): GetContractReturnType<ContractAbis[T]> {\n const chainId = client.chain?.id ?? vanaMainnet.id;\n const cacheKey = createCacheKey(contract, chainId);\n\n let controller = contractCache.get(cacheKey);\n\n if (!controller) {\n controller = getContract({\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n client,\n }) as GetContractReturnType<ContractAbis[T]>;\n\n contractCache.set(cacheKey, controller);\n }\n\n return controller as GetContractReturnType<ContractAbis[T]>;\n}\n\n/**\n * Gets contract information (address and ABI) without creating a contract instance.\n * Useful for cases where you need contract details but don't want to create a client connection.\n *\n * @param contract - Name of the contract\n * @param chainId - Chain ID (defaults to Vana mainnet)\n * @returns Contract information with typed ABI\n * @example\n * ```typescript\n * const info = getContractInfo(\"DataRegistry\" as const, 14800);\n * console.log(info.address); // Typed as Address\n * console.log(info.abi); // Fully typed ABI\n * ```\n */\nexport function getContractInfo<T extends VanaContract>(\n contract: T,\n chainId: VanaChainId = vanaMainnet.id as VanaChainId,\n): ContractInfo<ContractAbis[T]> {\n return {\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n };\n}\n\n/**\n * Type-safe contract factory that creates contract instances with full type inference.\n * This provides an alternative API that's more explicit about typing.\n */\nexport class ContractFactory {\n private readonly client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient>;\n private readonly chainId: number;\n\n constructor(\n client: PublicClient | WalletClient | ReturnType<typeof createClient>,\n ) {\n this.client = client;\n try {\n this.chainId = client.chain?.id ?? vanaMainnet.id;\n } catch {\n this.chainId = vanaMainnet.id;\n }\n }\n\n /**\n * Creates a typed contract instance\n *\n * @param contract - Contract name (use const assertion for full typing)\n * @returns Fully typed contract instance\n */\n create<T extends VanaContract>(\n contract: T,\n ): GetContractReturnType<ContractAbis[T]> {\n return getContractController(contract, this.client);\n }\n\n /**\n * Gets contract information without creating an instance\n *\n * @param contract - Contract name\n * @returns Contract information with typed ABI\n */\n getInfo<T extends VanaContract>(contract: T): ContractInfo<ContractAbis[T]> {\n return getContractInfo(contract, this.chainId as VanaChainId);\n }\n\n /**\n * Lists all available contracts for the current chain\n *\n * @returns Array of contract names available on this chain\n */\n getAvailableContracts(): VanaContract[] {\n // Return all contract names that have addresses on this chain\n const chainAddresses = CONTRACT_ADDRESSES[this.chainId];\n if (!chainAddresses) return [];\n\n return Object.keys(chainAddresses) as VanaContract[];\n }\n}\n\n/**\n * Clears the contract cache. Useful for testing or when chain configurations change.\n *\n * @param contract - Optional specific contract to clear, or clear all if not provided\n * @param chainId - Optional specific chain to clear, or clear all if not provided\n */\nexport function clearContractCache(\n contract?: VanaContract,\n chainId?: number,\n): void {\n if (contract && chainId) {\n const cacheKey = createCacheKey(contract, chainId);\n contractCache.delete(cacheKey);\n } else if (contract) {\n // Clear all instances of this contract across all chains\n for (const key of contractCache.keys()) {\n if (key.startsWith(`${contract}:`)) {\n contractCache.delete(key);\n }\n }\n } else if (chainId) {\n // Clear all contracts for this chain\n for (const key of contractCache.keys()) {\n if (key.endsWith(`:${chainId}`)) {\n contractCache.delete(key);\n }\n }\n } else {\n // Clear entire cache\n contractCache.clear();\n }\n}\n\n// Function is already exported above, no need for redundant export\n\n// Type-only exports for enhanced type safety\nexport type { GetContractReturnType } from \"viem\";\n"],"mappings":"AACA;AAAA,EACE;AAAA,OAIK;AACP,SAA4B,cAAiC;AAE7D,SAAS,oBAAoB,0BAA0B;AACvD,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAG5B,MAAM,gBAAgB,oBAAI,IAAwC;AAG3D,MAAM,0BAA0B;AASvC,SAAS,eAAe,UAAwB,SAAyB;AACvE,SAAO,GAAG,QAAQ,IAAI,OAAO;AAC/B;AAmBO,SAAS,sBACd,UACA,SAGsC,aAAa,GACX;AACxC,QAAM,UAAU,OAAO,OAAO,MAAM,YAAY;AAChD,QAAM,WAAW,eAAe,UAAU,OAAO;AAEjD,MAAI,aAAa,cAAc,IAAI,QAAQ;AAE3C,MAAI,CAAC,YAAY;AACf,iBAAa,YAAY;AAAA,MACvB,SAAS,mBAAmB,SAAS,QAAQ;AAAA,MAC7C,KAAK,OAAO,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,kBAAc,IAAI,UAAU,UAAU;AAAA,EACxC;AAEA,SAAO;AACT;AAgBO,SAAS,gBACd,UACA,UAAuB,YAAY,IACJ;AAC/B,SAAO;AAAA,IACL,SAAS,mBAAmB,SAAS,QAAQ;AAAA,IAC7C,KAAK,OAAO,QAAQ;AAAA,EACtB;AACF;AAMO,MAAM,gBAAgB;AAAA,EACV;AAAA,EAIA;AAAA,EAEjB,YACE,QACA;AACA,SAAK,SAAS;AACd,QAAI;AACF,WAAK,UAAU,OAAO,OAAO,MAAM,YAAY;AAAA,IACjD,QAAQ;AACN,WAAK,UAAU,YAAY;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,UACwC;AACxC,WAAO,sBAAsB,UAAU,KAAK,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAgC,UAA4C;AAC1E,WAAO,gBAAgB,UAAU,KAAK,OAAsB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwC;AAEtC,UAAM,iBAAiB,mBAAmB,KAAK,OAAO;AACtD,QAAI,CAAC,eAAgB,QAAO,CAAC;AAE7B,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AACF;AAQO,SAAS,mBACd,UACA,SACM;AACN,MAAI,YAAY,SAAS;AACvB,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,kBAAc,OAAO,QAAQ;AAAA,EAC/B,WAAW,UAAU;AAEnB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,WAAW,GAAG,QAAQ,GAAG,GAAG;AAClC,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,WAAW,SAAS;AAElB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,SAAS,IAAI,OAAO,EAAE,GAAG;AAC/B,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,kBAAc,MAAM;AAAA,EACtB;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/contracts/contractController.ts"],"sourcesContent":["/**\n * Provides type-safe contract interaction utilities for the Vana protocol.\n *\n * @remarks\n * This module enables strongly-typed smart contract interactions with automatic\n * ABI loading, address resolution, and instance caching. It follows viem's patterns\n * for contract typing while providing Vana-specific conveniences.\n *\n * @category Contracts\n * @module contractController\n */\n\nimport type { Abi } from \"abitype\";\nimport {\n getContract,\n type GetContractReturnType,\n type PublicClient,\n type WalletClient,\n} from \"viem\";\nimport { type ContractAbis, getAbi, type VanaContract } from \"../generated/abi\";\nimport type { VanaChainId, ContractInfo } from \"../types/index\";\nimport { getContractAddress, CONTRACT_ADDRESSES } from \"../config/addresses\";\nimport { createClient } from \"../core/client\";\nimport { vanaMainnet } from \"../config/chains\";\n\n// Cache for contract instances - keyed by contract name and chain ID\nconst contractCache = new Map<string, GetContractReturnType<Abi>>();\n\n// Export cache for testing\nexport const contractCacheForTesting = contractCache;\n\n/**\n * Creates a cache key for contract instances.\n *\n * @remarks\n * Generates unique keys for caching contract instances per chain to prevent\n * cross-chain contamination and improve performance.\n *\n * @param contract - The contract name to create a cache key for\n * @param chainId - The chain ID to include in the cache key\n * @returns A string cache key combining contract name and chain ID\n *\n * @internal\n */\nfunction createCacheKey(contract: VanaContract, chainId: number): string {\n return `${contract}:${chainId}`;\n}\n\n/**\n * Gets a typed contract instance for the specified contract name.\n *\n * @remarks\n * Provides complete type safety following viem's patterns with automatic\n * ABI loading and address resolution. Contract instances are cached per\n * chain for performance. Use const assertion for full type inference.\n *\n * @param contract - Name of the contract to instantiate.\n * Use const assertion for full typing: `\"DataRegistry\" as const`\n * @param client - Optional viem client instance.\n * Defaults to auto-configured client. Obtain via `createClient()` or viem.\n * @returns A fully typed contract instance with methods corresponding to the contract's ABI\n *\n * @example\n * ```typescript\n * // Full type inference with const assertion\n * const dataRegistry = getContractController(\"DataRegistry\" as const, client);\n *\n * // Now dataRegistry has full type inference for all methods\n * const result = await dataRegistry.read.getFileCount(); // Type: bigint\n * await dataRegistry.write.addFile([url, proof]); // Typed parameters\n *\n * // Auto-configured client\n * const permissions = getContractController(\"DataPortabilityPermissions\" as const);\n * const granted = await permissions.read.hasPermission([grantor, grantee]);\n * ```\n *\n * @category Contracts\n */\nexport function getContractController<T extends VanaContract>(\n contract: T,\n client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient> = createClient(),\n): GetContractReturnType<ContractAbis[T]> {\n const chainId = client.chain?.id ?? vanaMainnet.id;\n const cacheKey = createCacheKey(contract, chainId);\n\n let controller = contractCache.get(cacheKey);\n\n if (!controller) {\n controller = getContract({\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n client,\n }) as GetContractReturnType<ContractAbis[T]>;\n\n contractCache.set(cacheKey, controller);\n }\n\n return controller as GetContractReturnType<ContractAbis[T]>;\n}\n\n/**\n * Gets contract information without creating a contract instance.\n *\n * @remarks\n * Returns contract address and ABI for manual contract interaction or\n * custom client configuration. Useful when you need contract details\n * but don't want to create a client connection.\n *\n * @param contract - Name of the contract.\n * Use const assertion for typed ABI.\n * @param chainId - Chain ID to get contract info for.\n * Defaults to Vana mainnet (1480).\n * @returns Contract information with typed ABI\n *\n * @example\n * ```typescript\n * const info = getContractInfo(\"DataRegistry\" as const, 14800);\n * console.log(info.address); // Typed as Address\n * console.log(info.abi); // Fully typed ABI\n *\n * // Use with custom viem client\n * const contract = getContract({\n * ...info,\n * client: customClient\n * });\n * ```\n *\n * @category Contracts\n */\nexport function getContractInfo<T extends VanaContract>(\n contract: T,\n chainId: VanaChainId = vanaMainnet.id as VanaChainId,\n): ContractInfo<ContractAbis[T]> {\n return {\n address: getContractAddress(chainId, contract),\n abi: getAbi(contract),\n };\n}\n\n/**\n * Provides type-safe contract factory for creating multiple contract instances.\n *\n * @remarks\n * Alternative API for applications that need to create multiple contracts\n * with the same client. The factory pattern reduces boilerplate and ensures\n * consistent client configuration across contracts.\n *\n * @example\n * ```typescript\n * const factory = new ContractFactory(client);\n *\n * const dataRegistry = factory.create(\"DataRegistry\" as const);\n * const permissions = factory.create(\"DataPortabilityPermissions\" as const);\n *\n * // List available contracts\n * const contracts = factory.getAvailableContracts();\n * ```\n *\n * @category Contracts\n */\nexport class ContractFactory {\n private readonly client:\n | PublicClient\n | WalletClient\n | ReturnType<typeof createClient>;\n private readonly chainId: number;\n\n constructor(\n client: PublicClient | WalletClient | ReturnType<typeof createClient>,\n ) {\n this.client = client;\n try {\n this.chainId = client.chain?.id ?? vanaMainnet.id;\n } catch {\n this.chainId = vanaMainnet.id;\n }\n }\n\n /**\n * Creates a typed contract instance\n *\n * @param contract - Contract name (use const assertion for full typing)\n * @returns Fully typed contract instance\n */\n create<T extends VanaContract>(\n contract: T,\n ): GetContractReturnType<ContractAbis[T]> {\n return getContractController(contract, this.client);\n }\n\n /**\n * Gets contract information without creating an instance\n *\n * @param contract - Contract name\n * @returns Contract information with typed ABI\n */\n getInfo<T extends VanaContract>(contract: T): ContractInfo<ContractAbis[T]> {\n return getContractInfo(contract, this.chainId as VanaChainId);\n }\n\n /**\n * Lists all available contracts for the current chain\n *\n * @returns Array of contract names available on this chain\n */\n getAvailableContracts(): VanaContract[] {\n // Return all contract names that have addresses on this chain\n const chainAddresses = CONTRACT_ADDRESSES[this.chainId];\n if (!chainAddresses) return [];\n\n return Object.keys(chainAddresses) as VanaContract[];\n }\n}\n\n/**\n * Clears the contract cache. Useful for testing or when chain configurations change.\n *\n * @param contract - Optional specific contract to clear, or clear all if not provided\n * @param chainId - Optional specific chain to clear, or clear all if not provided\n */\nexport function clearContractCache(\n contract?: VanaContract,\n chainId?: number,\n): void {\n if (contract && chainId) {\n const cacheKey = createCacheKey(contract, chainId);\n contractCache.delete(cacheKey);\n } else if (contract) {\n // Clear all instances of this contract across all chains\n for (const key of contractCache.keys()) {\n if (key.startsWith(`${contract}:`)) {\n contractCache.delete(key);\n }\n }\n } else if (chainId) {\n // Clear all contracts for this chain\n for (const key of contractCache.keys()) {\n if (key.endsWith(`:${chainId}`)) {\n contractCache.delete(key);\n }\n }\n } else {\n // Clear entire cache\n contractCache.clear();\n }\n}\n\n// Function is already exported above, no need for redundant export\n\n// Type-only exports for enhanced type safety\nexport type { GetContractReturnType } from \"viem\";\n"],"mappings":"AAaA;AAAA,EACE;AAAA,OAIK;AACP,SAA4B,cAAiC;AAE7D,SAAS,oBAAoB,0BAA0B;AACvD,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAG5B,MAAM,gBAAgB,oBAAI,IAAwC;AAG3D,MAAM,0BAA0B;AAevC,SAAS,eAAe,UAAwB,SAAyB;AACvE,SAAO,GAAG,QAAQ,IAAI,OAAO;AAC/B;AAgCO,SAAS,sBACd,UACA,SAGsC,aAAa,GACX;AACxC,QAAM,UAAU,OAAO,OAAO,MAAM,YAAY;AAChD,QAAM,WAAW,eAAe,UAAU,OAAO;AAEjD,MAAI,aAAa,cAAc,IAAI,QAAQ;AAE3C,MAAI,CAAC,YAAY;AACf,iBAAa,YAAY;AAAA,MACvB,SAAS,mBAAmB,SAAS,QAAQ;AAAA,MAC7C,KAAK,OAAO,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,kBAAc,IAAI,UAAU,UAAU;AAAA,EACxC;AAEA,SAAO;AACT;AA+BO,SAAS,gBACd,UACA,UAAuB,YAAY,IACJ;AAC/B,SAAO;AAAA,IACL,SAAS,mBAAmB,SAAS,QAAQ;AAAA,IAC7C,KAAK,OAAO,QAAQ;AAAA,EACtB;AACF;AAuBO,MAAM,gBAAgB;AAAA,EACV;AAAA,EAIA;AAAA,EAEjB,YACE,QACA;AACA,SAAK,SAAS;AACd,QAAI;AACF,WAAK,UAAU,OAAO,OAAO,MAAM,YAAY;AAAA,IACjD,QAAQ;AACN,WAAK,UAAU,YAAY;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OACE,UACwC;AACxC,WAAO,sBAAsB,UAAU,KAAK,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAgC,UAA4C;AAC1E,WAAO,gBAAgB,UAAU,KAAK,OAAsB;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,wBAAwC;AAEtC,UAAM,iBAAiB,mBAAmB,KAAK,OAAO;AACtD,QAAI,CAAC,eAAgB,QAAO,CAAC;AAE7B,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AACF;AAQO,SAAS,mBACd,UACA,SACM;AACN,MAAI,YAAY,SAAS;AACvB,UAAM,WAAW,eAAe,UAAU,OAAO;AACjD,kBAAc,OAAO,QAAQ;AAAA,EAC/B,WAAW,UAAU;AAEnB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,WAAW,GAAG,QAAQ,GAAG,GAAG;AAClC,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,WAAW,SAAS;AAElB,eAAW,OAAO,cAAc,KAAK,GAAG;AACtC,UAAI,IAAI,SAAS,IAAI,OAAO,EAAE,GAAG;AAC/B,sBAAc,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,OAAO;AAEL,kBAAc,MAAM;AAAA,EACtB;AACF;","names":[]}
@@ -75,6 +75,39 @@ class BaseController {
75
75
  );
76
76
  }
77
77
  }
78
+ /**
79
+ * Helper to safely spread transaction options for viem compatibility.
80
+ * Handles EIP-1559 vs legacy gas pricing correctly.
81
+ *
82
+ * @param options - Transaction options to spread
83
+ * @returns Properly formatted options for viem
84
+ * @internal
85
+ */
86
+ spreadTransactionOptions(options) {
87
+ if (!options) return {};
88
+ const baseOptions = {
89
+ ...options.nonce !== void 0 && { nonce: options.nonce },
90
+ ...options.gas !== void 0 && { gas: options.gas }
91
+ };
92
+ if (options.maxFeePerGas !== void 0 || options.maxPriorityFeePerGas !== void 0) {
93
+ return {
94
+ ...baseOptions,
95
+ ...options.maxFeePerGas !== void 0 && {
96
+ maxFeePerGas: options.maxFeePerGas
97
+ },
98
+ ...options.maxPriorityFeePerGas !== void 0 && {
99
+ maxPriorityFeePerGas: options.maxPriorityFeePerGas
100
+ }
101
+ };
102
+ }
103
+ if (options.gasPrice !== void 0) {
104
+ return {
105
+ ...baseOptions,
106
+ gasPrice: options.gasPrice
107
+ };
108
+ }
109
+ return baseOptions;
110
+ }
78
111
  }
79
112
  // Annotate the CommonJS export names for ESM import in node:
80
113
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/controllers/base.ts"],"sourcesContent":["/**\n * Base controller class providing common functionality for all controllers.\n *\n * @remarks\n * This abstract class establishes the foundation for all Vana SDK controllers,\n * providing shared utilities like wallet validation and context management.\n * All controllers should extend this base class to ensure consistency and\n * shared behavior across the SDK.\n *\n * The class follows the Single Responsibility Principle by handling only\n * the core controller concerns while leaving specific functionality to\n * implementing classes.\n *\n * @category Controllers\n */\n\nimport type { WalletClient } from \"viem\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport { ReadOnlyError } from \"../errors\";\n\n/**\n * Abstract base controller that all Vana SDK controllers extend.\n *\n * @remarks\n * Provides common functionality and patterns used across all controllers,\n * including wallet validation and context management. This ensures\n * consistency and reduces code duplication throughout the SDK.\n *\n * Key features:\n * - Wallet client validation with TypeScript assertion signatures\n * - Consistent error handling for read-only scenarios\n * - Shared context management patterns\n * - Type-safe wallet operations\n *\n * @example\n * ```typescript\n * class MyController extends BaseController {\n * async performWalletOperation() {\n * this.assertWallet(); // Ensures wallet is available\n * // Now this.context.walletClient is guaranteed to be available\n * const address = await this.context.walletClient.getAddresses();\n * return address[0];\n * }\n * }\n * ```\n */\nexport abstract class BaseController {\n /**\n * Creates a new controller instance with the provided context.\n *\n * @param context - The controller context containing clients and configuration\n */\n constructor(protected readonly context: ControllerContext) {}\n\n /**\n * Asserts that a wallet client with an account is available for operations requiring signing.\n *\n * @remarks\n * This method uses TypeScript assertion signatures to narrow the type of\n * `this.context` to guarantee that `walletClient` with an account is available\n * after the call succeeds. This provides compile-time safety for wallet operations\n * while enabling clear error messages for read-only scenarios.\n *\n * The assertion signature ensures that after calling this method,\n * TypeScript knows that `this.context.walletClient` is definitely available\n * with a configured account.\n *\n * @throws {ReadOnlyError} When no wallet client is configured\n * @throws {Error} When wallet client exists but no account is configured\n *\n * @example\n * ```typescript\n * async performWalletOperation() {\n * this.assertWallet(); // Type assertion + runtime check\n *\n * // TypeScript now knows walletClient and account are available\n * const account = this.context.walletClient.account;\n * const address = typeof account === 'string' ? account : account.address;\n * }\n * ```\n */\n protected assertWallet(): asserts this is {\n context: ControllerContext & { walletClient: WalletClient };\n } {\n if (!this.context.walletClient) {\n // Get the calling method name from the stack trace for better error messages\n const stack = new Error().stack;\n const callingMethod =\n stack?.split(\"\\n\")[2]?.match(/at \\w+\\.(\\w+)/)?.[1] ?? \"this operation\";\n\n throw new ReadOnlyError(\n callingMethod,\n \"Initialize the SDK with a walletClient to perform this operation\",\n );\n }\n\n if (!this.context.walletClient.account) {\n // Get the calling method name from the stack trace for better error messages\n const stack = new Error().stack;\n const callingMethod =\n stack?.split(\"\\n\")[2]?.match(/at \\w+\\.(\\w+)/)?.[1] ?? \"this operation\";\n\n throw new Error(\n `No wallet account connected. Cannot perform ${callingMethod} without an account.`,\n );\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBA,oBAA8B;AA4BvB,MAAe,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnC,YAA+B,SAA4B;AAA5B;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BlD,eAER;AACA,QAAI,CAAC,KAAK,QAAQ,cAAc;AAE9B,YAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,YAAM,gBACJ,OAAO,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK;AAExD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ,aAAa,SAAS;AAEtC,YAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,YAAM,gBACJ,OAAO,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK;AAExD,YAAM,IAAI;AAAA,QACR,+CAA+C,aAAa;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/controllers/base.ts"],"sourcesContent":["/**\n * Base controller class providing common functionality for all controllers.\n *\n * @remarks\n * This abstract class establishes the foundation for all Vana SDK controllers,\n * providing shared utilities like wallet validation and context management.\n * All controllers should extend this base class to ensure consistency and\n * shared behavior across the SDK.\n *\n * The class follows the Single Responsibility Principle by handling only\n * the core controller concerns while leaving specific functionality to\n * implementing classes.\n *\n * @category Controllers\n */\n\nimport type { WalletClient } from \"viem\";\nimport type { ControllerContext } from \"../types/controller-context\";\nimport type { TransactionOptions } from \"../types/operations\";\nimport { ReadOnlyError } from \"../errors\";\n\n/**\n * Abstract base controller that all Vana SDK controllers extend.\n *\n * @remarks\n * Provides common functionality and patterns used across all controllers,\n * including wallet validation and context management. This ensures\n * consistency and reduces code duplication throughout the SDK.\n *\n * Key features:\n * - Wallet client validation with TypeScript assertion signatures\n * - Consistent error handling for read-only scenarios\n * - Shared context management patterns\n * - Type-safe wallet operations\n *\n * @example\n * ```typescript\n * class MyController extends BaseController {\n * async performWalletOperation() {\n * this.assertWallet(); // Ensures wallet is available\n * // Now this.context.walletClient is guaranteed to be available\n * const address = await this.context.walletClient.getAddresses();\n * return address[0];\n * }\n * }\n * ```\n */\nexport abstract class BaseController {\n /**\n * Creates a new controller instance with the provided context.\n *\n * @param context - The controller context containing clients and configuration\n */\n constructor(protected readonly context: ControllerContext) {}\n\n /**\n * Asserts that a wallet client with an account is available for operations requiring signing.\n *\n * @remarks\n * This method uses TypeScript assertion signatures to narrow the type of\n * `this.context` to guarantee that `walletClient` with an account is available\n * after the call succeeds. This provides compile-time safety for wallet operations\n * while enabling clear error messages for read-only scenarios.\n *\n * The assertion signature ensures that after calling this method,\n * TypeScript knows that `this.context.walletClient` is definitely available\n * with a configured account.\n *\n * @throws {ReadOnlyError} When no wallet client is configured\n * @throws {Error} When wallet client exists but no account is configured\n *\n * @example\n * ```typescript\n * async performWalletOperation() {\n * this.assertWallet(); // Type assertion + runtime check\n *\n * // TypeScript now knows walletClient and account are available\n * const account = this.context.walletClient.account;\n * const address = typeof account === 'string' ? account : account.address;\n * }\n * ```\n */\n protected assertWallet(): asserts this is {\n context: ControllerContext & { walletClient: WalletClient };\n } {\n if (!this.context.walletClient) {\n // Get the calling method name from the stack trace for better error messages\n const stack = new Error().stack;\n const callingMethod =\n stack?.split(\"\\n\")[2]?.match(/at \\w+\\.(\\w+)/)?.[1] ?? \"this operation\";\n\n throw new ReadOnlyError(\n callingMethod,\n \"Initialize the SDK with a walletClient to perform this operation\",\n );\n }\n\n if (!this.context.walletClient.account) {\n // Get the calling method name from the stack trace for better error messages\n const stack = new Error().stack;\n const callingMethod =\n stack?.split(\"\\n\")[2]?.match(/at \\w+\\.(\\w+)/)?.[1] ?? \"this operation\";\n\n throw new Error(\n `No wallet account connected. Cannot perform ${callingMethod} without an account.`,\n );\n }\n }\n\n /**\n * Helper to safely spread transaction options for viem compatibility.\n * Handles EIP-1559 vs legacy gas pricing correctly.\n *\n * @param options - Transaction options to spread\n * @returns Properly formatted options for viem\n * @internal\n */\n protected spreadTransactionOptions(options?: TransactionOptions) {\n if (!options) return {};\n\n const baseOptions: any = {\n ...(options.nonce !== undefined && { nonce: options.nonce }),\n ...(options.gas !== undefined && { gas: options.gas }),\n };\n\n // EIP-1559 and legacy gasPrice are mutually exclusive in viem\n // If EIP-1559 params are provided, use them and exclude gasPrice\n if (\n options.maxFeePerGas !== undefined ||\n options.maxPriorityFeePerGas !== undefined\n ) {\n return {\n ...baseOptions,\n ...(options.maxFeePerGas !== undefined && {\n maxFeePerGas: options.maxFeePerGas,\n }),\n ...(options.maxPriorityFeePerGas !== undefined && {\n maxPriorityFeePerGas: options.maxPriorityFeePerGas,\n }),\n };\n }\n\n // Otherwise, use legacy gasPrice if provided\n if (options.gasPrice !== undefined) {\n return {\n ...baseOptions,\n gasPrice: options.gasPrice,\n };\n }\n\n return baseOptions;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,oBAA8B;AA4BvB,MAAe,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnC,YAA+B,SAA4B;AAA5B;AAAA,EAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BlD,eAER;AACA,QAAI,CAAC,KAAK,QAAQ,cAAc;AAE9B,YAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,YAAM,gBACJ,OAAO,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK;AAExD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,QAAQ,aAAa,SAAS;AAEtC,YAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,YAAM,gBACJ,OAAO,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,eAAe,IAAI,CAAC,KAAK;AAExD,YAAM,IAAI;AAAA,QACR,+CAA+C,aAAa;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,yBAAyB,SAA8B;AAC/D,QAAI,CAAC,QAAS,QAAO,CAAC;AAEtB,UAAM,cAAmB;AAAA,MACvB,GAAI,QAAQ,UAAU,UAAa,EAAE,OAAO,QAAQ,MAAM;AAAA,MAC1D,GAAI,QAAQ,QAAQ,UAAa,EAAE,KAAK,QAAQ,IAAI;AAAA,IACtD;AAIA,QACE,QAAQ,iBAAiB,UACzB,QAAQ,yBAAyB,QACjC;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,QAAQ,iBAAiB,UAAa;AAAA,UACxC,cAAc,QAAQ;AAAA,QACxB;AAAA,QACA,GAAI,QAAQ,yBAAyB,UAAa;AAAA,UAChD,sBAAsB,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,aAAa,QAAW;AAClC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import type { WalletClient } from "viem";
17
17
  import type { ControllerContext } from "../types/controller-context";
18
+ import type { TransactionOptions } from "../types/operations";
18
19
  /**
19
20
  * Abstract base controller that all Vana SDK controllers extend.
20
21
  *
@@ -81,4 +82,13 @@ export declare abstract class BaseController {
81
82
  walletClient: WalletClient;
82
83
  };
83
84
  };
85
+ /**
86
+ * Helper to safely spread transaction options for viem compatibility.
87
+ * Handles EIP-1559 vs legacy gas pricing correctly.
88
+ *
89
+ * @param options - Transaction options to spread
90
+ * @returns Properly formatted options for viem
91
+ * @internal
92
+ */
93
+ protected spreadTransactionOptions(options?: TransactionOptions): any;
84
94
  }
@@ -52,6 +52,39 @@ class BaseController {
52
52
  );
53
53
  }
54
54
  }
55
+ /**
56
+ * Helper to safely spread transaction options for viem compatibility.
57
+ * Handles EIP-1559 vs legacy gas pricing correctly.
58
+ *
59
+ * @param options - Transaction options to spread
60
+ * @returns Properly formatted options for viem
61
+ * @internal
62
+ */
63
+ spreadTransactionOptions(options) {
64
+ if (!options) return {};
65
+ const baseOptions = {
66
+ ...options.nonce !== void 0 && { nonce: options.nonce },
67
+ ...options.gas !== void 0 && { gas: options.gas }
68
+ };
69
+ if (options.maxFeePerGas !== void 0 || options.maxPriorityFeePerGas !== void 0) {
70
+ return {
71
+ ...baseOptions,
72
+ ...options.maxFeePerGas !== void 0 && {
73
+ maxFeePerGas: options.maxFeePerGas
74
+ },
75
+ ...options.maxPriorityFeePerGas !== void 0 && {
76
+ maxPriorityFeePerGas: options.maxPriorityFeePerGas
77
+ }
78
+ };
79
+ }
80
+ if (options.gasPrice !== void 0) {
81
+ return {
82
+ ...baseOptions,
83
+ gasPrice: options.gasPrice
84
+ };
85
+ }
86
+ return baseOptions;
87
+ }
55
88
  }
56
89
  export {
57
90
  BaseController