@inco/js 0.6.9 → 0.7.1

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 (115) hide show
  1. package/README.md +8 -8
  2. package/dist/cjs/advancedacl/session-key.d.ts +39 -26
  3. package/dist/cjs/advancedacl/session-key.js +53 -136
  4. package/dist/cjs/attestedcompute/attested-compute.d.ts +6 -6
  5. package/dist/cjs/attestedcompute/attested-compute.js +5 -35
  6. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +36 -21
  7. package/dist/cjs/attesteddecrypt/attested-decrypt.js +107 -108
  8. package/dist/cjs/attesteddecrypt/types.d.ts +4 -4
  9. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  10. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  11. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
  12. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +3 -4
  13. package/dist/cjs/generated/lightning.d.ts +40 -0
  14. package/dist/cjs/generated/lightning.js +43 -1
  15. package/dist/cjs/generated/local-node.d.ts +11 -7
  16. package/dist/cjs/generated/local-node.js +28 -8
  17. package/dist/cjs/kms/client.d.ts +8 -4
  18. package/dist/cjs/kms/client.js +9 -4
  19. package/dist/cjs/kms/quorumClient.d.ts +58 -0
  20. package/dist/cjs/kms/quorumClient.js +378 -0
  21. package/dist/cjs/kms/thresholdPromises.d.ts +7 -0
  22. package/dist/cjs/kms/thresholdPromises.js +52 -0
  23. package/dist/cjs/lite/ecies.d.ts +2 -0
  24. package/dist/cjs/lite/ecies.js +5 -2
  25. package/dist/cjs/lite/index.d.ts +0 -1
  26. package/dist/cjs/lite/index.js +1 -2
  27. package/dist/cjs/lite/lightning.d.ts +110 -74
  28. package/dist/cjs/lite/lightning.js +272 -127
  29. package/dist/cjs/local/local-node.d.ts +1 -2
  30. package/dist/cjs/local/local-node.js +2 -3
  31. package/dist/cjs/test/mocks.d.ts +3 -0
  32. package/dist/cjs/test/mocks.js +19 -1
  33. package/dist/cjs/viem.d.ts +2 -4
  34. package/dist/cjs/viem.js +6 -2
  35. package/dist/esm/advancedacl/session-key.d.ts +39 -26
  36. package/dist/esm/advancedacl/session-key.js +44 -126
  37. package/dist/esm/attestedcompute/attested-compute.d.ts +6 -6
  38. package/dist/esm/attestedcompute/attested-compute.js +6 -36
  39. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +36 -21
  40. package/dist/esm/attesteddecrypt/attested-decrypt.js +106 -108
  41. package/dist/esm/attesteddecrypt/types.d.ts +4 -4
  42. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  43. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  44. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
  45. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +2 -3
  46. package/dist/esm/generated/lightning.d.ts +40 -0
  47. package/dist/esm/generated/lightning.js +43 -1
  48. package/dist/esm/generated/local-node.d.ts +11 -7
  49. package/dist/esm/generated/local-node.js +28 -8
  50. package/dist/esm/kms/client.d.ts +8 -4
  51. package/dist/esm/kms/client.js +8 -4
  52. package/dist/esm/kms/quorumClient.d.ts +58 -0
  53. package/dist/esm/kms/quorumClient.js +374 -0
  54. package/dist/esm/kms/thresholdPromises.d.ts +7 -0
  55. package/dist/esm/kms/thresholdPromises.js +49 -0
  56. package/dist/esm/lite/ecies.d.ts +2 -0
  57. package/dist/esm/lite/ecies.js +4 -2
  58. package/dist/esm/lite/index.d.ts +0 -1
  59. package/dist/esm/lite/index.js +1 -2
  60. package/dist/esm/lite/lightning.d.ts +110 -74
  61. package/dist/esm/lite/lightning.js +276 -131
  62. package/dist/esm/local/local-node.d.ts +1 -2
  63. package/dist/esm/local/local-node.js +2 -3
  64. package/dist/esm/test/mocks.d.ts +3 -0
  65. package/dist/esm/test/mocks.js +17 -1
  66. package/dist/esm/viem.d.ts +2 -4
  67. package/dist/esm/viem.js +6 -2
  68. package/dist/types/advancedacl/session-key.d.ts +39 -26
  69. package/dist/types/attestedcompute/attested-compute.d.ts +6 -6
  70. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +36 -21
  71. package/dist/types/attesteddecrypt/types.d.ts +4 -4
  72. package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  73. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +13 -5
  74. package/dist/types/generated/lightning.d.ts +40 -0
  75. package/dist/types/generated/local-node.d.ts +11 -7
  76. package/dist/types/kms/client.d.ts +8 -4
  77. package/dist/types/kms/quorumClient.d.ts +58 -0
  78. package/dist/types/kms/thresholdPromises.d.ts +7 -0
  79. package/dist/types/lite/ecies.d.ts +2 -0
  80. package/dist/types/lite/index.d.ts +0 -1
  81. package/dist/types/lite/lightning.d.ts +110 -74
  82. package/dist/types/local/local-node.d.ts +1 -2
  83. package/dist/types/test/mocks.d.ts +3 -0
  84. package/dist/types/viem.d.ts +2 -4
  85. package/package.json +6 -3
  86. package/dist/cjs/attestedreveal/attested-reveal.d.ts +0 -21
  87. package/dist/cjs/attestedreveal/attested-reveal.js +0 -69
  88. package/dist/cjs/attestedreveal/index.d.ts +0 -1
  89. package/dist/cjs/attestedreveal/index.js +0 -18
  90. package/dist/cjs/attestedreveal/types.d.ts +0 -7
  91. package/dist/cjs/attestedreveal/types.js +0 -16
  92. package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  93. package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.js +0 -118
  94. package/dist/cjs/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  95. package/dist/cjs/generated/es/inco/fhe/v1/types_pb.js +0 -136
  96. package/dist/cjs/lite/reencrypt.d.ts +0 -21
  97. package/dist/cjs/lite/reencrypt.js +0 -141
  98. package/dist/esm/attestedreveal/attested-reveal.d.ts +0 -21
  99. package/dist/esm/attestedreveal/attested-reveal.js +0 -66
  100. package/dist/esm/attestedreveal/index.d.ts +0 -1
  101. package/dist/esm/attestedreveal/index.js +0 -2
  102. package/dist/esm/attestedreveal/types.d.ts +0 -7
  103. package/dist/esm/attestedreveal/types.js +0 -12
  104. package/dist/esm/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  105. package/dist/esm/generated/es/cosmos_proto/cosmos_pb.js +0 -115
  106. package/dist/esm/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  107. package/dist/esm/generated/es/inco/fhe/v1/types_pb.js +0 -133
  108. package/dist/esm/lite/reencrypt.d.ts +0 -21
  109. package/dist/esm/lite/reencrypt.js +0 -131
  110. package/dist/types/attestedreveal/attested-reveal.d.ts +0 -21
  111. package/dist/types/attestedreveal/index.d.ts +0 -1
  112. package/dist/types/attestedreveal/types.d.ts +0 -7
  113. package/dist/types/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  114. package/dist/types/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  115. package/dist/types/lite/reencrypt.d.ts +0 -21
@@ -1,10 +1,8 @@
1
- import * as fs from 'fs/promises';
2
- import { getContract, hexToBytes, } from 'viem';
1
+ import { createPublicClient, getContract, hexToBytes, http, zeroAddress, } from 'viem';
3
2
  import { baseSepolia } from 'viem/chains';
4
- import { grantSessionKey, sessionKeyAttestedCompute, sessionKeyAttestedDecrypt, sessionKeyReencryptor, updateActiveVouchersSessionNonce, } from '../advancedacl/session-key.js';
5
- import { attestedCompute } from '../attestedcompute/attested-compute.js';
3
+ import { grantSessionKey, sessionKeyAttestedCompute, sessionKeyAttestedDecrypt, updateActiveVouchersSessionNonce, } from '../advancedacl/session-key.js';
4
+ import { attestedCompute as performAttestedCompute } from '../attestedcompute/attested-compute.js';
6
5
  import { attestedDecrypt } from '../attesteddecrypt/attested-decrypt.js';
7
- import { attestedReveal } from '../attestedreveal/attested-reveal.js';
8
6
  import { HexString, parseAddress } from '../binary.js';
9
7
  import { encryptionSchemes, } from '../encryption/index.js';
10
8
  import { incoLightningAbi } from '../generated/abis/lightning.js';
@@ -12,35 +10,56 @@ import { incoVerifierAbi } from '../generated/abis/verifier.js';
12
10
  import { lightningDeployments } from '../generated/lightning.js';
13
11
  import { localNodeLightningConfig } from '../generated/local-node.js';
14
12
  import { handleTypes } from '../handle.js';
13
+ import { getViemChain } from '../index.js';
14
+ import { KmsQuorumClient } from '../kms/quorumClient.js';
15
15
  import { parseLocalEnv } from '../local/index.js';
16
16
  import { parse } from '../schema.js';
17
- import { decodeSecp256k1PublicKey, generateSecp256k1Keypair, getEciesEncryptor, } from './ecies.js';
18
- import { getKmsClient, incoLiteReencryptor } from './reencrypt.js';
17
+ import { decodeSecp256k1PublicKey, generateSecp256k1Keypair, getEciesEncryptor, TEST_ECIES_PUB_KEY, } from './ecies.js';
19
18
  const DefaultPepper = 'testnet';
19
+ function isSecp256k1Keypair(value) {
20
+ return !!value && typeof value === 'object' && 'kp' in value;
21
+ }
22
+ function isLocalNodeEnvFileSource(value) {
23
+ return (!!value &&
24
+ typeof value === 'object' &&
25
+ 'filePath' in value &&
26
+ typeof value.filePath === 'string');
27
+ }
20
28
  /**
21
29
  * The Lightning class provides a convenient way to interact with the Inco Lightning contract by binding to a specific
22
30
  * deployment.
23
31
  */
24
32
  export class Lightning {
25
33
  _deployment;
26
- covalidatorUrl;
34
+ covalidatorUrls;
35
+ signers;
36
+ threshold;
37
+ eciesPubKey;
27
38
  executorAddress;
28
39
  chainId;
29
40
  ephemeralKeypair;
30
- kmsClient;
31
- constructor(_deployment, covalidatorUrl) {
41
+ kmsQuorumClient;
42
+ encryptor;
43
+ constructor(_deployment, covalidatorUrls, signers, threshold, eciesPubKey) {
32
44
  this._deployment = _deployment;
33
- this.covalidatorUrl = covalidatorUrl;
45
+ this.covalidatorUrls = covalidatorUrls;
46
+ this.signers = signers;
47
+ this.threshold = threshold;
48
+ this.eciesPubKey = eciesPubKey;
34
49
  this.executorAddress = parseAddress(_deployment.executorAddress);
35
50
  this.chainId = BigInt(_deployment.chainId);
36
51
  this.ephemeralKeypair = generateSecp256k1Keypair();
37
- this.kmsClient = getKmsClient(covalidatorUrl);
52
+ this.encryptor = getEciesEncryptor({
53
+ pubKeyA: decodeSecp256k1PublicKey(hexToBytes(parse(HexString, this.eciesPubKey))),
54
+ privKeyB: this.ephemeralKeypair,
55
+ });
56
+ this.kmsQuorumClient = KmsQuorumClient.fromUrls(this.covalidatorUrls, this.signers, this.threshold);
38
57
  }
39
58
  /**
40
59
  * Get a Lightning instance bound to the latest Lightning deployment for the Base Sepolia testnet.
41
60
  */
42
61
  static async baseSepoliaTestnet() {
43
- return await Lightning.latest('testnet', baseSepolia.id);
62
+ return Lightning.latest('testnet', baseSepolia.id);
44
63
  }
45
64
  /**
46
65
  * Get a Lightning instance bound to our canonical Anvil-based test node and test Covalidator node
@@ -59,18 +78,33 @@ export class Lightning {
59
78
  */
60
79
  static async localNode(env) {
61
80
  if (!env) {
62
- return await Lightning.custom(localNodeLightningConfig[DefaultPepper]);
81
+ const config = localNodeLightningConfig[DefaultPepper];
82
+ return Lightning.custom({
83
+ ...config,
84
+ covalidatorUrls: [...config.covalidatorUrls],
85
+ signers: config.signers.map((s) => parseAddress(s)),
86
+ });
63
87
  }
64
88
  if (typeof env === 'string') {
65
- return await Lightning.custom(localNodeLightningConfig[env]);
89
+ const config = localNodeLightningConfig[env];
90
+ return Lightning.custom({
91
+ ...config,
92
+ covalidatorUrls: [...config.covalidatorUrls],
93
+ signers: config.signers.map((s) => parseAddress(s)),
94
+ });
66
95
  }
67
96
  const conf = localNodeLightningConfig[DefaultPepper];
68
- return await Lightning.custom({
97
+ return Lightning.custom({
69
98
  // We assume that we always run a local node as the default anvil node
70
99
  chainId: env.COVALIDATOR_HOST_CHAIN_ID
71
100
  ? Number(env.COVALIDATOR_HOST_CHAIN_ID)
72
101
  : conf.chainId,
73
- covalidatorUrl: env.COVALIDATOR_URL ?? conf.covalidatorUrl,
102
+ covalidatorUrls: env.COVALIDATOR_URL
103
+ ? env.COVALIDATOR_URL.split(',')
104
+ : [...conf.covalidatorUrls],
105
+ signers: env.EIP712_SIGNER_ADDRESS
106
+ ? env.EIP712_SIGNER_ADDRESS.split(',').map((address) => parseAddress(address))
107
+ : conf.signers.map((s) => parseAddress(s)),
74
108
  hostChainRpcUrl: env.COVALIDATOR_HOST_CHAIN_RPC_URL ??
75
109
  conf.hostChainRpcUrl ??
76
110
  'http://localhost:8545',
@@ -84,9 +118,19 @@ export class Lightning {
84
118
  *
85
119
  * @param filePath the path to the file containing the environment variables in dotenv format
86
120
  */
87
- static async localNodeFromEnv(filePath) {
88
- const buf = filePath ? await fs.readFile(filePath) : undefined;
89
- const env = parseLocalEnv(buf);
121
+ static async localNodeFromEnv(source) {
122
+ let envContent;
123
+ if (isLocalNodeEnvFileSource(source)) {
124
+ if (typeof process === 'undefined' || !process.versions?.node) {
125
+ throw new Error('Lightning.localNodeFromEnv with a file path is only available in Node environments.');
126
+ }
127
+ const { readFile } = await import('fs/promises');
128
+ envContent = await readFile(source.filePath);
129
+ }
130
+ else {
131
+ envContent = source;
132
+ }
133
+ const env = parseLocalEnv(envContent);
90
134
  return await Lightning.localNode(env);
91
135
  }
92
136
  /**
@@ -102,7 +146,13 @@ export class Lightning {
102
146
  if (!deployment) {
103
147
  throw new Error(`No deployment found for ${JSON.stringify(id)}`);
104
148
  }
105
- return new Lightning(deployment, Lightning.getCovalidatorUrl(deployment));
149
+ const chain = getViemChain({ id: deployment.chainId });
150
+ const client = createPublicClient({
151
+ chain,
152
+ transport: http(),
153
+ });
154
+ const { threshold, signers, eciesPubKey } = await Lightning.getChainConfig(deployment, client);
155
+ return new Lightning(deployment, Lightning.getCovalidatorUrls(deployment, threshold), signers, threshold, eciesPubKey);
106
156
  }
107
157
  /**
108
158
  * Get a Lightning deployment for a local or custom node
@@ -111,21 +161,13 @@ export class Lightning {
111
161
  * additional fields past will be made available as part of the `deployment` property.
112
162
  */
113
163
  static async custom(config) {
114
- return new Lightning(config, config.covalidatorUrl);
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,
164
+ const chain = getViemChain({ id: config.chainId });
165
+ const client = createPublicClient({
166
+ chain,
167
+ transport: config.hostChainRpcUrl ? http(config.hostChainRpcUrl) : http(),
127
168
  });
128
- return await incoVerifier.read.eciesPubkey();
169
+ const { threshold, signers, eciesPubKey } = await Lightning.getVerifierContractDetails(config.executorAddress, client);
170
+ return new Lightning(config, config.covalidatorUrls, signers, threshold, eciesPubKey);
129
171
  }
130
172
  /**
131
173
  * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
@@ -150,10 +192,10 @@ export class Lightning {
150
192
  * will not be compatible with the new version.
151
193
  *
152
194
  * @param pepper the pepper to use to filter the deployments
153
- * @param chainId the chainId to use to filter the deployments
195
+ * @param chain the chain to use to filter the deployments
154
196
  */
155
197
  static async latest(pepper, chainId) {
156
- return await Lightning.at(Lightning.latestDeployment(pepper, chainId));
198
+ return Lightning.at(Lightning.latestDeployment(pepper, chainId));
157
199
  }
158
200
  /*
159
201
  * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
@@ -168,10 +210,15 @@ export class Lightning {
168
210
  * @param value a boolean or numeric value to encrypt
169
211
  * @param accountAddress the address of the account interacting with the dapp contract, normally an Externally Owned Account (EOA)
170
212
  * @param dappAddress the address of the dapp contract that interacts with the Inco Lightning contract or library
213
+ * @param handleType (optional) the handle type to be used for encrypting the value - this is required in case of non-default handle types
214
+ * default handle types:
215
+ * - boolean -> handleTypes.ebool
216
+ * - number | bigint -> handleTypes.euint256
217
+ * @returns a promise that resolves to the encrypted value as a HexString
171
218
  */
172
- async encrypt(value, { accountAddress, dappAddress }, encryptor) {
173
- const { ciphertext } = await encryptor({
174
- plaintext: Lightning.plaintextFromValue(value),
219
+ async encrypt(value, { accountAddress, dappAddress, handleType }) {
220
+ const { ciphertext } = await this.encryptor({
221
+ plaintext: Lightning.plaintextFromValue(value, handleType),
175
222
  context: {
176
223
  hostChainId: this.chainId,
177
224
  aclAddress: this.executorAddress,
@@ -181,27 +228,6 @@ export class Lightning {
181
228
  });
182
229
  return ciphertext.value;
183
230
  }
184
- /**
185
- * Obtain a reencryptor for a particular Externally Owned Account (EOA) to request decrypted values.
186
- * The account associated with the walletClient must have permissions to decrypt the handle or ciphertext passed
187
- * to the reencryptor function.
188
- *
189
- * @param walletClient the wallet client to use for signing the reencrypt request.
190
- */
191
- getReencryptor(walletClient) {
192
- return incoLiteReencryptor({
193
- walletClient,
194
- kmsConnectRpcEndpointOrClient: this.kmsClient,
195
- chainId: this.chainId,
196
- ephemeralKeypair: this.ephemeralKeypair,
197
- });
198
- }
199
- getEncryptor(eciesPubkey) {
200
- return getEciesEncryptor({
201
- pubKeyA: decodeSecp256k1PublicKey(hexToBytes(parse(HexString, eciesPubkey))),
202
- privKeyB: this.ephemeralKeypair,
203
- });
204
- }
205
231
  /**
206
232
  * Grants a session key allowance voucher for secure reencryption operations.
207
233
  *
@@ -235,31 +261,6 @@ export class Lightning {
235
261
  expiresAt,
236
262
  });
237
263
  }
238
- /**
239
- * Creates a session key reencryptor for secure data reencryption operations.
240
- *
241
- * This method returns a reencryptor instance that can be used to perform reencryption
242
- * operations using session keys. The reencryptor is configured with the provided
243
- * allowance voucher and ephemeral keypair for secure communication.
244
- *
245
- * @param allowanceVoucherWithSig - The signed allowance voucher obtained from grantSessionKeyAllowanceVoucher
246
- * @param ephemeralKeypair - The ephemeral keypair used for secure communication with the KMS make sure it has allowance to voucher
247
- * @returns A reencryptor instance configured for session key operations
248
- *
249
- * @example
250
- * ```typescript
251
- * const reencryptor = await lightning.getSessionKeyRencryptor(voucher, ephemeralKeypair);
252
- * const decryptedValue = await reencryptor({handle: resultHandle});
253
- * ```
254
- */
255
- getSessionKeyRencryptor(allowanceVoucherWithSig, ephemeralKeypair) {
256
- return sessionKeyReencryptor({
257
- chainId: this.chainId,
258
- kmsConnectRpcEndpointOrClient: this.kmsClient,
259
- ephemeralKeypair,
260
- allowanceVoucherWithSig,
261
- });
262
- }
263
264
  /**
264
265
  * Updates the active session nonce for the given wallet client.
265
266
  *
@@ -272,62 +273,142 @@ export class Lightning {
272
273
  updateActiveVouchersSessionNonce(walletClient) {
273
274
  return updateActiveVouchersSessionNonce(this.executorAddress, walletClient);
274
275
  }
275
- attestedDecrypt(arg1, arg2, arg3, arg4) {
276
- if (Array.isArray(arg2)) {
277
- const walletClient = arg1;
278
- const handles = arg2;
279
- const backoffConfig = arg3;
276
+ attestedDecrypt(walletClient, handles, arg3, arg4, arg5) {
277
+ if (arg3 instanceof Uint8Array) {
278
+ const reencryptPubKey = arg3;
279
+ let reencryptKeypair;
280
+ let backoffConfig;
281
+ if (arg4 && isSecp256k1Keypair(arg4)) {
282
+ reencryptKeypair = arg4;
283
+ backoffConfig = arg5;
284
+ }
285
+ else {
286
+ backoffConfig = arg4;
287
+ }
288
+ if (reencryptKeypair) {
289
+ return attestedDecrypt({
290
+ handles,
291
+ backoffConfig,
292
+ chainId: Number(this.chainId),
293
+ walletClient,
294
+ kmsQuorumClient: this.kmsQuorumClient,
295
+ reencryptPubKey,
296
+ reencryptKeypair,
297
+ });
298
+ }
280
299
  return attestedDecrypt({
281
300
  handles,
282
301
  backoffConfig,
283
302
  chainId: Number(this.chainId),
284
303
  walletClient,
285
- kmsConnectRpcEndpointOrClient: this.kmsClient,
304
+ kmsQuorumClient: this.kmsQuorumClient,
305
+ reencryptPubKey,
286
306
  });
287
307
  }
288
- else {
289
- const ephemeralKeypair = arg1;
290
- const allowanceVoucherWithSig = arg2;
291
- const handles = arg3;
292
- const backoffConfig = arg4;
308
+ const backoffConfig = arg3;
309
+ return attestedDecrypt({
310
+ handles,
311
+ backoffConfig,
312
+ chainId: Number(this.chainId),
313
+ walletClient,
314
+ kmsQuorumClient: this.kmsQuorumClient,
315
+ });
316
+ }
317
+ attestedDecryptWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, handles, arg4, arg5, arg6) {
318
+ if (arg4 instanceof Uint8Array) {
319
+ const reencryptPubKey = arg4;
320
+ let reencryptKeypair;
321
+ let backoffConfig;
322
+ if (arg5 && isSecp256k1Keypair(arg5)) {
323
+ reencryptKeypair = arg5;
324
+ backoffConfig = arg6;
325
+ }
326
+ else {
327
+ backoffConfig = arg5;
328
+ }
329
+ if (reencryptKeypair) {
330
+ return sessionKeyAttestedDecrypt({
331
+ backoffConfig,
332
+ chainId: Number(this.chainId),
333
+ kmsQuorumClient: this.kmsQuorumClient,
334
+ ephemeralKeypair,
335
+ allowanceVoucherWithSig,
336
+ handles,
337
+ reencryptPubKey,
338
+ reencryptKeypair,
339
+ });
340
+ }
293
341
  return sessionKeyAttestedDecrypt({
294
342
  backoffConfig,
295
343
  chainId: Number(this.chainId),
296
- kmsConnectRpcEndpointOrClient: this.kmsClient,
344
+ kmsQuorumClient: this.kmsQuorumClient,
297
345
  ephemeralKeypair,
298
346
  allowanceVoucherWithSig,
299
347
  handles,
348
+ reencryptPubKey,
300
349
  });
301
350
  }
351
+ const backoffConfig = arg4;
352
+ return sessionKeyAttestedDecrypt({
353
+ backoffConfig,
354
+ chainId: Number(this.chainId),
355
+ kmsQuorumClient: this.kmsQuorumClient,
356
+ ephemeralKeypair,
357
+ allowanceVoucherWithSig,
358
+ handles,
359
+ });
302
360
  }
303
- attestedCompute(arg1, lhsHandle, op, rhsPlaintext, arg5, arg6) {
304
- if (typeof arg5 === 'object' &&
305
- arg5 !== null &&
306
- 'voucher' in arg5 &&
307
- 'voucherSignature' in arg5 &&
308
- 'sharer' in arg5) {
309
- // Session-key path
310
- const ephemeralKeypair = arg1;
311
- const allowanceVoucherWithSig = arg5;
312
- const backoffConfig = arg6;
313
- return sessionKeyAttestedCompute({
314
- chainId: Number(this.chainId),
315
- kmsConnectRpcEndpointOrClient: this.kmsClient,
316
- ephemeralKeypair,
317
- allowanceVoucherWithSig,
318
- lhsHandle,
319
- op,
320
- rhsPlaintext,
321
- backoffConfig,
322
- });
323
- }
324
- // Wallet-client path
325
- const walletClient = arg1;
326
- const backoffConfig = arg5;
327
- return attestedCompute({
361
+ /**
362
+ * Get an attested compute for the given wallet client.
363
+ *
364
+ * @param walletClient - The wallet client used for signing the attested compute request
365
+ * @param lhsHandle - The handle to compute
366
+ * @param op - The operation to perform
367
+ * @param rhsPlaintext - The plaintext to compute with
368
+ * @param backoffConfig - The backoff configuration for the attested compute request
369
+ * @returns The decryption attestation
370
+ *
371
+ * @example
372
+ * ```typescript
373
+ * import { AttestedComputeSupportedOps } from '../lite/attested-compute.js';
374
+ * const lhsHandle = '0x...';
375
+ * const rhsPlaintext = 1337n;
376
+ * const op = AttestedComputeSupportedOps.Eq;
377
+ * const response = await lightning.attestedCompute(walletClient, lhsHandle, op, rhsPlaintext);
378
+ * const { plaintext, covalidatorSignature, handle } = response;
379
+ * ```
380
+ */
381
+ attestedCompute(walletClient, lhsHandle, op, rhsPlaintext, backoffConfig) {
382
+ return performAttestedCompute({
328
383
  walletClient,
329
- kmsConnectRpcEndpointOrClient: this.kmsClient,
384
+ kmsQuorumClient: this.kmsQuorumClient,
385
+ chainId: Number(this.chainId),
386
+ lhsHandle,
387
+ op,
388
+ rhsPlaintext,
389
+ backoffConfig,
390
+ });
391
+ }
392
+ /**
393
+ * Performs attested compute via a voucher-backed session key.
394
+ *
395
+ * @example
396
+ * ```ts
397
+ * const attestation = await lightning.attestedComputeWithVoucher(
398
+ * ephemeralKeypair,
399
+ * voucher,
400
+ * lhsHandle,
401
+ * AttestedComputeSupportedOps.Eq,
402
+ * true,
403
+ * );
404
+ * ```
405
+ */
406
+ attestedComputeWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, lhsHandle, op, rhsPlaintext, backoffConfig) {
407
+ return sessionKeyAttestedCompute({
330
408
  chainId: Number(this.chainId),
409
+ kmsQuorumClient: this.kmsQuorumClient,
410
+ ephemeralKeypair,
411
+ allowanceVoucherWithSig,
331
412
  lhsHandle,
332
413
  op,
333
414
  rhsPlaintext,
@@ -348,24 +429,24 @@ export class Lightning {
348
429
  * ```
349
430
  */
350
431
  attestedReveal(handles, backoffConfig) {
351
- return attestedReveal({
432
+ return attestedDecrypt({
352
433
  handles,
353
434
  backoffConfig,
354
435
  chainId: Number(this.chainId),
355
- kmsConnectRpcEndpointOrClient: this.kmsClient,
436
+ kmsQuorumClient: this.kmsQuorumClient,
356
437
  });
357
438
  }
358
439
  /**
359
440
  * Get the GRPC endpoint for the covalidator that services this deployment.
360
441
  */
361
- static getCovalidatorUrl(deployment) {
442
+ static getCovalidatorUrls(deployment, threshold) {
362
443
  const { executorAddress, chainId, pepper } = deployment;
363
- return `https://${executorAddress.toLowerCase()}.${chainId}.${pepper}.inco.org`;
444
+ return Array.from({ length: threshold }, (_, i) => `https://${executorAddress.toLowerCase()}.${chainId}.${pepper}.${i + 1}.inco.org`);
364
445
  }
365
446
  static isIdByName(id) {
366
447
  return id.name !== undefined;
367
448
  }
368
- static plaintextFromValue(value) {
449
+ static plaintextFromValue(value, type) {
369
450
  if (typeof value === 'boolean') {
370
451
  return {
371
452
  scheme: encryptionSchemes.ecies,
@@ -376,7 +457,7 @@ export class Lightning {
376
457
  else if (typeof value === 'bigint' || typeof value === 'number') {
377
458
  return {
378
459
  scheme: encryptionSchemes.ecies,
379
- type: handleTypes.euint256,
460
+ type: type ?? handleTypes.euint256,
380
461
  value: BigInt(value),
381
462
  };
382
463
  }
@@ -384,5 +465,69 @@ export class Lightning {
384
465
  throw new Error(`Unsupported type ${typeof value}`);
385
466
  }
386
467
  }
468
+ static async getEciesPublicKey(client, executorAddress) {
469
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
470
+ return await incoVerifier.read.eciesPubkey();
471
+ }
472
+ static async getIncoVerifierContract(client, executorAddress) {
473
+ const incoLightningContract = getContract({
474
+ abi: incoLightningAbi,
475
+ address: executorAddress,
476
+ client,
477
+ });
478
+ const incoVerifierAddress = await incoLightningContract.read.incoVerifier();
479
+ const incoVerifier = getContract({
480
+ abi: incoVerifierAbi,
481
+ address: incoVerifierAddress,
482
+ client,
483
+ });
484
+ console.log('inco executor', incoLightningContract.address);
485
+ console.log('inco verifier', incoVerifier.address);
486
+ return incoVerifier;
487
+ }
488
+ /**
489
+ * Retrieves the verifier contract details including threshold, signers, and ECIES public key from the Inco Verifier contract.
490
+ *
491
+ * @param executorAddress The address of the Inco Lightning executor contract.
492
+ * @param client The public client to interact with the blockchain.
493
+ * @returns An object containing the threshold, signers, and ECIES public key.
494
+ */
495
+ static async getVerifierContractDetails(executorAddress, client) {
496
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
497
+ const threshold = await incoVerifier.read.getThreshold();
498
+ const eciesPubKey = await incoVerifier.read.eciesPubkey();
499
+ const signersCount = await incoVerifier.read.getSignersCount();
500
+ const signersPromises = [];
501
+ for (let i = BigInt(0); i < signersCount; i++) {
502
+ signersPromises.push(incoVerifier.read.getSignerAtIndex([i]));
503
+ }
504
+ const signers = await Promise.all(signersPromises);
505
+ return {
506
+ threshold: Number(threshold),
507
+ signers: signers.map(parseAddress),
508
+ eciesPubKey,
509
+ };
510
+ }
511
+ static async getChainConfig(deployment, client) {
512
+ if (this.supportsThresholdRetrieval(deployment)) {
513
+ return await this.getVerifierContractDetails(deployment.executorAddress, client);
514
+ }
515
+ return this.getDefaultThresholdAndSigners();
516
+ }
517
+ // Check if the deployment supports threshold retrieval based on its version
518
+ static supportsThresholdRetrieval(deployment) {
519
+ // Assumes that the threshold retrieval is supported if the smart contract / deployment version is greater than or equal to 1.1.0
520
+ return deployment.version?.major >= 1 && deployment.version?.minor >= 1;
521
+ }
522
+ // NOTE: we are proceeding with lot's of state braking changes and the defaults below can be removed
523
+ // once all deployments support threshold. signers and ecies pub key retrieval
524
+ // For now this is added to ensure that the tests that we have using previous deployments continue to work
525
+ static getDefaultThresholdAndSigners() {
526
+ return {
527
+ threshold: 1,
528
+ signers: [zeroAddress],
529
+ eciesPubKey: TEST_ECIES_PUB_KEY,
530
+ };
531
+ }
387
532
  }
388
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xDLE9BQU8sRUFHTCxXQUFXLEVBQ1gsVUFBVSxHQUlYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIscUJBQXFCLEVBQ3JCLGdDQUFnQyxHQUNqQyxNQUFNLCtCQUErQixDQUFDO0FBRXZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVyxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRWhFLE9BQU8sRUFFTCxpQkFBaUIsR0FJbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR2hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUNMLHdCQUF3QixFQUN4Qix3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
533
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsV0FBVyxFQUVYLFVBQVUsRUFDVixJQUFJLEVBSUosV0FBVyxHQUNaLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsZ0NBQWdDLEdBQ2pDLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsT0FBTyxFQUFFLGVBQWUsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRW5HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUt6RSxPQUFPLEVBQVcsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVoRSxPQUFPLEVBRUwsaUJBQWlCLEdBSWxCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBVyxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFnQixhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FB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
@@ -4,13 +4,12 @@ export declare const LocalNodeEnv: Schema.Struct<{
4
4
  STATE_DUMP: typeof Schema.String;
5
5
  EXECUTOR_ADDRESS: Schema.brand<Schema.filter<Schema.TemplateLiteral<`0x${string}`>>, "Address">;
6
6
  ECIES_PUBLIC_KEY: Schema.TemplateLiteral<`0x${string}`>;
7
- CALLBACK_ADDRESS: Schema.TemplateLiteral<`0x${string}`>;
8
7
  SENDER_ADDRESS: Schema.brand<Schema.filter<Schema.TemplateLiteral<`0x${string}`>>, "Address">;
9
8
  SENDER_PRIVATE_KEY: Schema.TemplateLiteral<`0x${string}`>;
9
+ EIP712_SIGNER_ADDRESS: Schema.optional<Schema.TemplateLiteral<`0x${string}`>>;
10
10
  PEPPER: typeof Schema.String;
11
11
  COVALIDATOR_ECIES_PRIVATE_KEY: Schema.TemplateLiteral<`0x${string}`>;
12
12
  COVALIDATOR_EIP712_PRIVATE_SIGNING_KEY: Schema.TemplateLiteral<`0x${string}`>;
13
- COVALIDATOR_CALLBACK_PRIVATE_KEY: Schema.TemplateLiteral<`0x${string}`>;
14
13
  COVALIDATOR_ACL_ADDR: Schema.brand<Schema.filter<Schema.TemplateLiteral<`0x${string}`>>, "Address">;
15
14
  COVALIDATOR_INCO_EXECUTOR_ADDR: Schema.brand<Schema.filter<Schema.TemplateLiteral<`0x${string}`>>, "Address">;
16
15
  COVALIDATOR_DECRYPTION_HANDLER_ADDR: Schema.brand<Schema.filter<Schema.TemplateLiteral<`0x${string}`>>, "Address">;