@opendatalabs/vana-sdk 0.1.0-alpha.2b6935d → 0.1.0-alpha.2e77fcc
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/base.cjs +33 -0
- package/dist/controllers/base.cjs.map +1 -1
- package/dist/controllers/base.d.ts +10 -0
- package/dist/controllers/base.js +33 -0
- package/dist/controllers/base.js.map +1 -1
- package/dist/controllers/data.cjs +162 -133
- package/dist/controllers/data.cjs.map +1 -1
- package/dist/controllers/data.d.ts +222 -184
- package/dist/controllers/data.js +162 -133
- package/dist/controllers/data.js.map +1 -1
- package/dist/controllers/permissions.cjs +208 -60
- package/dist/controllers/permissions.cjs.map +1 -1
- package/dist/controllers/permissions.d.ts +75 -45
- package/dist/controllers/permissions.js +208 -60
- 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 +4 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +2 -1
- package/dist/core.js +4 -1
- 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 +2 -3
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.d.ts +33 -13
- 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 +136 -98
- package/dist/server/relayerHandler.cjs.map +1 -1
- package/dist/server/relayerHandler.d.ts +3 -2
- package/dist/server/relayerHandler.js +135 -96
- package/dist/server/relayerHandler.js.map +1 -1
- 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/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 +38 -4
- 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 -1
- 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 +81 -10
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.ts +28 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/operations.cjs.map +1 -1
- package/dist/types/operations.d.ts +178 -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 +114 -18
- 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/types/utils.cjs.map +1 -1
- package/dist/types/utils.d.ts +5 -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/ipfs.cjs +2 -4
- package/dist/utils/ipfs.cjs.map +1 -1
- package/dist/utils/ipfs.d.ts +1 -1
- package/dist/utils/ipfs.js +2 -4
- package/dist/utils/ipfs.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.map +1 -1
- package/dist/utils/wallet.d.ts +78 -16
- package/dist/utils/wallet.js.map +1 -1
- package/package.json +3 -1
- package/dist/server/handler.cjs +0 -103
- package/dist/server/handler.cjs.map +0 -1
- package/dist/server/handler.d.ts +0 -95
- package/dist/server/handler.js +0 -79
- package/dist/server/handler.js.map +0 -1
- /package/dist/tests/{server-handler.test.d.ts → permissions-transaction-options.test.d.ts} +0 -0
|
@@ -18,54 +18,121 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var relayerHandler_exports = {};
|
|
20
20
|
__export(relayerHandler_exports, {
|
|
21
|
-
handleRelayerOperation: () => handleRelayerOperation
|
|
22
|
-
handleRelayerRequest: () => import_handler.handleRelayerRequest
|
|
21
|
+
handleRelayerOperation: () => handleRelayerOperation
|
|
23
22
|
});
|
|
24
23
|
module.exports = __toCommonJS(relayerHandler_exports);
|
|
24
|
+
var import_uuid = require("uuid");
|
|
25
25
|
var import_errors = require("../errors");
|
|
26
26
|
var import_viem = require("viem");
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
|
|
27
|
+
async function handleRelayerOperation(sdk, request, options) {
|
|
28
|
+
const store = sdk.operationStore;
|
|
29
|
+
if (store) {
|
|
30
|
+
if (request.type === "status_check") {
|
|
31
|
+
const state = await store.get(request.operationId);
|
|
32
|
+
if (!state) return { type: "error", error: "Operation not found" };
|
|
33
|
+
if (state.status === "confirmed")
|
|
34
|
+
return {
|
|
35
|
+
type: "confirmed",
|
|
36
|
+
hash: state.transactionHash,
|
|
37
|
+
receipt: state.finalReceipt
|
|
38
|
+
};
|
|
39
|
+
if (state.status === "failed")
|
|
40
|
+
return { type: "error", error: state.error ?? "Operation failed" };
|
|
41
|
+
return { type: "pending", operationId: request.operationId };
|
|
42
|
+
}
|
|
43
|
+
const operationId = (0, import_uuid.v4)();
|
|
44
|
+
try {
|
|
45
|
+
const txResult = await routeAndExecuteRequest(sdk, request, options);
|
|
46
|
+
if ("hash" in txResult) {
|
|
47
|
+
await store.set(operationId, {
|
|
48
|
+
status: "pending",
|
|
49
|
+
transactionHash: txResult.hash,
|
|
50
|
+
originalRequest: request,
|
|
51
|
+
nonce: options?.nonce,
|
|
52
|
+
retryCount: 0,
|
|
53
|
+
lastAttemptedGas: {
|
|
54
|
+
maxFeePerGas: options?.maxFeePerGas?.toString(),
|
|
55
|
+
maxPriorityFeePerGas: options?.maxPriorityFeePerGas?.toString()
|
|
56
|
+
},
|
|
57
|
+
submittedAt: Date.now()
|
|
58
|
+
});
|
|
59
|
+
return { type: "pending", operationId };
|
|
60
|
+
} else {
|
|
61
|
+
return { type: "direct_result_untracked", result: txResult };
|
|
62
|
+
}
|
|
63
|
+
} catch (e) {
|
|
64
|
+
const error = e instanceof Error ? e : new Error("Unknown error during operation submission");
|
|
65
|
+
return { type: "error", error: error.message };
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
if (request.type === "status_check") {
|
|
69
|
+
return {
|
|
70
|
+
type: "error",
|
|
71
|
+
error: "Stateless relayer does not support operation status checks."
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const txResult = await routeAndExecuteRequest(sdk, request, options);
|
|
76
|
+
if ("hash" in txResult) {
|
|
77
|
+
return { type: "submitted", hash: txResult.hash };
|
|
78
|
+
} else {
|
|
79
|
+
return { type: "direct_result_untracked", result: txResult };
|
|
80
|
+
}
|
|
81
|
+
} catch (e) {
|
|
82
|
+
const error = e instanceof Error ? e : new Error("Unknown error during operation submission");
|
|
83
|
+
return { type: "error", error: error.message };
|
|
84
|
+
}
|
|
31
85
|
}
|
|
32
|
-
return handleDirectOperation(sdk, request);
|
|
33
86
|
}
|
|
34
|
-
async function
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
`Signature verification failed: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
if (expectedUserAddress) {
|
|
54
|
-
const normalizedExpected = (0, import_viem.getAddress)(expectedUserAddress);
|
|
55
|
-
const normalizedSigner = (0, import_viem.getAddress)(recoveredAddress);
|
|
56
|
-
if (normalizedSigner !== normalizedExpected) {
|
|
87
|
+
async function routeAndExecuteRequest(sdk, request, options) {
|
|
88
|
+
if (request.type === "signed") {
|
|
89
|
+
const { typedData, signature, expectedUserAddress } = request;
|
|
90
|
+
let recoveredAddress;
|
|
91
|
+
try {
|
|
92
|
+
recoveredAddress = await (0, import_viem.recoverTypedDataAddress)({
|
|
93
|
+
domain: {
|
|
94
|
+
...typedData.domain,
|
|
95
|
+
chainId: typedData.domain.chainId ? BigInt(typedData.domain.chainId) : void 0
|
|
96
|
+
},
|
|
97
|
+
types: typedData.types,
|
|
98
|
+
primaryType: typedData.primaryType,
|
|
99
|
+
message: typedData.message,
|
|
100
|
+
signature
|
|
101
|
+
});
|
|
102
|
+
} catch (error) {
|
|
57
103
|
throw new import_errors.SignatureError(
|
|
58
|
-
`
|
|
104
|
+
`Signature verification failed: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
59
105
|
);
|
|
60
106
|
}
|
|
107
|
+
if (expectedUserAddress) {
|
|
108
|
+
const normalizedExpected = (0, import_viem.getAddress)(expectedUserAddress);
|
|
109
|
+
const normalizedSigner = (0, import_viem.getAddress)(recoveredAddress);
|
|
110
|
+
if (normalizedSigner !== normalizedExpected) {
|
|
111
|
+
throw new import_errors.SignatureError(
|
|
112
|
+
`Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected})`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return await routeSignedOperation(sdk, typedData, signature, options);
|
|
117
|
+
} else if (request.type === "direct") {
|
|
118
|
+
return await handleDirectOperation(sdk, request, options);
|
|
61
119
|
}
|
|
62
|
-
|
|
63
|
-
return {
|
|
64
|
-
type: "signed",
|
|
65
|
-
hash: result.hash
|
|
66
|
-
};
|
|
120
|
+
throw new Error("Invalid request type for execution");
|
|
67
121
|
}
|
|
68
|
-
async function routeSignedOperation(sdk, typedData, signature) {
|
|
122
|
+
async function routeSignedOperation(sdk, typedData, signature, options) {
|
|
123
|
+
const validPrimaryTypes = [
|
|
124
|
+
"Permission",
|
|
125
|
+
"RevokePermission",
|
|
126
|
+
"TrustServer",
|
|
127
|
+
"AddServer",
|
|
128
|
+
"UntrustServer",
|
|
129
|
+
"ServerFilesAndPermission"
|
|
130
|
+
];
|
|
131
|
+
if (!validPrimaryTypes.includes(typedData.primaryType)) {
|
|
132
|
+
throw new Error(
|
|
133
|
+
`Unsupported operation type: ${typedData.primaryType}. Supported types: ${validPrimaryTypes.join(", ")}`
|
|
134
|
+
);
|
|
135
|
+
}
|
|
69
136
|
const primaryType = typedData.primaryType;
|
|
70
137
|
switch (primaryType) {
|
|
71
138
|
case "Permission":
|
|
@@ -74,7 +141,8 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
74
141
|
...typedData,
|
|
75
142
|
primaryType: "Permission"
|
|
76
143
|
},
|
|
77
|
-
signature
|
|
144
|
+
signature,
|
|
145
|
+
options
|
|
78
146
|
);
|
|
79
147
|
case "RevokePermission":
|
|
80
148
|
return sdk.permissions.submitSignedRevoke(
|
|
@@ -82,7 +150,8 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
82
150
|
...typedData,
|
|
83
151
|
primaryType: "RevokePermission"
|
|
84
152
|
},
|
|
85
|
-
signature
|
|
153
|
+
signature,
|
|
154
|
+
options
|
|
86
155
|
);
|
|
87
156
|
case "TrustServer":
|
|
88
157
|
return sdk.permissions.submitSignedTrustServer(
|
|
@@ -90,7 +159,8 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
90
159
|
...typedData,
|
|
91
160
|
primaryType: "TrustServer"
|
|
92
161
|
},
|
|
93
|
-
signature
|
|
162
|
+
signature,
|
|
163
|
+
options
|
|
94
164
|
);
|
|
95
165
|
case "AddServer":
|
|
96
166
|
return sdk.permissions.submitSignedAddAndTrustServer(
|
|
@@ -98,7 +168,8 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
98
168
|
...typedData,
|
|
99
169
|
primaryType: "AddServer"
|
|
100
170
|
},
|
|
101
|
-
signature
|
|
171
|
+
signature,
|
|
172
|
+
options
|
|
102
173
|
);
|
|
103
174
|
case "UntrustServer":
|
|
104
175
|
return sdk.permissions.submitSignedUntrustServer(
|
|
@@ -106,7 +177,8 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
106
177
|
...typedData,
|
|
107
178
|
primaryType: "UntrustServer"
|
|
108
179
|
},
|
|
109
|
-
signature
|
|
180
|
+
signature,
|
|
181
|
+
options
|
|
110
182
|
);
|
|
111
183
|
case "ServerFilesAndPermission":
|
|
112
184
|
return sdk.permissions.submitSignedAddServerFilesAndPermissions(
|
|
@@ -114,83 +186,53 @@ async function routeSignedOperation(sdk, typedData, signature) {
|
|
|
114
186
|
...typedData,
|
|
115
187
|
primaryType: "ServerFilesAndPermission"
|
|
116
188
|
},
|
|
117
|
-
signature
|
|
189
|
+
signature,
|
|
190
|
+
options
|
|
118
191
|
);
|
|
119
|
-
// RegisterGrantee
|
|
192
|
+
// TODO: RegisterGrantee with signature is not supported until
|
|
193
|
+
// DataPortabilityGrantees contract adds registerGranteeWithSignature function
|
|
120
194
|
// case "RegisterGrantee":
|
|
121
195
|
// return sdk.permissions.submitSignedRegisterGrantee(...);
|
|
122
196
|
default:
|
|
123
|
-
throw new Error(
|
|
197
|
+
throw new Error(
|
|
198
|
+
`Unsupported operation type: ${typedData.primaryType}. Supported types: Permission, RevokePermission, TrustServer, AddServer, UntrustServer, ServerFilesAndPermission`
|
|
199
|
+
);
|
|
124
200
|
}
|
|
125
201
|
}
|
|
126
|
-
async function handleDirectOperation(sdk, request) {
|
|
202
|
+
async function handleDirectOperation(sdk, request, options) {
|
|
127
203
|
switch (request.operation) {
|
|
128
204
|
case "submitFileAddition": {
|
|
129
205
|
const { url, userAddress } = request.params;
|
|
130
206
|
const result = await sdk.data.addFileWithPermissions(
|
|
131
207
|
url,
|
|
132
208
|
userAddress,
|
|
133
|
-
[]
|
|
209
|
+
[],
|
|
134
210
|
// No permissions
|
|
211
|
+
options
|
|
135
212
|
);
|
|
136
|
-
|
|
137
|
-
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
138
|
-
if (!fileId) {
|
|
139
|
-
throw new Error("Failed to get fileId from transaction events");
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
type: "direct",
|
|
143
|
-
result: {
|
|
144
|
-
fileId: Number(fileId),
|
|
145
|
-
transactionHash: result.hash
|
|
146
|
-
}
|
|
147
|
-
};
|
|
213
|
+
return result;
|
|
148
214
|
}
|
|
149
215
|
case "submitFileAdditionWithPermissions": {
|
|
150
216
|
const { url, userAddress, permissions } = request.params;
|
|
151
217
|
const result = await sdk.data.addFileWithPermissions(
|
|
152
218
|
url,
|
|
153
219
|
userAddress,
|
|
154
|
-
permissions
|
|
220
|
+
permissions,
|
|
221
|
+
options
|
|
155
222
|
);
|
|
156
|
-
|
|
157
|
-
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
158
|
-
if (!fileId) {
|
|
159
|
-
throw new Error("Failed to get fileId from transaction events");
|
|
160
|
-
}
|
|
161
|
-
return {
|
|
162
|
-
type: "direct",
|
|
163
|
-
result: {
|
|
164
|
-
fileId: Number(fileId),
|
|
165
|
-
transactionHash: result.hash
|
|
166
|
-
}
|
|
167
|
-
};
|
|
223
|
+
return result;
|
|
168
224
|
}
|
|
169
225
|
case "submitFileAdditionComplete": {
|
|
170
226
|
const { url, userAddress, permissions, schemaId, ownerAddress } = request.params;
|
|
171
|
-
const
|
|
172
|
-
account: p.account,
|
|
173
|
-
publicKey: p.key
|
|
174
|
-
// Map 'key' to 'publicKey'
|
|
175
|
-
}));
|
|
176
|
-
const result = await sdk.data.addFileWithPermissionsAndSchema(
|
|
227
|
+
const result = await sdk.data.addFileWithEncryptedPermissionsAndSchema(
|
|
177
228
|
url,
|
|
178
229
|
ownerAddress ?? userAddress,
|
|
179
|
-
|
|
180
|
-
|
|
230
|
+
permissions,
|
|
231
|
+
// Already in correct format with encrypted 'key' field
|
|
232
|
+
schemaId,
|
|
233
|
+
options
|
|
181
234
|
);
|
|
182
|
-
|
|
183
|
-
const fileId = eventData.expectedEvents?.FileAdded?.fileId;
|
|
184
|
-
if (!fileId) {
|
|
185
|
-
throw new Error("Failed to get fileId from transaction events");
|
|
186
|
-
}
|
|
187
|
-
return {
|
|
188
|
-
type: "direct",
|
|
189
|
-
result: {
|
|
190
|
-
fileId: Number(fileId),
|
|
191
|
-
transactionHash: result.hash
|
|
192
|
-
}
|
|
193
|
-
};
|
|
235
|
+
return result;
|
|
194
236
|
}
|
|
195
237
|
case "storeGrantFile": {
|
|
196
238
|
const grantFile = request.params;
|
|
@@ -201,10 +243,7 @@ async function handleDirectOperation(sdk, request) {
|
|
|
201
243
|
content: blob,
|
|
202
244
|
filename: `grant-${Date.now()}.json`
|
|
203
245
|
});
|
|
204
|
-
return {
|
|
205
|
-
type: "direct",
|
|
206
|
-
result: { url: result.url }
|
|
207
|
-
};
|
|
246
|
+
return { url: result.url };
|
|
208
247
|
}
|
|
209
248
|
default: {
|
|
210
249
|
const exhaustiveCheck = request;
|
|
@@ -214,7 +253,6 @@ async function handleDirectOperation(sdk, request) {
|
|
|
214
253
|
}
|
|
215
254
|
// Annotate the CommonJS export names for ESM import in node:
|
|
216
255
|
0 && (module.exports = {
|
|
217
|
-
handleRelayerOperation
|
|
218
|
-
handleRelayerRequest
|
|
256
|
+
handleRelayerOperation
|
|
219
257
|
});
|
|
220
258
|
//# sourceMappingURL=relayerHandler.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/server/relayerHandler.ts"],"sourcesContent":["import type { VanaInstance } from \"../index.node\";\nimport type {\n UnifiedRelayerRequest,\n UnifiedRelayerResponse,\n SignedRelayerRequest,\n DirectRelayerRequest,\n} from \"../types/relayer\";\nimport type {\n GenericTypedData,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n TrustServerTypedData,\n AddAndTrustServerTypedData,\n ServerFilesAndPermissionTypedData,\n TypedDataPrimaryType,\n} from \"../types/permissions\";\nimport { SignatureError } from \"../errors\";\nimport { recoverTypedDataAddress, getAddress, type Hash } from \"viem\";\n\n/**\n * Universal handler for all relayer operations.\n *\n * This function processes both EIP-712 signed operations and direct operations,\n * automatically routing to the appropriate SDK methods.\n *\n * @param sdk - Initialized Vana SDK instance\n * @param request - The unified relayer request\n * @returns Promise resolving to operation-specific response\n *\n * @category Server\n * @example\n * ```typescript\n * // In your server endpoint (Next.js example):\n * import { handleRelayerOperation } from '@opendatalabs/vana-sdk/node';\n *\n * export async function POST(request: NextRequest) {\n * try {\n * const body = await request.json();\n * const vana = getServerVanaInstance(); // Your server SDK instance\n *\n * const result = await handleRelayerOperation(vana, body);\n *\n * return NextResponse.json(result);\n * } catch (error) {\n * return NextResponse.json(\n * { error: error.message },\n * { status: 500 }\n * );\n * }\n * }\n * ```\n */\nexport async function handleRelayerOperation(\n sdk: VanaInstance,\n request: UnifiedRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n // Handle signed operations (EIP-712)\n if (request.type === \"signed\") {\n return handleSignedOperation(sdk, request);\n }\n\n // Handle direct operations (non-signed)\n return handleDirectOperation(sdk, request);\n}\n\n/**\n * Handle EIP-712 signed operations with full type safety\n */\nasync function handleSignedOperation(\n sdk: VanaInstance,\n request: SignedRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n const { typedData, signature, expectedUserAddress } = request;\n\n // Step 1: Verify the signature (security check)\n let recoveredAddress: `0x${string}`;\n try {\n recoveredAddress = await recoverTypedDataAddress({\n domain: {\n ...typedData.domain,\n chainId: typedData.domain.chainId\n ? BigInt(typedData.domain.chainId)\n : undefined,\n },\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n } catch (error) {\n // Handle signature verification errors\n throw new SignatureError(\n `Signature verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Optional security check: Verify the signer matches expected address\n if (expectedUserAddress) {\n const normalizedExpected = getAddress(expectedUserAddress);\n const normalizedSigner = getAddress(recoveredAddress);\n\n if (normalizedSigner !== normalizedExpected) {\n throw new SignatureError(\n `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected})`,\n );\n }\n }\n\n // Step 2: Route to appropriate SDK method based on primaryType\n // Using proper type narrowing instead of unsafe casts\n const result = await routeSignedOperation(sdk, typedData, signature);\n\n // Return the transaction hash with type\n return {\n type: \"signed\",\n hash: result.hash,\n };\n}\n\n/**\n * Route signed operations to the appropriate SDK method with type safety\n */\nasync function routeSignedOperation(\n sdk: VanaInstance,\n typedData: GenericTypedData,\n signature: Hash,\n) {\n const primaryType = typedData.primaryType as TypedDataPrimaryType;\n\n // Type-safe routing based on primaryType\n switch (primaryType) {\n case \"Permission\":\n // TypeScript knows this is a Permission operation\n return sdk.permissions.submitSignedGrant(\n {\n ...typedData,\n primaryType: \"Permission\",\n } as PermissionGrantTypedData,\n signature,\n );\n\n case \"RevokePermission\":\n return sdk.permissions.submitSignedRevoke(\n {\n ...typedData,\n primaryType: \"RevokePermission\",\n } as RevokePermissionTypedData,\n signature,\n );\n\n case \"TrustServer\":\n return sdk.permissions.submitSignedTrustServer(\n {\n ...typedData,\n primaryType: \"TrustServer\",\n } as TrustServerTypedData,\n signature,\n );\n\n case \"AddServer\":\n return sdk.permissions.submitSignedAddAndTrustServer(\n {\n ...typedData,\n primaryType: \"AddServer\",\n } as AddAndTrustServerTypedData,\n signature,\n );\n\n case \"UntrustServer\":\n return sdk.permissions.submitSignedUntrustServer(\n {\n ...typedData,\n primaryType: \"UntrustServer\",\n } as GenericTypedData,\n signature,\n );\n\n case \"ServerFilesAndPermission\":\n return sdk.permissions.submitSignedAddServerFilesAndPermissions(\n {\n ...typedData,\n primaryType: \"ServerFilesAndPermission\",\n } as ServerFilesAndPermissionTypedData,\n signature,\n );\n\n // RegisterGrantee is commented out as it's not supported by smart contracts yet\n // case \"RegisterGrantee\":\n // return sdk.permissions.submitSignedRegisterGrantee(...);\n\n default:\n throw new Error(`Unsupported operation type: ${typedData.primaryType}`);\n }\n}\n\n/**\n * Handle direct (non-signed) operations\n */\nasync function handleDirectOperation(\n sdk: VanaInstance,\n request: DirectRelayerRequest,\n): Promise<UnifiedRelayerResponse> {\n switch (request.operation) {\n case \"submitFileAddition\": {\n const { url, userAddress } = request.params;\n\n // Use SDK to add file with no permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n [], // No permissions\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"submitFileAdditionWithPermissions\": {\n const { url, userAddress, permissions } = request.params;\n\n // Use SDK to add file with permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n permissions,\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"submitFileAdditionComplete\": {\n const { url, userAddress, permissions, schemaId, ownerAddress } =\n request.params;\n\n // Map permissions from relayer format to SDK format\n const sdkPermissions = permissions.map((p) => ({\n account: p.account,\n publicKey: p.key, // Map 'key' to 'publicKey'\n }));\n\n // Use SDK to add file with permissions and schema\n const result = await sdk.data.addFileWithPermissionsAndSchema(\n url,\n ownerAddress ?? userAddress,\n sdkPermissions,\n schemaId,\n );\n\n // Wait for transaction events to get fileId\n const eventData = await sdk.waitForTransactionEvents(result);\n const fileId = eventData.expectedEvents?.FileAdded?.fileId;\n\n if (!fileId) {\n throw new Error(\"Failed to get fileId from transaction events\");\n }\n\n return {\n type: \"direct\",\n result: {\n fileId: Number(fileId),\n transactionHash: result.hash,\n },\n };\n }\n\n case \"storeGrantFile\": {\n const grantFile = request.params;\n\n // Store grant file using SDK's data controller\n // Convert grant file to blob for storage\n const blob = new Blob([JSON.stringify(grantFile)], {\n type: \"application/json\",\n });\n\n // Upload using the data controller\n const result = await sdk.data.upload({\n content: blob,\n filename: `grant-${Date.now()}.json`,\n });\n\n return {\n type: \"direct\",\n result: { url: result.url },\n };\n }\n\n default: {\n // TypeScript exhaustiveness check - ensures all cases are handled at compile time\n const exhaustiveCheck: never = request;\n // Return exhaustiveCheck to satisfy TypeScript while throwing an error\n // This should never be reached if all cases are handled\n return exhaustiveCheck;\n }\n }\n}\n\n// Legacy handler export - DEPRECATED\n// TODO: Remove in next major version\n// Migration guide: Use handleRelayerOperation instead\nexport { handleRelayerRequest } from \"./handler\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,oBAA+B;AAC/B,kBAA+D;AAqT/D,qBAAqC;AAlRrC,eAAsB,uBACpB,KACA,SACiC;AAEjC,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO,sBAAsB,KAAK,OAAO;AAAA,EAC3C;AAGA,SAAO,sBAAsB,KAAK,OAAO;AAC3C;AAKA,eAAe,sBACb,KACA,SACiC;AACjC,QAAM,EAAE,WAAW,WAAW,oBAAoB,IAAI;AAGtD,MAAI;AACJ,MAAI;AACF,uBAAmB,UAAM,qCAAwB;AAAA,MAC/C,QAAQ;AAAA,QACN,GAAG,UAAU;AAAA,QACb,SAAS,UAAU,OAAO,UACtB,OAAO,UAAU,OAAO,OAAO,IAC/B;AAAA,MACN;AAAA,MACA,OAAO,UAAU;AAAA,MACjB,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AAEd,UAAM,IAAI;AAAA,MACR,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IAC5F;AAAA,EACF;AAGA,MAAI,qBAAqB;AACvB,UAAM,yBAAqB,wBAAW,mBAAmB;AACzD,UAAM,uBAAmB,wBAAW,gBAAgB;AAEpD,QAAI,qBAAqB,oBAAoB;AAC3C,YAAM,IAAI;AAAA,QACR,2DAA2D,gBAAgB,2CAA2C,kBAAkB;AAAA,MAC1I;AAAA,IACF;AAAA,EACF;AAIA,QAAM,SAAS,MAAM,qBAAqB,KAAK,WAAW,SAAS;AAGnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,EACf;AACF;AAKA,eAAe,qBACb,KACA,WACA,WACA;AACA,QAAM,cAAc,UAAU;AAG9B,UAAQ,aAAa;AAAA,IACnB,KAAK;AAEH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO,IAAI,YAAY;AAAA,QACrB;AAAA,UACE,GAAG;AAAA,UACH,aAAa;AAAA,QACf;AAAA,QACA;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,IAMF;AACE,YAAM,IAAI,MAAM,+BAA+B,UAAU,WAAW,EAAE;AAAA,EAC1E;AACF;AAKA,eAAe,sBACb,KACA,SACiC;AACjC,UAAQ,QAAQ,WAAW;AAAA,IACzB,KAAK,sBAAsB;AACzB,YAAM,EAAE,KAAK,YAAY,IAAI,QAAQ;AAGrC,YAAM,SAAS,MAAM,IAAI,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,QACA,CAAC;AAAA;AAAA,MACH;AAGA,YAAM,YAAY,MAAM,IAAI,yBAAyB,MAAM;AAC3D,YAAM,SAAS,UAAU,gBAAgB,WAAW;AAEpD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,QAAQ,OAAO,MAAM;AAAA,UACrB,iBAAiB,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,qCAAqC;AACxC,YAAM,EAAE,KAAK,aAAa,YAAY,IAAI,QAAQ;AAGlD,YAAM,SAAS,MAAM,IAAI,KAAK;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,IAAI,yBAAyB,MAAM;AAC3D,YAAM,SAAS,UAAU,gBAAgB,WAAW;AAEpD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,QAAQ,OAAO,MAAM;AAAA,UACrB,iBAAiB,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,8BAA8B;AACjC,YAAM,EAAE,KAAK,aAAa,aAAa,UAAU,aAAa,IAC5D,QAAQ;AAGV,YAAM,iBAAiB,YAAY,IAAI,CAAC,OAAO;AAAA,QAC7C,SAAS,EAAE;AAAA,QACX,WAAW,EAAE;AAAA;AAAA,MACf,EAAE;AAGF,YAAM,SAAS,MAAM,IAAI,KAAK;AAAA,QAC5B;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,IAAI,yBAAyB,MAAM;AAC3D,YAAM,SAAS,UAAU,gBAAgB,WAAW;AAEpD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,QAAQ,OAAO,MAAM;AAAA,UACrB,iBAAiB,OAAO;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB;AACrB,YAAM,YAAY,QAAQ;AAI1B,YAAM,OAAO,IAAI,KAAK,CAAC,KAAK,UAAU,SAAS,CAAC,GAAG;AAAA,QACjD,MAAM;AAAA,MACR,CAAC;AAGD,YAAM,SAAS,MAAM,IAAI,KAAK,OAAO;AAAA,QACnC,SAAS;AAAA,QACT,UAAU,SAAS,KAAK,IAAI,CAAC;AAAA,MAC/B,CAAC;AAED,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,OAAO,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,IAEA,SAAS;AAEP,YAAM,kBAAyB;AAG/B,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/server/relayerHandler.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"uuid\";\nimport type { VanaInstance } from \"../index.node\";\nimport type {\n UnifiedRelayerRequest,\n UnifiedRelayerResponse,\n DirectRelayerRequest,\n} from \"../types/relayer\";\nimport type {\n TransactionResult,\n TransactionOptions,\n IOperationStore,\n} from \"../types\";\nimport type { Contract, Fn } from \"../generated/event-types\";\nimport type {\n GenericTypedData,\n PermissionGrantTypedData,\n RevokePermissionTypedData,\n TrustServerTypedData,\n AddAndTrustServerTypedData,\n ServerFilesAndPermissionTypedData,\n TypedDataPrimaryType,\n} from \"../types/permissions\";\nimport { SignatureError } from \"../errors\";\nimport { recoverTypedDataAddress, getAddress, type Hash } from \"viem\";\n\n/**\n * Universal handler for all relayer operations.\n *\n * This function processes both EIP-712 signed operations and direct operations,\n * automatically routing to the appropriate SDK methods.\n *\n * @param sdk - Initialized Vana SDK instance\n * @param request - The unified relayer request\n * @returns Promise resolving to operation-specific response\n *\n * @category Server\n * @example\n * ```typescript\n * // In your server endpoint (Next.js example):\n * import { handleRelayerOperation } from '@opendatalabs/vana-sdk/node';\n *\n * export async function POST(request: NextRequest) {\n * try {\n * const body = await request.json();\n * const vana = getServerVanaInstance(); // Your server SDK instance\n *\n * const result = await handleRelayerOperation(vana, body);\n *\n * return NextResponse.json(result);\n * } catch (error) {\n * return NextResponse.json(\n * { error: error.message },\n * { status: 500 }\n * );\n * }\n * }\n * ```\n */\nexport async function handleRelayerOperation(\n sdk: VanaInstance, // The public signature is generic\n request: UnifiedRelayerRequest,\n options?: TransactionOptions,\n): Promise<UnifiedRelayerResponse> {\n // Type assertion required: VanaInstance public interface doesn't expose operationStore\n // to maintain API simplicity, but server-side handler needs access for stateful mode.\n // The factory overloads guarantee this is safe for relayer-configured instances.\n // TODO(TYPES): Consider exposing operationStore through a server-specific interface\n\n const store = (sdk as any).operationStore as IOperationStore | undefined;\n\n // --- STATEFUL (ROBUST) MODE ---\n // This block executes ONLY if the developer provided an IOperationStore.\n if (store) {\n if (request.type === \"status_check\") {\n const state = await store.get(request.operationId);\n if (!state) return { type: \"error\", error: \"Operation not found\" };\n if (state.status === \"confirmed\")\n return {\n type: \"confirmed\",\n hash: state.transactionHash,\n receipt: state.finalReceipt,\n };\n if (state.status === \"failed\")\n return { type: \"error\", error: state.error ?? \"Operation failed\" };\n return { type: \"pending\", operationId: request.operationId };\n }\n\n const operationId = uuidv4();\n try {\n const txResult = await routeAndExecuteRequest(sdk, request, options);\n\n // We only store state for operations that result in a transaction.\n if (\"hash\" in txResult) {\n await store.set(operationId, {\n status: \"pending\",\n transactionHash: txResult.hash,\n originalRequest: request,\n nonce: options?.nonce,\n retryCount: 0,\n lastAttemptedGas: {\n maxFeePerGas: options?.maxFeePerGas?.toString(),\n maxPriorityFeePerGas: options?.maxPriorityFeePerGas?.toString(),\n },\n submittedAt: Date.now(),\n });\n return { type: \"pending\", operationId };\n } else {\n // This handles non-transactional direct operations like `storeGrantFile`\n return { type: \"direct_result_untracked\", result: txResult };\n }\n } catch (e) {\n const error =\n e instanceof Error\n ? e\n : new Error(\"Unknown error during operation submission\");\n // We don't create a persistent error state for an initial submission failure.\n return { type: \"error\", error: error.message };\n }\n }\n\n // --- STATELESS (SIMPLE) MODE ---\n // This block executes if no IOperationStore was provided. Fire-and-forget.\n else {\n if (request.type === \"status_check\") {\n return {\n type: \"error\",\n error: \"Stateless relayer does not support operation status checks.\",\n };\n }\n\n try {\n const txResult = await routeAndExecuteRequest(sdk, request, options);\n\n // For stateless relayers, we can only handle transactional results.\n if (\"hash\" in txResult) {\n return { type: \"submitted\", hash: txResult.hash };\n } else {\n // Non-transactional direct operations can return their result directly.\n return { type: \"direct_result_untracked\", result: txResult };\n }\n } catch (e) {\n const error =\n e instanceof Error\n ? e\n : new Error(\"Unknown error during operation submission\");\n return { type: \"error\", error: error.message };\n }\n }\n}\n\n/**\n * Helper function to route and execute requests.\n * This simply delegates to the appropriate handler based on request type.\n */\nasync function routeAndExecuteRequest(\n sdk: VanaInstance,\n request: UnifiedRelayerRequest,\n options?: TransactionOptions,\n): Promise<TransactionResult<Contract, Fn<Contract>> | { url: string }> {\n if (request.type === \"signed\") {\n const { typedData, signature, expectedUserAddress } = request;\n\n // Step 1: Verify the signature (security check)\n let recoveredAddress: `0x${string}`;\n try {\n recoveredAddress = await recoverTypedDataAddress({\n domain: {\n ...typedData.domain,\n chainId: typedData.domain.chainId\n ? BigInt(typedData.domain.chainId)\n : undefined,\n },\n types: typedData.types,\n primaryType: typedData.primaryType,\n message: typedData.message as unknown as Record<string, unknown>,\n signature,\n });\n } catch (error) {\n // Handle signature verification errors\n throw new SignatureError(\n `Signature verification failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n\n // Optional security check: Verify the signer matches expected address\n if (expectedUserAddress) {\n const normalizedExpected = getAddress(expectedUserAddress);\n const normalizedSigner = getAddress(recoveredAddress);\n\n if (normalizedSigner !== normalizedExpected) {\n throw new SignatureError(\n `Security verification failed: Recovered signer address (${normalizedSigner}) does not match expected user address (${normalizedExpected})`,\n );\n }\n }\n\n // Step 2: Route to appropriate SDK method based on primaryType\n return await routeSignedOperation(sdk, typedData, signature, options);\n } else if (request.type === \"direct\") {\n return await handleDirectOperation(sdk, request, options);\n }\n throw new Error(\"Invalid request type for execution\");\n}\n\n/**\n * Route signed operations to the appropriate SDK method with type safety.\n *\n * Returns a TransactionResult for one of the valid contracts and their functions.\n * Using Contract and Fn<Contract> ensures we're working with known contract types.\n */\nasync function routeSignedOperation(\n sdk: VanaInstance,\n typedData: GenericTypedData,\n signature: Hash,\n options?: TransactionOptions,\n): Promise<TransactionResult<Contract, Fn<Contract>>> {\n // Validate primaryType before casting\n const validPrimaryTypes: readonly TypedDataPrimaryType[] = [\n \"Permission\",\n \"RevokePermission\",\n \"TrustServer\",\n \"AddServer\",\n \"UntrustServer\",\n \"ServerFilesAndPermission\",\n ] as const;\n\n if (\n !validPrimaryTypes.includes(typedData.primaryType as TypedDataPrimaryType)\n ) {\n throw new Error(\n `Unsupported operation type: ${typedData.primaryType}. ` +\n `Supported types: ${validPrimaryTypes.join(\", \")}`,\n );\n }\n\n const primaryType = typedData.primaryType as TypedDataPrimaryType;\n\n // Type-safe routing based on primaryType\n switch (primaryType) {\n case \"Permission\":\n // TypeScript knows this is a Permission operation\n return sdk.permissions.submitSignedGrant(\n {\n ...typedData,\n primaryType: \"Permission\",\n } as PermissionGrantTypedData,\n signature,\n options,\n );\n\n case \"RevokePermission\":\n return sdk.permissions.submitSignedRevoke(\n {\n ...typedData,\n primaryType: \"RevokePermission\",\n } as RevokePermissionTypedData,\n signature,\n options,\n );\n\n case \"TrustServer\":\n // Note: TrustServer operation is deprecated but still supported for backwards compatibility\n // New implementations should use AddServer (AddAndTrustServer) instead\n return sdk.permissions.submitSignedTrustServer(\n {\n ...typedData,\n primaryType: \"TrustServer\",\n } as TrustServerTypedData,\n signature,\n options,\n );\n\n case \"AddServer\":\n return sdk.permissions.submitSignedAddAndTrustServer(\n {\n ...typedData,\n primaryType: \"AddServer\",\n } as AddAndTrustServerTypedData,\n signature,\n options,\n );\n\n case \"UntrustServer\":\n return sdk.permissions.submitSignedUntrustServer(\n {\n ...typedData,\n primaryType: \"UntrustServer\",\n } as GenericTypedData,\n signature,\n options,\n );\n\n case \"ServerFilesAndPermission\":\n return sdk.permissions.submitSignedAddServerFilesAndPermissions(\n {\n ...typedData,\n primaryType: \"ServerFilesAndPermission\",\n } as ServerFilesAndPermissionTypedData,\n signature,\n options,\n );\n\n // TODO: RegisterGrantee with signature is not supported until\n // DataPortabilityGrantees contract adds registerGranteeWithSignature function\n // case \"RegisterGrantee\":\n // return sdk.permissions.submitSignedRegisterGrantee(...);\n\n default:\n // This should never be reached due to validation above, but TypeScript requires it\n throw new Error(\n `Unsupported operation type: ${typedData.primaryType}. ` +\n `Supported types: Permission, RevokePermission, TrustServer, AddServer, UntrustServer, ServerFilesAndPermission`,\n );\n }\n}\n\n/**\n * Handle direct (non-signed) operations\n */\nasync function handleDirectOperation(\n sdk: VanaInstance,\n request: DirectRelayerRequest,\n options?: TransactionOptions,\n): Promise<TransactionResult<Contract, Fn<Contract>> | { url: string }> {\n switch (request.operation) {\n case \"submitFileAddition\": {\n const { url, userAddress } = request.params;\n\n // Use SDK to add file with no permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n [], // No permissions\n options,\n );\n\n // Return the TransactionResult directly\n return result;\n }\n\n case \"submitFileAdditionWithPermissions\": {\n const { url, userAddress, permissions } = request.params;\n\n // Use SDK to add file with permissions\n const result = await sdk.data.addFileWithPermissions(\n url,\n userAddress,\n permissions,\n options,\n );\n\n // Return the TransactionResult directly\n return result;\n }\n\n case \"submitFileAdditionComplete\": {\n const { url, userAddress, permissions, schemaId, ownerAddress } =\n request.params;\n\n // Permissions are already encrypted, use the appropriate method\n // No mapping needed - permissions already have { account, key } format\n const result = await sdk.data.addFileWithEncryptedPermissionsAndSchema(\n url,\n ownerAddress ?? userAddress,\n permissions, // Already in correct format with encrypted 'key' field\n schemaId,\n options,\n );\n\n // Return the TransactionResult directly\n return result;\n }\n\n case \"storeGrantFile\": {\n const grantFile = request.params;\n\n // Store grant file using SDK's data controller\n // Convert grant file to blob for storage\n const blob = new Blob([JSON.stringify(grantFile)], {\n type: \"application/json\",\n });\n\n // Upload using the data controller\n const result = await sdk.data.upload({\n content: blob,\n filename: `grant-${Date.now()}.json`,\n });\n\n return { url: result.url };\n }\n\n default: {\n // TypeScript exhaustiveness check - ensures all cases are handled at compile time\n const exhaustiveCheck: never = request;\n // Return exhaustiveCheck to satisfy TypeScript while throwing an error\n // This should never be reached if all cases are handled\n return exhaustiveCheck;\n }\n }\n}\n"],"mappings":"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","names":["uuidv4"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { VanaInstance } from "../index.node";
|
|
2
2
|
import type { UnifiedRelayerRequest, UnifiedRelayerResponse } from "../types/relayer";
|
|
3
|
+
import type { TransactionOptions } from "../types";
|
|
3
4
|
/**
|
|
4
5
|
* Universal handler for all relayer operations.
|
|
5
6
|
*
|
|
@@ -33,5 +34,5 @@ import type { UnifiedRelayerRequest, UnifiedRelayerResponse } from "../types/rel
|
|
|
33
34
|
* }
|
|
34
35
|
* ```
|
|
35
36
|
*/
|
|
36
|
-
export declare function handleRelayerOperation(sdk: VanaInstance,
|
|
37
|
-
|
|
37
|
+
export declare function handleRelayerOperation(sdk: VanaInstance, // The public signature is generic
|
|
38
|
+
request: UnifiedRelayerRequest, options?: TransactionOptions): Promise<UnifiedRelayerResponse>;
|