@enclave-e3/sdk 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +12 -69
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -16
- package/dist/index.d.ts +7 -16
- package/dist/index.js +13 -67
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -40,8 +40,6 @@ __export(index_exports, {
|
|
|
40
40
|
SDKError: () => SDKError,
|
|
41
41
|
ThresholdBfvParamsPresetNames: () => ThresholdBfvParamsPresetNames,
|
|
42
42
|
calculateStartWindow: () => calculateStartWindow,
|
|
43
|
-
convertToPolynomial: () => convertToPolynomial,
|
|
44
|
-
convertToPolynomialArray: () => convertToPolynomialArray,
|
|
45
43
|
decodePlaintextOutput: () => decodePlaintextOutput,
|
|
46
44
|
encodeBfvParams: () => encodeBfvParams,
|
|
47
45
|
encodeComputeProviderParams: () => encodeComputeProviderParams,
|
|
@@ -692,8 +690,8 @@ var RegistryEventType = /* @__PURE__ */ ((RegistryEventType2) => {
|
|
|
692
690
|
return RegistryEventType2;
|
|
693
691
|
})(RegistryEventType || {});
|
|
694
692
|
var ThresholdBfvParamsPresetNames = [
|
|
695
|
-
"
|
|
696
|
-
"
|
|
693
|
+
"INSECURE_THRESHOLD_512",
|
|
694
|
+
"SECURE_THRESHOLD_8192"
|
|
697
695
|
];
|
|
698
696
|
|
|
699
697
|
// src/enclave-sdk.ts
|
|
@@ -702,66 +700,10 @@ var import_wasm = require("@enclave-e3/wasm");
|
|
|
702
700
|
// src/greco.ts
|
|
703
701
|
var import_bb = require("@aztec/bb.js");
|
|
704
702
|
var import_noir_js = require("@noir-lang/noir_js");
|
|
705
|
-
var defaultParams = {
|
|
706
|
-
bounds: {
|
|
707
|
-
pk_bounds: ["34359701504", "34359615488"],
|
|
708
|
-
e0_bound: "20",
|
|
709
|
-
e1_bound: "20",
|
|
710
|
-
u_bound: "1",
|
|
711
|
-
r1_low_bounds: ["261", "258"],
|
|
712
|
-
r1_up_bounds: ["260", "258"],
|
|
713
|
-
r2_bounds: ["34359701504", "34359615488"],
|
|
714
|
-
p1_bounds: ["256", "256"],
|
|
715
|
-
p2_bounds: ["34359701504", "34359615488"],
|
|
716
|
-
k1_low_bound: "5",
|
|
717
|
-
k1_up_bound: "4"
|
|
718
|
-
},
|
|
719
|
-
crypto: {
|
|
720
|
-
q_mod_t: "3",
|
|
721
|
-
qis: ["68719403009", "68719230977"],
|
|
722
|
-
k0is: ["61847462708", "20615769293"]
|
|
723
|
-
}
|
|
724
|
-
};
|
|
725
|
-
var convertToPolynomial = (stringArray) => {
|
|
726
|
-
return {
|
|
727
|
-
coefficients: stringArray
|
|
728
|
-
};
|
|
729
|
-
};
|
|
730
|
-
var convertToPolynomialArray = (stringArrays) => {
|
|
731
|
-
return stringArrays.map(convertToPolynomial);
|
|
732
|
-
};
|
|
733
703
|
var generateProof = async (circuitInputs, circuit) => {
|
|
734
704
|
const noir = new import_noir_js.Noir(circuit);
|
|
735
705
|
const backend = new import_bb.UltraHonkBackend(circuit.bytecode, { threads: 4 });
|
|
736
|
-
const
|
|
737
|
-
const pk1is_poly = convertToPolynomialArray(circuitInputs.pk1is);
|
|
738
|
-
const ct0is_poly = convertToPolynomialArray(circuitInputs.ct0is);
|
|
739
|
-
const ct1is_poly = convertToPolynomialArray(circuitInputs.ct1is);
|
|
740
|
-
const u_poly = convertToPolynomial(circuitInputs.u);
|
|
741
|
-
const e0_poly = convertToPolynomial(circuitInputs.e0);
|
|
742
|
-
const e1_poly = convertToPolynomial(circuitInputs.e1);
|
|
743
|
-
const e0is_poly = convertToPolynomialArray(circuitInputs.e0is);
|
|
744
|
-
const k1_poly = convertToPolynomial(circuitInputs.k1);
|
|
745
|
-
const r1is_poly = convertToPolynomialArray(circuitInputs.r1is);
|
|
746
|
-
const r2is_poly = convertToPolynomialArray(circuitInputs.r2is);
|
|
747
|
-
const p1is_poly = convertToPolynomialArray(circuitInputs.p1is);
|
|
748
|
-
const p2is_poly = convertToPolynomialArray(circuitInputs.p2is);
|
|
749
|
-
const { witness } = await noir.execute({
|
|
750
|
-
params: defaultParams,
|
|
751
|
-
pk0is: pk0is_poly,
|
|
752
|
-
pk1is: pk1is_poly,
|
|
753
|
-
ct0is: ct0is_poly,
|
|
754
|
-
ct1is: ct1is_poly,
|
|
755
|
-
u: u_poly,
|
|
756
|
-
e0: e0_poly,
|
|
757
|
-
e1: e1_poly,
|
|
758
|
-
e0is: e0is_poly,
|
|
759
|
-
k1: k1_poly,
|
|
760
|
-
r1is: r1is_poly,
|
|
761
|
-
r2is: r2is_poly,
|
|
762
|
-
p1is: p1is_poly,
|
|
763
|
-
p2is: p2is_poly
|
|
764
|
-
});
|
|
706
|
+
const { witness } = await noir.execute(circuitInputs);
|
|
765
707
|
return await backend.generateProof(witness, { keccakZK: true });
|
|
766
708
|
};
|
|
767
709
|
|
|
@@ -838,6 +780,11 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
838
780
|
error1Variance: params.error1_variance
|
|
839
781
|
};
|
|
840
782
|
}
|
|
783
|
+
async generatePublicKey() {
|
|
784
|
+
await (0, import_init.default)();
|
|
785
|
+
const protocolParams = await this.getThresholdBfvParamsSet();
|
|
786
|
+
return (0, import_wasm.generate_public_key)(protocolParams.degree, protocolParams.plaintextModulus, BigUint64Array.from(protocolParams.moduli));
|
|
787
|
+
}
|
|
841
788
|
async computePublicKeyCommitment(publicKey) {
|
|
842
789
|
await (0, import_init.default)();
|
|
843
790
|
const protocolParams = await this.getThresholdBfvParamsSet();
|
|
@@ -899,10 +846,9 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
899
846
|
protocolParams.plaintextModulus,
|
|
900
847
|
BigUint64Array.from(protocolParams.moduli)
|
|
901
848
|
);
|
|
902
|
-
const publicInputs = JSON.parse(circuitInputs);
|
|
903
849
|
return {
|
|
904
850
|
encryptedData,
|
|
905
|
-
|
|
851
|
+
circuitInputs: JSON.parse(circuitInputs)
|
|
906
852
|
};
|
|
907
853
|
}
|
|
908
854
|
/**
|
|
@@ -913,7 +859,7 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
913
859
|
* @returns The encrypted number and the proof
|
|
914
860
|
*/
|
|
915
861
|
async encryptNumberAndGenProof(data, publicKey, circuit) {
|
|
916
|
-
const { publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey);
|
|
862
|
+
const { circuitInputs: publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey);
|
|
917
863
|
const proof = await generateProof(publicInputs, circuit);
|
|
918
864
|
return {
|
|
919
865
|
encryptedData,
|
|
@@ -936,10 +882,9 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
936
882
|
protocolParams.plaintextModulus,
|
|
937
883
|
BigUint64Array.from(protocolParams.moduli)
|
|
938
884
|
);
|
|
939
|
-
const publicInputs = JSON.parse(circuitInputs);
|
|
940
885
|
return {
|
|
941
886
|
encryptedData,
|
|
942
|
-
|
|
887
|
+
circuitInputs: JSON.parse(circuitInputs)
|
|
943
888
|
};
|
|
944
889
|
}
|
|
945
890
|
/**
|
|
@@ -950,7 +895,7 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
950
895
|
* @returns The encrypted vector and the proof
|
|
951
896
|
*/
|
|
952
897
|
async encryptVectorAndGenProof(data, publicKey, circuit) {
|
|
953
|
-
const { publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey);
|
|
898
|
+
const { circuitInputs: publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey);
|
|
954
899
|
const proof = await generateProof(publicInputs, circuit);
|
|
955
900
|
return {
|
|
956
901
|
encryptedData,
|
|
@@ -1170,8 +1115,6 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
1170
1115
|
SDKError,
|
|
1171
1116
|
ThresholdBfvParamsPresetNames,
|
|
1172
1117
|
calculateStartWindow,
|
|
1173
|
-
convertToPolynomial,
|
|
1174
|
-
convertToPolynomialArray,
|
|
1175
1118
|
decodePlaintextOutput,
|
|
1176
1119
|
encodeBfvParams,
|
|
1177
1120
|
encodeComputeProviderParams,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/enclave-sdk.ts","../src/contract-client.ts","../src/utils.ts","../src/event-listener.ts","../src/types.ts","../src/greco.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\n// Main SDK class\nexport { EnclaveSDK } from './enclave-sdk'\n\n// Core classes\nexport { EventListener } from './event-listener'\nexport { ContractClient } from './contract-client'\n\n// Types and interfaces\nexport type {\n E3,\n SDKConfig,\n EventListenerConfig,\n ContractInstances,\n EventFilter,\n EventCallback,\n SDKEventEmitter,\n AllEventTypes,\n EnclaveEvent,\n // Event data types\n E3RequestedData,\n E3ActivatedData,\n CiphertextOutputPublishedData,\n PlaintextOutputPublishedData,\n CiphernodeAddedData,\n CiphernodeRemovedData,\n CommitteeRequestedData,\n CommitteePublishedData,\n CommitteeFinalizedData,\n EnclaveEventData,\n RegistryEventData,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n} from './types'\n\n// enums and constants\nexport { EnclaveEventType, RegistryEventType, ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames } from './types'\n\n// Export utilities\nexport {\n SDKError,\n isValidAddress,\n isValidHash,\n formatEventName,\n parseEventData,\n formatBigInt,\n parseBigInt,\n generateEventId,\n sleep,\n getCurrentTimestamp,\n // BFV and E3 utilities\n DEFAULT_COMPUTE_PROVIDER_PARAMS,\n DEFAULT_E3_CONFIG,\n encodeBfvParams,\n encodeComputeProviderParams,\n encodeCustomParams,\n calculateStartWindow,\n decodePlaintextOutput,\n type ComputeProviderParams,\n} from './utils'\n\nexport { generateProof, type Polynomial, convertToPolynomial, convertToPolynomialArray } from './greco'\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Hash, type Log, PublicClient, WalletClient, createPublicClient, createWalletClient, http, webSocket } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { hardhat, mainnet, monadTestnet, sepolia } from 'viem/chains'\nimport initializeWasm from '@enclave-e3/wasm/init'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory } from '@enclave-e3/contracts/types'\nimport { ContractClient } from './contract-client'\nimport { EventListener } from './event-listener'\nimport { EnclaveEventType, ThresholdBfvParamsPresetNames } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nimport type {\n AllEventTypes,\n E3,\n EventCallback,\n SDKConfig,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n ThresholdBfvParamsPresetName,\n} from './types'\nimport {\n bfv_encrypt_number,\n bfv_encrypt_vector,\n bfv_verifiable_encrypt_number,\n bfv_verifiable_encrypt_vector,\n compute_pk_commitment,\n get_bfv_params,\n} from '@enclave-e3/wasm'\nimport { generateProof } from './greco'\nimport { CompiledCircuit } from '@noir-lang/noir_js'\n\nexport class EnclaveSDK {\n public static readonly chains = {\n 1: mainnet,\n 11155111: sepolia,\n 41454: monadTestnet,\n 31337: hardhat,\n } as const\n\n private eventListener: EventListener\n private contractClient: ContractClient\n private initialized = false\n private thresholdBfvParamsPresetName?: ThresholdBfvParamsPresetName\n private publicClient: PublicClient\n\n // TODO: use zod for config validation\n constructor(private config: SDKConfig) {\n if (!config.publicClient) {\n throw new SDKError('Public client is required', 'MISSING_PUBLIC_CLIENT')\n }\n\n if (!isValidAddress(config.contracts.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n\n if (!config.thresholdBfvParamsPresetName) {\n throw new SDKError('Threshold BFV parameters preset name is required', 'MISSING_THRESHOLD_BFV_PARAMS_PRESET_NAME')\n }\n\n if (!Object.values(ThresholdBfvParamsPresetNames).includes(config.thresholdBfvParamsPresetName)) {\n throw new SDKError(\n `Invalid threshold BFV parameters preset name: ${config.thresholdBfvParamsPresetName}`,\n 'INVALID_THRESHOLD_BFV_PARAMS_PRESET_NAME',\n )\n }\n\n this.thresholdBfvParamsPresetName = config.thresholdBfvParamsPresetName\n this.eventListener = new EventListener(config.publicClient)\n this.contractClient = new ContractClient(config.publicClient, config.walletClient, config.contracts)\n this.publicClient = config.publicClient\n }\n\n /**\n * Initialize the SDK\n */\n // TODO: Delete this it is redundant\n public async initialize(): Promise<void> {\n if (this.initialized) return\n\n try {\n await this.contractClient.initialize()\n this.initialized = true\n } catch (error) {\n throw new SDKError(`Failed to initialize SDK: ${error}`, 'SDK_INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Get the public client used by the SDK\n * @returns The public client\n */\n public getPublicClient = (): PublicClient => {\n return this.publicClient\n }\n\n public async getThresholdBfvParamsSet(): Promise<BfvParams> {\n await initializeWasm()\n let params = get_bfv_params(this.thresholdBfvParamsPresetName as ThresholdBfvParamsPresetName)\n return {\n degree: Number(params.degree), // degree is returned as a bigint from wasm\n plaintextModulus: params.plaintext_modulus as bigint,\n moduli: params.moduli as bigint[],\n error1Variance: params.error1_variance,\n }\n }\n\n public async computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return compute_pk_commitment(\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a number using the configured protocol\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted number\n */\n public async encryptNumber(data: bigint, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a vector using the configured protocol\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The ciphertext\n */\n public async encryptVector(data: BigUint64Array, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * This function encrypts a number using the configured FHE protocol\n * and generates the necessary public inputs for a zk-SNARK proof.\n * @param data The number to encrypt\n * @param publicKey The public key to use for encryption\n * @returns The encrypted number and the inputs for the zk-SNARK proof\n */\n public async encryptNumberAndGenInputs(data: bigint, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n const publicInputs = JSON.parse(circuitInputs)\n return {\n encryptedData,\n publicInputs,\n }\n }\n\n /**\n * Encrypt a number using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted number and the proof\n */\n public async encryptNumberAndGenProof(\n data: bigint,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey)\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Encrypt a vector and generate inputs for an E3 computation\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted vector and the inputs for the E3 computation\n */\n public async encryptVectorAndGenInputs(data: BigUint64Array, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n const publicInputs = JSON.parse(circuitInputs)\n return {\n encryptedData,\n publicInputs,\n }\n }\n\n /**\n * Encrypt a vector using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted vector and the proof\n */\n public async encryptVectorAndGenProof(\n data: BigUint64Array,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey)\n\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * @param amount - The amount to approve\n * @returns The approval transaction hash\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n console.log('>>> APPROVE FEE TOKEN')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.approveFeeToken(amount)\n }\n\n /**\n * Request a new E3 computation\n */\n public async requestE3(params: {\n threshold: [number, number]\n startWindow: [bigint, bigint]\n duration: bigint\n e3Program: `0x${string}`\n e3ProgramParams: `0x${string}`\n computeProviderParams: `0x${string}`\n customParams?: `0x${string}`\n gasLimit?: bigint\n }): Promise<Hash> {\n console.log('>>> REQUEST')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.requestE3(\n params.threshold,\n params.startWindow,\n params.duration,\n params.e3Program,\n params.e3ProgramParams,\n params.computeProviderParams,\n params.customParams,\n params.gasLimit,\n )\n }\n\n /**\n * Get the public key for an E3 computation\n * @param e3Id - The ID of the E3 computation\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3PublicKey(e3Id)\n }\n\n /**\n * Activate an E3 computation\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.activateE3(e3Id, gasLimit)\n }\n\n /**\n * Publish input for an E3 computation\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishInput(e3Id, data, gasLimit)\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishCiphertextOutput(e3Id, ciphertextOutput, proof, gasLimit)\n }\n\n /**\n * Get E3 information\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3(e3Id)\n }\n\n /**\n * Unified Event Listening - Listen to any Enclave or Registry event\n */\n public onEnclaveEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n // Determine which contract to listen to based on event type\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n void this.eventListener.watchContractEvent(contractAddress, eventType, abi, callback)\n }\n\n /**\n * Remove event listener\n */\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n this.eventListener.off(eventType, callback)\n }\n\n /**\n * Handle an event only once\n */\n public once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): void {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.log(e))\n }\n }\n this.onEnclaveEvent(type, handler)\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n return this.eventListener.getHistoricalEvents(contractAddress, eventType, abi, fromBlock, toBlock)\n }\n\n /**\n * Start polling for events\n */\n public async startEventPolling(): Promise<void> {\n void this.eventListener.startPolling()\n }\n\n /**\n * Stop polling for events\n */\n public stopEventPolling(): void {\n this.eventListener.stopPolling()\n }\n\n /**\n * Utility methods\n */\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n return this.contractClient.estimateGas(functionName, args, contractAddress, abi, value)\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<unknown> {\n return this.contractClient.waitForTransaction(hash)\n }\n\n /**\n * Clean up resources\n */\n public cleanup(): void {\n this.eventListener.cleanup()\n }\n\n /**\n * Update SDK configuration\n */\n // TODO: We should delete this as we don't want a stateful client.\n public updateConfig(newConfig: Partial<SDKConfig>): void {\n if (newConfig.publicClient) {\n this.config.publicClient = newConfig.publicClient\n this.eventListener = new EventListener(newConfig.publicClient)\n }\n\n if (newConfig.walletClient) {\n this.config.walletClient = newConfig.walletClient\n }\n\n if (newConfig.contracts) {\n this.config.contracts = {\n ...this.config.contracts,\n ...newConfig.contracts,\n }\n }\n\n if (newConfig.chainId) {\n this.config.chainId = newConfig.chainId\n }\n\n this.contractClient = new ContractClient(this.config.publicClient, this.config.walletClient, this.config.contracts)\n\n this.initialized = false\n }\n\n public static create(options: {\n rpcUrl: string\n contracts: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n }\n privateKey?: `0x${string}`\n chainId: keyof typeof EnclaveSDK.chains\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n }): EnclaveSDK {\n const chain = EnclaveSDK.chains[options.chainId]\n\n const isWebSocket = options.rpcUrl.startsWith('ws://') || options.rpcUrl.startsWith('wss://')\n const transport = isWebSocket\n ? webSocket(options.rpcUrl, {\n keepAlive: { interval: 30_000 },\n reconnect: { attempts: 5, delay: 2_000 },\n })\n : http(options.rpcUrl)\n const publicClient = createPublicClient({\n chain,\n transport,\n }) as SDKConfig['publicClient']\n let walletClient: WalletClient | undefined = undefined\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey)\n walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n }\n\n return new EnclaveSDK({\n publicClient,\n walletClient,\n contracts: options.contracts,\n chainId: options.chainId,\n thresholdBfvParamsPresetName: options.thresholdBfvParamsPresetName,\n })\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { Abi, Hash, PublicClient, TransactionReceipt, WalletClient } from 'viem'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory, EnclaveToken__factory } from '@enclave-e3/contracts/types'\nimport { type E3 } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nexport class ContractClient {\n private contractInfo: {\n enclave: { address: `0x${string}`; abi: Abi }\n ciphernodeRegistry: { address: `0x${string}`; abi: Abi }\n feeToken: { address: `0x${string}`; abi: Abi }\n } | null = null\n\n constructor(\n private publicClient: PublicClient,\n private walletClient?: WalletClient,\n private addresses: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n } = {\n enclave: '0x0000000000000000000000000000000000000000',\n ciphernodeRegistry: '0x0000000000000000000000000000000000000000',\n feeToken: '0x0000000000000000000000000000000000000000',\n },\n ) {\n if (!isValidAddress(addresses.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n }\n\n /**\n * Initialize contract instances\n */\n public async initialize(): Promise<void> {\n try {\n this.contractInfo = {\n enclave: {\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n },\n ciphernodeRegistry: {\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n },\n feeToken: {\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n },\n }\n } catch (error) {\n throw new SDKError(`Failed to initialize contracts: ${error}`, 'INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * approve(address spender, uint256 amount)\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n functionName: 'approve',\n args: [this.addresses.enclave, amount],\n account,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to approve fee token: ${error}`, 'APPROVE_FEE_TOKEN_FAILED')\n }\n }\n\n /**\n * Request a new E3 computation\n * request(address filter, uint32[2] threshold, uint256[2] startWindow, uint256 duration, IE3Program e3Program, bytes e3ProgramParams, bytes computeProviderParams, bytes customParams)\n */\n public async requestE3(\n threshold: [number, number],\n startWindow: [bigint, bigint],\n duration: bigint,\n e3Program: `0x${string}`,\n e3ProgramParams: `0x${string}`,\n computeProviderParams: `0x${string}`,\n customParams?: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'request',\n args: [\n {\n threshold,\n startWindow,\n duration,\n e3Program,\n e3ProgramParams,\n computeProviderParams,\n customParams: customParams || '0x',\n },\n ],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to request E3: ${error}`, 'REQUEST_E3_FAILED')\n }\n }\n\n /**\n * Activate an E3 computation\n * activate(uint256 e3Id)\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'activate',\n args: [e3Id],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to activate E3: ${error}`, 'ACTIVATE_E3_FAILED')\n }\n }\n\n /**\n * Publish input for an E3 computation\n * publishInput(uint256 e3Id, bytes memory data)\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishInput',\n args: [e3Id, data],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish input: ${error}`, 'PUBLISH_INPUT_FAILED')\n }\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n * publishCiphertextOutput(uint256 e3Id, bytes memory ciphertextOutput, bytes memory proof)\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishCiphertextOutput',\n args: [e3Id, ciphertextOutput, proof],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish ciphertext output: ${error}`, 'PUBLISH_CIPHERTEXT_OUTPUT_FAILED')\n }\n }\n\n /**\n * Get E3 information\n * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3)\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: E3 = await this.publicClient.readContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'getE3',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3: ${error}`, 'GET_E3_FAILED')\n }\n }\n\n /**\n * Get the public key for an E3 computation\n * Based on the contract: committeePublicKey(uint256 e3Id) returns (bytes32 publicKeyHash)\n * @param e3Id\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: `0x${string}` = await this.publicClient.readContract({\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n functionName: 'committeePublicKey',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3 public key: ${error}`, 'GET_E3_PUBLIC_KEY_FAILED')\n }\n }\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for gas estimation', 'NO_WALLET')\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const estimateParams = {\n address: contractAddress,\n abi,\n functionName,\n args,\n account,\n ...(value !== undefined && { value }),\n }\n\n const gas = await this.publicClient.estimateContractGas(estimateParams)\n\n return gas\n } catch (error) {\n throw new SDKError(`Failed to estimate gas: ${error}`, 'GAS_ESTIMATION_FAILED')\n }\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash,\n confirmations: 1,\n })\n\n return receipt\n } catch (error) {\n throw new SDKError(`Failed to wait for transaction: ${error}`, 'TRANSACTION_WAIT_FAILED')\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration\nexport const DEFAULT_E3_CONFIG = {\n threshold_min: 2,\n threshold_max: 5,\n window_size: 120, // 2 minutes in seconds\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'0'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Calculate start window for E3 request\n */\nexport function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] {\n const now = getCurrentTimestamp()\n return [BigInt(now), BigInt(now + windowSize)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\n\nimport {\n type AllEventTypes,\n type EnclaveEvent,\n type EnclaveEventData,\n type EnclaveEventType,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType,\n type SDKEventEmitter,\n} from './types'\nimport { SDKError, sleep } from './utils'\n\nexport class EventListener implements SDKEventEmitter {\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n\n constructor(\n private publicClient: PublicClient,\n private config: EventListenerConfig = {},\n ) {}\n\n /**\n * Listen to specific contract events\n */\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n console.log(`watchContractEvent: ${watcherKey}`)\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n console.log('Added callback')\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n // If we don't have an active watcher for this event, create one\n if (!this.activeWatchers.has(watcherKey)) {\n console.log('Adding active watcher for ' + watcherKey)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) {\n console.log('warning: Log was falsy when a log was expected!')\n break\n }\n const event: EnclaveEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends EnclaveEventType\n ? EnclaveEventData[T]\n : T extends RegistryEventType\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n console.log('Created event, now emitting event...')\n emitter.emit(event)\n console.log('Event emitted')\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n /**\n * Listen to all logs from a specific address\n */\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n /**\n * Start polling for historical events\n */\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n /**\n * Stop polling for events\n */\n public stopPolling(): void {\n this.isPolling = false\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(\n address: `0x${string}`,\n eventType: AllEventTypes,\n abi: Abi,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n try {\n const logs = await this.publicClient.getContractEvents({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: fromBlock || this.config.fromBlock,\n toBlock: toBlock || this.config.toBlock,\n })\n\n return logs\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n /**\n * SDKEventEmitter implementation\n */\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n // Find and stop corresponding watchers\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void {\n console.log('emit() called for ' + event.type)\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n console.log('Have ' + callbacks.size + ' callbacks')\n callbacks.forEach((callback) => {\n console.log('Running callback...')\n try {\n void (callback as EventCallback<T>)(event)\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n /**\n * Clean up all listeners and watchers\n */\n public cleanup(): void {\n this.stopPolling()\n\n // Stop all active watchers\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n\n // Clear all listeners\n this.listeners.clear()\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log, PublicClient, WalletClient } from 'viem'\nimport type { ProofData } from '@aztec/bb.js'\nimport type { CiphernodeRegistryOwnable, Enclave, MockCiphernodeRegistry, MockUSDC, EnclaveToken } from '@enclave-e3/contracts/types'\n\nimport type { CircuitInputs } from './greco'\n\n/**\n * SDK configuration\n */\nexport interface SDKConfig {\n /**\n * The public client to use to interact with the blockchain\n */\n publicClient: PublicClient\n\n /**\n * The wallet client to use to send/sign transactions\n */\n walletClient?: WalletClient\n\n /**\n * The Enclave contracts\n */\n contracts: {\n /**\n * The Enclave contract address\n */\n enclave: `0x${string}`\n\n /**\n * The CiphernodeRegistry contract address\n */\n ciphernodeRegistry: `0x${string}`\n\n /**\n * The FeeToken contract address\n */\n feeToken: `0x${string}`\n }\n\n /**\n * The chain ID to which the contracts are deployed\n */\n chainId?: number\n\n /**\n * The threshold BFV parameters preset name to use for the Enclave requests\n */\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n\nexport interface ContractInstances {\n enclave: Enclave\n ciphernodeRegistry: CiphernodeRegistryOwnable | MockCiphernodeRegistry\n feeToken: EnclaveToken | MockUSDC\n}\n\n// Unified Event System\nexport enum EnclaveEventType {\n // E3 Lifecycle Events\n E3_REQUESTED = 'E3Requested',\n E3_ACTIVATED = 'E3Activated',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n\n // E3 Program Management\n E3_PROGRAM_ENABLED = 'E3ProgramEnabled',\n E3_PROGRAM_DISABLED = 'E3ProgramDisabled',\n\n // Encryption Scheme Management\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n ENCRYPTION_SCHEME_DISABLED = 'EncryptionSchemeDisabled',\n\n // Configuration\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n ALLOWED_E3_PROGRAMS_PARAMS_SET = 'AllowedE3ProgramsParamsSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n // Committee Management\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'CommitteeFinalized',\n\n // Configuration\n ENCLAVE_SET = 'EnclaveSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\n// Union type for all events\nexport type AllEventTypes = EnclaveEventType | RegistryEventType\n\n// Event data interfaces based on TypeChain types\nexport interface E3 {\n seed: bigint\n threshold: readonly [number, number]\n requestBlock: bigint\n startWindow: readonly [bigint, bigint]\n duration: bigint\n expiration: bigint\n encryptionSchemeId: string\n e3Program: string\n e3ProgramParams: string\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n plaintextOutput: string\n}\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: E3\n filter: string\n e3Program: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n seed: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n submissionDeadline: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n publicKey: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n nodes: string[]\n}\n\n// Event data mapping\nexport interface EnclaveEventData {\n [EnclaveEventType.E3_REQUESTED]: E3RequestedData\n [EnclaveEventType.E3_ACTIVATED]: E3ActivatedData\n [EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [EnclaveEventType.E3_PROGRAM_ENABLED]: { e3Program: string }\n [EnclaveEventType.E3_PROGRAM_DISABLED]: { e3Program: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_DISABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [EnclaveEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [EnclaveEventType.ALLOWED_E3_PROGRAMS_PARAMS_SET]: {\n e3ProgramParams: string[]\n }\n [EnclaveEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [EnclaveEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.ENCLAVE_SET]: { enclave: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\n// Generic event structure\nexport interface EnclaveEvent<T extends AllEventTypes> {\n type: T\n data: T extends EnclaveEventType ? EnclaveEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: EnclaveEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void\n}\n\n/**\n * Result of verifiable encryption using BFV\n */\nexport interface VerifiableEncryptionResult {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n /**\n * The proof generated by Greco\n */\n proof: ProofData\n}\n\n/**\n * BFV parameters for an Enclave program request\n * Example for BFV\n * 512, // degree\n * 10, // plaintext_modulus\n * 0xffffee001, // moduli\n * 0xffffc4001, // moduli\n */\nexport interface BfvParams {\n /**\n * The degree of the polynomial\n */\n degree: number\n /**\n * The plaintext modulus\n */\n plaintextModulus: bigint\n /**\n * The moduli\n */\n moduli: bigint[]\n /**\n * error1\n */\n error1Variance: string | undefined\n}\n\nexport type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_BFV_512' | 'SECURE_THRESHOLD_BFV_8192'\n\nexport const ThresholdBfvParamsPresetNames = [\n 'INSECURE_THRESHOLD_BFV_512',\n 'SECURE_THRESHOLD_BFV_8192',\n] as const satisfies ReadonlyArray<ThresholdBfvParamsPresetName>\n\n/**\n * The result of encrypting a value and generating a proof\n */\nexport interface EncryptedValueAndPublicInputs {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n\n /**\n * The public inputs for the proof\n */\n publicInputs: CircuitInputs\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { UltraHonkBackend, type ProofData } from '@aztec/bb.js'\nimport { type CompiledCircuit, Noir } from '@noir-lang/noir_js'\n\n// Conversion to Noir types\nexport type Field = string\n\n/**\n * Describes a polynomial to be used in a Noir circuit (Greco)\n */\nexport type Polynomial = {\n coefficients: Field[]\n}\n\n/**\n * Describes the inputs to Greco circuit\n */\nexport interface CircuitInputs {\n pk0is: string[][]\n pk1is: string[][]\n ct0is: string[][]\n ct1is: string[][]\n u: string[]\n e0: string[]\n e1: string[]\n e0is: string[][]\n k1: string[]\n r1is: string[][]\n r2is: string[][]\n p1is: string[][]\n p2is: string[][]\n}\n\n/**\n * BfvPkEncryption params for Greco\npub struct Params<let N: u32, let L: u32> {\n crypto: CryptographicParams<L>,\n bounds: BoundParams<L>,\n}\n */\nexport interface BoundParams {\n pk_bounds: Field[]\n e0_bound: Field\n e1_bound: Field\n u_bound: Field\n r1_low_bounds: Field[]\n r1_up_bounds: Field[]\n r2_bounds: Field[]\n p1_bounds: Field[]\n p2_bounds: Field[]\n k1_low_bound: Field\n k1_up_bound: Field\n}\n\nexport interface CryptographicParams {\n q_mod_t: Field\n qis: Field[]\n k0is: Field[]\n}\n\nexport interface Params {\n bounds: BoundParams\n crypto: CryptographicParams\n}\n\n/**\n * Default greco params for BFV pk encryption.\n */\nexport const defaultParams: Params = {\n bounds: {\n pk_bounds: ['34359701504', '34359615488'],\n e0_bound: '20',\n e1_bound: '20',\n u_bound: '1',\n r1_low_bounds: ['261', '258'],\n r1_up_bounds: ['260', '258'],\n r2_bounds: ['34359701504', '34359615488'],\n p1_bounds: ['256', '256'],\n p2_bounds: ['34359701504', '34359615488'],\n k1_low_bound: '5',\n k1_up_bound: '4',\n },\n crypto: {\n q_mod_t: '3',\n qis: ['68719403009', '68719230977'],\n k0is: ['61847462708', '20615769293'],\n },\n}\n\n/**\n * Convert a string array to a polynomial\n * @param stringArray - The string array\n * @returns The polynomial\n */\nexport const convertToPolynomial = (stringArray: string[]): Polynomial => {\n return {\n coefficients: stringArray,\n }\n}\n\n/**\n * Convert an array of string arrays to an array of polynomials\n * @param stringArrays - The array of string arrays\n * @returns The array of polynomials\n */\nexport const convertToPolynomialArray = (stringArrays: string[][]): Polynomial[] => {\n return stringArrays.map(convertToPolynomial)\n}\n\n/**\n * Generate a proof for a given circuit and circuit inputs\n * @dev Defaults to the UltraHonkBackend\n * @param circuitInputs - The circuit inputs\n * @param circuit - The circuit\n * @returns The proof\n */\nexport const generateProof = async (circuitInputs: CircuitInputs, circuit: CompiledCircuit): Promise<ProofData> => {\n const noir = new Noir(circuit)\n\n const backend = new UltraHonkBackend(circuit.bytecode, { threads: 4 })\n\n const pk0is_poly = convertToPolynomialArray(circuitInputs.pk0is)\n const pk1is_poly = convertToPolynomialArray(circuitInputs.pk1is)\n const ct0is_poly = convertToPolynomialArray(circuitInputs.ct0is)\n const ct1is_poly = convertToPolynomialArray(circuitInputs.ct1is)\n const u_poly = convertToPolynomial(circuitInputs.u)\n const e0_poly = convertToPolynomial(circuitInputs.e0)\n const e1_poly = convertToPolynomial(circuitInputs.e1)\n const e0is_poly = convertToPolynomialArray(circuitInputs.e0is)\n const k1_poly = convertToPolynomial(circuitInputs.k1)\n const r1is_poly = convertToPolynomialArray(circuitInputs.r1is)\n const r2is_poly = convertToPolynomialArray(circuitInputs.r2is)\n const p1is_poly = convertToPolynomialArray(circuitInputs.p1is)\n const p2is_poly = convertToPolynomialArray(circuitInputs.p2is)\n\n const { witness } = await noir.execute({\n params: defaultParams as any,\n pk0is: pk0is_poly,\n pk1is: pk1is_poly,\n ct0is: ct0is_poly,\n ct1is: ct1is_poly,\n u: u_poly,\n e0: e0_poly,\n e1: e1_poly,\n e0is: e0is_poly,\n k1: k1_poly,\n r1is: r1is_poly,\n r2is: r2is_poly,\n p1is: p1is_poly,\n p2is: p2is_poly,\n })\n\n return await backend.generateProof(witness, { keccakZK: true })\n}\n"],"mappings":"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","names":["import_viem","import_types","EnclaveEventType","RegistryEventType","initializeWasm"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/enclave-sdk.ts","../src/contract-client.ts","../src/utils.ts","../src/event-listener.ts","../src/types.ts","../src/greco.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\n// Main SDK class\nexport { EnclaveSDK } from './enclave-sdk'\n\n// Core classes\nexport { EventListener } from './event-listener'\nexport { ContractClient } from './contract-client'\n\n// Types and interfaces\nexport type {\n E3,\n SDKConfig,\n EventListenerConfig,\n ContractInstances,\n EventFilter,\n EventCallback,\n SDKEventEmitter,\n AllEventTypes,\n EnclaveEvent,\n // Event data types\n E3RequestedData,\n E3ActivatedData,\n CiphertextOutputPublishedData,\n PlaintextOutputPublishedData,\n CiphernodeAddedData,\n CiphernodeRemovedData,\n CommitteeRequestedData,\n CommitteePublishedData,\n CommitteeFinalizedData,\n EnclaveEventData,\n RegistryEventData,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n} from './types'\n\n// enums and constants\nexport { EnclaveEventType, RegistryEventType, ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames } from './types'\n\n// Export utilities\nexport {\n SDKError,\n isValidAddress,\n isValidHash,\n formatEventName,\n parseEventData,\n formatBigInt,\n parseBigInt,\n generateEventId,\n sleep,\n getCurrentTimestamp,\n // BFV and E3 utilities\n DEFAULT_COMPUTE_PROVIDER_PARAMS,\n DEFAULT_E3_CONFIG,\n encodeBfvParams,\n encodeComputeProviderParams,\n encodeCustomParams,\n calculateStartWindow,\n decodePlaintextOutput,\n type ComputeProviderParams,\n} from './utils'\n\nexport { generateProof, type Polynomial } from './greco'\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Hash, type Log, PublicClient, WalletClient, createPublicClient, createWalletClient, http, webSocket } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { hardhat, mainnet, monadTestnet, sepolia } from 'viem/chains'\nimport initializeWasm from '@enclave-e3/wasm/init'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory } from '@enclave-e3/contracts/types'\nimport { ContractClient } from './contract-client'\nimport { EventListener } from './event-listener'\nimport { EnclaveEventType, ThresholdBfvParamsPresetNames } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nimport type {\n AllEventTypes,\n E3,\n EventCallback,\n SDKConfig,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n ThresholdBfvParamsPresetName,\n} from './types'\nimport {\n bfv_encrypt_number,\n bfv_encrypt_vector,\n generate_public_key,\n bfv_verifiable_encrypt_number,\n bfv_verifiable_encrypt_vector,\n compute_pk_commitment,\n get_bfv_params,\n} from '@enclave-e3/wasm'\nimport { generateProof } from './greco'\nimport { CompiledCircuit } from '@noir-lang/noir_js'\n\nexport class EnclaveSDK {\n public static readonly chains = {\n 1: mainnet,\n 11155111: sepolia,\n 41454: monadTestnet,\n 31337: hardhat,\n } as const\n\n private eventListener: EventListener\n private contractClient: ContractClient\n private initialized = false\n private thresholdBfvParamsPresetName?: ThresholdBfvParamsPresetName\n private publicClient: PublicClient\n\n // TODO: use zod for config validation\n constructor(private config: SDKConfig) {\n if (!config.publicClient) {\n throw new SDKError('Public client is required', 'MISSING_PUBLIC_CLIENT')\n }\n\n if (!isValidAddress(config.contracts.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n\n if (!config.thresholdBfvParamsPresetName) {\n throw new SDKError('Threshold BFV parameters preset name is required', 'MISSING_THRESHOLD_BFV_PARAMS_PRESET_NAME')\n }\n\n if (!Object.values(ThresholdBfvParamsPresetNames).includes(config.thresholdBfvParamsPresetName)) {\n throw new SDKError(\n `Invalid threshold BFV parameters preset name: ${config.thresholdBfvParamsPresetName}`,\n 'INVALID_THRESHOLD_BFV_PARAMS_PRESET_NAME',\n )\n }\n\n this.thresholdBfvParamsPresetName = config.thresholdBfvParamsPresetName\n this.eventListener = new EventListener(config.publicClient)\n this.contractClient = new ContractClient(config.publicClient, config.walletClient, config.contracts)\n this.publicClient = config.publicClient\n }\n\n /**\n * Initialize the SDK\n */\n // TODO: Delete this it is redundant\n public async initialize(): Promise<void> {\n if (this.initialized) return\n\n try {\n await this.contractClient.initialize()\n this.initialized = true\n } catch (error) {\n throw new SDKError(`Failed to initialize SDK: ${error}`, 'SDK_INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Get the public client used by the SDK\n * @returns The public client\n */\n public getPublicClient = (): PublicClient => {\n return this.publicClient\n }\n\n public async getThresholdBfvParamsSet(): Promise<BfvParams> {\n await initializeWasm()\n let params = get_bfv_params(this.thresholdBfvParamsPresetName as ThresholdBfvParamsPresetName)\n return {\n degree: Number(params.degree), // degree is returned as a bigint from wasm\n plaintextModulus: params.plaintext_modulus as bigint,\n moduli: params.moduli as bigint[],\n error1Variance: params.error1_variance,\n }\n }\n\n public async generatePublicKey(): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n return generate_public_key(protocolParams.degree, protocolParams.plaintextModulus, BigUint64Array.from(protocolParams.moduli))\n }\n\n public async computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return compute_pk_commitment(\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a number using the configured protocol\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted number\n */\n public async encryptNumber(data: bigint, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a vector using the configured protocol\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The ciphertext\n */\n public async encryptVector(data: BigUint64Array, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * This function encrypts a number using the configured FHE protocol\n * and generates the necessary public inputs for a zk-SNARK proof.\n * @param data The number to encrypt\n * @param publicKey The public key to use for encryption\n * @returns The encrypted number and the inputs for the zk-SNARK proof\n */\n public async encryptNumberAndGenInputs(data: bigint, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n return {\n encryptedData,\n circuitInputs: JSON.parse(circuitInputs),\n }\n }\n\n /**\n * Encrypt a number using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted number and the proof\n */\n public async encryptNumberAndGenProof(\n data: bigint,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { circuitInputs: publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey)\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Encrypt a vector and generate inputs for an E3 computation\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted vector and the inputs for the E3 computation\n */\n public async encryptVectorAndGenInputs(data: BigUint64Array, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n return {\n encryptedData,\n circuitInputs: JSON.parse(circuitInputs),\n }\n }\n\n /**\n * Encrypt a vector using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted vector and the proof\n */\n public async encryptVectorAndGenProof(\n data: BigUint64Array,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { circuitInputs: publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey)\n\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * @param amount - The amount to approve\n * @returns The approval transaction hash\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n console.log('>>> APPROVE FEE TOKEN')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.approveFeeToken(amount)\n }\n\n /**\n * Request a new E3 computation\n */\n public async requestE3(params: {\n threshold: [number, number]\n startWindow: [bigint, bigint]\n duration: bigint\n e3Program: `0x${string}`\n e3ProgramParams: `0x${string}`\n computeProviderParams: `0x${string}`\n customParams?: `0x${string}`\n gasLimit?: bigint\n }): Promise<Hash> {\n console.log('>>> REQUEST')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.requestE3(\n params.threshold,\n params.startWindow,\n params.duration,\n params.e3Program,\n params.e3ProgramParams,\n params.computeProviderParams,\n params.customParams,\n params.gasLimit,\n )\n }\n\n /**\n * Get the public key for an E3 computation\n * @param e3Id - The ID of the E3 computation\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3PublicKey(e3Id)\n }\n\n /**\n * Activate an E3 computation\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.activateE3(e3Id, gasLimit)\n }\n\n /**\n * Publish input for an E3 computation\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishInput(e3Id, data, gasLimit)\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishCiphertextOutput(e3Id, ciphertextOutput, proof, gasLimit)\n }\n\n /**\n * Get E3 information\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3(e3Id)\n }\n\n /**\n * Unified Event Listening - Listen to any Enclave or Registry event\n */\n public onEnclaveEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n // Determine which contract to listen to based on event type\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n void this.eventListener.watchContractEvent(contractAddress, eventType, abi, callback)\n }\n\n /**\n * Remove event listener\n */\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n this.eventListener.off(eventType, callback)\n }\n\n /**\n * Handle an event only once\n */\n public once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): void {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.log(e))\n }\n }\n this.onEnclaveEvent(type, handler)\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n return this.eventListener.getHistoricalEvents(contractAddress, eventType, abi, fromBlock, toBlock)\n }\n\n /**\n * Start polling for events\n */\n public async startEventPolling(): Promise<void> {\n void this.eventListener.startPolling()\n }\n\n /**\n * Stop polling for events\n */\n public stopEventPolling(): void {\n this.eventListener.stopPolling()\n }\n\n /**\n * Utility methods\n */\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n return this.contractClient.estimateGas(functionName, args, contractAddress, abi, value)\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<unknown> {\n return this.contractClient.waitForTransaction(hash)\n }\n\n /**\n * Clean up resources\n */\n public cleanup(): void {\n this.eventListener.cleanup()\n }\n\n /**\n * Update SDK configuration\n */\n // TODO: We should delete this as we don't want a stateful client.\n public updateConfig(newConfig: Partial<SDKConfig>): void {\n if (newConfig.publicClient) {\n this.config.publicClient = newConfig.publicClient\n this.eventListener = new EventListener(newConfig.publicClient)\n }\n\n if (newConfig.walletClient) {\n this.config.walletClient = newConfig.walletClient\n }\n\n if (newConfig.contracts) {\n this.config.contracts = {\n ...this.config.contracts,\n ...newConfig.contracts,\n }\n }\n\n if (newConfig.chainId) {\n this.config.chainId = newConfig.chainId\n }\n\n this.contractClient = new ContractClient(this.config.publicClient, this.config.walletClient, this.config.contracts)\n\n this.initialized = false\n }\n\n public static create(options: {\n rpcUrl: string\n contracts: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n }\n privateKey?: `0x${string}`\n chainId: keyof typeof EnclaveSDK.chains\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n }): EnclaveSDK {\n const chain = EnclaveSDK.chains[options.chainId]\n\n const isWebSocket = options.rpcUrl.startsWith('ws://') || options.rpcUrl.startsWith('wss://')\n const transport = isWebSocket\n ? webSocket(options.rpcUrl, {\n keepAlive: { interval: 30_000 },\n reconnect: { attempts: 5, delay: 2_000 },\n })\n : http(options.rpcUrl)\n const publicClient = createPublicClient({\n chain,\n transport,\n }) as SDKConfig['publicClient']\n let walletClient: WalletClient | undefined = undefined\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey)\n walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n }\n\n return new EnclaveSDK({\n publicClient,\n walletClient,\n contracts: options.contracts,\n chainId: options.chainId,\n thresholdBfvParamsPresetName: options.thresholdBfvParamsPresetName,\n })\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { Abi, Hash, PublicClient, TransactionReceipt, WalletClient } from 'viem'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory, EnclaveToken__factory } from '@enclave-e3/contracts/types'\nimport { type E3 } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nexport class ContractClient {\n private contractInfo: {\n enclave: { address: `0x${string}`; abi: Abi }\n ciphernodeRegistry: { address: `0x${string}`; abi: Abi }\n feeToken: { address: `0x${string}`; abi: Abi }\n } | null = null\n\n constructor(\n private publicClient: PublicClient,\n private walletClient?: WalletClient,\n private addresses: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n } = {\n enclave: '0x0000000000000000000000000000000000000000',\n ciphernodeRegistry: '0x0000000000000000000000000000000000000000',\n feeToken: '0x0000000000000000000000000000000000000000',\n },\n ) {\n if (!isValidAddress(addresses.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n }\n\n /**\n * Initialize contract instances\n */\n public async initialize(): Promise<void> {\n try {\n this.contractInfo = {\n enclave: {\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n },\n ciphernodeRegistry: {\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n },\n feeToken: {\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n },\n }\n } catch (error) {\n throw new SDKError(`Failed to initialize contracts: ${error}`, 'INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * approve(address spender, uint256 amount)\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n functionName: 'approve',\n args: [this.addresses.enclave, amount],\n account,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to approve fee token: ${error}`, 'APPROVE_FEE_TOKEN_FAILED')\n }\n }\n\n /**\n * Request a new E3 computation\n * request(address filter, uint32[2] threshold, uint256[2] startWindow, uint256 duration, IE3Program e3Program, bytes e3ProgramParams, bytes computeProviderParams, bytes customParams)\n */\n public async requestE3(\n threshold: [number, number],\n startWindow: [bigint, bigint],\n duration: bigint,\n e3Program: `0x${string}`,\n e3ProgramParams: `0x${string}`,\n computeProviderParams: `0x${string}`,\n customParams?: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'request',\n args: [\n {\n threshold,\n startWindow,\n duration,\n e3Program,\n e3ProgramParams,\n computeProviderParams,\n customParams: customParams || '0x',\n },\n ],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to request E3: ${error}`, 'REQUEST_E3_FAILED')\n }\n }\n\n /**\n * Activate an E3 computation\n * activate(uint256 e3Id)\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'activate',\n args: [e3Id],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to activate E3: ${error}`, 'ACTIVATE_E3_FAILED')\n }\n }\n\n /**\n * Publish input for an E3 computation\n * publishInput(uint256 e3Id, bytes memory data)\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishInput',\n args: [e3Id, data],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish input: ${error}`, 'PUBLISH_INPUT_FAILED')\n }\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n * publishCiphertextOutput(uint256 e3Id, bytes memory ciphertextOutput, bytes memory proof)\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishCiphertextOutput',\n args: [e3Id, ciphertextOutput, proof],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish ciphertext output: ${error}`, 'PUBLISH_CIPHERTEXT_OUTPUT_FAILED')\n }\n }\n\n /**\n * Get E3 information\n * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3)\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: E3 = await this.publicClient.readContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'getE3',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3: ${error}`, 'GET_E3_FAILED')\n }\n }\n\n /**\n * Get the public key for an E3 computation\n * Based on the contract: committeePublicKey(uint256 e3Id) returns (bytes32 publicKeyHash)\n * @param e3Id\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: `0x${string}` = await this.publicClient.readContract({\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n functionName: 'committeePublicKey',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3 public key: ${error}`, 'GET_E3_PUBLIC_KEY_FAILED')\n }\n }\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for gas estimation', 'NO_WALLET')\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const estimateParams = {\n address: contractAddress,\n abi,\n functionName,\n args,\n account,\n ...(value !== undefined && { value }),\n }\n\n const gas = await this.publicClient.estimateContractGas(estimateParams)\n\n return gas\n } catch (error) {\n throw new SDKError(`Failed to estimate gas: ${error}`, 'GAS_ESTIMATION_FAILED')\n }\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash,\n confirmations: 1,\n })\n\n return receipt\n } catch (error) {\n throw new SDKError(`Failed to wait for transaction: ${error}`, 'TRANSACTION_WAIT_FAILED')\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration\nexport const DEFAULT_E3_CONFIG = {\n threshold_min: 2,\n threshold_max: 5,\n window_size: 120, // 2 minutes in seconds\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'0'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Calculate start window for E3 request\n */\nexport function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] {\n const now = getCurrentTimestamp()\n return [BigInt(now), BigInt(now + windowSize)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\n\nimport {\n type AllEventTypes,\n type EnclaveEvent,\n type EnclaveEventData,\n type EnclaveEventType,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType,\n type SDKEventEmitter,\n} from './types'\nimport { SDKError, sleep } from './utils'\n\nexport class EventListener implements SDKEventEmitter {\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n\n constructor(\n private publicClient: PublicClient,\n private config: EventListenerConfig = {},\n ) {}\n\n /**\n * Listen to specific contract events\n */\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n console.log(`watchContractEvent: ${watcherKey}`)\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n console.log('Added callback')\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n // If we don't have an active watcher for this event, create one\n if (!this.activeWatchers.has(watcherKey)) {\n console.log('Adding active watcher for ' + watcherKey)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) {\n console.log('warning: Log was falsy when a log was expected!')\n break\n }\n const event: EnclaveEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends EnclaveEventType\n ? EnclaveEventData[T]\n : T extends RegistryEventType\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n console.log('Created event, now emitting event...')\n emitter.emit(event)\n console.log('Event emitted')\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n /**\n * Listen to all logs from a specific address\n */\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n /**\n * Start polling for historical events\n */\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n /**\n * Stop polling for events\n */\n public stopPolling(): void {\n this.isPolling = false\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(\n address: `0x${string}`,\n eventType: AllEventTypes,\n abi: Abi,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n try {\n const logs = await this.publicClient.getContractEvents({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: fromBlock || this.config.fromBlock,\n toBlock: toBlock || this.config.toBlock,\n })\n\n return logs\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n /**\n * SDKEventEmitter implementation\n */\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n // Find and stop corresponding watchers\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void {\n console.log('emit() called for ' + event.type)\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n console.log('Have ' + callbacks.size + ' callbacks')\n callbacks.forEach((callback) => {\n console.log('Running callback...')\n try {\n void (callback as EventCallback<T>)(event)\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n /**\n * Clean up all listeners and watchers\n */\n public cleanup(): void {\n this.stopPolling()\n\n // Stop all active watchers\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n\n // Clear all listeners\n this.listeners.clear()\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log, PublicClient, WalletClient } from 'viem'\nimport type { ProofData } from '@aztec/bb.js'\nimport type { CiphernodeRegistryOwnable, Enclave, MockCiphernodeRegistry, MockUSDC, EnclaveToken } from '@enclave-e3/contracts/types'\n\nimport type { CircuitInputs } from './greco'\n\n/**\n * SDK configuration\n */\nexport interface SDKConfig {\n /**\n * The public client to use to interact with the blockchain\n */\n publicClient: PublicClient\n\n /**\n * The wallet client to use to send/sign transactions\n */\n walletClient?: WalletClient\n\n /**\n * The Enclave contracts\n */\n contracts: {\n /**\n * The Enclave contract address\n */\n enclave: `0x${string}`\n\n /**\n * The CiphernodeRegistry contract address\n */\n ciphernodeRegistry: `0x${string}`\n\n /**\n * The FeeToken contract address\n */\n feeToken: `0x${string}`\n }\n\n /**\n * The chain ID to which the contracts are deployed\n */\n chainId?: number\n\n /**\n * The threshold BFV parameters preset name to use for the Enclave requests\n */\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n\nexport interface ContractInstances {\n enclave: Enclave\n ciphernodeRegistry: CiphernodeRegistryOwnable | MockCiphernodeRegistry\n feeToken: EnclaveToken | MockUSDC\n}\n\n// Unified Event System\nexport enum EnclaveEventType {\n // E3 Lifecycle Events\n E3_REQUESTED = 'E3Requested',\n E3_ACTIVATED = 'E3Activated',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n\n // E3 Program Management\n E3_PROGRAM_ENABLED = 'E3ProgramEnabled',\n E3_PROGRAM_DISABLED = 'E3ProgramDisabled',\n\n // Encryption Scheme Management\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n ENCRYPTION_SCHEME_DISABLED = 'EncryptionSchemeDisabled',\n\n // Configuration\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n ALLOWED_E3_PROGRAMS_PARAMS_SET = 'AllowedE3ProgramsParamsSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n // Committee Management\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'CommitteeFinalized',\n\n // Configuration\n ENCLAVE_SET = 'EnclaveSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\n// Union type for all events\nexport type AllEventTypes = EnclaveEventType | RegistryEventType\n\n// Event data interfaces based on TypeChain types\nexport interface E3 {\n seed: bigint\n threshold: readonly [number, number]\n requestBlock: bigint\n startWindow: readonly [bigint, bigint]\n duration: bigint\n expiration: bigint\n encryptionSchemeId: string\n e3Program: string\n e3ProgramParams: string\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n plaintextOutput: string\n}\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: E3\n filter: string\n e3Program: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n seed: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n submissionDeadline: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n publicKey: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n nodes: string[]\n}\n\n// Event data mapping\nexport interface EnclaveEventData {\n [EnclaveEventType.E3_REQUESTED]: E3RequestedData\n [EnclaveEventType.E3_ACTIVATED]: E3ActivatedData\n [EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [EnclaveEventType.E3_PROGRAM_ENABLED]: { e3Program: string }\n [EnclaveEventType.E3_PROGRAM_DISABLED]: { e3Program: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_DISABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [EnclaveEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [EnclaveEventType.ALLOWED_E3_PROGRAMS_PARAMS_SET]: {\n e3ProgramParams: string[]\n }\n [EnclaveEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [EnclaveEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.ENCLAVE_SET]: { enclave: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\n// Generic event structure\nexport interface EnclaveEvent<T extends AllEventTypes> {\n type: T\n data: T extends EnclaveEventType ? EnclaveEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: EnclaveEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void\n}\n\n/**\n * Result of verifiable encryption using BFV\n */\nexport interface VerifiableEncryptionResult {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n /**\n * The proof generated by Greco\n */\n proof: ProofData\n}\n\n/**\n * BFV parameters for an Enclave program request\n * Example for BFV\n * 512, // degree\n * 10, // plaintext_modulus\n * 0xffffee001, // moduli\n * 0xffffc4001, // moduli\n */\nexport interface BfvParams {\n /**\n * The degree of the polynomial\n */\n degree: number\n /**\n * The plaintext modulus\n */\n plaintextModulus: bigint\n /**\n * The moduli\n */\n moduli: bigint[]\n /**\n * error1\n */\n error1Variance: string | undefined\n}\n\nexport type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192'\n\nexport const ThresholdBfvParamsPresetNames = [\n 'INSECURE_THRESHOLD_512',\n 'SECURE_THRESHOLD_8192',\n] as const satisfies ReadonlyArray<ThresholdBfvParamsPresetName>\n\n/**\n * The result of encrypting a value and generating a proof\n */\nexport interface EncryptedValueAndPublicInputs {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n\n /**\n * The public inputs for the proof\n */\n circuitInputs: CircuitInputs\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { UltraHonkBackend, type ProofData } from '@aztec/bb.js'\nimport { type CompiledCircuit, Noir } from '@noir-lang/noir_js'\n\n// Conversion to Noir types\nexport type Field = string\n\n/**\n * Describes a polynomial to be used in a Noir circuit (Greco)\n */\nexport type Polynomial = {\n coefficients: Field[]\n}\n\n/**\n * Describes the inputs to Greco circuit\n */\nexport interface CircuitInputs {\n pk0is: string[][]\n pk1is: string[][]\n ct0is: string[][]\n ct1is: string[][]\n u: string[]\n e0: string[]\n e1: string[]\n e0is: string[][]\n e0_quotients: string[][]\n k1: string[]\n r1is: string[][]\n r2is: string[][]\n p1is: string[][]\n p2is: string[][]\n pk_commitment: string\n}\n\n/**\n * Generate a proof for a given circuit and circuit inputs\n * @dev Defaults to the UltraHonkBackend\n * @param circuitInputs - The circuit inputs\n * @param circuit - The circuit\n * @returns The proof\n */\nexport const generateProof = async (circuitInputs: CircuitInputs, circuit: CompiledCircuit): Promise<ProofData> => {\n const noir = new Noir(circuit)\n\n const backend = new UltraHonkBackend(circuit.bytecode, { threads: 4 })\n\n const { witness } = await noir.execute(circuitInputs as any)\n\n return await backend.generateProof(witness, { keccakZK: true })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,IAAAA,eAAmI;AACnI,sBAAoC;AACpC,oBAAwD;AACxD,kBAA2B;AAE3B,IAAAC,gBAAqE;;;ACHrE,mBAA4F;;;ACF5F,kBAAuE;AAGhE,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACgB,MAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,eAAe,SAAqC;AAClE,SAAO,sBAAsB,KAAK,OAAO;AAC3C;AAEO,SAAS,YAAY,MAA4B;AACtD,SAAO,sBAAsB,KAAK,IAAI;AACxC;AAEO,SAAS,gBAAgB,cAAsB,WAA2B;AAC/E,SAAO,GAAG,YAAY,IAAI,SAAS;AACrC;AAEO,SAAS,eAAkB,KAAa;AAC7C,SAAO,IAAI;AACb;AAKO,IAAM,QAAQ,CAAC,OAA8B;AAClD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEO,SAAS,aAAa,OAAuB;AAClD,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,YAAY,OAAuB;AACjD,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,gBAAgB,KAAkB;AAChD,SAAO,GAAG,IAAI,SAAS,IAAI,IAAI,QAAQ;AACzC;AAKO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACrC;AAUO,IAAM,kCAAyD;AAAA,EACpE,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AACd;AAGO,IAAM,oBAAoB;AAAA,EAC/B,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA;AAAA,EACb,UAAU;AAAA;AAAA,EACV,gBAAgB;AAAA;AAClB;AAMO,SAAS,gBAAgB,QAAkC;AAChE,QAAM,EAAE,QAAQ,kBAAkB,QAAQ,eAAe,IAAI;AAE7D,MAAI,mBAAmB,QAAW;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,aAAO;AAAA,IACL;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,UAClC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,UAC7C,EAAE,MAAM,UAAU,MAAM,YAAY;AAAA,UACpC,EAAE,MAAM,mBAAmB,MAAM,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,QAAQ,OAAO,MAAM;AAAA,QACrB,mBAAmB,OAAO,gBAAgB;AAAA,QAC1C,QAAQ,CAAC,GAAG,MAAM;AAAA,QAClB,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,4BAA4B,QAA+B,OAAgB,OAAsB;AAC/G,MAAI,MAAM;AACR,WAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,EAC5B;AAEA,QAAM,aAAa,KAAK,UAAU,MAAM;AACxC,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,QAAQ,OAAO,UAAU;AAEvC,SAAO,KAAK,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACtF;AAKO,SAAS,mBAAmB,QAAgD;AACjF,QAAM,aAAa,KAAK,UAAU,MAAM;AACxC,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,QAAQ,OAAO,UAAU;AAEvC,SAAO,KAAK,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACtF;AAKO,SAAS,qBAAqB,aAAqB,kBAAkB,aAA+B;AACzG,QAAM,MAAM,oBAAoB;AAChC,SAAO,CAAC,OAAO,GAAG,GAAG,OAAO,MAAM,UAAU,CAAC;AAC/C;AAKO,SAAS,sBAAsB,iBAAwC;AAC5E,MAAI;AAEF,UAAM,MAAM,gBAAgB,WAAW,IAAI,IAAI,gBAAgB,MAAM,CAAC,IAAI;AAG1E,UAAM,QAAQ,IAAI,WAAW,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;AAE1F,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,KAAK,6CAA6C;AAC1D,aAAO;AAAA,IACT;AAGA,UAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,UAAM,SAAS,KAAK,aAAa,GAAG,IAAI;AAExC,WAAO,OAAO,MAAM;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ,MAAM,sCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AACF;;;AD1KO,IAAM,iBAAN,MAAqB;AAAA,EAO1B,YACU,cACA,cACA,YAIJ;AAAA,IACF,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,UAAU;AAAA,EACZ,GACA;AAXQ;AACA;AACA;AAUR,QAAI,CAAC,eAAe,UAAU,OAAO,GAAG;AACtC,YAAM,IAAI,SAAS,oCAAoC,iBAAiB;AAAA,IAC1E;AACA,QAAI,CAAC,eAAe,UAAU,kBAAkB,GAAG;AACjD,YAAM,IAAI,SAAS,+CAA+C,iBAAiB;AAAA,IACrF;AACA,QAAI,CAAC,eAAe,UAAU,QAAQ,GAAG;AACvC,YAAM,IAAI,SAAS,qCAAqC,iBAAiB;AAAA,IAC3E;AAAA,EACF;AAAA,EA5BQ,eAIG;AAAA;AAAA;AAAA;AAAA,EA6BX,MAAa,aAA4B;AACvC,QAAI;AACF,WAAK,eAAe;AAAA,QAClB,SAAS;AAAA,UACP,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,8BAAiB;AAAA,QACxB;AAAA,QACA,oBAAoB;AAAA,UAClB,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,gDAAmC;AAAA,QAC1C;AAAA,QACA,UAAU;AAAA,UACR,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,mCAAsB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,mCAAmC,KAAK,IAAI,uBAAuB;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,gBAAgB,QAA+B;AAC1D,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,mCAAsB;AAAA,QAC3B,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,UAAU,SAAS,MAAM;AAAA,QACrC;AAAA,MACF,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,gCAAgC,KAAK,IAAI,0BAA0B;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UACX,WACA,aACA,UACA,WACA,iBACA,uBACA,cACA,UACe;AACf,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAGA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,8BAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc,gBAAgB;AAAA,UAChC;AAAA,QACF;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAGD,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,yBAAyB,KAAK,IAAI,mBAAmB;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,WAAW,MAAc,UAAkC;AACtE,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,8BAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,0BAA0B,KAAK,IAAI,oBAAoB;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAa,MAAc,MAAqB,UAAkC;AAC7F,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,8BAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,IAAI;AAAA,QACjB;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,4BAA4B,KAAK,IAAI,sBAAsB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,wBACX,MACA,kBACA,OACA,UACe;AACf,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAGA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,8BAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,kBAAkB,KAAK;AAAA,QACpC;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAGD,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,wCAAwC,KAAK,IAAI,kCAAkC;AAAA,IACxG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,MAAM,MAA2B;AAC5C,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,SAAa,MAAM,KAAK,aAAa,aAAa;AAAA,QACtD,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,8BAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,MACb,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,qBAAqB,KAAK,IAAI,eAAe;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,eAAe,MAAsC;AAChE,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,SAAwB,MAAM,KAAK,aAAa,aAAa;AAAA,QACjE,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,gDAAmC;AAAA,QACxC,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,MACb,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,gCAAgC,KAAK,IAAI,0BAA0B;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,cACA,MACA,iBACA,KACA,OACiB;AACjB,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,6CAA6C,WAAW;AAAA,IAC7E;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,iBAAiB;AAAA,QACrB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,MACrC;AAEA,YAAM,MAAM,MAAM,KAAK,aAAa,oBAAoB,cAAc;AAEtE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,2BAA2B,KAAK,IAAI,uBAAuB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,MAAyC;AACvE,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,aAAa,0BAA0B;AAAA,QAChE;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,mCAAmC,KAAK,IAAI,yBAAyB;AAAA,IAC1F;AAAA,EACF;AACF;;;AEjWO,IAAM,gBAAN,MAA+C;AAAA,EAMpD,YACU,cACA,SAA8B,CAAC,GACvC;AAFQ;AACA;AAAA,EACP;AAAA,EARK,YAAoD,oBAAI,IAAI;AAAA,EAC5D,iBAA0C,oBAAI,IAAI;AAAA,EAClD,YAAY;AAAA,EACZ,kBAA0B,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAU1C,MAAa,mBACX,SACA,WACA,KACA,UACe;AACf,UAAM,aAAa,GAAG,OAAO,IAAI,SAAS;AAC1C,YAAQ,IAAI,uBAAuB,UAAU,EAAE;AAE/C,QAAI,CAAC,KAAK,UAAU,IAAI,SAAS,GAAG;AAClC,WAAK,UAAU,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACzC;AACA,YAAQ,IAAI,gBAAgB;AAC5B,SAAK,UAAU,IAAI,SAAS,EAAG,IAAI,QAAyB;AAG5D,UAAM,UAAU;AAGhB,QAAI,CAAC,KAAK,eAAe,IAAI,UAAU,GAAG;AACxC,cAAQ,IAAI,+BAA+B,UAAU;AAErD,UAAI;AACF,cAAM,UAAU,KAAK,aAAa,mBAAmB;AAAA,UACnD;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,WAAW,KAAK,OAAO;AAAA,UACvB,OAAO,MAAa;AAClB,qBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,oBAAM,MAAM,KAAK,CAAC;AAClB,kBAAI,CAAC,KAAK;AACR,wBAAQ,IAAI,iDAAiD;AAC7D;AAAA,cACF;AACA,oBAAM,QAAyB;AAAA,gBAC7B,MAAM;AAAA,gBACN,MAAO,IAAqC;AAAA,gBAK5C;AAAA,gBACA,WAAW,oBAAI,KAAK;AAAA,gBACpB,aAAa,IAAI,eAAe,OAAO,CAAC;AAAA,gBACxC,iBAAiB,IAAI,mBAAmB;AAAA,cAC1C;AACA,sBAAQ,IAAI,sCAAsC;AAClD,sBAAQ,KAAK,KAAK;AAClB,sBAAQ,IAAI,eAAe;AAAA,YAC7B;AAAA,UACF;AAAA,QACF,CAAC;AAED,aAAK,eAAe,IAAI,YAAY,OAAO;AAAA,MAC7C,SAAS,OAAO;AACd,cAAM,IAAI,SAAS,kCAAkC,SAAS,OAAO,OAAO,KAAK,KAAK,IAAI,oBAAoB;AAAA,MAChH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,SAAwB,UAA6C;AAC1F,UAAM,aAAa,QAAQ,OAAO;AAElC,QAAI,CAAC,KAAK,eAAe,IAAI,UAAU,GAAG;AACxC,UAAI;AACF,cAAM,UAAU,KAAK,aAAa,WAAW;AAAA,UAC3C;AAAA,UACA,QAAQ,CAAC,SAAgB;AACvB,iBAAK,QAAQ,CAAC,QAAa;AACzB,uBAAS,GAAG;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAED,aAAK,eAAe,IAAI,YAAY,OAAO;AAAA,MAC7C,SAAS,OAAO;AACd,cAAM,IAAI,SAAS,oCAAoC,OAAO,KAAK,KAAK,IAAI,mBAAmB;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAA8B;AACzC,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AAEjB,QAAI;AACF,WAAK,kBAAkB,MAAM,KAAK,aAAa,eAAe;AAE9D,WAAK,KAAK,cAAc;AAAA,IAC1B,SAAS,OAAO;AACd,WAAK,YAAY;AACjB,YAAM,IAAI,SAAS,4BAA4B,KAAK,IAAI,sBAAsB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAoB;AACzB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBACX,SACA,WACA,KACA,WACA,SACgB;AAChB,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,aAAa,kBAAkB;AAAA,QACrD;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,aAAa,KAAK,OAAO;AAAA,QACpC,SAAS,WAAW,KAAK,OAAO;AAAA,MAClC,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,oCAAoC,KAAK,IAAI,0BAA0B;AAAA,IAC5F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,GAA4B,WAAc,UAAkC;AACjF,QAAI,CAAC,KAAK,UAAU,IAAI,SAAS,GAAG;AAClC,WAAK,UAAU,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACzC;AACA,SAAK,UAAU,IAAI,SAAS,EAAG,IAAI,QAAyB;AAAA,EAC9D;AAAA,EAEO,IAA6B,WAAc,UAAkC;AAClF,UAAM,YAAY,KAAK,UAAU,IAAI,SAAS;AAC9C,QAAI,WAAW;AACb,gBAAU,OAAO,QAAyB;AAC1C,UAAI,UAAU,SAAS,GAAG;AACxB,aAAK,UAAU,OAAO,SAAS;AAE/B,cAAM,mBAA6B,CAAC;AACpC,aAAK,eAAe,QAAQ,CAAC,SAAS,QAAQ;AAC5C,cAAI,IAAI,SAAS,IAAI,SAAS,EAAE,GAAG;AACjC,gBAAI;AACF,sBAAQ;AAAA,YACV,SAAS,OAAO;AACd,sBAAQ,MAAM,0BAA0B,SAAS,KAAK,KAAK;AAAA,YAC7D;AACA,6BAAiB,KAAK,GAAG;AAAA,UAC3B;AAAA,QACF,CAAC;AACD,yBAAiB,QAAQ,CAAC,QAAQ,KAAK,eAAe,OAAO,GAAG,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEO,KAA8B,OAA8B;AACjE,YAAQ,IAAI,uBAAuB,MAAM,IAAI;AAC7C,UAAM,YAAY,KAAK,UAAU,IAAI,MAAM,IAAI;AAC/C,QAAI,WAAW;AACb,cAAQ,IAAI,UAAU,UAAU,OAAO,YAAY;AACnD,gBAAU,QAAQ,CAAC,aAAa;AAC9B,gBAAQ,IAAI,qBAAqB;AACjC,YAAI;AACF,eAAM,SAA8B,KAAK;AAAA,QAC3C,SAAS,OAAO;AACd,kBAAQ,MAAM,+BAA+B,MAAM,IAAI,KAAK,KAAK;AAAA,QACnE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,SAAK,YAAY;AAGjB,SAAK,eAAe,QAAQ,CAAC,YAAY;AACvC,UAAI;AACF,gBAAQ;AAAA,MACV,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF,CAAC;AACD,SAAK,eAAe,MAAM;AAG1B,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,MAAc,gBAA+B;AAC3C,WAAO,KAAK,WAAW;AACrB,UAAI;AACF,cAAM,eAAe,MAAM,KAAK,aAAa,eAAe;AAE5D,YAAI,eAAe,KAAK,iBAAiB;AACvC,eAAK,kBAAkB;AAAA,QACzB;AAEA,cAAM,MAAM,KAAK,OAAO,mBAAmB,GAAI;AAAA,MACjD,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAC5C,cAAM,MAAM,KAAK,OAAO,mBAAmB,GAAI;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;;;ACxLO,IAAK,mBAAL,kBAAKC,sBAAL;AAEL,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,iCAA8B;AAC9B,EAAAA,kBAAA,gCAA6B;AAG7B,EAAAA,kBAAA,wBAAqB;AACrB,EAAAA,kBAAA,yBAAsB;AAGtB,EAAAA,kBAAA,+BAA4B;AAC5B,EAAAA,kBAAA,gCAA6B;AAG7B,EAAAA,kBAAA,6BAA0B;AAC1B,EAAAA,kBAAA,sBAAmB;AACnB,EAAAA,kBAAA,oCAAiC;AAGjC,EAAAA,kBAAA,2BAAwB;AACxB,EAAAA,kBAAA,iBAAc;AAtBJ,SAAAA;AAAA,GAAA;AAyBL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,yBAAsB;AACtB,EAAAA,mBAAA,yBAAsB;AACtB,EAAAA,mBAAA,yBAAsB;AAGtB,EAAAA,mBAAA,iBAAc;AAGd,EAAAA,mBAAA,2BAAwB;AACxB,EAAAA,mBAAA,iBAAc;AAXJ,SAAAA;AAAA,GAAA;AA+LL,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AACF;;;AJvQA,kBAQO;;;AK7BP,gBAAiD;AACjD,qBAA2C;AAwCpC,IAAM,gBAAgB,OAAO,eAA8B,YAAiD;AACjH,QAAM,OAAO,IAAI,oBAAK,OAAO;AAE7B,QAAM,UAAU,IAAI,2BAAiB,QAAQ,UAAU,EAAE,SAAS,EAAE,CAAC;AAErE,QAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,QAAQ,aAAoB;AAE3D,SAAO,MAAM,QAAQ,cAAc,SAAS,EAAE,UAAU,KAAK,CAAC;AAChE;;;ALhBO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA,EAetB,YAAoB,QAAmB;AAAnB;AAClB,QAAI,CAAC,OAAO,cAAc;AACxB,YAAM,IAAI,SAAS,6BAA6B,uBAAuB;AAAA,IACzE;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,OAAO,GAAG;AAC7C,YAAM,IAAI,SAAS,oCAAoC,iBAAiB;AAAA,IAC1E;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,kBAAkB,GAAG;AACxD,YAAM,IAAI,SAAS,+CAA+C,iBAAiB;AAAA,IACrF;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,QAAQ,GAAG;AAC9C,YAAM,IAAI,SAAS,qCAAqC,iBAAiB;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,8BAA8B;AACxC,YAAM,IAAI,SAAS,oDAAoD,0CAA0C;AAAA,IACnH;AAEA,QAAI,CAAC,OAAO,OAAO,6BAA6B,EAAE,SAAS,OAAO,4BAA4B,GAAG;AAC/F,YAAM,IAAI;AAAA,QACR,iDAAiD,OAAO,4BAA4B;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,+BAA+B,OAAO;AAC3C,SAAK,gBAAgB,IAAI,cAAc,OAAO,YAAY;AAC1D,SAAK,iBAAiB,IAAI,eAAe,OAAO,cAAc,OAAO,cAAc,OAAO,SAAS;AACnG,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA,EA9CA,OAAuB,SAAS;AAAA,IAC9B,GAAG;AAAA,IACH,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EAEQ;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCR,MAAa,aAA4B;AACvC,QAAI,KAAK,YAAa;AAEtB,QAAI;AACF,YAAM,KAAK,eAAe,WAAW;AACrC,WAAK,cAAc;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,6BAA6B,KAAK,IAAI,2BAA2B;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAkB,MAAoB;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,2BAA+C;AAC1D,cAAM,YAAAC,SAAe;AACrB,QAAI,aAAS,4BAAe,KAAK,4BAA4D;AAC7F,WAAO;AAAA,MACL,QAAQ,OAAO,OAAO,MAAM;AAAA;AAAA,MAC5B,kBAAkB,OAAO;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAa,oBAAyC;AACpD,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAC3D,eAAO,iCAAoB,eAAe,QAAQ,eAAe,kBAAkB,eAAe,KAAK,eAAe,MAAM,CAAC;AAAA,EAC/H;AAAA,EAEA,MAAa,2BAA2B,WAA4C;AAClF,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,eAAO;AAAA,MACL;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,cAAc,MAAc,WAA4C;AACnF,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,eAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,cAAc,MAAsB,WAA4C;AAC3F,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,eAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,0BAA0B,MAAc,WAA+D;AAClH,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,UAAM,CAAC,eAAe,aAAa,QAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,eAAe,KAAK,MAAM,aAAa;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,yBACX,MACA,WACA,SACqC;AACrC,UAAM,EAAE,eAAe,cAAc,cAAc,IAAI,MAAM,KAAK,0BAA0B,MAAM,SAAS;AAC3G,UAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,0BAA0B,MAAsB,WAA+D;AAC1H,cAAM,YAAAA,SAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,UAAM,CAAC,eAAe,aAAa,QAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,eAAe,KAAK,MAAM,aAAa;AAAA,IACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,yBACX,MACA,WACA,SACqC;AACrC,UAAM,EAAE,eAAe,cAAc,cAAc,IAAI,MAAM,KAAK,0BAA0B,MAAM,SAAS;AAE3G,UAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,gBAAgB,QAA+B;AAC1D,YAAQ,IAAI,uBAAuB;AAEnC,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,gBAAgB,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,QASL;AAChB,YAAQ,IAAI,aAAa;AAEzB,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe;AAAA,MACzB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,eAAe,MAAsC;AAChE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,eAAe,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,MAAc,UAAkC;AACtE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,WAAW,MAAM,QAAQ;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAAa,MAAc,MAAqB,UAAkC;AAC7F,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,wBACX,MACA,kBACA,OACA,UACe;AACf,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,wBAAwB,MAAM,kBAAkB,OAAO,QAAQ;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAM,MAA2B;AAC5C,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,MAAM,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKO,eAAwC,WAAc,UAAkC;AAE7F,UAAM,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,SAAS,SAA6B;AAC7F,UAAM,kBAAkB,iBAAiB,KAAK,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU;AAC/F,UAAM,MAAM,iBAAiB,+BAAiB,MAAM,iDAAmC;AAEvF,SAAK,KAAK,cAAc,mBAAmB,iBAAiB,WAAW,KAAK,QAAQ;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKO,IAA6B,WAAc,UAAkC;AAClF,SAAK,cAAc,IAAI,WAAW,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,KAA8B,MAAS,UAAkC;AAC9E,UAAM,UAA4B,CAAC,UAAU;AAC3C,WAAK,IAAI,MAAM,OAAO;AACtB,YAAM,OAAO,SAAS,KAAK;AAC3B,UAAI,MAAM;AACR,aAAK,MAAM,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,MAClC;AAAA,IACF;AACA,SAAK,eAAe,MAAM,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAoB,WAA0B,WAAoB,SAAkC;AAC/G,UAAM,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,SAAS,SAA6B;AAC7F,UAAM,kBAAkB,iBAAiB,KAAK,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU;AAC/F,UAAM,MAAM,iBAAiB,+BAAiB,MAAM,iDAAmC;AAEvF,WAAO,KAAK,cAAc,oBAAoB,iBAAiB,WAAW,KAAK,WAAW,OAAO;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAmC;AAC9C,SAAK,KAAK,cAAc,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAyB;AAC9B,SAAK,cAAc,YAAY;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,YACX,cACA,MACA,iBACA,KACA,OACiB;AACjB,WAAO,KAAK,eAAe,YAAY,cAAc,MAAM,iBAAiB,KAAK,KAAK;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,MAA8B;AAC5D,WAAO,KAAK,eAAe,mBAAmB,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa,WAAqC;AACvD,QAAI,UAAU,cAAc;AAC1B,WAAK,OAAO,eAAe,UAAU;AACrC,WAAK,gBAAgB,IAAI,cAAc,UAAU,YAAY;AAAA,IAC/D;AAEA,QAAI,UAAU,cAAc;AAC1B,WAAK,OAAO,eAAe,UAAU;AAAA,IACvC;AAEA,QAAI,UAAU,WAAW;AACvB,WAAK,OAAO,YAAY;AAAA,QACtB,GAAG,KAAK,OAAO;AAAA,QACf,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,WAAK,OAAO,UAAU,UAAU;AAAA,IAClC;AAEA,SAAK,iBAAiB,IAAI,eAAe,KAAK,OAAO,cAAc,KAAK,OAAO,cAAc,KAAK,OAAO,SAAS;AAElH,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,OAAc,OAAO,SAUN;AACb,UAAM,QAAQ,YAAW,OAAO,QAAQ,OAAO;AAE/C,UAAM,cAAc,QAAQ,OAAO,WAAW,OAAO,KAAK,QAAQ,OAAO,WAAW,QAAQ;AAC5F,UAAM,YAAY,kBACd,wBAAU,QAAQ,QAAQ;AAAA,MACxB,WAAW,EAAE,UAAU,IAAO;AAAA,MAC9B,WAAW,EAAE,UAAU,GAAG,OAAO,IAAM;AAAA,IACzC,CAAC,QACD,mBAAK,QAAQ,MAAM;AACvB,UAAM,mBAAe,iCAAmB;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,eAAyC;AAC7C,QAAI,QAAQ,YAAY;AACtB,YAAM,cAAU,qCAAoB,QAAQ,UAAU;AACtD,yBAAe,iCAAmB;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,YAAW;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,8BAA8B,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH;AACF;","names":["import_viem","import_types","EnclaveEventType","RegistryEventType","initializeWasm"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -23,24 +23,14 @@ interface CircuitInputs {
|
|
|
23
23
|
e0: string[];
|
|
24
24
|
e1: string[];
|
|
25
25
|
e0is: string[][];
|
|
26
|
+
e0_quotients: string[][];
|
|
26
27
|
k1: string[];
|
|
27
28
|
r1is: string[][];
|
|
28
29
|
r2is: string[][];
|
|
29
30
|
p1is: string[][];
|
|
30
31
|
p2is: string[][];
|
|
32
|
+
pk_commitment: string;
|
|
31
33
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Convert a string array to a polynomial
|
|
34
|
-
* @param stringArray - The string array
|
|
35
|
-
* @returns The polynomial
|
|
36
|
-
*/
|
|
37
|
-
declare const convertToPolynomial: (stringArray: string[]) => Polynomial;
|
|
38
|
-
/**
|
|
39
|
-
* Convert an array of string arrays to an array of polynomials
|
|
40
|
-
* @param stringArrays - The array of string arrays
|
|
41
|
-
* @returns The array of polynomials
|
|
42
|
-
*/
|
|
43
|
-
declare const convertToPolynomialArray: (stringArrays: string[][]) => Polynomial[];
|
|
44
34
|
/**
|
|
45
35
|
* Generate a proof for a given circuit and circuit inputs
|
|
46
36
|
* @dev Defaults to the UltraHonkBackend
|
|
@@ -292,8 +282,8 @@ interface BfvParams {
|
|
|
292
282
|
*/
|
|
293
283
|
error1Variance: string | undefined;
|
|
294
284
|
}
|
|
295
|
-
type ThresholdBfvParamsPresetName = '
|
|
296
|
-
declare const ThresholdBfvParamsPresetNames: readonly ["
|
|
285
|
+
type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192';
|
|
286
|
+
declare const ThresholdBfvParamsPresetNames: readonly ["INSECURE_THRESHOLD_512", "SECURE_THRESHOLD_8192"];
|
|
297
287
|
/**
|
|
298
288
|
* The result of encrypting a value and generating a proof
|
|
299
289
|
*/
|
|
@@ -305,7 +295,7 @@ interface EncryptedValueAndPublicInputs {
|
|
|
305
295
|
/**
|
|
306
296
|
* The public inputs for the proof
|
|
307
297
|
*/
|
|
308
|
-
|
|
298
|
+
circuitInputs: CircuitInputs;
|
|
309
299
|
}
|
|
310
300
|
|
|
311
301
|
declare class EnclaveSDK {
|
|
@@ -487,6 +477,7 @@ declare class EnclaveSDK {
|
|
|
487
477
|
*/
|
|
488
478
|
getPublicClient: () => PublicClient;
|
|
489
479
|
getThresholdBfvParamsSet(): Promise<BfvParams>;
|
|
480
|
+
generatePublicKey(): Promise<Uint8Array>;
|
|
490
481
|
computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array>;
|
|
491
482
|
/**
|
|
492
483
|
* Encrypt a number using the configured protocol
|
|
@@ -787,4 +778,4 @@ declare function calculateStartWindow(windowSize?: number): [bigint, bigint];
|
|
|
787
778
|
*/
|
|
788
779
|
declare function decodePlaintextOutput(plaintextOutput: string): number | null;
|
|
789
780
|
|
|
790
|
-
export { type AllEventTypes, type BfvParams, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CommitteeFinalizedData, type CommitteePublishedData, type CommitteeRequestedData, type ComputeProviderParams, ContractClient, type ContractInstances, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, type E3, type E3ActivatedData, type E3RequestedData, type EnclaveEvent, type EnclaveEventData, EnclaveEventType, EnclaveSDK, type EncryptedValueAndPublicInputs, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type PlaintextOutputPublishedData, type Polynomial, type RegistryEventData, RegistryEventType, type SDKConfig, SDKError, type SDKEventEmitter, type ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames, type VerifiableEncryptionResult, calculateStartWindow,
|
|
781
|
+
export { type AllEventTypes, type BfvParams, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CommitteeFinalizedData, type CommitteePublishedData, type CommitteeRequestedData, type ComputeProviderParams, ContractClient, type ContractInstances, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, type E3, type E3ActivatedData, type E3RequestedData, type EnclaveEvent, type EnclaveEventData, EnclaveEventType, EnclaveSDK, type EncryptedValueAndPublicInputs, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type PlaintextOutputPublishedData, type Polynomial, type RegistryEventData, RegistryEventType, type SDKConfig, SDKError, type SDKEventEmitter, type ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames, type VerifiableEncryptionResult, calculateStartWindow, decodePlaintextOutput, encodeBfvParams, encodeComputeProviderParams, encodeCustomParams, formatBigInt, formatEventName, generateEventId, generateProof, getCurrentTimestamp, isValidAddress, isValidHash, parseBigInt, parseEventData, sleep };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,24 +23,14 @@ interface CircuitInputs {
|
|
|
23
23
|
e0: string[];
|
|
24
24
|
e1: string[];
|
|
25
25
|
e0is: string[][];
|
|
26
|
+
e0_quotients: string[][];
|
|
26
27
|
k1: string[];
|
|
27
28
|
r1is: string[][];
|
|
28
29
|
r2is: string[][];
|
|
29
30
|
p1is: string[][];
|
|
30
31
|
p2is: string[][];
|
|
32
|
+
pk_commitment: string;
|
|
31
33
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Convert a string array to a polynomial
|
|
34
|
-
* @param stringArray - The string array
|
|
35
|
-
* @returns The polynomial
|
|
36
|
-
*/
|
|
37
|
-
declare const convertToPolynomial: (stringArray: string[]) => Polynomial;
|
|
38
|
-
/**
|
|
39
|
-
* Convert an array of string arrays to an array of polynomials
|
|
40
|
-
* @param stringArrays - The array of string arrays
|
|
41
|
-
* @returns The array of polynomials
|
|
42
|
-
*/
|
|
43
|
-
declare const convertToPolynomialArray: (stringArrays: string[][]) => Polynomial[];
|
|
44
34
|
/**
|
|
45
35
|
* Generate a proof for a given circuit and circuit inputs
|
|
46
36
|
* @dev Defaults to the UltraHonkBackend
|
|
@@ -292,8 +282,8 @@ interface BfvParams {
|
|
|
292
282
|
*/
|
|
293
283
|
error1Variance: string | undefined;
|
|
294
284
|
}
|
|
295
|
-
type ThresholdBfvParamsPresetName = '
|
|
296
|
-
declare const ThresholdBfvParamsPresetNames: readonly ["
|
|
285
|
+
type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192';
|
|
286
|
+
declare const ThresholdBfvParamsPresetNames: readonly ["INSECURE_THRESHOLD_512", "SECURE_THRESHOLD_8192"];
|
|
297
287
|
/**
|
|
298
288
|
* The result of encrypting a value and generating a proof
|
|
299
289
|
*/
|
|
@@ -305,7 +295,7 @@ interface EncryptedValueAndPublicInputs {
|
|
|
305
295
|
/**
|
|
306
296
|
* The public inputs for the proof
|
|
307
297
|
*/
|
|
308
|
-
|
|
298
|
+
circuitInputs: CircuitInputs;
|
|
309
299
|
}
|
|
310
300
|
|
|
311
301
|
declare class EnclaveSDK {
|
|
@@ -487,6 +477,7 @@ declare class EnclaveSDK {
|
|
|
487
477
|
*/
|
|
488
478
|
getPublicClient: () => PublicClient;
|
|
489
479
|
getThresholdBfvParamsSet(): Promise<BfvParams>;
|
|
480
|
+
generatePublicKey(): Promise<Uint8Array>;
|
|
490
481
|
computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array>;
|
|
491
482
|
/**
|
|
492
483
|
* Encrypt a number using the configured protocol
|
|
@@ -787,4 +778,4 @@ declare function calculateStartWindow(windowSize?: number): [bigint, bigint];
|
|
|
787
778
|
*/
|
|
788
779
|
declare function decodePlaintextOutput(plaintextOutput: string): number | null;
|
|
789
780
|
|
|
790
|
-
export { type AllEventTypes, type BfvParams, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CommitteeFinalizedData, type CommitteePublishedData, type CommitteeRequestedData, type ComputeProviderParams, ContractClient, type ContractInstances, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, type E3, type E3ActivatedData, type E3RequestedData, type EnclaveEvent, type EnclaveEventData, EnclaveEventType, EnclaveSDK, type EncryptedValueAndPublicInputs, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type PlaintextOutputPublishedData, type Polynomial, type RegistryEventData, RegistryEventType, type SDKConfig, SDKError, type SDKEventEmitter, type ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames, type VerifiableEncryptionResult, calculateStartWindow,
|
|
781
|
+
export { type AllEventTypes, type BfvParams, type CiphernodeAddedData, type CiphernodeRemovedData, type CiphertextOutputPublishedData, type CommitteeFinalizedData, type CommitteePublishedData, type CommitteeRequestedData, type ComputeProviderParams, ContractClient, type ContractInstances, DEFAULT_COMPUTE_PROVIDER_PARAMS, DEFAULT_E3_CONFIG, type E3, type E3ActivatedData, type E3RequestedData, type EnclaveEvent, type EnclaveEventData, EnclaveEventType, EnclaveSDK, type EncryptedValueAndPublicInputs, type EventCallback, type EventFilter, EventListener, type EventListenerConfig, type PlaintextOutputPublishedData, type Polynomial, type RegistryEventData, RegistryEventType, type SDKConfig, SDKError, type SDKEventEmitter, type ThresholdBfvParamsPresetName, ThresholdBfvParamsPresetNames, type VerifiableEncryptionResult, calculateStartWindow, decodePlaintextOutput, encodeBfvParams, encodeComputeProviderParams, encodeCustomParams, formatBigInt, formatEventName, generateEventId, generateProof, getCurrentTimestamp, isValidAddress, isValidHash, parseBigInt, parseEventData, sleep };
|
package/dist/index.js
CHANGED
|
@@ -631,14 +631,15 @@ var RegistryEventType = /* @__PURE__ */ ((RegistryEventType2) => {
|
|
|
631
631
|
return RegistryEventType2;
|
|
632
632
|
})(RegistryEventType || {});
|
|
633
633
|
var ThresholdBfvParamsPresetNames = [
|
|
634
|
-
"
|
|
635
|
-
"
|
|
634
|
+
"INSECURE_THRESHOLD_512",
|
|
635
|
+
"SECURE_THRESHOLD_8192"
|
|
636
636
|
];
|
|
637
637
|
|
|
638
638
|
// src/enclave-sdk.ts
|
|
639
639
|
import {
|
|
640
640
|
bfv_encrypt_number,
|
|
641
641
|
bfv_encrypt_vector,
|
|
642
|
+
generate_public_key,
|
|
642
643
|
bfv_verifiable_encrypt_number,
|
|
643
644
|
bfv_verifiable_encrypt_vector,
|
|
644
645
|
compute_pk_commitment,
|
|
@@ -648,66 +649,10 @@ import {
|
|
|
648
649
|
// src/greco.ts
|
|
649
650
|
import { UltraHonkBackend } from "@aztec/bb.js";
|
|
650
651
|
import { Noir } from "@noir-lang/noir_js";
|
|
651
|
-
var defaultParams = {
|
|
652
|
-
bounds: {
|
|
653
|
-
pk_bounds: ["34359701504", "34359615488"],
|
|
654
|
-
e0_bound: "20",
|
|
655
|
-
e1_bound: "20",
|
|
656
|
-
u_bound: "1",
|
|
657
|
-
r1_low_bounds: ["261", "258"],
|
|
658
|
-
r1_up_bounds: ["260", "258"],
|
|
659
|
-
r2_bounds: ["34359701504", "34359615488"],
|
|
660
|
-
p1_bounds: ["256", "256"],
|
|
661
|
-
p2_bounds: ["34359701504", "34359615488"],
|
|
662
|
-
k1_low_bound: "5",
|
|
663
|
-
k1_up_bound: "4"
|
|
664
|
-
},
|
|
665
|
-
crypto: {
|
|
666
|
-
q_mod_t: "3",
|
|
667
|
-
qis: ["68719403009", "68719230977"],
|
|
668
|
-
k0is: ["61847462708", "20615769293"]
|
|
669
|
-
}
|
|
670
|
-
};
|
|
671
|
-
var convertToPolynomial = (stringArray) => {
|
|
672
|
-
return {
|
|
673
|
-
coefficients: stringArray
|
|
674
|
-
};
|
|
675
|
-
};
|
|
676
|
-
var convertToPolynomialArray = (stringArrays) => {
|
|
677
|
-
return stringArrays.map(convertToPolynomial);
|
|
678
|
-
};
|
|
679
652
|
var generateProof = async (circuitInputs, circuit) => {
|
|
680
653
|
const noir = new Noir(circuit);
|
|
681
654
|
const backend = new UltraHonkBackend(circuit.bytecode, { threads: 4 });
|
|
682
|
-
const
|
|
683
|
-
const pk1is_poly = convertToPolynomialArray(circuitInputs.pk1is);
|
|
684
|
-
const ct0is_poly = convertToPolynomialArray(circuitInputs.ct0is);
|
|
685
|
-
const ct1is_poly = convertToPolynomialArray(circuitInputs.ct1is);
|
|
686
|
-
const u_poly = convertToPolynomial(circuitInputs.u);
|
|
687
|
-
const e0_poly = convertToPolynomial(circuitInputs.e0);
|
|
688
|
-
const e1_poly = convertToPolynomial(circuitInputs.e1);
|
|
689
|
-
const e0is_poly = convertToPolynomialArray(circuitInputs.e0is);
|
|
690
|
-
const k1_poly = convertToPolynomial(circuitInputs.k1);
|
|
691
|
-
const r1is_poly = convertToPolynomialArray(circuitInputs.r1is);
|
|
692
|
-
const r2is_poly = convertToPolynomialArray(circuitInputs.r2is);
|
|
693
|
-
const p1is_poly = convertToPolynomialArray(circuitInputs.p1is);
|
|
694
|
-
const p2is_poly = convertToPolynomialArray(circuitInputs.p2is);
|
|
695
|
-
const { witness } = await noir.execute({
|
|
696
|
-
params: defaultParams,
|
|
697
|
-
pk0is: pk0is_poly,
|
|
698
|
-
pk1is: pk1is_poly,
|
|
699
|
-
ct0is: ct0is_poly,
|
|
700
|
-
ct1is: ct1is_poly,
|
|
701
|
-
u: u_poly,
|
|
702
|
-
e0: e0_poly,
|
|
703
|
-
e1: e1_poly,
|
|
704
|
-
e0is: e0is_poly,
|
|
705
|
-
k1: k1_poly,
|
|
706
|
-
r1is: r1is_poly,
|
|
707
|
-
r2is: r2is_poly,
|
|
708
|
-
p1is: p1is_poly,
|
|
709
|
-
p2is: p2is_poly
|
|
710
|
-
});
|
|
655
|
+
const { witness } = await noir.execute(circuitInputs);
|
|
711
656
|
return await backend.generateProof(witness, { keccakZK: true });
|
|
712
657
|
};
|
|
713
658
|
|
|
@@ -784,6 +729,11 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
784
729
|
error1Variance: params.error1_variance
|
|
785
730
|
};
|
|
786
731
|
}
|
|
732
|
+
async generatePublicKey() {
|
|
733
|
+
await initializeWasm();
|
|
734
|
+
const protocolParams = await this.getThresholdBfvParamsSet();
|
|
735
|
+
return generate_public_key(protocolParams.degree, protocolParams.plaintextModulus, BigUint64Array.from(protocolParams.moduli));
|
|
736
|
+
}
|
|
787
737
|
async computePublicKeyCommitment(publicKey) {
|
|
788
738
|
await initializeWasm();
|
|
789
739
|
const protocolParams = await this.getThresholdBfvParamsSet();
|
|
@@ -845,10 +795,9 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
845
795
|
protocolParams.plaintextModulus,
|
|
846
796
|
BigUint64Array.from(protocolParams.moduli)
|
|
847
797
|
);
|
|
848
|
-
const publicInputs = JSON.parse(circuitInputs);
|
|
849
798
|
return {
|
|
850
799
|
encryptedData,
|
|
851
|
-
|
|
800
|
+
circuitInputs: JSON.parse(circuitInputs)
|
|
852
801
|
};
|
|
853
802
|
}
|
|
854
803
|
/**
|
|
@@ -859,7 +808,7 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
859
808
|
* @returns The encrypted number and the proof
|
|
860
809
|
*/
|
|
861
810
|
async encryptNumberAndGenProof(data, publicKey, circuit) {
|
|
862
|
-
const { publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey);
|
|
811
|
+
const { circuitInputs: publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey);
|
|
863
812
|
const proof = await generateProof(publicInputs, circuit);
|
|
864
813
|
return {
|
|
865
814
|
encryptedData,
|
|
@@ -882,10 +831,9 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
882
831
|
protocolParams.plaintextModulus,
|
|
883
832
|
BigUint64Array.from(protocolParams.moduli)
|
|
884
833
|
);
|
|
885
|
-
const publicInputs = JSON.parse(circuitInputs);
|
|
886
834
|
return {
|
|
887
835
|
encryptedData,
|
|
888
|
-
|
|
836
|
+
circuitInputs: JSON.parse(circuitInputs)
|
|
889
837
|
};
|
|
890
838
|
}
|
|
891
839
|
/**
|
|
@@ -896,7 +844,7 @@ var EnclaveSDK = class _EnclaveSDK {
|
|
|
896
844
|
* @returns The encrypted vector and the proof
|
|
897
845
|
*/
|
|
898
846
|
async encryptVectorAndGenProof(data, publicKey, circuit) {
|
|
899
|
-
const { publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey);
|
|
847
|
+
const { circuitInputs: publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey);
|
|
900
848
|
const proof = await generateProof(publicInputs, circuit);
|
|
901
849
|
return {
|
|
902
850
|
encryptedData,
|
|
@@ -1115,8 +1063,6 @@ export {
|
|
|
1115
1063
|
SDKError,
|
|
1116
1064
|
ThresholdBfvParamsPresetNames,
|
|
1117
1065
|
calculateStartWindow,
|
|
1118
|
-
convertToPolynomial,
|
|
1119
|
-
convertToPolynomialArray,
|
|
1120
1066
|
decodePlaintextOutput,
|
|
1121
1067
|
encodeBfvParams,
|
|
1122
1068
|
encodeComputeProviderParams,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enclave-sdk.ts","../src/contract-client.ts","../src/utils.ts","../src/event-listener.ts","../src/types.ts","../src/greco.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Hash, type Log, PublicClient, WalletClient, createPublicClient, createWalletClient, http, webSocket } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { hardhat, mainnet, monadTestnet, sepolia } from 'viem/chains'\nimport initializeWasm from '@enclave-e3/wasm/init'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory } from '@enclave-e3/contracts/types'\nimport { ContractClient } from './contract-client'\nimport { EventListener } from './event-listener'\nimport { EnclaveEventType, ThresholdBfvParamsPresetNames } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nimport type {\n AllEventTypes,\n E3,\n EventCallback,\n SDKConfig,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n ThresholdBfvParamsPresetName,\n} from './types'\nimport {\n bfv_encrypt_number,\n bfv_encrypt_vector,\n bfv_verifiable_encrypt_number,\n bfv_verifiable_encrypt_vector,\n compute_pk_commitment,\n get_bfv_params,\n} from '@enclave-e3/wasm'\nimport { generateProof } from './greco'\nimport { CompiledCircuit } from '@noir-lang/noir_js'\n\nexport class EnclaveSDK {\n public static readonly chains = {\n 1: mainnet,\n 11155111: sepolia,\n 41454: monadTestnet,\n 31337: hardhat,\n } as const\n\n private eventListener: EventListener\n private contractClient: ContractClient\n private initialized = false\n private thresholdBfvParamsPresetName?: ThresholdBfvParamsPresetName\n private publicClient: PublicClient\n\n // TODO: use zod for config validation\n constructor(private config: SDKConfig) {\n if (!config.publicClient) {\n throw new SDKError('Public client is required', 'MISSING_PUBLIC_CLIENT')\n }\n\n if (!isValidAddress(config.contracts.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n\n if (!config.thresholdBfvParamsPresetName) {\n throw new SDKError('Threshold BFV parameters preset name is required', 'MISSING_THRESHOLD_BFV_PARAMS_PRESET_NAME')\n }\n\n if (!Object.values(ThresholdBfvParamsPresetNames).includes(config.thresholdBfvParamsPresetName)) {\n throw new SDKError(\n `Invalid threshold BFV parameters preset name: ${config.thresholdBfvParamsPresetName}`,\n 'INVALID_THRESHOLD_BFV_PARAMS_PRESET_NAME',\n )\n }\n\n this.thresholdBfvParamsPresetName = config.thresholdBfvParamsPresetName\n this.eventListener = new EventListener(config.publicClient)\n this.contractClient = new ContractClient(config.publicClient, config.walletClient, config.contracts)\n this.publicClient = config.publicClient\n }\n\n /**\n * Initialize the SDK\n */\n // TODO: Delete this it is redundant\n public async initialize(): Promise<void> {\n if (this.initialized) return\n\n try {\n await this.contractClient.initialize()\n this.initialized = true\n } catch (error) {\n throw new SDKError(`Failed to initialize SDK: ${error}`, 'SDK_INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Get the public client used by the SDK\n * @returns The public client\n */\n public getPublicClient = (): PublicClient => {\n return this.publicClient\n }\n\n public async getThresholdBfvParamsSet(): Promise<BfvParams> {\n await initializeWasm()\n let params = get_bfv_params(this.thresholdBfvParamsPresetName as ThresholdBfvParamsPresetName)\n return {\n degree: Number(params.degree), // degree is returned as a bigint from wasm\n plaintextModulus: params.plaintext_modulus as bigint,\n moduli: params.moduli as bigint[],\n error1Variance: params.error1_variance,\n }\n }\n\n public async computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return compute_pk_commitment(\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a number using the configured protocol\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted number\n */\n public async encryptNumber(data: bigint, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a vector using the configured protocol\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The ciphertext\n */\n public async encryptVector(data: BigUint64Array, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * This function encrypts a number using the configured FHE protocol\n * and generates the necessary public inputs for a zk-SNARK proof.\n * @param data The number to encrypt\n * @param publicKey The public key to use for encryption\n * @returns The encrypted number and the inputs for the zk-SNARK proof\n */\n public async encryptNumberAndGenInputs(data: bigint, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n const publicInputs = JSON.parse(circuitInputs)\n return {\n encryptedData,\n publicInputs,\n }\n }\n\n /**\n * Encrypt a number using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted number and the proof\n */\n public async encryptNumberAndGenProof(\n data: bigint,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey)\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Encrypt a vector and generate inputs for an E3 computation\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted vector and the inputs for the E3 computation\n */\n public async encryptVectorAndGenInputs(data: BigUint64Array, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n const publicInputs = JSON.parse(circuitInputs)\n return {\n encryptedData,\n publicInputs,\n }\n }\n\n /**\n * Encrypt a vector using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted vector and the proof\n */\n public async encryptVectorAndGenProof(\n data: BigUint64Array,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey)\n\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * @param amount - The amount to approve\n * @returns The approval transaction hash\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n console.log('>>> APPROVE FEE TOKEN')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.approveFeeToken(amount)\n }\n\n /**\n * Request a new E3 computation\n */\n public async requestE3(params: {\n threshold: [number, number]\n startWindow: [bigint, bigint]\n duration: bigint\n e3Program: `0x${string}`\n e3ProgramParams: `0x${string}`\n computeProviderParams: `0x${string}`\n customParams?: `0x${string}`\n gasLimit?: bigint\n }): Promise<Hash> {\n console.log('>>> REQUEST')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.requestE3(\n params.threshold,\n params.startWindow,\n params.duration,\n params.e3Program,\n params.e3ProgramParams,\n params.computeProviderParams,\n params.customParams,\n params.gasLimit,\n )\n }\n\n /**\n * Get the public key for an E3 computation\n * @param e3Id - The ID of the E3 computation\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3PublicKey(e3Id)\n }\n\n /**\n * Activate an E3 computation\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.activateE3(e3Id, gasLimit)\n }\n\n /**\n * Publish input for an E3 computation\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishInput(e3Id, data, gasLimit)\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishCiphertextOutput(e3Id, ciphertextOutput, proof, gasLimit)\n }\n\n /**\n * Get E3 information\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3(e3Id)\n }\n\n /**\n * Unified Event Listening - Listen to any Enclave or Registry event\n */\n public onEnclaveEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n // Determine which contract to listen to based on event type\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n void this.eventListener.watchContractEvent(contractAddress, eventType, abi, callback)\n }\n\n /**\n * Remove event listener\n */\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n this.eventListener.off(eventType, callback)\n }\n\n /**\n * Handle an event only once\n */\n public once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): void {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.log(e))\n }\n }\n this.onEnclaveEvent(type, handler)\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n return this.eventListener.getHistoricalEvents(contractAddress, eventType, abi, fromBlock, toBlock)\n }\n\n /**\n * Start polling for events\n */\n public async startEventPolling(): Promise<void> {\n void this.eventListener.startPolling()\n }\n\n /**\n * Stop polling for events\n */\n public stopEventPolling(): void {\n this.eventListener.stopPolling()\n }\n\n /**\n * Utility methods\n */\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n return this.contractClient.estimateGas(functionName, args, contractAddress, abi, value)\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<unknown> {\n return this.contractClient.waitForTransaction(hash)\n }\n\n /**\n * Clean up resources\n */\n public cleanup(): void {\n this.eventListener.cleanup()\n }\n\n /**\n * Update SDK configuration\n */\n // TODO: We should delete this as we don't want a stateful client.\n public updateConfig(newConfig: Partial<SDKConfig>): void {\n if (newConfig.publicClient) {\n this.config.publicClient = newConfig.publicClient\n this.eventListener = new EventListener(newConfig.publicClient)\n }\n\n if (newConfig.walletClient) {\n this.config.walletClient = newConfig.walletClient\n }\n\n if (newConfig.contracts) {\n this.config.contracts = {\n ...this.config.contracts,\n ...newConfig.contracts,\n }\n }\n\n if (newConfig.chainId) {\n this.config.chainId = newConfig.chainId\n }\n\n this.contractClient = new ContractClient(this.config.publicClient, this.config.walletClient, this.config.contracts)\n\n this.initialized = false\n }\n\n public static create(options: {\n rpcUrl: string\n contracts: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n }\n privateKey?: `0x${string}`\n chainId: keyof typeof EnclaveSDK.chains\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n }): EnclaveSDK {\n const chain = EnclaveSDK.chains[options.chainId]\n\n const isWebSocket = options.rpcUrl.startsWith('ws://') || options.rpcUrl.startsWith('wss://')\n const transport = isWebSocket\n ? webSocket(options.rpcUrl, {\n keepAlive: { interval: 30_000 },\n reconnect: { attempts: 5, delay: 2_000 },\n })\n : http(options.rpcUrl)\n const publicClient = createPublicClient({\n chain,\n transport,\n }) as SDKConfig['publicClient']\n let walletClient: WalletClient | undefined = undefined\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey)\n walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n }\n\n return new EnclaveSDK({\n publicClient,\n walletClient,\n contracts: options.contracts,\n chainId: options.chainId,\n thresholdBfvParamsPresetName: options.thresholdBfvParamsPresetName,\n })\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { Abi, Hash, PublicClient, TransactionReceipt, WalletClient } from 'viem'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory, EnclaveToken__factory } from '@enclave-e3/contracts/types'\nimport { type E3 } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nexport class ContractClient {\n private contractInfo: {\n enclave: { address: `0x${string}`; abi: Abi }\n ciphernodeRegistry: { address: `0x${string}`; abi: Abi }\n feeToken: { address: `0x${string}`; abi: Abi }\n } | null = null\n\n constructor(\n private publicClient: PublicClient,\n private walletClient?: WalletClient,\n private addresses: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n } = {\n enclave: '0x0000000000000000000000000000000000000000',\n ciphernodeRegistry: '0x0000000000000000000000000000000000000000',\n feeToken: '0x0000000000000000000000000000000000000000',\n },\n ) {\n if (!isValidAddress(addresses.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n }\n\n /**\n * Initialize contract instances\n */\n public async initialize(): Promise<void> {\n try {\n this.contractInfo = {\n enclave: {\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n },\n ciphernodeRegistry: {\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n },\n feeToken: {\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n },\n }\n } catch (error) {\n throw new SDKError(`Failed to initialize contracts: ${error}`, 'INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * approve(address spender, uint256 amount)\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n functionName: 'approve',\n args: [this.addresses.enclave, amount],\n account,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to approve fee token: ${error}`, 'APPROVE_FEE_TOKEN_FAILED')\n }\n }\n\n /**\n * Request a new E3 computation\n * request(address filter, uint32[2] threshold, uint256[2] startWindow, uint256 duration, IE3Program e3Program, bytes e3ProgramParams, bytes computeProviderParams, bytes customParams)\n */\n public async requestE3(\n threshold: [number, number],\n startWindow: [bigint, bigint],\n duration: bigint,\n e3Program: `0x${string}`,\n e3ProgramParams: `0x${string}`,\n computeProviderParams: `0x${string}`,\n customParams?: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'request',\n args: [\n {\n threshold,\n startWindow,\n duration,\n e3Program,\n e3ProgramParams,\n computeProviderParams,\n customParams: customParams || '0x',\n },\n ],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to request E3: ${error}`, 'REQUEST_E3_FAILED')\n }\n }\n\n /**\n * Activate an E3 computation\n * activate(uint256 e3Id)\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'activate',\n args: [e3Id],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to activate E3: ${error}`, 'ACTIVATE_E3_FAILED')\n }\n }\n\n /**\n * Publish input for an E3 computation\n * publishInput(uint256 e3Id, bytes memory data)\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishInput',\n args: [e3Id, data],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish input: ${error}`, 'PUBLISH_INPUT_FAILED')\n }\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n * publishCiphertextOutput(uint256 e3Id, bytes memory ciphertextOutput, bytes memory proof)\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishCiphertextOutput',\n args: [e3Id, ciphertextOutput, proof],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish ciphertext output: ${error}`, 'PUBLISH_CIPHERTEXT_OUTPUT_FAILED')\n }\n }\n\n /**\n * Get E3 information\n * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3)\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: E3 = await this.publicClient.readContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'getE3',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3: ${error}`, 'GET_E3_FAILED')\n }\n }\n\n /**\n * Get the public key for an E3 computation\n * Based on the contract: committeePublicKey(uint256 e3Id) returns (bytes32 publicKeyHash)\n * @param e3Id\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: `0x${string}` = await this.publicClient.readContract({\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n functionName: 'committeePublicKey',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3 public key: ${error}`, 'GET_E3_PUBLIC_KEY_FAILED')\n }\n }\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for gas estimation', 'NO_WALLET')\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const estimateParams = {\n address: contractAddress,\n abi,\n functionName,\n args,\n account,\n ...(value !== undefined && { value }),\n }\n\n const gas = await this.publicClient.estimateContractGas(estimateParams)\n\n return gas\n } catch (error) {\n throw new SDKError(`Failed to estimate gas: ${error}`, 'GAS_ESTIMATION_FAILED')\n }\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash,\n confirmations: 1,\n })\n\n return receipt\n } catch (error) {\n throw new SDKError(`Failed to wait for transaction: ${error}`, 'TRANSACTION_WAIT_FAILED')\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration\nexport const DEFAULT_E3_CONFIG = {\n threshold_min: 2,\n threshold_max: 5,\n window_size: 120, // 2 minutes in seconds\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'0'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Calculate start window for E3 request\n */\nexport function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] {\n const now = getCurrentTimestamp()\n return [BigInt(now), BigInt(now + windowSize)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\n\nimport {\n type AllEventTypes,\n type EnclaveEvent,\n type EnclaveEventData,\n type EnclaveEventType,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType,\n type SDKEventEmitter,\n} from './types'\nimport { SDKError, sleep } from './utils'\n\nexport class EventListener implements SDKEventEmitter {\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n\n constructor(\n private publicClient: PublicClient,\n private config: EventListenerConfig = {},\n ) {}\n\n /**\n * Listen to specific contract events\n */\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n console.log(`watchContractEvent: ${watcherKey}`)\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n console.log('Added callback')\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n // If we don't have an active watcher for this event, create one\n if (!this.activeWatchers.has(watcherKey)) {\n console.log('Adding active watcher for ' + watcherKey)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) {\n console.log('warning: Log was falsy when a log was expected!')\n break\n }\n const event: EnclaveEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends EnclaveEventType\n ? EnclaveEventData[T]\n : T extends RegistryEventType\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n console.log('Created event, now emitting event...')\n emitter.emit(event)\n console.log('Event emitted')\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n /**\n * Listen to all logs from a specific address\n */\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n /**\n * Start polling for historical events\n */\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n /**\n * Stop polling for events\n */\n public stopPolling(): void {\n this.isPolling = false\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(\n address: `0x${string}`,\n eventType: AllEventTypes,\n abi: Abi,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n try {\n const logs = await this.publicClient.getContractEvents({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: fromBlock || this.config.fromBlock,\n toBlock: toBlock || this.config.toBlock,\n })\n\n return logs\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n /**\n * SDKEventEmitter implementation\n */\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n // Find and stop corresponding watchers\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void {\n console.log('emit() called for ' + event.type)\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n console.log('Have ' + callbacks.size + ' callbacks')\n callbacks.forEach((callback) => {\n console.log('Running callback...')\n try {\n void (callback as EventCallback<T>)(event)\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n /**\n * Clean up all listeners and watchers\n */\n public cleanup(): void {\n this.stopPolling()\n\n // Stop all active watchers\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n\n // Clear all listeners\n this.listeners.clear()\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log, PublicClient, WalletClient } from 'viem'\nimport type { ProofData } from '@aztec/bb.js'\nimport type { CiphernodeRegistryOwnable, Enclave, MockCiphernodeRegistry, MockUSDC, EnclaveToken } from '@enclave-e3/contracts/types'\n\nimport type { CircuitInputs } from './greco'\n\n/**\n * SDK configuration\n */\nexport interface SDKConfig {\n /**\n * The public client to use to interact with the blockchain\n */\n publicClient: PublicClient\n\n /**\n * The wallet client to use to send/sign transactions\n */\n walletClient?: WalletClient\n\n /**\n * The Enclave contracts\n */\n contracts: {\n /**\n * The Enclave contract address\n */\n enclave: `0x${string}`\n\n /**\n * The CiphernodeRegistry contract address\n */\n ciphernodeRegistry: `0x${string}`\n\n /**\n * The FeeToken contract address\n */\n feeToken: `0x${string}`\n }\n\n /**\n * The chain ID to which the contracts are deployed\n */\n chainId?: number\n\n /**\n * The threshold BFV parameters preset name to use for the Enclave requests\n */\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n\nexport interface ContractInstances {\n enclave: Enclave\n ciphernodeRegistry: CiphernodeRegistryOwnable | MockCiphernodeRegistry\n feeToken: EnclaveToken | MockUSDC\n}\n\n// Unified Event System\nexport enum EnclaveEventType {\n // E3 Lifecycle Events\n E3_REQUESTED = 'E3Requested',\n E3_ACTIVATED = 'E3Activated',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n\n // E3 Program Management\n E3_PROGRAM_ENABLED = 'E3ProgramEnabled',\n E3_PROGRAM_DISABLED = 'E3ProgramDisabled',\n\n // Encryption Scheme Management\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n ENCRYPTION_SCHEME_DISABLED = 'EncryptionSchemeDisabled',\n\n // Configuration\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n ALLOWED_E3_PROGRAMS_PARAMS_SET = 'AllowedE3ProgramsParamsSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n // Committee Management\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'CommitteeFinalized',\n\n // Configuration\n ENCLAVE_SET = 'EnclaveSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\n// Union type for all events\nexport type AllEventTypes = EnclaveEventType | RegistryEventType\n\n// Event data interfaces based on TypeChain types\nexport interface E3 {\n seed: bigint\n threshold: readonly [number, number]\n requestBlock: bigint\n startWindow: readonly [bigint, bigint]\n duration: bigint\n expiration: bigint\n encryptionSchemeId: string\n e3Program: string\n e3ProgramParams: string\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n plaintextOutput: string\n}\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: E3\n filter: string\n e3Program: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n seed: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n submissionDeadline: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n publicKey: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n nodes: string[]\n}\n\n// Event data mapping\nexport interface EnclaveEventData {\n [EnclaveEventType.E3_REQUESTED]: E3RequestedData\n [EnclaveEventType.E3_ACTIVATED]: E3ActivatedData\n [EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [EnclaveEventType.E3_PROGRAM_ENABLED]: { e3Program: string }\n [EnclaveEventType.E3_PROGRAM_DISABLED]: { e3Program: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_DISABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [EnclaveEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [EnclaveEventType.ALLOWED_E3_PROGRAMS_PARAMS_SET]: {\n e3ProgramParams: string[]\n }\n [EnclaveEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [EnclaveEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.ENCLAVE_SET]: { enclave: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\n// Generic event structure\nexport interface EnclaveEvent<T extends AllEventTypes> {\n type: T\n data: T extends EnclaveEventType ? EnclaveEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: EnclaveEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void\n}\n\n/**\n * Result of verifiable encryption using BFV\n */\nexport interface VerifiableEncryptionResult {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n /**\n * The proof generated by Greco\n */\n proof: ProofData\n}\n\n/**\n * BFV parameters for an Enclave program request\n * Example for BFV\n * 512, // degree\n * 10, // plaintext_modulus\n * 0xffffee001, // moduli\n * 0xffffc4001, // moduli\n */\nexport interface BfvParams {\n /**\n * The degree of the polynomial\n */\n degree: number\n /**\n * The plaintext modulus\n */\n plaintextModulus: bigint\n /**\n * The moduli\n */\n moduli: bigint[]\n /**\n * error1\n */\n error1Variance: string | undefined\n}\n\nexport type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_BFV_512' | 'SECURE_THRESHOLD_BFV_8192'\n\nexport const ThresholdBfvParamsPresetNames = [\n 'INSECURE_THRESHOLD_BFV_512',\n 'SECURE_THRESHOLD_BFV_8192',\n] as const satisfies ReadonlyArray<ThresholdBfvParamsPresetName>\n\n/**\n * The result of encrypting a value and generating a proof\n */\nexport interface EncryptedValueAndPublicInputs {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n\n /**\n * The public inputs for the proof\n */\n publicInputs: CircuitInputs\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { UltraHonkBackend, type ProofData } from '@aztec/bb.js'\nimport { type CompiledCircuit, Noir } from '@noir-lang/noir_js'\n\n// Conversion to Noir types\nexport type Field = string\n\n/**\n * Describes a polynomial to be used in a Noir circuit (Greco)\n */\nexport type Polynomial = {\n coefficients: Field[]\n}\n\n/**\n * Describes the inputs to Greco circuit\n */\nexport interface CircuitInputs {\n pk0is: string[][]\n pk1is: string[][]\n ct0is: string[][]\n ct1is: string[][]\n u: string[]\n e0: string[]\n e1: string[]\n e0is: string[][]\n k1: string[]\n r1is: string[][]\n r2is: string[][]\n p1is: string[][]\n p2is: string[][]\n}\n\n/**\n * BfvPkEncryption params for Greco\npub struct Params<let N: u32, let L: u32> {\n crypto: CryptographicParams<L>,\n bounds: BoundParams<L>,\n}\n */\nexport interface BoundParams {\n pk_bounds: Field[]\n e0_bound: Field\n e1_bound: Field\n u_bound: Field\n r1_low_bounds: Field[]\n r1_up_bounds: Field[]\n r2_bounds: Field[]\n p1_bounds: Field[]\n p2_bounds: Field[]\n k1_low_bound: Field\n k1_up_bound: Field\n}\n\nexport interface CryptographicParams {\n q_mod_t: Field\n qis: Field[]\n k0is: Field[]\n}\n\nexport interface Params {\n bounds: BoundParams\n crypto: CryptographicParams\n}\n\n/**\n * Default greco params for BFV pk encryption.\n */\nexport const defaultParams: Params = {\n bounds: {\n pk_bounds: ['34359701504', '34359615488'],\n e0_bound: '20',\n e1_bound: '20',\n u_bound: '1',\n r1_low_bounds: ['261', '258'],\n r1_up_bounds: ['260', '258'],\n r2_bounds: ['34359701504', '34359615488'],\n p1_bounds: ['256', '256'],\n p2_bounds: ['34359701504', '34359615488'],\n k1_low_bound: '5',\n k1_up_bound: '4',\n },\n crypto: {\n q_mod_t: '3',\n qis: ['68719403009', '68719230977'],\n k0is: ['61847462708', '20615769293'],\n },\n}\n\n/**\n * Convert a string array to a polynomial\n * @param stringArray - The string array\n * @returns The polynomial\n */\nexport const convertToPolynomial = (stringArray: string[]): Polynomial => {\n return {\n coefficients: stringArray,\n }\n}\n\n/**\n * Convert an array of string arrays to an array of polynomials\n * @param stringArrays - The array of string arrays\n * @returns The array of polynomials\n */\nexport const convertToPolynomialArray = (stringArrays: string[][]): Polynomial[] => {\n return stringArrays.map(convertToPolynomial)\n}\n\n/**\n * Generate a proof for a given circuit and circuit inputs\n * @dev Defaults to the UltraHonkBackend\n * @param circuitInputs - The circuit inputs\n * @param circuit - The circuit\n * @returns The proof\n */\nexport const generateProof = async (circuitInputs: CircuitInputs, circuit: CompiledCircuit): Promise<ProofData> => {\n const noir = new Noir(circuit)\n\n const backend = new UltraHonkBackend(circuit.bytecode, { threads: 4 })\n\n const pk0is_poly = convertToPolynomialArray(circuitInputs.pk0is)\n const pk1is_poly = convertToPolynomialArray(circuitInputs.pk1is)\n const ct0is_poly = convertToPolynomialArray(circuitInputs.ct0is)\n const ct1is_poly = convertToPolynomialArray(circuitInputs.ct1is)\n const u_poly = convertToPolynomial(circuitInputs.u)\n const e0_poly = convertToPolynomial(circuitInputs.e0)\n const e1_poly = convertToPolynomial(circuitInputs.e1)\n const e0is_poly = convertToPolynomialArray(circuitInputs.e0is)\n const k1_poly = convertToPolynomial(circuitInputs.k1)\n const r1is_poly = convertToPolynomialArray(circuitInputs.r1is)\n const r2is_poly = convertToPolynomialArray(circuitInputs.r2is)\n const p1is_poly = convertToPolynomialArray(circuitInputs.p1is)\n const p2is_poly = convertToPolynomialArray(circuitInputs.p2is)\n\n const { witness } = await noir.execute({\n params: defaultParams as any,\n pk0is: pk0is_poly,\n pk1is: pk1is_poly,\n ct0is: ct0is_poly,\n ct1is: ct1is_poly,\n u: u_poly,\n e0: e0_poly,\n e1: e1_poly,\n e0is: e0is_poly,\n k1: k1_poly,\n r1is: r1is_poly,\n r2is: r2is_poly,\n p1is: p1is_poly,\n p2is: p2is_poly,\n })\n\n return await backend.generateProof(witness, { keccakZK: true })\n}\n"],"mappings":";AAMA,SAAoE,oBAAoB,oBAAoB,MAAM,iBAAiB;AACnI,SAAS,2BAA2B;AACpC,SAAS,SAAS,SAAS,cAAc,eAAe;AACxD,OAAO,oBAAoB;AAE3B,SAAS,sCAAAA,qCAAoC,oBAAAC,yBAAwB;;;ACHrE,SAAS,oCAAoC,kBAAkB,6BAA6B;;;ACF5F,SAA4C,2BAA2B;AAGhE,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YACE,SACgB,MAChB;AACA,UAAM,OAAO;AAFG;AAGhB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,eAAe,SAAqC;AAClE,SAAO,sBAAsB,KAAK,OAAO;AAC3C;AAEO,SAAS,YAAY,MAA4B;AACtD,SAAO,sBAAsB,KAAK,IAAI;AACxC;AAEO,SAAS,gBAAgB,cAAsB,WAA2B;AAC/E,SAAO,GAAG,YAAY,IAAI,SAAS;AACrC;AAEO,SAAS,eAAkB,KAAa;AAC7C,SAAO,IAAI;AACb;AAKO,IAAM,QAAQ,CAAC,OAA8B;AAClD,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAEO,SAAS,aAAa,OAAuB;AAClD,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,YAAY,OAAuB;AACjD,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,gBAAgB,KAAkB;AAChD,SAAO,GAAG,IAAI,SAAS,IAAI,IAAI,QAAQ;AACzC;AAKO,SAAS,sBAA8B;AAC5C,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACrC;AAUO,IAAM,kCAAyD;AAAA,EACpE,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AACd;AAGO,IAAM,oBAAoB;AAAA,EAC/B,eAAe;AAAA,EACf,eAAe;AAAA,EACf,aAAa;AAAA;AAAA,EACb,UAAU;AAAA;AAAA,EACV,gBAAgB;AAAA;AAClB;AAMO,SAAS,gBAAgB,QAAkC;AAChE,QAAM,EAAE,QAAQ,kBAAkB,QAAQ,eAAe,IAAI;AAE7D,MAAI,mBAAmB,QAAW;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,MACE;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,YAAY;AAAA,UACV,EAAE,MAAM,UAAU,MAAM,UAAU;AAAA,UAClC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,UAC7C,EAAE,MAAM,UAAU,MAAM,YAAY;AAAA,UACpC,EAAE,MAAM,mBAAmB,MAAM,SAAS;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,QACE,QAAQ,OAAO,MAAM;AAAA,QACrB,mBAAmB,OAAO,gBAAgB;AAAA,QAC1C,QAAQ,CAAC,GAAG,MAAM;AAAA,QAClB,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,4BAA4B,QAA+B,OAAgB,OAAsB;AAC/G,MAAI,MAAM;AACR,WAAO,KAAK,IAAI,OAAO,EAAE,CAAC;AAAA,EAC5B;AAEA,QAAM,aAAa,KAAK,UAAU,MAAM;AACxC,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,QAAQ,OAAO,UAAU;AAEvC,SAAO,KAAK,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACtF;AAKO,SAAS,mBAAmB,QAAgD;AACjF,QAAM,aAAa,KAAK,UAAU,MAAM;AACxC,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,QAAQ,QAAQ,OAAO,UAAU;AAEvC,SAAO,KAAK,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACtF;AAKO,SAAS,qBAAqB,aAAqB,kBAAkB,aAA+B;AACzG,QAAM,MAAM,oBAAoB;AAChC,SAAO,CAAC,OAAO,GAAG,GAAG,OAAO,MAAM,UAAU,CAAC;AAC/C;AAKO,SAAS,sBAAsB,iBAAwC;AAC5E,MAAI;AAEF,UAAM,MAAM,gBAAgB,WAAW,IAAI,IAAI,gBAAgB,MAAM,CAAC,IAAI;AAG1E,UAAM,QAAQ,IAAI,WAAW,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;AAE1F,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,KAAK,6CAA6C;AAC1D,aAAO;AAAA,IACT;AAGA,UAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,UAAM,SAAS,KAAK,aAAa,GAAG,IAAI;AAExC,WAAO,OAAO,MAAM;AAAA,EACtB,SAAS,OAAO;AACd,YAAQ,MAAM,sCAAsC,KAAK;AACzD,WAAO;AAAA,EACT;AACF;;;AD1KO,IAAM,iBAAN,MAAqB;AAAA,EAO1B,YACU,cACA,cACA,YAIJ;AAAA,IACF,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,UAAU;AAAA,EACZ,GACA;AAXQ;AACA;AACA;AAUR,QAAI,CAAC,eAAe,UAAU,OAAO,GAAG;AACtC,YAAM,IAAI,SAAS,oCAAoC,iBAAiB;AAAA,IAC1E;AACA,QAAI,CAAC,eAAe,UAAU,kBAAkB,GAAG;AACjD,YAAM,IAAI,SAAS,+CAA+C,iBAAiB;AAAA,IACrF;AACA,QAAI,CAAC,eAAe,UAAU,QAAQ,GAAG;AACvC,YAAM,IAAI,SAAS,qCAAqC,iBAAiB;AAAA,IAC3E;AAAA,EACF;AAAA,EA5BQ,eAIG;AAAA;AAAA;AAAA;AAAA,EA6BX,MAAa,aAA4B;AACvC,QAAI;AACF,WAAK,eAAe;AAAA,QAClB,SAAS;AAAA,UACP,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,iBAAiB;AAAA,QACxB;AAAA,QACA,oBAAoB;AAAA,UAClB,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,mCAAmC;AAAA,QAC1C;AAAA,QACA,UAAU;AAAA,UACR,SAAS,KAAK,UAAU;AAAA,UACxB,KAAK,sBAAsB;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,mCAAmC,KAAK,IAAI,uBAAuB;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,gBAAgB,QAA+B;AAC1D,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,sBAAsB;AAAA,QAC3B,cAAc;AAAA,QACd,MAAM,CAAC,KAAK,UAAU,SAAS,MAAM;AAAA,QACrC;AAAA,MACF,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,gCAAgC,KAAK,IAAI,0BAA0B;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,UACX,WACA,aACA,UACA,WACA,iBACA,uBACA,cACA,UACe;AACf,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAGA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,iBAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM;AAAA,UACJ;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,cAAc,gBAAgB;AAAA,UAChC;AAAA,QACF;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAGD,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,yBAAyB,KAAK,IAAI,mBAAmB;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,WAAW,MAAc,UAAkC;AACtE,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,iBAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,QACX;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,0BAA0B,KAAK,IAAI,oBAAoB;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,aAAa,MAAc,MAAqB,UAAkC;AAC7F,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,iBAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,IAAI;AAAA,QACjB;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAED,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,4BAA4B,KAAK,IAAI,sBAAsB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,wBACX,MACA,kBACA,OACA,UACe;AACf,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,+CAA+C,WAAW;AAAA,IAC/E;AAEA,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAGA,YAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,aAAa,iBAAiB;AAAA,QAC3D,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,iBAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,MAAM,kBAAkB,KAAK;AAAA,QACpC;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AAGD,YAAM,OAAO,MAAM,KAAK,aAAa,cAAc,OAAO;AAE1D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,wCAAwC,KAAK,IAAI,kCAAkC;AAAA,IACxG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,MAAM,MAA2B;AAC5C,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,SAAa,MAAM,KAAK,aAAa,aAAa;AAAA,QACtD,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,iBAAiB;AAAA,QACtB,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,MACb,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,qBAAqB,KAAK,IAAI,eAAe;AAAA,IAClE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,eAAe,MAAsC;AAChE,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,SAAwB,MAAM,KAAK,aAAa,aAAa;AAAA,QACjE,SAAS,KAAK,UAAU;AAAA,QACxB,KAAK,mCAAmC;AAAA,QACxC,cAAc;AAAA,QACd,MAAM,CAAC,IAAI;AAAA,MACb,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,gCAAgC,KAAK,IAAI,0BAA0B;AAAA,IACxF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,YACX,cACA,MACA,iBACA,KACA,OACiB;AACjB,QAAI,CAAC,KAAK,cAAc;AACtB,YAAM,IAAI,SAAS,6CAA6C,WAAW;AAAA,IAC7E;AAEA,QAAI;AACF,YAAM,UAAU,KAAK,aAAa;AAClC,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI,SAAS,wBAAwB,YAAY;AAAA,MACzD;AAEA,YAAM,iBAAiB;AAAA,QACrB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,UAAU,UAAa,EAAE,MAAM;AAAA,MACrC;AAEA,YAAM,MAAM,MAAM,KAAK,aAAa,oBAAoB,cAAc;AAEtE,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,2BAA2B,KAAK,IAAI,uBAAuB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,MAAyC;AACvE,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,aAAa,0BAA0B;AAAA,QAChE;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,mCAAmC,KAAK,IAAI,yBAAyB;AAAA,IAC1F;AAAA,EACF;AACF;;;AEjWO,IAAM,gBAAN,MAA+C;AAAA,EAMpD,YACU,cACA,SAA8B,CAAC,GACvC;AAFQ;AACA;AAAA,EACP;AAAA,EARK,YAAoD,oBAAI,IAAI;AAAA,EAC5D,iBAA0C,oBAAI,IAAI;AAAA,EAClD,YAAY;AAAA,EACZ,kBAA0B,OAAO,CAAC;AAAA;AAAA;AAAA;AAAA,EAU1C,MAAa,mBACX,SACA,WACA,KACA,UACe;AACf,UAAM,aAAa,GAAG,OAAO,IAAI,SAAS;AAC1C,YAAQ,IAAI,uBAAuB,UAAU,EAAE;AAE/C,QAAI,CAAC,KAAK,UAAU,IAAI,SAAS,GAAG;AAClC,WAAK,UAAU,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACzC;AACA,YAAQ,IAAI,gBAAgB;AAC5B,SAAK,UAAU,IAAI,SAAS,EAAG,IAAI,QAAyB;AAG5D,UAAM,UAAU;AAGhB,QAAI,CAAC,KAAK,eAAe,IAAI,UAAU,GAAG;AACxC,cAAQ,IAAI,+BAA+B,UAAU;AAErD,UAAI;AACF,cAAM,UAAU,KAAK,aAAa,mBAAmB;AAAA,UACnD;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,WAAW,KAAK,OAAO;AAAA,UACvB,OAAO,MAAa;AAClB,qBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,oBAAM,MAAM,KAAK,CAAC;AAClB,kBAAI,CAAC,KAAK;AACR,wBAAQ,IAAI,iDAAiD;AAC7D;AAAA,cACF;AACA,oBAAM,QAAyB;AAAA,gBAC7B,MAAM;AAAA,gBACN,MAAO,IAAqC;AAAA,gBAK5C;AAAA,gBACA,WAAW,oBAAI,KAAK;AAAA,gBACpB,aAAa,IAAI,eAAe,OAAO,CAAC;AAAA,gBACxC,iBAAiB,IAAI,mBAAmB;AAAA,cAC1C;AACA,sBAAQ,IAAI,sCAAsC;AAClD,sBAAQ,KAAK,KAAK;AAClB,sBAAQ,IAAI,eAAe;AAAA,YAC7B;AAAA,UACF;AAAA,QACF,CAAC;AAED,aAAK,eAAe,IAAI,YAAY,OAAO;AAAA,MAC7C,SAAS,OAAO;AACd,cAAM,IAAI,SAAS,kCAAkC,SAAS,OAAO,OAAO,KAAK,KAAK,IAAI,oBAAoB;AAAA,MAChH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,SAAwB,UAA6C;AAC1F,UAAM,aAAa,QAAQ,OAAO;AAElC,QAAI,CAAC,KAAK,eAAe,IAAI,UAAU,GAAG;AACxC,UAAI;AACF,cAAM,UAAU,KAAK,aAAa,WAAW;AAAA,UAC3C;AAAA,UACA,QAAQ,CAAC,SAAgB;AACvB,iBAAK,QAAQ,CAAC,QAAa;AACzB,uBAAS,GAAG;AAAA,YACd,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAED,aAAK,eAAe,IAAI,YAAY,OAAO;AAAA,MAC7C,SAAS,OAAO;AACd,cAAM,IAAI,SAAS,oCAAoC,OAAO,KAAK,KAAK,IAAI,mBAAmB;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,eAA8B;AACzC,QAAI,KAAK,UAAW;AAEpB,SAAK,YAAY;AAEjB,QAAI;AACF,WAAK,kBAAkB,MAAM,KAAK,aAAa,eAAe;AAE9D,WAAK,KAAK,cAAc;AAAA,IAC1B,SAAS,OAAO;AACd,WAAK,YAAY;AACjB,YAAM,IAAI,SAAS,4BAA4B,KAAK,IAAI,sBAAsB;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAoB;AACzB,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBACX,SACA,WACA,KACA,WACA,SACgB;AAChB,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,aAAa,kBAAkB;AAAA,QACrD;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,WAAW,aAAa,KAAK,OAAO;AAAA,QACpC,SAAS,WAAW,KAAK,OAAO;AAAA,MAClC,CAAC;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,oCAAoC,KAAK,IAAI,0BAA0B;AAAA,IAC5F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,GAA4B,WAAc,UAAkC;AACjF,QAAI,CAAC,KAAK,UAAU,IAAI,SAAS,GAAG;AAClC,WAAK,UAAU,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,IACzC;AACA,SAAK,UAAU,IAAI,SAAS,EAAG,IAAI,QAAyB;AAAA,EAC9D;AAAA,EAEO,IAA6B,WAAc,UAAkC;AAClF,UAAM,YAAY,KAAK,UAAU,IAAI,SAAS;AAC9C,QAAI,WAAW;AACb,gBAAU,OAAO,QAAyB;AAC1C,UAAI,UAAU,SAAS,GAAG;AACxB,aAAK,UAAU,OAAO,SAAS;AAE/B,cAAM,mBAA6B,CAAC;AACpC,aAAK,eAAe,QAAQ,CAAC,SAAS,QAAQ;AAC5C,cAAI,IAAI,SAAS,IAAI,SAAS,EAAE,GAAG;AACjC,gBAAI;AACF,sBAAQ;AAAA,YACV,SAAS,OAAO;AACd,sBAAQ,MAAM,0BAA0B,SAAS,KAAK,KAAK;AAAA,YAC7D;AACA,6BAAiB,KAAK,GAAG;AAAA,UAC3B;AAAA,QACF,CAAC;AACD,yBAAiB,QAAQ,CAAC,QAAQ,KAAK,eAAe,OAAO,GAAG,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA,EAEO,KAA8B,OAA8B;AACjE,YAAQ,IAAI,uBAAuB,MAAM,IAAI;AAC7C,UAAM,YAAY,KAAK,UAAU,IAAI,MAAM,IAAI;AAC/C,QAAI,WAAW;AACb,cAAQ,IAAI,UAAU,UAAU,OAAO,YAAY;AACnD,gBAAU,QAAQ,CAAC,aAAa;AAC9B,gBAAQ,IAAI,qBAAqB;AACjC,YAAI;AACF,eAAM,SAA8B,KAAK;AAAA,QAC3C,SAAS,OAAO;AACd,kBAAQ,MAAM,+BAA+B,MAAM,IAAI,KAAK,KAAK;AAAA,QACnE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,SAAK,YAAY;AAGjB,SAAK,eAAe,QAAQ,CAAC,YAAY;AACvC,UAAI;AACF,gBAAQ;AAAA,MACV,SAAS,OAAO;AACd,gBAAQ,MAAM,oCAAoC,KAAK;AAAA,MACzD;AAAA,IACF,CAAC;AACD,SAAK,eAAe,MAAM;AAG1B,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,MAAc,gBAA+B;AAC3C,WAAO,KAAK,WAAW;AACrB,UAAI;AACF,cAAM,eAAe,MAAM,KAAK,aAAa,eAAe;AAE5D,YAAI,eAAe,KAAK,iBAAiB;AACvC,eAAK,kBAAkB;AAAA,QACzB;AAEA,cAAM,MAAM,KAAK,OAAO,mBAAmB,GAAI;AAAA,MACjD,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAC5C,cAAM,MAAM,KAAK,OAAO,mBAAmB,GAAI;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;;;ACxLO,IAAK,mBAAL,kBAAKC,sBAAL;AAEL,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,kBAAe;AACf,EAAAA,kBAAA,iCAA8B;AAC9B,EAAAA,kBAAA,gCAA6B;AAG7B,EAAAA,kBAAA,wBAAqB;AACrB,EAAAA,kBAAA,yBAAsB;AAGtB,EAAAA,kBAAA,+BAA4B;AAC5B,EAAAA,kBAAA,gCAA6B;AAG7B,EAAAA,kBAAA,6BAA0B;AAC1B,EAAAA,kBAAA,sBAAmB;AACnB,EAAAA,kBAAA,oCAAiC;AAGjC,EAAAA,kBAAA,2BAAwB;AACxB,EAAAA,kBAAA,iBAAc;AAtBJ,SAAAA;AAAA,GAAA;AAyBL,IAAK,oBAAL,kBAAKC,uBAAL;AAEL,EAAAA,mBAAA,yBAAsB;AACtB,EAAAA,mBAAA,yBAAsB;AACtB,EAAAA,mBAAA,yBAAsB;AAGtB,EAAAA,mBAAA,iBAAc;AAGd,EAAAA,mBAAA,2BAAwB;AACxB,EAAAA,mBAAA,iBAAc;AAXJ,SAAAA;AAAA,GAAA;AA+LL,IAAM,gCAAgC;AAAA,EAC3C;AAAA,EACA;AACF;;;AJvQA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;AK5BP,SAAS,wBAAwC;AACjD,SAA+B,YAAY;AAkEpC,IAAM,gBAAwB;AAAA,EACnC,QAAQ;AAAA,IACN,WAAW,CAAC,eAAe,aAAa;AAAA,IACxC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,eAAe,CAAC,OAAO,KAAK;AAAA,IAC5B,cAAc,CAAC,OAAO,KAAK;AAAA,IAC3B,WAAW,CAAC,eAAe,aAAa;AAAA,IACxC,WAAW,CAAC,OAAO,KAAK;AAAA,IACxB,WAAW,CAAC,eAAe,aAAa;AAAA,IACxC,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,KAAK,CAAC,eAAe,aAAa;AAAA,IAClC,MAAM,CAAC,eAAe,aAAa;AAAA,EACrC;AACF;AAOO,IAAM,sBAAsB,CAAC,gBAAsC;AACxE,SAAO;AAAA,IACL,cAAc;AAAA,EAChB;AACF;AAOO,IAAM,2BAA2B,CAAC,iBAA2C;AAClF,SAAO,aAAa,IAAI,mBAAmB;AAC7C;AASO,IAAM,gBAAgB,OAAO,eAA8B,YAAiD;AACjH,QAAM,OAAO,IAAI,KAAK,OAAO;AAE7B,QAAM,UAAU,IAAI,iBAAiB,QAAQ,UAAU,EAAE,SAAS,EAAE,CAAC;AAErE,QAAM,aAAa,yBAAyB,cAAc,KAAK;AAC/D,QAAM,aAAa,yBAAyB,cAAc,KAAK;AAC/D,QAAM,aAAa,yBAAyB,cAAc,KAAK;AAC/D,QAAM,aAAa,yBAAyB,cAAc,KAAK;AAC/D,QAAM,SAAS,oBAAoB,cAAc,CAAC;AAClD,QAAM,UAAU,oBAAoB,cAAc,EAAE;AACpD,QAAM,UAAU,oBAAoB,cAAc,EAAE;AACpD,QAAM,YAAY,yBAAyB,cAAc,IAAI;AAC7D,QAAM,UAAU,oBAAoB,cAAc,EAAE;AACpD,QAAM,YAAY,yBAAyB,cAAc,IAAI;AAC7D,QAAM,YAAY,yBAAyB,cAAc,IAAI;AAC7D,QAAM,YAAY,yBAAyB,cAAc,IAAI;AAC7D,QAAM,YAAY,yBAAyB,cAAc,IAAI;AAE7D,QAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,QAAQ;AAAA,IACrC,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,CAAC;AAED,SAAO,MAAM,QAAQ,cAAc,SAAS,EAAE,UAAU,KAAK,CAAC;AAChE;;;ALxHO,IAAM,aAAN,MAAM,YAAW;AAAA;AAAA,EAetB,YAAoB,QAAmB;AAAnB;AAClB,QAAI,CAAC,OAAO,cAAc;AACxB,YAAM,IAAI,SAAS,6BAA6B,uBAAuB;AAAA,IACzE;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,OAAO,GAAG;AAC7C,YAAM,IAAI,SAAS,oCAAoC,iBAAiB;AAAA,IAC1E;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,kBAAkB,GAAG;AACxD,YAAM,IAAI,SAAS,+CAA+C,iBAAiB;AAAA,IACrF;AAEA,QAAI,CAAC,eAAe,OAAO,UAAU,QAAQ,GAAG;AAC9C,YAAM,IAAI,SAAS,qCAAqC,iBAAiB;AAAA,IAC3E;AAEA,QAAI,CAAC,OAAO,8BAA8B;AACxC,YAAM,IAAI,SAAS,oDAAoD,0CAA0C;AAAA,IACnH;AAEA,QAAI,CAAC,OAAO,OAAO,6BAA6B,EAAE,SAAS,OAAO,4BAA4B,GAAG;AAC/F,YAAM,IAAI;AAAA,QACR,iDAAiD,OAAO,4BAA4B;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAEA,SAAK,+BAA+B,OAAO;AAC3C,SAAK,gBAAgB,IAAI,cAAc,OAAO,YAAY;AAC1D,SAAK,iBAAiB,IAAI,eAAe,OAAO,cAAc,OAAO,cAAc,OAAO,SAAS;AACnG,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA,EA9CA,OAAuB,SAAS;AAAA,IAC9B,GAAG;AAAA,IACH,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EAEQ;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCR,MAAa,aAA4B;AACvC,QAAI,KAAK,YAAa;AAEtB,QAAI;AACF,YAAM,KAAK,eAAe,WAAW;AACrC,WAAK,cAAc;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,IAAI,SAAS,6BAA6B,KAAK,IAAI,2BAA2B;AAAA,IACtF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,kBAAkB,MAAoB;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,2BAA+C;AAC1D,UAAM,eAAe;AACrB,QAAI,SAAS,eAAe,KAAK,4BAA4D;AAC7F,WAAO;AAAA,MACL,QAAQ,OAAO,OAAO,MAAM;AAAA;AAAA,MAC5B,kBAAkB,OAAO;AAAA,MACzB,QAAQ,OAAO;AAAA,MACf,gBAAgB,OAAO;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAa,2BAA2B,WAA4C;AAClF,UAAM,eAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,WAAO;AAAA,MACL;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,cAAc,MAAc,WAA4C;AACnF,UAAM,eAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,cAAc,MAAsB,WAA4C;AAC3F,UAAM,eAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,0BAA0B,MAAc,WAA+D;AAClH,UAAM,eAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,UAAM,CAAC,eAAe,aAAa,IAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAEA,UAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,yBACX,MACA,WACA,SACqC;AACrC,UAAM,EAAE,cAAc,cAAc,IAAI,MAAM,KAAK,0BAA0B,MAAM,SAAS;AAC5F,UAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,0BAA0B,MAAsB,WAA+D;AAC1H,UAAM,eAAe;AACrB,UAAM,iBAAiB,MAAM,KAAK,yBAAyB;AAE3D,UAAM,CAAC,eAAe,aAAa,IAAI;AAAA,MACrC;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf,eAAe;AAAA,MACf,eAAe,KAAK,eAAe,MAAM;AAAA,IAC3C;AAEA,UAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,yBACX,MACA,WACA,SACqC;AACrC,UAAM,EAAE,cAAc,cAAc,IAAI,MAAM,KAAK,0BAA0B,MAAM,SAAS;AAE5F,UAAM,QAAQ,MAAM,cAAc,cAAc,OAAO;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,gBAAgB,QAA+B;AAC1D,YAAQ,IAAI,uBAAuB;AAEnC,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,gBAAgB,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,UAAU,QASL;AAChB,YAAQ,IAAI,aAAa;AAEzB,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe;AAAA,MACzB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,eAAe,MAAsC;AAChE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,eAAe,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,WAAW,MAAc,UAAkC;AACtE,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,WAAW,MAAM,QAAQ;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,aAAa,MAAc,MAAqB,UAAkC;AAC7F,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,aAAa,MAAM,MAAM,QAAQ;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,wBACX,MACA,kBACA,OACA,UACe;AACf,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,wBAAwB,MAAM,kBAAkB,OAAO,QAAQ;AAAA,EAC5F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAM,MAA2B;AAC5C,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,WAAW;AAAA,IACxB;AAEA,WAAO,KAAK,eAAe,MAAM,IAAI;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKO,eAAwC,WAAc,UAAkC;AAE7F,UAAM,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,SAAS,SAA6B;AAC7F,UAAM,kBAAkB,iBAAiB,KAAK,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU;AAC/F,UAAM,MAAM,iBAAiBC,kBAAiB,MAAMC,oCAAmC;AAEvF,SAAK,KAAK,cAAc,mBAAmB,iBAAiB,WAAW,KAAK,QAAQ;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKO,IAA6B,WAAc,UAAkC;AAClF,SAAK,cAAc,IAAI,WAAW,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKO,KAA8B,MAAS,UAAkC;AAC9E,UAAM,UAA4B,CAAC,UAAU;AAC3C,WAAK,IAAI,MAAM,OAAO;AACtB,YAAM,OAAO,SAAS,KAAK;AAC3B,UAAI,MAAM;AACR,aAAK,MAAM,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,MAClC;AAAA,IACF;AACA,SAAK,eAAe,MAAM,OAAO;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAoB,WAA0B,WAAoB,SAAkC;AAC/G,UAAM,iBAAiB,OAAO,OAAO,gBAAgB,EAAE,SAAS,SAA6B;AAC7F,UAAM,kBAAkB,iBAAiB,KAAK,OAAO,UAAU,UAAU,KAAK,OAAO,UAAU;AAC/F,UAAM,MAAM,iBAAiBD,kBAAiB,MAAMC,oCAAmC;AAEvF,WAAO,KAAK,cAAc,oBAAoB,iBAAiB,WAAW,KAAK,WAAW,OAAO;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,oBAAmC;AAC9C,SAAK,KAAK,cAAc,aAAa;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAyB;AAC9B,SAAK,cAAc,YAAY;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,YACX,cACA,MACA,iBACA,KACA,OACiB;AACjB,WAAO,KAAK,eAAe,YAAY,cAAc,MAAM,iBAAiB,KAAK,KAAK;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAmB,MAA8B;AAC5D,WAAO,KAAK,eAAe,mBAAmB,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,UAAgB;AACrB,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,aAAa,WAAqC;AACvD,QAAI,UAAU,cAAc;AAC1B,WAAK,OAAO,eAAe,UAAU;AACrC,WAAK,gBAAgB,IAAI,cAAc,UAAU,YAAY;AAAA,IAC/D;AAEA,QAAI,UAAU,cAAc;AAC1B,WAAK,OAAO,eAAe,UAAU;AAAA,IACvC;AAEA,QAAI,UAAU,WAAW;AACvB,WAAK,OAAO,YAAY;AAAA,QACtB,GAAG,KAAK,OAAO;AAAA,QACf,GAAG,UAAU;AAAA,MACf;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,WAAK,OAAO,UAAU,UAAU;AAAA,IAClC;AAEA,SAAK,iBAAiB,IAAI,eAAe,KAAK,OAAO,cAAc,KAAK,OAAO,cAAc,KAAK,OAAO,SAAS;AAElH,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,OAAc,OAAO,SAUN;AACb,UAAM,QAAQ,YAAW,OAAO,QAAQ,OAAO;AAE/C,UAAM,cAAc,QAAQ,OAAO,WAAW,OAAO,KAAK,QAAQ,OAAO,WAAW,QAAQ;AAC5F,UAAM,YAAY,cACd,UAAU,QAAQ,QAAQ;AAAA,MACxB,WAAW,EAAE,UAAU,IAAO;AAAA,MAC9B,WAAW,EAAE,UAAU,GAAG,OAAO,IAAM;AAAA,IACzC,CAAC,IACD,KAAK,QAAQ,MAAM;AACvB,UAAM,eAAe,mBAAmB;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,eAAyC;AAC7C,QAAI,QAAQ,YAAY;AACtB,YAAM,UAAU,oBAAoB,QAAQ,UAAU;AACtD,qBAAe,mBAAmB;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,YAAW;AAAA,MACpB;AAAA,MACA;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,QAAQ;AAAA,MACjB,8BAA8B,QAAQ;AAAA,IACxC,CAAC;AAAA,EACH;AACF;","names":["CiphernodeRegistryOwnable__factory","Enclave__factory","EnclaveEventType","RegistryEventType","Enclave__factory","CiphernodeRegistryOwnable__factory"]}
|
|
1
|
+
{"version":3,"sources":["../src/enclave-sdk.ts","../src/contract-client.ts","../src/utils.ts","../src/event-listener.ts","../src/types.ts","../src/greco.ts"],"sourcesContent":["// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Hash, type Log, PublicClient, WalletClient, createPublicClient, createWalletClient, http, webSocket } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { hardhat, mainnet, monadTestnet, sepolia } from 'viem/chains'\nimport initializeWasm from '@enclave-e3/wasm/init'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory } from '@enclave-e3/contracts/types'\nimport { ContractClient } from './contract-client'\nimport { EventListener } from './event-listener'\nimport { EnclaveEventType, ThresholdBfvParamsPresetNames } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nimport type {\n AllEventTypes,\n E3,\n EventCallback,\n SDKConfig,\n BfvParams,\n VerifiableEncryptionResult,\n EncryptedValueAndPublicInputs,\n ThresholdBfvParamsPresetName,\n} from './types'\nimport {\n bfv_encrypt_number,\n bfv_encrypt_vector,\n generate_public_key,\n bfv_verifiable_encrypt_number,\n bfv_verifiable_encrypt_vector,\n compute_pk_commitment,\n get_bfv_params,\n} from '@enclave-e3/wasm'\nimport { generateProof } from './greco'\nimport { CompiledCircuit } from '@noir-lang/noir_js'\n\nexport class EnclaveSDK {\n public static readonly chains = {\n 1: mainnet,\n 11155111: sepolia,\n 41454: monadTestnet,\n 31337: hardhat,\n } as const\n\n private eventListener: EventListener\n private contractClient: ContractClient\n private initialized = false\n private thresholdBfvParamsPresetName?: ThresholdBfvParamsPresetName\n private publicClient: PublicClient\n\n // TODO: use zod for config validation\n constructor(private config: SDKConfig) {\n if (!config.publicClient) {\n throw new SDKError('Public client is required', 'MISSING_PUBLIC_CLIENT')\n }\n\n if (!isValidAddress(config.contracts.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n\n if (!isValidAddress(config.contracts.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n\n if (!config.thresholdBfvParamsPresetName) {\n throw new SDKError('Threshold BFV parameters preset name is required', 'MISSING_THRESHOLD_BFV_PARAMS_PRESET_NAME')\n }\n\n if (!Object.values(ThresholdBfvParamsPresetNames).includes(config.thresholdBfvParamsPresetName)) {\n throw new SDKError(\n `Invalid threshold BFV parameters preset name: ${config.thresholdBfvParamsPresetName}`,\n 'INVALID_THRESHOLD_BFV_PARAMS_PRESET_NAME',\n )\n }\n\n this.thresholdBfvParamsPresetName = config.thresholdBfvParamsPresetName\n this.eventListener = new EventListener(config.publicClient)\n this.contractClient = new ContractClient(config.publicClient, config.walletClient, config.contracts)\n this.publicClient = config.publicClient\n }\n\n /**\n * Initialize the SDK\n */\n // TODO: Delete this it is redundant\n public async initialize(): Promise<void> {\n if (this.initialized) return\n\n try {\n await this.contractClient.initialize()\n this.initialized = true\n } catch (error) {\n throw new SDKError(`Failed to initialize SDK: ${error}`, 'SDK_INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Get the public client used by the SDK\n * @returns The public client\n */\n public getPublicClient = (): PublicClient => {\n return this.publicClient\n }\n\n public async getThresholdBfvParamsSet(): Promise<BfvParams> {\n await initializeWasm()\n let params = get_bfv_params(this.thresholdBfvParamsPresetName as ThresholdBfvParamsPresetName)\n return {\n degree: Number(params.degree), // degree is returned as a bigint from wasm\n plaintextModulus: params.plaintext_modulus as bigint,\n moduli: params.moduli as bigint[],\n error1Variance: params.error1_variance,\n }\n }\n\n public async generatePublicKey(): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n return generate_public_key(protocolParams.degree, protocolParams.plaintextModulus, BigUint64Array.from(protocolParams.moduli))\n }\n\n public async computePublicKeyCommitment(publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return compute_pk_commitment(\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a number using the configured protocol\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted number\n */\n public async encryptNumber(data: bigint, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * Encrypt a vector using the configured protocol\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The ciphertext\n */\n public async encryptVector(data: BigUint64Array, publicKey: Uint8Array): Promise<Uint8Array> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n return bfv_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n }\n\n /**\n * This function encrypts a number using the configured FHE protocol\n * and generates the necessary public inputs for a zk-SNARK proof.\n * @param data The number to encrypt\n * @param publicKey The public key to use for encryption\n * @returns The encrypted number and the inputs for the zk-SNARK proof\n */\n public async encryptNumberAndGenInputs(data: bigint, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_number(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n return {\n encryptedData,\n circuitInputs: JSON.parse(circuitInputs),\n }\n }\n\n /**\n * Encrypt a number using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The number to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted number and the proof\n */\n public async encryptNumberAndGenProof(\n data: bigint,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { circuitInputs: publicInputs, encryptedData } = await this.encryptNumberAndGenInputs(data, publicKey)\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Encrypt a vector and generate inputs for an E3 computation\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @returns The encrypted vector and the inputs for the E3 computation\n */\n public async encryptVectorAndGenInputs(data: BigUint64Array, publicKey: Uint8Array): Promise<EncryptedValueAndPublicInputs> {\n await initializeWasm()\n const protocolParams = await this.getThresholdBfvParamsSet()\n\n const [encryptedData, circuitInputs] = bfv_verifiable_encrypt_vector(\n data,\n publicKey,\n protocolParams.degree,\n protocolParams.plaintextModulus,\n BigUint64Array.from(protocolParams.moduli),\n )\n\n return {\n encryptedData,\n circuitInputs: JSON.parse(circuitInputs),\n }\n }\n\n /**\n * Encrypt a vector using the configured protocol and generate a zk-SNARK proof using Greco\n * @param data - The vector to encrypt\n * @param publicKey - The public key to use for encryption\n * @param circuit - The circuit to use for proof generation\n * @returns The encrypted vector and the proof\n */\n public async encryptVectorAndGenProof(\n data: BigUint64Array,\n publicKey: Uint8Array,\n circuit: CompiledCircuit,\n ): Promise<VerifiableEncryptionResult> {\n const { circuitInputs: publicInputs, encryptedData } = await this.encryptVectorAndGenInputs(data, publicKey)\n\n const proof = await generateProof(publicInputs, circuit)\n\n return {\n encryptedData,\n proof,\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * @param amount - The amount to approve\n * @returns The approval transaction hash\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n console.log('>>> APPROVE FEE TOKEN')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.approveFeeToken(amount)\n }\n\n /**\n * Request a new E3 computation\n */\n public async requestE3(params: {\n threshold: [number, number]\n startWindow: [bigint, bigint]\n duration: bigint\n e3Program: `0x${string}`\n e3ProgramParams: `0x${string}`\n computeProviderParams: `0x${string}`\n customParams?: `0x${string}`\n gasLimit?: bigint\n }): Promise<Hash> {\n console.log('>>> REQUEST')\n\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.requestE3(\n params.threshold,\n params.startWindow,\n params.duration,\n params.e3Program,\n params.e3ProgramParams,\n params.computeProviderParams,\n params.customParams,\n params.gasLimit,\n )\n }\n\n /**\n * Get the public key for an E3 computation\n * @param e3Id - The ID of the E3 computation\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3PublicKey(e3Id)\n }\n\n /**\n * Activate an E3 computation\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.activateE3(e3Id, gasLimit)\n }\n\n /**\n * Publish input for an E3 computation\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishInput(e3Id, data, gasLimit)\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.publishCiphertextOutput(e3Id, ciphertextOutput, proof, gasLimit)\n }\n\n /**\n * Get E3 information\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.initialized) {\n await this.initialize()\n }\n\n return this.contractClient.getE3(e3Id)\n }\n\n /**\n * Unified Event Listening - Listen to any Enclave or Registry event\n */\n public onEnclaveEvent<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n // Determine which contract to listen to based on event type\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n void this.eventListener.watchContractEvent(contractAddress, eventType, abi, callback)\n }\n\n /**\n * Remove event listener\n */\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n this.eventListener.off(eventType, callback)\n }\n\n /**\n * Handle an event only once\n */\n public once<T extends AllEventTypes>(type: T, callback: EventCallback<T>): void {\n const handler: EventCallback<T> = (event) => {\n this.off(type, handler)\n const prom = callback(event)\n if (prom) {\n prom.catch((e) => console.log(e))\n }\n }\n this.onEnclaveEvent(type, handler)\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(eventType: AllEventTypes, fromBlock?: bigint, toBlock?: bigint): Promise<Log[]> {\n const isEnclaveEvent = Object.values(EnclaveEventType).includes(eventType as EnclaveEventType)\n const contractAddress = isEnclaveEvent ? this.config.contracts.enclave : this.config.contracts.ciphernodeRegistry\n const abi = isEnclaveEvent ? Enclave__factory.abi : CiphernodeRegistryOwnable__factory.abi\n\n return this.eventListener.getHistoricalEvents(contractAddress, eventType, abi, fromBlock, toBlock)\n }\n\n /**\n * Start polling for events\n */\n public async startEventPolling(): Promise<void> {\n void this.eventListener.startPolling()\n }\n\n /**\n * Stop polling for events\n */\n public stopEventPolling(): void {\n this.eventListener.stopPolling()\n }\n\n /**\n * Utility methods\n */\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n return this.contractClient.estimateGas(functionName, args, contractAddress, abi, value)\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<unknown> {\n return this.contractClient.waitForTransaction(hash)\n }\n\n /**\n * Clean up resources\n */\n public cleanup(): void {\n this.eventListener.cleanup()\n }\n\n /**\n * Update SDK configuration\n */\n // TODO: We should delete this as we don't want a stateful client.\n public updateConfig(newConfig: Partial<SDKConfig>): void {\n if (newConfig.publicClient) {\n this.config.publicClient = newConfig.publicClient\n this.eventListener = new EventListener(newConfig.publicClient)\n }\n\n if (newConfig.walletClient) {\n this.config.walletClient = newConfig.walletClient\n }\n\n if (newConfig.contracts) {\n this.config.contracts = {\n ...this.config.contracts,\n ...newConfig.contracts,\n }\n }\n\n if (newConfig.chainId) {\n this.config.chainId = newConfig.chainId\n }\n\n this.contractClient = new ContractClient(this.config.publicClient, this.config.walletClient, this.config.contracts)\n\n this.initialized = false\n }\n\n public static create(options: {\n rpcUrl: string\n contracts: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n }\n privateKey?: `0x${string}`\n chainId: keyof typeof EnclaveSDK.chains\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n }): EnclaveSDK {\n const chain = EnclaveSDK.chains[options.chainId]\n\n const isWebSocket = options.rpcUrl.startsWith('ws://') || options.rpcUrl.startsWith('wss://')\n const transport = isWebSocket\n ? webSocket(options.rpcUrl, {\n keepAlive: { interval: 30_000 },\n reconnect: { attempts: 5, delay: 2_000 },\n })\n : http(options.rpcUrl)\n const publicClient = createPublicClient({\n chain,\n transport,\n }) as SDKConfig['publicClient']\n let walletClient: WalletClient | undefined = undefined\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey)\n walletClient = createWalletClient({\n account,\n chain,\n transport,\n })\n }\n\n return new EnclaveSDK({\n publicClient,\n walletClient,\n contracts: options.contracts,\n chainId: options.chainId,\n thresholdBfvParamsPresetName: options.thresholdBfvParamsPresetName,\n })\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { Abi, Hash, PublicClient, TransactionReceipt, WalletClient } from 'viem'\n\nimport { CiphernodeRegistryOwnable__factory, Enclave__factory, EnclaveToken__factory } from '@enclave-e3/contracts/types'\nimport { type E3 } from './types'\nimport { SDKError, isValidAddress } from './utils'\n\nexport class ContractClient {\n private contractInfo: {\n enclave: { address: `0x${string}`; abi: Abi }\n ciphernodeRegistry: { address: `0x${string}`; abi: Abi }\n feeToken: { address: `0x${string}`; abi: Abi }\n } | null = null\n\n constructor(\n private publicClient: PublicClient,\n private walletClient?: WalletClient,\n private addresses: {\n enclave: `0x${string}`\n ciphernodeRegistry: `0x${string}`\n feeToken: `0x${string}`\n } = {\n enclave: '0x0000000000000000000000000000000000000000',\n ciphernodeRegistry: '0x0000000000000000000000000000000000000000',\n feeToken: '0x0000000000000000000000000000000000000000',\n },\n ) {\n if (!isValidAddress(addresses.enclave)) {\n throw new SDKError('Invalid Enclave contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.ciphernodeRegistry)) {\n throw new SDKError('Invalid CiphernodeRegistry contract address', 'INVALID_ADDRESS')\n }\n if (!isValidAddress(addresses.feeToken)) {\n throw new SDKError('Invalid FeeToken contract address', 'INVALID_ADDRESS')\n }\n }\n\n /**\n * Initialize contract instances\n */\n public async initialize(): Promise<void> {\n try {\n this.contractInfo = {\n enclave: {\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n },\n ciphernodeRegistry: {\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n },\n feeToken: {\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n },\n }\n } catch (error) {\n throw new SDKError(`Failed to initialize contracts: ${error}`, 'INITIALIZATION_FAILED')\n }\n }\n\n /**\n * Approve the fee token for the Enclave\n * approve(address spender, uint256 amount)\n */\n public async approveFeeToken(amount: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.feeToken,\n abi: EnclaveToken__factory.abi,\n functionName: 'approve',\n args: [this.addresses.enclave, amount],\n account,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to approve fee token: ${error}`, 'APPROVE_FEE_TOKEN_FAILED')\n }\n }\n\n /**\n * Request a new E3 computation\n * request(address filter, uint32[2] threshold, uint256[2] startWindow, uint256 duration, IE3Program e3Program, bytes e3ProgramParams, bytes computeProviderParams, bytes customParams)\n */\n public async requestE3(\n threshold: [number, number],\n startWindow: [bigint, bigint],\n duration: bigint,\n e3Program: `0x${string}`,\n e3ProgramParams: `0x${string}`,\n computeProviderParams: `0x${string}`,\n customParams?: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'request',\n args: [\n {\n threshold,\n startWindow,\n duration,\n e3Program,\n e3ProgramParams,\n computeProviderParams,\n customParams: customParams || '0x',\n },\n ],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to request E3: ${error}`, 'REQUEST_E3_FAILED')\n }\n }\n\n /**\n * Activate an E3 computation\n * activate(uint256 e3Id)\n */\n public async activateE3(e3Id: bigint, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'activate',\n args: [e3Id],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to activate E3: ${error}`, 'ACTIVATE_E3_FAILED')\n }\n }\n\n /**\n * Publish input for an E3 computation\n * publishInput(uint256 e3Id, bytes memory data)\n */\n public async publishInput(e3Id: bigint, data: `0x${string}`, gasLimit?: bigint): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishInput',\n args: [e3Id, data],\n account,\n gas: gasLimit,\n })\n\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish input: ${error}`, 'PUBLISH_INPUT_FAILED')\n }\n }\n\n /**\n * Publish ciphertext output for an E3 computation\n * publishCiphertextOutput(uint256 e3Id, bytes memory ciphertextOutput, bytes memory proof)\n */\n public async publishCiphertextOutput(\n e3Id: bigint,\n ciphertextOutput: `0x${string}`,\n proof: `0x${string}`,\n gasLimit?: bigint,\n ): Promise<Hash> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for write operations', 'NO_WALLET')\n }\n\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n // Simulate transaction\n const { request } = await this.publicClient.simulateContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'publishCiphertextOutput',\n args: [e3Id, ciphertextOutput, proof],\n account,\n gas: gasLimit,\n })\n\n // Execute transaction\n const hash = await this.walletClient.writeContract(request)\n\n return hash\n } catch (error) {\n throw new SDKError(`Failed to publish ciphertext output: ${error}`, 'PUBLISH_CIPHERTEXT_OUTPUT_FAILED')\n }\n }\n\n /**\n * Get E3 information\n * Based on the contract: getE3(uint256 e3Id) returns (E3 memory e3)\n */\n public async getE3(e3Id: bigint): Promise<E3> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: E3 = await this.publicClient.readContract({\n address: this.addresses.enclave,\n abi: Enclave__factory.abi,\n functionName: 'getE3',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3: ${error}`, 'GET_E3_FAILED')\n }\n }\n\n /**\n * Get the public key for an E3 computation\n * Based on the contract: committeePublicKey(uint256 e3Id) returns (bytes32 publicKeyHash)\n * @param e3Id\n * @returns The public key\n */\n public async getE3PublicKey(e3Id: bigint): Promise<`0x${string}`> {\n if (!this.contractInfo) {\n await this.initialize()\n }\n\n try {\n const result: `0x${string}` = await this.publicClient.readContract({\n address: this.addresses.ciphernodeRegistry,\n abi: CiphernodeRegistryOwnable__factory.abi,\n functionName: 'committeePublicKey',\n args: [e3Id],\n })\n\n return result\n } catch (error) {\n throw new SDKError(`Failed to get E3 public key: ${error}`, 'GET_E3_PUBLIC_KEY_FAILED')\n }\n }\n\n /**\n * Estimate gas for a transaction\n */\n public async estimateGas(\n functionName: string,\n args: readonly unknown[],\n contractAddress: `0x${string}`,\n abi: Abi,\n value?: bigint,\n ): Promise<bigint> {\n if (!this.walletClient) {\n throw new SDKError('Wallet client required for gas estimation', 'NO_WALLET')\n }\n\n try {\n const account = this.walletClient.account\n if (!account) {\n throw new SDKError('No account connected', 'NO_ACCOUNT')\n }\n\n const estimateParams = {\n address: contractAddress,\n abi,\n functionName,\n args,\n account,\n ...(value !== undefined && { value }),\n }\n\n const gas = await this.publicClient.estimateContractGas(estimateParams)\n\n return gas\n } catch (error) {\n throw new SDKError(`Failed to estimate gas: ${error}`, 'GAS_ESTIMATION_FAILED')\n }\n }\n\n /**\n * Wait for transaction confirmation\n */\n public async waitForTransaction(hash: Hash): Promise<TransactionReceipt> {\n try {\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash,\n confirmations: 1,\n })\n\n return receipt\n } catch (error) {\n throw new SDKError(`Failed to wait for transaction: ${error}`, 'TRANSACTION_WAIT_FAILED')\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Address, type Hash, type Log, encodeAbiParameters } from 'viem'\nimport type { BfvParams } from './types'\n\nexport class SDKError extends Error {\n constructor(\n message: string,\n public readonly code?: string,\n ) {\n super(message)\n this.name = 'SDKError'\n }\n}\n\nexport function isValidAddress(address: string): address is Address {\n return /^0x[a-fA-F0-9]{40}$/.test(address)\n}\n\nexport function isValidHash(hash: string): hash is Hash {\n return /^0x[a-fA-F0-9]{64}$/.test(hash)\n}\n\nexport function formatEventName(contractName: string, eventName: string): string {\n return `${contractName}.${eventName}`\n}\n\nexport function parseEventData<T>(log: Log): T {\n return log.data as unknown as T\n}\n\n/**\n * Sleep for a specified number of milliseconds\n */\nexport const sleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport function formatBigInt(value: bigint): string {\n return value.toString()\n}\n\nexport function parseBigInt(value: string): bigint {\n return BigInt(value)\n}\n\nexport function generateEventId(log: Log): string {\n return `${log.blockHash}-${log.logIndex}`\n}\n\n/**\n * Get the current timestamp in seconds\n */\nexport function getCurrentTimestamp(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n// Compute provider parameters structure\nexport interface ComputeProviderParams {\n name: string\n parallel: boolean\n batch_size: number\n}\n\n// Default compute provider configuration\nexport const DEFAULT_COMPUTE_PROVIDER_PARAMS: ComputeProviderParams = {\n name: 'risc0',\n parallel: false,\n batch_size: 2,\n}\n\n// Default E3 configuration\nexport const DEFAULT_E3_CONFIG = {\n threshold_min: 2,\n threshold_max: 5,\n window_size: 120, // 2 minutes in seconds\n duration: 1800, // 30 minutes in seconds\n payment_amount: '0', // 0 ETH in wei\n} as const\n\n/**\n * Encode BFV parameters for the smart contract\n * BFV (Brakerski-Fan-Vercauteren) is a type of fully homomorphic encryption\n */\nexport function encodeBfvParams(params: BfvParams): `0x${string}` {\n const { degree, plaintextModulus, moduli, error1Variance } = params\n\n if (error1Variance === undefined) {\n throw new SDKError(\n 'error1Variance is required in ProtocolParams. All BFV parameter sets must specify error1_variance.',\n 'MISSING_ERROR1_VARIANCE',\n )\n }\n\n return encodeAbiParameters(\n [\n {\n name: 'bfvParams',\n type: 'tuple',\n components: [\n { name: 'degree', type: 'uint256' },\n { name: 'plaintext_modulus', type: 'uint256' },\n { name: 'moduli', type: 'uint256[]' },\n { name: 'error1_variance', type: 'string' },\n ],\n },\n ],\n [\n {\n degree: BigInt(degree),\n plaintext_modulus: BigInt(plaintextModulus),\n moduli: [...moduli],\n error1_variance: error1Variance,\n },\n ],\n )\n}\n\n/**\n * Encode compute provider parameters for the smart contract'\n * If mock is true, the compute provider parameters will return 32 bytes of 0x00\n */\nexport function encodeComputeProviderParams(params: ComputeProviderParams, mock: boolean = false): `0x${string}` {\n if (mock) {\n return `0x${'0'.repeat(32)}` as `0x${string}`\n }\n\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Encode custom parameters for the smart contract.\n */\nexport function encodeCustomParams(params: Record<string, unknown>): `0x${string}` {\n const jsonString = JSON.stringify(params)\n const encoder = new TextEncoder()\n const bytes = encoder.encode(jsonString)\n\n return `0x${Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')}`\n}\n\n/**\n * Calculate start window for E3 request\n */\nexport function calculateStartWindow(windowSize: number = DEFAULT_E3_CONFIG.window_size): [bigint, bigint] {\n const now = getCurrentTimestamp()\n return [BigInt(now), BigInt(now + windowSize)]\n}\n\n/**\n * Decode plaintextOutput bytes to get the actual result number\n */\nexport function decodePlaintextOutput(plaintextOutput: string): number | null {\n try {\n // Remove '0x' prefix if present\n const hex = plaintextOutput.startsWith('0x') ? plaintextOutput.slice(2) : plaintextOutput\n\n // Convert hex to bytes\n const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) || [])\n\n if (bytes.length < 8) {\n console.warn('Plaintext output too short for u64 decoding')\n return null\n }\n\n // Decode first u64 (8 bytes) as little-endian\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n const result = view.getBigUint64(0, true) // true for little-endian\n\n return Number(result)\n } catch (error) {\n console.error('Failed to decode plaintext output:', error)\n return null\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { type Abi, type Log, type PublicClient } from 'viem'\n\nimport {\n type AllEventTypes,\n type EnclaveEvent,\n type EnclaveEventData,\n type EnclaveEventType,\n type EventCallback,\n type EventListenerConfig,\n type RegistryEventData,\n type RegistryEventType,\n type SDKEventEmitter,\n} from './types'\nimport { SDKError, sleep } from './utils'\n\nexport class EventListener implements SDKEventEmitter {\n private listeners: Map<AllEventTypes, Set<EventCallback>> = new Map()\n private activeWatchers: Map<string, () => void> = new Map()\n private isPolling = false\n private lastBlockNumber: bigint = BigInt(0)\n\n constructor(\n private publicClient: PublicClient,\n private config: EventListenerConfig = {},\n ) {}\n\n /**\n * Listen to specific contract events\n */\n public async watchContractEvent<T extends AllEventTypes>(\n address: `0x${string}`,\n eventType: T,\n abi: Abi,\n callback: EventCallback<T>,\n ): Promise<void> {\n const watcherKey = `${address}:${eventType}`\n console.log(`watchContractEvent: ${watcherKey}`)\n\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n console.log('Added callback')\n this.listeners.get(eventType)!.add(callback as EventCallback)\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const emitter = this\n\n // If we don't have an active watcher for this event, create one\n if (!this.activeWatchers.has(watcherKey)) {\n console.log('Adding active watcher for ' + watcherKey)\n\n try {\n const unwatch = this.publicClient.watchContractEvent({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: this.config.fromBlock,\n onLogs(logs: Log[]) {\n for (let i = 0; i < logs.length; i++) {\n const log = logs[i]\n if (!log) {\n console.log('warning: Log was falsy when a log was expected!')\n break\n }\n const event: EnclaveEvent<T> = {\n type: eventType,\n data: (log as unknown as { args: unknown }).args as T extends EnclaveEventType\n ? EnclaveEventData[T]\n : T extends RegistryEventType\n ? RegistryEventData[T]\n : unknown,\n log,\n timestamp: new Date(),\n blockNumber: log.blockNumber ?? BigInt(0),\n transactionHash: log.transactionHash ?? '0x',\n }\n console.log('Created event, now emitting event...')\n emitter.emit(event)\n console.log('Event emitted')\n }\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch contract event ${eventType} on ${address}: ${error}`, 'WATCH_EVENT_FAILED')\n }\n }\n }\n\n /**\n * Listen to all logs from a specific address\n */\n public async watchLogs(address: `0x${string}`, callback: (log: Log) => void): Promise<void> {\n const watcherKey = `logs:${address}`\n\n if (!this.activeWatchers.has(watcherKey)) {\n try {\n const unwatch = this.publicClient.watchEvent({\n address,\n onLogs: (logs: Log[]) => {\n logs.forEach((log: Log) => {\n callback(log)\n })\n },\n })\n\n this.activeWatchers.set(watcherKey, unwatch)\n } catch (error) {\n throw new SDKError(`Failed to watch logs for address ${address}: ${error}`, 'WATCH_LOGS_FAILED')\n }\n }\n }\n\n /**\n * Start polling for historical events\n */\n public async startPolling(): Promise<void> {\n if (this.isPolling) return\n\n this.isPolling = true\n\n try {\n this.lastBlockNumber = await this.publicClient.getBlockNumber()\n\n void this.pollForEvents()\n } catch (error) {\n this.isPolling = false\n throw new SDKError(`Failed to start polling: ${error}`, 'POLLING_START_FAILED')\n }\n }\n\n /**\n * Stop polling for events\n */\n public stopPolling(): void {\n this.isPolling = false\n }\n\n /**\n * Get historical events\n */\n public async getHistoricalEvents(\n address: `0x${string}`,\n eventType: AllEventTypes,\n abi: Abi,\n fromBlock?: bigint,\n toBlock?: bigint,\n ): Promise<Log[]> {\n try {\n const logs = await this.publicClient.getContractEvents({\n address,\n abi,\n eventName: eventType as string,\n fromBlock: fromBlock || this.config.fromBlock,\n toBlock: toBlock || this.config.toBlock,\n })\n\n return logs\n } catch (error) {\n throw new SDKError(`Failed to get historical events: ${error}`, 'HISTORICAL_EVENTS_FAILED')\n }\n }\n\n /**\n * SDKEventEmitter implementation\n */\n public on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n if (!this.listeners.has(eventType)) {\n this.listeners.set(eventType, new Set())\n }\n this.listeners.get(eventType)!.add(callback as EventCallback)\n }\n\n public off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void {\n const callbacks = this.listeners.get(eventType)\n if (callbacks) {\n callbacks.delete(callback as EventCallback)\n if (callbacks.size === 0) {\n this.listeners.delete(eventType)\n // Find and stop corresponding watchers\n const watchersToRemove: string[] = []\n this.activeWatchers.forEach((unwatch, key) => {\n if (key.endsWith(`:${eventType}`)) {\n try {\n unwatch()\n } catch (error) {\n console.error(`Error unwatching event ${eventType}:`, error)\n }\n watchersToRemove.push(key)\n }\n })\n watchersToRemove.forEach((key) => this.activeWatchers.delete(key))\n }\n }\n }\n\n public emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void {\n console.log('emit() called for ' + event.type)\n const callbacks = this.listeners.get(event.type)\n if (callbacks) {\n console.log('Have ' + callbacks.size + ' callbacks')\n callbacks.forEach((callback) => {\n console.log('Running callback...')\n try {\n void (callback as EventCallback<T>)(event)\n } catch (error) {\n console.error(`Error in event callback for ${event.type}:`, error)\n }\n })\n }\n }\n\n /**\n * Clean up all listeners and watchers\n */\n public cleanup(): void {\n this.stopPolling()\n\n // Stop all active watchers\n this.activeWatchers.forEach((unwatch) => {\n try {\n unwatch()\n } catch (error) {\n console.error('Error unwatching during cleanup:', error)\n }\n })\n this.activeWatchers.clear()\n\n // Clear all listeners\n this.listeners.clear()\n }\n\n private async pollForEvents(): Promise<void> {\n while (this.isPolling) {\n try {\n const currentBlock = await this.publicClient.getBlockNumber()\n\n if (currentBlock > this.lastBlockNumber) {\n this.lastBlockNumber = currentBlock\n }\n\n await sleep(this.config.pollingInterval || 5000)\n } catch (error) {\n console.error('Error during polling:', error)\n await sleep(this.config.pollingInterval || 5000)\n }\n }\n }\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport type { Log, PublicClient, WalletClient } from 'viem'\nimport type { ProofData } from '@aztec/bb.js'\nimport type { CiphernodeRegistryOwnable, Enclave, MockCiphernodeRegistry, MockUSDC, EnclaveToken } from '@enclave-e3/contracts/types'\n\nimport type { CircuitInputs } from './greco'\n\n/**\n * SDK configuration\n */\nexport interface SDKConfig {\n /**\n * The public client to use to interact with the blockchain\n */\n publicClient: PublicClient\n\n /**\n * The wallet client to use to send/sign transactions\n */\n walletClient?: WalletClient\n\n /**\n * The Enclave contracts\n */\n contracts: {\n /**\n * The Enclave contract address\n */\n enclave: `0x${string}`\n\n /**\n * The CiphernodeRegistry contract address\n */\n ciphernodeRegistry: `0x${string}`\n\n /**\n * The FeeToken contract address\n */\n feeToken: `0x${string}`\n }\n\n /**\n * The chain ID to which the contracts are deployed\n */\n chainId?: number\n\n /**\n * The threshold BFV parameters preset name to use for the Enclave requests\n */\n thresholdBfvParamsPresetName: ThresholdBfvParamsPresetName\n}\n\nexport interface EventListenerConfig {\n fromBlock?: bigint\n toBlock?: bigint\n polling?: boolean\n pollingInterval?: number\n}\n\nexport interface ContractInstances {\n enclave: Enclave\n ciphernodeRegistry: CiphernodeRegistryOwnable | MockCiphernodeRegistry\n feeToken: EnclaveToken | MockUSDC\n}\n\n// Unified Event System\nexport enum EnclaveEventType {\n // E3 Lifecycle Events\n E3_REQUESTED = 'E3Requested',\n E3_ACTIVATED = 'E3Activated',\n CIPHERTEXT_OUTPUT_PUBLISHED = 'CiphertextOutputPublished',\n PLAINTEXT_OUTPUT_PUBLISHED = 'PlaintextOutputPublished',\n\n // E3 Program Management\n E3_PROGRAM_ENABLED = 'E3ProgramEnabled',\n E3_PROGRAM_DISABLED = 'E3ProgramDisabled',\n\n // Encryption Scheme Management\n ENCRYPTION_SCHEME_ENABLED = 'EncryptionSchemeEnabled',\n ENCRYPTION_SCHEME_DISABLED = 'EncryptionSchemeDisabled',\n\n // Configuration\n CIPHERNODE_REGISTRY_SET = 'CiphernodeRegistrySet',\n MAX_DURATION_SET = 'MaxDurationSet',\n ALLOWED_E3_PROGRAMS_PARAMS_SET = 'AllowedE3ProgramsParamsSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\nexport enum RegistryEventType {\n // Committee Management\n COMMITTEE_REQUESTED = 'CommitteeRequested',\n COMMITTEE_PUBLISHED = 'CommitteePublished',\n COMMITTEE_FINALIZED = 'CommitteeFinalized',\n\n // Configuration\n ENCLAVE_SET = 'EnclaveSet',\n\n // Ownership\n OWNERSHIP_TRANSFERRED = 'OwnershipTransferred',\n INITIALIZED = 'Initialized',\n}\n\n// Union type for all events\nexport type AllEventTypes = EnclaveEventType | RegistryEventType\n\n// Event data interfaces based on TypeChain types\nexport interface E3 {\n seed: bigint\n threshold: readonly [number, number]\n requestBlock: bigint\n startWindow: readonly [bigint, bigint]\n duration: bigint\n expiration: bigint\n encryptionSchemeId: string\n e3Program: string\n e3ProgramParams: string\n decryptionVerifier: string\n committeePublicKey: string\n ciphertextOutput: string\n plaintextOutput: string\n}\n\nexport interface E3RequestedData {\n e3Id: bigint\n e3: E3\n filter: string\n e3Program: string\n}\n\nexport interface E3ActivatedData {\n e3Id: bigint\n expiration: bigint\n committeePublicKey: string\n}\n\nexport interface CiphertextOutputPublishedData {\n e3Id: bigint\n ciphertextOutput: string\n}\n\nexport interface PlaintextOutputPublishedData {\n e3Id: bigint\n plaintextOutput: string\n}\n\nexport interface CiphernodeAddedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CiphernodeRemovedData {\n node: string\n index: bigint\n numNodes: bigint\n size: bigint\n}\n\nexport interface CommitteeRequestedData {\n e3Id: bigint\n seed: bigint\n threshold: [bigint, bigint]\n requestBlock: bigint\n submissionDeadline: bigint\n}\n\nexport interface CommitteePublishedData {\n e3Id: bigint\n publicKey: string\n}\n\nexport interface CommitteeFinalizedData {\n e3Id: bigint\n nodes: string[]\n}\n\n// Event data mapping\nexport interface EnclaveEventData {\n [EnclaveEventType.E3_REQUESTED]: E3RequestedData\n [EnclaveEventType.E3_ACTIVATED]: E3ActivatedData\n [EnclaveEventType.CIPHERTEXT_OUTPUT_PUBLISHED]: CiphertextOutputPublishedData\n [EnclaveEventType.PLAINTEXT_OUTPUT_PUBLISHED]: PlaintextOutputPublishedData\n [EnclaveEventType.E3_PROGRAM_ENABLED]: { e3Program: string }\n [EnclaveEventType.E3_PROGRAM_DISABLED]: { e3Program: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_ENABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.ENCRYPTION_SCHEME_DISABLED]: { encryptionSchemeId: string }\n [EnclaveEventType.CIPHERNODE_REGISTRY_SET]: { ciphernodeRegistry: string }\n [EnclaveEventType.MAX_DURATION_SET]: { maxDuration: bigint }\n [EnclaveEventType.ALLOWED_E3_PROGRAMS_PARAMS_SET]: {\n e3ProgramParams: string[]\n }\n [EnclaveEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [EnclaveEventType.INITIALIZED]: { version: bigint }\n}\n\nexport interface RegistryEventData {\n [RegistryEventType.COMMITTEE_REQUESTED]: CommitteeRequestedData\n [RegistryEventType.COMMITTEE_PUBLISHED]: CommitteePublishedData\n [RegistryEventType.COMMITTEE_FINALIZED]: CommitteeFinalizedData\n [RegistryEventType.ENCLAVE_SET]: { enclave: string }\n [RegistryEventType.OWNERSHIP_TRANSFERRED]: {\n previousOwner: string\n newOwner: string\n }\n [RegistryEventType.INITIALIZED]: { version: bigint }\n}\n\n// Generic event structure\nexport interface EnclaveEvent<T extends AllEventTypes> {\n type: T\n data: T extends EnclaveEventType ? EnclaveEventData[T] : T extends RegistryEventType ? RegistryEventData[T] : unknown\n log: Log\n timestamp: Date\n blockNumber: bigint\n transactionHash: string\n}\n\nexport type EventCallback<T extends AllEventTypes = AllEventTypes> = (event: EnclaveEvent<T>) => void | Promise<void>\n\nexport interface EventFilter<T = unknown> {\n address?: `0x${string}`\n fromBlock?: bigint\n toBlock?: bigint\n args?: Partial<T>\n}\n\nexport interface SDKEventEmitter {\n on<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n off<T extends AllEventTypes>(eventType: T, callback: EventCallback<T>): void\n emit<T extends AllEventTypes>(event: EnclaveEvent<T>): void\n}\n\n/**\n * Result of verifiable encryption using BFV\n */\nexport interface VerifiableEncryptionResult {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n /**\n * The proof generated by Greco\n */\n proof: ProofData\n}\n\n/**\n * BFV parameters for an Enclave program request\n * Example for BFV\n * 512, // degree\n * 10, // plaintext_modulus\n * 0xffffee001, // moduli\n * 0xffffc4001, // moduli\n */\nexport interface BfvParams {\n /**\n * The degree of the polynomial\n */\n degree: number\n /**\n * The plaintext modulus\n */\n plaintextModulus: bigint\n /**\n * The moduli\n */\n moduli: bigint[]\n /**\n * error1\n */\n error1Variance: string | undefined\n}\n\nexport type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192'\n\nexport const ThresholdBfvParamsPresetNames = [\n 'INSECURE_THRESHOLD_512',\n 'SECURE_THRESHOLD_8192',\n] as const satisfies ReadonlyArray<ThresholdBfvParamsPresetName>\n\n/**\n * The result of encrypting a value and generating a proof\n */\nexport interface EncryptedValueAndPublicInputs {\n /**\n * The encrypted data\n */\n encryptedData: Uint8Array\n\n /**\n * The public inputs for the proof\n */\n circuitInputs: CircuitInputs\n}\n","// SPDX-License-Identifier: LGPL-3.0-only\n//\n// This file is provided WITHOUT ANY WARRANTY;\n// without even the implied warranty of MERCHANTABILITY\n// or FITNESS FOR A PARTICULAR PURPOSE.\n\nimport { UltraHonkBackend, type ProofData } from '@aztec/bb.js'\nimport { type CompiledCircuit, Noir } from '@noir-lang/noir_js'\n\n// Conversion to Noir types\nexport type Field = string\n\n/**\n * Describes a polynomial to be used in a Noir circuit (Greco)\n */\nexport type Polynomial = {\n coefficients: Field[]\n}\n\n/**\n * Describes the inputs to Greco circuit\n */\nexport interface CircuitInputs {\n pk0is: string[][]\n pk1is: string[][]\n ct0is: string[][]\n ct1is: string[][]\n u: string[]\n e0: string[]\n e1: string[]\n e0is: string[][]\n e0_quotients: string[][]\n k1: string[]\n r1is: string[][]\n r2is: string[][]\n p1is: string[][]\n p2is: string[][]\n pk_commitment: string\n}\n\n/**\n * Generate a proof for a given circuit and circuit inputs\n * @dev Defaults to the UltraHonkBackend\n * @param circuitInputs - The circuit inputs\n * @param circuit - The circuit\n * @returns The proof\n */\nexport const generateProof = async (circuitInputs: CircuitInputs, circuit: CompiledCircuit): Promise<ProofData> => {\n const noir = new Noir(circuit)\n\n const backend = new UltraHonkBackend(circuit.bytecode, { threads: 4 })\n\n const { witness } = await noir.execute(circuitInputs as any)\n\n return await backend.generateProof(witness, { keccakZK: true })\n}\n"],"mappings":"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","names":["CiphernodeRegistryOwnable__factory","Enclave__factory","EnclaveEventType","RegistryEventType","Enclave__factory","CiphernodeRegistryOwnable__factory"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enclave-e3/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"release": "pnpm publish --access=public"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
|
-
"@enclave-e3/config": "^0.1.
|
|
37
|
+
"@enclave-e3/config": "^0.1.10",
|
|
38
38
|
"concurrently": "^9.1.2",
|
|
39
39
|
"tsup": "^8.5.0",
|
|
40
40
|
"typescript": "5.8.3",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@aztec/bb.js": "3.0.0-nightly.20251104",
|
|
46
46
|
"@noir-lang/noir_js": "1.0.0-beta.15",
|
|
47
|
-
"@enclave-e3/wasm": "^0.1.
|
|
48
|
-
"@enclave-e3/contracts": "^0.1.
|
|
47
|
+
"@enclave-e3/wasm": "^0.1.10",
|
|
48
|
+
"@enclave-e3/contracts": "^0.1.10",
|
|
49
49
|
"comlink": "^4.4.2",
|
|
50
50
|
"viem": "2.30.6",
|
|
51
51
|
"vite-plugin-top-level-await": "^1.5.0",
|