@cofhe/sdk 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/acps/acp.ts +10 -1
  3. package/acps/index.ts +11 -0
  4. package/acps/onchain-utils.ts +188 -49
  5. package/acps/registry.ts +73 -0
  6. package/acps/test/onchainAccessStatus.test.ts +116 -0
  7. package/acps/types.ts +16 -0
  8. package/chains/chains/arbitrum.ts +14 -0
  9. package/chains/chains/ethereum.ts +14 -0
  10. package/chains/index.ts +5 -1
  11. package/chains/test/chains.test.ts +24 -3
  12. package/core/acps.ts +51 -143
  13. package/core/client.ts +13 -8
  14. package/core/clientTypes.ts +29 -4
  15. package/core/config.ts +25 -1
  16. package/core/consts.ts +14 -2
  17. package/core/decrypt/verifyDecryptResult.ts +4 -3
  18. package/core/encrypt/encryptInputsBuilder.ts +6 -0
  19. package/core/encrypt/zkPackProveVerify.ts +7 -1
  20. package/core/error.ts +1 -0
  21. package/core/fetchKeys.ts +2 -2
  22. package/core/index.ts +9 -1
  23. package/core/keyStore.ts +23 -10
  24. package/core/taskManager.ts +48 -0
  25. package/core/test/acps.test.ts +91 -1
  26. package/core/test/client.test.ts +41 -0
  27. package/core/test/config.test.ts +16 -0
  28. package/core/test/decrypt.test.ts +11 -4
  29. package/core/test/encryptInputsBuilder.test.ts +1 -1
  30. package/core/test/fetchKeys.test.ts +23 -2
  31. package/core/test/keyStore.test.ts +18 -6
  32. package/core/test/taskManager.test.ts +57 -0
  33. package/core/types.ts +8 -0
  34. package/dist/acps.cjs +314 -35
  35. package/dist/acps.d.cts +251 -4
  36. package/dist/acps.d.ts +251 -4
  37. package/dist/acps.js +2 -2
  38. package/dist/chains.cjs +26 -0
  39. package/dist/chains.d.cts +45 -1
  40. package/dist/chains.d.ts +45 -1
  41. package/dist/chains.js +1 -1
  42. package/dist/{chunk-43USWPEH.js → chunk-GGI7Y6AW.js} +59 -264
  43. package/dist/chunk-KSOV5B4B.js +50 -0
  44. package/dist/{chunk-ESMZCFJY.js → chunk-NMKMCAI3.js} +4 -2
  45. package/dist/{chunk-Q7CBWGQX.js → chunk-UJYOBHYA.js} +374 -37
  46. package/dist/{chunk-N6IDQRRU.js → chunk-UKQAJK4N.js} +25 -1
  47. package/dist/{clientTypes-BN3nbzYM.d.ts → clientTypes-5YPPR16m.d.ts} +77 -14
  48. package/dist/{clientTypes-CYZjFznO.d.cts → clientTypes-D3aIXmUp.d.cts} +77 -14
  49. package/dist/core.cjs +271 -136
  50. package/dist/core.d.cts +29 -8
  51. package/dist/core.d.ts +29 -8
  52. package/dist/core.js +4 -4
  53. package/dist/node.cjs +266 -136
  54. package/dist/node.d.cts +2 -2
  55. package/dist/node.d.ts +2 -2
  56. package/dist/node.js +5 -5
  57. package/dist/{acp-Wi6isVQI.d.cts → onchain-utils-CUAK8glx.d.cts} +31 -1
  58. package/dist/{acp-Wi6isVQI.d.ts → onchain-utils-CUAK8glx.d.ts} +31 -1
  59. package/dist/web.cjs +360 -150
  60. package/dist/web.d.cts +49 -3
  61. package/dist/web.d.ts +49 -3
  62. package/dist/web.js +51 -20
  63. package/dist/zkProve.worker.cjs +69 -15
  64. package/dist/zkProve.worker.js +23 -17
  65. package/node/storage.ts +2 -2
  66. package/node/test/inherited.test.ts +5 -1
  67. package/node/test/storage-memory-fallback.test.ts +47 -0
  68. package/package.json +5 -3
  69. package/web/index.ts +100 -26
  70. package/web/test/countingZkProveWorker.ts +31 -0
  71. package/web/test/inherited.web.test.ts +5 -1
  72. package/web/test/mainThreadPool.web.test.ts +174 -0
  73. package/web/test/threadPoolBenchHelper.ts +140 -0
  74. package/web/test/threadPoolOff.web.test.ts +17 -0
  75. package/web/test/threadPoolOn.web.test.ts +80 -0
  76. package/web/test/workerInitRace.web.test.ts +79 -0
  77. package/web/tfheThreadPool.ts +140 -0
  78. package/web/workerManager.ts +4 -2
  79. package/web/zkProve.worker.ts +42 -17
package/dist/core.cjs CHANGED
@@ -61,6 +61,7 @@ var CofheErrorCode = /* @__PURE__ */ ((CofheErrorCode2) => {
61
61
  CofheErrorCode2["PublicWalletGetChainIdFailed"] = "PUBLIC_WALLET_GET_CHAIN_ID_FAILED";
62
62
  CofheErrorCode2["PublicWalletGetAddressesFailed"] = "PUBLIC_WALLET_GET_ADDRESSES_FAILED";
63
63
  CofheErrorCode2["RehydrateKeysStoreFailed"] = "REHYDRATE_KEYS_STORE_FAILED";
64
+ CofheErrorCode2["TaskManagerUnresolved"] = "TASK_MANAGER_UNRESOLVED";
64
65
  CofheErrorCode2["BadRequest"] = "BAD_REQUEST";
65
66
  CofheErrorCode2["UnknownChain"] = "UNKNOWN_CHAIN";
66
67
  CofheErrorCode2["ACPMalformed"] = "ACP_MALFORMED";
@@ -175,7 +176,9 @@ var bigintSafeJsonStringify = (value) => {
175
176
  var isCofheError = (error) => error instanceof CofheError;
176
177
 
177
178
  // core/consts.ts
178
- var TASK_MANAGER_ADDRESS = "0xeA30c4B8b44078Bbf8a6ef5b9f1eC1626C7848D9";
179
+ var COFHE_ADDRESS_BOOK_ADDRESS = "0xC0F4e00E531a2B086492Ae3DCC1515038307196b";
180
+ var TASK_MANAGER_ID = 1n;
181
+ var MOCKS_TASK_MANAGER_ADDRESS = "0x0000000000000000000000000000000000005000";
179
182
  var MOCKS_ZK_VERIFIER_ADDRESS = "0x0000000000000000000000000000000000005001";
180
183
  var MOCKS_THRESHOLD_NETWORK_ADDRESS = "0x0000000000000000000000000000000000005002";
181
184
  var MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY = "0x6C8D7F768A6BB4AAFE85E8A2F5A9680355239C7E14646ED62B044E39DE154512";
@@ -915,6 +918,8 @@ var CofheConfigSchema = zod.z.object({
915
918
  }).or(zod.z.null()).default(null),
916
919
  /** Whether to use Web Workers for ZK proof generation (web platform only) */
917
920
  useWorkers: zod.z.boolean().optional().default(true),
921
+ /** How many threads tfhe's rayon pool may use for ZK proof generation (web platform only) */
922
+ tfheThreads: zod.z.union([zod.z.number().int().positive(), zod.z.literal("auto"), zod.z.literal(false)]).optional().default("auto"),
918
923
  /** ACP acp defaults */
919
924
  acp: zod.z.object({
920
925
  defaultRevoker: zod.z.custom().optional(),
@@ -1023,6 +1028,9 @@ var DEFAULT_KEYS_STORE = {
1023
1028
  fhe: {},
1024
1029
  crs: {}
1025
1030
  };
1031
+ function isSecurityZoneRecord(value) {
1032
+ return value != null && typeof value === "object";
1033
+ }
1026
1034
  function isStoreWithPersist(store) {
1027
1035
  return "persist" in store;
1028
1036
  }
@@ -1037,10 +1045,10 @@ function createKeysStore(storage) {
1037
1045
  const stored = keysStore.getState().fhe[chainId]?.[securityZone];
1038
1046
  return stored;
1039
1047
  };
1040
- const getCrs = (chainId) => {
1041
- if (chainId == null)
1048
+ const getCrs = (chainId, securityZone = 0) => {
1049
+ if (chainId == null || securityZone == null)
1042
1050
  return void 0;
1043
- const stored = keysStore.getState().crs[chainId];
1051
+ const stored = keysStore.getState().crs[chainId]?.[securityZone];
1044
1052
  return stored;
1045
1053
  };
1046
1054
  const setFheKey = (chainId, securityZone, key) => {
@@ -1052,10 +1060,12 @@ function createKeysStore(storage) {
1052
1060
  })
1053
1061
  );
1054
1062
  };
1055
- const setCrs = (chainId, crs) => {
1063
+ const setCrs = (chainId, securityZone, crs) => {
1056
1064
  keysStore.setState(
1057
1065
  immer.produce((state) => {
1058
- state.crs[chainId] = crs;
1066
+ if (state.crs[chainId] == null)
1067
+ state.crs[chainId] = {};
1068
+ state.crs[chainId][securityZone] = crs;
1059
1069
  })
1060
1070
  );
1061
1071
  };
@@ -1103,7 +1113,13 @@ function createStoreWithPersit(storage) {
1103
1113
  const currentZones = current.fhe[chainId] || {};
1104
1114
  mergedFhe[chainId] = { ...persistedZones, ...currentZones };
1105
1115
  }
1106
- const mergedCrs = { ...persisted.crs, ...current.crs };
1116
+ const mergedCrs = {};
1117
+ const allCrsChainIds = /* @__PURE__ */ new Set([...Object.keys(current.crs), ...Object.keys(persisted.crs)]);
1118
+ for (const chainId of allCrsChainIds) {
1119
+ const persistedZones = isSecurityZoneRecord(persisted.crs[chainId]) ? persisted.crs[chainId] : {};
1120
+ const currentZones = isSecurityZoneRecord(current.crs[chainId]) ? current.crs[chainId] : {};
1121
+ mergedCrs[chainId] = { ...persistedZones, ...currentZones };
1122
+ }
1107
1123
  return {
1108
1124
  fhe: mergedFhe,
1109
1125
  crs: mergedCrs
@@ -1165,7 +1181,7 @@ var fetchFhePublicKey = async (coFheUrl, chainId, securityZone, tfhePublicKeyDes
1165
1181
  return [pk_data, true];
1166
1182
  };
1167
1183
  var fetchCrs = async (coFheUrl, chainId, securityZone, compactPkeCrsDeserializer, keysStorage) => {
1168
- const storedKey = keysStorage?.getCrs(chainId);
1184
+ const storedKey = keysStorage?.getCrs(chainId, securityZone);
1169
1185
  const [storedKeyValid] = checkKeyValidity(storedKey, compactPkeCrsDeserializer);
1170
1186
  if (storedKeyValid)
1171
1187
  return [storedKey, false];
@@ -1192,7 +1208,7 @@ var fetchCrs = async (coFheUrl, chainId, securityZone, compactPkeCrsDeserializer
1192
1208
  console.error(`Error serializing CRS ${err}`);
1193
1209
  throw new Error(`Error serializing CRS; ${err}`);
1194
1210
  }
1195
- keysStorage?.setCrs(chainId, crs_data);
1211
+ keysStorage?.setCrs(chainId, securityZone, crs_data);
1196
1212
  return [crs_data, true];
1197
1213
  };
1198
1214
  var fetchKeys = async (config, chainId, securityZone = 0, tfhePublicKeyDeserializer, compactPkeCrsDeserializer, keysStorage) => {
@@ -1304,6 +1320,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1304
1320
  zkBuilderAndCrsGenerator;
1305
1321
  initTfhe;
1306
1322
  zkProveWorkerFn;
1323
+ beforeMainThreadProve;
1307
1324
  keysStorage;
1308
1325
  // Worker configuration (from config, overrideable)
1309
1326
  useWorker;
@@ -1361,6 +1378,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1361
1378
  this.zkBuilderAndCrsGenerator = params.zkBuilderAndCrsGenerator;
1362
1379
  this.initTfhe = params.initTfhe;
1363
1380
  this.zkProveWorkerFn = params.zkProveWorkerFn;
1381
+ this.beforeMainThreadProve = params.beforeMainThreadProve;
1364
1382
  this.keysStorage = params.keysStorage;
1365
1383
  this.useWorker = params.config?.useWorkers ?? true;
1366
1384
  }
@@ -1651,6 +1669,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1651
1669
  }
1652
1670
  }
1653
1671
  if (proof == null) {
1672
+ await this.beforeMainThreadProve?.();
1654
1673
  proof = await zkProve(zkBuilder, zkCrs, metadata);
1655
1674
  usedWorker = false;
1656
1675
  }
@@ -2047,11 +2066,40 @@ var SignatureUtils = {
2047
2066
  throw new Error(`Unknown acp type: ${acpType}`);
2048
2067
  }
2049
2068
  };
2069
+ var ADDRESS_BOOK_ABI = viem.parseAbi([
2070
+ "function getTm(uint256 id) view returns (address)",
2071
+ "error TaskManagerNotSet(uint256 id)"
2072
+ ]);
2073
+ var taskManagerAddressCache = /* @__PURE__ */ new Map();
2074
+ var getTaskManagerAddress = async (publicClient, chainId) => {
2075
+ const id = chainId ?? publicClient.chain?.id ?? await publicClient.getChainId();
2076
+ const cached = taskManagerAddressCache.get(id);
2077
+ if (cached != null)
2078
+ return cached;
2079
+ const pending = publicClient.readContract({
2080
+ address: COFHE_ADDRESS_BOOK_ADDRESS,
2081
+ abi: ADDRESS_BOOK_ABI,
2082
+ functionName: "getTm",
2083
+ args: [TASK_MANAGER_ID]
2084
+ }).catch((error) => {
2085
+ taskManagerAddressCache.delete(id);
2086
+ throw CofheError.fromError(error, {
2087
+ code: "TASK_MANAGER_UNRESOLVED" /* TaskManagerUnresolved */,
2088
+ message: `Failed to resolve the Task Manager from the CoFHEAddressBook on chain ${id}`,
2089
+ hint: "Ensure CoFHE is deployed on this chain. On a local hardhat / anvil chain, deploy the CoFHE mocks first.",
2090
+ context: { chainId: id, addressBook: COFHE_ADDRESS_BOOK_ADDRESS, taskManagerId: TASK_MANAGER_ID }
2091
+ });
2092
+ });
2093
+ taskManagerAddressCache.set(id, pending);
2094
+ return pending;
2095
+ };
2096
+
2097
+ // acps/onchain-utils.ts
2050
2098
  var getAclAddress = async (publicClient) => {
2051
2099
  const ACL_IFACE = "function acl() view returns (address)";
2052
2100
  const aclAbi = viem.parseAbi([ACL_IFACE]);
2053
2101
  return await publicClient.readContract({
2054
- address: TASK_MANAGER_ADDRESS,
2102
+ address: await getTaskManagerAddress(publicClient),
2055
2103
  abi: aclAbi,
2056
2104
  functionName: "acl"
2057
2105
  });
@@ -2078,6 +2126,34 @@ var getAclEIP712Domain = async (publicClient) => {
2078
2126
  verifyingContract
2079
2127
  };
2080
2128
  };
2129
+ var toACPTuple = (acp) => ({
2130
+ issuer: acp.issuer,
2131
+ expiration: BigInt(acp.expiration),
2132
+ recipient: acp.recipient,
2133
+ revokerData: BigInt(acp.revokerData),
2134
+ revokerContract: acp.revokerContract,
2135
+ scope: acp.scope,
2136
+ contracts: acp.contracts,
2137
+ handles: acp.handles,
2138
+ sealingKey: acp.sealingKey,
2139
+ issuerSignature: acp.issuerSignature,
2140
+ recipientSignature: acp.recipientSignature
2141
+ });
2142
+ function revertErrorName(err, abi) {
2143
+ const walk = err?.walk;
2144
+ if (typeof walk === "function") {
2145
+ const revertError = walk.call(err, (e) => e?.name === "ContractFunctionRevertedError");
2146
+ if (revertError)
2147
+ return revertError.data?.errorName ?? "";
2148
+ }
2149
+ const customErrorName = extractCustomErrorFromDetails(err, abi);
2150
+ if (customErrorName)
2151
+ return customErrorName;
2152
+ const hhDetailsData = extractReturnData(err);
2153
+ if (hhDetailsData != null)
2154
+ return viem.decodeErrorResult({ abi, data: hhDetailsData }).errorName;
2155
+ return void 0;
2156
+ }
2081
2157
  var checkACPValidityOnChain = async (acp, publicClient) => {
2082
2158
  const aclAddress = await getAclAddress(publicClient);
2083
2159
  try {
@@ -2085,43 +2161,54 @@ var checkACPValidityOnChain = async (acp, publicClient) => {
2085
2161
  address: aclAddress,
2086
2162
  abi: checkACPValidityAbi,
2087
2163
  functionName: "checkPermissionValidity",
2088
- args: [
2089
- {
2090
- issuer: acp.issuer,
2091
- expiration: BigInt(acp.expiration),
2092
- recipient: acp.recipient,
2093
- revokerData: BigInt(acp.revokerData),
2094
- revokerContract: acp.revokerContract,
2095
- scope: acp.scope,
2096
- contracts: acp.contracts,
2097
- handles: acp.handles,
2098
- sealingKey: acp.sealingKey,
2099
- issuerSignature: acp.issuerSignature,
2100
- recipientSignature: acp.recipientSignature
2101
- }
2102
- ]
2164
+ args: [toACPTuple(acp)]
2103
2165
  });
2104
2166
  return true;
2105
2167
  } catch (err) {
2106
- if (err instanceof viem.BaseError) {
2107
- const revertError = err.walk((err2) => err2 instanceof viem.ContractFunctionRevertedError);
2108
- if (revertError instanceof viem.ContractFunctionRevertedError) {
2109
- const errorName = revertError.data?.errorName ?? "";
2110
- throw new Error(errorName);
2111
- }
2112
- }
2113
- const customErrorName = extractCustomErrorFromDetails(err, checkACPValidityAbi);
2114
- if (customErrorName) {
2115
- throw new Error(customErrorName);
2116
- }
2117
- const hhDetailsData = extractReturnData(err);
2118
- if (hhDetailsData != null) {
2119
- const decoded = viem.decodeErrorResult({
2120
- abi: checkACPValidityAbi,
2121
- data: hhDetailsData
2168
+ const errorName = revertErrorName(err, checkACPValidityAbi);
2169
+ if (errorName !== void 0)
2170
+ throw new Error(errorName);
2171
+ throw err;
2172
+ }
2173
+ };
2174
+ var PERMISSION_ERROR_STATUS = {
2175
+ PermissionInvalid_Expired: "expired",
2176
+ PermissionInvalid_Disabled: "revoked",
2177
+ PermissionInvalid_IssuerSignature: "invalid-issuer-signature",
2178
+ PermissionInvalid_RecipientSignature: "invalid-recipient-signature"
2179
+ };
2180
+ var getACPAccessStatusOnChain = async (acp, publicClient, handle) => {
2181
+ const aclAddress = await getAclAddress(publicClient);
2182
+ try {
2183
+ if (handle === void 0) {
2184
+ await publicClient.simulateContract({
2185
+ address: aclAddress,
2186
+ abi: acpAccessAbi,
2187
+ functionName: "checkPermissionValidity",
2188
+ args: [toACPTuple(acp)]
2122
2189
  });
2123
- throw new Error(decoded.errorName);
2190
+ return "valid";
2124
2191
  }
2192
+ const ctHash = BigInt(handle);
2193
+ const allowed = await publicClient.readContract({
2194
+ address: aclAddress,
2195
+ abi: acpAccessAbi,
2196
+ functionName: "isAllowedWithPermission",
2197
+ args: [toACPTuple(acp), ctHash]
2198
+ });
2199
+ if (allowed)
2200
+ return "allowed";
2201
+ const issuerAllowed = await publicClient.readContract({
2202
+ address: aclAddress,
2203
+ abi: acpAccessAbi,
2204
+ functionName: "isAllowed",
2205
+ args: [ctHash, acp.issuer]
2206
+ });
2207
+ return issuerAllowed ? "out-of-scope" : "issuer-not-allowed";
2208
+ } catch (err) {
2209
+ const status = PERMISSION_ERROR_STATUS[revertErrorName(err, acpAccessAbi) ?? ""];
2210
+ if (status)
2211
+ return status;
2125
2212
  throw err;
2126
2213
  }
2127
2214
  };
@@ -2143,7 +2230,8 @@ function extractCustomErrorFromDetails(err, abi) {
2143
2230
  function extractReturnData(err) {
2144
2231
  const anyErr = err;
2145
2232
  const s = anyErr?.details ?? anyErr?.cause?.details ?? anyErr?.shortMessage ?? anyErr?.message ?? String(err);
2146
- return s.match(/return data:\s*(0x[a-fA-F0-9]+)/)?.[1];
2233
+ const match = s.match(/return data:\s*(0x[a-fA-F0-9]+)/) ?? s.match(/custom error (0x[a-fA-F0-9]{8,})/);
2234
+ return match?.[1];
2147
2235
  }
2148
2236
  var checkACPValidityAbi = [
2149
2237
  {
@@ -2243,6 +2331,58 @@ var checkACPValidityAbi = [
2243
2331
  inputs: []
2244
2332
  }
2245
2333
  ];
2334
+ var acpAccessAbi = [
2335
+ ...checkACPValidityAbi,
2336
+ {
2337
+ type: "function",
2338
+ name: "isAllowedWithPermission",
2339
+ inputs: [checkACPValidityAbi[0].inputs[0], { name: "handle", type: "uint256", internalType: "uint256" }],
2340
+ outputs: [{ name: "", type: "bool", internalType: "bool" }],
2341
+ stateMutability: "view"
2342
+ },
2343
+ {
2344
+ type: "function",
2345
+ name: "isAllowed",
2346
+ inputs: [
2347
+ { name: "handle", type: "uint256", internalType: "uint256" },
2348
+ { name: "account", type: "address", internalType: "address" }
2349
+ ],
2350
+ outputs: [{ name: "", type: "bool", internalType: "bool" }],
2351
+ stateMutability: "view"
2352
+ }
2353
+ ];
2354
+ var ACL_SERVED_ADDRESSES_ABI = viem.parseAbi([
2355
+ "function acl() view returns (address)",
2356
+ "function defaultRevokerContract() view returns (address)",
2357
+ "function shareRegistry() view returns (address)"
2358
+ ]);
2359
+ var aclServedAddressesCache = /* @__PURE__ */ new Map();
2360
+ var clearAclServedAddresses = () => aclServedAddressesCache.clear();
2361
+ var getAclServedAddresses = async (publicClient, chainId) => {
2362
+ const cached = aclServedAddressesCache.get(chainId);
2363
+ if (cached != null)
2364
+ return cached;
2365
+ let aclAddress;
2366
+ try {
2367
+ aclAddress = await publicClient.readContract({
2368
+ address: await getTaskManagerAddress(publicClient, chainId),
2369
+ abi: ACL_SERVED_ADDRESSES_ABI,
2370
+ functionName: "acl"
2371
+ });
2372
+ } catch {
2373
+ return {};
2374
+ }
2375
+ const [defaultRevoker, shareRegistry] = await Promise.all([
2376
+ publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "defaultRevokerContract" }).catch(() => void 0),
2377
+ publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "shareRegistry" }).catch(() => void 0)
2378
+ ]);
2379
+ const resolved = {
2380
+ defaultRevoker: defaultRevoker != null && defaultRevoker !== viem.zeroAddress ? defaultRevoker : void 0,
2381
+ shareRegistry: shareRegistry != null && shareRegistry !== viem.zeroAddress ? shareRegistry : void 0
2382
+ };
2383
+ aclServedAddressesCache.set(chainId, resolved);
2384
+ return resolved;
2385
+ };
2246
2386
 
2247
2387
  // acps/acp.ts
2248
2388
  var ACPUtils = {
@@ -2556,8 +2696,62 @@ var ACPUtils = {
2556
2696
  checkValidityOnChain: async (acp, publicClient) => {
2557
2697
  const publicAcp = ACPUtils.getPublic(acp);
2558
2698
  return checkACPValidityOnChain(publicAcp, publicClient);
2699
+ },
2700
+ /**
2701
+ * The acp on-chain status as a value instead of a revert: 'valid' or why not, and given a
2702
+ * handle, whether the acp may read it (see `ACPAccessStatus`).
2703
+ */
2704
+ checkAccessOnChain: async (acp, publicClient, handle) => {
2705
+ return getACPAccessStatusOnChain(ACPUtils.getPublic(acp), publicClient, handle);
2559
2706
  }
2560
2707
  };
2708
+ var ACP_REVOKER_ABI = viem.parseAbi([
2709
+ "function revokeSingle(uint256 id)",
2710
+ "function revokeAllExisting()",
2711
+ "function disabled(address issuer, uint256 id) view returns (bool)"
2712
+ ]);
2713
+ var ACP_SHARE_REGISTRY_ABI = viem.parseAbi([
2714
+ "struct ACP { address issuer; uint64 expiration; address recipient; uint256 revokerData; address revokerContract; uint8 scope; address[] contracts; bytes32[] handles; bytes32 sealingKey; bytes issuerSignature; bytes recipientSignature; }",
2715
+ "function share(ACP calldata acp) external returns (bytes32)",
2716
+ "function removeShare(bytes32 shareId) external",
2717
+ "function sharesFor(address recipient) external view returns (ACP[] memory)",
2718
+ "function getShare(bytes32 shareId) external view returns (ACP memory)",
2719
+ "function isShareValid(bytes32 shareId) external view returns (bool)"
2720
+ ]);
2721
+ var ACP_SHARE_TUPLE_ABI = [
2722
+ {
2723
+ type: "tuple",
2724
+ components: [
2725
+ { name: "issuer", type: "address" },
2726
+ { name: "expiration", type: "uint64" },
2727
+ { name: "recipient", type: "address" },
2728
+ { name: "revokerData", type: "uint256" },
2729
+ { name: "revokerContract", type: "address" },
2730
+ { name: "scope", type: "uint8" },
2731
+ { name: "contracts", type: "address[]" },
2732
+ { name: "handles", type: "bytes32[]" },
2733
+ { name: "sealingKey", type: "bytes32" },
2734
+ { name: "issuerSignature", type: "bytes" },
2735
+ { name: "recipientSignature", type: "bytes" }
2736
+ ]
2737
+ }
2738
+ ];
2739
+ var ZERO_BYTES32 = `0x${"0".repeat(64)}`;
2740
+ var toChainShare = (acp) => {
2741
+ const pub = ACPUtils.getPublic(acp, true);
2742
+ return {
2743
+ ...pub,
2744
+ expiration: BigInt(pub.expiration),
2745
+ revokerData: BigInt(pub.revokerData),
2746
+ sealingKey: ZERO_BYTES32,
2747
+ recipientSignature: "0x"
2748
+ };
2749
+ };
2750
+ var computeShareId = (acp) => {
2751
+ const p = toChainShare(acp);
2752
+ return viem.keccak256(viem.encodeAbiParameters(ACP_SHARE_TUPLE_ABI, [p]));
2753
+ };
2754
+ var shareIdOfChainShare = (share) => viem.keccak256(viem.encodeAbiParameters(ACP_SHARE_TUPLE_ABI, [share]));
2561
2755
  var ACP_STORE_DEFAULTS = {
2562
2756
  acps: {},
2563
2757
  activeACPHash: {}
@@ -2683,11 +2877,6 @@ var acpStore = {
2683
2877
  removeActiveACPHash,
2684
2878
  resetStore
2685
2879
  };
2686
- var ACP_VALIDATOR_ABI = viem.parseAbi([
2687
- "function revokeSingle(uint256 id)",
2688
- "function revokeAllExisting()",
2689
- "function disabled(address issuer, uint256 id) view returns (bool)"
2690
- ]);
2691
2880
  var storeACP = async (acp, publicClient, walletClient) => {
2692
2881
  const chainId = await publicClient.getChainId();
2693
2882
  const account = walletClient.account.address;
@@ -2714,8 +2903,8 @@ var createSelf = async (options, publicClient, walletClient) => {
2714
2903
  var createSharing = async (options, publicClient, walletClient) => {
2715
2904
  return createACPWithSign(options, publicClient, walletClient, ACPUtils.createSharingAndSign, false);
2716
2905
  };
2717
- var importShared = async (options, publicClient, walletClient) => {
2718
- return createACPWithSign(options, publicClient, walletClient, ACPUtils.importSharedAndSign);
2906
+ var importShared = async (options, publicClient, walletClient, { activate = true } = {}) => {
2907
+ return createACPWithSign(options, publicClient, walletClient, ACPUtils.importSharedAndSign, activate);
2719
2908
  };
2720
2909
  var getHash = (acp) => {
2721
2910
  return ACPUtils.getHash(acp);
@@ -2777,38 +2966,6 @@ var applyACPDefaults = (options, acpConfig, chainId) => {
2777
2966
  }
2778
2967
  return result;
2779
2968
  };
2780
- var ACL_SERVED_ADDRESSES_ABI = viem.parseAbi([
2781
- "function acl() view returns (address)",
2782
- "function defaultRevokerContract() view returns (address)",
2783
- "function shareRegistry() view returns (address)"
2784
- ]);
2785
- var aclServedAddressesCache = /* @__PURE__ */ new Map();
2786
- var clearAclServedAddresses = () => aclServedAddressesCache.clear();
2787
- var getAclServedAddresses = async (publicClient, chainId) => {
2788
- const cached = aclServedAddressesCache.get(chainId);
2789
- if (cached != null)
2790
- return cached;
2791
- let aclAddress;
2792
- try {
2793
- aclAddress = await publicClient.readContract({
2794
- address: TASK_MANAGER_ADDRESS,
2795
- abi: ACL_SERVED_ADDRESSES_ABI,
2796
- functionName: "acl"
2797
- });
2798
- } catch {
2799
- return {};
2800
- }
2801
- const [defaultRevoker, shareRegistry] = await Promise.all([
2802
- publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "defaultRevokerContract" }).catch(() => void 0),
2803
- publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "shareRegistry" }).catch(() => void 0)
2804
- ]);
2805
- const resolved = {
2806
- defaultRevoker: defaultRevoker != null && defaultRevoker !== viem.zeroAddress ? defaultRevoker : void 0,
2807
- shareRegistry: shareRegistry != null && shareRegistry !== viem.zeroAddress ? shareRegistry : void 0
2808
- };
2809
- aclServedAddressesCache.set(chainId, resolved);
2810
- return resolved;
2811
- };
2812
2969
  var applyACPDefaultsFromChain = async (options, acpConfig, publicClient, chainId) => {
2813
2970
  const hasExplicitRevoker = acpConfig?.defaultRevoker?.[chainId] != null || options.revokerData != null || options.revokerContract != null;
2814
2971
  if (hasExplicitRevoker)
@@ -2828,7 +2985,7 @@ var revokeACP = async (acp, walletClient) => {
2828
2985
  }
2829
2986
  return walletClient.writeContract({
2830
2987
  address: acp.revokerContract,
2831
- abi: ACP_VALIDATOR_ABI,
2988
+ abi: ACP_REVOKER_ABI,
2832
2989
  functionName: "revokeSingle",
2833
2990
  args: [BigInt(acp.revokerData)],
2834
2991
  account: walletClient.account,
@@ -2849,64 +3006,31 @@ var revokeAllACPs = async (walletClient, publicClient, revokerContract) => {
2849
3006
  }
2850
3007
  return walletClient.writeContract({
2851
3008
  address: revoker,
2852
- abi: ACP_VALIDATOR_ABI,
3009
+ abi: ACP_REVOKER_ABI,
2853
3010
  functionName: "revokeAllExisting",
2854
3011
  args: [],
2855
3012
  account: walletClient.account,
2856
3013
  chain: walletClient.chain
2857
3014
  });
2858
3015
  };
3016
+ var checkAccess = async (acp, publicClient, handle) => {
3017
+ if (acp.type === "sharing" && handle === void 0) {
3018
+ if (ACPUtils.isExpired(acp))
3019
+ return "expired";
3020
+ return await isACPRevoked(acp, publicClient) ? "revoked" : "valid";
3021
+ }
3022
+ return ACPUtils.checkAccessOnChain(acp, publicClient, handle);
3023
+ };
2859
3024
  var isACPRevoked = async (acp, publicClient) => {
2860
3025
  if (acp.revokerContract === viem.zeroAddress || acp.revokerData === 0)
2861
3026
  return false;
2862
3027
  return publicClient.readContract({
2863
3028
  address: acp.revokerContract,
2864
- abi: ACP_VALIDATOR_ABI,
3029
+ abi: ACP_REVOKER_ABI,
2865
3030
  functionName: "disabled",
2866
3031
  args: [acp.issuer, BigInt(acp.revokerData)]
2867
3032
  });
2868
3033
  };
2869
- var ACP_SHARE_REGISTRY_ABI = viem.parseAbi([
2870
- "struct ACP { address issuer; uint64 expiration; address recipient; uint256 revokerData; address revokerContract; uint8 scope; address[] contracts; bytes32[] handles; bytes32 sealingKey; bytes issuerSignature; bytes recipientSignature; }",
2871
- "function share(ACP calldata acp) external returns (bytes32)",
2872
- "function removeShare(bytes32 shareId) external",
2873
- "function sharesFor(address recipient) external view returns (ACP[] memory)",
2874
- "function getShare(bytes32 shareId) external view returns (ACP memory)",
2875
- "function isShareValid(bytes32 shareId) external view returns (bool)"
2876
- ]);
2877
- var ACP_TUPLE = [
2878
- {
2879
- type: "tuple",
2880
- components: [
2881
- { name: "issuer", type: "address" },
2882
- { name: "expiration", type: "uint64" },
2883
- { name: "recipient", type: "address" },
2884
- { name: "revokerData", type: "uint256" },
2885
- { name: "revokerContract", type: "address" },
2886
- { name: "scope", type: "uint8" },
2887
- { name: "contracts", type: "address[]" },
2888
- { name: "handles", type: "bytes32[]" },
2889
- { name: "sealingKey", type: "bytes32" },
2890
- { name: "issuerSignature", type: "bytes" },
2891
- { name: "recipientSignature", type: "bytes" }
2892
- ]
2893
- }
2894
- ];
2895
- var ZERO_BYTES32 = `0x${"0".repeat(64)}`;
2896
- var toChainShare = (acp) => {
2897
- const pub = ACPUtils.getPublic(acp, true);
2898
- return {
2899
- ...pub,
2900
- expiration: BigInt(pub.expiration),
2901
- revokerData: BigInt(pub.revokerData),
2902
- sealingKey: ZERO_BYTES32,
2903
- recipientSignature: "0x"
2904
- };
2905
- };
2906
- var computeShareId = (acp) => {
2907
- const p = toChainShare(acp);
2908
- return viem.keccak256(viem.encodeAbiParameters(ACP_TUPLE, [p]));
2909
- };
2910
3034
  var shareOnChain = async (acp, walletClient, registry) => {
2911
3035
  if (acp.type !== "sharing") {
2912
3036
  throw new Error(`Cannot share a '${acp.type}' ACP on-chain \u2014 only 'sharing' ACPs are shareable.`);
@@ -2937,7 +3061,7 @@ var getIncomingShares = async (publicClient, registry, recipient) => {
2937
3061
  args: [recipient]
2938
3062
  });
2939
3063
  return raw.map((s) => ({
2940
- shareId: viem.keccak256(viem.encodeAbiParameters(ACP_TUPLE, [s])),
3064
+ shareId: shareIdOfChainShare(s),
2941
3065
  issuer: s.issuer,
2942
3066
  expiration: Number(s.expiration),
2943
3067
  recipient: s.recipient,
@@ -2949,9 +3073,9 @@ var getIncomingShares = async (publicClient, registry, recipient) => {
2949
3073
  issuerSignature: s.issuerSignature
2950
3074
  }));
2951
3075
  };
2952
- var importFromChain = async (share, publicClient, walletClient) => {
3076
+ var importFromChain = async (share, publicClient, walletClient, importOptions = {}) => {
2953
3077
  const { shareId: _shareId, ...options } = share;
2954
- return importShared({ ...options, type: "sharing" }, publicClient, walletClient);
3078
+ return importShared({ ...options, type: "sharing" }, publicClient, walletClient, importOptions);
2955
3079
  };
2956
3080
  var removeShareOnChain = async (shareId, walletClient, registry) => {
2957
3081
  if (walletClient.account == null)
@@ -2989,6 +3113,7 @@ var acps = {
2989
3113
  revokeACP,
2990
3114
  revokeAllACPs,
2991
3115
  isACPRevoked,
3116
+ checkAccess,
2992
3117
  shareOnChain,
2993
3118
  getIncomingShares,
2994
3119
  importFromChain,
@@ -4708,7 +4833,7 @@ var buildDecryptResultHash = (ctHash, cleartext, chainId) => {
4708
4833
  async function verifyDecryptResult(handle, cleartext, signature, publicClient) {
4709
4834
  const chainId = publicClient.chain?.id ?? await publicClient.getChainId();
4710
4835
  const expectedSigner = await publicClient.readContract({
4711
- address: TASK_MANAGER_ADDRESS,
4836
+ address: await getTaskManagerAddress(publicClient, chainId),
4712
4837
  abi: decryptResultSignerAbi,
4713
4838
  functionName: "decryptResultSigner",
4714
4839
  args: []
@@ -4828,6 +4953,7 @@ function createCofheClientBase(opts) {
4828
4953
  zkBuilderAndCrsGenerator: opts.zkBuilderAndCrsGenerator,
4829
4954
  initTfhe: opts.initTfhe,
4830
4955
  zkProveWorkerFn: opts.zkProveWorkerFn,
4956
+ beforeMainThreadProve: opts.beforeMainThreadProve,
4831
4957
  keysStorage,
4832
4958
  requireConnected: _requireConnected
4833
4959
  });
@@ -4904,10 +5030,11 @@ function createCofheClientBase(opts) {
4904
5030
  walletClient
4905
5031
  );
4906
5032
  },
4907
- importShared: async (options, clients) => {
5033
+ importShared: async (options, importOptions = {}) => {
4908
5034
  _requireConnected();
4909
- const { publicClient, walletClient } = clients ?? connectStore.getState();
4910
- return acps.importShared(options, publicClient, walletClient);
5035
+ const { activate, ...clients } = importOptions;
5036
+ const { publicClient, walletClient } = clients.publicClient ? clients : connectStore.getState();
5037
+ return acps.importShared(options, publicClient, walletClient, { activate });
4911
5038
  },
4912
5039
  // Get or create methods (require connection)
4913
5040
  getOrCreateSelfACP: async (chainId, account, options) => {
@@ -4950,6 +5077,11 @@ function createCofheClientBase(opts) {
4950
5077
  const { publicClient } = connectStore.getState();
4951
5078
  return acps.isACPRevoked(acp, publicClient);
4952
5079
  },
5080
+ checkAccess: async (acp, handle) => {
5081
+ _requireConnected();
5082
+ const { publicClient } = connectStore.getState();
5083
+ return acps.checkAccess(acp, publicClient, handle);
5084
+ },
4953
5085
  // On-chain sharing (require connection + config.acp.sharingRegistry)
4954
5086
  shareOnChain: async (acp) => {
4955
5087
  _requireConnected();
@@ -4966,10 +5098,10 @@ function createCofheClientBase(opts) {
4966
5098
  const sharingRegistry = await _resolveSharingRegistry(publicClient, chainId);
4967
5099
  return acps.getIncomingShares(publicClient, sharingRegistry, account);
4968
5100
  },
4969
- importFromChain: async (share) => {
5101
+ importFromChain: async (share, options) => {
4970
5102
  _requireConnected();
4971
5103
  const { publicClient, walletClient } = connectStore.getState();
4972
- return acps.importFromChain(share, publicClient, walletClient);
5104
+ return acps.importFromChain(share, publicClient, walletClient, options);
4973
5105
  },
4974
5106
  dismissShare: async (shareId) => {
4975
5107
  _requireConnected();
@@ -5057,6 +5189,7 @@ function createCofheClientBase(opts) {
5057
5189
  };
5058
5190
  }
5059
5191
 
5192
+ exports.COFHE_ADDRESS_BOOK_ADDRESS = COFHE_ADDRESS_BOOK_ADDRESS;
5060
5193
  exports.CONNECT_STORE_DEFAULTS = InitialConnectStore;
5061
5194
  exports.CofheError = CofheError;
5062
5195
  exports.CofheErrorCode = CofheErrorCode;
@@ -5069,11 +5202,12 @@ exports.FheAllUTypes = FheAllUTypes;
5069
5202
  exports.FheTypes = FheTypes;
5070
5203
  exports.FheUintUTypes = FheUintUTypes;
5071
5204
  exports.MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY = MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY;
5205
+ exports.MOCKS_TASK_MANAGER_ADDRESS = MOCKS_TASK_MANAGER_ADDRESS;
5072
5206
  exports.MOCKS_THRESHOLD_NETWORK_ADDRESS = MOCKS_THRESHOLD_NETWORK_ADDRESS;
5073
5207
  exports.MOCKS_ZK_VERIFIER_ADDRESS = MOCKS_ZK_VERIFIER_ADDRESS;
5074
5208
  exports.MOCKS_ZK_VERIFIER_SIGNER_ADDRESS = MOCKS_ZK_VERIFIER_SIGNER_ADDRESS;
5075
5209
  exports.MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY = MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY;
5076
- exports.TASK_MANAGER_ADDRESS = TASK_MANAGER_ADDRESS;
5210
+ exports.TASK_MANAGER_ID = TASK_MANAGER_ID;
5077
5211
  exports.TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT = TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT;
5078
5212
  exports.TFHE_RS_ZK_MAX_BITS = TFHE_RS_ZK_MAX_BITS;
5079
5213
  exports.assertNoRenamedConfigKeys = assertNoRenamedConfigKeys;
@@ -5085,6 +5219,7 @@ exports.fetchKeys = fetchKeys;
5085
5219
  exports.fheTypeToString = fheTypeToString;
5086
5220
  exports.getCofheConfigItem = getCofheConfigItem;
5087
5221
  exports.getCofheDebugInterceptors = getCofheDebugInterceptors;
5222
+ exports.getTaskManagerAddress = getTaskManagerAddress;
5088
5223
  exports.isCofheError = isCofheError;
5089
5224
  exports.isEncryptableItem = isEncryptableItem;
5090
5225
  exports.isLastEncryptionStep = isLastEncryptionStep;