@fhevm/sdk 1.1.0-alpha.7 → 1.1.0-alpha.8
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 +5 -5
- package/_cjs/core/_version.js +1 -1
- package/_cjs/core/actions/encrypt/encryptValue.js +2 -1
- package/_cjs/core/actions/encrypt/encryptValue.js.map +1 -1
- package/_cjs/core/actions/encrypt/encryptValues.js +2 -1
- package/_cjs/core/actions/encrypt/encryptValues.js.map +1 -1
- package/_cjs/core/actions/encrypt/generateZkProof.js +2 -1
- package/_cjs/core/actions/encrypt/generateZkProof.js.map +1 -1
- package/_cjs/core/actions/host/readKmsVerifierContractData.js +1 -1
- package/_cjs/core/actions/host/readKmsVerifierContractData.js.map +1 -1
- package/_cjs/core/base/cachedFetch.js +1 -1
- package/_cjs/core/base/cachedFetch.js.map +1 -1
- package/_cjs/core/handle/FheType.js +4 -0
- package/_cjs/core/handle/FheType.js.map +1 -1
- package/_cjs/core/host-contracts/HostContractVersion-p.js +4 -0
- package/_cjs/core/host-contracts/HostContractVersion-p.js.map +1 -1
- package/_cjs/core/host-contracts/KmsSignersContext-p.js +15 -25
- package/_cjs/core/host-contracts/KmsSignersContext-p.js.map +1 -1
- package/_cjs/core/host-contracts/getKmsContextSignersAndThreshold-p.js.map +1 -1
- package/_cjs/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js +7 -6
- package/_cjs/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js.map +1 -1
- package/_cjs/core/host-contracts/readKmsSignersContext-p.js +54 -66
- package/_cjs/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
- package/_cjs/core/kms/KmsSigncryptedShares-p.js +40 -4
- package/_cjs/core/kms/KmsSigncryptedShares-p.js.map +1 -1
- package/_cjs/core/kms/PublicDecryptionProof-p.js +4 -3
- package/_cjs/core/kms/PublicDecryptionProof-p.js.map +1 -1
- package/_cjs/core/kms/SignedDecryptionPermitV1-p.js +1 -14
- package/_cjs/core/kms/SignedDecryptionPermitV1-p.js.map +1 -1
- package/_cjs/core/kms/SignedDecryptionPermitV2-p.js +3 -15
- package/_cjs/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
- package/_cjs/core/kms/createKmsDelegatedUserDecryptEip712V1.js +3 -4
- package/_cjs/core/kms/createKmsDelegatedUserDecryptEip712V1.js.map +1 -1
- package/_cjs/core/kms/createKmsUserDecryptEip712V1.js +6 -5
- package/_cjs/core/kms/createKmsUserDecryptEip712V1.js.map +1 -1
- package/_cjs/core/kms/createKmsUserDecryptEip712V2.js +4 -5
- package/_cjs/core/kms/createKmsUserDecryptEip712V2.js.map +1 -1
- package/_cjs/core/kms/fetchKmsSigncryptedSharesV1-p.js +1 -1
- package/_cjs/core/kms/fetchKmsSigncryptedSharesV1-p.js.map +1 -1
- package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js +1 -1
- package/_cjs/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
- package/_cjs/core/kms/kmsExtraData-p.js +234 -0
- package/_cjs/core/kms/kmsExtraData-p.js.map +1 -0
- package/_cjs/core/kms/publicDecrypt.js +4 -4
- package/_cjs/core/kms/publicDecrypt.js.map +1 -1
- package/_cjs/core/kms/verifyKmsPublicDecryptEip712-p.js +5 -4
- package/_cjs/core/kms/verifyKmsPublicDecryptEip712-p.js.map +1 -1
- package/_cjs/core/modules/decrypt/mock.js +6 -6
- package/_cjs/core/modules/decrypt/mock.js.map +1 -1
- package/_cjs/core/modules/decrypt/module/api-p.js +7 -7
- package/_cjs/core/modules/decrypt/module/api-p.js.map +1 -1
- package/_cjs/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js +53 -3
- package/_cjs/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js.map +1 -1
- package/_cjs/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.js → fetchDelegatedUserDecryptV1.js} +67 -21
- package/_cjs/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.js.map +1 -0
- package/_cjs/core/modules/relayer/cleartext/fetchPublicDecrypt.js +61 -4
- package/_cjs/core/modules/relayer/cleartext/fetchPublicDecrypt.js.map +1 -1
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecrypt.js +9 -108
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecrypt.js.map +1 -1
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV1.js +163 -0
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV1.js.map +1 -0
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV2.js +7 -0
- package/_cjs/core/modules/relayer/cleartext/fetchUserDecryptV2.js.map +1 -0
- package/_cjs/core/modules/relayer/cleartext/forgeFhevmV1.js +83 -0
- package/_cjs/core/modules/relayer/cleartext/forgeFhevmV1.js.map +1 -0
- package/_cjs/core/modules/relayer/cleartext/mock.js +2 -2
- package/_cjs/core/modules/relayer/cleartext/mock.js.map +1 -1
- package/_cjs/core/modules/relayer/cleartext/signers.js +14 -0
- package/_cjs/core/modules/relayer/cleartext/signers.js.map +1 -1
- package/_cjs/ethers/internal/ethereum-ct.js +11 -0
- package/_cjs/ethers/internal/ethereum-ct.js.map +1 -1
- package/_cjs/ethers/internal/runtime-ct.js +9 -7
- package/_cjs/ethers/internal/runtime-ct.js.map +1 -1
- package/_cjs/viem/internal/ethereum-ct.js +8 -0
- package/_cjs/viem/internal/ethereum-ct.js.map +1 -1
- package/_cjs/viem/internal/runtime-ct.js +9 -7
- package/_cjs/viem/internal/runtime-ct.js.map +1 -1
- package/_cjs/wasm/tfhe/loadTfheLib.js.map +1 -1
- package/_cjs/wasm/tkms/loadKmsLib.js.map +1 -1
- package/_esm/core/_version.js +1 -1
- package/_esm/core/actions/encrypt/encryptValue.js +2 -1
- package/_esm/core/actions/encrypt/encryptValue.js.map +1 -1
- package/_esm/core/actions/encrypt/encryptValues.js +2 -1
- package/_esm/core/actions/encrypt/encryptValues.js.map +1 -1
- package/_esm/core/actions/encrypt/generateZkProof.js +2 -1
- package/_esm/core/actions/encrypt/generateZkProof.js.map +1 -1
- package/_esm/core/actions/host/readKmsVerifierContractData.js +2 -2
- package/_esm/core/actions/host/readKmsVerifierContractData.js.map +1 -1
- package/_esm/core/base/cachedFetch.js +1 -1
- package/_esm/core/base/cachedFetch.js.map +1 -1
- package/_esm/core/handle/FheType.js +10 -0
- package/_esm/core/handle/FheType.js.map +1 -1
- package/_esm/core/host-contracts/HostContractVersion-p.js +6 -0
- package/_esm/core/host-contracts/HostContractVersion-p.js.map +1 -1
- package/_esm/core/host-contracts/KmsSignersContext-p.js +16 -25
- package/_esm/core/host-contracts/KmsSignersContext-p.js.map +1 -1
- package/_esm/core/host-contracts/getKmsContextSignersAndThreshold-p.js.map +1 -1
- package/_esm/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js +6 -5
- package/_esm/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.js.map +1 -1
- package/_esm/core/host-contracts/readKmsSignersContext-p.js +132 -68
- package/_esm/core/host-contracts/readKmsSignersContext-p.js.map +1 -1
- package/_esm/core/kms/KmsSigncryptedShares-p.js +70 -4
- package/_esm/core/kms/KmsSigncryptedShares-p.js.map +1 -1
- package/_esm/core/kms/PublicDecryptionProof-p.js +4 -3
- package/_esm/core/kms/PublicDecryptionProof-p.js.map +1 -1
- package/_esm/core/kms/SignedDecryptionPermitV1-p.js +2 -32
- package/_esm/core/kms/SignedDecryptionPermitV1-p.js.map +1 -1
- package/_esm/core/kms/SignedDecryptionPermitV2-p.js +4 -16
- package/_esm/core/kms/SignedDecryptionPermitV2-p.js.map +1 -1
- package/_esm/core/kms/createKmsDelegatedUserDecryptEip712V1.js +3 -4
- package/_esm/core/kms/createKmsDelegatedUserDecryptEip712V1.js.map +1 -1
- package/_esm/core/kms/createKmsUserDecryptEip712V1.js +7 -6
- package/_esm/core/kms/createKmsUserDecryptEip712V1.js.map +1 -1
- package/_esm/core/kms/createKmsUserDecryptEip712V2.js +4 -5
- package/_esm/core/kms/createKmsUserDecryptEip712V2.js.map +1 -1
- package/_esm/core/kms/fetchKmsSigncryptedSharesV1-p.js +26 -2
- package/_esm/core/kms/fetchKmsSigncryptedSharesV1-p.js.map +1 -1
- package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js +2 -2
- package/_esm/core/kms/fetchKmsSigncryptedSharesV2-p.js.map +1 -1
- package/_esm/core/kms/kmsExtraData-p.js +298 -0
- package/_esm/core/kms/kmsExtraData-p.js.map +1 -0
- package/_esm/core/kms/publicDecrypt.js +5 -5
- package/_esm/core/kms/publicDecrypt.js.map +1 -1
- package/_esm/core/kms/verifyKmsPublicDecryptEip712-p.js +5 -4
- package/_esm/core/kms/verifyKmsPublicDecryptEip712-p.js.map +1 -1
- package/_esm/core/modules/decrypt/mock.js +6 -6
- package/_esm/core/modules/decrypt/mock.js.map +1 -1
- package/_esm/core/modules/decrypt/module/api-p.js +7 -7
- package/_esm/core/modules/decrypt/module/api-p.js.map +1 -1
- package/_esm/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js +69 -12
- package/_esm/core/modules/relayer/cleartext/fetchCoprocessorSignatures.js.map +1 -1
- package/_esm/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.js → fetchDelegatedUserDecryptV1.js} +76 -22
- package/_esm/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.js.map +1 -0
- package/_esm/core/modules/relayer/cleartext/fetchPublicDecrypt.js +77 -4
- package/_esm/core/modules/relayer/cleartext/fetchPublicDecrypt.js.map +1 -1
- package/_esm/core/modules/relayer/cleartext/fetchUserDecrypt.js +13 -114
- package/_esm/core/modules/relayer/cleartext/fetchUserDecrypt.js.map +1 -1
- package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV1.js +173 -0
- package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV1.js.map +1 -0
- package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV2.js +6 -0
- package/_esm/core/modules/relayer/cleartext/fetchUserDecryptV2.js.map +1 -0
- package/_esm/core/modules/relayer/cleartext/forgeFhevmV1.js +140 -0
- package/_esm/core/modules/relayer/cleartext/forgeFhevmV1.js.map +1 -0
- package/_esm/core/modules/relayer/cleartext/mock.js +1 -1
- package/_esm/core/modules/relayer/cleartext/mock.js.map +1 -1
- package/_esm/core/modules/relayer/cleartext/signers.js +26 -0
- package/_esm/core/modules/relayer/cleartext/signers.js.map +1 -1
- package/_esm/ethers/internal/ethereum-ct.js +12 -1
- package/_esm/ethers/internal/ethereum-ct.js.map +1 -1
- package/_esm/ethers/internal/runtime-ct.js +9 -7
- package/_esm/ethers/internal/runtime-ct.js.map +1 -1
- package/_esm/viem/internal/ethereum-ct.js +10 -2
- package/_esm/viem/internal/ethereum-ct.js.map +1 -1
- package/_esm/viem/internal/runtime-ct.js +9 -7
- package/_esm/viem/internal/runtime-ct.js.map +1 -1
- package/_types/core/actions/encrypt/encryptValue.d.ts.map +1 -1
- package/_types/core/actions/encrypt/encryptValues.d.ts.map +1 -1
- package/_types/core/actions/encrypt/generateZkProof.d.ts.map +1 -1
- package/_types/core/base/cachedFetch.d.ts.map +1 -1
- package/_types/core/handle/FheType.d.ts +8 -0
- package/_types/core/handle/FheType.d.ts.map +1 -1
- package/_types/core/host-contracts/HostContractVersion-p.d.ts +8 -0
- package/_types/core/host-contracts/HostContractVersion-p.d.ts.map +1 -1
- package/_types/core/host-contracts/KmsSignersContext-p.d.ts +3 -2
- package/_types/core/host-contracts/KmsSignersContext-p.d.ts.map +1 -1
- package/_types/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.d.ts +3 -2
- package/_types/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.d.ts.map +1 -1
- package/_types/core/host-contracts/readKmsSignersContext-p.d.ts +43 -26
- package/_types/core/host-contracts/readKmsSignersContext-p.d.ts.map +1 -1
- package/_types/core/kms/KmsSigncryptedShares-p.d.ts +18 -0
- package/_types/core/kms/KmsSigncryptedShares-p.d.ts.map +1 -1
- package/_types/core/kms/PublicDecryptionProof-p.d.ts.map +1 -1
- package/_types/core/kms/SignedDecryptionPermitV1-p.d.ts.map +1 -1
- package/_types/core/kms/SignedDecryptionPermitV2-p.d.ts.map +1 -1
- package/_types/core/kms/createKmsDelegatedUserDecryptEip712V1.d.ts +2 -1
- package/_types/core/kms/createKmsDelegatedUserDecryptEip712V1.d.ts.map +1 -1
- package/_types/core/kms/createKmsUserDecryptEip712V1.d.ts +2 -1
- package/_types/core/kms/createKmsUserDecryptEip712V1.d.ts.map +1 -1
- package/_types/core/kms/createKmsUserDecryptEip712V2.d.ts +2 -1
- package/_types/core/kms/createKmsUserDecryptEip712V2.d.ts.map +1 -1
- package/_types/core/kms/fetchKmsSigncryptedSharesV1-p.d.ts.map +1 -1
- package/_types/core/kms/kmsExtraData-p.d.ts +66 -0
- package/_types/core/kms/kmsExtraData-p.d.ts.map +1 -0
- package/_types/core/kms/publicDecrypt.d.ts.map +1 -1
- package/_types/core/kms/verifyKmsPublicDecryptEip712-p.d.ts.map +1 -1
- package/_types/core/modules/ethereum/types-ct.d.ts +20 -2
- package/_types/core/modules/ethereum/types-ct.d.ts.map +1 -1
- package/_types/core/modules/relayer/cleartext/fetchCoprocessorSignatures.d.ts.map +1 -1
- package/_types/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.d.ts → fetchDelegatedUserDecryptV1.d.ts} +1 -1
- package/_types/core/modules/relayer/cleartext/fetchDelegatedUserDecryptV1.d.ts.map +1 -0
- package/_types/core/modules/relayer/cleartext/fetchPublicDecrypt.d.ts.map +1 -1
- package/_types/core/modules/relayer/cleartext/fetchUserDecrypt.d.ts +2 -2
- package/_types/core/modules/relayer/cleartext/fetchUserDecrypt.d.ts.map +1 -1
- package/_types/core/modules/relayer/cleartext/fetchUserDecryptV1.d.ts +3 -0
- package/_types/core/modules/relayer/cleartext/fetchUserDecryptV1.d.ts.map +1 -0
- package/_types/core/modules/relayer/cleartext/fetchUserDecryptV2.d.ts +3 -0
- package/_types/core/modules/relayer/cleartext/fetchUserDecryptV2.d.ts.map +1 -0
- package/_types/core/modules/relayer/cleartext/forgeFhevmV1.d.ts +29 -0
- package/_types/core/modules/relayer/cleartext/forgeFhevmV1.d.ts.map +1 -0
- package/_types/core/modules/relayer/cleartext/signers.d.ts +1 -0
- package/_types/core/modules/relayer/cleartext/signers.d.ts.map +1 -1
- package/_types/core/types/kms-p.d.ts +7 -1
- package/_types/core/types/kms-p.d.ts.map +1 -1
- package/_types/ethers/internal/ethereum-ct.d.ts.map +1 -1
- package/_types/ethers/internal/runtime-ct.d.ts.map +1 -1
- package/_types/viem/internal/ethereum-ct.d.ts.map +1 -1
- package/_types/viem/internal/runtime-ct.d.ts.map +1 -1
- package/core/_version.ts +1 -1
- package/core/actions/encrypt/encryptValue.ts +4 -1
- package/core/actions/encrypt/encryptValues.ts +5 -1
- package/core/actions/encrypt/generateZkProof.ts +2 -1
- package/core/actions/host/readKmsVerifierContractData.ts +2 -2
- package/core/base/cachedFetch.ts +1 -1
- package/core/handle/FheType.ts +11 -0
- package/core/host-contracts/HostContractVersion-p.ts +12 -0
- package/core/host-contracts/KmsSignersContext-p.ts +29 -36
- package/core/host-contracts/getKmsContextSignersAndThreshold-p.ts +1 -0
- package/core/host-contracts/getKmsContextSignersAndThresholdFromExtraData-p.ts +10 -7
- package/core/host-contracts/readKmsSignersContext-p.ts +156 -115
- package/core/kms/KmsSigncryptedShares-p.ts +87 -4
- package/core/kms/PublicDecryptionProof-p.ts +6 -4
- package/core/kms/SignedDecryptionPermitV1-p.ts +5 -47
- package/core/kms/SignedDecryptionPermitV2-p.ts +8 -25
- package/core/kms/createKmsDelegatedUserDecryptEip712V1.ts +5 -5
- package/core/kms/createKmsUserDecryptEip712V1.ts +9 -7
- package/core/kms/createKmsUserDecryptEip712V2.ts +6 -6
- package/core/kms/fetchKmsSigncryptedSharesV1-p.ts +27 -15
- package/core/kms/fetchKmsSigncryptedSharesV2-p.ts +2 -2
- package/core/kms/kmsExtraData-p.ts +374 -0
- package/core/kms/publicDecrypt.ts +8 -7
- package/core/kms/verifyKmsPublicDecryptEip712-p.ts +7 -5
- package/core/modules/decrypt/mock.ts +6 -6
- package/core/modules/decrypt/module/api-p.ts +7 -7
- package/core/modules/ethereum/types-ct.ts +25 -2
- package/core/modules/relayer/cleartext/fetchCoprocessorSignatures.ts +98 -15
- package/core/modules/relayer/cleartext/{fetchDelegatedUserDecrypt.ts → fetchDelegatedUserDecryptV1.ts} +115 -27
- package/core/modules/relayer/cleartext/fetchPublicDecrypt.ts +112 -6
- package/core/modules/relayer/cleartext/fetchUserDecrypt.ts +24 -132
- package/core/modules/relayer/cleartext/fetchUserDecryptV1.ts +229 -0
- package/core/modules/relayer/cleartext/fetchUserDecryptV2.ts +11 -0
- package/core/modules/relayer/cleartext/forgeFhevmV1.ts +185 -0
- package/core/modules/relayer/cleartext/mock.ts +1 -1
- package/core/modules/relayer/cleartext/signers.ts +35 -0
- package/core/types/kms-p.ts +16 -1
- package/ethers/internal/ethereum-ct.ts +15 -1
- package/ethers/internal/runtime-ct.ts +9 -7
- package/package.json +1 -1
- package/viem/internal/ethereum-ct.ts +14 -2
- package/viem/internal/runtime-ct.ts +9 -7
- package/_cjs/core/kms/kmsExtraData.js +0 -82
- package/_cjs/core/kms/kmsExtraData.js.map +0 -1
- package/_cjs/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.js.map +0 -1
- package/_esm/core/kms/kmsExtraData.js +0 -99
- package/_esm/core/kms/kmsExtraData.js.map +0 -1
- package/_esm/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.js.map +0 -1
- package/_types/core/kms/kmsExtraData.d.ts +0 -25
- package/_types/core/kms/kmsExtraData.d.ts.map +0 -1
- package/_types/core/modules/relayer/cleartext/fetchDelegatedUserDecrypt.d.ts.map +0 -1
- package/core/kms/kmsExtraData.ts +0 -127
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import type { BytesHex, ChecksummedAddress, Uint32BigInt } from '../../../types/primitives.js';
|
|
2
|
+
import type { FetchUserDecryptResultItem } from '../../../types/relayer.js';
|
|
3
|
+
import type { CleartextEthereumModule } from '../../ethereum/types-ct.js';
|
|
4
|
+
import type { FetchUserDecryptParametersV1, FetchUserDecryptReturnType, RelayerClientWithRuntime } from '../types.js';
|
|
5
|
+
import type { KmsSignersContext } from '../../../types/kmsSignersContext.js';
|
|
6
|
+
import { remove0x } from '../../../base/string.js';
|
|
7
|
+
import { asUint32BigInt, tryParseUintBigIntString, randomUniqueUints } from '../../../base/uint.js';
|
|
8
|
+
import { getTrustedClient } from '../../../runtime/CoreFhevm-p.js';
|
|
9
|
+
import { userDecryptResultToKmsSigncryptedShares } from '../utils.js';
|
|
10
|
+
import { getKmsSignersPrivateKeyMap } from './signers.js';
|
|
11
|
+
import { readCurrentKmsSignersContext } from '../../../host-contracts/readKmsSignersContext-p.js';
|
|
12
|
+
import { isForgeFhevmV1, readPlaintexts, xorMaskWithPublicKey } from './forgeFhevmV1.js';
|
|
13
|
+
|
|
14
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
15
|
+
// runUserDecryptOffChain
|
|
16
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
17
|
+
|
|
18
|
+
async function runUserDecryptOffChain(
|
|
19
|
+
relayerClient: RelayerClientWithRuntime,
|
|
20
|
+
payload: FetchUserDecryptParametersV1['payload'],
|
|
21
|
+
): Promise<{
|
|
22
|
+
readonly commonKmsSigncryptedSharePayload: BytesHex;
|
|
23
|
+
readonly signersAddress: readonly ChecksummedAddress[];
|
|
24
|
+
readonly threshold: Uint32BigInt;
|
|
25
|
+
readonly extraData: BytesHex;
|
|
26
|
+
}> {
|
|
27
|
+
const { kmsDecryptEip712Message } = payload;
|
|
28
|
+
const pairs = payload.handleContractPairs;
|
|
29
|
+
const trustedClient = getTrustedClient(relayerClient);
|
|
30
|
+
|
|
31
|
+
const rawCleartexts = await readPlaintexts(
|
|
32
|
+
relayerClient,
|
|
33
|
+
trustedClient,
|
|
34
|
+
pairs.map((p) => p.handle),
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const currentKmsSignersContext: KmsSignersContext = await readCurrentKmsSignersContext(relayerClient, {
|
|
38
|
+
kmsVerifierAddress: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
|
|
39
|
+
protocolConfigAddress: relayerClient.chain.fhevm.contracts.protocolConfig?.address as
|
|
40
|
+
| ChecksummedAddress
|
|
41
|
+
| undefined,
|
|
42
|
+
});
|
|
43
|
+
const signersAddress = currentKmsSignersContext.signers;
|
|
44
|
+
const threshold = currentKmsSignersContext.threshold;
|
|
45
|
+
|
|
46
|
+
const maskedCleartexts = xorMaskWithPublicKey(kmsDecryptEip712Message.publicKey, rawCleartexts);
|
|
47
|
+
|
|
48
|
+
// extraData: the permit's message.extraData is already asserted equal to the
|
|
49
|
+
// current KmsSignersContext extraData by the caller (fetchKmsSigncryptedSharesV1
|
|
50
|
+
// step 9), so reusing it keeps the shares consistent with that context.
|
|
51
|
+
const extraData = kmsDecryptEip712Message.extraData;
|
|
52
|
+
|
|
53
|
+
const commonKmsSigncryptedSharePayload = relayerClient.runtime.ethereum.encode({
|
|
54
|
+
types: ['uint256[]', 'bytes'],
|
|
55
|
+
values: [maskedCleartexts, extraData],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
signersAddress,
|
|
60
|
+
threshold: BigInt(threshold) as Uint32BigInt,
|
|
61
|
+
commonKmsSigncryptedSharePayload,
|
|
62
|
+
extraData,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
67
|
+
// runUserDecryptOnChain
|
|
68
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
69
|
+
|
|
70
|
+
const userDecryptAbi = [
|
|
71
|
+
{
|
|
72
|
+
type: 'function',
|
|
73
|
+
name: 'userDecrypt',
|
|
74
|
+
inputs: [
|
|
75
|
+
{
|
|
76
|
+
name: 'pairs',
|
|
77
|
+
type: 'tuple[]',
|
|
78
|
+
internalType: 'struct HandleContractPair[]',
|
|
79
|
+
components: [
|
|
80
|
+
{ name: 'handle', type: 'bytes32', internalType: 'bytes32' },
|
|
81
|
+
{
|
|
82
|
+
name: 'contractAddress',
|
|
83
|
+
type: 'address',
|
|
84
|
+
internalType: 'address',
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{ name: 'userAddress', type: 'address', internalType: 'address' },
|
|
89
|
+
{ name: 'publicKey', type: 'bytes', internalType: 'bytes' },
|
|
90
|
+
{
|
|
91
|
+
name: 'contractAddresses',
|
|
92
|
+
type: 'address[]',
|
|
93
|
+
internalType: 'address[]',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'startTimestamp',
|
|
97
|
+
type: 'uint256',
|
|
98
|
+
internalType: 'uint256',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
name: 'durationDays',
|
|
102
|
+
type: 'uint256',
|
|
103
|
+
internalType: 'uint256',
|
|
104
|
+
},
|
|
105
|
+
{ name: 'userSignature', type: 'bytes', internalType: 'bytes' },
|
|
106
|
+
],
|
|
107
|
+
outputs: [
|
|
108
|
+
{ name: 'payload', type: 'bytes', internalType: 'bytes' },
|
|
109
|
+
{ name: 'signers', type: 'address[]', internalType: 'address[]' },
|
|
110
|
+
{ name: 'threshold', type: 'uint256', internalType: 'uint256' },
|
|
111
|
+
{ name: 'extraData', type: 'bytes', internalType: 'bytes' },
|
|
112
|
+
],
|
|
113
|
+
stateMutability: 'view',
|
|
114
|
+
},
|
|
115
|
+
] as const;
|
|
116
|
+
|
|
117
|
+
async function runUserDecryptOnChain(
|
|
118
|
+
relayerClient: RelayerClientWithRuntime,
|
|
119
|
+
payload: FetchUserDecryptParametersV1['payload'],
|
|
120
|
+
): Promise<{
|
|
121
|
+
readonly commonKmsSigncryptedSharePayload: BytesHex;
|
|
122
|
+
readonly signersAddress: readonly ChecksummedAddress[];
|
|
123
|
+
readonly threshold: Uint32BigInt;
|
|
124
|
+
readonly extraData: BytesHex;
|
|
125
|
+
}> {
|
|
126
|
+
const { kmsDecryptEip712Message, kmsDecryptEip712Signer, kmsDecryptEip712Signature } = payload;
|
|
127
|
+
const pairs = payload.handleContractPairs;
|
|
128
|
+
const trustedClient = getTrustedClient(relayerClient);
|
|
129
|
+
const res = (await relayerClient.runtime.ethereum.readContract(trustedClient, {
|
|
130
|
+
abi: userDecryptAbi,
|
|
131
|
+
address: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
|
|
132
|
+
args: [
|
|
133
|
+
pairs.map((p) => ({
|
|
134
|
+
handle: p.handle.bytes32Hex,
|
|
135
|
+
contractAddress: p.contractAddress,
|
|
136
|
+
})),
|
|
137
|
+
kmsDecryptEip712Signer,
|
|
138
|
+
kmsDecryptEip712Message.publicKey,
|
|
139
|
+
kmsDecryptEip712Message.contractAddresses,
|
|
140
|
+
_parseUintBigIntString('kmsDecryptEip712Message.startTimestamp', kmsDecryptEip712Message.startTimestamp),
|
|
141
|
+
_parseUintBigIntString('kmsDecryptEip712Message.durationDays', kmsDecryptEip712Message.durationDays),
|
|
142
|
+
kmsDecryptEip712Signature,
|
|
143
|
+
],
|
|
144
|
+
functionName: userDecryptAbi[0].name,
|
|
145
|
+
})) as unknown[];
|
|
146
|
+
|
|
147
|
+
const commonKmsSigncryptedSharePayload = res[0] as BytesHex;
|
|
148
|
+
const signersAddress = res[1] as readonly ChecksummedAddress[];
|
|
149
|
+
const threshold = asUint32BigInt(res[2]);
|
|
150
|
+
const extraData = res[3] as BytesHex;
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
commonKmsSigncryptedSharePayload,
|
|
154
|
+
signersAddress,
|
|
155
|
+
threshold,
|
|
156
|
+
extraData,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
161
|
+
|
|
162
|
+
export async function fetchUserDecryptV1(
|
|
163
|
+
relayerClient: RelayerClientWithRuntime,
|
|
164
|
+
parameters: FetchUserDecryptParametersV1,
|
|
165
|
+
): Promise<FetchUserDecryptReturnType> {
|
|
166
|
+
const cleartextEthereumModule = relayerClient.runtime.ethereum as CleartextEthereumModule;
|
|
167
|
+
const { payload } = parameters;
|
|
168
|
+
const pairs = payload.handleContractPairs;
|
|
169
|
+
const contractAddresses = payload.kmsDecryptEip712Message.contractAddresses;
|
|
170
|
+
|
|
171
|
+
const authCount = contractAddresses.length;
|
|
172
|
+
for (const { contractAddress: c } of pairs) {
|
|
173
|
+
let authorized: boolean = false;
|
|
174
|
+
for (let i = 0; i < authCount; ++i) {
|
|
175
|
+
if (contractAddresses[i] == c) {
|
|
176
|
+
authorized = true;
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!authorized) {
|
|
181
|
+
throw new Error(`ContractAddressNotAuthorized: ${c} is not in the EIP-712 authorized contractAddresses list.`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const offChain = await isForgeFhevmV1(relayerClient);
|
|
186
|
+
|
|
187
|
+
let res;
|
|
188
|
+
if (offChain) {
|
|
189
|
+
res = await runUserDecryptOffChain(relayerClient, payload);
|
|
190
|
+
} else {
|
|
191
|
+
res = await runUserDecryptOnChain(relayerClient, payload);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const commonKmsSigncryptedSharePayload = res.commonKmsSigncryptedSharePayload;
|
|
195
|
+
const extraData = res.extraData;
|
|
196
|
+
const threshold = res.threshold;
|
|
197
|
+
const signersAddress = res.signersAddress;
|
|
198
|
+
|
|
199
|
+
const signers = getKmsSignersPrivateKeyMap(relayerClient);
|
|
200
|
+
|
|
201
|
+
const randomSignersAddress = randomUniqueUints(signersAddress.length, Number(threshold)).map(
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
203
|
+
(i) => signersAddress[i]!,
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
const result: FetchUserDecryptResultItem[] = [];
|
|
207
|
+
|
|
208
|
+
for (const signerAddress of randomSignersAddress) {
|
|
209
|
+
const privateKey = signers.get(signerAddress);
|
|
210
|
+
if (privateKey === undefined) {
|
|
211
|
+
throw new Error(`Unable to find KMS signer for address ${signerAddress}`);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const signature = await cleartextEthereumModule.sign({ hash: commonKmsSigncryptedSharePayload, privateKey });
|
|
215
|
+
result.push({ signature: remove0x(signature), payload: remove0x(commonKmsSigncryptedSharePayload), extraData });
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return userDecryptResultToKmsSigncryptedShares(result);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
222
|
+
|
|
223
|
+
function _parseUintBigIntString(label: string, value: string): bigint {
|
|
224
|
+
const bn = tryParseUintBigIntString(value);
|
|
225
|
+
if (bn === undefined) {
|
|
226
|
+
throw new Error(`${label} is not a valid uint string, got ${JSON.stringify(value)}`);
|
|
227
|
+
}
|
|
228
|
+
return bn;
|
|
229
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FetchUserDecryptParametersV2, FetchUserDecryptReturnType, RelayerClientWithRuntime } from '../types.js';
|
|
2
|
+
|
|
3
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
4
|
+
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
6
|
+
export async function fetchUserDecryptV2(
|
|
7
|
+
_relayerClient: RelayerClientWithRuntime,
|
|
8
|
+
_parameters: FetchUserDecryptParametersV2,
|
|
9
|
+
): Promise<FetchUserDecryptReturnType> {
|
|
10
|
+
throw new Error('Not yet implemented');
|
|
11
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type { Address, BytesHex, ChecksummedAddress } from '../../../types/primitives.js';
|
|
2
|
+
import type { Handle } from '../../../types/encryptedTypes-p.js';
|
|
3
|
+
import type { CleartextEthereumModule } from '../../ethereum/types-ct.js';
|
|
4
|
+
import type { TrustedClient } from '../../ethereum/types.js';
|
|
5
|
+
import type { RelayerClientWithRuntime } from '../types.js';
|
|
6
|
+
import type { KmsSignersContext } from '../../../types/kmsSignersContext.js';
|
|
7
|
+
import { remove0x } from '../../../base/string.js';
|
|
8
|
+
import { addressToChecksummedAddress } from '../../../base/address.js';
|
|
9
|
+
import { createCachedFetch } from '../../../base/cachedFetch.js';
|
|
10
|
+
import { getFHEVMExecutorAddressAbi } from '../../../host-contracts/abi-fragments/fragments.js';
|
|
11
|
+
import { readCurrentKmsSignersContext } from '../../../host-contracts/readKmsSignersContext-p.js';
|
|
12
|
+
import { isForgeFhevmV1KmsSigner } from './signers.js';
|
|
13
|
+
|
|
14
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
15
|
+
//
|
|
16
|
+
// Option B — cleartext "disabled KMSVerifier" plaintext source.
|
|
17
|
+
//
|
|
18
|
+
// The cleartext mock relayer used to read masked cleartexts + the KMS payload
|
|
19
|
+
// from the `Cleartext*KMSVerifier` view. That view required the full `Cleartext*`
|
|
20
|
+
// host set, which partners deploying only forge-fhevm do not have. Instead we
|
|
21
|
+
// read the raw plaintext straight from `CleartextFHEVMExecutor.plaintexts` (the
|
|
22
|
+
// mapping forge-fhevm populates) and rebuild the KMS wire format off-chain,
|
|
23
|
+
// reusing the already-local KMS signing. Only the *plaintext source* moves;
|
|
24
|
+
// everything downstream (masking, signing, reconstruct) is unchanged.
|
|
25
|
+
//
|
|
26
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
27
|
+
|
|
28
|
+
// CleartextFHEVMExecutor.plaintexts(bytes32) — the handle→cleartext mirror.
|
|
29
|
+
const plaintextsAbi = [
|
|
30
|
+
{
|
|
31
|
+
type: 'function',
|
|
32
|
+
name: 'plaintexts',
|
|
33
|
+
inputs: [{ name: 'handle', type: 'bytes32', internalType: 'bytes32' }],
|
|
34
|
+
outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
|
|
35
|
+
stateMutability: 'view',
|
|
36
|
+
},
|
|
37
|
+
] as const;
|
|
38
|
+
|
|
39
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
40
|
+
|
|
41
|
+
export async function isForgeFhevmV1(relayerClient: RelayerClientWithRuntime): Promise<boolean> {
|
|
42
|
+
const currentKmsSignersContext: KmsSignersContext = await readCurrentKmsSignersContext(relayerClient, {
|
|
43
|
+
kmsVerifierAddress: relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress,
|
|
44
|
+
protocolConfigAddress: relayerClient.chain.fhevm.contracts.protocolConfig?.address as
|
|
45
|
+
| ChecksummedAddress
|
|
46
|
+
| undefined,
|
|
47
|
+
});
|
|
48
|
+
return currentKmsSignersContext.signers.length === 1 && isForgeFhevmV1KmsSigner(currentKmsSignersContext.signers[0]);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
52
|
+
|
|
53
|
+
type ReadCleartextExecutorAddressContext = {
|
|
54
|
+
readonly relayerClient: RelayerClientWithRuntime;
|
|
55
|
+
readonly trustedClient: TrustedClient;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// ACL → FHEVMExecutor is immutable per deployment, so the lookup is cached
|
|
59
|
+
// permanently (no TTL). Keyed by ACL address (lowercase) + chainId so distinct
|
|
60
|
+
// deployments/chains never collide, and concurrent callers share one in-flight read.
|
|
61
|
+
const cachedReadCleartextExecutorAddress = createCachedFetch<
|
|
62
|
+
ReadCleartextExecutorAddressContext,
|
|
63
|
+
Record<string, never>,
|
|
64
|
+
ChecksummedAddress
|
|
65
|
+
>({
|
|
66
|
+
executeFn: async ({ relayerClient, trustedClient }) => {
|
|
67
|
+
const res = await relayerClient.runtime.ethereum.readContract(trustedClient, {
|
|
68
|
+
abi: getFHEVMExecutorAddressAbi,
|
|
69
|
+
address: relayerClient.chain.fhevm.contracts.acl.address as ChecksummedAddress,
|
|
70
|
+
args: [],
|
|
71
|
+
functionName: getFHEVMExecutorAddressAbi[0].name,
|
|
72
|
+
});
|
|
73
|
+
return addressToChecksummedAddress(res as Address);
|
|
74
|
+
},
|
|
75
|
+
cacheKeyFn: ({ relayerClient }) =>
|
|
76
|
+
`${(relayerClient.chain.fhevm.contracts.acl.address as string).toLowerCase()}:${relayerClient.chain.id}`,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
async function readCleartextExecutorAddress(
|
|
80
|
+
relayerClient: RelayerClientWithRuntime,
|
|
81
|
+
trustedClient: TrustedClient,
|
|
82
|
+
): Promise<ChecksummedAddress> {
|
|
83
|
+
return cachedReadCleartextExecutorAddress.execute({ relayerClient, trustedClient }, {});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Reads the cleartext uint256 recorded for each handle from
|
|
88
|
+
* `CleartextFHEVMExecutor.plaintexts`. Authorization (ACL) is enforced by the
|
|
89
|
+
* decrypt caller before the relayer is invoked, matching the on-chain view which
|
|
90
|
+
* gated reads through `CleartextACL`.
|
|
91
|
+
*/
|
|
92
|
+
export async function readPlaintexts(
|
|
93
|
+
relayerClient: RelayerClientWithRuntime,
|
|
94
|
+
trustedClient: TrustedClient,
|
|
95
|
+
handles: readonly Handle[],
|
|
96
|
+
): Promise<bigint[]> {
|
|
97
|
+
const executorAddress = await readCleartextExecutorAddress(relayerClient, trustedClient);
|
|
98
|
+
|
|
99
|
+
const cleartexts: bigint[] = [];
|
|
100
|
+
for (const handle of handles) {
|
|
101
|
+
const res = await relayerClient.runtime.ethereum.readContract(trustedClient, {
|
|
102
|
+
abi: plaintextsAbi,
|
|
103
|
+
address: executorAddress,
|
|
104
|
+
args: [handle.bytes32Hex],
|
|
105
|
+
functionName: plaintextsAbi[0].name,
|
|
106
|
+
});
|
|
107
|
+
cleartexts.push(res as bigint);
|
|
108
|
+
}
|
|
109
|
+
return cleartexts;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// /**
|
|
113
|
+
// * Reads the registered KMS signer set and threshold from the standard KMSVerifier
|
|
114
|
+
// * (which forge-fhevm implements). These replace the `signers` / `threshold` the
|
|
115
|
+
// * `Cleartext*KMSVerifier` view used to return.
|
|
116
|
+
// */
|
|
117
|
+
// export async function readKmsSignersAndThreshold(
|
|
118
|
+
// relayerClient: RelayerClientWithRuntime,
|
|
119
|
+
// trustedClient: TrustedClient,
|
|
120
|
+
// ): Promise<{ signers: readonly ChecksummedAddress[]; threshold: bigint }> {
|
|
121
|
+
// const kmsVerifierAddress = relayerClient.chain.fhevm.contracts.kmsVerifier.address as ChecksummedAddress;
|
|
122
|
+
|
|
123
|
+
// const signersRes = await relayerClient.runtime.ethereum.readContract(trustedClient, {
|
|
124
|
+
// abi: getKmsSignersAbi,
|
|
125
|
+
// address: kmsVerifierAddress,
|
|
126
|
+
// args: [],
|
|
127
|
+
// functionName: getKmsSignersAbi[0].name,
|
|
128
|
+
// });
|
|
129
|
+
|
|
130
|
+
// const thresholdRes = await relayerClient.runtime.ethereum.readContract(trustedClient, {
|
|
131
|
+
// abi: getThresholdAbi,
|
|
132
|
+
// address: kmsVerifierAddress,
|
|
133
|
+
// args: [],
|
|
134
|
+
// functionName: getThresholdAbi[0].name,
|
|
135
|
+
// });
|
|
136
|
+
|
|
137
|
+
// const signers = (signersRes as readonly Address[]).map(addressToChecksummedAddress);
|
|
138
|
+
// return { signers, threshold: asUint32BigInt(thresholdRes) };
|
|
139
|
+
// }
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Reversible mask that replicates `CleartextKMSVerifier._xorMaskWithPublicKey`:
|
|
143
|
+
* XORs each cleartext with the first 32 bytes of the user's public key. The
|
|
144
|
+
* client reverses it in `decrypt/mock.ts:_xorUnmaskWithPublicKey` with the same
|
|
145
|
+
* 32 bytes. NOT real encryption — only the cleartext wire format.
|
|
146
|
+
*/
|
|
147
|
+
export function xorMaskWithPublicKey(publicKey: BytesHex, cleartexts: readonly bigint[]): bigint[] {
|
|
148
|
+
const hex = remove0x(publicKey);
|
|
149
|
+
if (hex.length < 64) {
|
|
150
|
+
throw new Error(`PublicKeyTooShort: publicKey has ${hex.length / 2} bytes, need >= 32`);
|
|
151
|
+
}
|
|
152
|
+
const mask = BigInt('0x' + hex.slice(0, 64));
|
|
153
|
+
return cleartexts.map((c) => c ^ mask);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Replicates `CleartextKMSVerifier._encodeTypedCleartexts`: each cleartext is cast
|
|
158
|
+
* to its FHE-natural type (bool → 0/1, address → uint160, else uint256) and packed
|
|
159
|
+
* into a 32-byte word. For these static value types `abi.encode(v0, …, vn)` is
|
|
160
|
+
* byte-identical to the packed layout, and it round-trips through the proof's
|
|
161
|
+
* `decode(handle.solidityPrimitiveTypeName[], …)`.
|
|
162
|
+
*/
|
|
163
|
+
export function encodeTypedCleartexts(
|
|
164
|
+
ethereumModule: CleartextEthereumModule,
|
|
165
|
+
handles: readonly Handle[],
|
|
166
|
+
cleartexts: readonly bigint[],
|
|
167
|
+
): BytesHex {
|
|
168
|
+
const words = handles.map((handle, i) => {
|
|
169
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
170
|
+
const value = cleartexts[i]!;
|
|
171
|
+
switch (handle.solidityPrimitiveTypeName) {
|
|
172
|
+
case 'bool':
|
|
173
|
+
return value !== 0n ? 1n : 0n;
|
|
174
|
+
case 'address':
|
|
175
|
+
return value & ((1n << 160n) - 1n);
|
|
176
|
+
case 'uint256':
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
return ethereumModule.encode({
|
|
182
|
+
types: words.map(() => 'uint256'),
|
|
183
|
+
values: words,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
import { createDeadbeefBytes } from '../../../base/bytes.js';
|
|
10
10
|
import { fetchUserDecrypt } from './fetchUserDecrypt.js';
|
|
11
11
|
import { fetchPublicDecrypt } from './fetchPublicDecrypt.js';
|
|
12
|
-
import { fetchDelegatedUserDecrypt } from './
|
|
12
|
+
import { fetchDelegatedUserDecrypt } from './fetchDelegatedUserDecryptV1.js';
|
|
13
13
|
import { fetchCoprocessorSignatures } from './fetchCoprocessorSignatures.js';
|
|
14
14
|
|
|
15
15
|
////////////////////////////////////////////////////////////////////////////////
|
|
@@ -8,6 +8,36 @@ const FHEVM_TEST_MNEMONIC = 'test test test test test test test future home engi
|
|
|
8
8
|
const COPROCESSOR_PATH = "0'/2/";
|
|
9
9
|
const KMS_PATH = "0'/3/";
|
|
10
10
|
|
|
11
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
12
|
+
//
|
|
13
|
+
// forge-fhevm v1
|
|
14
|
+
// --------------
|
|
15
|
+
//
|
|
16
|
+
// forge-fhevm v1 registers a single KMS signer and a single coprocessor signer from
|
|
17
|
+
// these deploy-default private keys (`KMS_SIGNER_PRIVATE_KEY_0` /
|
|
18
|
+
// `COPROCESSOR_SIGNER_PRIVATE_KEY_0` in `deploy-local.sh`). They are NOT derivable
|
|
19
|
+
// from `FHEVM_TEST_MNEMONIC`, so a cleartext client running against a forge-fhevm v1
|
|
20
|
+
// deployment must know them explicitly: the on-chain `getKmsSigners()` returns
|
|
21
|
+
// these addresses and the cleartext relayer signs shares with `map.get(address)`.
|
|
22
|
+
//
|
|
23
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
24
|
+
|
|
25
|
+
const FORGE_FHEVM_V1_COPROCESSOR_SIGNER: { readonly address: ChecksummedAddress; readonly privateKey: BytesHex } = {
|
|
26
|
+
address: '0xc9990FEfE0c27D31D0C2aa36196b085c0c4d456c' as ChecksummedAddress,
|
|
27
|
+
privateKey: '0x7ec8ada6642fc4ccfb7729bc29c17cf8d21b61abd5642d1db992c0b8672ab901' as BytesHex,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const FORGE_FHEVM_V1_KMS_SIGNER: { readonly address: ChecksummedAddress; readonly privateKey: BytesHex } = {
|
|
31
|
+
address: '0x0971C80fF03B428fD2094dd5354600ab103201C5' as ChecksummedAddress,
|
|
32
|
+
privateKey: '0x388b7680e4e1afa06efbfd45cdd1fe39f3c6af381df6555a19661f283b97de91' as BytesHex,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export function isForgeFhevmV1KmsSigner(signerAddress: string | undefined): boolean {
|
|
36
|
+
return signerAddress?.toLowerCase() === FORGE_FHEVM_V1_KMS_SIGNER.address.toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
////////////////////////////////////////////////////////////////////////////////
|
|
40
|
+
|
|
11
41
|
type PrivateKeyMap = Map<ChecksummedAddress, BytesHex>;
|
|
12
42
|
|
|
13
43
|
const signersPrivateKeyMap: { readonly coprocessor: PrivateKeyMap; readonly kms: PrivateKeyMap } = {
|
|
@@ -20,6 +50,10 @@ const signersPrivateKeyMap: { readonly coprocessor: PrivateKeyMap; readonly kms:
|
|
|
20
50
|
export function getCoprocessorSignersPrivateKeyMap(relayerClient: RelayerClientWithRuntime): PrivateKeyMap {
|
|
21
51
|
if (signersPrivateKeyMap.coprocessor.size === 0) {
|
|
22
52
|
_fillSignersPrivateKey(relayerClient, COPROCESSOR_PATH, 20, signersPrivateKeyMap.coprocessor);
|
|
53
|
+
signersPrivateKeyMap.coprocessor.set(
|
|
54
|
+
FORGE_FHEVM_V1_COPROCESSOR_SIGNER.address,
|
|
55
|
+
FORGE_FHEVM_V1_COPROCESSOR_SIGNER.privateKey,
|
|
56
|
+
);
|
|
23
57
|
}
|
|
24
58
|
return signersPrivateKeyMap.coprocessor;
|
|
25
59
|
}
|
|
@@ -29,6 +63,7 @@ export function getCoprocessorSignersPrivateKeyMap(relayerClient: RelayerClientW
|
|
|
29
63
|
export function getKmsSignersPrivateKeyMap(relayerClient: RelayerClientWithRuntime): PrivateKeyMap {
|
|
30
64
|
if (signersPrivateKeyMap.kms.size === 0) {
|
|
31
65
|
_fillSignersPrivateKey(relayerClient, KMS_PATH, 20, signersPrivateKeyMap.kms);
|
|
66
|
+
signersPrivateKeyMap.kms.set(FORGE_FHEVM_V1_KMS_SIGNER.address, FORGE_FHEVM_V1_KMS_SIGNER.privateKey);
|
|
32
67
|
}
|
|
33
68
|
return signersPrivateKeyMap.kms;
|
|
34
69
|
}
|
package/core/types/kms-p.ts
CHANGED
|
@@ -2,7 +2,15 @@ import type { TkmsVersion } from '../../wasm/tkms/KmsLibApi.js';
|
|
|
2
2
|
import type { Handle } from './encryptedTypes-p.js';
|
|
3
3
|
import type { KmsEip712Domain } from './kms.js';
|
|
4
4
|
import type { KmsSignersContext } from './kmsSignersContext.js';
|
|
5
|
-
import type {
|
|
5
|
+
import type {
|
|
6
|
+
Bytes65Hex,
|
|
7
|
+
Bytes65HexNo0x,
|
|
8
|
+
BytesHex,
|
|
9
|
+
BytesHexNo0x,
|
|
10
|
+
ChecksummedAddress,
|
|
11
|
+
Uint256BigInt,
|
|
12
|
+
Uint8Number,
|
|
13
|
+
} from './primitives.js';
|
|
6
14
|
|
|
7
15
|
export interface KmsSigncryptedSharesMetadata {
|
|
8
16
|
readonly kmsSignersContext: KmsSignersContext;
|
|
@@ -18,3 +26,10 @@ export interface KmsSigncryptedShare {
|
|
|
18
26
|
readonly signature: Bytes65HexNo0x;
|
|
19
27
|
readonly extraData: BytesHexNo0x;
|
|
20
28
|
}
|
|
29
|
+
|
|
30
|
+
export interface KmsExtraData {
|
|
31
|
+
readonly version: Uint8Number;
|
|
32
|
+
readonly kmsContextId: Uint256BigInt;
|
|
33
|
+
readonly kmsEpochId: Uint256BigInt;
|
|
34
|
+
toBytesHex(): BytesHex;
|
|
35
|
+
}
|
|
@@ -3,6 +3,8 @@ import type {
|
|
|
3
3
|
GeneratePrivateKeyReturnType,
|
|
4
4
|
GetPublicKeyParameters,
|
|
5
5
|
GetPublicKeyReturnType,
|
|
6
|
+
HashTypedDataParameters,
|
|
7
|
+
HashTypedDataReturnType,
|
|
6
8
|
MnemonicToAccountParameters,
|
|
7
9
|
MnemonicToAccountReturnType,
|
|
8
10
|
RecoverAddressParameters,
|
|
@@ -11,6 +13,7 @@ import type {
|
|
|
11
13
|
SignReturnType,
|
|
12
14
|
} from '../../core/modules/ethereum/types-ct.js';
|
|
13
15
|
import type { BytesHex, ChecksummedAddress } from '../../core/types/primitives.js';
|
|
16
|
+
import type { TypedDataField } from 'ethers';
|
|
14
17
|
import {
|
|
15
18
|
decode,
|
|
16
19
|
encode,
|
|
@@ -20,8 +23,9 @@ import {
|
|
|
20
23
|
recoverTypedDataAddress,
|
|
21
24
|
signTypedData,
|
|
22
25
|
} from './ethereum.js';
|
|
23
|
-
import { SigningKey, HDNodeWallet, Wallet } from 'ethers';
|
|
26
|
+
import { SigningKey, HDNodeWallet, Wallet, TypedDataEncoder } from 'ethers';
|
|
24
27
|
import { sign, recoverAddress } from '../../core/base/sign.js';
|
|
28
|
+
import { asBytes32Hex } from '../../core/base/bytes.js';
|
|
25
29
|
|
|
26
30
|
////////////////////////////////////////////////////////////////////////////////
|
|
27
31
|
|
|
@@ -56,6 +60,16 @@ export const cleartextEthereumModule: CleartextEthereumModuleFactory = () => {
|
|
|
56
60
|
const recoveredAddress = recoverAddress(parameters);
|
|
57
61
|
return Promise.resolve(recoveredAddress);
|
|
58
62
|
},
|
|
63
|
+
hashTypedData: (parameters: HashTypedDataParameters): HashTypedDataReturnType => {
|
|
64
|
+
const primaryTypeFields = parameters.types[parameters.primaryType];
|
|
65
|
+
if (primaryTypeFields === undefined) {
|
|
66
|
+
throw new Error(`Primary type "${parameters.primaryType}" not found in types`);
|
|
67
|
+
}
|
|
68
|
+
const typesToHash: Record<string, TypedDataField[]> = {
|
|
69
|
+
[parameters.primaryType]: [...primaryTypeFields],
|
|
70
|
+
};
|
|
71
|
+
return asBytes32Hex(TypedDataEncoder.hash(parameters.domain, typesToHash, parameters.message));
|
|
72
|
+
},
|
|
59
73
|
}),
|
|
60
74
|
});
|
|
61
75
|
};
|
|
@@ -15,14 +15,16 @@ export function getCleartextEthersRuntime(): FhevmRuntime {
|
|
|
15
15
|
throw new Error('Call setFhevmRuntimeConfig first.');
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (ethersFhevmRuntime === undefined) {
|
|
19
|
+
const em = cleartextEthereumModule();
|
|
20
|
+
const rm = cleartextRelayerModule();
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
ethersFhevmRuntime = createFhevmRuntime({
|
|
23
|
+
ethereum: em.ethereum,
|
|
24
|
+
relayer: rm.relayer,
|
|
25
|
+
config: getFhevmRuntimeConfig(),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
26
28
|
|
|
27
29
|
return ethersFhevmRuntime;
|
|
28
30
|
}
|
package/package.json
CHANGED
|
@@ -3,6 +3,8 @@ import type {
|
|
|
3
3
|
GeneratePrivateKeyReturnType,
|
|
4
4
|
GetPublicKeyParameters,
|
|
5
5
|
GetPublicKeyReturnType,
|
|
6
|
+
HashTypedDataParameters,
|
|
7
|
+
HashTypedDataReturnType,
|
|
6
8
|
MnemonicToAccountParameters,
|
|
7
9
|
MnemonicToAccountReturnType,
|
|
8
10
|
RecoverAddressParameters,
|
|
@@ -21,8 +23,8 @@ import {
|
|
|
21
23
|
recoverTypedDataAddress,
|
|
22
24
|
signTypedData,
|
|
23
25
|
} from './ethereum.js';
|
|
24
|
-
import { bytesToHex } from '../../core/base/bytes.js';
|
|
25
|
-
import { recoverAddress } from 'viem';
|
|
26
|
+
import { asBytes32Hex, bytesToHex } from '../../core/base/bytes.js';
|
|
27
|
+
import { hashTypedData, recoverAddress } from 'viem';
|
|
26
28
|
|
|
27
29
|
////////////////////////////////////////////////////////////////////////////////
|
|
28
30
|
|
|
@@ -56,6 +58,16 @@ export const cleartextEthereumModule: CleartextEthereumModuleFactory = () => {
|
|
|
56
58
|
recoverAddress: (parameters: RecoverAddressParameters): Promise<RecoverAddressReturnType> => {
|
|
57
59
|
return recoverAddress(parameters) as Promise<ChecksummedAddress>;
|
|
58
60
|
},
|
|
61
|
+
hashTypedData: (parameters: HashTypedDataParameters): HashTypedDataReturnType => {
|
|
62
|
+
return asBytes32Hex(
|
|
63
|
+
hashTypedData({
|
|
64
|
+
domain: parameters.domain,
|
|
65
|
+
types: parameters.types as Record<string, Array<{ name: string; type: string }>>,
|
|
66
|
+
primaryType: parameters.primaryType,
|
|
67
|
+
message: parameters.message,
|
|
68
|
+
}),
|
|
69
|
+
);
|
|
70
|
+
},
|
|
59
71
|
}),
|
|
60
72
|
});
|
|
61
73
|
};
|
|
@@ -15,14 +15,16 @@ export function getCleartextViemRuntime(): FhevmRuntime {
|
|
|
15
15
|
throw new Error('Call setFhevmRuntimeConfig first.');
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
if (viemFhevmRuntime === undefined) {
|
|
19
|
+
const em = cleartextEthereumModule();
|
|
20
|
+
const rm = cleartextRelayerModule();
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
viemFhevmRuntime = createFhevmRuntime({
|
|
23
|
+
ethereum: em.ethereum,
|
|
24
|
+
relayer: rm.relayer,
|
|
25
|
+
config: getFhevmRuntimeConfig(),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
26
28
|
|
|
27
29
|
return viemFhevmRuntime;
|
|
28
30
|
}
|