@inco/js 0.7.0 → 0.7.2

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 (56) hide show
  1. package/dist/cjs/advancedacl/session-key.d.ts +9 -3
  2. package/dist/cjs/advancedacl/session-key.js +18 -7
  3. package/dist/cjs/attestedcompute/attested-compute.d.ts +32 -4
  4. package/dist/cjs/attestedcompute/attested-compute.js +13 -13
  5. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +12 -6
  6. package/dist/cjs/attesteddecrypt/attested-decrypt.js +40 -7
  7. package/dist/cjs/attesteddecrypt/types.d.ts +1 -0
  8. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +28 -14
  9. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +2 -2
  10. package/dist/cjs/kms/quorumClient.d.ts +1 -1
  11. package/dist/cjs/kms/quorumClient.js +118 -17
  12. package/dist/cjs/lite/attested-compute.d.ts +2 -2
  13. package/dist/cjs/lite/attested-compute.js +3 -3
  14. package/dist/cjs/lite/attested-decrypt.d.ts +2 -2
  15. package/dist/cjs/lite/attested-decrypt.js +3 -3
  16. package/dist/cjs/lite/ecies.d.ts +2 -0
  17. package/dist/cjs/lite/ecies.js +5 -2
  18. package/dist/cjs/lite/lightning.d.ts +99 -23
  19. package/dist/cjs/lite/lightning.js +165 -86
  20. package/dist/cjs/test/mocks.js +4 -2
  21. package/dist/cjs/viem.d.ts +2 -4
  22. package/dist/cjs/viem.js +6 -2
  23. package/dist/esm/advancedacl/session-key.d.ts +9 -3
  24. package/dist/esm/advancedacl/session-key.js +20 -9
  25. package/dist/esm/attestedcompute/attested-compute.d.ts +32 -4
  26. package/dist/esm/attestedcompute/attested-compute.js +14 -14
  27. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +12 -6
  28. package/dist/esm/attesteddecrypt/attested-decrypt.js +39 -7
  29. package/dist/esm/attesteddecrypt/types.d.ts +1 -0
  30. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +28 -14
  31. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +2 -2
  32. package/dist/esm/kms/quorumClient.d.ts +1 -1
  33. package/dist/esm/kms/quorumClient.js +118 -17
  34. package/dist/esm/lite/attested-compute.d.ts +2 -2
  35. package/dist/esm/lite/attested-compute.js +3 -3
  36. package/dist/esm/lite/attested-decrypt.d.ts +2 -2
  37. package/dist/esm/lite/attested-decrypt.js +3 -3
  38. package/dist/esm/lite/ecies.d.ts +2 -0
  39. package/dist/esm/lite/ecies.js +4 -2
  40. package/dist/esm/lite/lightning.d.ts +99 -23
  41. package/dist/esm/lite/lightning.js +166 -87
  42. package/dist/esm/test/mocks.js +4 -2
  43. package/dist/esm/viem.d.ts +2 -4
  44. package/dist/esm/viem.js +6 -2
  45. package/dist/types/advancedacl/session-key.d.ts +9 -3
  46. package/dist/types/attestedcompute/attested-compute.d.ts +32 -4
  47. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +12 -6
  48. package/dist/types/attesteddecrypt/types.d.ts +1 -0
  49. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +28 -14
  50. package/dist/types/kms/quorumClient.d.ts +1 -1
  51. package/dist/types/lite/attested-compute.d.ts +2 -2
  52. package/dist/types/lite/attested-decrypt.d.ts +2 -2
  53. package/dist/types/lite/ecies.d.ts +2 -0
  54. package/dist/types/lite/lightning.d.ts +99 -23
  55. package/dist/types/viem.d.ts +2 -4
  56. package/package.json +5 -2
@@ -37,19 +37,26 @@ class Lightning {
37
37
  covalidatorUrls;
38
38
  signers;
39
39
  threshold;
40
+ eciesPubKey;
40
41
  executorAddress;
41
42
  chainId;
42
43
  ephemeralKeypair;
43
44
  kmsQuorumClient;
44
- constructor(_deployment, covalidatorUrls, signers, threshold) {
45
+ encryptor;
46
+ constructor(_deployment, covalidatorUrls, signers, threshold, eciesPubKey) {
45
47
  this._deployment = _deployment;
46
48
  this.covalidatorUrls = covalidatorUrls;
47
49
  this.signers = signers;
48
50
  this.threshold = threshold;
51
+ this.eciesPubKey = eciesPubKey;
49
52
  this.executorAddress = (0, binary_js_1.parseAddress)(_deployment.executorAddress);
50
53
  this.chainId = BigInt(_deployment.chainId);
51
54
  this.ephemeralKeypair = (0, ecies_js_1.generateSecp256k1Keypair)();
52
- this.kmsQuorumClient = quorumClient_js_1.KmsQuorumClient.fromUrls(covalidatorUrls, signers, threshold);
55
+ this.encryptor = (0, ecies_js_1.getEciesEncryptor)({
56
+ pubKeyA: (0, ecies_js_1.decodeSecp256k1PublicKey)((0, viem_1.hexToBytes)((0, schema_js_1.parse)(binary_js_1.HexString, this.eciesPubKey))),
57
+ privKeyB: this.ephemeralKeypair,
58
+ });
59
+ this.kmsQuorumClient = quorumClient_js_1.KmsQuorumClient.fromUrls(this.covalidatorUrls, this.signers, this.threshold);
53
60
  }
54
61
  /**
55
62
  * Get a Lightning instance bound to the latest Lightning deployment for the Base Sepolia testnet.
@@ -142,8 +149,13 @@ class Lightning {
142
149
  if (!deployment) {
143
150
  throw new Error(`No deployment found for ${JSON.stringify(id)}`);
144
151
  }
145
- const { threshold, signers } = await Lightning.getThresholdAndSigners(deployment);
146
- return new Lightning(deployment, Lightning.getCovalidatorUrls(deployment, threshold), signers, threshold);
152
+ const chain = (0, index_js_2.getViemChain)({ id: deployment.chainId });
153
+ const client = (0, viem_1.createPublicClient)({
154
+ chain,
155
+ transport: (0, viem_1.http)(),
156
+ });
157
+ const { threshold, signers, eciesPubKey } = await Lightning.getChainConfig(deployment, client);
158
+ return new Lightning(deployment, Lightning.getCovalidatorUrls(deployment, threshold), signers, threshold, eciesPubKey);
147
159
  }
148
160
  /**
149
161
  * Get a Lightning deployment for a local or custom node
@@ -152,22 +164,13 @@ class Lightning {
152
164
  * additional fields past will be made available as part of the `deployment` property.
153
165
  */
154
166
  static async custom(config) {
155
- const { threshold, signers } = await Lightning.getContractThresholdAndSigners(config.executorAddress, config.chainId, config.hostChainRpcUrl);
156
- return new Lightning(config, config.covalidatorUrls, signers, threshold);
157
- }
158
- static async getEciesPublicKey(client, executorAddress) {
159
- const incoLightningContract = (0, viem_1.getContract)({
160
- abi: lightning_js_1.incoLightningAbi,
161
- address: executorAddress,
162
- client,
163
- });
164
- const incoVerifierAddress = await incoLightningContract.read.incoVerifier();
165
- const incoVerifier = (0, viem_1.getContract)({
166
- abi: verifier_js_1.incoVerifierAbi,
167
- address: incoVerifierAddress,
168
- client,
167
+ const chain = (0, index_js_2.getViemChain)({ id: config.chainId });
168
+ const client = (0, viem_1.createPublicClient)({
169
+ chain,
170
+ transport: config.hostChainRpcUrl ? (0, viem_1.http)(config.hostChainRpcUrl) : (0, viem_1.http)(),
169
171
  });
170
- return await incoVerifier.read.eciesPubkey();
172
+ const { threshold, signers, eciesPubKey } = await Lightning.getVerifierContractDetails(config.executorAddress, client);
173
+ return new Lightning(config, config.covalidatorUrls, signers, threshold, eciesPubKey);
171
174
  }
172
175
  /**
173
176
  * Get the latest deployment for a given pepper, which usually denotes a family of deployments distinct from their
@@ -210,10 +213,15 @@ class Lightning {
210
213
  * @param value a boolean or numeric value to encrypt
211
214
  * @param accountAddress the address of the account interacting with the dapp contract, normally an Externally Owned Account (EOA)
212
215
  * @param dappAddress the address of the dapp contract that interacts with the Inco Lightning contract or library
216
+ * @param handleType (optional) the handle type to be used for encrypting the value - this is required in case of non-default handle types
217
+ * default handle types:
218
+ * - boolean -> handleTypes.ebool
219
+ * - number | bigint -> handleTypes.euint256
220
+ * @returns a promise that resolves to the encrypted value as a HexString
213
221
  */
214
- async encrypt(value, { accountAddress, dappAddress }, encryptor) {
215
- const { ciphertext } = await encryptor({
216
- plaintext: Lightning.plaintextFromValue(value),
222
+ async encrypt(value, { accountAddress, dappAddress, handleType }) {
223
+ const { ciphertext } = await this.encryptor({
224
+ plaintext: Lightning.plaintextFromValue(value, handleType),
217
225
  context: {
218
226
  hostChainId: this.chainId,
219
227
  aclAddress: this.executorAddress,
@@ -223,18 +231,6 @@ class Lightning {
223
231
  });
224
232
  return ciphertext.value;
225
233
  }
226
- /**
227
- * Get the encryptor for a specific ECIES public key.
228
- *
229
- * @param eciesPubkey the ECIES public key to use for encryption
230
- * @returns an Encryptor instance configured for the specified ECIES public key
231
- */
232
- getEncryptor(eciesPubkey) {
233
- return (0, ecies_js_1.getEciesEncryptor)({
234
- pubKeyA: (0, ecies_js_1.decodeSecp256k1PublicKey)((0, viem_1.hexToBytes)((0, schema_js_1.parse)(binary_js_1.HexString, eciesPubkey))),
235
- privKeyB: this.ephemeralKeypair,
236
- });
237
- }
238
234
  /**
239
235
  * Grants a session key allowance voucher for secure reencryption operations.
240
236
  *
@@ -299,11 +295,13 @@ class Lightning {
299
295
  chainId: Number(this.chainId),
300
296
  walletClient,
301
297
  kmsQuorumClient: this.kmsQuorumClient,
298
+ executorAddress: this.executorAddress,
302
299
  reencryptPubKey,
303
300
  reencryptKeypair,
304
301
  });
305
302
  }
306
303
  return (0, attested_decrypt_js_1.attestedDecrypt)({
304
+ executorAddress: this.executorAddress,
307
305
  handles,
308
306
  backoffConfig,
309
307
  chainId: Number(this.chainId),
@@ -319,9 +317,10 @@ class Lightning {
319
317
  chainId: Number(this.chainId),
320
318
  walletClient,
321
319
  kmsQuorumClient: this.kmsQuorumClient,
320
+ executorAddress: this.executorAddress,
322
321
  });
323
322
  }
324
- attestedDecryptWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, handles, arg4, arg5, arg6) {
323
+ attestedDecryptWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, ethClient, handles, arg4, arg5, arg6) {
325
324
  if (arg4 instanceof Uint8Array) {
326
325
  const reencryptPubKey = arg4;
327
326
  let reencryptKeypair;
@@ -343,6 +342,8 @@ class Lightning {
343
342
  handles,
344
343
  reencryptPubKey,
345
344
  reencryptKeypair,
345
+ ethClient,
346
+ executorAddress: this.executorAddress,
346
347
  });
347
348
  }
348
349
  return (0, session_key_js_1.sessionKeyAttestedDecrypt)({
@@ -353,6 +354,8 @@ class Lightning {
353
354
  allowanceVoucherWithSig,
354
355
  handles,
355
356
  reencryptPubKey,
357
+ ethClient,
358
+ executorAddress: this.executorAddress,
356
359
  });
357
360
  }
358
361
  const backoffConfig = arg4;
@@ -363,30 +366,53 @@ class Lightning {
363
366
  ephemeralKeypair,
364
367
  allowanceVoucherWithSig,
365
368
  handles,
369
+ ethClient,
370
+ executorAddress: this.executorAddress,
366
371
  });
367
372
  }
368
- /**
369
- * Get an attested compute for the given wallet client.
370
- *
371
- * @param walletClient - The wallet client used for signing the attested compute request
372
- * @param lhsHandle - The handle to compute
373
- * @param op - The operation to perform
374
- * @param rhsPlaintext - The plaintext to compute with
375
- * @param backoffConfig - The backoff configuration for the attested compute request
376
- * @returns The decryption attestation
377
- *
378
- * @example
379
- * ```typescript
380
- * import { AttestedComputeSupportedOps } from '../lite/attested-compute.js';
381
- * const lhsHandle = '0x...';
382
- * const rhsPlaintext = 1337n;
383
- * const op = AttestedComputeSupportedOps.Eq;
384
- * const response = await lightning.attestedCompute(walletClient, lhsHandle, op, rhsPlaintext);
385
- * const { plaintext, covalidatorSignature, handle } = response;
386
- * ```
387
- */
388
- attestedCompute(walletClient, lhsHandle, op, rhsPlaintext, backoffConfig) {
373
+ attestedCompute(walletClient, lhsHandle, op, rhsPlaintext, arg5, arg6, arg7) {
374
+ // Reencrypt path (with or without local keypair)
375
+ if (arg5 instanceof Uint8Array) {
376
+ const reencryptPubKey = arg5;
377
+ let reencryptKeypair;
378
+ let backoffConfig;
379
+ if (arg6 && isSecp256k1Keypair(arg6)) {
380
+ reencryptKeypair = arg6;
381
+ backoffConfig = arg7;
382
+ }
383
+ else {
384
+ backoffConfig = arg6;
385
+ }
386
+ if (reencryptKeypair) {
387
+ return (0, attested_compute_js_1.attestedCompute)({
388
+ executorAddress: this.executorAddress,
389
+ walletClient,
390
+ kmsQuorumClient: this.kmsQuorumClient,
391
+ chainId: Number(this.chainId),
392
+ lhsHandle,
393
+ op,
394
+ rhsPlaintext,
395
+ reencryptPubKey,
396
+ reencryptKeypair,
397
+ backoffConfig,
398
+ });
399
+ }
400
+ return (0, attested_compute_js_1.attestedCompute)({
401
+ executorAddress: this.executorAddress,
402
+ walletClient,
403
+ kmsQuorumClient: this.kmsQuorumClient,
404
+ chainId: Number(this.chainId),
405
+ lhsHandle,
406
+ op,
407
+ rhsPlaintext,
408
+ reencryptPubKey,
409
+ backoffConfig,
410
+ });
411
+ }
412
+ // Plaintext path
413
+ const backoffConfig = arg5;
389
414
  return (0, attested_compute_js_1.attestedCompute)({
415
+ executorAddress: this.executorAddress,
390
416
  walletClient,
391
417
  kmsQuorumClient: this.kmsQuorumClient,
392
418
  chainId: Number(this.chainId),
@@ -396,21 +422,51 @@ class Lightning {
396
422
  backoffConfig,
397
423
  });
398
424
  }
399
- /**
400
- * Performs attested compute via a voucher-backed session key.
401
- *
402
- * @example
403
- * ```ts
404
- * const attestation = await lightning.attestedComputeWithVoucher(
405
- * ephemeralKeypair,
406
- * voucher,
407
- * lhsHandle,
408
- * AttestedComputeSupportedOps.Eq,
409
- * true,
410
- * );
411
- * ```
412
- */
413
- attestedComputeWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, lhsHandle, op, rhsPlaintext, backoffConfig) {
425
+ attestedComputeWithVoucher(ephemeralKeypair, allowanceVoucherWithSig, ethClient, lhsHandle, op, rhsPlaintext, arg6, arg7, arg8) {
426
+ // Reencrypt path (with or without local keypair)
427
+ if (arg6 instanceof Uint8Array) {
428
+ const reencryptPubKey = arg6;
429
+ let reencryptKeypair;
430
+ let backoffConfig;
431
+ if (arg7 && isSecp256k1Keypair(arg7)) {
432
+ reencryptKeypair = arg7;
433
+ backoffConfig = arg8;
434
+ }
435
+ else {
436
+ backoffConfig = arg7;
437
+ }
438
+ if (reencryptKeypair) {
439
+ return (0, session_key_js_1.sessionKeyAttestedCompute)({
440
+ chainId: Number(this.chainId),
441
+ kmsQuorumClient: this.kmsQuorumClient,
442
+ ephemeralKeypair,
443
+ allowanceVoucherWithSig,
444
+ lhsHandle,
445
+ op,
446
+ rhsPlaintext,
447
+ ethClient,
448
+ executorAddress: this.executorAddress,
449
+ reencryptPubKey,
450
+ reencryptKeypair,
451
+ backoffConfig,
452
+ });
453
+ }
454
+ return (0, session_key_js_1.sessionKeyAttestedCompute)({
455
+ chainId: Number(this.chainId),
456
+ kmsQuorumClient: this.kmsQuorumClient,
457
+ ephemeralKeypair,
458
+ allowanceVoucherWithSig,
459
+ lhsHandle,
460
+ op,
461
+ rhsPlaintext,
462
+ ethClient,
463
+ executorAddress: this.executorAddress,
464
+ reencryptPubKey,
465
+ backoffConfig,
466
+ });
467
+ }
468
+ // Plaintext path
469
+ const backoffConfig = arg6;
414
470
  return (0, session_key_js_1.sessionKeyAttestedCompute)({
415
471
  chainId: Number(this.chainId),
416
472
  kmsQuorumClient: this.kmsQuorumClient,
@@ -419,6 +475,8 @@ class Lightning {
419
475
  lhsHandle,
420
476
  op,
421
477
  rhsPlaintext,
478
+ ethClient,
479
+ executorAddress: this.executorAddress,
422
480
  backoffConfig,
423
481
  });
424
482
  }
@@ -431,12 +489,13 @@ class Lightning {
431
489
  *
432
490
  * @example
433
491
  * ```typescript
434
- * const response = await lightning.attestedReveal([handle1, handle2]);
492
+ * const response = await lightning.attestedReveal([handle1, handle2], ethClient);
435
493
  * const { plaintext, covalidatorSignature } = response[0];
436
494
  * ```
437
495
  */
438
496
  attestedReveal(handles, backoffConfig) {
439
497
  return (0, attested_decrypt_js_1.attestedDecrypt)({
498
+ executorAddress: this.executorAddress,
440
499
  handles,
441
500
  backoffConfig,
442
501
  chainId: Number(this.chainId),
@@ -448,12 +507,14 @@ class Lightning {
448
507
  */
449
508
  static getCovalidatorUrls(deployment, threshold) {
450
509
  const { executorAddress, chainId, pepper } = deployment;
451
- return Array.from({ length: threshold }, (_, i) => `https://${executorAddress.toLowerCase()}.${chainId}.${pepper}-${i + 1}.inco.org`);
510
+ return Array.from({ length: threshold }, (_, i) =>
511
+ // TODO: add the index to the URL #1276
512
+ `https://${executorAddress.toLowerCase()}.${chainId}.${pepper}.inco.org`);
452
513
  }
453
514
  static isIdByName(id) {
454
515
  return id.name !== undefined;
455
516
  }
456
- static plaintextFromValue(value) {
517
+ static plaintextFromValue(value, type) {
457
518
  if (typeof value === 'boolean') {
458
519
  return {
459
520
  scheme: index_js_1.encryptionSchemes.ecies,
@@ -464,7 +525,7 @@ class Lightning {
464
525
  else if (typeof value === 'bigint' || typeof value === 'number') {
465
526
  return {
466
527
  scheme: index_js_1.encryptionSchemes.ecies,
467
- type: handle_js_1.handleTypes.euint256,
528
+ type: type ?? handle_js_1.handleTypes.euint256,
468
529
  value: BigInt(value),
469
530
  };
470
531
  }
@@ -472,13 +533,11 @@ class Lightning {
472
533
  throw new Error(`Unsupported type ${typeof value}`);
473
534
  }
474
535
  }
475
- // Add utility method to get threshold from contract
476
- static async getContractThresholdAndSigners(executorAddress, chainId, hostChainRpcUrl) {
477
- const chain = (0, index_js_2.getViemChain)({ id: chainId });
478
- const client = (0, viem_1.createPublicClient)({
479
- chain,
480
- transport: hostChainRpcUrl ? (0, viem_1.http)(hostChainRpcUrl) : (0, viem_1.http)(),
481
- });
536
+ static async getEciesPublicKey(client, executorAddress) {
537
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
538
+ return await incoVerifier.read.eciesPubkey();
539
+ }
540
+ static async getIncoVerifierContract(client, executorAddress) {
482
541
  const incoLightningContract = (0, viem_1.getContract)({
483
542
  abi: lightning_js_1.incoLightningAbi,
484
543
  address: executorAddress,
@@ -492,18 +551,34 @@ class Lightning {
492
551
  });
493
552
  console.log('inco executor', incoLightningContract.address);
494
553
  console.log('inco verifier', incoVerifier.address);
554
+ return incoVerifier;
555
+ }
556
+ /**
557
+ * Retrieves the verifier contract details including threshold, signers, and ECIES public key from the Inco Verifier contract.
558
+ *
559
+ * @param executorAddress The address of the Inco Lightning executor contract.
560
+ * @param client The public client to interact with the blockchain.
561
+ * @returns An object containing the threshold, signers, and ECIES public key.
562
+ */
563
+ static async getVerifierContractDetails(executorAddress, client) {
564
+ const incoVerifier = await Lightning.getIncoVerifierContract(client, executorAddress);
495
565
  const threshold = await incoVerifier.read.getThreshold();
566
+ const eciesPubKey = await incoVerifier.read.eciesPubkey();
496
567
  const signersCount = await incoVerifier.read.getSignersCount();
497
568
  const signersPromises = [];
498
569
  for (let i = BigInt(0); i < signersCount; i++) {
499
570
  signersPromises.push(incoVerifier.read.getSignerAtIndex([i]));
500
571
  }
501
572
  const signers = await Promise.all(signersPromises);
502
- return { threshold: Number(threshold), signers: signers.map(binary_js_1.parseAddress) };
573
+ return {
574
+ threshold: Number(threshold),
575
+ signers: signers.map(binary_js_1.parseAddress),
576
+ eciesPubKey,
577
+ };
503
578
  }
504
- static async getThresholdAndSigners(deployment) {
579
+ static async getChainConfig(deployment, client) {
505
580
  if (this.supportsThresholdRetrieval(deployment)) {
506
- return await this.getContractThresholdAndSigners(deployment.executorAddress, deployment.chainId);
581
+ return await this.getVerifierContractDetails(deployment.executorAddress, client);
507
582
  }
508
583
  return this.getDefaultThresholdAndSigners();
509
584
  }
@@ -512,12 +587,16 @@ class Lightning {
512
587
  // Assumes that the threshold retrieval is supported if the smart contract / deployment version is greater than or equal to 1.1.0
513
588
  return deployment.version?.major >= 1 && deployment.version?.minor >= 1;
514
589
  }
590
+ // NOTE: we are proceeding with lot's of state braking changes and the defaults below can be removed
591
+ // once all deployments support threshold. signers and ecies pub key retrieval
592
+ // For now this is added to ensure that the tests that we have using previous deployments continue to work
515
593
  static getDefaultThresholdAndSigners() {
516
594
  return {
517
595
  threshold: 1,
518
596
  signers: [viem_1.zeroAddress],
597
+ eciesPubKey: ecies_js_1.TEST_ECIES_PUB_KEY,
519
598
  };
520
599
  }
521
600
  }
522
601
  exports.Lightning = Lightning;
523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQVdjO0FBQ2Qsd0NBQTBDO0FBQzFDLGtFQUt1QztBQUV2QyxnRkFBbUc7QUFFbkcsZ0ZBQXlFO0FBS3pFLDRDQUFnRTtBQUVoRSxxREFNZ0M7QUFDaEMsaUVBQWtFO0FBQ2xFLCtEQUFnRTtBQUNoRSw0REFBaUU7QUFDakUsOERBQXNFO0FBQ3RFLDRDQUEyQztBQUMzQywwQ0FBMkM7QUFDM0MsNERBQXlEO0FBQ3pELGdEQUFnRTtBQUVoRSw0Q0FBcUM7QUFDckMseUNBS29CO0FBNkJwQixNQUFNLGFBQWEsR0FBb0IsU0FBUyxDQUFDO0FBRWpELFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUM7QUFDL0QsQ0FBQztBQThCRCxTQUFTLHdCQUF3QixDQUMvQixLQUEyRDtJQUUzRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQVEsS0FBaUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQWEsU0FBUztJQVFEO0lBQ0Q7SUFDQTtJQUNBO0lBVkYsZUFBZSxDQUFVO0lBQ3pCLE9BQU8sQ0FBUztJQUVmLGdCQUFnQixDQUFtQjtJQUNuQyxlQUFlLENBQWtCO0lBRWxELFlBQ21CLFdBQWMsRUFDZixlQUF5QixFQUN6QixPQUFrQixFQUNsQixTQUFpQjtRQUhoQixnQkFBVyxHQUFYLFdBQVcsQ0FBRztRQUNmLG9CQUFlLEdBQWYsZUFBZSxDQUFVO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFD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
602
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpdGUvbGlnaHRuaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQVljO0FBQ2Qsd0NBQTBDO0FBQzFDLGtFQUt1QztBQUV2QyxnRkFBbUc7QUFFbkcsZ0ZBQXlFO0FBS3pFLDRDQUFnRTtBQUVoRSxxREFNZ0M7QUFDaEMsaUVBQWtFO0FBQ2xFLCtEQUFnRTtBQUNoRSw0REFBaUU7QUFDakUsOERBQXNFO0FBQ3RFLDRDQUFvRDtBQUNwRCwwQ0FBMkM7QUFDM0MsNERBQXlEO0FBQ3pELGdEQUFnRTtBQUVoRSw0Q0FBcUM7QUFDckMseUNBTW9CO0FBNkJwQixNQUFNLGFBQWEsR0FBb0IsU0FBUyxDQUFDO0FBRWpELFNBQVMsa0JBQWtCLENBQUMsS0FBYztJQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUM7QUFDL0QsQ0FBQztBQXdDRCxTQUFTLHdCQUF3QixDQUMvQixLQUEyRDtJQUUzRCxPQUFPLENBQ0wsQ0FBQyxDQUFDLEtBQUs7UUFDUCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLFVBQVUsSUFBSSxLQUFLO1FBQ25CLE9BQVEsS0FBaUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQWEsU0FBUztJQVNEO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFaSCxlQUFlLENBQVU7SUFDekIsT0FBTyxDQUFTO0lBRWYsZ0JBQWdCLENBQW1CO0lBQ25DLGVBQWUsQ0FBa0I7SUFDakMsU0FBUyxDQUF5QjtJQUVuRCxZQUNtQixXQUFjLEVBQ2QsZUFBeUIsRUFDekIsT0FBa0IsRUFDbEIsU0FBaUIsRUFDakIsV0FBc0I7UUFKdEIsZ0JBQVcsR0FBWCxXQUFXLENBQUc7UUFDZCxvQkFBZSxHQUFmLGVBQWUs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
@@ -8,6 +8,7 @@ const viem_1 = require("viem");
8
8
  const accounts_1 = require("viem/accounts");
9
9
  const chains_1 = require("viem/chains");
10
10
  const vitest_1 = require("vitest");
11
+ const attested_decrypt_js_1 = require("../attesteddecrypt/attested-decrypt.js");
11
12
  const client_js_1 = require("../kms/client.js");
12
13
  const quorumClient_js_1 = require("../kms/quorumClient.js");
13
14
  // Create a mock that satisfies our minimal interface
@@ -38,8 +39,9 @@ function createTestWalletClient() {
38
39
  const account = (0, accounts_1.privateKeyToAccount)((0, accounts_1.generatePrivateKey)());
39
40
  return (0, viem_1.createWalletClient)({
40
41
  chain: chains_1.sepolia, // Arbitrary chain, not relevant to test
41
- transport: (0, viem_1.http)('UNUSED IN TEST'),
42
+ // CAUTION: TODO: do not rely on this in production, it's only for internal testing use etc.
43
+ transport: (0, viem_1.http)(attested_decrypt_js_1.TEST_RPC_URL),
42
44
  account,
43
45
  });
44
46
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdCQSxrREFPQztBQUdELHdEQU9DO0FBR0QsMERBU0M7QUFHRCx3REFXQztBQW5FRCwrQkFPYztBQUNkLDRDQUF3RTtBQUN4RSx3Q0FBc0M7QUFDdEMsbUNBQTRCO0FBQzVCLGdEQUF5RTtBQUN6RSw0REFBeUQ7QUFXekQscURBQXFEO0FBQ3JELFNBQWdCLG1CQUFtQjtJQUNqQyxPQUFPO1FBQ0wsZUFBZSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsZUFBZSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsR0FBRyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtLQUNhLENBQUM7QUFDcEMsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxTQUFnQixzQkFBc0I7SUFDcEMsaUZBQWlGO0lBQ2pGLE1BQU0sUUFBUSxHQUFRLGlDQUFlLENBQUM7SUFDdEMsT0FBTyxJQUFJLFFBQVEsQ0FDakIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsc0NBQTBCLEVBQUUsQ0FBQyxFQUNqRSxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsU0FBZ0IsdUJBQXVCLENBQ3JDLFlBQTZCLEVBQzdCLGFBQTJDO0lBRTNDLG1EQUFtRDtJQUNuRCxNQUFNLGVBQWUsR0FBRyxZQUFtQixDQUFDO0lBQzVDLElBQUksZUFBZSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRCwwQ0FBMEM7QUFDMUMsU0FBZ0Isc0JBQXNCO0lBS3BDLE1BQU0sT0FBTyxHQUFHLElBQUEsOEJBQW1CLEVBQUMsSUFBQSw2QkFBa0IsR0FBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxJQUFBLHlCQUFrQixFQUFDO1FBQ3hCLEtBQUssRUFBRSxnQkFBTyxFQUFFLHdDQUF3QztRQUN4RCxTQUFTLEVBQUUsSUFBQSxXQUFJLEVBQUMsZ0JBQWdCLENBQUM7UUFDakMsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlCQSxrREFPQztBQUdELHdEQU9DO0FBR0QsMERBU0M7QUFHRCx3REFZQztBQXJFRCwrQkFPYztBQUNkLDRDQUF3RTtBQUN4RSx3Q0FBc0M7QUFDdEMsbUNBQTRCO0FBQzVCLGdGQUFzRTtBQUN0RSxnREFBeUU7QUFDekUsNERBQXlEO0FBV3pELHFEQUFxRDtBQUNyRCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTztRQUNMLGVBQWUsRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLGVBQWUsRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLEdBQUcsRUFBRSxXQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1osU0FBUyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7S0FDYSxDQUFDO0FBQ3BDLENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBZ0Isc0JBQXNCO0lBQ3BDLGlGQUFpRjtJQUNqRixNQUFNLFFBQVEsR0FBUSxpQ0FBZSxDQUFDO0lBQ3RDLE9BQU8sSUFBSSxRQUFRLENBQ2pCLENBQUMsRUFBRSxHQUFHLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLHNDQUEwQixFQUFFLENBQUMsRUFDakUsQ0FBQyxDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQWdCLHVCQUF1QixDQUNyQyxZQUE2QixFQUM3QixhQUEyQztJQUUzQyxtREFBbUQ7SUFDbkQsTUFBTSxlQUFlLEdBQUcsWUFBbUIsQ0FBQztJQUM1QyxJQUFJLGVBQWUsQ0FBQyxJQUFJLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO0lBQ2pELENBQUM7QUFDSCxDQUFDO0FBRUQsMENBQTBDO0FBQzFDLFNBQWdCLHNCQUFzQjtJQUtwQyxNQUFNLE9BQU8sR0FBRyxJQUFBLDhCQUFtQixFQUFDLElBQUEsNkJBQWtCLEdBQUUsQ0FBQyxDQUFDO0lBQzFELE9BQU8sSUFBQSx5QkFBa0IsRUFBQztRQUN4QixLQUFLLEVBQUUsZ0JBQU8sRUFBRSx3Q0FBd0M7UUFDeEQsNEZBQTRGO1FBQzVGLFNBQVMsRUFBRSxJQUFBLFdBQUksRUFBQyxrQ0FBWSxDQUFDO1FBQzdCLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDIn0=
@@ -1,3 +1,4 @@
1
+ import { Chain } from 'viem';
1
2
  import { Chainish } from './chain.js';
2
3
  export declare const chains: {
3
4
  sepolia: {
@@ -777,7 +778,4 @@ export declare const chains: {
777
778
  readonly network: "worldchain-sepolia";
778
779
  };
779
780
  };
780
- type ChainName = keyof typeof chains;
781
- export type ViemChain = (typeof chains)[ChainName];
782
- export declare function getViemChain(chainish: Chainish): ViemChain;
783
- export {};
781
+ export declare function getViemChain(chainish: Chainish): Chain;
package/dist/cjs/viem.js CHANGED
@@ -14,6 +14,10 @@ exports.chains = {
14
14
  };
15
15
  function getViemChain(chainish) {
16
16
  const { name } = (0, chain_js_1.getSupportedChain)(chainish);
17
- return exports.chains[name];
17
+ const chain = exports.chains[name];
18
+ if (!chain) {
19
+ throw new Error(`Unable to get viem chain: ${name}`);
20
+ }
21
+ return chain;
18
22
  }
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmllbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aWVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXVCQSxvQ0FHQztBQTFCRCx3Q0FPcUI7QUFDckIseUNBQXlEO0FBRTVDLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBUCxnQkFBTztJQUNQLFdBQVcsRUFBWCxvQkFBVztJQUNYLFlBQVksRUFBWixxQkFBWTtJQUNaLGFBQWEsRUFBYixzQkFBYTtJQUNiLEtBQUssRUFBTCxjQUFLO0lBQ0wsaUJBQWlCLEVBQWpCLDBCQUFpQjtDQUNsQixDQUFDO0FBTUYsU0FBZ0IsWUFBWSxDQUFDLFFBQWtCO0lBQzdDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sY0FBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLENBQUMifQ==
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmllbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92aWVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9CQSxvQ0FPQztBQTFCRCx3Q0FPcUI7QUFDckIseUNBQXlEO0FBRTVDLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBUCxnQkFBTztJQUNQLFdBQVcsRUFBWCxvQkFBVztJQUNYLFlBQVksRUFBWixxQkFBWTtJQUNaLGFBQWEsRUFBYixzQkFBYTtJQUNiLEtBQUssRUFBTCxjQUFLO0lBQ0wsaUJBQWlCLEVBQWpCLDBCQUFpQjtDQUNsQixDQUFDO0FBRUYsU0FBZ0IsWUFBWSxDQUFDLFFBQWtCO0lBQzdDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sS0FBSyxHQUFHLGNBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
@@ -1,4 +1,4 @@
1
- import { type Account, type Address, type Chain, type Hex, type Transport, type WalletClient } from 'viem';
1
+ import { type Account, type Address, type Chain, type Hex, PublicClient, type Transport, type WalletClient } from 'viem';
2
2
  import { DecryptionAttestation, EncryptedDecryptionAttestation } from '../attesteddecrypt/index.js';
3
3
  import { SupportedChainId } from '../chain.js';
4
4
  import { type EciesScheme, SupportedFheType } from '../encryption/encryption.js';
@@ -32,8 +32,12 @@ export interface SessionKeyAttestedComputeArgs {
32
32
  op: AttestedComputeOP;
33
33
  rhsPlaintext: bigint | boolean;
34
34
  backoffConfig?: Partial<BackoffConfig> | undefined;
35
+ ethClient?: PublicClient<Transport, Chain> | WalletClient<Transport, Chain, Account> | undefined;
36
+ executorAddress?: HexString | undefined;
37
+ reencryptPubKey?: Uint8Array | undefined;
38
+ reencryptKeypair?: Secp256k1Keypair | undefined;
35
39
  }
36
- export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyAttestedComputeArgs): Promise<DecryptionAttestation<EciesScheme, SupportedFheType>>;
40
+ export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, ethClient, executorAddress, reencryptPubKey, reencryptKeypair, }: SessionKeyAttestedComputeArgs): Promise<DecryptionAttestation<EciesScheme, SupportedFheType> | EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>;
37
41
  export interface SessionKeyAttestedDecryptArgs {
38
42
  chainId: SupportedChainId;
39
43
  ephemeralKeypair: Secp256k1Keypair;
@@ -43,6 +47,8 @@ export interface SessionKeyAttestedDecryptArgs {
43
47
  backoffConfig?: Partial<BackoffConfig> | undefined;
44
48
  reencryptPubKey?: Uint8Array | undefined;
45
49
  reencryptKeypair?: Secp256k1Keypair | undefined;
50
+ ethClient?: PublicClient<Transport, Chain> | WalletClient<Transport, Chain, Account> | undefined;
51
+ executorAddress?: HexString | undefined;
46
52
  }
47
53
  /**
48
54
  * Performs attested decrypts using a voucher-backed session key.
@@ -74,4 +80,4 @@ export interface SessionKeyAttestedDecryptArgs {
74
80
  * );
75
81
  * ```
76
82
  */
77
- export declare function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType> | EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>>;
83
+ export declare function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, ethClient, executorAddress, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType> | EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>>;