@opendatalabs/vana-sdk 0.1.0-alpha.376e2fd → 0.1.0-alpha.52b50da

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.
@@ -29,6 +29,28 @@ function parseEncryptedDataBuffer(encryptedBuffer) {
29
29
  mac: encryptedBuffer.slice(-32)
30
30
  };
31
31
  }
32
+ function toBase64(str) {
33
+ if (typeof Buffer !== "undefined") {
34
+ return Buffer.from(str, "utf8").toString("base64");
35
+ } else if (typeof btoa !== "undefined") {
36
+ return btoa(str);
37
+ } else {
38
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
39
+ let result = "";
40
+ let i = 0;
41
+ while (i < str.length) {
42
+ const a = str.charCodeAt(i++);
43
+ const b = i < str.length ? str.charCodeAt(i++) : 0;
44
+ const c = i < str.length ? str.charCodeAt(i++) : 0;
45
+ const bitmap = a << 16 | b << 8 | c;
46
+ result += chars.charAt(bitmap >> 18 & 63);
47
+ result += chars.charAt(bitmap >> 12 & 63);
48
+ result += i - 2 < str.length ? chars.charAt(bitmap >> 6 & 63) : "=";
49
+ result += i - 1 < str.length ? chars.charAt(bitmap & 63) : "=";
50
+ }
51
+ return result;
52
+ }
53
+ }
32
54
  var init_crypto_utils = __esm({
33
55
  "src/platform/shared/crypto-utils.ts"() {
34
56
  "use strict";
@@ -79,7 +101,7 @@ var init_error_utils = __esm({
79
101
 
80
102
  // src/platform/browser.ts
81
103
  import * as openpgp from "openpgp";
82
- var BrowserCryptoAdapter, BrowserPGPAdapter, BrowserHttpAdapter, BrowserPlatformAdapter, browserPlatformAdapter;
104
+ var BrowserCryptoAdapter, BrowserPGPAdapter, BrowserHttpAdapter, BrowserCacheAdapter, BrowserPlatformAdapter, browserPlatformAdapter;
83
105
  var init_browser = __esm({
84
106
  "src/platform/browser.ts"() {
85
107
  "use strict";
@@ -258,15 +280,62 @@ var init_browser = __esm({
258
280
  return fetch(url, options);
259
281
  }
260
282
  };
283
+ BrowserCacheAdapter = class {
284
+ constructor() {
285
+ __publicField(this, "prefix", "vana_cache_");
286
+ }
287
+ get(key) {
288
+ try {
289
+ if (typeof sessionStorage === "undefined") {
290
+ return null;
291
+ }
292
+ return sessionStorage.getItem(this.prefix + key);
293
+ } catch {
294
+ return null;
295
+ }
296
+ }
297
+ set(key, value) {
298
+ try {
299
+ if (typeof sessionStorage !== "undefined") {
300
+ sessionStorage.setItem(this.prefix + key, value);
301
+ }
302
+ } catch {
303
+ }
304
+ }
305
+ delete(key) {
306
+ try {
307
+ if (typeof sessionStorage !== "undefined") {
308
+ sessionStorage.removeItem(this.prefix + key);
309
+ }
310
+ } catch {
311
+ }
312
+ }
313
+ clear() {
314
+ try {
315
+ if (typeof sessionStorage === "undefined") {
316
+ return;
317
+ }
318
+ const keys = Object.keys(sessionStorage);
319
+ for (const key of keys) {
320
+ if (key.startsWith(this.prefix)) {
321
+ sessionStorage.removeItem(key);
322
+ }
323
+ }
324
+ } catch {
325
+ }
326
+ }
327
+ };
261
328
  BrowserPlatformAdapter = class {
262
329
  constructor() {
263
330
  __publicField(this, "crypto");
264
331
  __publicField(this, "pgp");
265
332
  __publicField(this, "http");
333
+ __publicField(this, "cache");
266
334
  __publicField(this, "platform", "browser");
267
335
  this.crypto = new BrowserCryptoAdapter();
268
336
  this.pgp = new BrowserPGPAdapter();
269
337
  this.http = new BrowserHttpAdapter();
338
+ this.cache = new BrowserCacheAdapter();
270
339
  }
271
340
  };
272
341
  browserPlatformAdapter = new BrowserPlatformAdapter();
@@ -800,276 +869,45 @@ var PermissionError = class extends VanaError {
800
869
  }
801
870
  };
802
871
 
803
- // src/config/addresses.ts
804
- var CONTRACTS = {
805
- // Core Platform Contracts
806
- DataPermissions: {
807
- addresses: {
808
- 14800: "0x31fb1D48f6B2265A4cAD516BC39E96a18fb7c8de",
809
- 1480: "0x31fb1D48f6B2265A4cAD516BC39E96a18fb7c8de"
810
- }
811
- },
812
- DataRegistry: {
813
- addresses: {
814
- 14800: "0x8C8788f98385F6ba1adD4234e551ABba0f82Cb7C",
815
- 1480: "0x8C8788f98385F6ba1adD4234e551ABba0f82Cb7C"
816
- }
817
- },
818
- TeePoolPhala: {
819
- addresses: {
820
- 14800: "0xE8EC6BD73b23Ad40E6B9a6f4bD343FAc411bD99A",
821
- 1480: "0xE8EC6BD73b23Ad40E6B9a6f4bD343FAc411bD99A"
822
- }
823
- },
824
- ComputeEngine: {
825
- addresses: {
826
- 14800: "0xb2BFe33FA420c45F1Cf1287542ad81ae935447bd",
827
- 1480: "0xb2BFe33FA420c45F1Cf1287542ad81ae935447bd"
828
- }
829
- },
830
- // Data Access Infrastructure
831
- DataRefinerRegistry: {
832
- addresses: {
833
- 14800: "0x93c3EF89369fDcf08Be159D9DeF0F18AB6Be008c",
834
- 1480: "0x93c3EF89369fDcf08Be159D9DeF0F18AB6Be008c"
835
- }
836
- },
837
- QueryEngine: {
838
- addresses: {
839
- 14800: "0xd25Eb66EA2452cf3238A2eC6C1FD1B7F5B320490",
840
- 1480: "0xd25Eb66EA2452cf3238A2eC6C1FD1B7F5B320490"
841
- }
842
- },
843
- VanaTreasury: {
844
- addresses: {
845
- 14800: "0x94a1E56e555ac48d092f490fB10CDFaB434915eD",
846
- 1480: "0x94a1E56e555ac48d092f490fB10CDFaB434915eD"
847
- }
848
- },
849
- ComputeInstructionRegistry: {
850
- addresses: {
851
- 14800: "0x5786B12b4c6Ba2bFAF0e77Ed30Bf6d32805563A5",
852
- 1480: "0x5786B12b4c6Ba2bFAF0e77Ed30Bf6d32805563A5"
853
- }
854
- },
855
- // TEE Pool Variants
856
- TeePoolEphemeralStandard: {
857
- addresses: {
858
- 14800: "0xe124bae846D5ec157f75Bd9e68ca87C4d2AB835A",
859
- 1480: "0xe124bae846D5ec157f75Bd9e68ca87C4d2AB835A"
860
- }
861
- },
862
- TeePoolPersistentStandard: {
863
- addresses: {
864
- 14800: "0xe8bB8d0629651Cf33e0845d743976Dc1f0971d76",
865
- 1480: "0xe8bB8d0629651Cf33e0845d743976Dc1f0971d76"
866
- }
867
- },
868
- TeePoolPersistentGpu: {
869
- addresses: {
870
- 14800: "0x1c346Cd74f8551f8fa13f3F4b6b8dAE22338E6a9",
871
- 1480: "0x1c346Cd74f8551f8fa13f3F4b6b8dAE22338E6a9"
872
- }
873
- },
874
- TeePoolDedicatedStandard: {
875
- addresses: {
876
- 14800: "0xf024b7ac5E8417416f53B41ecfa58C8e9396687d",
877
- 1480: "0xf024b7ac5E8417416f53B41ecfa58C8e9396687d"
878
- }
879
- },
880
- TeePoolDedicatedGpu: {
881
- addresses: {
882
- 14800: "0xB1686FA9620bBf851714d1cB47b8a4Bf4664644E",
883
- 1480: "0xB1686FA9620bBf851714d1cB47b8a4Bf4664644E"
884
- }
885
- },
886
- // DLP Reward System
887
- VanaEpoch: {
888
- addresses: {
889
- 14800: "0x2063cFF0609D59bCCc196E20Eb58A8696a6b15A0",
890
- 1480: "0x2063cFF0609D59bCCc196E20Eb58A8696a6b15A0"
891
- }
892
- },
893
- DLPRegistry: {
894
- addresses: {
895
- 14800: "0x4D59880a924526d1dD33260552Ff4328b1E18a43",
896
- 1480: "0x4D59880a924526d1dD33260552Ff4328b1E18a43"
897
- }
898
- },
899
- DLPRegistryTreasury: {
900
- addresses: {
901
- 14800: "0xb12ce1d27bEeFe39b6F0110b1AB77C21Aa0c9F9a",
902
- 1480: "0xb12ce1d27bEeFe39b6F0110b1AB77C21Aa0c9F9a"
903
- }
904
- },
905
- DLPPerformance: {
906
- addresses: {
907
- 14800: "0x847715C7DB37cF286611182Be0bD333cbfa29cc1",
908
- 1480: "0x847715C7DB37cF286611182Be0bD333cbfa29cc1"
909
- }
910
- },
911
- DLPRewardDeployer: {
912
- addresses: {
913
- 14800: "0xEFD0F9Ba9De70586b7c4189971cF754adC923B04",
914
- 1480: "0xEFD0F9Ba9De70586b7c4189971cF754adC923B04"
915
- }
916
- },
917
- DLPRewardDeployerTreasury: {
918
- addresses: {
919
- 14800: "0xb547ca8Fe4990fe330FeAeb1C2EBb42F925Af5b8",
920
- 1480: "0xb547ca8Fe4990fe330FeAeb1C2EBb42F925Af5b8"
921
- }
922
- },
923
- DLPRewardSwap: {
924
- addresses: {
925
- 14800: "0x7c6862C46830F0fc3bF3FF509EA1bD0EE7267fB0",
926
- 1480: "0x7c6862C46830F0fc3bF3FF509EA1bD0EE7267fB0"
927
- }
928
- },
929
- SwapHelper: {
930
- addresses: {
931
- 14800: "0x55D5e6F73326315bF2E091e97F04f0770e5C54e2",
932
- 1480: "0x55D5e6F73326315bF2E091e97F04f0770e5C54e2"
933
- }
934
- },
935
- // VanaPool (Staking)
936
- VanaPoolStaking: {
937
- addresses: {
938
- 14800: "0x641C18E2F286c86f96CE95C8ec1EB9fC0415Ca0e",
939
- 1480: "0x641C18E2F286c86f96CE95C8ec1EB9fC0415Ca0e"
940
- }
941
- },
942
- VanaPoolEntity: {
943
- addresses: {
944
- 14800: "0x44f20490A82e1f1F1cC25Dd3BA8647034eDdce30",
945
- 1480: "0x44f20490A82e1f1F1cC25Dd3BA8647034eDdce30"
946
- }
947
- },
948
- VanaPoolTreasury: {
949
- addresses: {
950
- 14800: "0x143BE72CF2541604A7691933CAccd6D9cC17c003",
951
- 1480: "0x143BE72CF2541604A7691933CAccd6D9cC17c003"
952
- }
953
- },
954
- // DLP Deployment Contracts
955
- DAT: {
956
- addresses: {
957
- 14800: "0xA706b93ccED89f13340673889e29F0a5cd84212d",
958
- 1480: "0xA706b93ccED89f13340673889e29F0a5cd84212d"
959
- }
960
- },
961
- DATFactory: {
962
- addresses: {
963
- 14800: "0x40f8bccF35a75ecef63BC3B1B3E06ffEB9220644",
964
- 1480: "0x40f8bccF35a75ecef63BC3B1B3E06ffEB9220644"
965
- }
966
- },
967
- DATPausable: {
968
- addresses: {
969
- 14800: "0xe69FE86f0B95cC2f8416Fe22815c85DC8887e76e",
970
- 1480: "0xe69FE86f0B95cC2f8416Fe22815c85DC8887e76e"
971
- }
972
- },
973
- DATVotes: {
974
- addresses: {
975
- 14800: "0xaE04c8A77E9B27869eb563720524A9aE0baf1831",
976
- 1480: "0xaE04c8A77E9B27869eb563720524A9aE0baf1831"
977
- }
978
- },
979
- // Utility Contracts (no ABIs in SDK)
980
- Multicall3: {
981
- addresses: {
982
- 14800: "0xD8d2dFca27E8797fd779F8547166A2d3B29d360E",
983
- 1480: "0xD8d2dFca27E8797fd779F8547166A2d3B29d360E"
984
- }
985
- },
986
- Multisend: {
987
- addresses: {
988
- 14800: "0x8807e8BCDFbaA8c2761760f3FBA37F6f7F2C5b2d",
989
- 1480: "0x8807e8BCDFbaA8c2761760f3FBA37F6f7F2C5b2d"
990
- }
991
- }
992
- };
993
- var LEGACY_CONTRACTS = {
994
- // DEPRECATED: Original Intel SGX TeePool (PRO-347)
995
- TeePool: {
996
- addresses: {
997
- 14800: "0x3c92fD91639b41f13338CE62f19131e7d19eaa0D",
998
- 1480: "0x3c92fD91639b41f13338CE62f19131e7d19eaa0D"
999
- }
1000
- },
1001
- // DEPRECATED: DLPRoot system (replaced by VanaPool + DLPRewards)
1002
- DLPRootEpoch: {
1003
- addresses: {
1004
- 14800: "0xc3d176cF6BccFCB9225b53B87a95147218e1537F",
1005
- 1480: "0xc3d176cF6BccFCB9225b53B87a95147218e1537F"
1006
- }
1007
- },
1008
- DLPRootCore: {
1009
- addresses: {
1010
- 14800: "0x0aBa5e28228c323A67712101d61a54d4ff5720FD",
1011
- 1480: "0x0aBa5e28228c323A67712101d61a54d4ff5720FD"
1012
- }
1013
- },
1014
- DLPRoot: {
1015
- addresses: {
1016
- 14800: "0xff14346dF2B8Fd0c95BF34f1c92e49417b508AD5",
1017
- 1480: "0xff14346dF2B8Fd0c95BF34f1c92e49417b508AD5"
1018
- }
1019
- },
1020
- DLPRootMetrics: {
1021
- addresses: {
1022
- 14800: "0xbb532917B6407c060Afd9Cb7d53527eCb91d6662",
1023
- 1480: "0xbb532917B6407c060Afd9Cb7d53527eCb91d6662"
1024
- }
1025
- },
1026
- DLPRootStakesTreasury: {
1027
- addresses: {
1028
- 14800: "0x52c3260ED5C235fcA43524CF508e29c897318775",
1029
- 1480: "0x52c3260ED5C235fcA43524CF508e29c897318775"
1030
- }
1031
- },
1032
- DLPRootRewardsTreasury: {
1033
- addresses: {
1034
- 14800: "0xDBFb6B8b9E2eCAEbdE64d665cD553dB81e524479",
1035
- 1480: "0xDBFb6B8b9E2eCAEbdE64d665cD553dB81e524479"
1036
- }
1037
- }
1038
- };
1039
- var CONTRACT_ADDRESSES = {
1040
- 14800: Object.fromEntries(
1041
- Object.entries(CONTRACTS).map(([name, info]) => [name, info.addresses[14800]]).filter(([, addr]) => addr)
1042
- ),
1043
- 1480: Object.fromEntries(
1044
- Object.entries(CONTRACTS).map(([name, info]) => [name, info.addresses[1480]]).filter(([, addr]) => addr)
1045
- )
1046
- };
1047
- var UTILITY_ADDRESSES = {
1048
- 14800: {
1049
- Multicall3: CONTRACTS.Multicall3.addresses[14800],
1050
- Multisend: CONTRACTS.Multisend.addresses[14800]
1051
- },
1052
- 1480: {
1053
- Multicall3: CONTRACTS.Multicall3.addresses[1480],
1054
- Multisend: CONTRACTS.Multisend.addresses[1480]
1055
- }
1056
- };
1057
- var LEGACY_ADDRESSES = {
1058
- 14800: Object.fromEntries(
1059
- Object.entries(LEGACY_CONTRACTS).map(([name, info]) => [name, info.addresses[14800]]).filter(([, addr]) => addr)
1060
- ),
1061
- 1480: Object.fromEntries(
1062
- Object.entries(LEGACY_CONTRACTS).map(([name, info]) => [name, info.addresses[1480]]).filter(([, addr]) => addr)
1063
- )
1064
- };
1065
- var getContractAddress = (chainId, contract) => {
1066
- const contractAddress = CONTRACT_ADDRESSES[chainId]?.[contract];
1067
- if (!contractAddress) {
1068
- throw new Error(
1069
- `Contract address not found for ${contract} on chain ${chainId}`
1070
- );
872
+ // src/utils/transactionParsing.ts
873
+ import { parseEventLogs } from "viem";
874
+
875
+ // src/config/eventMappings.ts
876
+ var EVENT_MAPPINGS = {
877
+ // Permission operations
878
+ grant: {
879
+ contract: "DataPermissions",
880
+ event: "PermissionAdded"
881
+ },
882
+ revoke: {
883
+ contract: "DataPermissions",
884
+ event: "PermissionRevoked"
885
+ },
886
+ trustServer: {
887
+ contract: "DataPermissions",
888
+ event: "ServerTrusted"
889
+ },
890
+ untrustServer: {
891
+ contract: "DataPermissions",
892
+ event: "ServerUntrusted"
893
+ },
894
+ // Data registry operations
895
+ addFile: {
896
+ contract: "DataRegistry",
897
+ event: "FileAdded"
898
+ },
899
+ addRefinement: {
900
+ contract: "DataRegistry",
901
+ event: "RefinementAdded"
902
+ },
903
+ updateRefinement: {
904
+ contract: "DataRegistry",
905
+ event: "RefinementUpdated"
906
+ },
907
+ addFilePermission: {
908
+ contract: "DataRegistry",
909
+ event: "PermissionGranted"
1071
910
  }
1072
- return contractAddress;
1073
911
  };
1074
912
 
1075
913
  // src/abi/ComputeEngineImplementation.ts
@@ -33276,6 +33114,332 @@ function getAbi(contract) {
33276
33114
  return abi;
33277
33115
  }
33278
33116
 
33117
+ // src/utils/transactionParsing.ts
33118
+ async function parseTransactionResult(context, hash, operation) {
33119
+ const mapping = EVENT_MAPPINGS[operation];
33120
+ try {
33121
+ console.debug(`\u{1F50D} Parsing ${operation} transaction: ${hash}`);
33122
+ const receipt = await context.publicClient.waitForTransactionReceipt({
33123
+ hash,
33124
+ timeout: 3e4
33125
+ // 30 second timeout
33126
+ });
33127
+ console.debug(`\u2705 Transaction confirmed in block ${receipt.blockNumber}`);
33128
+ const abi = getAbi(mapping.contract);
33129
+ const events = parseEventLogs({
33130
+ logs: receipt.logs,
33131
+ abi,
33132
+ eventName: mapping.event,
33133
+ strict: true
33134
+ // Only return logs that conform to the ABI
33135
+ });
33136
+ if (events.length === 0) {
33137
+ throw new BlockchainError(
33138
+ `No ${mapping.event} event found in transaction ${hash}. Transaction may have failed or reverted.`
33139
+ );
33140
+ }
33141
+ if (events.length > 1) {
33142
+ console.warn(
33143
+ `\u26A0\uFE0F Multiple ${mapping.event} events found in transaction ${hash}. Using the first one.`
33144
+ );
33145
+ }
33146
+ const event = events[0];
33147
+ console.debug(`\u{1F389} Found ${mapping.event} event with args:`, event.args);
33148
+ return {
33149
+ ...event.args,
33150
+ transactionHash: hash,
33151
+ blockNumber: receipt.blockNumber,
33152
+ gasUsed: receipt.gasUsed
33153
+ };
33154
+ } catch (error) {
33155
+ if (error instanceof BlockchainError || error instanceof NetworkError) {
33156
+ throw error;
33157
+ }
33158
+ if (error instanceof Error && error.message.includes("timeout")) {
33159
+ throw new NetworkError(
33160
+ `Transaction ${hash} confirmation timeout after 30 seconds. The transaction may still be pending.`,
33161
+ error
33162
+ );
33163
+ }
33164
+ throw new BlockchainError(
33165
+ `Failed to parse ${operation} transaction ${hash}: ${error instanceof Error ? error.message : "Unknown error"}`,
33166
+ error
33167
+ );
33168
+ }
33169
+ }
33170
+
33171
+ // src/config/addresses.ts
33172
+ var CONTRACTS = {
33173
+ // Core Platform Contracts
33174
+ DataPermissions: {
33175
+ addresses: {
33176
+ 14800: "0x31fb1D48f6B2265A4cAD516BC39E96a18fb7c8de",
33177
+ 1480: "0x31fb1D48f6B2265A4cAD516BC39E96a18fb7c8de"
33178
+ }
33179
+ },
33180
+ DataRegistry: {
33181
+ addresses: {
33182
+ 14800: "0x8C8788f98385F6ba1adD4234e551ABba0f82Cb7C",
33183
+ 1480: "0x8C8788f98385F6ba1adD4234e551ABba0f82Cb7C"
33184
+ }
33185
+ },
33186
+ TeePoolPhala: {
33187
+ addresses: {
33188
+ 14800: "0xE8EC6BD73b23Ad40E6B9a6f4bD343FAc411bD99A",
33189
+ 1480: "0xE8EC6BD73b23Ad40E6B9a6f4bD343FAc411bD99A"
33190
+ }
33191
+ },
33192
+ ComputeEngine: {
33193
+ addresses: {
33194
+ 14800: "0xb2BFe33FA420c45F1Cf1287542ad81ae935447bd",
33195
+ 1480: "0xb2BFe33FA420c45F1Cf1287542ad81ae935447bd"
33196
+ }
33197
+ },
33198
+ // Data Access Infrastructure
33199
+ DataRefinerRegistry: {
33200
+ addresses: {
33201
+ 14800: "0x93c3EF89369fDcf08Be159D9DeF0F18AB6Be008c",
33202
+ 1480: "0x93c3EF89369fDcf08Be159D9DeF0F18AB6Be008c"
33203
+ }
33204
+ },
33205
+ QueryEngine: {
33206
+ addresses: {
33207
+ 14800: "0xd25Eb66EA2452cf3238A2eC6C1FD1B7F5B320490",
33208
+ 1480: "0xd25Eb66EA2452cf3238A2eC6C1FD1B7F5B320490"
33209
+ }
33210
+ },
33211
+ VanaTreasury: {
33212
+ addresses: {
33213
+ 14800: "0x94a1E56e555ac48d092f490fB10CDFaB434915eD",
33214
+ 1480: "0x94a1E56e555ac48d092f490fB10CDFaB434915eD"
33215
+ }
33216
+ },
33217
+ ComputeInstructionRegistry: {
33218
+ addresses: {
33219
+ 14800: "0x5786B12b4c6Ba2bFAF0e77Ed30Bf6d32805563A5",
33220
+ 1480: "0x5786B12b4c6Ba2bFAF0e77Ed30Bf6d32805563A5"
33221
+ }
33222
+ },
33223
+ // TEE Pool Variants
33224
+ TeePoolEphemeralStandard: {
33225
+ addresses: {
33226
+ 14800: "0xe124bae846D5ec157f75Bd9e68ca87C4d2AB835A",
33227
+ 1480: "0xe124bae846D5ec157f75Bd9e68ca87C4d2AB835A"
33228
+ }
33229
+ },
33230
+ TeePoolPersistentStandard: {
33231
+ addresses: {
33232
+ 14800: "0xe8bB8d0629651Cf33e0845d743976Dc1f0971d76",
33233
+ 1480: "0xe8bB8d0629651Cf33e0845d743976Dc1f0971d76"
33234
+ }
33235
+ },
33236
+ TeePoolPersistentGpu: {
33237
+ addresses: {
33238
+ 14800: "0x1c346Cd74f8551f8fa13f3F4b6b8dAE22338E6a9",
33239
+ 1480: "0x1c346Cd74f8551f8fa13f3F4b6b8dAE22338E6a9"
33240
+ }
33241
+ },
33242
+ TeePoolDedicatedStandard: {
33243
+ addresses: {
33244
+ 14800: "0xf024b7ac5E8417416f53B41ecfa58C8e9396687d",
33245
+ 1480: "0xf024b7ac5E8417416f53B41ecfa58C8e9396687d"
33246
+ }
33247
+ },
33248
+ TeePoolDedicatedGpu: {
33249
+ addresses: {
33250
+ 14800: "0xB1686FA9620bBf851714d1cB47b8a4Bf4664644E",
33251
+ 1480: "0xB1686FA9620bBf851714d1cB47b8a4Bf4664644E"
33252
+ }
33253
+ },
33254
+ // DLP Reward System
33255
+ VanaEpoch: {
33256
+ addresses: {
33257
+ 14800: "0x2063cFF0609D59bCCc196E20Eb58A8696a6b15A0",
33258
+ 1480: "0x2063cFF0609D59bCCc196E20Eb58A8696a6b15A0"
33259
+ }
33260
+ },
33261
+ DLPRegistry: {
33262
+ addresses: {
33263
+ 14800: "0x4D59880a924526d1dD33260552Ff4328b1E18a43",
33264
+ 1480: "0x4D59880a924526d1dD33260552Ff4328b1E18a43"
33265
+ }
33266
+ },
33267
+ DLPRegistryTreasury: {
33268
+ addresses: {
33269
+ 14800: "0xb12ce1d27bEeFe39b6F0110b1AB77C21Aa0c9F9a",
33270
+ 1480: "0xb12ce1d27bEeFe39b6F0110b1AB77C21Aa0c9F9a"
33271
+ }
33272
+ },
33273
+ DLPPerformance: {
33274
+ addresses: {
33275
+ 14800: "0x847715C7DB37cF286611182Be0bD333cbfa29cc1",
33276
+ 1480: "0x847715C7DB37cF286611182Be0bD333cbfa29cc1"
33277
+ }
33278
+ },
33279
+ DLPRewardDeployer: {
33280
+ addresses: {
33281
+ 14800: "0xEFD0F9Ba9De70586b7c4189971cF754adC923B04",
33282
+ 1480: "0xEFD0F9Ba9De70586b7c4189971cF754adC923B04"
33283
+ }
33284
+ },
33285
+ DLPRewardDeployerTreasury: {
33286
+ addresses: {
33287
+ 14800: "0xb547ca8Fe4990fe330FeAeb1C2EBb42F925Af5b8",
33288
+ 1480: "0xb547ca8Fe4990fe330FeAeb1C2EBb42F925Af5b8"
33289
+ }
33290
+ },
33291
+ DLPRewardSwap: {
33292
+ addresses: {
33293
+ 14800: "0x7c6862C46830F0fc3bF3FF509EA1bD0EE7267fB0",
33294
+ 1480: "0x7c6862C46830F0fc3bF3FF509EA1bD0EE7267fB0"
33295
+ }
33296
+ },
33297
+ SwapHelper: {
33298
+ addresses: {
33299
+ 14800: "0x55D5e6F73326315bF2E091e97F04f0770e5C54e2",
33300
+ 1480: "0x55D5e6F73326315bF2E091e97F04f0770e5C54e2"
33301
+ }
33302
+ },
33303
+ // VanaPool (Staking)
33304
+ VanaPoolStaking: {
33305
+ addresses: {
33306
+ 14800: "0x641C18E2F286c86f96CE95C8ec1EB9fC0415Ca0e",
33307
+ 1480: "0x641C18E2F286c86f96CE95C8ec1EB9fC0415Ca0e"
33308
+ }
33309
+ },
33310
+ VanaPoolEntity: {
33311
+ addresses: {
33312
+ 14800: "0x44f20490A82e1f1F1cC25Dd3BA8647034eDdce30",
33313
+ 1480: "0x44f20490A82e1f1F1cC25Dd3BA8647034eDdce30"
33314
+ }
33315
+ },
33316
+ VanaPoolTreasury: {
33317
+ addresses: {
33318
+ 14800: "0x143BE72CF2541604A7691933CAccd6D9cC17c003",
33319
+ 1480: "0x143BE72CF2541604A7691933CAccd6D9cC17c003"
33320
+ }
33321
+ },
33322
+ // DLP Deployment Contracts
33323
+ DAT: {
33324
+ addresses: {
33325
+ 14800: "0xA706b93ccED89f13340673889e29F0a5cd84212d",
33326
+ 1480: "0xA706b93ccED89f13340673889e29F0a5cd84212d"
33327
+ }
33328
+ },
33329
+ DATFactory: {
33330
+ addresses: {
33331
+ 14800: "0x40f8bccF35a75ecef63BC3B1B3E06ffEB9220644",
33332
+ 1480: "0x40f8bccF35a75ecef63BC3B1B3E06ffEB9220644"
33333
+ }
33334
+ },
33335
+ DATPausable: {
33336
+ addresses: {
33337
+ 14800: "0xe69FE86f0B95cC2f8416Fe22815c85DC8887e76e",
33338
+ 1480: "0xe69FE86f0B95cC2f8416Fe22815c85DC8887e76e"
33339
+ }
33340
+ },
33341
+ DATVotes: {
33342
+ addresses: {
33343
+ 14800: "0xaE04c8A77E9B27869eb563720524A9aE0baf1831",
33344
+ 1480: "0xaE04c8A77E9B27869eb563720524A9aE0baf1831"
33345
+ }
33346
+ },
33347
+ // Utility Contracts (no ABIs in SDK)
33348
+ Multicall3: {
33349
+ addresses: {
33350
+ 14800: "0xD8d2dFca27E8797fd779F8547166A2d3B29d360E",
33351
+ 1480: "0xD8d2dFca27E8797fd779F8547166A2d3B29d360E"
33352
+ }
33353
+ },
33354
+ Multisend: {
33355
+ addresses: {
33356
+ 14800: "0x8807e8BCDFbaA8c2761760f3FBA37F6f7F2C5b2d",
33357
+ 1480: "0x8807e8BCDFbaA8c2761760f3FBA37F6f7F2C5b2d"
33358
+ }
33359
+ }
33360
+ };
33361
+ var LEGACY_CONTRACTS = {
33362
+ // DEPRECATED: Original Intel SGX TeePool (PRO-347)
33363
+ TeePool: {
33364
+ addresses: {
33365
+ 14800: "0x3c92fD91639b41f13338CE62f19131e7d19eaa0D",
33366
+ 1480: "0x3c92fD91639b41f13338CE62f19131e7d19eaa0D"
33367
+ }
33368
+ },
33369
+ // DEPRECATED: DLPRoot system (replaced by VanaPool + DLPRewards)
33370
+ DLPRootEpoch: {
33371
+ addresses: {
33372
+ 14800: "0xc3d176cF6BccFCB9225b53B87a95147218e1537F",
33373
+ 1480: "0xc3d176cF6BccFCB9225b53B87a95147218e1537F"
33374
+ }
33375
+ },
33376
+ DLPRootCore: {
33377
+ addresses: {
33378
+ 14800: "0x0aBa5e28228c323A67712101d61a54d4ff5720FD",
33379
+ 1480: "0x0aBa5e28228c323A67712101d61a54d4ff5720FD"
33380
+ }
33381
+ },
33382
+ DLPRoot: {
33383
+ addresses: {
33384
+ 14800: "0xff14346dF2B8Fd0c95BF34f1c92e49417b508AD5",
33385
+ 1480: "0xff14346dF2B8Fd0c95BF34f1c92e49417b508AD5"
33386
+ }
33387
+ },
33388
+ DLPRootMetrics: {
33389
+ addresses: {
33390
+ 14800: "0xbb532917B6407c060Afd9Cb7d53527eCb91d6662",
33391
+ 1480: "0xbb532917B6407c060Afd9Cb7d53527eCb91d6662"
33392
+ }
33393
+ },
33394
+ DLPRootStakesTreasury: {
33395
+ addresses: {
33396
+ 14800: "0x52c3260ED5C235fcA43524CF508e29c897318775",
33397
+ 1480: "0x52c3260ED5C235fcA43524CF508e29c897318775"
33398
+ }
33399
+ },
33400
+ DLPRootRewardsTreasury: {
33401
+ addresses: {
33402
+ 14800: "0xDBFb6B8b9E2eCAEbdE64d665cD553dB81e524479",
33403
+ 1480: "0xDBFb6B8b9E2eCAEbdE64d665cD553dB81e524479"
33404
+ }
33405
+ }
33406
+ };
33407
+ var CONTRACT_ADDRESSES = {
33408
+ 14800: Object.fromEntries(
33409
+ Object.entries(CONTRACTS).map(([name, info]) => [name, info.addresses[14800]]).filter(([, addr]) => addr)
33410
+ ),
33411
+ 1480: Object.fromEntries(
33412
+ Object.entries(CONTRACTS).map(([name, info]) => [name, info.addresses[1480]]).filter(([, addr]) => addr)
33413
+ )
33414
+ };
33415
+ var UTILITY_ADDRESSES = {
33416
+ 14800: {
33417
+ Multicall3: CONTRACTS.Multicall3.addresses[14800],
33418
+ Multisend: CONTRACTS.Multisend.addresses[14800]
33419
+ },
33420
+ 1480: {
33421
+ Multicall3: CONTRACTS.Multicall3.addresses[1480],
33422
+ Multisend: CONTRACTS.Multisend.addresses[1480]
33423
+ }
33424
+ };
33425
+ var LEGACY_ADDRESSES = {
33426
+ 14800: Object.fromEntries(
33427
+ Object.entries(LEGACY_CONTRACTS).map(([name, info]) => [name, info.addresses[14800]]).filter(([, addr]) => addr)
33428
+ ),
33429
+ 1480: Object.fromEntries(
33430
+ Object.entries(LEGACY_CONTRACTS).map(([name, info]) => [name, info.addresses[1480]]).filter(([, addr]) => addr)
33431
+ )
33432
+ };
33433
+ var getContractAddress = (chainId, contract) => {
33434
+ const contractAddress = CONTRACT_ADDRESSES[chainId]?.[contract];
33435
+ if (!contractAddress) {
33436
+ throw new Error(
33437
+ `Contract address not found for ${contract} on chain ${chainId}`
33438
+ );
33439
+ }
33440
+ return contractAddress;
33441
+ };
33442
+
33279
33443
  // src/utils/grantFiles.ts
33280
33444
  import { keccak256, toHex } from "viem";
33281
33445
  function createGrantFile(params) {
@@ -33677,6 +33841,91 @@ function validateOperationAccess(grantFile, requestedOperation) {
33677
33841
  }
33678
33842
  }
33679
33843
 
33844
+ // src/utils/signatureCache.ts
33845
+ init_crypto_utils();
33846
+ var SignatureCache = class {
33847
+ /**
33848
+ * Get a cached signature if it exists and hasn't expired
33849
+ */
33850
+ static get(cache, walletAddress, messageHash) {
33851
+ const key = this.getCacheKey(walletAddress, messageHash);
33852
+ try {
33853
+ const stored = cache.get(key);
33854
+ if (!stored) return null;
33855
+ const cached = JSON.parse(stored);
33856
+ if (Date.now() > cached.expires) {
33857
+ cache.delete(key);
33858
+ return null;
33859
+ }
33860
+ return cached.signature;
33861
+ } catch {
33862
+ try {
33863
+ cache.delete(key);
33864
+ } catch {
33865
+ }
33866
+ return null;
33867
+ }
33868
+ }
33869
+ /**
33870
+ * Store a signature in the cache
33871
+ */
33872
+ static set(cache, walletAddress, messageHash, signature, ttlHours = this.DEFAULT_TTL_HOURS) {
33873
+ const key = this.getCacheKey(walletAddress, messageHash);
33874
+ const cached = {
33875
+ signature,
33876
+ expires: Date.now() + ttlHours * 36e5
33877
+ // Convert hours to milliseconds
33878
+ };
33879
+ try {
33880
+ cache.set(key, JSON.stringify(cached));
33881
+ } catch {
33882
+ }
33883
+ }
33884
+ /**
33885
+ * Clear all cached signatures (useful for testing or explicit cleanup)
33886
+ */
33887
+ static clear(cache) {
33888
+ try {
33889
+ cache.clear();
33890
+ } catch {
33891
+ }
33892
+ }
33893
+ static getCacheKey(walletAddress, messageHash) {
33894
+ return `${this.PREFIX}${walletAddress.toLowerCase()}:${messageHash}`;
33895
+ }
33896
+ static hashMessage(message) {
33897
+ const jsonString = JSON.stringify(message, this.bigIntReplacer);
33898
+ const base64Hash = toBase64(jsonString);
33899
+ const cleaned = base64Hash.replace(/[^a-zA-Z0-9]/g, "");
33900
+ if (cleaned.length > 32) {
33901
+ return cleaned.substring(0, 16) + cleaned.substring(cleaned.length - 16);
33902
+ }
33903
+ return cleaned.substring(0, 32);
33904
+ }
33905
+ /**
33906
+ * Custom JSON replacer that converts BigInt values to strings for serialization
33907
+ * This ensures deterministic cache key generation for EIP-712 typed data
33908
+ */
33909
+ static bigIntReplacer(key, value) {
33910
+ if (typeof value === "bigint") {
33911
+ return `__BIGINT__${value.toString()}`;
33912
+ }
33913
+ return value;
33914
+ }
33915
+ };
33916
+ __publicField(SignatureCache, "PREFIX", "vana_sig_");
33917
+ __publicField(SignatureCache, "DEFAULT_TTL_HOURS", 2);
33918
+ async function withSignatureCache(cache, walletAddress, typedData, signFn, ttlHours) {
33919
+ const messageHash = SignatureCache.hashMessage(typedData);
33920
+ const cached = SignatureCache.get(cache, walletAddress, messageHash);
33921
+ if (cached) {
33922
+ return cached;
33923
+ }
33924
+ const signature = await signFn();
33925
+ SignatureCache.set(cache, walletAddress, messageHash, signature, ttlHours);
33926
+ return signature;
33927
+ }
33928
+
33680
33929
  // src/controllers/permissions.ts
33681
33930
  var PermissionsController = class {
33682
33931
  constructor(context) {
@@ -33684,22 +33933,22 @@ var PermissionsController = class {
33684
33933
  }
33685
33934
  /**
33686
33935
  * Grants permission for an application to access user data with gasless transactions.
33936
+ *
33937
+ * This method provides a complete end-to-end permission grant flow that returns
33938
+ * the permission ID and other relevant data immediately after successful submission.
33939
+ * For advanced users who need more control over the transaction lifecycle, use
33940
+ * `submitPermissionGrant()` instead.
33687
33941
  *
33688
- * @remarks
33689
- * This method combines signature creation and gasless submission for a complete
33690
- * end-to-end permission grant flow. It creates the grant file, stores it on IPFS,
33691
- * generates an EIP-712 signature, and submits via relayer. The grant file contains
33692
- * detailed parameters while the blockchain stores only a reference to enable
33693
- * efficient permission queries.
33694
33942
  * @param params - The permission grant configuration object
33695
- * @returns A Promise that resolves to the transaction hash when successfully submitted
33943
+ * @returns Promise resolving to permission data from the PermissionAdded event
33696
33944
  * @throws {RelayerError} When gasless transaction submission fails
33697
33945
  * @throws {SignatureError} When user rejects the signature request
33698
33946
  * @throws {SerializationError} When grant data cannot be serialized
33699
- * @throws {BlockchainError} When permission grant preparation fails
33947
+ * @throws {BlockchainError} When permission grant fails or event parsing fails
33948
+ * @throws {NetworkError} When transaction confirmation times out
33700
33949
  * @example
33701
33950
  * ```typescript
33702
- * const txHash = await vana.permissions.grant({
33951
+ * const result = await vana.permissions.grant({
33703
33952
  * grantee: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36",
33704
33953
  * operation: "llm_inference",
33705
33954
  * parameters: {
@@ -33709,10 +33958,42 @@ var PermissionsController = class {
33709
33958
  * },
33710
33959
  * });
33711
33960
  *
33712
- * console.log(`Permission granted: ${txHash}`);
33961
+ * console.log(`Permission ${result.permissionId} granted to ${result.user}`);
33962
+ * console.log(`Transaction: ${result.transactionHash}`);
33963
+ *
33964
+ * // Can immediately use the permission ID for other operations
33965
+ * await vana.permissions.revoke({ permissionId: result.permissionId });
33713
33966
  * ```
33714
33967
  */
33715
33968
  async grant(params) {
33969
+ const txHash = await this.submitPermissionGrant(params);
33970
+ return parseTransactionResult(this.context, txHash, "grant");
33971
+ }
33972
+ /**
33973
+ * Submits a permission grant transaction and returns the transaction hash immediately.
33974
+ *
33975
+ * This is the lower-level method that provides maximum control over transaction timing.
33976
+ * Use this when you want to handle transaction confirmation and event parsing separately,
33977
+ * or when submitting multiple transactions in batch.
33978
+ *
33979
+ * @param params - The permission grant configuration object
33980
+ * @returns Promise that resolves to the transaction hash when successfully submitted
33981
+ * @throws {RelayerError} When gasless transaction submission fails
33982
+ * @throws {SignatureError} When user rejects the signature request
33983
+ * @throws {SerializationError} When grant data cannot be serialized
33984
+ * @throws {BlockchainError} When permission grant preparation fails
33985
+ * @example
33986
+ * ```typescript
33987
+ * // Submit transaction and handle confirmation later
33988
+ * const txHash = await vana.permissions.submitPermissionGrant(params);
33989
+ * console.log(`Transaction submitted: ${txHash}`);
33990
+ *
33991
+ * // Later, when you need the permission data:
33992
+ * const result = await parseTransactionResult(context, txHash, 'grant');
33993
+ * console.log(`Permission ID: ${result.permissionId}`);
33994
+ * ```
33995
+ */
33996
+ async submitPermissionGrant(params) {
33716
33997
  const { typedData, signature } = await this.createAndSign(params);
33717
33998
  return await this.submitSignedGrant(typedData, signature);
33718
33999
  }
@@ -34129,23 +34410,52 @@ var PermissionsController = class {
34129
34410
  }
34130
34411
  /**
34131
34412
  * Revokes a previously granted permission.
34413
+ *
34414
+ * This method provides complete revocation with automatic event parsing to confirm
34415
+ * the permission was successfully revoked. For advanced users who need more control,
34416
+ * use `submitPermissionRevoke()` instead.
34132
34417
  *
34133
34418
  * @param params - Parameters for revoking the permission
34134
- * @returns Promise resolving to transaction hash
34419
+ * @param params.permissionId - Permission identifier as bigint for contract compatibility.
34420
+ * Obtain from permission grants via `getUserPermissionGrantsOnChain()`.
34421
+ * @returns Promise resolving to revocation data from PermissionRevoked event
34422
+ * @throws {BlockchainError} When revocation fails or event parsing fails
34423
+ * @throws {UserRejectedRequestError} When user rejects the transaction
34424
+ * @throws {NetworkError} When transaction confirmation times out
34135
34425
  * @example
34136
34426
  * ```typescript
34137
- * // Revoke a permission by its ID
34138
- * const txHash = await vana.permissions.revoke({
34427
+ * // Revoke a permission and get confirmation
34428
+ * const result = await vana.permissions.revoke({
34139
34429
  * permissionId: 123n
34140
34430
  * });
34141
- * console.log('Permission revoked in transaction:', txHash);
34142
- *
34143
- * // Wait for confirmation if needed
34144
- * const receipt = await vana.core.waitForTransaction(txHash);
34145
- * console.log('Revocation confirmed in block:', receipt.blockNumber);
34431
+ * console.log(`Permission ${result.permissionId} revoked in transaction ${result.transactionHash}`);
34432
+ * console.log(`Revoked in block ${result.blockNumber}`);
34146
34433
  * ```
34147
34434
  */
34148
34435
  async revoke(params) {
34436
+ const txHash = await this.submitPermissionRevoke(params);
34437
+ return parseTransactionResult(this.context, txHash, "revoke");
34438
+ }
34439
+ /**
34440
+ * Submits a permission revocation transaction and returns the transaction hash immediately.
34441
+ *
34442
+ * This is the lower-level method that provides maximum control over transaction timing.
34443
+ * Use this when you want to handle transaction confirmation and event parsing separately.
34444
+ *
34445
+ * @param params - Parameters for revoking the permission
34446
+ * @returns Promise resolving to the transaction hash when successfully submitted
34447
+ * @throws {BlockchainError} When revocation transaction fails
34448
+ * @throws {UserRejectedRequestError} When user rejects the transaction
34449
+ * @example
34450
+ * ```typescript
34451
+ * // Submit revocation and handle confirmation later
34452
+ * const txHash = await vana.permissions.submitPermissionRevoke({
34453
+ * permissionId: 123n
34454
+ * });
34455
+ * console.log(`Revocation submitted: ${txHash}`);
34456
+ * ```
34457
+ */
34458
+ async submitPermissionRevoke(params) {
34149
34459
  try {
34150
34460
  if (!this.context.walletClient.chain?.id) {
34151
34461
  throw new BlockchainError("Chain ID not available");
@@ -34311,17 +34621,24 @@ var PermissionsController = class {
34311
34621
  };
34312
34622
  }
34313
34623
  /**
34314
- * Signs typed data using the wallet client.
34624
+ * Signs typed data using the wallet client with signature caching.
34315
34625
  *
34316
34626
  * @param typedData - The EIP-712 typed data structure to sign
34317
34627
  * @returns Promise resolving to the cryptographic signature
34318
34628
  */
34319
34629
  async signTypedData(typedData) {
34320
34630
  try {
34321
- const signature = await this.context.walletClient.signTypedData(
34322
- typedData
34631
+ const walletAddress = this.context.walletClient.account?.address || await this.getUserAddress();
34632
+ return await withSignatureCache(
34633
+ this.context.platform.cache,
34634
+ walletAddress,
34635
+ typedData,
34636
+ async () => {
34637
+ return await this.context.walletClient.signTypedData(
34638
+ typedData
34639
+ );
34640
+ }
34323
34641
  );
34324
- return signature;
34325
34642
  } catch (error) {
34326
34643
  if (error instanceof Error && error.message.includes("rejected")) {
34327
34644
  throw new UserRejectedRequestError();
@@ -35155,15 +35472,22 @@ import { getContract, decodeEventLog } from "viem";
35155
35472
 
35156
35473
  // src/utils/encryption.ts
35157
35474
  var DEFAULT_ENCRYPTION_SEED = "Please sign to retrieve your encryption key";
35158
- async function generateEncryptionKey(wallet, seed = DEFAULT_ENCRYPTION_SEED) {
35475
+ async function generateEncryptionKey(wallet, platformAdapter, seed = DEFAULT_ENCRYPTION_SEED) {
35159
35476
  if (!wallet.account) {
35160
35477
  throw new Error("Wallet account is required for encryption key generation");
35161
35478
  }
35162
- const signature = await wallet.signMessage({
35163
- account: wallet.account,
35164
- message: seed
35165
- });
35166
- return signature;
35479
+ const messageData = { message: seed };
35480
+ return await withSignatureCache(
35481
+ platformAdapter.cache,
35482
+ wallet.account.address,
35483
+ messageData,
35484
+ async () => {
35485
+ return await wallet.signMessage({
35486
+ account: wallet.account,
35487
+ message: seed
35488
+ });
35489
+ }
35490
+ );
35167
35491
  }
35168
35492
  async function encryptWithWalletPublicKey(data, publicKey, platformAdapter) {
35169
35493
  try {
@@ -35272,7 +35596,8 @@ var DataController = class {
35272
35596
  schemaId,
35273
35597
  permissions = [],
35274
35598
  encrypt: encrypt2 = true,
35275
- providerName
35599
+ providerName,
35600
+ owner
35276
35601
  } = params;
35277
35602
  try {
35278
35603
  let blob;
@@ -35327,6 +35652,7 @@ var DataController = class {
35327
35652
  if (encrypt2) {
35328
35653
  const encryptionKey = await generateEncryptionKey(
35329
35654
  this.context.walletClient,
35655
+ this.context.platform,
35330
35656
  DEFAULT_ENCRYPTION_SEED
35331
35657
  );
35332
35658
  finalBlob = await encryptBlobWithSignedKey(
@@ -35350,28 +35676,23 @@ var DataController = class {
35350
35676
  filename,
35351
35677
  providerName
35352
35678
  );
35353
- const userAddress = await this.getUserAddress();
35679
+ const userAddress = owner || await this.getUserAddress();
35354
35680
  let encryptedPermissions = [];
35355
35681
  if (permissions.length > 0 && encrypt2) {
35356
35682
  const userEncryptionKey = await generateEncryptionKey(
35357
35683
  this.context.walletClient,
35684
+ this.context.platform,
35358
35685
  DEFAULT_ENCRYPTION_SEED
35359
35686
  );
35360
35687
  encryptedPermissions = await Promise.all(
35361
35688
  permissions.map(async (permission) => {
35362
- const publicKey = permission.publicKey;
35363
- if (!publicKey) {
35364
- throw new Error(
35365
- `Public key required for permission to ${permission.grantee} when encryption is enabled`
35366
- );
35367
- }
35368
35689
  const encryptedKey = await encryptWithWalletPublicKey(
35369
35690
  userEncryptionKey,
35370
- publicKey,
35691
+ permission.publicKey,
35371
35692
  this.context.platform
35372
35693
  );
35373
35694
  return {
35374
- account: permission.grantee,
35695
+ account: permission.account,
35375
35696
  key: encryptedKey
35376
35697
  };
35377
35698
  })
@@ -35384,7 +35705,8 @@ var DataController = class {
35384
35705
  url: uploadResult.url,
35385
35706
  userAddress,
35386
35707
  permissions: encryptedPermissions,
35387
- schemaId: schemaId || 0
35708
+ schemaId: schemaId || 0,
35709
+ ownerAddress: owner
35388
35710
  }
35389
35711
  );
35390
35712
  } else if (this.context.relayerCallbacks?.submitFileAddition) {
@@ -35474,6 +35796,7 @@ var DataController = class {
35474
35796
  try {
35475
35797
  const encryptionKey = await generateEncryptionKey(
35476
35798
  this.context.walletClient,
35799
+ this.context.platform,
35477
35800
  encryptionSeed || DEFAULT_ENCRYPTION_SEED
35478
35801
  );
35479
35802
  let encryptedBlob;
@@ -36857,6 +37180,7 @@ var DataController = class {
36857
37180
  try {
36858
37181
  const userEncryptionKey = await generateEncryptionKey(
36859
37182
  this.context.walletClient,
37183
+ this.context.platform,
36860
37184
  DEFAULT_ENCRYPTION_SEED
36861
37185
  );
36862
37186
  const encryptedData = await encryptBlobWithSignedKey(
@@ -36922,16 +37246,47 @@ var DataController = class {
36922
37246
  * 1. Gets the user's encryption key
36923
37247
  * 2. Encrypts the user's encryption key with the provided public key
36924
37248
  * 3. Adds the permission to the file
37249
+ * 4. Returns the permission data from the blockchain event
37250
+ *
37251
+ * For advanced users who need more control over transaction timing,
37252
+ * use `submitFilePermission()` instead.
36925
37253
  *
36926
37254
  * @param fileId - The ID of the file to add permissions for
36927
37255
  * @param account - The address of the account to grant permission to
36928
37256
  * @param publicKey - The public key to encrypt the user's encryption key with
36929
- * @returns Promise resolving to the transaction hash
37257
+ * @returns Promise resolving to permission data from PermissionGranted event
37258
+ * @example
37259
+ * ```typescript
37260
+ * const result = await vana.data.addPermissionToFile(fileId, account, publicKey);
37261
+ * console.log(`Permission granted to ${result.account} for file ${result.fileId}`);
37262
+ * console.log(`Transaction: ${result.transactionHash}`);
37263
+ * ```
36930
37264
  */
36931
37265
  async addPermissionToFile(fileId, account, publicKey) {
37266
+ const txHash = await this.submitFilePermission(fileId, account, publicKey);
37267
+ return parseTransactionResult(this.context, txHash, "addFilePermission");
37268
+ }
37269
+ /**
37270
+ * Submits a file permission transaction and returns the transaction hash immediately.
37271
+ *
37272
+ * This is the lower-level method that provides maximum control over transaction timing.
37273
+ * Use this when you want to handle transaction confirmation and event parsing separately.
37274
+ *
37275
+ * @param fileId - The ID of the file to add permissions for
37276
+ * @param account - The address of the account to grant permission to
37277
+ * @param publicKey - The public key to encrypt the user's encryption key with
37278
+ * @returns Promise resolving to the transaction hash
37279
+ * @example
37280
+ * ```typescript
37281
+ * const txHash = await vana.data.submitFilePermission(fileId, account, publicKey);
37282
+ * console.log(`Transaction submitted: ${txHash}`);
37283
+ * ```
37284
+ */
37285
+ async submitFilePermission(fileId, account, publicKey) {
36932
37286
  try {
36933
37287
  const userEncryptionKey = await generateEncryptionKey(
36934
37288
  this.context.walletClient,
37289
+ this.context.platform,
36935
37290
  DEFAULT_ENCRYPTION_SEED
36936
37291
  );
36937
37292
  const encryptedKey = await encryptWithWalletPublicKey(
@@ -37645,6 +38000,39 @@ var ServerController = class {
37645
38000
  this.context = context;
37646
38001
  __publicField(this, "PERSONAL_SERVER_BASE_URL", process.env.NEXT_PUBLIC_PERSONAL_SERVER_BASE_URL);
37647
38002
  }
38003
+ /**
38004
+ * Retrieves the cryptographic identity of a personal server.
38005
+ *
38006
+ * @remarks
38007
+ * This method fetches the public key and metadata for a personal server,
38008
+ * which is required for encrypting data before sharing with the server.
38009
+ * The identity includes the server's public key, address, and operational
38010
+ * details needed for secure communication. This information is cached
38011
+ * by identity servers to enable offline key retrieval.
38012
+ *
38013
+ * @param request - Parameters containing the user address
38014
+ * @param request.userAddress - The wallet address associated with the personal server
38015
+ * @returns Promise resolving to the server's identity information
38016
+ * @throws {NetworkError} When the identity service is unavailable or returns invalid data
38017
+ * @throws {PersonalServerError} When server identity cannot be retrieved
38018
+ * @example
38019
+ * ```typescript
38020
+ * // Get server identity for data encryption
38021
+ * const identity = await vana.server.getIdentity({
38022
+ * userAddress: "0x742d35Cc6558Fd4D9e9E0E888F0462ef6919Bd36"
38023
+ * });
38024
+ *
38025
+ * console.log(`Server: ${identity.name}`);
38026
+ * console.log(`Address: ${identity.address}`);
38027
+ * console.log(`Public Key: ${identity.public_key}`);
38028
+ *
38029
+ * // Use the public key for encrypting data to share with this server
38030
+ * const encryptedData = await encryptWithWalletPublicKey(
38031
+ * userData,
38032
+ * identity.public_key
38033
+ * );
38034
+ * ```
38035
+ */
37648
38036
  async getIdentity(request) {
37649
38037
  try {
37650
38038
  const response = await fetch(
@@ -37687,10 +38075,13 @@ var ServerController = class {
37687
38075
  * This method submits a computation request to the personal server API.
37688
38076
  * The response includes the operation ID.
37689
38077
  * @param params - The request parameters object
37690
- * @param params.permissionId - The permission ID authorizing this operation
38078
+ * @param params.permissionId - The permission ID authorizing this operation.
38079
+ * Obtain from granted permissions via `vana.permissions.getUserPermissionGrantsOnChain()`.
37691
38080
  * @returns A Promise that resolves to an operation response with status and control URLs
37692
- * @throws {PersonalServerError} When server request fails or parameters are invalid
37693
- * @throws {NetworkError} When personal server API communication fails
38081
+ * @throws {PersonalServerError} When server request fails or parameters are invalid.
38082
+ * Verify permissionId exists and is active for the target server.
38083
+ * @throws {NetworkError} When personal server API communication fails.
38084
+ * Check server URL configuration and network connectivity.
37694
38085
  * @example
37695
38086
  * ```typescript
37696
38087
  * const response = await vana.server.createOperation({
@@ -37792,6 +38183,50 @@ var ServerController = class {
37792
38183
  );
37793
38184
  }
37794
38185
  }
38186
+ /**
38187
+ * Cancels a running operation on the personal server.
38188
+ *
38189
+ * @remarks
38190
+ * This method attempts to cancel an operation that is currently processing
38191
+ * on the personal server. The operation must be in a cancellable state
38192
+ * (typically `starting` or `processing`). Not all operations support
38193
+ * cancellation, and cancellation may not be immediate. The server will
38194
+ * attempt to stop the operation and update its status to `canceled`.
38195
+ *
38196
+ * **Cancellation Behavior:**
38197
+ * - Operations in `succeeded` or `failed` states cannot be canceled
38198
+ * - Some long-running operations may take time to respond to cancellation
38199
+ * - Always verify cancellation by polling the operation status afterward
38200
+ *
38201
+ * @param operationId - The unique identifier of the operation to cancel,
38202
+ * obtained from `createOperation()` response
38203
+ * @returns Promise that resolves when the cancellation request is accepted
38204
+ * @throws {PersonalServerError} When the operation cannot be canceled or doesn't exist.
38205
+ * Check operation status - it may already be completed or failed.
38206
+ * @throws {NetworkError} When unable to reach the personal server API.
38207
+ * Verify server URL and network connectivity.
38208
+ * @example
38209
+ * ```typescript
38210
+ * // Start a long-running operation
38211
+ * const operation = await vana.server.createOperation({
38212
+ * permissionId: 123
38213
+ * });
38214
+ *
38215
+ * // Cancel if needed
38216
+ * try {
38217
+ * await vana.server.cancelOperation(operation.id);
38218
+ * console.log("Cancellation requested");
38219
+ *
38220
+ * // Verify cancellation
38221
+ * const status = await vana.server.getOperation(operation.id);
38222
+ * if (status.status === "canceled") {
38223
+ * console.log("Operation successfully canceled");
38224
+ * }
38225
+ * } catch (error) {
38226
+ * console.error("Failed to cancel:", error);
38227
+ * }
38228
+ * ```
38229
+ */
37795
38230
  async cancelOperation(operationId) {
37796
38231
  try {
37797
38232
  const response = await fetch(
@@ -38095,7 +38530,8 @@ var ProtocolController = class {
38095
38530
  * are actually deployed on the current network.
38096
38531
  * @param contractName - The name of the Vana contract to retrieve (use const assertion for full typing)
38097
38532
  * @returns An object containing the contract's address and fully typed ABI
38098
- * @throws {ContractNotFoundError} When the contract is not deployed on the current chain
38533
+ * @throws {ContractNotFoundError} When the contract is not deployed on the current chain.
38534
+ * Verify contract name spelling and check current network with `getChainId()`.
38099
38535
  * @example
38100
38536
  * ```typescript
38101
38537
  * // Get contract info with full type inference
@@ -38716,6 +39152,7 @@ var GoogleDriveStorage = class {
38716
39152
  };
38717
39153
 
38718
39154
  // src/storage/providers/ipfs.ts
39155
+ init_crypto_utils();
38719
39156
  var IpfsStorage = class _IpfsStorage {
38720
39157
  constructor(config) {
38721
39158
  this.config = config;
@@ -38755,7 +39192,7 @@ var IpfsStorage = class _IpfsStorage {
38755
39192
  * ```
38756
39193
  */
38757
39194
  static forInfura(credentials) {
38758
- const auth = btoa(`${credentials.projectId}:${credentials.projectSecret}`);
39195
+ const auth = toBase64(`${credentials.projectId}:${credentials.projectSecret}`);
38759
39196
  return new _IpfsStorage({
38760
39197
  apiEndpoint: "https://ipfs.infura.io:5001/api/v0/add",
38761
39198
  gatewayUrl: "https://ipfs.infura.io/ipfs",
@@ -39279,175 +39716,151 @@ var PinataStorage = class {
39279
39716
  }
39280
39717
  };
39281
39718
 
39282
- // src/storage/providers/server-proxy.ts
39283
- var ServerProxyStorage = class {
39284
- constructor(config) {
39285
- this.config = config;
39286
- if (!config.uploadUrl) {
39287
- throw new StorageError(
39288
- "Upload URL is required",
39289
- "MISSING_UPLOAD_URL",
39290
- "server-proxy"
39291
- );
39292
- }
39293
- if (!config.downloadUrl) {
39294
- throw new StorageError(
39295
- "Download URL is required",
39296
- "MISSING_DOWNLOAD_URL",
39297
- "server-proxy"
39719
+ // src/storage/providers/callback-storage.ts
39720
+ var CallbackStorage = class {
39721
+ constructor(callbacks) {
39722
+ this.callbacks = callbacks;
39723
+ if (!callbacks.upload || !callbacks.download) {
39724
+ throw new Error(
39725
+ "CallbackStorage requires both upload and download callbacks"
39298
39726
  );
39299
39727
  }
39300
39728
  }
39301
39729
  /**
39302
- * Uploads a file through your server endpoint
39303
- *
39304
- * @remarks
39305
- * This method sends the file to your configured upload endpoint via FormData.
39306
- * Your server is responsible for handling the actual storage implementation
39307
- * and must return a JSON response with `success: true` and an `identifier` field.
39308
- *
39309
- * @param file - The file to upload
39310
- * @param filename - Optional custom filename
39311
- * @returns Promise that resolves to the server-provided identifier
39312
- * @throws {StorageError} When the upload fails or server returns an error
39730
+ * Upload a file using the provided callback
39313
39731
  *
39314
- * @example
39315
- * ```typescript
39316
- * const identifier = await serverStorage.upload(fileBlob, { name: "report.pdf" });
39317
- * console.log("File uploaded with identifier:", identifier);
39318
- * ```
39732
+ * @param file - The blob to upload
39733
+ * @param filename - Optional filename for the upload
39734
+ * @returns The upload result with URL and metadata
39319
39735
  */
39320
39736
  async upload(file, filename) {
39321
39737
  try {
39322
- const formData = new FormData();
39323
- formData.append("file", file);
39324
- if (filename) {
39325
- formData.append("name", filename);
39326
- }
39327
- const response = await fetch(this.config.uploadUrl, {
39328
- method: "POST",
39329
- body: formData
39330
- });
39331
- if (!response.ok) {
39332
- const _errorText = await response.text();
39333
- throw new StorageError(
39334
- `Server upload failed: ${response.status} ${response.statusText}`,
39335
- "UPLOAD_FAILED",
39336
- "server-proxy"
39337
- );
39338
- }
39339
- const result = await response.json();
39340
- if (!result.success) {
39738
+ const result = await this.callbacks.upload(file, filename);
39739
+ if (!result.url || result.url.trim() === "") {
39341
39740
  throw new StorageError(
39342
- `Upload failed: ${result.error || "Unknown server error"}`,
39343
- "UPLOAD_FAILED",
39344
- "server-proxy"
39741
+ "Upload callback returned invalid result: missing or empty url",
39742
+ "INVALID_UPLOAD_RESULT",
39743
+ "callback-storage"
39345
39744
  );
39346
39745
  }
39347
- if (!result.identifier) {
39348
- throw new StorageError(
39349
- "Server upload succeeded but no identifier returned",
39350
- "NO_IDENTIFIER_RETURNED",
39351
- "server-proxy"
39352
- );
39353
- }
39354
- return {
39355
- url: result.url || result.identifier,
39356
- size: file.size,
39357
- contentType: file.type || "application/octet-stream"
39358
- };
39746
+ return result;
39359
39747
  } catch (error) {
39360
39748
  if (error instanceof StorageError) {
39361
39749
  throw error;
39362
39750
  }
39363
39751
  throw new StorageError(
39364
- `Server proxy upload error: ${error instanceof Error ? error.message : "Unknown error"}`,
39752
+ `Upload failed: ${error instanceof Error ? error.message : String(error)}`,
39365
39753
  "UPLOAD_ERROR",
39366
- "server-proxy"
39754
+ "callback-storage",
39755
+ { cause: error instanceof Error ? error : void 0 }
39367
39756
  );
39368
39757
  }
39369
39758
  }
39370
39759
  /**
39371
- * Downloads a file through your server endpoint
39760
+ * Download a file using the provided callback
39372
39761
  *
39373
- * @remarks
39374
- * This method sends the identifier to your configured download endpoint via POST request.
39375
- * Your server is responsible for retrieving the file from your storage backend
39376
- * and returning the file content as a blob response.
39377
- *
39378
- * @param url - The server-provided URL or identifier from upload
39379
- * @returns Promise that resolves to the downloaded file content
39380
- * @throws {StorageError} When the download fails or file is not found
39381
- *
39382
- * @example
39383
- * ```typescript
39384
- * const fileBlob = await serverStorage.download("file-123");
39385
- * const url = URL.createObjectURL(fileBlob);
39386
- * ```
39762
+ * @param url - The URL or identifier to download
39763
+ * @returns The downloaded blob
39387
39764
  */
39388
39765
  async download(url) {
39389
39766
  try {
39390
- const identifier = this.extractIdentifierFromUrl(url);
39391
- const response = await fetch(this.config.downloadUrl, {
39392
- method: "POST",
39393
- headers: {
39394
- "Content-Type": "application/json"
39395
- },
39396
- body: JSON.stringify({ identifier })
39397
- });
39398
- if (!response.ok) {
39399
- const _errorText = await response.text();
39767
+ const identifier = this.callbacks.extractIdentifier ? this.callbacks.extractIdentifier(url) : url;
39768
+ const blob = await this.callbacks.download(identifier);
39769
+ if (!(blob instanceof Blob)) {
39400
39770
  throw new StorageError(
39401
- `Server download failed: ${response.status} ${response.statusText}`,
39402
- "DOWNLOAD_FAILED",
39403
- "server-proxy"
39771
+ "Download callback returned invalid result: expected Blob",
39772
+ "INVALID_DOWNLOAD_RESULT",
39773
+ "callback-storage"
39404
39774
  );
39405
39775
  }
39406
- return await response.blob();
39776
+ return blob;
39407
39777
  } catch (error) {
39408
39778
  if (error instanceof StorageError) {
39409
39779
  throw error;
39410
39780
  }
39411
39781
  throw new StorageError(
39412
- `Server proxy download error: ${error instanceof Error ? error.message : "Unknown error"}`,
39782
+ `Download failed: ${error instanceof Error ? error.message : String(error)}`,
39413
39783
  "DOWNLOAD_ERROR",
39414
- "server-proxy"
39784
+ "callback-storage",
39785
+ { cause: error instanceof Error ? error : void 0 }
39415
39786
  );
39416
39787
  }
39417
39788
  }
39418
- async list(_options) {
39419
- throw new StorageError(
39420
- "List operation is not supported by server proxy storage",
39421
- "LIST_NOT_SUPPORTED",
39422
- "server-proxy"
39423
- );
39424
- }
39425
- async delete(_url) {
39426
- throw new StorageError(
39427
- "Delete operation is not supported by server proxy storage",
39428
- "DELETE_NOT_SUPPORTED",
39429
- "server-proxy"
39430
- );
39789
+ /**
39790
+ * List files using the provided callback (if available)
39791
+ *
39792
+ * @param options - Optional list options including filters and pagination
39793
+ * @returns Array of storage files
39794
+ */
39795
+ async list(options) {
39796
+ if (!this.callbacks.list) {
39797
+ throw new StorageError(
39798
+ "List operation not supported - no list callback provided",
39799
+ "NOT_SUPPORTED",
39800
+ "callback-storage"
39801
+ );
39802
+ }
39803
+ try {
39804
+ const result = await this.callbacks.list(options?.namePattern, options);
39805
+ return result.items.map((item, index) => ({
39806
+ id: item.identifier,
39807
+ name: item.identifier.split("/").pop() || `file-${index}`,
39808
+ url: item.identifier,
39809
+ size: item.size || 0,
39810
+ contentType: "application/octet-stream",
39811
+ createdAt: item.lastModified || /* @__PURE__ */ new Date(),
39812
+ metadata: item.metadata
39813
+ }));
39814
+ } catch (error) {
39815
+ throw new StorageError(
39816
+ `List failed: ${error instanceof Error ? error.message : String(error)}`,
39817
+ "LIST_ERROR",
39818
+ "callback-storage",
39819
+ { cause: error instanceof Error ? error : void 0 }
39820
+ );
39821
+ }
39431
39822
  }
39432
39823
  /**
39433
- * Extract identifier from URL or return as-is
39824
+ * Delete a file using the provided callback (if available)
39434
39825
  *
39435
- * @param url - URL or identifier string
39436
- * @returns identifier string
39826
+ * @param url - The URL or identifier to delete
39827
+ * @returns True if deletion succeeded
39437
39828
  */
39438
- extractIdentifierFromUrl(url) {
39439
- return url;
39829
+ async delete(url) {
39830
+ if (!this.callbacks.delete) {
39831
+ throw new StorageError(
39832
+ "Delete operation not supported - no delete callback provided",
39833
+ "NOT_SUPPORTED",
39834
+ "callback-storage"
39835
+ );
39836
+ }
39837
+ try {
39838
+ const identifier = this.callbacks.extractIdentifier ? this.callbacks.extractIdentifier(url) : url;
39839
+ return await this.callbacks.delete(identifier);
39840
+ } catch (error) {
39841
+ throw new StorageError(
39842
+ `Delete failed: ${error instanceof Error ? error.message : String(error)}`,
39843
+ "DELETE_ERROR",
39844
+ "callback-storage",
39845
+ { cause: error instanceof Error ? error : void 0 }
39846
+ );
39847
+ }
39440
39848
  }
39849
+ /**
39850
+ * Get provider configuration
39851
+ *
39852
+ * @returns Provider configuration metadata
39853
+ */
39441
39854
  getConfig() {
39442
39855
  return {
39443
- name: "Server Proxy",
39444
- type: "server-proxy",
39856
+ name: "callback-storage",
39857
+ type: "callback",
39445
39858
  requiresAuth: false,
39446
39859
  features: {
39447
39860
  upload: true,
39448
39861
  download: true,
39449
- list: false,
39450
- delete: false
39862
+ list: !!this.callbacks.list,
39863
+ delete: !!this.callbacks.delete
39451
39864
  }
39452
39865
  };
39453
39866
  }
@@ -40071,15 +40484,35 @@ var VanaCore = class {
40071
40484
  }
40072
40485
  /**
40073
40486
  * Encrypts data using the Vana protocol standard encryption.
40074
- * This method automatically uses the correct platform adapter for the current environment.
40487
+ *
40488
+ * @remarks
40489
+ * This method implements the Vana network's standard encryption protocol using
40490
+ * platform-appropriate cryptographic libraries. It automatically handles different
40491
+ * input types (string or Blob) and produces encrypted output suitable for secure
40492
+ * storage or transmission. The encryption is compatible with the network's
40493
+ * decryption protocols and can be decrypted by authorized parties.
40075
40494
  *
40076
- * @param data The data to encrypt (string or Blob)
40077
- * @param key The key to use as encryption key
40078
- * @returns The encrypted data as Blob
40495
+ * @param data - The data to encrypt (string or Blob)
40496
+ * @param key - The encryption key (typically generated via `generateEncryptionKey`)
40497
+ * @returns The encrypted data as a Blob
40498
+ * @throws {Error} When encryption fails due to invalid key or data format
40079
40499
  * @example
40080
40500
  * ```typescript
40081
- * const encryptionKey = await generateEncryptionKey(walletClient);
40082
- * const encrypted = await vana.encryptBlob("sensitive data", encryptionKey);
40501
+ * import { generateEncryptionKey } from '@opendatalabs/vana-sdk/node';
40502
+ *
40503
+ * // Generate encryption key from wallet signature
40504
+ * const encryptionKey = await generateEncryptionKey(vana.walletClient);
40505
+ *
40506
+ * // Encrypt string data
40507
+ * const sensitiveData = "User's private information";
40508
+ * const encrypted = await vana.encryptBlob(sensitiveData, encryptionKey);
40509
+ *
40510
+ * // Encrypt file data
40511
+ * const fileBlob = new Blob([fileContent], { type: 'application/json' });
40512
+ * const encryptedFile = await vana.encryptBlob(fileBlob, encryptionKey);
40513
+ *
40514
+ * // Store encrypted data safely
40515
+ * await storageProvider.upload(encrypted, 'encrypted-data.bin');
40083
40516
  * ```
40084
40517
  */
40085
40518
  async encryptBlob(data, key) {
@@ -40087,16 +40520,52 @@ var VanaCore = class {
40087
40520
  }
40088
40521
  /**
40089
40522
  * Decrypts data that was encrypted using the Vana protocol.
40090
- * This method automatically uses the correct platform adapter for the current environment.
40523
+ *
40524
+ * @remarks
40525
+ * This method decrypts data that was previously encrypted using the Vana network's
40526
+ * standard encryption protocol. It requires the same wallet signature that was used
40527
+ * for encryption and automatically uses the appropriate platform adapter for
40528
+ * cryptographic operations. The decrypted output maintains the original data format.
40091
40529
  *
40092
- * @param encryptedData The encrypted data (string or Blob)
40093
- * @param walletSignature The wallet signature to use as decryption key
40094
- * @returns The decrypted data as Blob
40530
+ * @param encryptedData - The encrypted data (string or Blob)
40531
+ * @param walletSignature - The wallet signature used as decryption key
40532
+ * @returns The decrypted data as a Blob
40533
+ * @throws {Error} When decryption fails due to invalid signature or corrupted data
40095
40534
  * @example
40096
40535
  * ```typescript
40097
- * const encryptionKey = await generateEncryptionKey(walletClient);
40098
- * const decrypted = await vana.decryptBlob(encryptedData, encryptionKey);
40099
- * const text = await decrypted.text();
40536
+ * import { generateEncryptionKey } from '@opendatalabs/vana-sdk/node';
40537
+ *
40538
+ * // Retrieve encrypted data from storage
40539
+ * const encryptedBlob = await storageProvider.download('encrypted-data.bin');
40540
+ *
40541
+ * // Generate the same key used for encryption
40542
+ * const decryptionKey = await generateEncryptionKey(vana.walletClient);
40543
+ *
40544
+ * // Decrypt the data
40545
+ * const decrypted = await vana.decryptBlob(encryptedBlob, decryptionKey);
40546
+ *
40547
+ * // Convert back to original format
40548
+ * const originalText = await decrypted.text();
40549
+ * const originalJson = JSON.parse(originalText);
40550
+ *
40551
+ * console.log('Decrypted data:', originalJson);
40552
+ * ```
40553
+ *
40554
+ * @example
40555
+ * ```typescript
40556
+ * // Decrypt file downloaded from Vana network
40557
+ * const userFiles = await vana.data.getUserFiles();
40558
+ * const file = userFiles[0];
40559
+ *
40560
+ * // Download encrypted content
40561
+ * const encrypted = await fetch(file.url).then(r => r.blob());
40562
+ *
40563
+ * // Decrypt with user's key
40564
+ * const decryptionKey = await generateEncryptionKey(vana.walletClient);
40565
+ * const decrypted = await vana.decryptBlob(encrypted, decryptionKey);
40566
+ *
40567
+ * // Process original data
40568
+ * const fileContent = await decrypted.arrayBuffer();
40100
40569
  * ```
40101
40570
  */
40102
40571
  async decryptBlob(encryptedData, walletSignature) {
@@ -40907,6 +41376,7 @@ export {
40907
41376
  BaseController,
40908
41377
  BlockchainError,
40909
41378
  BrowserPlatformAdapter,
41379
+ CallbackStorage,
40910
41380
  CircuitBreaker,
40911
41381
  ContractFactory,
40912
41382
  ContractNotFoundError,
@@ -40939,8 +41409,8 @@ export {
40939
41409
  SchemaValidator,
40940
41410
  SerializationError,
40941
41411
  ServerController,
40942
- ServerProxyStorage,
40943
41412
  ServerUrlMismatchError,
41413
+ SignatureCache,
40944
41414
  SignatureError,
40945
41415
  StorageError,
40946
41416
  StorageManager,
@@ -41011,6 +41481,7 @@ export {
41011
41481
  validateGrantFile,
41012
41482
  validateGranteeAccess,
41013
41483
  validateOperationAccess,
41014
- vanaMainnet2 as vanaMainnet
41484
+ vanaMainnet2 as vanaMainnet,
41485
+ withSignatureCache
41015
41486
  };
41016
41487
  //# sourceMappingURL=index.browser.js.map