@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.
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +33 -1
- package/dist/browser.js.map +1 -1
- package/dist/chains/index.cjs.map +1 -1
- package/dist/chains/index.d.ts +30 -1
- package/dist/chains/index.js.map +1 -1
- package/dist/config/chains.cjs.map +1 -1
- package/dist/config/chains.d.ts +99 -0
- package/dist/config/chains.js.map +1 -1
- package/dist/contracts/contractController.cjs.map +1 -1
- package/dist/contracts/contractController.d.ts +66 -10
- package/dist/contracts/contractController.js.map +1 -1
- package/dist/controllers/data.cjs +173 -141
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +213 -175
- package/dist/controllers/data.js +173 -141
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/permissions.cjs +185 -191
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +29 -73
- package/dist/controllers/permissions.js +185 -191
- package/dist/controllers/permissions.js.map +1 -1
- package/dist/controllers/protocol.cjs.map +1 -1
- package/dist/controllers/protocol.d.ts +27 -28
- package/dist/controllers/protocol.js.map +1 -1
- package/dist/controllers/schemas.cjs +23 -21
- package/dist/controllers/schemas.cjs.map +1 -1
- package/dist/controllers/schemas.d.ts +47 -40
- package/dist/controllers/schemas.js +23 -21
- package/dist/controllers/schemas.js.map +1 -1
- package/dist/controllers/server.cjs +17 -15
- package/dist/controllers/server.cjs.map +1 -1
- package/dist/controllers/server.d.ts +46 -38
- package/dist/controllers/server.js +17 -15
- package/dist/controllers/server.js.map +1 -1
- package/dist/core/apiClient.cjs +53 -3
- package/dist/core/apiClient.cjs.map +1 -1
- package/dist/core/apiClient.d.ts +132 -7
- package/dist/core/apiClient.js +53 -3
- package/dist/core/apiClient.js.map +1 -1
- package/dist/core/generics.cjs +30 -3
- package/dist/core/generics.cjs.map +1 -1
- package/dist/core/generics.d.ts +95 -6
- package/dist/core/generics.js +30 -3
- package/dist/core/generics.js.map +1 -1
- package/dist/core.cjs +29 -12
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +2 -1
- package/dist/core.js +29 -12
- package/dist/core.js.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.node.cjs +3 -3
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +8 -9
- package/dist/index.node.js +2 -2
- package/dist/index.node.js.map +1 -1
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.ts +39 -1
- package/dist/node.js.map +1 -1
- package/dist/platform/browser.cjs +160 -2
- package/dist/platform/browser.cjs.map +1 -1
- package/dist/platform/browser.d.ts +232 -12
- package/dist/platform/browser.js +160 -2
- package/dist/platform/browser.js.map +1 -1
- package/dist/platform/interface.cjs.map +1 -1
- package/dist/platform/interface.d.ts +283 -90
- package/dist/platform/node.cjs +163 -2
- package/dist/platform/node.cjs.map +1 -1
- package/dist/platform/node.d.ts +69 -6
- package/dist/platform/node.js +163 -2
- package/dist/platform/node.js.map +1 -1
- package/dist/server/relayerHandler.cjs +214 -0
- package/dist/server/relayerHandler.cjs.map +1 -0
- package/dist/server/relayerHandler.d.ts +36 -0
- package/dist/server/relayerHandler.js +190 -0
- package/dist/server/relayerHandler.js.map +1 -0
- package/dist/storage/manager.cjs +108 -25
- package/dist/storage/manager.cjs.map +1 -1
- package/dist/storage/manager.d.ts +119 -25
- package/dist/storage/manager.js +108 -25
- package/dist/storage/manager.js.map +1 -1
- package/dist/storage/providers/callback-storage.cjs +86 -15
- package/dist/storage/providers/callback-storage.cjs.map +1 -1
- package/dist/storage/providers/callback-storage.d.ts +109 -20
- package/dist/storage/providers/callback-storage.js +86 -15
- package/dist/storage/providers/callback-storage.js.map +1 -1
- package/dist/storage/providers/pinata.cjs.map +1 -1
- package/dist/storage/providers/pinata.d.ts +12 -14
- package/dist/storage/providers/pinata.js.map +1 -1
- package/dist/tests/factories/mockFactory.d.ts +2 -2
- package/dist/tests/relayer-integration.test.d.ts +1 -0
- package/dist/tests/relayer-unified.test.d.ts +1 -0
- package/dist/tests/server-relayer-handler.test.d.ts +1 -0
- package/dist/types/blockchain.cjs.map +1 -1
- package/dist/types/blockchain.d.ts +39 -11
- package/dist/types/chains.cjs.map +1 -1
- package/dist/types/chains.d.ts +74 -7
- package/dist/types/chains.js.map +1 -1
- package/dist/types/config.cjs.map +1 -1
- package/dist/types/config.d.ts +46 -191
- package/dist/types/config.js.map +1 -1
- package/dist/types/contracts.cjs.map +1 -1
- package/dist/types/contracts.d.ts +71 -7
- package/dist/types/controller-context.cjs.map +1 -1
- package/dist/types/controller-context.d.ts +3 -2
- package/dist/types/data.cjs.map +1 -1
- package/dist/types/data.d.ts +4 -6
- package/dist/types/generics.cjs.map +1 -1
- package/dist/types/generics.d.ts +80 -9
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +27 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +132 -15
- package/dist/types/operations.js.map +1 -1
- package/dist/types/permissions.cjs.map +1 -1
- package/dist/types/permissions.d.ts +15 -20
- package/dist/types/personal.cjs.map +1 -1
- package/dist/types/personal.d.ts +131 -14
- package/dist/types/relayer.cjs.map +1 -1
- package/dist/types/relayer.d.ts +262 -35
- package/dist/types/storage.cjs.map +1 -1
- package/dist/types/storage.d.ts +9 -21
- package/dist/types/storage.js.map +1 -1
- package/dist/utils/grantFiles.cjs.map +1 -1
- package/dist/utils/grantFiles.d.ts +10 -20
- package/dist/utils/grantFiles.js.map +1 -1
- package/dist/utils/grantValidation.cjs.map +1 -1
- package/dist/utils/grantValidation.d.ts +95 -16
- package/dist/utils/grantValidation.js.map +1 -1
- package/dist/utils/grants.cjs.map +1 -1
- package/dist/utils/grants.d.ts +93 -12
- package/dist/utils/grants.js.map +1 -1
- package/dist/utils/lazy-import.cjs.map +1 -1
- package/dist/utils/lazy-import.d.ts +32 -7
- package/dist/utils/lazy-import.js.map +1 -1
- package/dist/utils/signatureCache.cjs +8 -2
- package/dist/utils/signatureCache.cjs.map +1 -1
- package/dist/utils/signatureCache.d.ts +49 -8
- package/dist/utils/signatureCache.js +8 -2
- package/dist/utils/signatureCache.js.map +1 -1
- package/dist/utils/transactionHelpers.cjs.map +1 -1
- package/dist/utils/transactionHelpers.d.ts +12 -12
- package/dist/utils/transactionHelpers.js.map +1 -1
- package/dist/utils/typedDataConverter.cjs.map +1 -1
- package/dist/utils/typedDataConverter.d.ts +39 -3
- package/dist/utils/typedDataConverter.js.map +1 -1
- package/dist/utils/urlResolver.cjs +7 -0
- package/dist/utils/urlResolver.cjs.map +1 -1
- package/dist/utils/urlResolver.d.ts +22 -4
- package/dist/utils/urlResolver.js +7 -0
- package/dist/utils/urlResolver.js.map +1 -1
- package/dist/utils/wallet.cjs +2 -1
- package/dist/utils/wallet.cjs.map +1 -1
- package/dist/utils/wallet.d.ts +78 -16
- package/dist/utils/wallet.js +2 -1
- package/dist/utils/wallet.js.map +1 -1
- package/package.json +1 -1
- package/dist/server/handler.cjs +0 -101
- package/dist/server/handler.cjs.map +0 -1
- package/dist/server/handler.d.ts +0 -87
- package/dist/server/handler.js +0 -77
- package/dist/server/handler.js.map +0 -1
- /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 *
|
|
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":[]}
|
package/dist/utils/wallet.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
*
|
|
11
|
-
*
|
|
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
|
-
* @
|
|
14
|
-
*
|
|
15
|
-
* @throws Error
|
|
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
|
|
20
|
-
*
|
|
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
|
-
*
|
|
23
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* @
|
|
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;
|
package/dist/utils/wallet.js
CHANGED
|
@@ -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
|
|
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;
|
package/dist/utils/wallet.js.map
CHANGED
|
@@ -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 *
|
|
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
package/dist/server/handler.cjs
DELETED
|
@@ -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":[]}
|
package/dist/server/handler.d.ts
DELETED
|
@@ -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 {};
|
package/dist/server/handler.js
DELETED
|
@@ -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":[]}
|
|
File without changes
|