@cofhe/sdk 0.7.1 → 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.
- package/CHANGELOG.md +35 -0
- package/acps/acp.ts +10 -1
- package/acps/index.ts +11 -0
- package/acps/onchain-utils.ts +188 -49
- package/acps/registry.ts +73 -0
- package/acps/test/onchainAccessStatus.test.ts +116 -0
- package/acps/types.ts +16 -0
- package/chains/chains/arbitrum.ts +14 -0
- package/chains/chains/ethereum.ts +14 -0
- package/chains/index.ts +5 -1
- package/chains/test/chains.test.ts +24 -3
- package/core/acps.ts +51 -143
- package/core/client.ts +13 -8
- package/core/clientTypes.ts +29 -4
- package/core/config.ts +25 -1
- package/core/consts.ts +14 -2
- package/core/decrypt/verifyDecryptResult.ts +4 -3
- package/core/encrypt/encryptInputsBuilder.ts +6 -0
- package/core/encrypt/zkPackProveVerify.ts +7 -1
- package/core/error.ts +1 -0
- package/core/fetchKeys.ts +2 -2
- package/core/index.ts +9 -1
- package/core/keyStore.ts +23 -10
- package/core/taskManager.ts +48 -0
- package/core/test/acps.test.ts +91 -1
- package/core/test/client.test.ts +41 -0
- package/core/test/config.test.ts +16 -0
- package/core/test/decrypt.test.ts +11 -4
- package/core/test/encryptInputsBuilder.test.ts +1 -1
- package/core/test/fetchKeys.test.ts +23 -2
- package/core/test/keyStore.test.ts +18 -6
- package/core/test/taskManager.test.ts +57 -0
- package/core/types.ts +8 -0
- package/dist/acps.cjs +314 -35
- package/dist/acps.d.cts +251 -4
- package/dist/acps.d.ts +251 -4
- package/dist/acps.js +2 -2
- package/dist/chains.cjs +26 -0
- package/dist/chains.d.cts +45 -1
- package/dist/chains.d.ts +45 -1
- package/dist/chains.js +1 -1
- package/dist/{chunk-43USWPEH.js → chunk-GGI7Y6AW.js} +59 -264
- package/dist/chunk-KSOV5B4B.js +50 -0
- package/dist/{chunk-ESMZCFJY.js → chunk-NMKMCAI3.js} +4 -2
- package/dist/{chunk-Q7CBWGQX.js → chunk-UJYOBHYA.js} +374 -37
- package/dist/{chunk-N6IDQRRU.js → chunk-UKQAJK4N.js} +25 -1
- package/dist/{clientTypes-BN3nbzYM.d.ts → clientTypes-5YPPR16m.d.ts} +77 -14
- package/dist/{clientTypes-CYZjFznO.d.cts → clientTypes-D3aIXmUp.d.cts} +77 -14
- package/dist/core.cjs +271 -136
- package/dist/core.d.cts +29 -8
- package/dist/core.d.ts +29 -8
- package/dist/core.js +4 -4
- package/dist/node.cjs +266 -136
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +5 -5
- package/dist/{acp-Wi6isVQI.d.cts → onchain-utils-CUAK8glx.d.cts} +31 -1
- package/dist/{acp-Wi6isVQI.d.ts → onchain-utils-CUAK8glx.d.ts} +31 -1
- package/dist/web.cjs +360 -150
- package/dist/web.d.cts +49 -3
- package/dist/web.d.ts +49 -3
- package/dist/web.js +51 -20
- package/dist/zkProve.worker.cjs +69 -15
- package/dist/zkProve.worker.js +23 -17
- package/node/storage.ts +2 -2
- package/node/test/inherited.test.ts +5 -1
- package/node/test/storage-memory-fallback.test.ts +47 -0
- package/package.json +5 -3
- package/web/index.ts +100 -26
- package/web/test/countingZkProveWorker.ts +31 -0
- package/web/test/inherited.web.test.ts +5 -1
- package/web/test/mainThreadPool.web.test.ts +174 -0
- package/web/test/threadPoolBenchHelper.ts +140 -0
- package/web/test/threadPoolOff.web.test.ts +17 -0
- package/web/test/threadPoolOn.web.test.ts +80 -0
- package/web/test/workerInitRace.web.test.ts +79 -0
- package/web/tfheThreadPool.ts +140 -0
- package/web/workerManager.ts +4 -2
- package/web/zkProve.worker.ts +42 -17
|
@@ -1,173 +1,14 @@
|
|
|
1
|
-
import { hardhat as hardhat$1 } from './chunk-
|
|
2
|
-
import { acpStore, ACPUtils } from './chunk-
|
|
3
|
-
import { TFHE_RS_KEY_VERSION,
|
|
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,
|
|
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]
|
|
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 = {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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,
|
|
3668
|
+
importShared: async (options, importOptions = {}) => {
|
|
3880
3669
|
_requireConnected();
|
|
3881
|
-
const {
|
|
3882
|
-
|
|
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 {
|
|
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
|
|
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,
|
|
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 };
|