@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
@@ -1,173 +1,14 @@
1
- import { hardhat as hardhat$1 } from './chunk-N6IDQRRU.js';
2
- import { acpStore, ACPUtils } from './chunk-Q7CBWGQX.js';
3
- import { TFHE_RS_KEY_VERSION, TASK_MANAGER_ADDRESS, TFHE_RS_ZK_MAX_BITS, TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT, MOCKS_THRESHOLD_NETWORK_ADDRESS, MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY, MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY, MOCKS_ZK_VERIFIER_ADDRESS } from './chunk-ESMZCFJY.js';
1
+ import { hardhat as hardhat$1 } from './chunk-UKQAJK4N.js';
2
+ import { acpStore, CofheError, clearAclServedAddresses, getAclServedAddresses, computeShareId, ACPUtils, getTaskManagerAddress, ACP_SHARE_REGISTRY_ABI, shareIdOfChainShare, toChainShare, ACP_REVOKER_ABI } from './chunk-UJYOBHYA.js';
3
+ import { TFHE_RS_KEY_VERSION, TFHE_RS_ZK_MAX_BITS, TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT, MOCKS_THRESHOLD_NETWORK_ADDRESS, MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY, MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY, MOCKS_ZK_VERIFIER_ADDRESS } from './chunk-NMKMCAI3.js';
4
4
  import { createStore } from 'zustand/vanilla';
5
- import { parseAbi, isAddressEqual, zeroAddress, recoverAddress, keccak256, encodeAbiParameters, encodePacked, createWalletClient, http, getAddress, parseSignature, serializeSignature } from 'viem';
5
+ import { parseAbi, isAddressEqual, zeroAddress, recoverAddress, encodePacked, keccak256, createWalletClient, http, getAddress, parseSignature, serializeSignature } from 'viem';
6
6
  import { hardhat } from 'viem/chains';
7
7
  import { sign, privateKeyToAccount } from 'viem/accounts';
8
8
  import { z } from 'zod';
9
9
  import { persist, createJSONStorage } from 'zustand/middleware';
10
10
  import { produce } from 'immer';
11
11
 
12
- // core/error.ts
13
- var CofheErrorCode = /* @__PURE__ */ ((CofheErrorCode2) => {
14
- CofheErrorCode2["InternalError"] = "INTERNAL_ERROR";
15
- CofheErrorCode2["UnknownEnvironment"] = "UNKNOWN_ENVIRONMENT";
16
- CofheErrorCode2["InitTfheFailed"] = "INIT_TFHE_FAILED";
17
- CofheErrorCode2["InitViemFailed"] = "INIT_VIEM_FAILED";
18
- CofheErrorCode2["InitEthersFailed"] = "INIT_ETHERS_FAILED";
19
- CofheErrorCode2["NotConnected"] = "NOT_CONNECTED";
20
- CofheErrorCode2["MissingPublicClient"] = "MISSING_PUBLIC_CLIENT";
21
- CofheErrorCode2["MissingWalletClient"] = "MISSING_WALLET_CLIENT";
22
- CofheErrorCode2["MissingProviderParam"] = "MISSING_PROVIDER_PARAM";
23
- CofheErrorCode2["EmptySecurityZonesParam"] = "EMPTY_SECURITY_ZONES_PARAM";
24
- CofheErrorCode2["InvalidACPData"] = "INVALID_ACP_DATA";
25
- CofheErrorCode2["InvalidACPDomain"] = "INVALID_ACP_DOMAIN";
26
- CofheErrorCode2["ACPNotFound"] = "ACP_NOT_FOUND";
27
- CofheErrorCode2["CannotRemoveLastACP"] = "CANNOT_REMOVE_LAST_ACP";
28
- CofheErrorCode2["AccountUninitialized"] = "ACCOUNT_UNINITIALIZED";
29
- CofheErrorCode2["ChainIdUninitialized"] = "CHAIN_ID_UNINITIALIZED";
30
- CofheErrorCode2["ConsumingContractUninitialized"] = "CONSUMING_CONTRACT_UNINITIALIZED";
31
- CofheErrorCode2["SealOutputFailed"] = "SEAL_OUTPUT_FAILED";
32
- CofheErrorCode2["SealOutputReturnedNull"] = "SEAL_OUTPUT_RETURNED_NULL";
33
- CofheErrorCode2["InvalidUtype"] = "INVALID_UTYPE";
34
- CofheErrorCode2["DecryptFailed"] = "DECRYPT_FAILED";
35
- CofheErrorCode2["DecryptReturnedNull"] = "DECRYPT_RETURNED_NULL";
36
- CofheErrorCode2["ZkMocksInsertCtHashesFailed"] = "ZK_MOCKS_INSERT_CT_HASHES_FAILED";
37
- CofheErrorCode2["ZkMocksCalcCtHashesFailed"] = "ZK_MOCKS_CALC_CT_HASHES_FAILED";
38
- CofheErrorCode2["ZkMocksVerifySignFailed"] = "ZK_MOCKS_VERIFY_SIGN_FAILED";
39
- CofheErrorCode2["ZkMocksCreateProofSignatureFailed"] = "ZK_MOCKS_CREATE_PROOF_SIGNATURE_FAILED";
40
- CofheErrorCode2["ZkVerifyFailed"] = "ZK_VERIFY_FAILED";
41
- CofheErrorCode2["ZkPackFailed"] = "ZK_PACK_FAILED";
42
- CofheErrorCode2["ZkProveFailed"] = "ZK_PROVE_FAILED";
43
- CofheErrorCode2["EncryptRemainingInItems"] = "ENCRYPT_REMAINING_IN_ITEMS";
44
- CofheErrorCode2["ZkUninitialized"] = "ZK_UNINITIALIZED";
45
- CofheErrorCode2["ZkVerifierUrlUninitialized"] = "ZK_VERIFIER_URL_UNINITIALIZED";
46
- CofheErrorCode2["ThresholdNetworkUrlUninitialized"] = "THRESHOLD_NETWORK_URL_UNINITIALIZED";
47
- CofheErrorCode2["MissingConfig"] = "MISSING_CONFIG";
48
- CofheErrorCode2["UnsupportedChain"] = "UNSUPPORTED_CHAIN";
49
- CofheErrorCode2["MissingZkBuilderAndCrsGenerator"] = "MISSING_ZK_BUILDER_AND_CRS_GENERATOR";
50
- CofheErrorCode2["MissingTfhePublicKeyDeserializer"] = "MISSING_TFHE_PUBLIC_KEY_DESERIALIZER";
51
- CofheErrorCode2["MissingCompactPkeCrsDeserializer"] = "MISSING_COMPACT_PKE_CRS_DESERIALIZER";
52
- CofheErrorCode2["MissingFheKey"] = "MISSING_FHE_KEY";
53
- CofheErrorCode2["MissingCrs"] = "MISSING_CRS";
54
- CofheErrorCode2["FetchKeysFailed"] = "FETCH_KEYS_FAILED";
55
- CofheErrorCode2["PublicWalletGetChainIdFailed"] = "PUBLIC_WALLET_GET_CHAIN_ID_FAILED";
56
- CofheErrorCode2["PublicWalletGetAddressesFailed"] = "PUBLIC_WALLET_GET_ADDRESSES_FAILED";
57
- CofheErrorCode2["RehydrateKeysStoreFailed"] = "REHYDRATE_KEYS_STORE_FAILED";
58
- CofheErrorCode2["BadRequest"] = "BAD_REQUEST";
59
- CofheErrorCode2["UnknownChain"] = "UNKNOWN_CHAIN";
60
- CofheErrorCode2["ACPMalformed"] = "ACP_MALFORMED";
61
- CofheErrorCode2["ACPDenied"] = "ACP_DENIED";
62
- CofheErrorCode2["ACPExpired"] = "ACP_EXPIRED";
63
- CofheErrorCode2["ACPInvalid"] = "ACP_INVALID";
64
- CofheErrorCode2["ACPRevoked"] = "ACP_REVOKED";
65
- CofheErrorCode2["NotPubliclyAllowed"] = "NOT_PUBLICLY_ALLOWED";
66
- CofheErrorCode2["CtNotFound"] = "CT_NOT_FOUND";
67
- CofheErrorCode2["UnsupportedSecurityZone"] = "UNSUPPORTED_SECURITY_ZONE";
68
- CofheErrorCode2["UnsupportedType"] = "UNSUPPORTED_TYPE";
69
- CofheErrorCode2["SigningFailed"] = "SIGNING_FAILED";
70
- CofheErrorCode2["CtSourceError"] = "CT_SOURCE_ERROR";
71
- CofheErrorCode2["ACPVerifierError"] = "ACP_VERIFIER_ERROR";
72
- CofheErrorCode2["CtSourceTimeout"] = "CT_SOURCE_TIMEOUT";
73
- CofheErrorCode2["ACPVerifierTimeout"] = "ACP_VERIFIER_TIMEOUT";
74
- CofheErrorCode2["ACPRequired"] = "ACP_REQUIRED";
75
- CofheErrorCode2["SealFailed"] = "SEAL_FAILED";
76
- return CofheErrorCode2;
77
- })(CofheErrorCode || {});
78
- var CofheError = class _CofheError extends Error {
79
- code;
80
- cause;
81
- hint;
82
- context;
83
- apiErrorCode;
84
- constructor({ code, message, cause, hint, context, apiErrorCode }) {
85
- const fullMessage = cause ? `${message} | Caused by: ${cause.message}` : message;
86
- super(fullMessage);
87
- this.name = "CofheError";
88
- this.code = code;
89
- this.cause = cause;
90
- this.hint = hint;
91
- this.context = context;
92
- this.apiErrorCode = apiErrorCode;
93
- if (Error.captureStackTrace) {
94
- Error.captureStackTrace(this, _CofheError);
95
- }
96
- }
97
- /**
98
- * Creates a CofheError from an unknown error
99
- * If the error is a CofheError, it is returned unchanged, else a new CofheError is created
100
- * If a wrapperError is provided, it is used to create the new CofheError, else a default is used
101
- */
102
- static fromError(error, wrapperError) {
103
- if (isCofheError(error))
104
- return error;
105
- const cause = error instanceof Error ? error : new Error(`${error}`);
106
- return new _CofheError({
107
- code: wrapperError?.code ?? "INTERNAL_ERROR" /* InternalError */,
108
- message: wrapperError?.message ?? "An internal error occurred",
109
- hint: wrapperError?.hint,
110
- context: wrapperError?.context,
111
- apiErrorCode: wrapperError?.apiErrorCode,
112
- cause
113
- });
114
- }
115
- /**
116
- * Serializes the error to JSON string with proper handling of Error objects
117
- */
118
- serialize() {
119
- return bigintSafeJsonStringify({
120
- name: this.name,
121
- code: this.code,
122
- message: this.message,
123
- hint: this.hint,
124
- context: this.context,
125
- apiErrorCode: this.apiErrorCode,
126
- cause: this.cause ? {
127
- name: this.cause.name,
128
- message: this.cause.message,
129
- stack: this.cause.stack
130
- } : void 0,
131
- stack: this.stack
132
- });
133
- }
134
- /**
135
- * Returns a human-readable string representation of the error
136
- */
137
- toString() {
138
- const codeSuffix = this.apiErrorCode ? ` (api: ${this.apiErrorCode})` : "";
139
- const parts = [`${this.name} [${this.code}]${codeSuffix}: ${this.message}`];
140
- if (this.hint) {
141
- parts.push(`Hint: ${this.hint}`);
142
- }
143
- if (this.context && Object.keys(this.context).length > 0) {
144
- parts.push(`Context: ${bigintSafeJsonStringify(this.context)}`);
145
- }
146
- if (this.stack) {
147
- parts.push(`
148
- Stack trace:`);
149
- parts.push(this.stack);
150
- }
151
- if (this.cause) {
152
- parts.push(`
153
- Caused by: ${this.cause.name}: ${this.cause.message}`);
154
- if (this.cause.stack) {
155
- parts.push(this.cause.stack);
156
- }
157
- }
158
- return parts.join("\n");
159
- }
160
- };
161
- var bigintSafeJsonStringify = (value) => {
162
- return JSON.stringify(value, (key, value2) => {
163
- if (typeof value2 === "bigint") {
164
- return `${value2}n`;
165
- }
166
- return value2;
167
- });
168
- };
169
- var isCofheError = (error) => error instanceof CofheError;
170
-
171
12
  // core/types.ts
172
13
  var FheTypes = /* @__PURE__ */ ((FheTypes2) => {
173
14
  FheTypes2[FheTypes2["Bool"] = 0] = "Bool";
@@ -862,6 +703,8 @@ var CofheConfigSchema = z.object({
862
703
  }).or(z.null()).default(null),
863
704
  /** Whether to use Web Workers for ZK proof generation (web platform only) */
864
705
  useWorkers: z.boolean().optional().default(true),
706
+ /** How many threads tfhe's rayon pool may use for ZK proof generation (web platform only) */
707
+ tfheThreads: z.union([z.number().int().positive(), z.literal("auto"), z.literal(false)]).optional().default("auto"),
865
708
  /** ACP acp defaults */
866
709
  acp: z.object({
867
710
  defaultRevoker: z.custom().optional(),
@@ -970,6 +813,9 @@ var DEFAULT_KEYS_STORE = {
970
813
  fhe: {},
971
814
  crs: {}
972
815
  };
816
+ function isSecurityZoneRecord(value) {
817
+ return value != null && typeof value === "object";
818
+ }
973
819
  function isStoreWithPersist(store) {
974
820
  return "persist" in store;
975
821
  }
@@ -984,10 +830,10 @@ function createKeysStore(storage) {
984
830
  const stored = keysStore.getState().fhe[chainId]?.[securityZone];
985
831
  return stored;
986
832
  };
987
- const getCrs = (chainId) => {
988
- if (chainId == null)
833
+ const getCrs = (chainId, securityZone = 0) => {
834
+ if (chainId == null || securityZone == null)
989
835
  return void 0;
990
- const stored = keysStore.getState().crs[chainId];
836
+ const stored = keysStore.getState().crs[chainId]?.[securityZone];
991
837
  return stored;
992
838
  };
993
839
  const setFheKey = (chainId, securityZone, key) => {
@@ -999,10 +845,12 @@ function createKeysStore(storage) {
999
845
  })
1000
846
  );
1001
847
  };
1002
- const setCrs = (chainId, crs) => {
848
+ const setCrs = (chainId, securityZone, crs) => {
1003
849
  keysStore.setState(
1004
850
  produce((state) => {
1005
- state.crs[chainId] = crs;
851
+ if (state.crs[chainId] == null)
852
+ state.crs[chainId] = {};
853
+ state.crs[chainId][securityZone] = crs;
1006
854
  })
1007
855
  );
1008
856
  };
@@ -1050,7 +898,13 @@ function createStoreWithPersit(storage) {
1050
898
  const currentZones = current.fhe[chainId] || {};
1051
899
  mergedFhe[chainId] = { ...persistedZones, ...currentZones };
1052
900
  }
1053
- const mergedCrs = { ...persisted.crs, ...current.crs };
901
+ const mergedCrs = {};
902
+ const allCrsChainIds = /* @__PURE__ */ new Set([...Object.keys(current.crs), ...Object.keys(persisted.crs)]);
903
+ for (const chainId of allCrsChainIds) {
904
+ const persistedZones = isSecurityZoneRecord(persisted.crs[chainId]) ? persisted.crs[chainId] : {};
905
+ const currentZones = isSecurityZoneRecord(current.crs[chainId]) ? current.crs[chainId] : {};
906
+ mergedCrs[chainId] = { ...persistedZones, ...currentZones };
907
+ }
1054
908
  return {
1055
909
  fhe: mergedFhe,
1056
910
  crs: mergedCrs
@@ -1112,7 +966,7 @@ var fetchFhePublicKey = async (coFheUrl, chainId, securityZone, tfhePublicKeyDes
1112
966
  return [pk_data, true];
1113
967
  };
1114
968
  var fetchCrs = async (coFheUrl, chainId, securityZone, compactPkeCrsDeserializer, keysStorage) => {
1115
- const storedKey = keysStorage?.getCrs(chainId);
969
+ const storedKey = keysStorage?.getCrs(chainId, securityZone);
1116
970
  const [storedKeyValid] = checkKeyValidity(storedKey, compactPkeCrsDeserializer);
1117
971
  if (storedKeyValid)
1118
972
  return [storedKey, false];
@@ -1139,7 +993,7 @@ var fetchCrs = async (coFheUrl, chainId, securityZone, compactPkeCrsDeserializer
1139
993
  console.error(`Error serializing CRS ${err}`);
1140
994
  throw new Error(`Error serializing CRS; ${err}`);
1141
995
  }
1142
- keysStorage?.setCrs(chainId, crs_data);
996
+ keysStorage?.setCrs(chainId, securityZone, crs_data);
1143
997
  return [crs_data, true];
1144
998
  };
1145
999
  var fetchKeys = async (config, chainId, securityZone = 0, tfhePublicKeyDeserializer, compactPkeCrsDeserializer, keysStorage) => {
@@ -1251,6 +1105,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1251
1105
  zkBuilderAndCrsGenerator;
1252
1106
  initTfhe;
1253
1107
  zkProveWorkerFn;
1108
+ beforeMainThreadProve;
1254
1109
  keysStorage;
1255
1110
  // Worker configuration (from config, overrideable)
1256
1111
  useWorker;
@@ -1308,6 +1163,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1308
1163
  this.zkBuilderAndCrsGenerator = params.zkBuilderAndCrsGenerator;
1309
1164
  this.initTfhe = params.initTfhe;
1310
1165
  this.zkProveWorkerFn = params.zkProveWorkerFn;
1166
+ this.beforeMainThreadProve = params.beforeMainThreadProve;
1311
1167
  this.keysStorage = params.keysStorage;
1312
1168
  this.useWorker = params.config?.useWorkers ?? true;
1313
1169
  }
@@ -1598,6 +1454,7 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1598
1454
  }
1599
1455
  }
1600
1456
  if (proof == null) {
1457
+ await this.beforeMainThreadProve?.();
1601
1458
  proof = await zkProve(zkBuilder, zkCrs, metadata);
1602
1459
  usedWorker = false;
1603
1460
  }
@@ -1655,11 +1512,6 @@ var EncryptInputsBuilder = class extends BaseBuilder {
1655
1512
  return this.buildBatchResult(result);
1656
1513
  }
1657
1514
  };
1658
- var ACP_VALIDATOR_ABI = parseAbi([
1659
- "function revokeSingle(uint256 id)",
1660
- "function revokeAllExisting()",
1661
- "function disabled(address issuer, uint256 id) view returns (bool)"
1662
- ]);
1663
1515
  var storeACP = async (acp, publicClient, walletClient) => {
1664
1516
  const chainId = await publicClient.getChainId();
1665
1517
  const account = walletClient.account.address;
@@ -1686,8 +1538,8 @@ var createSelf = async (options, publicClient, walletClient) => {
1686
1538
  var createSharing = async (options, publicClient, walletClient) => {
1687
1539
  return createACPWithSign(options, publicClient, walletClient, ACPUtils.createSharingAndSign, false);
1688
1540
  };
1689
- var importShared = async (options, publicClient, walletClient) => {
1690
- return createACPWithSign(options, publicClient, walletClient, ACPUtils.importSharedAndSign);
1541
+ var importShared = async (options, publicClient, walletClient, { activate = true } = {}) => {
1542
+ return createACPWithSign(options, publicClient, walletClient, ACPUtils.importSharedAndSign, activate);
1691
1543
  };
1692
1544
  var getHash = (acp) => {
1693
1545
  return ACPUtils.getHash(acp);
@@ -1749,38 +1601,6 @@ var applyACPDefaults = (options, acpConfig, chainId) => {
1749
1601
  }
1750
1602
  return result;
1751
1603
  };
1752
- var ACL_SERVED_ADDRESSES_ABI = parseAbi([
1753
- "function acl() view returns (address)",
1754
- "function defaultRevokerContract() view returns (address)",
1755
- "function shareRegistry() view returns (address)"
1756
- ]);
1757
- var aclServedAddressesCache = /* @__PURE__ */ new Map();
1758
- var clearAclServedAddresses = () => aclServedAddressesCache.clear();
1759
- var getAclServedAddresses = async (publicClient, chainId) => {
1760
- const cached = aclServedAddressesCache.get(chainId);
1761
- if (cached != null)
1762
- return cached;
1763
- let aclAddress;
1764
- try {
1765
- aclAddress = await publicClient.readContract({
1766
- address: TASK_MANAGER_ADDRESS,
1767
- abi: ACL_SERVED_ADDRESSES_ABI,
1768
- functionName: "acl"
1769
- });
1770
- } catch {
1771
- return {};
1772
- }
1773
- const [defaultRevoker, shareRegistry] = await Promise.all([
1774
- publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "defaultRevokerContract" }).catch(() => void 0),
1775
- publicClient.readContract({ address: aclAddress, abi: ACL_SERVED_ADDRESSES_ABI, functionName: "shareRegistry" }).catch(() => void 0)
1776
- ]);
1777
- const resolved = {
1778
- defaultRevoker: defaultRevoker != null && defaultRevoker !== zeroAddress ? defaultRevoker : void 0,
1779
- shareRegistry: shareRegistry != null && shareRegistry !== zeroAddress ? shareRegistry : void 0
1780
- };
1781
- aclServedAddressesCache.set(chainId, resolved);
1782
- return resolved;
1783
- };
1784
1604
  var applyACPDefaultsFromChain = async (options, acpConfig, publicClient, chainId) => {
1785
1605
  const hasExplicitRevoker = acpConfig?.defaultRevoker?.[chainId] != null || options.revokerData != null || options.revokerContract != null;
1786
1606
  if (hasExplicitRevoker)
@@ -1800,7 +1620,7 @@ var revokeACP = async (acp, walletClient) => {
1800
1620
  }
1801
1621
  return walletClient.writeContract({
1802
1622
  address: acp.revokerContract,
1803
- abi: ACP_VALIDATOR_ABI,
1623
+ abi: ACP_REVOKER_ABI,
1804
1624
  functionName: "revokeSingle",
1805
1625
  args: [BigInt(acp.revokerData)],
1806
1626
  account: walletClient.account,
@@ -1821,64 +1641,31 @@ var revokeAllACPs = async (walletClient, publicClient, revokerContract) => {
1821
1641
  }
1822
1642
  return walletClient.writeContract({
1823
1643
  address: revoker,
1824
- abi: ACP_VALIDATOR_ABI,
1644
+ abi: ACP_REVOKER_ABI,
1825
1645
  functionName: "revokeAllExisting",
1826
1646
  args: [],
1827
1647
  account: walletClient.account,
1828
1648
  chain: walletClient.chain
1829
1649
  });
1830
1650
  };
1651
+ var checkAccess = async (acp, publicClient, handle) => {
1652
+ if (acp.type === "sharing" && handle === void 0) {
1653
+ if (ACPUtils.isExpired(acp))
1654
+ return "expired";
1655
+ return await isACPRevoked(acp, publicClient) ? "revoked" : "valid";
1656
+ }
1657
+ return ACPUtils.checkAccessOnChain(acp, publicClient, handle);
1658
+ };
1831
1659
  var isACPRevoked = async (acp, publicClient) => {
1832
1660
  if (acp.revokerContract === zeroAddress || acp.revokerData === 0)
1833
1661
  return false;
1834
1662
  return publicClient.readContract({
1835
1663
  address: acp.revokerContract,
1836
- abi: ACP_VALIDATOR_ABI,
1664
+ abi: ACP_REVOKER_ABI,
1837
1665
  functionName: "disabled",
1838
1666
  args: [acp.issuer, BigInt(acp.revokerData)]
1839
1667
  });
1840
1668
  };
1841
- var ACP_SHARE_REGISTRY_ABI = parseAbi([
1842
- "struct ACP { address issuer; uint64 expiration; address recipient; uint256 revokerData; address revokerContract; uint8 scope; address[] contracts; bytes32[] handles; bytes32 sealingKey; bytes issuerSignature; bytes recipientSignature; }",
1843
- "function share(ACP calldata acp) external returns (bytes32)",
1844
- "function removeShare(bytes32 shareId) external",
1845
- "function sharesFor(address recipient) external view returns (ACP[] memory)",
1846
- "function getShare(bytes32 shareId) external view returns (ACP memory)",
1847
- "function isShareValid(bytes32 shareId) external view returns (bool)"
1848
- ]);
1849
- var ACP_TUPLE = [
1850
- {
1851
- type: "tuple",
1852
- components: [
1853
- { name: "issuer", type: "address" },
1854
- { name: "expiration", type: "uint64" },
1855
- { name: "recipient", type: "address" },
1856
- { name: "revokerData", type: "uint256" },
1857
- { name: "revokerContract", type: "address" },
1858
- { name: "scope", type: "uint8" },
1859
- { name: "contracts", type: "address[]" },
1860
- { name: "handles", type: "bytes32[]" },
1861
- { name: "sealingKey", type: "bytes32" },
1862
- { name: "issuerSignature", type: "bytes" },
1863
- { name: "recipientSignature", type: "bytes" }
1864
- ]
1865
- }
1866
- ];
1867
- var ZERO_BYTES32 = `0x${"0".repeat(64)}`;
1868
- var toChainShare = (acp) => {
1869
- const pub = ACPUtils.getPublic(acp, true);
1870
- return {
1871
- ...pub,
1872
- expiration: BigInt(pub.expiration),
1873
- revokerData: BigInt(pub.revokerData),
1874
- sealingKey: ZERO_BYTES32,
1875
- recipientSignature: "0x"
1876
- };
1877
- };
1878
- var computeShareId = (acp) => {
1879
- const p = toChainShare(acp);
1880
- return keccak256(encodeAbiParameters(ACP_TUPLE, [p]));
1881
- };
1882
1669
  var shareOnChain = async (acp, walletClient, registry) => {
1883
1670
  if (acp.type !== "sharing") {
1884
1671
  throw new Error(`Cannot share a '${acp.type}' ACP on-chain \u2014 only 'sharing' ACPs are shareable.`);
@@ -1909,7 +1696,7 @@ var getIncomingShares = async (publicClient, registry, recipient) => {
1909
1696
  args: [recipient]
1910
1697
  });
1911
1698
  return raw.map((s) => ({
1912
- shareId: keccak256(encodeAbiParameters(ACP_TUPLE, [s])),
1699
+ shareId: shareIdOfChainShare(s),
1913
1700
  issuer: s.issuer,
1914
1701
  expiration: Number(s.expiration),
1915
1702
  recipient: s.recipient,
@@ -1921,9 +1708,9 @@ var getIncomingShares = async (publicClient, registry, recipient) => {
1921
1708
  issuerSignature: s.issuerSignature
1922
1709
  }));
1923
1710
  };
1924
- var importFromChain = async (share, publicClient, walletClient) => {
1711
+ var importFromChain = async (share, publicClient, walletClient, importOptions = {}) => {
1925
1712
  const { shareId: _shareId, ...options } = share;
1926
- return importShared({ ...options, type: "sharing" }, publicClient, walletClient);
1713
+ return importShared({ ...options, type: "sharing" }, publicClient, walletClient, importOptions);
1927
1714
  };
1928
1715
  var removeShareOnChain = async (shareId, walletClient, registry) => {
1929
1716
  if (walletClient.account == null)
@@ -1961,6 +1748,7 @@ var acps = {
1961
1748
  revokeACP,
1962
1749
  revokeAllACPs,
1963
1750
  isACPRevoked,
1751
+ checkAccess,
1964
1752
  shareOnChain,
1965
1753
  getIncomingShares,
1966
1754
  importFromChain,
@@ -3680,7 +3468,7 @@ var buildDecryptResultHash = (ctHash, cleartext, chainId) => {
3680
3468
  async function verifyDecryptResult(handle, cleartext, signature, publicClient) {
3681
3469
  const chainId = publicClient.chain?.id ?? await publicClient.getChainId();
3682
3470
  const expectedSigner = await publicClient.readContract({
3683
- address: TASK_MANAGER_ADDRESS,
3471
+ address: await getTaskManagerAddress(publicClient, chainId),
3684
3472
  abi: decryptResultSignerAbi,
3685
3473
  functionName: "decryptResultSigner",
3686
3474
  args: []
@@ -3800,6 +3588,7 @@ function createCofheClientBase(opts) {
3800
3588
  zkBuilderAndCrsGenerator: opts.zkBuilderAndCrsGenerator,
3801
3589
  initTfhe: opts.initTfhe,
3802
3590
  zkProveWorkerFn: opts.zkProveWorkerFn,
3591
+ beforeMainThreadProve: opts.beforeMainThreadProve,
3803
3592
  keysStorage,
3804
3593
  requireConnected: _requireConnected
3805
3594
  });
@@ -3876,10 +3665,11 @@ function createCofheClientBase(opts) {
3876
3665
  walletClient
3877
3666
  );
3878
3667
  },
3879
- importShared: async (options, clients) => {
3668
+ importShared: async (options, importOptions = {}) => {
3880
3669
  _requireConnected();
3881
- const { publicClient, walletClient } = clients ?? connectStore.getState();
3882
- return acps.importShared(options, publicClient, walletClient);
3670
+ const { activate, ...clients } = importOptions;
3671
+ const { publicClient, walletClient } = clients.publicClient ? clients : connectStore.getState();
3672
+ return acps.importShared(options, publicClient, walletClient, { activate });
3883
3673
  },
3884
3674
  // Get or create methods (require connection)
3885
3675
  getOrCreateSelfACP: async (chainId, account, options) => {
@@ -3922,6 +3712,11 @@ function createCofheClientBase(opts) {
3922
3712
  const { publicClient } = connectStore.getState();
3923
3713
  return acps.isACPRevoked(acp, publicClient);
3924
3714
  },
3715
+ checkAccess: async (acp, handle) => {
3716
+ _requireConnected();
3717
+ const { publicClient } = connectStore.getState();
3718
+ return acps.checkAccess(acp, publicClient, handle);
3719
+ },
3925
3720
  // On-chain sharing (require connection + config.acp.sharingRegistry)
3926
3721
  shareOnChain: async (acp) => {
3927
3722
  _requireConnected();
@@ -3938,10 +3733,10 @@ function createCofheClientBase(opts) {
3938
3733
  const sharingRegistry = await _resolveSharingRegistry(publicClient, chainId);
3939
3734
  return acps.getIncomingShares(publicClient, sharingRegistry, account);
3940
3735
  },
3941
- importFromChain: async (share) => {
3736
+ importFromChain: async (share, options) => {
3942
3737
  _requireConnected();
3943
3738
  const { publicClient, walletClient } = connectStore.getState();
3944
- return acps.importFromChain(share, publicClient, walletClient);
3739
+ return acps.importFromChain(share, publicClient, walletClient, options);
3945
3740
  },
3946
3741
  dismissShare: async (shareId) => {
3947
3742
  _requireConnected();
@@ -4029,4 +3824,4 @@ function createCofheClientBase(opts) {
4029
3824
  };
4030
3825
  }
4031
3826
 
4032
- export { CofheError, CofheErrorCode, DecryptForTxBuilder, DecryptForViewBuilder, EncryptInputsBuilder, EncryptStep, Encryptable, FheAllUTypes, FheTypes, FheUintUTypes, InitialConnectStore, assertNoRenamedConfigKeys, cofheFetch, createCofheClientBase, createCofheConfigBase, createKeysStore, fetchKeys, fheTypeToString, getCofheConfigItem, getCofheDebugInterceptors, isCofheError, isEncryptableItem, isLastEncryptionStep, setCofheDebugInterceptors, verifyDecryptResult, zkProveWithWorker };
3827
+ export { DecryptForTxBuilder, DecryptForViewBuilder, EncryptInputsBuilder, EncryptStep, Encryptable, FheAllUTypes, FheTypes, FheUintUTypes, InitialConnectStore, assertNoRenamedConfigKeys, cofheFetch, createCofheClientBase, createCofheConfigBase, createKeysStore, fetchKeys, fheTypeToString, getCofheConfigItem, getCofheDebugInterceptors, isEncryptableItem, isLastEncryptionStep, setCofheDebugInterceptors, verifyDecryptResult, zkProveWithWorker };
@@ -0,0 +1,50 @@
1
+ // web/tfheThreadPool.ts
2
+ var MAX_AUTO_THREADS = 8;
3
+ function resolveThreadCount(setting = "auto") {
4
+ if (setting === false)
5
+ return 1;
6
+ if (typeof setting === "number") {
7
+ return Number.isFinite(setting) && setting >= 1 ? Math.floor(setting) : 1;
8
+ }
9
+ const cores = globalThis.navigator?.hardwareConcurrency ?? 1;
10
+ if (!Number.isFinite(cores) || cores < 1)
11
+ return 1;
12
+ return Math.min(Math.floor(cores), MAX_AUTO_THREADS);
13
+ }
14
+ function isCrossOriginIsolated() {
15
+ return globalThis.crossOriginIsolated === true;
16
+ }
17
+ async function initTfheThreadPool(mod, setting = "auto") {
18
+ if (setting === false) {
19
+ return { enabled: false, threads: 1, reason: "disabled via config.tfheThreads" };
20
+ }
21
+ if (typeof mod.initThreadPool !== "function") {
22
+ return { enabled: false, threads: 1, reason: "tfhe build has no initThreadPool (single-threaded wasm)" };
23
+ }
24
+ if (typeof Worker === "undefined") {
25
+ return { enabled: false, threads: 1, reason: "Worker is unavailable" };
26
+ }
27
+ if (!isCrossOriginIsolated()) {
28
+ return {
29
+ enabled: false,
30
+ threads: 1,
31
+ reason: "not cross-origin isolated \u2014 serve the page with Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp (or credentialless) to enable multi-threaded proving"
32
+ };
33
+ }
34
+ const threads = resolveThreadCount(setting);
35
+ if (threads <= 1) {
36
+ return { enabled: false, threads: 1, reason: "resolved to a single thread" };
37
+ }
38
+ try {
39
+ await mod.initThreadPool(threads);
40
+ return { enabled: true, threads };
41
+ } catch (error) {
42
+ return {
43
+ enabled: false,
44
+ threads: 1,
45
+ reason: `initThreadPool failed: ${error instanceof Error ? error.message : String(error)}`
46
+ };
47
+ }
48
+ }
49
+
50
+ export { initTfheThreadPool };
@@ -1,5 +1,7 @@
1
1
  // core/consts.ts
2
- var TASK_MANAGER_ADDRESS = "0xeA30c4B8b44078Bbf8a6ef5b9f1eC1626C7848D9";
2
+ var COFHE_ADDRESS_BOOK_ADDRESS = "0xC0F4e00E531a2B086492Ae3DCC1515038307196b";
3
+ var TASK_MANAGER_ID = 1n;
4
+ var MOCKS_TASK_MANAGER_ADDRESS = "0x0000000000000000000000000000000000005000";
3
5
  var MOCKS_ZK_VERIFIER_ADDRESS = "0x0000000000000000000000000000000000005001";
4
6
  var MOCKS_THRESHOLD_NETWORK_ADDRESS = "0x0000000000000000000000000000000000005002";
5
7
  var MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY = "0x6C8D7F768A6BB4AAFE85E8A2F5A9680355239C7E14646ED62B044E39DE154512";
@@ -9,4 +11,4 @@ var TFHE_RS_ZK_MAX_BITS = 2048;
9
11
  var TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT = BigInt(1 << 30);
10
12
  var TFHE_RS_KEY_VERSION = 2;
11
13
 
12
- export { MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY, MOCKS_THRESHOLD_NETWORK_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY, TASK_MANAGER_ADDRESS, TFHE_RS_KEY_VERSION, TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT, TFHE_RS_ZK_MAX_BITS };
14
+ export { COFHE_ADDRESS_BOOK_ADDRESS, MOCKS_DECRYPT_RESULT_SIGNER_PRIVATE_KEY, MOCKS_TASK_MANAGER_ADDRESS, MOCKS_THRESHOLD_NETWORK_ADDRESS, MOCKS_ZK_VERIFIER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_ADDRESS, MOCKS_ZK_VERIFIER_SIGNER_PRIVATE_KEY, TASK_MANAGER_ID, TFHE_RS_KEY_VERSION, TFHE_RS_SAFE_SERIALIZATION_SIZE_LIMIT, TFHE_RS_ZK_MAX_BITS };