@primuslabs/fhetransform-sdk 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -0
- package/dist/abis/acl.abi.d.ts +379 -0
- package/dist/abis/acl.abi.js +495 -0
- package/dist/abis/acl.abi.js.map +1 -0
- package/dist/abis/alphatrion_reward.abi.d.ts +407 -0
- package/dist/abis/alphatrion_reward.abi.js +532 -0
- package/dist/abis/alphatrion_reward.abi.js.map +1 -0
- package/dist/abis/ciphertext_digests.abi.d.ts +336 -0
- package/dist/abis/ciphertext_digests.abi.js +444 -0
- package/dist/abis/ciphertext_digests.abi.js.map +1 -0
- package/dist/abis/ciphertext_verification.abi.d.ts +637 -0
- package/dist/abis/ciphertext_verification.abi.js +830 -0
- package/dist/abis/ciphertext_verification.abi.js.map +1 -0
- package/dist/abis/convert_token.abi.d.ts +922 -0
- package/dist/abis/convert_token.abi.js +1208 -0
- package/dist/abis/convert_token.abi.js.map +1 -0
- package/dist/abis/decryption.abi.d.ts +956 -0
- package/dist/abis/decryption.abi.js +1244 -0
- package/dist/abis/decryption.abi.js.map +1 -0
- package/dist/abis/erc20.abi.d.ts +265 -0
- package/dist/abis/erc20.abi.js +350 -0
- package/dist/abis/erc20.abi.js.map +1 -0
- package/dist/abis/fhe_executor.abi.d.ts +1535 -0
- package/dist/abis/fhe_executor.abi.js +1962 -0
- package/dist/abis/fhe_executor.abi.js.map +1 -0
- package/dist/abis/space_bridge_config.abi.d.ts +792 -0
- package/dist/abis/space_bridge_config.abi.js +1032 -0
- package/dist/abis/space_bridge_config.abi.js.map +1 -0
- package/dist/abis/token.abi.d.ts +630 -0
- package/dist/abis/token.abi.js +828 -0
- package/dist/abis/token.abi.js.map +1 -0
- package/dist/cli/eusdc.d.ts +2 -0
- package/dist/cli/eusdc.js +41 -0
- package/dist/cli/eusdc.js.map +1 -0
- package/dist/contract/callbacks.d.ts +59 -0
- package/dist/contract/callbacks.js +2 -0
- package/dist/contract/callbacks.js.map +1 -0
- package/dist/contract/convert-token.d.ts +107 -0
- package/dist/contract/convert-token.js +249 -0
- package/dist/contract/convert-token.js.map +1 -0
- package/dist/contract/token.d.ts +167 -0
- package/dist/contract/token.js +404 -0
- package/dist/contract/token.js.map +1 -0
- package/dist/contract/transaction.d.ts +29 -0
- package/dist/contract/transaction.js +2 -0
- package/dist/contract/transaction.js.map +1 -0
- package/dist/core/address.d.ts +118 -0
- package/dist/core/address.js +200 -0
- package/dist/core/address.js.map +1 -0
- package/dist/core/auth.d.ts +68 -0
- package/dist/core/auth.js +58 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/bytes.d.ts +48 -0
- package/dist/core/bytes.js +117 -0
- package/dist/core/bytes.js.map +1 -0
- package/dist/core/cache-manager.d.ts +138 -0
- package/dist/core/cache-manager.js +440 -0
- package/dist/core/cache-manager.js.map +1 -0
- package/dist/core/chain.d.ts +41 -0
- package/dist/core/chain.js +59 -0
- package/dist/core/chain.js.map +1 -0
- package/dist/core/constants.d.ts +24 -0
- package/dist/core/constants.js +25 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/error.d.ts +2 -0
- package/dist/core/error.js +14 -0
- package/dist/core/error.js.map +1 -0
- package/dist/core/errors/error-catalog.d.ts +29 -0
- package/dist/core/errors/error-catalog.js +84 -0
- package/dist/core/errors/error-catalog.js.map +1 -0
- package/dist/core/errors/error-codes.d.ts +52 -0
- package/dist/core/errors/error-codes.js +61 -0
- package/dist/core/errors/error-codes.js.map +1 -0
- package/dist/core/errors/error-utils.d.ts +27 -0
- package/dist/core/errors/error-utils.js +110 -0
- package/dist/core/errors/error-utils.js.map +1 -0
- package/dist/core/errors/fhe-error.d.ts +98 -0
- package/dist/core/errors/fhe-error.js +190 -0
- package/dist/core/errors/fhe-error.js.map +1 -0
- package/dist/core/errors/index.d.ts +4 -0
- package/dist/core/errors/index.js +5 -0
- package/dist/core/errors/index.js.map +1 -0
- package/dist/core/estimate.d.ts +39 -0
- package/dist/core/estimate.js +111 -0
- package/dist/core/estimate.js.map +1 -0
- package/dist/core/event.d.ts +212 -0
- package/dist/core/event.js +42 -0
- package/dist/core/event.js.map +1 -0
- package/dist/core/fhe-type.d.ts +75 -0
- package/dist/core/fhe-type.js +115 -0
- package/dist/core/fhe-type.js.map +1 -0
- package/dist/core/fhe.d.ts +11 -0
- package/dist/core/fhe.js +23 -0
- package/dist/core/fhe.js.map +1 -0
- package/dist/core/handle.d.ts +42 -0
- package/dist/core/handle.js +99 -0
- package/dist/core/handle.js.map +1 -0
- package/dist/core/json-utils.d.ts +18 -0
- package/dist/core/json-utils.js +37 -0
- package/dist/core/json-utils.js.map +1 -0
- package/dist/core/kms.d.ts +42 -0
- package/dist/core/kms.js +70 -0
- package/dist/core/kms.js.map +1 -0
- package/dist/core/logger.d.ts +3 -0
- package/dist/core/logger.js +11 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/pretty-print.d.ts +18 -0
- package/dist/core/pretty-print.js +84 -0
- package/dist/core/pretty-print.js.map +1 -0
- package/dist/core/primitives.d.ts +22 -0
- package/dist/core/primitives.js +2 -0
- package/dist/core/primitives.js.map +1 -0
- package/dist/core/retryable-handler.d.ts +74 -0
- package/dist/core/retryable-handler.js +227 -0
- package/dist/core/retryable-handler.js.map +1 -0
- package/dist/core/signer-address-info.d.ts +15 -0
- package/dist/core/signer-address-info.js +33 -0
- package/dist/core/signer-address-info.js.map +1 -0
- package/dist/core/string.d.ts +28 -0
- package/dist/core/string.js +33 -0
- package/dist/core/string.js.map +1 -0
- package/dist/core/swallow.d.ts +23 -0
- package/dist/core/swallow.js +37 -0
- package/dist/core/swallow.js.map +1 -0
- package/dist/core/system-contract-info.d.ts +17 -0
- package/dist/core/system-contract-info.js +41 -0
- package/dist/core/system-contract-info.js.map +1 -0
- package/dist/core/ttl-cache.d.ts +81 -0
- package/dist/core/ttl-cache.js +113 -0
- package/dist/core/ttl-cache.js.map +1 -0
- package/dist/core/tx-error-parser.d.ts +40 -0
- package/dist/core/tx-error-parser.js +83 -0
- package/dist/core/tx-error-parser.js.map +1 -0
- package/dist/core/utils.d.ts +62 -0
- package/dist/core/utils.js +143 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/index.d.ts +40 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/jazz/encrypt-key-p.d.ts +65 -0
- package/dist/jazz/encrypt-key-p.js +283 -0
- package/dist/jazz/encrypt-key-p.js.map +1 -0
- package/dist/jazz/encrypt-p.d.ts +82 -0
- package/dist/jazz/encrypt-p.js +139 -0
- package/dist/jazz/encrypt-p.js.map +1 -0
- package/dist/jazz/encrypt.d.ts +58 -0
- package/dist/jazz/encrypt.js +155 -0
- package/dist/jazz/encrypt.js.map +1 -0
- package/dist/jazz/input-proof-p.d.ts +122 -0
- package/dist/jazz/input-proof-p.js +265 -0
- package/dist/jazz/input-proof-p.js.map +1 -0
- package/dist/jazz/jazz-client-i.d.ts +16 -0
- package/dist/jazz/jazz-client-i.js +2 -0
- package/dist/jazz/jazz-client-i.js.map +1 -0
- package/dist/jazz/jazz-client.d.ts +18 -0
- package/dist/jazz/jazz-client.js +24 -0
- package/dist/jazz/jazz-client.js.map +1 -0
- package/dist/jazz/key-pair.d.ts +50 -0
- package/dist/jazz/key-pair.js +166 -0
- package/dist/jazz/key-pair.js.map +1 -0
- package/dist/jazz/mock/fake.d.ts +3 -0
- package/dist/jazz/mock/fake.js +23 -0
- package/dist/jazz/mock/fake.js.map +1 -0
- package/dist/jazz/mock/fetch-input-proof.d.ts +4 -0
- package/dist/jazz/mock/fetch-input-proof.js +63 -0
- package/dist/jazz/mock/fetch-input-proof.js.map +1 -0
- package/dist/jazz/mock/fetch-key-url.d.ts +3 -0
- package/dist/jazz/mock/fetch-key-url.js +15 -0
- package/dist/jazz/mock/fetch-key-url.js.map +1 -0
- package/dist/jazz/mock/fetch-public-decrypt.d.ts +3 -0
- package/dist/jazz/mock/fetch-public-decrypt.js +81 -0
- package/dist/jazz/mock/fetch-public-decrypt.js.map +1 -0
- package/dist/jazz/mock/fetch-user-decrypt.d.ts +4 -0
- package/dist/jazz/mock/fetch-user-decrypt.js +174 -0
- package/dist/jazz/mock/fetch-user-decrypt.js.map +1 -0
- package/dist/jazz/module/fetch-input-proof.d.ts +19 -0
- package/dist/jazz/module/fetch-input-proof.js +72 -0
- package/dist/jazz/module/fetch-input-proof.js.map +1 -0
- package/dist/jazz/module/fetch-key-url.d.ts +17 -0
- package/dist/jazz/module/fetch-key-url.js +46 -0
- package/dist/jazz/module/fetch-key-url.js.map +1 -0
- package/dist/jazz/module/fetch-public-decrypt.d.ts +19 -0
- package/dist/jazz/module/fetch-public-decrypt.js +65 -0
- package/dist/jazz/module/fetch-public-decrypt.js.map +1 -0
- package/dist/jazz/module/fetch-user-decrypt.d.ts +19 -0
- package/dist/jazz/module/fetch-user-decrypt.js +109 -0
- package/dist/jazz/module/fetch-user-decrypt.js.map +1 -0
- package/dist/jazz/module/jazz-async-request.d.ts +102 -0
- package/dist/jazz/module/jazz-async-request.js +515 -0
- package/dist/jazz/module/jazz-async-request.js.map +1 -0
- package/dist/jazz/module/jazz-p.d.ts +61 -0
- package/dist/jazz/module/jazz-p.js +33 -0
- package/dist/jazz/module/jazz-p.js.map +1 -0
- package/dist/jazz/module/s3-download.d.ts +85 -0
- package/dist/jazz/module/s3-download.js +293 -0
- package/dist/jazz/module/s3-download.js.map +1 -0
- package/dist/jazz/permit.d.ts +200 -0
- package/dist/jazz/permit.js +319 -0
- package/dist/jazz/permit.js.map +1 -0
- package/dist/jazz/public-decrypt-p.d.ts +96 -0
- package/dist/jazz/public-decrypt-p.js +258 -0
- package/dist/jazz/public-decrypt-p.js.map +1 -0
- package/dist/jazz/public-decrypt.d.ts +48 -0
- package/dist/jazz/public-decrypt.js +156 -0
- package/dist/jazz/public-decrypt.js.map +1 -0
- package/dist/jazz/read-contract.d.ts +81 -0
- package/dist/jazz/read-contract.js +125 -0
- package/dist/jazz/read-contract.js.map +1 -0
- package/dist/jazz/types/common.d.ts +17 -0
- package/dist/jazz/types/common.js +2 -0
- package/dist/jazz/types/common.js.map +1 -0
- package/dist/jazz/types/input-proof.d.ts +76 -0
- package/dist/jazz/types/input-proof.js +2 -0
- package/dist/jazz/types/input-proof.js.map +1 -0
- package/dist/jazz/types/key-url.d.ts +68 -0
- package/dist/jazz/types/key-url.js +5 -0
- package/dist/jazz/types/key-url.js.map +1 -0
- package/dist/jazz/types/public-decrypt.d.ts +61 -0
- package/dist/jazz/types/public-decrypt.js +2 -0
- package/dist/jazz/types/public-decrypt.js.map +1 -0
- package/dist/jazz/types/user-decrypt.d.ts +123 -0
- package/dist/jazz/types/user-decrypt.js +2 -0
- package/dist/jazz/types/user-decrypt.js.map +1 -0
- package/dist/jazz/user-decrypt-p.d.ts +111 -0
- package/dist/jazz/user-decrypt-p.js +280 -0
- package/dist/jazz/user-decrypt-p.js.map +1 -0
- package/dist/jazz/user-decrypt.d.ts +74 -0
- package/dist/jazz/user-decrypt.js +143 -0
- package/dist/jazz/user-decrypt.js.map +1 -0
- package/dist/native/fhe-api.js +5959 -0
- package/dist/native/fhe-api.node.cjs +6167 -0
- package/dist/native/fhe-api.node.worker.cjs +210 -0
- package/dist/native/fhe-api.wasm +0 -0
- package/dist/native/fhe-api.worker.js +164 -0
- package/dist/native/kms/node/kms_lib.d.ts +38 -0
- package/dist/native/kms/node/kms_lib.js +356 -0
- package/dist/native/kms/node/kms_lib_bg.wasm +0 -0
- package/dist/native/kms/node/kms_lib_bg.wasm.d.ts +21 -0
- package/dist/native/kms/node/package.json +11 -0
- package/dist/native/kms/web/kms_lib.d.ts +84 -0
- package/dist/native/kms/web/kms_lib.js +443 -0
- package/dist/native/kms/web/kms_lib_bg.wasm +0 -0
- package/dist/native/kms/web/kms_lib_bg.wasm.d.ts +21 -0
- package/dist/native/kms/web/package.json +15 -0
- package/dist/runtime/browser.d.ts +36 -0
- package/dist/runtime/browser.js +115 -0
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/node.d.ts +30 -0
- package/dist/runtime/node.js +95 -0
- package/dist/runtime/node.js.map +1 -0
- package/dist/sdk/fhetransform-sdk-b.d.ts +102 -0
- package/dist/sdk/fhetransform-sdk-b.js +294 -0
- package/dist/sdk/fhetransform-sdk-b.js.map +1 -0
- package/dist/sdk/fhetransform-sdk.d.ts +87 -0
- package/dist/sdk/fhetransform-sdk.js +135 -0
- package/dist/sdk/fhetransform-sdk.js.map +1 -0
- package/dist/sdk/jazz-service.d.ts +13 -0
- package/dist/sdk/jazz-service.js +58 -0
- package/dist/sdk/jazz-service.js.map +1 -0
- package/dist/sdk/permit-service.d.ts +45 -0
- package/dist/sdk/permit-service.js +144 -0
- package/dist/sdk/permit-service.js.map +1 -0
- package/dist/wasm/fhe-wasm-client.d.ts +19 -0
- package/dist/wasm/fhe-wasm-client.js +23 -0
- package/dist/wasm/fhe-wasm-client.js.map +1 -0
- package/dist/wasm/fhe-wasm-module.d.ts +24 -0
- package/dist/wasm/fhe-wasm-module.js +141 -0
- package/dist/wasm/fhe-wasm-module.js.map +1 -0
- package/dist/wasm/fhe-wasm-type.d.ts +59 -0
- package/dist/wasm/fhe-wasm-type.js +244 -0
- package/dist/wasm/fhe-wasm-type.js.map +1 -0
- package/dist/wasm/wasm-loader.browser.d.ts +21 -0
- package/dist/wasm/wasm-loader.browser.js +143 -0
- package/dist/wasm/wasm-loader.browser.js.map +1 -0
- package/dist/wasm/wasm-loader.node.d.ts +24 -0
- package/dist/wasm/wasm-loader.node.js +114 -0
- package/dist/wasm/wasm-loader.node.js.map +1 -0
- package/dist/wasm/worker-client.browser.d.ts +6 -0
- package/dist/wasm/worker-client.browser.js +21 -0
- package/dist/wasm/worker-client.browser.js.map +1 -0
- package/dist/wasm/worker-client.d.ts +34 -0
- package/dist/wasm/worker-client.js +160 -0
- package/dist/wasm/worker-client.js.map +1 -0
- package/dist/wasm/worker-client.node.d.ts +6 -0
- package/dist/wasm/worker-client.node.js +20 -0
- package/dist/wasm/worker-client.node.js.map +1 -0
- package/dist/wasm/worker-message.d.ts +61 -0
- package/dist/wasm/worker-message.js +2 -0
- package/dist/wasm/worker-message.js.map +1 -0
- package/dist/wasm/worker-transport.browser.d.ts +15 -0
- package/dist/wasm/worker-transport.browser.js +35 -0
- package/dist/wasm/worker-transport.browser.js.map +1 -0
- package/dist/wasm/worker-transport.d.ts +6 -0
- package/dist/wasm/worker-transport.js +2 -0
- package/dist/wasm/worker-transport.js.map +1 -0
- package/dist/wasm/worker-transport.node.d.ts +17 -0
- package/dist/wasm/worker-transport.node.js +39 -0
- package/dist/wasm/worker-transport.node.js.map +1 -0
- package/dist/wasm/worker.d.ts +1 -0
- package/dist/wasm/worker.js +69 -0
- package/dist/wasm/worker.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Token } from '../contract/token.js';
|
|
2
|
+
import { ConvertToken } from '../contract/convert-token.js';
|
|
3
|
+
import { createJazzClient } from '../jazz/jazz-client.js';
|
|
4
|
+
import { logger } from '../core/logger.js';
|
|
5
|
+
import { tokenAbi } from '../abis/token.abi.js';
|
|
6
|
+
import { convertTokenAbi } from '../abis/convert_token.abi.js';
|
|
7
|
+
import { FheTransformSDKBase } from './fhetransform-sdk-b.js';
|
|
8
|
+
import { estimateFheFee } from '../core/estimate.js';
|
|
9
|
+
import { JazzService } from './jazz-service.js';
|
|
10
|
+
import { formatValue } from '../core/pretty-print.js';
|
|
11
|
+
import { PermitService } from './permit-service.js';
|
|
12
|
+
import { getOrFetchPublickey } from '../jazz/encrypt-key-p.js';
|
|
13
|
+
// ============================================
|
|
14
|
+
// FheTransformSDK
|
|
15
|
+
// ============================================
|
|
16
|
+
/**
|
|
17
|
+
* Main SDK class for FHE Transform operations.
|
|
18
|
+
* Provides access to token contracts, encryption, and decryption services.
|
|
19
|
+
*/
|
|
20
|
+
export class FheTransformSDK extends FheTransformSDKBase {
|
|
21
|
+
jazz;
|
|
22
|
+
permitService;
|
|
23
|
+
jazzService;
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new FHE Transform SDK instance.
|
|
26
|
+
* @param config - Configuration options for the SDK.
|
|
27
|
+
*/
|
|
28
|
+
constructor(config) {
|
|
29
|
+
super(config);
|
|
30
|
+
logger.debug('FheTransformSDK constructor');
|
|
31
|
+
this.jazz = createJazzClient(this, {});
|
|
32
|
+
this.permitService = new PermitService(this);
|
|
33
|
+
this.jazzService = new JazzService(this.jazz, this.emitEvent.bind(this));
|
|
34
|
+
}
|
|
35
|
+
async init() {
|
|
36
|
+
void getOrFetchPublickey(this.jazz).catch(console.error);
|
|
37
|
+
// ...
|
|
38
|
+
}
|
|
39
|
+
initSync() {
|
|
40
|
+
}
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Event Emission
|
|
43
|
+
// ============================================================================
|
|
44
|
+
/**
|
|
45
|
+
* Emits a structured SDK event into the unified SDK event stream.
|
|
46
|
+
*
|
|
47
|
+
* Listener exceptions are caught and logged so that a misbehaving subscriber
|
|
48
|
+
* can never corrupt SDK operations.
|
|
49
|
+
*
|
|
50
|
+
* Application code should subscribe via the `onEvent` config option, never
|
|
51
|
+
* call this directly.
|
|
52
|
+
*
|
|
53
|
+
* @param input - The event input data (type, payload, etc.)
|
|
54
|
+
* @param dappAddress - Optional dapp contract address associated with the event
|
|
55
|
+
*
|
|
56
|
+
* @remarks
|
|
57
|
+
* - This method is internal and should not be called directly by application code
|
|
58
|
+
* - Events are enriched with a timestamp before emission
|
|
59
|
+
* - Any errors in the event listener are caught and logged as warnings
|
|
60
|
+
* - The SDK operation continues unaffected even if the listener throws
|
|
61
|
+
*
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
emitEvent(input, dappAddress) {
|
|
65
|
+
try {
|
|
66
|
+
// Enrich the event with timestamp and dapp contract address, then emit
|
|
67
|
+
const event = { ...input, dappAddress, timestamp: Date.now() };
|
|
68
|
+
logger.info(() => ['[FheTransformSDK.emitEvent] Event emitted', formatValue(event)]);
|
|
69
|
+
this.onEvent(event);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// Log the error but don't propagate - listener failures should not break SDK operations
|
|
73
|
+
logger.warn(`[FheTransformSDK.emitEvent] ${input.type} event listener silently failed`, { error });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ============================================
|
|
77
|
+
// Encryption & Decryption
|
|
78
|
+
// ============================================
|
|
79
|
+
/**
|
|
80
|
+
* Encrypts values for use in confidential contracts.
|
|
81
|
+
* @param parameters - Encryption parameters containing payloads to encrypt.
|
|
82
|
+
* @returns Encrypted values matching the input structure.
|
|
83
|
+
*/
|
|
84
|
+
async encrypt(parameters) {
|
|
85
|
+
return this.jazzService.encrypt(parameters);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Decrypts values that have been made publicly decryptable.
|
|
89
|
+
* @param parameters - Public decryption parameters.
|
|
90
|
+
* @returns Decrypted values with proof for verification.
|
|
91
|
+
*/
|
|
92
|
+
async publicDecrypt(parameters) {
|
|
93
|
+
return this.jazzService.publicDecrypt(parameters);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Decrypts values using the user's private key.
|
|
97
|
+
* @param parameters - User decryption parameters.
|
|
98
|
+
* @returns Decrypted values.
|
|
99
|
+
*/
|
|
100
|
+
async userDecrypt(parameters) {
|
|
101
|
+
return this.jazzService.userDecrypt(parameters);
|
|
102
|
+
}
|
|
103
|
+
// ============================================
|
|
104
|
+
// Contract Factory Methods
|
|
105
|
+
// ============================================
|
|
106
|
+
/**
|
|
107
|
+
* Creates a Token instance for interacting with a confidential token contract.
|
|
108
|
+
* @param address - The token contract address.
|
|
109
|
+
* @returns A Token instance.
|
|
110
|
+
*/
|
|
111
|
+
createToken(address) {
|
|
112
|
+
return new Token(this, address, tokenAbi);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Creates a ConvertToken instance for interacting with a token converter contract.
|
|
116
|
+
* Supports shielding (ERC-20 → confidential) and unshielding (confidential → ERC-20).
|
|
117
|
+
* @param address - The converter contract address.
|
|
118
|
+
* @returns A ConvertToken instance.
|
|
119
|
+
*/
|
|
120
|
+
createConvertToken(address) {
|
|
121
|
+
return new ConvertToken(this, address, convertTokenAbi);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Estimates the FHE operation fee for a specific contract function call.
|
|
125
|
+
*
|
|
126
|
+
* @param contractAddress - The address of the target contract
|
|
127
|
+
* @param functionName - The name of the function to estimate fees for
|
|
128
|
+
* @param chainId - The blockchain chain ID
|
|
129
|
+
* @returns A promise resolving to the FHE fee estimate
|
|
130
|
+
*/
|
|
131
|
+
async estimateFheFee(contractAddress, functionName, chainId) {
|
|
132
|
+
return estimateFheFee(contractAddress, functionName, chainId);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=fhetransform-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fhetransform-sdk.js","sourceRoot":"","sources":["../../src/sdk/fhetransform-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FheTransformSDKEmitEventFunc } from "../core/event.js";
|
|
2
|
+
import { EncryptParameters, EncryptPayload, EncryptResult } from '../jazz/encrypt.js';
|
|
3
|
+
import { UserDecryptParameters, UserDecryptPayload, UserDecryptResult } from '../jazz/user-decrypt.js';
|
|
4
|
+
import { PublicDecryptParameters, PublicDecryptPayload, PublicDecryptResult } from '../jazz/public-decrypt.js';
|
|
5
|
+
import type { IJazzClient } from "../jazz/jazz-client-i.js";
|
|
6
|
+
export declare class JazzService {
|
|
7
|
+
private readonly jazz;
|
|
8
|
+
private readonly emitEvent;
|
|
9
|
+
constructor(jazz: IJazzClient, emitEvent: FheTransformSDKEmitEventFunc);
|
|
10
|
+
encrypt<T extends EncryptPayload>(parameters: EncryptParameters<T>): Promise<EncryptResult<T>>;
|
|
11
|
+
publicDecrypt<T extends PublicDecryptPayload>(parameters: PublicDecryptParameters<T>): Promise<PublicDecryptResult<T>>;
|
|
12
|
+
userDecrypt<T extends UserDecryptPayload>(parameters: UserDecryptParameters<T>): Promise<UserDecryptResult<T>>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { FheTransformSDKEvents } from "../core/event.js";
|
|
2
|
+
import { toFheError } from "../core/errors/error-utils.js";
|
|
3
|
+
export class JazzService {
|
|
4
|
+
jazz;
|
|
5
|
+
emitEvent;
|
|
6
|
+
constructor(jazz, emitEvent) {
|
|
7
|
+
this.jazz = jazz;
|
|
8
|
+
this.emitEvent = emitEvent;
|
|
9
|
+
}
|
|
10
|
+
async encrypt(parameters) {
|
|
11
|
+
const t0 = Date.now();
|
|
12
|
+
const dappAddress = parameters.contractAddress;
|
|
13
|
+
try {
|
|
14
|
+
this.emitEvent({ type: FheTransformSDKEvents.EncryptStart }, dappAddress);
|
|
15
|
+
const result = await this.jazz.encryptValue(parameters);
|
|
16
|
+
this.emitEvent({ type: FheTransformSDKEvents.EncryptEnd, durationMs: Date.now() - t0 }, dappAddress);
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
this.emitEvent({ type: FheTransformSDKEvents.EncryptError, error: toFheError(error).getPublicPayload(), durationMs: Date.now() - t0 }, dappAddress);
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async publicDecrypt(parameters) {
|
|
25
|
+
const isArray = Array.isArray(parameters.payloads);
|
|
26
|
+
const encryptedValues = (isArray ? parameters.payloads : [parameters.payloads]);
|
|
27
|
+
const t0 = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptStart, encryptedValues });
|
|
30
|
+
const result = await this.jazz.decryptPublicValue(parameters);
|
|
31
|
+
const plaintexts = (isArray ? result.plaintexts : [result.plaintexts]);
|
|
32
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptEnd, encryptedValues, plaintexts, durationMs: Date.now() - t0 });
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptError, encryptedValues, error: toFheError(error).getPublicPayload(), durationMs: Date.now() - t0 });
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async userDecrypt(parameters) {
|
|
41
|
+
const isArray = Array.isArray(parameters.payloads);
|
|
42
|
+
const items = (isArray ? parameters.payloads : [parameters.payloads]);
|
|
43
|
+
const encryptedValues = items.map(item => item.handle);
|
|
44
|
+
const t0 = Date.now();
|
|
45
|
+
try {
|
|
46
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptStart, encryptedValues });
|
|
47
|
+
const result = await this.jazz.decryptUserValue(parameters);
|
|
48
|
+
const plaintexts = (isArray ? result.plaintexts : [result.plaintexts]);
|
|
49
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptEnd, encryptedValues, plaintexts, durationMs: Date.now() - t0 });
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
this.emitEvent({ type: FheTransformSDKEvents.DecryptError, encryptedValues, error: toFheError(error).getPublicPayload(), durationMs: Date.now() - t0 });
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=jazz-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jazz-service.js","sourceRoot":"","sources":["../../src/sdk/jazz-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { BytesHex } from "../core/primitives.js";
|
|
2
|
+
import { type SignedDecryptionPermit } from "../jazz/permit.js";
|
|
3
|
+
import type { FheTransformSDK } from "../sdk/fhetransform-sdk.js";
|
|
4
|
+
export type GetPermitOption = {
|
|
5
|
+
contractAddresses: readonly BytesHex[];
|
|
6
|
+
chainId?: bigint;
|
|
7
|
+
signerAddress?: BytesHex;
|
|
8
|
+
};
|
|
9
|
+
export type GetPermitResult = {
|
|
10
|
+
exist: boolean;
|
|
11
|
+
permit?: SignedDecryptionPermit;
|
|
12
|
+
isExpired?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Service for managing decryption permits cached by signer and chain ID.
|
|
16
|
+
* Permits are stored in cache and validated against contract address subsets.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PermitService {
|
|
19
|
+
readonly sdk: FheTransformSDK;
|
|
20
|
+
constructor(sdk: FheTransformSDK);
|
|
21
|
+
/**
|
|
22
|
+
* Signs a decryption permit for the specified contract addresses.
|
|
23
|
+
*
|
|
24
|
+
* @param contractAddresses - A read-only array of contract addresses (as BytesHex)
|
|
25
|
+
* for which the decryption permit is being signed.
|
|
26
|
+
* @returns A Promise that resolves to a SignedDecryptionPermit object.
|
|
27
|
+
*/
|
|
28
|
+
signDecryptionPermit(contractAddresses: readonly BytesHex[]): Promise<SignedDecryptionPermit>;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves a cached permit for the given options.
|
|
31
|
+
* @param option - Contract addresses, optional chain ID, and optional signer address
|
|
32
|
+
* @returns The permit if found and valid, otherwise `{ exist: false }`
|
|
33
|
+
*/
|
|
34
|
+
getPermit(option: GetPermitOption): Promise<GetPermitResult>;
|
|
35
|
+
/**
|
|
36
|
+
* Clears all cached permits with key-pairs.
|
|
37
|
+
*/
|
|
38
|
+
clear(): Promise<void>;
|
|
39
|
+
/** Resolves signer address from option or SDK signer. */
|
|
40
|
+
private getSignerAddress;
|
|
41
|
+
/** Resolves chain ID from option or SDK. */
|
|
42
|
+
private getChainId;
|
|
43
|
+
/** Checks if all required addresses are present in the available set. */
|
|
44
|
+
private isContractSubset;
|
|
45
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { SECONDS_PER_DAY } from "../core/constants.js";
|
|
2
|
+
import { JSONWithBigInt } from "../core/json-utils.js";
|
|
3
|
+
import { logger } from "../core/logger.js";
|
|
4
|
+
import { formatValue } from "../core/pretty-print.js";
|
|
5
|
+
import { getOrCreateTKeyPairWithPermit } from "../jazz/permit.js";
|
|
6
|
+
/**
|
|
7
|
+
* Service for managing decryption permits cached by signer and chain ID.
|
|
8
|
+
* Permits are stored in cache and validated against contract address subsets.
|
|
9
|
+
*/
|
|
10
|
+
export class PermitService {
|
|
11
|
+
sdk;
|
|
12
|
+
constructor(sdk) {
|
|
13
|
+
this.sdk = sdk;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Signs a decryption permit for the specified contract addresses.
|
|
17
|
+
*
|
|
18
|
+
* @param contractAddresses - A read-only array of contract addresses (as BytesHex)
|
|
19
|
+
* for which the decryption permit is being signed.
|
|
20
|
+
* @returns A Promise that resolves to a SignedDecryptionPermit object.
|
|
21
|
+
*/
|
|
22
|
+
async signDecryptionPermit(contractAddresses) {
|
|
23
|
+
const result = await getOrCreateTKeyPairWithPermit(this.sdk, contractAddresses);
|
|
24
|
+
return result.permit;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Retrieves a cached permit for the given options.
|
|
28
|
+
* @param option - Contract addresses, optional chain ID, and optional signer address
|
|
29
|
+
* @returns The permit if found and valid, otherwise `{ exist: false }`
|
|
30
|
+
*/
|
|
31
|
+
async getPermit(option) {
|
|
32
|
+
logger.debug('[PermitService.getPermit] Getting permit', { option });
|
|
33
|
+
// Resolve signer and chain ID in parallel
|
|
34
|
+
const [signerAddress, chainId] = await Promise.all([
|
|
35
|
+
this.getSignerAddress(option.signerAddress),
|
|
36
|
+
this.getChainId(option.chainId),
|
|
37
|
+
]);
|
|
38
|
+
// Build cache key: permit:{address}:{chainId}
|
|
39
|
+
const permitKey = `permit:${signerAddress}:${chainId}`;
|
|
40
|
+
logger.debug('[PermitService.getPermit] Cache key built', { permitKey });
|
|
41
|
+
// Check if permit exists in cache
|
|
42
|
+
const permitKeys = await this.sdk.cacheManager.listKeys("permit:");
|
|
43
|
+
const exists = permitKeys.includes(permitKey);
|
|
44
|
+
if (!exists) {
|
|
45
|
+
logger.debug('[PermitService.getPermit] Permit not found in cache', { permitKey });
|
|
46
|
+
return { exist: false };
|
|
47
|
+
}
|
|
48
|
+
logger.debug('[PermitService.getPermit] Permit found in cache, loading...', { permitKey });
|
|
49
|
+
// Load and parse cached permit
|
|
50
|
+
const data = await this.sdk.cacheManager.loadString(permitKey);
|
|
51
|
+
logger.debug('[PermitService.getPermit] Cache load result', {
|
|
52
|
+
hasData: !!data,
|
|
53
|
+
dataLength: data?.length,
|
|
54
|
+
});
|
|
55
|
+
if (!data) {
|
|
56
|
+
logger.warn('[PermitService.getPermit] Cache entry exists but data is empty', { permitKey });
|
|
57
|
+
return { exist: false };
|
|
58
|
+
}
|
|
59
|
+
let permit;
|
|
60
|
+
let isExpired;
|
|
61
|
+
try {
|
|
62
|
+
permit = JSONWithBigInt.parse(data);
|
|
63
|
+
logger.debug(() => ['[PermitService.getPermit] Permit parsed successfully', { message: formatValue(permit.eip712.message) }]);
|
|
64
|
+
// Validate that all requested contract addresses are covered by the permit
|
|
65
|
+
const isValid = this.isContractSubset(option.contractAddresses, permit.eip712.message.contractAddresses);
|
|
66
|
+
if (!isValid) {
|
|
67
|
+
return { exist: false };
|
|
68
|
+
}
|
|
69
|
+
const old = permit.eip712.message;
|
|
70
|
+
isExpired = Math.floor(Date.now() / 1000) >=
|
|
71
|
+
Number(old.startTimestamp) + Number(old.durationDays) * SECONDS_PER_DAY;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// Corrupted or structurally invalid cache entries are treated as a miss.
|
|
75
|
+
logger.warn('[PermitService.getPermit] Failed to parse cached permit', {
|
|
76
|
+
permitKey,
|
|
77
|
+
error: error instanceof Error ? error.message : String(error),
|
|
78
|
+
});
|
|
79
|
+
return { exist: false };
|
|
80
|
+
}
|
|
81
|
+
logger.debug('[PermitService.getPermit] Permit retrieved successfully');
|
|
82
|
+
return { exist: true, permit, isExpired };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Clears all cached permits with key-pairs.
|
|
86
|
+
*/
|
|
87
|
+
async clear() {
|
|
88
|
+
logger.debug('[PermitService.clear] Clearing all cached keypairs and permits');
|
|
89
|
+
await Promise.all([
|
|
90
|
+
this.sdk.cacheManager.clear("keypair:"),
|
|
91
|
+
this.sdk.cacheManager.clear("permit:"),
|
|
92
|
+
]);
|
|
93
|
+
logger.debug('[PermitService.clear] Cache cleared successfully');
|
|
94
|
+
}
|
|
95
|
+
// ============= Private Helpers =============
|
|
96
|
+
/** Resolves signer address from option or SDK signer. */
|
|
97
|
+
async getSignerAddress(signerAddress) {
|
|
98
|
+
if (signerAddress) {
|
|
99
|
+
logger.trace('[PermitService.getSignerAddress] Using provided signer address', {
|
|
100
|
+
address: signerAddress
|
|
101
|
+
});
|
|
102
|
+
return signerAddress;
|
|
103
|
+
}
|
|
104
|
+
logger.trace('[PermitService.getSignerAddress] Resolving signer from SDK');
|
|
105
|
+
const signer = await this.sdk.requireSigner();
|
|
106
|
+
const address = await signer.getAddress();
|
|
107
|
+
logger.trace('[PermitService.getSignerAddress] Signer resolved', { address });
|
|
108
|
+
return address;
|
|
109
|
+
}
|
|
110
|
+
/** Resolves chain ID from option or SDK. */
|
|
111
|
+
async getChainId(chainId) {
|
|
112
|
+
if (chainId !== undefined) {
|
|
113
|
+
logger.trace('[PermitService.getChainId] Using provided chain ID', {
|
|
114
|
+
chainId: chainId.toString()
|
|
115
|
+
});
|
|
116
|
+
return chainId;
|
|
117
|
+
}
|
|
118
|
+
logger.trace('[PermitService.getChainId] Resolving chain ID from SDK');
|
|
119
|
+
const resolved = await this.sdk.getChainID();
|
|
120
|
+
logger.trace('[PermitService.getChainId] Chain ID resolved', {
|
|
121
|
+
chainId: resolved.toString()
|
|
122
|
+
});
|
|
123
|
+
return resolved;
|
|
124
|
+
}
|
|
125
|
+
/** Checks if all required addresses are present in the available set. */
|
|
126
|
+
isContractSubset(required, available) {
|
|
127
|
+
// Empty required set is vacuously true
|
|
128
|
+
if (required.length === 0) {
|
|
129
|
+
logger.trace('[PermitService.isContractSubset] Empty required set, returning true');
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
// Use Set for O(1) lookups instead of O(n) array.includes()
|
|
133
|
+
const availableSet = new Set(available);
|
|
134
|
+
const missing = required.filter(addr => !availableSet.has(addr));
|
|
135
|
+
if (missing.length > 0) {
|
|
136
|
+
logger.trace('[PermitService.isContractSubset] Missing addresses', {
|
|
137
|
+
missing: missing.length,
|
|
138
|
+
firstMissing: missing[0],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return missing.length === 0;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=permit-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit-service.js","sourceRoot":"","sources":["../../src/sdk/permit-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { WasmWorkerClient } from "./worker-client.js";
|
|
2
|
+
export interface EncryptWithZkProofInputU8 {
|
|
3
|
+
pk: Uint8Array;
|
|
4
|
+
crs: Uint8Array;
|
|
5
|
+
input: Uint8Array;
|
|
6
|
+
metadata: Uint8Array;
|
|
7
|
+
refresh: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface FheWasmClient {
|
|
10
|
+
encryptIntegerWithZkProof(args: EncryptWithZkProofInputU8): Promise<Uint8Array>;
|
|
11
|
+
}
|
|
12
|
+
export declare class FheWasmClientViaWorker implements FheWasmClient {
|
|
13
|
+
private wasmWorkerClient;
|
|
14
|
+
constructor(wasmWorkerClient: WasmWorkerClient);
|
|
15
|
+
encryptIntegerWithZkProof(args: EncryptWithZkProofInputU8): Promise<Uint8Array>;
|
|
16
|
+
}
|
|
17
|
+
export declare class FheWasmClientDirect implements FheWasmClient {
|
|
18
|
+
encryptIntegerWithZkProof(args: EncryptWithZkProofInputU8): Promise<Uint8Array>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { encryptIntegerWithZkProof } from "./fhe-wasm-module.js";
|
|
2
|
+
export class FheWasmClientViaWorker {
|
|
3
|
+
wasmWorkerClient;
|
|
4
|
+
constructor(wasmWorkerClient) {
|
|
5
|
+
this.wasmWorkerClient = wasmWorkerClient;
|
|
6
|
+
}
|
|
7
|
+
encryptIntegerWithZkProof(args) {
|
|
8
|
+
return this.wasmWorkerClient.encryptIntegerWithZkProof(args);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class FheWasmClientDirect {
|
|
12
|
+
async encryptIntegerWithZkProof(args) {
|
|
13
|
+
const res = await encryptIntegerWithZkProof({
|
|
14
|
+
pk: args.pk.buffer,
|
|
15
|
+
crs: args.crs.buffer,
|
|
16
|
+
input: args.input.buffer,
|
|
17
|
+
metadata: args.metadata.buffer,
|
|
18
|
+
refresh: args.refresh
|
|
19
|
+
});
|
|
20
|
+
return new Uint8Array(res.result.buffer);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=fhe-wasm-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fhe-wasm-client.js","sourceRoot":"","sources":["../../src/wasm/fhe-wasm-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAejE,MAAM,OAAO,sBAAsB;IACb;IAApB,YAAoB,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAI,CAAC;IAC3D,yBAAyB,CAAC,IAA+B;QACvD,OAAO,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AACD,MAAM,OAAO,mBAAmB;IAC9B,KAAK,CAAC,yBAAyB,CAAC,IAA+B;QAC7D,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC;YAC1C,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,MAAqB;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAqB;YACnC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAqB;YACvC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAqB;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;QACH,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { FheWasm } from './fhe-wasm-type.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load and initialize the FHE WASM module (singleton)
|
|
4
|
+
*/
|
|
5
|
+
export declare function loadFheWasmModule(): Promise<FheWasm>;
|
|
6
|
+
export interface EncryptWithZkProofInput {
|
|
7
|
+
pk: ArrayBuffer;
|
|
8
|
+
crs: ArrayBuffer;
|
|
9
|
+
input: ArrayBuffer;
|
|
10
|
+
metadata: ArrayBuffer;
|
|
11
|
+
refresh: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface EncryptWithZkProofResult {
|
|
14
|
+
result: Uint8Array;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Encrypt integer array with zero-knowledge proof
|
|
18
|
+
* Manages key lifecycle with optional refresh
|
|
19
|
+
*/
|
|
20
|
+
export declare function encryptIntegerWithZkProof(data: EncryptWithZkProofInput): Promise<EncryptWithZkProofResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Clean up WASM resources and key
|
|
23
|
+
*/
|
|
24
|
+
export declare function cleanupWasmResources(): void;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { loadWasmModuleInstance } from '#wasm-loader';
|
|
2
|
+
import { logger } from '../core/logger.js';
|
|
3
|
+
import { FheErrorCode } from '../core/errors/error-codes.js';
|
|
4
|
+
import { FheError } from '../core/errors/fhe-error.js';
|
|
5
|
+
import { FheWasm } from './fhe-wasm-type.js';
|
|
6
|
+
let wasmModule = null;
|
|
7
|
+
let isInitialized = false;
|
|
8
|
+
let initPromise = null;
|
|
9
|
+
let fheKeyWithZk = null;
|
|
10
|
+
/**
|
|
11
|
+
* Load and initialize the FHE WASM module (singleton)
|
|
12
|
+
*/
|
|
13
|
+
export async function loadFheWasmModule() {
|
|
14
|
+
if (isInitialized && wasmModule) {
|
|
15
|
+
logger.debug('WASM module already loaded, returning cached instance');
|
|
16
|
+
return wasmModule;
|
|
17
|
+
}
|
|
18
|
+
if (initPromise) {
|
|
19
|
+
logger.debug('WASM module loading in progress, waiting...');
|
|
20
|
+
return initPromise;
|
|
21
|
+
}
|
|
22
|
+
initPromise = (async () => {
|
|
23
|
+
try {
|
|
24
|
+
logger.info('Loading FHE WASM module...');
|
|
25
|
+
const instance = await loadWasmModuleInstance();
|
|
26
|
+
wasmModule = new FheWasm(instance);
|
|
27
|
+
isInitialized = true;
|
|
28
|
+
logger.info('FHE WASM module initialized successfully');
|
|
29
|
+
return wasmModule;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
initPromise = null;
|
|
33
|
+
logger.error('FHE WASM module initialization failed', { error: err });
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
})();
|
|
37
|
+
return initPromise;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Ensure WASM module is loaded and ready
|
|
41
|
+
*/
|
|
42
|
+
async function ensureWasm() {
|
|
43
|
+
try {
|
|
44
|
+
await loadFheWasmModule();
|
|
45
|
+
if (!wasmModule) {
|
|
46
|
+
throw new FheError({ code: FheErrorCode.WasmNotInitialized, message: 'WASM module not loaded after initialization' });
|
|
47
|
+
}
|
|
48
|
+
logger.debug('WASM module ready');
|
|
49
|
+
return wasmModule;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error('Failed to ensure WASM module', { error });
|
|
53
|
+
throw new FheError({
|
|
54
|
+
code: FheErrorCode.WasmNotInitialized,
|
|
55
|
+
message: `WASM ensure failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
56
|
+
cause: error,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Encrypt integer array with zero-knowledge proof
|
|
62
|
+
* Manages key lifecycle with optional refresh
|
|
63
|
+
*/
|
|
64
|
+
export async function encryptIntegerWithZkProof(data) {
|
|
65
|
+
try {
|
|
66
|
+
logger.debug('Starting encryption with ZK proof', {
|
|
67
|
+
inputSize: data.input.byteLength,
|
|
68
|
+
pkSize: data.pk.byteLength,
|
|
69
|
+
crsSize: data.crs.byteLength,
|
|
70
|
+
metadataSize: data.metadata.byteLength,
|
|
71
|
+
refresh: data.refresh,
|
|
72
|
+
});
|
|
73
|
+
const wasmModule = await ensureWasm();
|
|
74
|
+
const { input, pk, crs, metadata, refresh } = data;
|
|
75
|
+
// Handle key refresh if requested
|
|
76
|
+
if (fheKeyWithZk !== null && refresh) {
|
|
77
|
+
logger.debug('Refreshing FHE key with ZK');
|
|
78
|
+
wasmModule.freeKey(fheKeyWithZk);
|
|
79
|
+
fheKeyWithZk = null;
|
|
80
|
+
}
|
|
81
|
+
// Create new key if needed
|
|
82
|
+
if (fheKeyWithZk === null) {
|
|
83
|
+
logger.debug('Creating new FHE key with ZK');
|
|
84
|
+
try {
|
|
85
|
+
fheKeyWithZk = wasmModule.createKeyWithZk(new Uint8Array(pk), new Uint8Array(crs));
|
|
86
|
+
logger.debug('FHE key with ZK created successfully');
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger.error('Failed to create FHE key with ZK', { error });
|
|
90
|
+
throw new FheError({
|
|
91
|
+
code: FheErrorCode.EncryptionFailed,
|
|
92
|
+
message: `Key creation failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
93
|
+
cause: error,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (fheKeyWithZk === null) {
|
|
98
|
+
throw new FheError({ code: FheErrorCode.EncryptionFailed, message: 'FHE key with ZK is null after creation attempt' });
|
|
99
|
+
}
|
|
100
|
+
// Encrypt data
|
|
101
|
+
try {
|
|
102
|
+
const result = wasmModule.encryptMultiWithZk(fheKeyWithZk, new Uint8Array(input), new Uint8Array(metadata));
|
|
103
|
+
logger.debug('Encryption with ZK proof completed', {
|
|
104
|
+
resultSize: result.length,
|
|
105
|
+
});
|
|
106
|
+
return { result };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
logger.error('Failed to encrypt with ZK proof', { error });
|
|
110
|
+
throw new FheError({
|
|
111
|
+
code: FheErrorCode.EncryptionFailed,
|
|
112
|
+
message: `Encryption failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
113
|
+
cause: error,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
logger.error('encryptIntegerWithZkProof failed', { error });
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clean up WASM resources and key
|
|
124
|
+
*/
|
|
125
|
+
export function cleanupWasmResources() {
|
|
126
|
+
try {
|
|
127
|
+
if (fheKeyWithZk !== null && wasmModule) {
|
|
128
|
+
logger.debug('Cleaning up FHE key with ZK');
|
|
129
|
+
wasmModule.freeKey(fheKeyWithZk);
|
|
130
|
+
fheKeyWithZk = null;
|
|
131
|
+
}
|
|
132
|
+
wasmModule = null;
|
|
133
|
+
isInitialized = false;
|
|
134
|
+
initPromise = null;
|
|
135
|
+
logger.info('WASM resources cleaned up');
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
logger.error('Failed to cleanup WASM resources', { error });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=fhe-wasm-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fhe-wasm-module.js","sourceRoot":"","sources":["../../src/wasm/fhe-wasm-module.ts"],"names":[],"mappings":"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"}
|