@opendatalabs/vana-sdk 0.1.0-alpha.f2de4f7 → 0.1.0-alpha.f35bb9c

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 (165) 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/data.cjs +173 -141
  14. package/dist/controllers/data.cjs.map +1 -1
  15. package/dist/controllers/data.d.ts +213 -175
  16. package/dist/controllers/data.js +173 -141
  17. package/dist/controllers/data.js.map +1 -1
  18. package/dist/controllers/permissions.cjs +185 -191
  19. package/dist/controllers/permissions.cjs.map +1 -1
  20. package/dist/controllers/permissions.d.ts +29 -73
  21. package/dist/controllers/permissions.js +185 -191
  22. package/dist/controllers/permissions.js.map +1 -1
  23. package/dist/controllers/protocol.cjs.map +1 -1
  24. package/dist/controllers/protocol.d.ts +27 -28
  25. package/dist/controllers/protocol.js.map +1 -1
  26. package/dist/controllers/schemas.cjs +23 -21
  27. package/dist/controllers/schemas.cjs.map +1 -1
  28. package/dist/controllers/schemas.d.ts +47 -40
  29. package/dist/controllers/schemas.js +23 -21
  30. package/dist/controllers/schemas.js.map +1 -1
  31. package/dist/controllers/server.cjs +17 -15
  32. package/dist/controllers/server.cjs.map +1 -1
  33. package/dist/controllers/server.d.ts +46 -38
  34. package/dist/controllers/server.js +17 -15
  35. package/dist/controllers/server.js.map +1 -1
  36. package/dist/core/apiClient.cjs +53 -3
  37. package/dist/core/apiClient.cjs.map +1 -1
  38. package/dist/core/apiClient.d.ts +132 -7
  39. package/dist/core/apiClient.js +53 -3
  40. package/dist/core/apiClient.js.map +1 -1
  41. package/dist/core/generics.cjs +30 -3
  42. package/dist/core/generics.cjs.map +1 -1
  43. package/dist/core/generics.d.ts +95 -6
  44. package/dist/core/generics.js +30 -3
  45. package/dist/core/generics.js.map +1 -1
  46. package/dist/core.cjs +29 -12
  47. package/dist/core.cjs.map +1 -1
  48. package/dist/core.d.ts +2 -1
  49. package/dist/core.js +29 -12
  50. package/dist/core.js.map +1 -1
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/index.node.cjs +3 -3
  54. package/dist/index.node.cjs.map +1 -1
  55. package/dist/index.node.d.ts +8 -9
  56. package/dist/index.node.js +2 -2
  57. package/dist/index.node.js.map +1 -1
  58. package/dist/node.cjs.map +1 -1
  59. package/dist/node.d.ts +39 -1
  60. package/dist/node.js.map +1 -1
  61. package/dist/platform/browser.cjs +160 -2
  62. package/dist/platform/browser.cjs.map +1 -1
  63. package/dist/platform/browser.d.ts +232 -12
  64. package/dist/platform/browser.js +160 -2
  65. package/dist/platform/browser.js.map +1 -1
  66. package/dist/platform/interface.cjs.map +1 -1
  67. package/dist/platform/interface.d.ts +283 -90
  68. package/dist/platform/node.cjs +163 -2
  69. package/dist/platform/node.cjs.map +1 -1
  70. package/dist/platform/node.d.ts +69 -6
  71. package/dist/platform/node.js +163 -2
  72. package/dist/platform/node.js.map +1 -1
  73. package/dist/server/relayerHandler.cjs +214 -0
  74. package/dist/server/relayerHandler.cjs.map +1 -0
  75. package/dist/server/relayerHandler.d.ts +36 -0
  76. package/dist/server/relayerHandler.js +190 -0
  77. package/dist/server/relayerHandler.js.map +1 -0
  78. package/dist/storage/manager.cjs +108 -25
  79. package/dist/storage/manager.cjs.map +1 -1
  80. package/dist/storage/manager.d.ts +119 -25
  81. package/dist/storage/manager.js +108 -25
  82. package/dist/storage/manager.js.map +1 -1
  83. package/dist/storage/providers/callback-storage.cjs +86 -15
  84. package/dist/storage/providers/callback-storage.cjs.map +1 -1
  85. package/dist/storage/providers/callback-storage.d.ts +109 -20
  86. package/dist/storage/providers/callback-storage.js +86 -15
  87. package/dist/storage/providers/callback-storage.js.map +1 -1
  88. package/dist/storage/providers/pinata.cjs.map +1 -1
  89. package/dist/storage/providers/pinata.d.ts +12 -14
  90. package/dist/storage/providers/pinata.js.map +1 -1
  91. package/dist/tests/factories/mockFactory.d.ts +2 -2
  92. package/dist/tests/relayer-integration.test.d.ts +1 -0
  93. package/dist/tests/relayer-unified.test.d.ts +1 -0
  94. package/dist/tests/server-relayer-handler.test.d.ts +1 -0
  95. package/dist/types/blockchain.cjs.map +1 -1
  96. package/dist/types/blockchain.d.ts +39 -11
  97. package/dist/types/chains.cjs.map +1 -1
  98. package/dist/types/chains.d.ts +74 -7
  99. package/dist/types/chains.js.map +1 -1
  100. package/dist/types/config.cjs.map +1 -1
  101. package/dist/types/config.d.ts +46 -191
  102. package/dist/types/config.js.map +1 -1
  103. package/dist/types/contracts.cjs.map +1 -1
  104. package/dist/types/contracts.d.ts +71 -7
  105. package/dist/types/controller-context.cjs.map +1 -1
  106. package/dist/types/controller-context.d.ts +3 -2
  107. package/dist/types/data.cjs.map +1 -1
  108. package/dist/types/data.d.ts +4 -6
  109. package/dist/types/generics.cjs.map +1 -1
  110. package/dist/types/generics.d.ts +80 -9
  111. package/dist/types/index.cjs.map +1 -1
  112. package/dist/types/index.d.ts +27 -2
  113. package/dist/types/index.js.map +1 -1
  114. package/dist/types/operations.cjs.map +1 -1
  115. package/dist/types/operations.d.ts +132 -15
  116. package/dist/types/operations.js.map +1 -1
  117. package/dist/types/permissions.cjs.map +1 -1
  118. package/dist/types/permissions.d.ts +15 -20
  119. package/dist/types/personal.cjs.map +1 -1
  120. package/dist/types/personal.d.ts +131 -14
  121. package/dist/types/relayer.cjs.map +1 -1
  122. package/dist/types/relayer.d.ts +262 -35
  123. package/dist/types/storage.cjs.map +1 -1
  124. package/dist/types/storage.d.ts +9 -21
  125. package/dist/types/storage.js.map +1 -1
  126. package/dist/utils/grantFiles.cjs.map +1 -1
  127. package/dist/utils/grantFiles.d.ts +10 -20
  128. package/dist/utils/grantFiles.js.map +1 -1
  129. package/dist/utils/grantValidation.cjs.map +1 -1
  130. package/dist/utils/grantValidation.d.ts +95 -16
  131. package/dist/utils/grantValidation.js.map +1 -1
  132. package/dist/utils/grants.cjs.map +1 -1
  133. package/dist/utils/grants.d.ts +93 -12
  134. package/dist/utils/grants.js.map +1 -1
  135. package/dist/utils/lazy-import.cjs.map +1 -1
  136. package/dist/utils/lazy-import.d.ts +32 -7
  137. package/dist/utils/lazy-import.js.map +1 -1
  138. package/dist/utils/signatureCache.cjs +8 -2
  139. package/dist/utils/signatureCache.cjs.map +1 -1
  140. package/dist/utils/signatureCache.d.ts +49 -8
  141. package/dist/utils/signatureCache.js +8 -2
  142. package/dist/utils/signatureCache.js.map +1 -1
  143. package/dist/utils/transactionHelpers.cjs.map +1 -1
  144. package/dist/utils/transactionHelpers.d.ts +12 -12
  145. package/dist/utils/transactionHelpers.js.map +1 -1
  146. package/dist/utils/typedDataConverter.cjs.map +1 -1
  147. package/dist/utils/typedDataConverter.d.ts +39 -3
  148. package/dist/utils/typedDataConverter.js.map +1 -1
  149. package/dist/utils/urlResolver.cjs +7 -0
  150. package/dist/utils/urlResolver.cjs.map +1 -1
  151. package/dist/utils/urlResolver.d.ts +22 -4
  152. package/dist/utils/urlResolver.js +7 -0
  153. package/dist/utils/urlResolver.js.map +1 -1
  154. package/dist/utils/wallet.cjs +2 -1
  155. package/dist/utils/wallet.cjs.map +1 -1
  156. package/dist/utils/wallet.d.ts +78 -16
  157. package/dist/utils/wallet.js +2 -1
  158. package/dist/utils/wallet.js.map +1 -1
  159. package/package.json +1 -1
  160. package/dist/server/handler.cjs +0 -101
  161. package/dist/server/handler.cjs.map +0 -1
  162. package/dist/server/handler.d.ts +0 -87
  163. package/dist/server/handler.js +0 -77
  164. package/dist/server/handler.js.map +0 -1
  165. /package/dist/tests/{server-handler.test.d.ts → permissions-revoke-relayer.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/wallet.ts"],"sourcesContent":["import type { Account, Address } from \"viem\";\n\n/**\n * Extracts an Ethereum address from various account formats.\n *\n * Viem's Account type can be:\n * - A string address directly\n * - An object with an address property\n * - A LocalAccount with address property\n *\n * This utility provides a single source of truth for address extraction,\n * eliminating duplicate logic throughout the codebase.\n *\n * @param account - The account to extract address from\n * @returns The extracted Ethereum address\n * @throws Error if account is undefined or address cannot be determined\n */\nexport function extractAddress(\n account: Account | Address | undefined | null,\n): Address {\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n // Handle string address directly\n if (typeof account === \"string\") {\n return account as Address;\n }\n\n // Handle object with address property\n if (typeof account === \"object\" && \"address\" in account && account.address) {\n return account.address;\n }\n\n throw new Error(\"Unable to determine wallet address from account\");\n}\n\n/**\n * Safely extracts an address, returning undefined instead of throwing.\n * Useful for optional address resolution.\n *\n * @param account - The account to extract address from\n * @returns The extracted address or undefined\n */\nexport function extractAddressSafe(\n account: Account | Address | undefined | null,\n): Address | undefined {\n try {\n return extractAddress(account);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Type guard to check if an account has a valid address.\n *\n * @param account - The account to check\n * @returns True if account has a valid address\n */\nexport function hasAddress(account: unknown): account is Account | Address {\n if (!account) return false;\n\n if (typeof account === \"string\") {\n // Basic check for Ethereum address format\n return /^0x[a-fA-F0-9]{40}$/.test(account);\n }\n\n if (typeof account === \"object\" && \"address\" in account) {\n const addr = (account as any).address;\n return typeof addr === \"string\" && /^0x[a-fA-F0-9]{40}$/.test(addr);\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBO,SAAS,eACd,SACS;AACT,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAGA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,YAAY,aAAa,WAAW,QAAQ,SAAS;AAC1E,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,IAAI,MAAM,iDAAiD;AACnE;AASO,SAAS,mBACd,SACqB;AACrB,MAAI;AACF,WAAO,eAAe,OAAO;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,WAAW,SAAgD;AACzE,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAEA,MAAI,OAAO,YAAY,YAAY,aAAa,SAAS;AACvD,UAAM,OAAQ,QAAgB;AAC9B,WAAO,OAAO,SAAS,YAAY,sBAAsB,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/wallet.ts"],"sourcesContent":["import type { Account, Address } from \"viem\";\n\n/**\n * Extracts an Ethereum address from various account formats.\n *\n * @remarks\n * Handles viem's polymorphic Account type which can be a string address,\n * an object with an address property, or a LocalAccount. This utility\n * provides consistent address extraction across the SDK, eliminating\n * duplicate logic and potential inconsistencies.\n *\n * @param account - The account to extract address from.\n * Can be a hex string address, Account object, or LocalAccount.\n * @returns The extracted Ethereum address as a `0x`-prefixed string\n *\n * @throws {Error} When account is undefined or null.\n * Provide a valid account from wallet connection.\n * @throws {Error} When address cannot be determined from account structure.\n * Ensure account has a valid address property.\n *\n * @example\n * ```typescript\n * // String address\n * const addr1 = extractAddress('0x742d35Cc6634C0532925a3b844Bc9e7595f0b0Bb');\n *\n * // Account object\n * const addr2 = extractAddress({ address: '0x742d...' });\n *\n * // LocalAccount from viem\n * const account = privateKeyToAccount('0x...');\n * const addr3 = extractAddress(account);\n * ```\n *\n * @category Utilities\n */\nexport function extractAddress(\n account: Account | Address | undefined | null,\n): Address {\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n // Handle string address directly\n if (typeof account === \"string\") {\n return account as Address;\n }\n\n // Handle object with address property\n if (typeof account === \"object\" && \"address\" in account && account.address) {\n return account.address;\n }\n\n throw new Error(\"Unable to determine wallet address from account\");\n}\n\n/**\n * Safely extracts an address without throwing errors.\n *\n * @remarks\n * Non-throwing version of `extractAddress` for optional address resolution.\n * Use when address extraction failure is acceptable and should be handled\n * gracefully without exception handling.\n *\n * @param account - The account to extract address from.\n * Can be a hex string address, Account object, LocalAccount, or nullish.\n * @returns The extracted Ethereum address or `undefined` if extraction fails\n *\n * @example\n * ```typescript\n * const address = extractAddressSafe(potentialAccount);\n *\n * if (address) {\n * console.log(`Using address: ${address}`);\n * } else {\n * console.log('No valid address available');\n * }\n *\n * // Useful in optional chaining\n * const userAddress = extractAddressSafe(user?.wallet) ?? DEFAULT_ADDRESS;\n * ```\n *\n * @category Utilities\n */\nexport function extractAddressSafe(\n account: Account | Address | undefined | null,\n): Address | undefined {\n try {\n return extractAddress(account);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Validates whether a value contains a valid Ethereum address.\n *\n * @remarks\n * Type guard that performs runtime validation of Ethereum address format.\n * Checks for proper `0x` prefix and 40 hexadecimal characters. Works with\n * string addresses, Account objects, and LocalAccount instances.\n *\n * @param account - The value to validate for address presence\n * @returns `true` if account contains a valid Ethereum address, `false` otherwise\n *\n * @example\n * ```typescript\n * const maybeAccount: unknown = getUserInput();\n *\n * if (hasAddress(maybeAccount)) {\n * // TypeScript knows maybeAccount is Account | Address\n * const address = extractAddress(maybeAccount);\n * await vana.data.getUserFiles({ owner: address });\n * } else {\n * console.error('Invalid address format');\n * }\n *\n * // Filter valid addresses from mixed array\n * const addresses = mixedArray.filter(hasAddress).map(extractAddress);\n * ```\n *\n * @category Utilities\n */\nexport function hasAddress(account: unknown): account is Account | Address {\n if (!account) return false;\n\n if (typeof account === \"string\") {\n // Basic check for Ethereum address format\n return /^0x[a-fA-F0-9]{40}$/.test(account);\n }\n\n if (typeof account === \"object\" && \"address\" in account) {\n const accountWithAddress = account as { address: unknown };\n const addr = accountWithAddress.address;\n return typeof addr === \"string\" && /^0x[a-fA-F0-9]{40}$/.test(addr);\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmCO,SAAS,eACd,SACS;AACT,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAGA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,YAAY,aAAa,WAAW,QAAQ,SAAS;AAC1E,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,IAAI,MAAM,iDAAiD;AACnE;AA8BO,SAAS,mBACd,SACqB;AACrB,MAAI;AACF,WAAO,eAAe,OAAO;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA+BO,SAAS,WAAW,SAAgD;AACzE,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAEA,MAAI,OAAO,YAAY,YAAY,aAAa,SAAS;AACvD,UAAM,qBAAqB;AAC3B,UAAM,OAAO,mBAAmB;AAChC,WAAO,OAAO,SAAS,YAAY,sBAAsB,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO;AACT;","names":[]}
@@ -2,31 +2,93 @@ import type { Account, Address } from "viem";
2
2
  /**
3
3
  * Extracts an Ethereum address from various account formats.
4
4
  *
5
- * Viem's Account type can be:
6
- * - A string address directly
7
- * - An object with an address property
8
- * - A LocalAccount with address property
5
+ * @remarks
6
+ * Handles viem's polymorphic Account type which can be a string address,
7
+ * an object with an address property, or a LocalAccount. This utility
8
+ * provides consistent address extraction across the SDK, eliminating
9
+ * duplicate logic and potential inconsistencies.
9
10
  *
10
- * This utility provides a single source of truth for address extraction,
11
- * eliminating duplicate logic throughout the codebase.
11
+ * @param account - The account to extract address from.
12
+ * Can be a hex string address, Account object, or LocalAccount.
13
+ * @returns The extracted Ethereum address as a `0x`-prefixed string
12
14
  *
13
- * @param account - The account to extract address from
14
- * @returns The extracted Ethereum address
15
- * @throws Error if account is undefined or address cannot be determined
15
+ * @throws {Error} When account is undefined or null.
16
+ * Provide a valid account from wallet connection.
17
+ * @throws {Error} When address cannot be determined from account structure.
18
+ * Ensure account has a valid address property.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // String address
23
+ * const addr1 = extractAddress('0x742d35Cc6634C0532925a3b844Bc9e7595f0b0Bb');
24
+ *
25
+ * // Account object
26
+ * const addr2 = extractAddress({ address: '0x742d...' });
27
+ *
28
+ * // LocalAccount from viem
29
+ * const account = privateKeyToAccount('0x...');
30
+ * const addr3 = extractAddress(account);
31
+ * ```
32
+ *
33
+ * @category Utilities
16
34
  */
17
35
  export declare function extractAddress(account: Account | Address | undefined | null): Address;
18
36
  /**
19
- * Safely extracts an address, returning undefined instead of throwing.
20
- * Useful for optional address resolution.
37
+ * Safely extracts an address without throwing errors.
38
+ *
39
+ * @remarks
40
+ * Non-throwing version of `extractAddress` for optional address resolution.
41
+ * Use when address extraction failure is acceptable and should be handled
42
+ * gracefully without exception handling.
43
+ *
44
+ * @param account - The account to extract address from.
45
+ * Can be a hex string address, Account object, LocalAccount, or nullish.
46
+ * @returns The extracted Ethereum address or `undefined` if extraction fails
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const address = extractAddressSafe(potentialAccount);
21
51
  *
22
- * @param account - The account to extract address from
23
- * @returns The extracted address or undefined
52
+ * if (address) {
53
+ * console.log(`Using address: ${address}`);
54
+ * } else {
55
+ * console.log('No valid address available');
56
+ * }
57
+ *
58
+ * // Useful in optional chaining
59
+ * const userAddress = extractAddressSafe(user?.wallet) ?? DEFAULT_ADDRESS;
60
+ * ```
61
+ *
62
+ * @category Utilities
24
63
  */
25
64
  export declare function extractAddressSafe(account: Account | Address | undefined | null): Address | undefined;
26
65
  /**
27
- * Type guard to check if an account has a valid address.
66
+ * Validates whether a value contains a valid Ethereum address.
67
+ *
68
+ * @remarks
69
+ * Type guard that performs runtime validation of Ethereum address format.
70
+ * Checks for proper `0x` prefix and 40 hexadecimal characters. Works with
71
+ * string addresses, Account objects, and LocalAccount instances.
72
+ *
73
+ * @param account - The value to validate for address presence
74
+ * @returns `true` if account contains a valid Ethereum address, `false` otherwise
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const maybeAccount: unknown = getUserInput();
79
+ *
80
+ * if (hasAddress(maybeAccount)) {
81
+ * // TypeScript knows maybeAccount is Account | Address
82
+ * const address = extractAddress(maybeAccount);
83
+ * await vana.data.getUserFiles({ owner: address });
84
+ * } else {
85
+ * console.error('Invalid address format');
86
+ * }
87
+ *
88
+ * // Filter valid addresses from mixed array
89
+ * const addresses = mixedArray.filter(hasAddress).map(extractAddress);
90
+ * ```
28
91
  *
29
- * @param account - The account to check
30
- * @returns True if account has a valid address
92
+ * @category Utilities
31
93
  */
32
94
  export declare function hasAddress(account: unknown): account is Account | Address;
@@ -23,7 +23,8 @@ function hasAddress(account) {
23
23
  return /^0x[a-fA-F0-9]{40}$/.test(account);
24
24
  }
25
25
  if (typeof account === "object" && "address" in account) {
26
- const addr = account.address;
26
+ const accountWithAddress = account;
27
+ const addr = accountWithAddress.address;
27
28
  return typeof addr === "string" && /^0x[a-fA-F0-9]{40}$/.test(addr);
28
29
  }
29
30
  return false;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/wallet.ts"],"sourcesContent":["import type { Account, Address } from \"viem\";\n\n/**\n * Extracts an Ethereum address from various account formats.\n *\n * Viem's Account type can be:\n * - A string address directly\n * - An object with an address property\n * - A LocalAccount with address property\n *\n * This utility provides a single source of truth for address extraction,\n * eliminating duplicate logic throughout the codebase.\n *\n * @param account - The account to extract address from\n * @returns The extracted Ethereum address\n * @throws Error if account is undefined or address cannot be determined\n */\nexport function extractAddress(\n account: Account | Address | undefined | null,\n): Address {\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n // Handle string address directly\n if (typeof account === \"string\") {\n return account as Address;\n }\n\n // Handle object with address property\n if (typeof account === \"object\" && \"address\" in account && account.address) {\n return account.address;\n }\n\n throw new Error(\"Unable to determine wallet address from account\");\n}\n\n/**\n * Safely extracts an address, returning undefined instead of throwing.\n * Useful for optional address resolution.\n *\n * @param account - The account to extract address from\n * @returns The extracted address or undefined\n */\nexport function extractAddressSafe(\n account: Account | Address | undefined | null,\n): Address | undefined {\n try {\n return extractAddress(account);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Type guard to check if an account has a valid address.\n *\n * @param account - The account to check\n * @returns True if account has a valid address\n */\nexport function hasAddress(account: unknown): account is Account | Address {\n if (!account) return false;\n\n if (typeof account === \"string\") {\n // Basic check for Ethereum address format\n return /^0x[a-fA-F0-9]{40}$/.test(account);\n }\n\n if (typeof account === \"object\" && \"address\" in account) {\n const addr = (account as any).address;\n return typeof addr === \"string\" && /^0x[a-fA-F0-9]{40}$/.test(addr);\n }\n\n return false;\n}\n"],"mappings":"AAiBO,SAAS,eACd,SACS;AACT,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAGA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,YAAY,aAAa,WAAW,QAAQ,SAAS;AAC1E,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,IAAI,MAAM,iDAAiD;AACnE;AASO,SAAS,mBACd,SACqB;AACrB,MAAI;AACF,WAAO,eAAe,OAAO;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQO,SAAS,WAAW,SAAgD;AACzE,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAEA,MAAI,OAAO,YAAY,YAAY,aAAa,SAAS;AACvD,UAAM,OAAQ,QAAgB;AAC9B,WAAO,OAAO,SAAS,YAAY,sBAAsB,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/utils/wallet.ts"],"sourcesContent":["import type { Account, Address } from \"viem\";\n\n/**\n * Extracts an Ethereum address from various account formats.\n *\n * @remarks\n * Handles viem's polymorphic Account type which can be a string address,\n * an object with an address property, or a LocalAccount. This utility\n * provides consistent address extraction across the SDK, eliminating\n * duplicate logic and potential inconsistencies.\n *\n * @param account - The account to extract address from.\n * Can be a hex string address, Account object, or LocalAccount.\n * @returns The extracted Ethereum address as a `0x`-prefixed string\n *\n * @throws {Error} When account is undefined or null.\n * Provide a valid account from wallet connection.\n * @throws {Error} When address cannot be determined from account structure.\n * Ensure account has a valid address property.\n *\n * @example\n * ```typescript\n * // String address\n * const addr1 = extractAddress('0x742d35Cc6634C0532925a3b844Bc9e7595f0b0Bb');\n *\n * // Account object\n * const addr2 = extractAddress({ address: '0x742d...' });\n *\n * // LocalAccount from viem\n * const account = privateKeyToAccount('0x...');\n * const addr3 = extractAddress(account);\n * ```\n *\n * @category Utilities\n */\nexport function extractAddress(\n account: Account | Address | undefined | null,\n): Address {\n if (!account) {\n throw new Error(\"No account provided\");\n }\n\n // Handle string address directly\n if (typeof account === \"string\") {\n return account as Address;\n }\n\n // Handle object with address property\n if (typeof account === \"object\" && \"address\" in account && account.address) {\n return account.address;\n }\n\n throw new Error(\"Unable to determine wallet address from account\");\n}\n\n/**\n * Safely extracts an address without throwing errors.\n *\n * @remarks\n * Non-throwing version of `extractAddress` for optional address resolution.\n * Use when address extraction failure is acceptable and should be handled\n * gracefully without exception handling.\n *\n * @param account - The account to extract address from.\n * Can be a hex string address, Account object, LocalAccount, or nullish.\n * @returns The extracted Ethereum address or `undefined` if extraction fails\n *\n * @example\n * ```typescript\n * const address = extractAddressSafe(potentialAccount);\n *\n * if (address) {\n * console.log(`Using address: ${address}`);\n * } else {\n * console.log('No valid address available');\n * }\n *\n * // Useful in optional chaining\n * const userAddress = extractAddressSafe(user?.wallet) ?? DEFAULT_ADDRESS;\n * ```\n *\n * @category Utilities\n */\nexport function extractAddressSafe(\n account: Account | Address | undefined | null,\n): Address | undefined {\n try {\n return extractAddress(account);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Validates whether a value contains a valid Ethereum address.\n *\n * @remarks\n * Type guard that performs runtime validation of Ethereum address format.\n * Checks for proper `0x` prefix and 40 hexadecimal characters. Works with\n * string addresses, Account objects, and LocalAccount instances.\n *\n * @param account - The value to validate for address presence\n * @returns `true` if account contains a valid Ethereum address, `false` otherwise\n *\n * @example\n * ```typescript\n * const maybeAccount: unknown = getUserInput();\n *\n * if (hasAddress(maybeAccount)) {\n * // TypeScript knows maybeAccount is Account | Address\n * const address = extractAddress(maybeAccount);\n * await vana.data.getUserFiles({ owner: address });\n * } else {\n * console.error('Invalid address format');\n * }\n *\n * // Filter valid addresses from mixed array\n * const addresses = mixedArray.filter(hasAddress).map(extractAddress);\n * ```\n *\n * @category Utilities\n */\nexport function hasAddress(account: unknown): account is Account | Address {\n if (!account) return false;\n\n if (typeof account === \"string\") {\n // Basic check for Ethereum address format\n return /^0x[a-fA-F0-9]{40}$/.test(account);\n }\n\n if (typeof account === \"object\" && \"address\" in account) {\n const accountWithAddress = account as { address: unknown };\n const addr = accountWithAddress.address;\n return typeof addr === \"string\" && /^0x[a-fA-F0-9]{40}$/.test(addr);\n }\n\n return false;\n}\n"],"mappings":"AAmCO,SAAS,eACd,SACS;AACT,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAGA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,YAAY,aAAa,WAAW,QAAQ,SAAS;AAC1E,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,IAAI,MAAM,iDAAiD;AACnE;AA8BO,SAAS,mBACd,SACqB;AACrB,MAAI;AACF,WAAO,eAAe,OAAO;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA+BO,SAAS,WAAW,SAAgD;AACzE,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,OAAO,YAAY,UAAU;AAE/B,WAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAEA,MAAI,OAAO,YAAY,YAAY,aAAa,SAAS;AACvD,UAAM,qBAAqB;AAC3B,UAAM,OAAO,mBAAmB;AAChC,WAAO,OAAO,SAAS,YAAY,sBAAsB,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO;AACT;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendatalabs/vana-sdk",
3
- "version": "0.1.0-alpha.f2de4f7",
3
+ "version": "0.1.0-alpha.f35bb9c",
4
4
  "description": "A TypeScript library for interacting with Vana Network smart contracts.",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1,101 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var handler_exports = {};
20
- __export(handler_exports, {
21
- handleRelayerRequest: () => handleRelayerRequest
22
- });
23
- module.exports = __toCommonJS(handler_exports);
24
- var import_viem = require("viem");
25
- var import_errors = require("../errors");
26
- async function handleRelayerRequest(sdk, payload) {
27
- const { typedData, signature, expectedUserAddress } = payload;
28
- console.debug({
29
- domain: typedData.domain,
30
- types: typedData.types,
31
- primaryType: typedData.primaryType,
32
- message: typedData.message,
33
- signature
34
- });
35
- const signerAddress = await (0, import_viem.recoverTypedDataAddress)({
36
- domain: typedData.domain,
37
- types: typedData.types,
38
- primaryType: typedData.primaryType,
39
- message: typedData.message,
40
- signature
41
- });
42
- if (!signerAddress) {
43
- throw new import_errors.SignatureError(
44
- "Invalid signature - could not recover signer address"
45
- );
46
- }
47
- if (expectedUserAddress) {
48
- const normalizedSigner = (0, import_viem.getAddress)(signerAddress);
49
- const normalizedExpected = (0, import_viem.getAddress)(expectedUserAddress);
50
- if (normalizedSigner !== normalizedExpected) {
51
- throw new import_errors.SignatureError(
52
- `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected}). This may be due to incorrect EIP-712 domain configuration.`
53
- );
54
- }
55
- }
56
- const primaryType = typedData.primaryType;
57
- switch (primaryType) {
58
- case "Permission":
59
- return sdk.permissions.submitSignedGrant(
60
- typedData,
61
- signature
62
- );
63
- case "RevokePermission":
64
- return sdk.permissions.submitSignedRevoke(
65
- typedData,
66
- signature
67
- );
68
- case "TrustServer":
69
- return sdk.permissions.submitSignedTrustServer(
70
- typedData,
71
- signature
72
- );
73
- case "AddServer":
74
- return sdk.permissions.submitSignedAddAndTrustServer(
75
- typedData,
76
- signature
77
- );
78
- case "UntrustServer":
79
- return sdk.permissions.submitSignedUntrustServer(
80
- typedData,
81
- signature
82
- );
83
- case "RegisterGrantee":
84
- return sdk.permissions.submitSignedRegisterGrantee(
85
- typedData,
86
- signature
87
- );
88
- case "ServerFilesAndPermission":
89
- return sdk.permissions.submitSignedAddServerFilesAndPermissions(
90
- typedData,
91
- signature
92
- );
93
- default:
94
- throw new Error(`Unsupported operation type: ${typedData.primaryType}`);
95
- }
96
- }
97
- // Annotate the CommonJS export names for ESM import in node:
98
- 0 && (module.exports = {
99
- handleRelayerRequest
100
- });
101
- //# sourceMappingURL=handler.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/server/handler.ts"],"sourcesContent":["import type { Address, Hash } from \"viem\";\nimport { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { VanaInstance } from \"../index.node\";\nimport type {\n GenericTypedData,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n RegisterGranteeTypedData,\n TrustServerTypedData,\n AddAndTrustServerTypedData,\n ServerFilesAndPermissionTypedData,\n TypedDataPrimaryType,\n} from \"../types\";\nimport { SignatureError } from \"../errors\";\nimport type { TransactionResult } from \"../types/operations\";\nimport type {\n PermissionGrantResult,\n PermissionRevokeResult,\n ServerTrustResult,\n ServerUntrustResult,\n GranteeRegisterResult,\n FileAddedResult,\n} from \"../types/transactionResults\";\n\n/** Union type of all possible transaction results from relayer operations */\ntype RelayerTransactionResult =\n | PermissionGrantResult\n | PermissionRevokeResult\n | ServerTrustResult\n | ServerUntrustResult\n | GranteeRegisterResult\n | FileAddedResult;\n\n/**\n * Payload structure for relayer requests.\n * Contains the EIP-712 typed data, signature, and optional expected user address for security verification.\n *\n * @category Server\n */\nexport interface RelayerRequestPayload {\n /** EIP-712 typed data containing the transaction details */\n typedData: GenericTypedData;\n /** User's signature of the typed data */\n signature: Hash;\n /** Optional expected user address for security verification */\n expectedUserAddress?: Address;\n}\n\n/**\n * Unified server-side handler for processing relayed transactions.\n *\n * This function encapsulates the complete relayer workflow:\n * 1. Verifies the signature against the typed data\n * 2. Optionally checks the signer matches the expected user address\n * 3. Routes to the appropriate SDK method based on primaryType\n * 4. Returns the transaction handle with hash and event parsing capability\n *\n * Supported transaction types:\n * - Permission: Permission grants\n * - PermissionRevoke: Permission revocations\n * - TrustServer: Trust server operations\n * - UntrustServer: Untrust server operations\n * - AddServer: Add and trust server operations\n * - RegisterGrantee: Register grantee operations\n * - ServerFilesAndPermission: Batch operation for server, files, and permissions\n *\n * @param sdk - Initialized Vana SDK instance\n * @param payload - Request payload containing typed data, signature, and optional security check\n * @returns Promise resolving to TransactionResult with hash and optional event data\n * @throws {SignatureError} When signature verification fails or signer mismatch occurs\n * @throws {Error} When primaryType is unsupported or SDK operations fail\n * @category Server\n * @example\n * ```typescript\n * import { handleRelayerRequest } from '@opendatalabs/vana-sdk';\n *\n * // In your relayer API endpoint:\n * export async function POST(request: NextRequest) {\n * try {\n * const body = await request.json();\n * const vana = await createRelayerVana();\n *\n * const tx = await handleRelayerRequest(vana, {\n * typedData: body.typedData,\n * signature: body.signature,\n * expectedUserAddress: body.expectedUserAddress\n * });\n *\n * // Option 1: Return just the hash immediately\n * return NextResponse.json({\n * success: true,\n * transactionHash: tx.hash\n * });\n *\n * // Option 2: Wait for transaction confirmation and return event data\n * const eventData = await tx.waitForEvents();\n * return NextResponse.json({\n * success: true,\n * transactionHash: tx.hash,\n * ...eventData // Include parsed event data like permissionId, fileId, etc.\n * });\n * } catch (error) {\n * return NextResponse.json({\n * success: false,\n * error: error.message\n * }, { status: 500 });\n * }\n * }\n * ```\n */\nexport async function handleRelayerRequest(\n sdk: VanaInstance,\n payload: RelayerRequestPayload,\n): Promise<TransactionResult & { eventData?: RelayerTransactionResult }> {\n const { typedData, signature, expectedUserAddress } = payload;\n\n console.debug({\n domain: typedData.domain,\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n\n // Step 1: Verify signature and recover signer address\n const signerAddress = await recoverTypedDataAddress({\n domain: typedData.domain,\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n\n if (!signerAddress) {\n throw new SignatureError(\n \"Invalid signature - could not recover signer address\",\n );\n }\n\n // Step 2: Security check - verify signer matches expected user address if provided\n if (expectedUserAddress) {\n const normalizedSigner = getAddress(signerAddress);\n const normalizedExpected = getAddress(expectedUserAddress);\n\n if (normalizedSigner !== normalizedExpected) {\n throw new SignatureError(\n `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected}). This may be due to incorrect EIP-712 domain configuration.`,\n );\n }\n }\n\n // Step 3: Route to appropriate SDK method based on primaryType\n // Route to appropriate SDK method and return TransactionResult directly\n const primaryType = typedData.primaryType as TypedDataPrimaryType;\n switch (primaryType) {\n case \"Permission\":\n return sdk.permissions.submitSignedGrant(\n typedData as unknown as PermissionGrantTypedData,\n signature,\n );\n\n case \"RevokePermission\":\n return sdk.permissions.submitSignedRevoke(\n typedData as unknown as RevokePermissionTypedData,\n signature,\n );\n\n case \"TrustServer\":\n return sdk.permissions.submitSignedTrustServer(\n typedData as unknown as TrustServerTypedData,\n signature,\n );\n\n case \"AddServer\":\n return sdk.permissions.submitSignedAddAndTrustServer(\n typedData as unknown as AddAndTrustServerTypedData,\n signature,\n );\n\n case \"UntrustServer\":\n return sdk.permissions.submitSignedUntrustServer(\n typedData as unknown as GenericTypedData,\n signature,\n );\n\n case \"RegisterGrantee\":\n return sdk.permissions.submitSignedRegisterGrantee(\n typedData as unknown as RegisterGranteeTypedData,\n signature,\n );\n\n case \"ServerFilesAndPermission\":\n return sdk.permissions.submitSignedAddServerFilesAndPermissions(\n typedData as unknown as ServerFilesAndPermissionTypedData,\n signature,\n );\n\n default:\n throw new Error(`Unsupported operation type: ${typedData.primaryType}`);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,kBAAoD;AAYpD,oBAA+B;AAiG/B,eAAsB,qBACpB,KACA,SACuE;AACvE,QAAM,EAAE,WAAW,WAAW,oBAAoB,IAAI;AAEtD,UAAQ,MAAM;AAAA,IACZ,QAAQ,UAAU;AAAA,IAClB,OAAO,UAAU;AAAA,IACjB,aAAa,UAAU;AAAA,IACvB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF,CAAC;AAGD,QAAM,gBAAgB,UAAM,qCAAwB;AAAA,IAClD,QAAQ,UAAU;AAAA,IAClB,OAAO,UAAU;AAAA,IACjB,aAAa,UAAU;AAAA,IACvB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,qBAAqB;AACvB,UAAM,uBAAmB,wBAAW,aAAa;AACjD,UAAM,yBAAqB,wBAAW,mBAAmB;AAEzD,QAAI,qBAAqB,oBAAoB;AAC3C,YAAM,IAAI;AAAA,QACR,2DAA2D,gBAAgB,2CAA2C,kBAAkB;AAAA,MAC1I;AAAA,IACF;AAAA,EACF;AAIA,QAAM,cAAc,UAAU;AAC9B,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF;AACE,YAAM,IAAI,MAAM,+BAA+B,UAAU,WAAW,EAAE;AAAA,EAC1E;AACF;","names":[]}
@@ -1,87 +0,0 @@
1
- import type { Address, Hash } from "viem";
2
- import type { VanaInstance } from "../index.node";
3
- import type { GenericTypedData } from "../types";
4
- import type { TransactionResult } from "../types/operations";
5
- import type { PermissionGrantResult, PermissionRevokeResult, ServerTrustResult, ServerUntrustResult, GranteeRegisterResult, FileAddedResult } from "../types/transactionResults";
6
- /** Union type of all possible transaction results from relayer operations */
7
- type RelayerTransactionResult = PermissionGrantResult | PermissionRevokeResult | ServerTrustResult | ServerUntrustResult | GranteeRegisterResult | FileAddedResult;
8
- /**
9
- * Payload structure for relayer requests.
10
- * Contains the EIP-712 typed data, signature, and optional expected user address for security verification.
11
- *
12
- * @category Server
13
- */
14
- export interface RelayerRequestPayload {
15
- /** EIP-712 typed data containing the transaction details */
16
- typedData: GenericTypedData;
17
- /** User's signature of the typed data */
18
- signature: Hash;
19
- /** Optional expected user address for security verification */
20
- expectedUserAddress?: Address;
21
- }
22
- /**
23
- * Unified server-side handler for processing relayed transactions.
24
- *
25
- * This function encapsulates the complete relayer workflow:
26
- * 1. Verifies the signature against the typed data
27
- * 2. Optionally checks the signer matches the expected user address
28
- * 3. Routes to the appropriate SDK method based on primaryType
29
- * 4. Returns the transaction handle with hash and event parsing capability
30
- *
31
- * Supported transaction types:
32
- * - Permission: Permission grants
33
- * - PermissionRevoke: Permission revocations
34
- * - TrustServer: Trust server operations
35
- * - UntrustServer: Untrust server operations
36
- * - AddServer: Add and trust server operations
37
- * - RegisterGrantee: Register grantee operations
38
- * - ServerFilesAndPermission: Batch operation for server, files, and permissions
39
- *
40
- * @param sdk - Initialized Vana SDK instance
41
- * @param payload - Request payload containing typed data, signature, and optional security check
42
- * @returns Promise resolving to TransactionResult with hash and optional event data
43
- * @throws {SignatureError} When signature verification fails or signer mismatch occurs
44
- * @throws {Error} When primaryType is unsupported or SDK operations fail
45
- * @category Server
46
- * @example
47
- * ```typescript
48
- * import { handleRelayerRequest } from '@opendatalabs/vana-sdk';
49
- *
50
- * // In your relayer API endpoint:
51
- * export async function POST(request: NextRequest) {
52
- * try {
53
- * const body = await request.json();
54
- * const vana = await createRelayerVana();
55
- *
56
- * const tx = await handleRelayerRequest(vana, {
57
- * typedData: body.typedData,
58
- * signature: body.signature,
59
- * expectedUserAddress: body.expectedUserAddress
60
- * });
61
- *
62
- * // Option 1: Return just the hash immediately
63
- * return NextResponse.json({
64
- * success: true,
65
- * transactionHash: tx.hash
66
- * });
67
- *
68
- * // Option 2: Wait for transaction confirmation and return event data
69
- * const eventData = await tx.waitForEvents();
70
- * return NextResponse.json({
71
- * success: true,
72
- * transactionHash: tx.hash,
73
- * ...eventData // Include parsed event data like permissionId, fileId, etc.
74
- * });
75
- * } catch (error) {
76
- * return NextResponse.json({
77
- * success: false,
78
- * error: error.message
79
- * }, { status: 500 });
80
- * }
81
- * }
82
- * ```
83
- */
84
- export declare function handleRelayerRequest(sdk: VanaInstance, payload: RelayerRequestPayload): Promise<TransactionResult & {
85
- eventData?: RelayerTransactionResult;
86
- }>;
87
- export {};
@@ -1,77 +0,0 @@
1
- import { recoverTypedDataAddress, getAddress } from "viem";
2
- import { SignatureError } from "../errors";
3
- async function handleRelayerRequest(sdk, payload) {
4
- const { typedData, signature, expectedUserAddress } = payload;
5
- console.debug({
6
- domain: typedData.domain,
7
- types: typedData.types,
8
- primaryType: typedData.primaryType,
9
- message: typedData.message,
10
- signature
11
- });
12
- const signerAddress = await recoverTypedDataAddress({
13
- domain: typedData.domain,
14
- types: typedData.types,
15
- primaryType: typedData.primaryType,
16
- message: typedData.message,
17
- signature
18
- });
19
- if (!signerAddress) {
20
- throw new SignatureError(
21
- "Invalid signature - could not recover signer address"
22
- );
23
- }
24
- if (expectedUserAddress) {
25
- const normalizedSigner = getAddress(signerAddress);
26
- const normalizedExpected = getAddress(expectedUserAddress);
27
- if (normalizedSigner !== normalizedExpected) {
28
- throw new SignatureError(
29
- `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected}). This may be due to incorrect EIP-712 domain configuration.`
30
- );
31
- }
32
- }
33
- const primaryType = typedData.primaryType;
34
- switch (primaryType) {
35
- case "Permission":
36
- return sdk.permissions.submitSignedGrant(
37
- typedData,
38
- signature
39
- );
40
- case "RevokePermission":
41
- return sdk.permissions.submitSignedRevoke(
42
- typedData,
43
- signature
44
- );
45
- case "TrustServer":
46
- return sdk.permissions.submitSignedTrustServer(
47
- typedData,
48
- signature
49
- );
50
- case "AddServer":
51
- return sdk.permissions.submitSignedAddAndTrustServer(
52
- typedData,
53
- signature
54
- );
55
- case "UntrustServer":
56
- return sdk.permissions.submitSignedUntrustServer(
57
- typedData,
58
- signature
59
- );
60
- case "RegisterGrantee":
61
- return sdk.permissions.submitSignedRegisterGrantee(
62
- typedData,
63
- signature
64
- );
65
- case "ServerFilesAndPermission":
66
- return sdk.permissions.submitSignedAddServerFilesAndPermissions(
67
- typedData,
68
- signature
69
- );
70
- default:
71
- throw new Error(`Unsupported operation type: ${typedData.primaryType}`);
72
- }
73
- }
74
- export {
75
- handleRelayerRequest
76
- };
77
- //# sourceMappingURL=handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/server/handler.ts"],"sourcesContent":["import type { Address, Hash } from \"viem\";\nimport { recoverTypedDataAddress, getAddress } from \"viem\";\nimport type { VanaInstance } from \"../index.node\";\nimport type {\n GenericTypedData,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n RegisterGranteeTypedData,\n TrustServerTypedData,\n AddAndTrustServerTypedData,\n ServerFilesAndPermissionTypedData,\n TypedDataPrimaryType,\n} from \"../types\";\nimport { SignatureError } from \"../errors\";\nimport type { TransactionResult } from \"../types/operations\";\nimport type {\n PermissionGrantResult,\n PermissionRevokeResult,\n ServerTrustResult,\n ServerUntrustResult,\n GranteeRegisterResult,\n FileAddedResult,\n} from \"../types/transactionResults\";\n\n/** Union type of all possible transaction results from relayer operations */\ntype RelayerTransactionResult =\n | PermissionGrantResult\n | PermissionRevokeResult\n | ServerTrustResult\n | ServerUntrustResult\n | GranteeRegisterResult\n | FileAddedResult;\n\n/**\n * Payload structure for relayer requests.\n * Contains the EIP-712 typed data, signature, and optional expected user address for security verification.\n *\n * @category Server\n */\nexport interface RelayerRequestPayload {\n /** EIP-712 typed data containing the transaction details */\n typedData: GenericTypedData;\n /** User's signature of the typed data */\n signature: Hash;\n /** Optional expected user address for security verification */\n expectedUserAddress?: Address;\n}\n\n/**\n * Unified server-side handler for processing relayed transactions.\n *\n * This function encapsulates the complete relayer workflow:\n * 1. Verifies the signature against the typed data\n * 2. Optionally checks the signer matches the expected user address\n * 3. Routes to the appropriate SDK method based on primaryType\n * 4. Returns the transaction handle with hash and event parsing capability\n *\n * Supported transaction types:\n * - Permission: Permission grants\n * - PermissionRevoke: Permission revocations\n * - TrustServer: Trust server operations\n * - UntrustServer: Untrust server operations\n * - AddServer: Add and trust server operations\n * - RegisterGrantee: Register grantee operations\n * - ServerFilesAndPermission: Batch operation for server, files, and permissions\n *\n * @param sdk - Initialized Vana SDK instance\n * @param payload - Request payload containing typed data, signature, and optional security check\n * @returns Promise resolving to TransactionResult with hash and optional event data\n * @throws {SignatureError} When signature verification fails or signer mismatch occurs\n * @throws {Error} When primaryType is unsupported or SDK operations fail\n * @category Server\n * @example\n * ```typescript\n * import { handleRelayerRequest } from '@opendatalabs/vana-sdk';\n *\n * // In your relayer API endpoint:\n * export async function POST(request: NextRequest) {\n * try {\n * const body = await request.json();\n * const vana = await createRelayerVana();\n *\n * const tx = await handleRelayerRequest(vana, {\n * typedData: body.typedData,\n * signature: body.signature,\n * expectedUserAddress: body.expectedUserAddress\n * });\n *\n * // Option 1: Return just the hash immediately\n * return NextResponse.json({\n * success: true,\n * transactionHash: tx.hash\n * });\n *\n * // Option 2: Wait for transaction confirmation and return event data\n * const eventData = await tx.waitForEvents();\n * return NextResponse.json({\n * success: true,\n * transactionHash: tx.hash,\n * ...eventData // Include parsed event data like permissionId, fileId, etc.\n * });\n * } catch (error) {\n * return NextResponse.json({\n * success: false,\n * error: error.message\n * }, { status: 500 });\n * }\n * }\n * ```\n */\nexport async function handleRelayerRequest(\n sdk: VanaInstance,\n payload: RelayerRequestPayload,\n): Promise<TransactionResult & { eventData?: RelayerTransactionResult }> {\n const { typedData, signature, expectedUserAddress } = payload;\n\n console.debug({\n domain: typedData.domain,\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n\n // Step 1: Verify signature and recover signer address\n const signerAddress = await recoverTypedDataAddress({\n domain: typedData.domain,\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n\n if (!signerAddress) {\n throw new SignatureError(\n \"Invalid signature - could not recover signer address\",\n );\n }\n\n // Step 2: Security check - verify signer matches expected user address if provided\n if (expectedUserAddress) {\n const normalizedSigner = getAddress(signerAddress);\n const normalizedExpected = getAddress(expectedUserAddress);\n\n if (normalizedSigner !== normalizedExpected) {\n throw new SignatureError(\n `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected}). This may be due to incorrect EIP-712 domain configuration.`,\n );\n }\n }\n\n // Step 3: Route to appropriate SDK method based on primaryType\n // Route to appropriate SDK method and return TransactionResult directly\n const primaryType = typedData.primaryType as TypedDataPrimaryType;\n switch (primaryType) {\n case \"Permission\":\n return sdk.permissions.submitSignedGrant(\n typedData as unknown as PermissionGrantTypedData,\n signature,\n );\n\n case \"RevokePermission\":\n return sdk.permissions.submitSignedRevoke(\n typedData as unknown as RevokePermissionTypedData,\n signature,\n );\n\n case \"TrustServer\":\n return sdk.permissions.submitSignedTrustServer(\n typedData as unknown as TrustServerTypedData,\n signature,\n );\n\n case \"AddServer\":\n return sdk.permissions.submitSignedAddAndTrustServer(\n typedData as unknown as AddAndTrustServerTypedData,\n signature,\n );\n\n case \"UntrustServer\":\n return sdk.permissions.submitSignedUntrustServer(\n typedData as unknown as GenericTypedData,\n signature,\n );\n\n case \"RegisterGrantee\":\n return sdk.permissions.submitSignedRegisterGrantee(\n typedData as unknown as RegisterGranteeTypedData,\n signature,\n );\n\n case \"ServerFilesAndPermission\":\n return sdk.permissions.submitSignedAddServerFilesAndPermissions(\n typedData as unknown as ServerFilesAndPermissionTypedData,\n signature,\n );\n\n default:\n throw new Error(`Unsupported operation type: ${typedData.primaryType}`);\n }\n}\n"],"mappings":"AACA,SAAS,yBAAyB,kBAAkB;AAYpD,SAAS,sBAAsB;AAiG/B,eAAsB,qBACpB,KACA,SACuE;AACvE,QAAM,EAAE,WAAW,WAAW,oBAAoB,IAAI;AAEtD,UAAQ,MAAM;AAAA,IACZ,QAAQ,UAAU;AAAA,IAClB,OAAO,UAAU;AAAA,IACjB,aAAa,UAAU;AAAA,IACvB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF,CAAC;AAGD,QAAM,gBAAgB,MAAM,wBAAwB;AAAA,IAClD,QAAQ,UAAU;AAAA,IAClB,OAAO,UAAU;AAAA,IACjB,aAAa,UAAU;AAAA,IACvB,SAAS,UAAU;AAAA,IACnB;AAAA,EACF,CAAC;AAED,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,qBAAqB;AACvB,UAAM,mBAAmB,WAAW,aAAa;AACjD,UAAM,qBAAqB,WAAW,mBAAmB;AAEzD,QAAI,qBAAqB,oBAAoB;AAC3C,YAAM,IAAI;AAAA,QACR,2DAA2D,gBAAgB,2CAA2C,kBAAkB;AAAA,MAC1I;AAAA,IACF;AAAA,EACF;AAIA,QAAM,cAAc,UAAU;AAC9B,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IAEF;AACE,YAAM,IAAI,MAAM,+BAA+B,UAAU,WAAW,EAAE;AAAA,EAC1E;AACF;","names":[]}