@inco/js 0.6.8 → 0.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/cjs/advancedacl/session-key.d.ts +8 -1
  2. package/dist/cjs/advancedacl/session-key.js +55 -21
  3. package/dist/cjs/attestedcompute/attested-compute.js +11 -4
  4. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +38 -1
  5. package/dist/cjs/attesteddecrypt/attested-decrypt.js +49 -6
  6. package/dist/cjs/attesteddecrypt/types.d.ts +6 -1
  7. package/dist/cjs/attesteddecrypt/types.js +1 -1
  8. package/dist/cjs/attestedreveal/attested-reveal.js +9 -7
  9. package/dist/cjs/encryption/encryption.d.ts +8 -10
  10. package/dist/cjs/encryption/encryption.js +6 -6
  11. package/dist/cjs/generated/abis/add-two.d.ts +1 -1
  12. package/dist/cjs/generated/abis/add-two.js +1 -1
  13. package/dist/cjs/generated/abis/lightning-preview.d.ts +40 -0
  14. package/dist/cjs/generated/abis/lightning-preview.js +29 -1
  15. package/dist/cjs/generated/abis/lightning.d.ts +1 -1
  16. package/dist/cjs/generated/abis/lightning.js +1 -1
  17. package/dist/cjs/generated/abis/verifier.d.ts +126 -67
  18. package/dist/cjs/generated/abis/verifier.js +108 -54
  19. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +76 -129
  20. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +20 -25
  21. package/dist/cjs/generated/lightning.d.ts +0 -32
  22. package/dist/cjs/generated/lightning.js +1 -33
  23. package/dist/cjs/generated/local-node.d.ts +1 -5
  24. package/dist/cjs/generated/local-node.js +2 -6
  25. package/dist/cjs/lite/deployments.d.ts +20 -2
  26. package/dist/cjs/lite/deployments.js +1 -1
  27. package/dist/cjs/lite/index.d.ts +1 -1
  28. package/dist/cjs/lite/index.js +1 -1
  29. package/dist/cjs/lite/lightning.d.ts +24 -12
  30. package/dist/cjs/lite/lightning.js +62 -26
  31. package/dist/cjs/lite/reencrypt.d.ts +5 -7
  32. package/dist/cjs/lite/reencrypt.js +68 -58
  33. package/dist/cjs/test/mocks.d.ts +12 -0
  34. package/dist/cjs/test/mocks.js +27 -0
  35. package/dist/cjs/viem.d.ts +1 -1
  36. package/dist/esm/advancedacl/session-key.d.ts +8 -1
  37. package/dist/esm/advancedacl/session-key.js +58 -24
  38. package/dist/esm/attestedcompute/attested-compute.js +11 -4
  39. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +38 -1
  40. package/dist/esm/attesteddecrypt/attested-decrypt.js +51 -8
  41. package/dist/esm/attesteddecrypt/types.d.ts +6 -1
  42. package/dist/esm/attesteddecrypt/types.js +1 -1
  43. package/dist/esm/attestedreveal/attested-reveal.js +9 -7
  44. package/dist/esm/encryption/encryption.d.ts +8 -10
  45. package/dist/esm/encryption/encryption.js +6 -6
  46. package/dist/esm/generated/abis/add-two.d.ts +1 -1
  47. package/dist/esm/generated/abis/add-two.js +1 -1
  48. package/dist/esm/generated/abis/lightning-preview.d.ts +40 -0
  49. package/dist/esm/generated/abis/lightning-preview.js +29 -1
  50. package/dist/esm/generated/abis/lightning.d.ts +1 -1
  51. package/dist/esm/generated/abis/lightning.js +1 -1
  52. package/dist/esm/generated/abis/verifier.d.ts +126 -67
  53. package/dist/esm/generated/abis/verifier.js +108 -54
  54. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +76 -129
  55. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +19 -24
  56. package/dist/esm/generated/lightning.d.ts +0 -32
  57. package/dist/esm/generated/lightning.js +1 -33
  58. package/dist/esm/generated/local-node.d.ts +1 -5
  59. package/dist/esm/generated/local-node.js +2 -6
  60. package/dist/esm/lite/deployments.d.ts +20 -2
  61. package/dist/esm/lite/deployments.js +1 -1
  62. package/dist/esm/lite/index.d.ts +1 -1
  63. package/dist/esm/lite/index.js +1 -1
  64. package/dist/esm/lite/lightning.d.ts +24 -12
  65. package/dist/esm/lite/lightning.js +59 -23
  66. package/dist/esm/lite/reencrypt.d.ts +5 -7
  67. package/dist/esm/lite/reencrypt.js +67 -58
  68. package/dist/esm/test/mocks.d.ts +12 -0
  69. package/dist/esm/test/mocks.js +23 -0
  70. package/dist/esm/viem.d.ts +1 -1
  71. package/dist/types/advancedacl/session-key.d.ts +8 -1
  72. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +38 -1
  73. package/dist/types/attesteddecrypt/types.d.ts +6 -1
  74. package/dist/types/encryption/encryption.d.ts +8 -10
  75. package/dist/types/generated/abis/add-two.d.ts +1 -1
  76. package/dist/types/generated/abis/lightning-preview.d.ts +40 -0
  77. package/dist/types/generated/abis/lightning.d.ts +1 -1
  78. package/dist/types/generated/abis/verifier.d.ts +126 -67
  79. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +76 -129
  80. package/dist/types/generated/lightning.d.ts +0 -32
  81. package/dist/types/generated/local-node.d.ts +1 -5
  82. package/dist/types/lite/deployments.d.ts +20 -2
  83. package/dist/types/lite/index.d.ts +1 -1
  84. package/dist/types/lite/lightning.d.ts +24 -12
  85. package/dist/types/lite/reencrypt.d.ts +5 -7
  86. package/dist/types/test/mocks.d.ts +12 -0
  87. package/dist/types/viem.d.ts +1 -1
  88. package/package.json +2 -2
@@ -1,11 +1,14 @@
1
1
  import * as fs from 'fs/promises';
2
- import { hexToBytes } from 'viem';
2
+ import { getContract, hexToBytes, } from 'viem';
3
3
  import { baseSepolia } from 'viem/chains';
4
4
  import { grantSessionKey, sessionKeyAttestedCompute, sessionKeyAttestedDecrypt, sessionKeyReencryptor, updateActiveVouchersSessionNonce, } from '../advancedacl/session-key.js';
5
5
  import { attestedCompute } from '../attestedcompute/attested-compute.js';
6
6
  import { attestedDecrypt } from '../attesteddecrypt/attested-decrypt.js';
7
+ import { attestedReveal } from '../attestedreveal/attested-reveal.js';
7
8
  import { HexString, parseAddress } from '../binary.js';
8
9
  import { encryptionSchemes, } from '../encryption/index.js';
10
+ import { incoLightningAbi } from '../generated/abis/lightning.js';
11
+ import { incoVerifierAbi } from '../generated/abis/verifier.js';
9
12
  import { lightningDeployments } from '../generated/lightning.js';
10
13
  import { localNodeLightningConfig } from '../generated/local-node.js';
11
14
  import { handleTypes } from '../handle.js';
@@ -22,29 +25,22 @@ export class Lightning {
22
25
  _deployment;
23
26
  covalidatorUrl;
24
27
  executorAddress;
25
- eciesPublicKey;
26
28
  chainId;
27
- encryptor;
28
29
  ephemeralKeypair;
29
30
  kmsClient;
30
31
  constructor(_deployment, covalidatorUrl) {
31
32
  this._deployment = _deployment;
32
33
  this.covalidatorUrl = covalidatorUrl;
33
34
  this.executorAddress = parseAddress(_deployment.executorAddress);
34
- this.eciesPublicKey = parse(HexString, _deployment.eciesPublicKey);
35
35
  this.chainId = BigInt(_deployment.chainId);
36
36
  this.ephemeralKeypair = generateSecp256k1Keypair();
37
37
  this.kmsClient = getKmsClient(covalidatorUrl);
38
- this.encryptor = getEciesEncryptor({
39
- pubKeyA: decodeSecp256k1PublicKey(hexToBytes(parse(HexString, _deployment.eciesPublicKey))),
40
- privKeyB: this.ephemeralKeypair,
41
- });
42
38
  }
43
39
  /**
44
40
  * Get a Lightning instance bound to the latest Lightning deployment for the Base Sepolia testnet.
45
41
  */
46
- static baseSepoliaTestnet() {
47
- return Lightning.latest('testnet', baseSepolia.id);
42
+ static async baseSepoliaTestnet() {
43
+ return await Lightning.latest('testnet', baseSepolia.id);
48
44
  }
49
45
  /**
50
46
  * Get a Lightning instance bound to our canonical Anvil-based test node and test Covalidator node
@@ -61,15 +57,15 @@ export class Lightning {
61
57
  * corresponding Pepper.
62
58
  *
63
59
  */
64
- static localNode(env) {
60
+ static async localNode(env) {
65
61
  if (!env) {
66
- return Lightning.custom(localNodeLightningConfig[DefaultPepper]);
62
+ return await Lightning.custom(localNodeLightningConfig[DefaultPepper]);
67
63
  }
68
64
  if (typeof env === 'string') {
69
- return Lightning.custom(localNodeLightningConfig[env]);
65
+ return await Lightning.custom(localNodeLightningConfig[env]);
70
66
  }
71
67
  const conf = localNodeLightningConfig[DefaultPepper];
72
- return Lightning.custom({
68
+ return await Lightning.custom({
73
69
  // We assume that we always run a local node as the default anvil node
74
70
  chainId: env.COVALIDATOR_HOST_CHAIN_ID
75
71
  ? Number(env.COVALIDATOR_HOST_CHAIN_ID)
@@ -80,7 +76,6 @@ export class Lightning {
80
76
  'http://localhost:8545',
81
77
  // These variables vary per environment
82
78
  executorAddress: env.EXECUTOR_ADDRESS,
83
- eciesPublicKey: env.ECIES_PUBLIC_KEY,
84
79
  senderPrivateKey: env.SENDER_PRIVATE_KEY,
85
80
  });
86
81
  }
@@ -92,14 +87,14 @@ export class Lightning {
92
87
  static async localNodeFromEnv(filePath) {
93
88
  const buf = filePath ? await fs.readFile(filePath) : undefined;
94
89
  const env = parseLocalEnv(buf);
95
- return Lightning.localNode(env);
90
+ return await Lightning.localNode(env);
96
91
  }
97
92
  /**
98
93
  * Get a Lightning deployment by name or executor address on a particular chain.
99
94
  *
100
95
  * @param id this is an object containing either the pair of name and chainId or the executorAddress and chainId
101
96
  */
102
- static at(id) {
97
+ static async at(id) {
103
98
  const deployment = this.isIdByName(id)
104
99
  ? lightningDeployments.find((d) => d.name === id.name && d.chainId === id.chainId)
105
100
  : lightningDeployments.find((d) => d.executorAddress === id.executorAddress &&
@@ -115,9 +110,23 @@ export class Lightning {
115
110
  * @param config this is an object containing the executorAddress, eciesPublicKey, chainId and covalidatorUrl.
116
111
  * additional fields past will be made available as part of the `deployment` property.
117
112
  */
118
- static custom(config) {
113
+ static async custom(config) {
119
114
  return new Lightning(config, config.covalidatorUrl);
120
115
  }
116
+ static async getEciesPublicKey(client, executorAddress) {
117
+ const incoLightningContract = getContract({
118
+ abi: incoLightningAbi,
119
+ address: executorAddress,
120
+ client,
121
+ });
122
+ const incoVerifierAddress = await incoLightningContract.read.incoVerifier();
123
+ const incoVerifier = getContract({
124
+ abi: incoVerifierAbi,
125
+ address: incoVerifierAddress,
126
+ client,
127
+ });
128
+ return await incoVerifier.read.eciesPubkey();
129
+ }
121
130
  /**
122
131
  * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
123
132
  * version such as 'devnet', 'testnet', 'mainnet', etc.
@@ -143,8 +152,8 @@ export class Lightning {
143
152
  * @param pepper the pepper to use to filter the deployments
144
153
  * @param chainId the chainId to use to filter the deployments
145
154
  */
146
- static latest(pepper, chainId) {
147
- return Lightning.at(Lightning.latestDeployment(pepper, chainId));
155
+ static async latest(pepper, chainId) {
156
+ return await Lightning.at(Lightning.latestDeployment(pepper, chainId));
148
157
  }
149
158
  /*
150
159
  * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
@@ -160,8 +169,8 @@ export class Lightning {
160
169
  * @param accountAddress the address of the account interacting with the dapp contract, normally an Externally Owned Account (EOA)
161
170
  * @param dappAddress the address of the dapp contract that interacts with the Inco Lightning contract or library
162
171
  */
163
- async encrypt(value, { accountAddress, dappAddress }) {
164
- const { ciphertext } = await this.encryptor({
172
+ async encrypt(value, { accountAddress, dappAddress }, encryptor) {
173
+ const { ciphertext } = await encryptor({
165
174
  plaintext: Lightning.plaintextFromValue(value),
166
175
  context: {
167
176
  hostChainId: this.chainId,
@@ -187,6 +196,12 @@ export class Lightning {
187
196
  ephemeralKeypair: this.ephemeralKeypair,
188
197
  });
189
198
  }
199
+ getEncryptor(eciesPubkey) {
200
+ return getEciesEncryptor({
201
+ pubKeyA: decodeSecp256k1PublicKey(hexToBytes(parse(HexString, eciesPubkey))),
202
+ privKeyB: this.ephemeralKeypair,
203
+ });
204
+ }
190
205
  /**
191
206
  * Grants a session key allowance voucher for secure reencryption operations.
192
207
  *
@@ -319,6 +334,27 @@ export class Lightning {
319
334
  backoffConfig,
320
335
  });
321
336
  }
337
+ /**
338
+ * Get an decryption of publicly revealed handles.
339
+ *
340
+ * @param handles - The handles to decrypt
341
+ * @param backoffConfig - The backoff configuration for the attested decrypt request
342
+ * @returns The decryption attestations
343
+ *
344
+ * @example
345
+ * ```typescript
346
+ * const response = await lightning.attestedReveal([handle1, handle2]);
347
+ * const { plaintext, covalidatorSignature } = response[0];
348
+ * ```
349
+ */
350
+ attestedReveal(handles, backoffConfig) {
351
+ return attestedReveal({
352
+ handles,
353
+ backoffConfig,
354
+ chainId: Number(this.chainId),
355
+ kmsConnectRpcEndpointOrClient: this.kmsClient,
356
+ });
357
+ }
322
358
  /**
323
359
  * Get the GRPC endpoint for the covalidator that services this deployment.
324
360
  */
@@ -349,4 +385,4 @@ export class Lightning {
349
385
  }
350
386
  }
351
387
  }
352
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFBa0IsVUFBVSxFQUEyQixNQUFNLE1BQU0sQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFDTCxlQUFlLEVBQ2YseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsZ0NBQWdDLEdBQ2pDLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQVcsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVoRSxPQUFPLEVBRUwsaUJBQWlCLEdBSWxCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUNMLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDeEIsaUJBQWlCLEdBRWxCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQTZCbkUsTUFBTSxhQUFhLEdBQW9CLFNBQVMsQ0FBQztBQTJCakQ7OztH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
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFHTCxXQUFXLEVBQ1gsVUFBVSxHQUlYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLGdDQUFnQyxHQUNqQyxNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWhFLE9BQU8sRUFFTCxpQkFBaUIsR0FJbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUNMLHdCQUF3QixFQUN4Qix3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
@@ -1,10 +1,9 @@
1
1
  import { Client } from '@connectrpc/connect';
2
- import { Account, Chain, Hex, Transport, WalletClient } from 'viem';
2
+ import { Account, Chain, Transport, WalletClient } from 'viem';
3
3
  import { SupportedChain } from '../chain.js';
4
4
  import { EciesScheme, PlaintextOf, SupportedFheType } from '../encryption/encryption.js';
5
- import { KmsService, ReencryptResponse } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
5
+ import { AttestedDecryptResponse, DecryptionAttestation as DecryptionAttestationProto, KmsService } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
6
6
  import { Handle } from '../handle.js';
7
- import type { EIP712 } from '../reencryption/eip712.js';
8
7
  import type { Reencryptor, ReencryptorArgs } from '../reencryption/types.js';
9
8
  import { Secp256k1Keypair } from './ecies.js';
10
9
  export interface IncoLiteReencryptorArgs extends ReencryptorArgs {
@@ -12,12 +11,11 @@ export interface IncoLiteReencryptorArgs extends ReencryptorArgs {
12
11
  kmsConnectRpcEndpointOrClient?: string | Client<typeof KmsService>;
13
12
  ephemeralKeypair?: Secp256k1Keypair;
14
13
  }
15
- export declare function reencryptEIP712(chainId: bigint, ephemeralPubKey: Uint8Array): EIP712<{
16
- publicKey: Hex;
17
- }>;
18
14
  export declare function incoLiteReencryptor({ kmsConnectRpcEndpointOrClient, chainId, walletClient, ephemeralKeypair, }: IncoLiteReencryptorArgs): Promise<Reencryptor<EciesScheme>>;
19
15
  export declare function getKmsClient(kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>): Client<typeof KmsService>;
20
- export declare function decryptGrpcResponse<T extends SupportedFheType>(response: ReencryptResponse, ephemeralKeypair: Secp256k1Keypair, handle: Handle): Promise<PlaintextOf<1, T>>;
16
+ export declare function decryptGrpcResponse<T extends SupportedFheType>(response: AttestedDecryptResponse, ephemeralKeypair: Secp256k1Keypair, handle: Handle): Promise<PlaintextOf<1, T>>;
17
+ export declare function decryptGrpcDecryptionAttestation(attestation: DecryptionAttestationProto, reencryptKeypair: Secp256k1Keypair): Promise<DecryptionAttestationProto>;
18
+ export declare function decryptGrpcDecryptResponse(response: AttestedDecryptResponse, reencryptKeypair: Secp256k1Keypair): Promise<AttestedDecryptResponse>;
21
19
  export declare function defaultCovalidatorGrpc(chain: SupportedChain): string;
22
20
  export declare function lightningDevnetCovalidatorGrpc(chain: SupportedChain): string;
23
21
  export declare function lightningTestnetCovalidatorGrpc(chain: SupportedChain): string;
@@ -1,37 +1,13 @@
1
1
  import { create } from '@bufbuild/protobuf';
2
2
  import { createClient } from '@connectrpc/connect';
3
3
  import { createConnectTransport } from '@connectrpc/connect-web';
4
- import { bytesToHex, hexToBytes, } from 'viem';
4
+ import { attestedDecrypt } from '../attesteddecrypt/attested-decrypt.js';
5
5
  import { bytesToBigInt } from '../binary.js';
6
6
  import { getSupportedChain } from '../chain.js';
7
7
  import { bigintToPlaintext, encryptionSchemes, } from '../encryption/encryption.js';
8
- import { KmsService, ReencryptRequestSchema, } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
9
- import { HandleWithProofSchema } from '../generated/es/inco/kms/lite/v1/types_pb.js';
8
+ import { AttestedDecryptResponseSchema, DecryptionAttestationSchema, KmsService, PlaintextSchema, } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
10
9
  import { getHandleType } from '../handle.js';
11
- import { createEIP712Payload } from '../reencryption/eip712.js';
12
- import { retryWithBackoff } from '../retry.js';
13
10
  import { decrypt, generateSecp256k1Keypair, } from './ecies.js';
14
- // The domain constants used for basic reencrypts.
15
- // Note: for advanced ACL, since the signature is checked on-chain, the domain
16
- // and version must match the ones used in the contract. For basic ones, we use
17
- // a domain different than the one used on-chain
18
- const BASIC_REENCRYPT_DOMAIN = {
19
- name: 'IncoReencryption',
20
- version: '0.1.0',
21
- };
22
- // Create an EIP712 payload for the Inco Lite basic reencrypt.
23
- export function reencryptEIP712(chainId, ephemeralPubKey) {
24
- return createEIP712Payload({
25
- chainId,
26
- primaryType: 'ReencryptionRequest',
27
- primaryTypeFields: [{ name: 'publicKey', type: 'bytes' }],
28
- message: {
29
- publicKey: bytesToHex(ephemeralPubKey),
30
- },
31
- domainName: BASIC_REENCRYPT_DOMAIN.name,
32
- domainVersion: BASIC_REENCRYPT_DOMAIN.version,
33
- });
34
- }
35
11
  // Returns the Inco Lite Reencryptor, which can reencrypt a handle using the
36
12
  // Basic ACL.
37
13
  export async function incoLiteReencryptor({ kmsConnectRpcEndpointOrClient, chainId, walletClient, ephemeralKeypair, }) {
@@ -40,40 +16,21 @@ export async function incoLiteReencryptor({ kmsConnectRpcEndpointOrClient, chain
40
16
  if (!ephemeralKeypair) {
41
17
  ephemeralKeypair = await generateSecp256k1Keypair();
42
18
  }
43
- // Sign the EIP712 attesting that the user has access to the private key
44
- // corresponding to the ephemeral public key.
45
- const eip712Payload = reencryptEIP712(chainId, ephemeralKeypair.encodePublicKey());
46
- // Using browser extensions, this step will prompt the user to sign the
47
- // payload.
48
- const eip712Signature = await walletClient.signTypedData(eip712Payload);
49
19
  return async function reencrypt({ handle }, backoffConfig) {
50
20
  const ephemeralPubKey = ephemeralKeypair.encodePublicKey();
51
- const reencryptRequest = create(ReencryptRequestSchema, {
52
- userAddress: walletClient.account.address,
53
- ephemeralPubKey,
54
- eip712Signature: hexToBytes(eip712Signature),
55
- handlesWithProofs: [
56
- create(HandleWithProofSchema, {
57
- handle,
58
- aclProof: {
59
- proof: {
60
- case: 'incoLiteBasicAclProof',
61
- value: {},
62
- },
63
- },
64
- }),
65
- ],
21
+ const response = await attestedDecrypt({
22
+ chainId: getSupportedChain(chainId).id,
23
+ walletClient,
24
+ kmsConnectRpcEndpointOrClient: kmsClient,
25
+ handles: [handle],
26
+ backoffConfig,
27
+ reencryptPubKey: ephemeralPubKey,
28
+ reencryptKeypair: ephemeralKeypair,
66
29
  });
67
- try {
68
- return await retryWithBackoff(async () => {
69
- const response = await kmsClient.reencrypt(reencryptRequest);
70
- return decryptGrpcResponse(response, ephemeralKeypair, handle);
71
- }, backoffConfig);
72
- }
73
- catch (error) {
74
- console.log(error);
75
- throw error;
30
+ if (response.length !== 1) {
31
+ throw new Error(`Expected 1 result, got ${response.length}`);
76
32
  }
33
+ return response[0].plaintext;
77
34
  };
78
35
  }
79
36
  // Helper function to get a KMS client from a string or a Client instance.
@@ -90,7 +47,18 @@ export function getKmsClient(kmsConnectRpcEndpointOrClient) {
90
47
  // Even though the proto specifies a list of ciphertexts, our JS SDK
91
48
  // currently only supports a single ciphertext.
92
49
  export async function decryptGrpcResponse(response, ephemeralKeypair, handle) {
93
- const reencryptedCt = response.payload?.userCiphertexts[0];
50
+ if (response.decryptionAttestations.length === 0) {
51
+ throw new Error('No decryption attestations in the response');
52
+ }
53
+ const att = response.decryptionAttestations[0];
54
+ if (att.value === undefined) {
55
+ throw new Error('No value in attestation');
56
+ }
57
+ if (att.value.case !== 'reencryption') {
58
+ throw new Error(`Unexpected attestation type: ${att.value.case}, expected 'reencryption'`);
59
+ }
60
+ const reencryption = att.value.value;
61
+ const reencryptedCt = reencryption.userCiphertext;
94
62
  if (!reencryptedCt) {
95
63
  throw new Error('No reencrypted ciphertext in the response');
96
64
  }
@@ -98,6 +66,47 @@ export async function decryptGrpcResponse(response, ephemeralKeypair, handle) {
98
66
  const plaintext = bytesToBigInt(plaintextBytes);
99
67
  return bigintToPlaintext(encryptionSchemes.ecies, getHandleType(handle), plaintext);
100
68
  }
69
+ // A helper function that takes in a DecryptionAttestation message containing reencryption,
70
+ // decrypts it using the provided reencryptKeypair, and returns a DecryptionAttestation message containing a plaintext.
71
+ export async function decryptGrpcDecryptionAttestation(attestation, reencryptKeypair) {
72
+ if (attestation.value === undefined) {
73
+ throw new Error('No value in attestation');
74
+ }
75
+ if (attestation.value.case !== 'reencryption') {
76
+ return Promise.resolve(attestation);
77
+ }
78
+ const reencryption = attestation.value.value;
79
+ const reencryptedCt = reencryption.userCiphertext;
80
+ if (!reencryptedCt) {
81
+ throw new Error('No reencrypted ciphertext in the response');
82
+ }
83
+ const plaintextBytes = await decrypt(reencryptKeypair, reencryptedCt.ciphertext);
84
+ return create(DecryptionAttestationSchema, {
85
+ handle: attestation.handle,
86
+ value: {
87
+ case: 'plaintext',
88
+ value: create(PlaintextSchema, {
89
+ value: plaintextBytes,
90
+ }),
91
+ },
92
+ signature: attestation.signature,
93
+ });
94
+ }
95
+ // A helper function that takes in an AttestedDecryptResponse message containing reencryption attestations,
96
+ // decrypts them using the provided reencryptKeypair, and returns an AttestedDecryptResponse message containing plaintext attestations.
97
+ export async function decryptGrpcDecryptResponse(response, reencryptKeypair) {
98
+ if (response.decryptionAttestations.length === 0) {
99
+ throw new Error('No decryption attestations in the response');
100
+ }
101
+ // For each attestation in the response, decrypt it
102
+ const decryptedAttestations = await Promise.all(response.decryptionAttestations.map(async (attestation) => {
103
+ return await decryptGrpcDecryptionAttestation(attestation, reencryptKeypair);
104
+ }));
105
+ // Return new response with decrypted attestations
106
+ return create(AttestedDecryptResponseSchema, {
107
+ decryptionAttestations: decryptedAttestations,
108
+ });
109
+ }
101
110
  // Helper function to return the default gRPC endpoint for the covalidator.
102
111
  // Currently, this returns the covalidator for the Inco Lightning public testnet.
103
112
  export function defaultCovalidatorGrpc(chain) {
@@ -119,4 +128,4 @@ function camelToDashCase(str) {
119
128
  function getCovalidatorGrpcHelper(chain, network, cluster) {
120
129
  return `https://grpc.${camelToDashCase(chain.name)}.${cluster}.${network}.inco.org`;
121
130
  }
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVlbmNyeXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvcmVlbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQVUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakUsT0FBTyxFQUVMLFVBQVUsRUFHVixVQUFVLEdBR1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0IsTUFBTSxhQUFhLENBQUM7QUFDaEUsT0FBTyxFQUNMLGlCQUFpQixFQUVqQixpQkFBaUIsR0FHbEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsVUFBVSxFQUVWLHNCQUFzQixHQUV2QixNQUFNLG9EQUFvRCxDQUFDO0FBQzVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQVUsTUFBTSxjQUFjLENBQUM7QUFFckQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFDTCxPQUFPLEVBQ1Asd0JBQXdCLEdBRXpCLE1BQU0sWUFBWSxDQUFDO0FBaUJwQixrREFBa0Q7QUFDbEQsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSxnREFBZ0Q7QUFDaEQsTUFBTSxzQkFBc0IsR0FBRztJQUM3QixJQUFJLEVBQUUsa0JBQWtCO0lBQ3hCLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQUM7QUFFRiw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsT0FB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
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVlbmNyeXB0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvcmVlbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQVUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLGlCQUFpQixHQUdsQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFFTCw2QkFBNkIsRUFFN0IsMkJBQTJCLEVBQzNCLFVBQVUsRUFDVixlQUFlLEdBRWhCLE1BQU0sb0RBQW9ELENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGNBQWMsQ0FBQztBQU9yRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLHdCQUF3QixHQUV6QixNQUFNLFlBQVksQ0FBQztBQWlCcEIsNEVBQTRFO0FBQzVFLGFBQWE7QUFDYixNQUFNLENBQUMsS0FBSyxVQUFVLG1CQUFtQixDQUFDLEVBQ3hDLDZCQUE2QixFQUM3QixPQUFPLEVBQ1AsWUFBWSxFQUNaLGdCQUFnQixHQUNRO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FDNUIsNkJBQTZCO1FBQzNCLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3JELENBQUM7SUFDRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixnQkFBZ0IsR0FBRyxNQUFNLHdCQUF3QixFQUFFLENBQUM7SUFDdEQsQ0FB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
@@ -0,0 +1,12 @@
1
+ import { Account, Chain, Transport, WalletClient } from 'viem';
2
+ import { vi } from 'vitest';
3
+ import { KmsClient } from '../kms/client.js';
4
+ interface MinimalKmsClient {
5
+ attestedCompute: ReturnType<typeof vi.fn>;
6
+ attestedDecrypt: ReturnType<typeof vi.fn>;
7
+ key: ReturnType<typeof vi.fn>;
8
+ reencrypt: ReturnType<typeof vi.fn>;
9
+ }
10
+ export declare function createMockKmsClient(): MinimalKmsClient & KmsClient;
11
+ export declare function createTestWalletClient(): WalletClient<Transport, Chain, Account>;
12
+ export {};
@@ -0,0 +1,23 @@
1
+ import { createWalletClient, http, } from 'viem';
2
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
3
+ import { sepolia } from 'viem/chains';
4
+ import { vi } from 'vitest';
5
+ // Create a mock that satisfies our minimal interface
6
+ export function createMockKmsClient() {
7
+ return {
8
+ attestedCompute: vi.fn(),
9
+ attestedDecrypt: vi.fn(),
10
+ key: vi.fn(),
11
+ reencrypt: vi.fn(),
12
+ };
13
+ }
14
+ // Create a real wallet client for testing
15
+ export function createTestWalletClient() {
16
+ const account = privateKeyToAccount(generatePrivateKey());
17
+ return createWalletClient({
18
+ chain: sepolia, // Arbitrary chain, not relevant to test
19
+ transport: http('UNUSED IN TEST'),
20
+ account,
21
+ });
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsa0JBQWtCLEVBQ2xCLElBQUksR0FHTCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFZNUIscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTztRQUNMLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1osU0FBUyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7S0FDYSxDQUFDO0FBQ3BDLENBQUM7QUFFRCwwQ0FBMEM7QUFDMUMsTUFBTSxVQUFVLHNCQUFzQjtJQUtwQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxrQkFBa0IsQ0FBQztRQUN4QixLQUFLLEVBQUUsT0FBTyxFQUFFLHdDQUF3QztRQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2pDLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIn0=
@@ -30,7 +30,7 @@ export declare const chains: {
30
30
  experimental_preconfirmationTime?: number | undefined | undefined;
31
31
  rpcUrls: {
32
32
  readonly default: {
33
- readonly http: readonly ["https://sepolia.drpc.org"];
33
+ readonly http: readonly ["https://11155111.rpc.thirdweb.com"];
34
34
  };
35
35
  };
36
36
  sourceId?: number | undefined | undefined;
@@ -29,6 +29,11 @@ export interface SessionKeyReencryptorArgs {
29
29
  kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>;
30
30
  allowanceVoucherWithSig: AllowanceVoucherWithSig;
31
31
  }
32
+ /**
33
+ * The sessionKeyReencryptor function is a reencryptor that uses a session key
34
+ * to reencrypt data.
35
+ *
36
+ */
32
37
  export declare function sessionKeyReencryptor({ chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyReencryptorArgs): Promise<(<T extends SupportedFheType>({ handle, }: ReencryptFnArgs<EciesScheme, T>) => Promise<import("../encryption/encryption.js").PlaintextOf<1, 0 | 5 | 7 | 8>>)>;
33
38
  export declare function updateActiveVouchersSessionNonce(incoLiteAddress: Address, sharerWalletClient: WalletClient<Transport, Chain, Account>): Promise<`0x${string}`>;
34
39
  export interface SessionKeyAttestedComputeArgs {
@@ -53,5 +58,7 @@ export interface SessionKeyAttestedDecryptArgs {
53
58
  allowanceVoucherWithSig: AllowanceVoucherWithSig;
54
59
  handles: HexString[];
55
60
  backoffConfig?: Partial<BackoffConfig> | undefined;
61
+ reencryptPubKey?: Uint8Array;
62
+ reencryptKeypair?: Secp256k1Keypair;
56
63
  }
57
- export declare function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
64
+ export declare function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
@@ -3,8 +3,9 @@ import { HexString } from '../binary.js';
3
3
  import { SupportedChainId } from '../chain.js';
4
4
  import { EciesScheme, SupportedFheType } from '../encryption/encryption.js';
5
5
  import type { KmsClient } from '../kms/client.js';
6
+ import { Secp256k1Keypair } from '../lite/ecies.js';
6
7
  import type { BackoffConfig } from '../retry.js';
7
- import { DecryptionAttestation } from './types.js';
8
+ import { DecryptionAttestation, EncryptedDecryptionAttestation } from './types.js';
8
9
  export declare const ATTESTED_DECRYPT_DOMAIN_NAME = "IncoAttestedDecrypt";
9
10
  export declare const ATTESTED_DECRYPT_DOMAIN_VERSION = "0.1.0";
10
11
  /**
@@ -24,6 +25,40 @@ export interface IncoLiteAttestedDecryptorArgs {
24
25
  /** The chain ID to use */
25
26
  chainId: SupportedChainId;
26
27
  }
28
+ /**
29
+ * Decrypt multiple handles in a single attested request.
30
+ * Returns an array of attestations aligned with the response ordering.
31
+ *
32
+ * @param args - The arguments for creating the attested decrypt function
33
+ * @returns A function that can decrypt handles and return an attestation
34
+ * @throws {AttestedDecryptError} If the creation fails
35
+ */
36
+ export declare function attestedDecrypt({ handles, backoffConfig, walletClient, chainId, reencryptPubKey, reencryptKeypair, kmsConnectRpcEndpointOrClient, }: {
37
+ handles: HexString[];
38
+ backoffConfig?: Partial<BackoffConfig> | undefined;
39
+ walletClient: WalletClient<Transport, Chain, Account>;
40
+ chainId: SupportedChainId;
41
+ reencryptPubKey: Uint8Array;
42
+ reencryptKeypair: Secp256k1Keypair;
43
+ kmsConnectRpcEndpointOrClient?: string | KmsClient;
44
+ }): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
45
+ /**
46
+ * Decrypt multiple handles in a single attested request.
47
+ * Returns an array of attestations aligned with the response ordering.
48
+ *
49
+ * @param args - The arguments for creating the attested decrypt function
50
+ * @returns A function that can decrypt handles and return an attestation
51
+ * @throws {AttestedDecryptError} If the creation fails
52
+ */
53
+ export declare function attestedDecrypt({ handles, backoffConfig, walletClient, chainId, reencryptPubKey, kmsConnectRpcEndpointOrClient, }: {
54
+ handles: HexString[];
55
+ backoffConfig?: Partial<BackoffConfig> | undefined;
56
+ walletClient: WalletClient<Transport, Chain, Account>;
57
+ chainId: SupportedChainId;
58
+ reencryptPubKey: Uint8Array;
59
+ reencryptKeypair?: never;
60
+ kmsConnectRpcEndpointOrClient?: string | KmsClient;
61
+ }): Promise<Array<EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>>;
27
62
  /**
28
63
  * Decrypt multiple handles in a single attested request.
29
64
  * Returns an array of attestations aligned with the response ordering.
@@ -37,5 +72,7 @@ export declare function attestedDecrypt({ handles, backoffConfig, walletClient,
37
72
  backoffConfig?: Partial<BackoffConfig> | undefined;
38
73
  walletClient: WalletClient<Transport, Chain, Account>;
39
74
  chainId: SupportedChainId;
75
+ reencryptPubKey?: never;
76
+ reencryptKeypair?: never;
40
77
  kmsConnectRpcEndpointOrClient?: string | KmsClient;
41
78
  }): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
@@ -1,5 +1,5 @@
1
1
  import { HexString } from '../binary.js';
2
- import { EncryptionScheme, PlaintextOf, SupportedFheType } from '../encryption/encryption.js';
2
+ import { EncryptionScheme, EncryptResultOf, PlaintextOf, SupportedFheType } from '../encryption/encryption.js';
3
3
  import type { BackoffConfig } from '../retry.js';
4
4
  /**
5
5
  * Custom error class for attested decrypt operations.
@@ -13,6 +13,11 @@ export type DecryptionAttestation<S extends EncryptionScheme, T extends Supporte
13
13
  plaintext: PlaintextOf<S, T>;
14
14
  covalidatorSignature: Uint8Array;
15
15
  };
16
+ export type EncryptedDecryptionAttestation<S extends EncryptionScheme, T extends SupportedFheType> = {
17
+ handle: HexString;
18
+ encryptedPlaintext: EncryptResultOf<S, T>;
19
+ covalidatorSignature: Uint8Array;
20
+ };
16
21
  export type AttestedDecryptor<S extends EncryptionScheme> = <T extends SupportedFheType>(args: AttestedDecryptFnArgs<S, T>) => Promise<DecryptionAttestation<S, T>>;
17
22
  export type AttestedDecryptFnArgs<S extends EncryptionScheme, T extends SupportedFheType> = {
18
23
  /** The handle to decrypt */