@inco/js 0.6.8 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +8 -8
  2. package/dist/cjs/advancedacl/session-key.d.ts +39 -19
  3. package/dist/cjs/advancedacl/session-key.js +59 -108
  4. package/dist/cjs/attestedcompute/attested-compute.d.ts +6 -6
  5. package/dist/cjs/attestedcompute/attested-compute.js +5 -28
  6. package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +68 -16
  7. package/dist/cjs/attesteddecrypt/attested-decrypt.js +108 -66
  8. package/dist/cjs/attesteddecrypt/types.d.ts +8 -3
  9. package/dist/cjs/attesteddecrypt/types.js +1 -1
  10. package/dist/cjs/encryption/encryption.d.ts +8 -10
  11. package/dist/cjs/encryption/encryption.js +6 -6
  12. package/dist/cjs/generated/abis/add-two.d.ts +1 -1
  13. package/dist/cjs/generated/abis/add-two.js +1 -1
  14. package/dist/cjs/generated/abis/lightning-preview.d.ts +40 -0
  15. package/dist/cjs/generated/abis/lightning-preview.js +29 -1
  16. package/dist/cjs/generated/abis/lightning.d.ts +1 -1
  17. package/dist/cjs/generated/abis/lightning.js +1 -1
  18. package/dist/cjs/generated/abis/verifier.d.ts +126 -67
  19. package/dist/cjs/generated/abis/verifier.js +108 -54
  20. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  21. package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  22. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +87 -132
  23. package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +21 -27
  24. package/dist/cjs/generated/lightning.d.ts +40 -32
  25. package/dist/cjs/generated/lightning.js +43 -33
  26. package/dist/cjs/generated/local-node.d.ts +11 -11
  27. package/dist/cjs/generated/local-node.js +28 -12
  28. package/dist/cjs/kms/client.d.ts +8 -4
  29. package/dist/cjs/kms/client.js +9 -4
  30. package/dist/cjs/kms/quorumClient.d.ts +58 -0
  31. package/dist/cjs/kms/quorumClient.js +378 -0
  32. package/dist/cjs/kms/thresholdPromises.d.ts +7 -0
  33. package/dist/cjs/kms/thresholdPromises.js +52 -0
  34. package/dist/cjs/lite/deployments.d.ts +20 -2
  35. package/dist/cjs/lite/deployments.js +1 -1
  36. package/dist/cjs/lite/index.d.ts +1 -2
  37. package/dist/cjs/lite/index.js +1 -2
  38. package/dist/cjs/lite/lightning.d.ts +109 -77
  39. package/dist/cjs/lite/lightning.js +279 -112
  40. package/dist/cjs/local/local-node.d.ts +1 -2
  41. package/dist/cjs/local/local-node.js +2 -3
  42. package/dist/cjs/test/mocks.d.ts +15 -0
  43. package/dist/cjs/test/mocks.js +45 -0
  44. package/dist/cjs/viem.d.ts +1 -1
  45. package/dist/esm/advancedacl/session-key.d.ts +39 -19
  46. package/dist/esm/advancedacl/session-key.js +52 -100
  47. package/dist/esm/attestedcompute/attested-compute.d.ts +6 -6
  48. package/dist/esm/attestedcompute/attested-compute.js +6 -29
  49. package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +68 -16
  50. package/dist/esm/attesteddecrypt/attested-decrypt.js +109 -68
  51. package/dist/esm/attesteddecrypt/types.d.ts +8 -3
  52. package/dist/esm/attesteddecrypt/types.js +1 -1
  53. package/dist/esm/encryption/encryption.d.ts +8 -10
  54. package/dist/esm/encryption/encryption.js +6 -6
  55. package/dist/esm/generated/abis/add-two.d.ts +1 -1
  56. package/dist/esm/generated/abis/add-two.js +1 -1
  57. package/dist/esm/generated/abis/lightning-preview.d.ts +40 -0
  58. package/dist/esm/generated/abis/lightning-preview.js +29 -1
  59. package/dist/esm/generated/abis/lightning.d.ts +1 -1
  60. package/dist/esm/generated/abis/lightning.js +1 -1
  61. package/dist/esm/generated/abis/verifier.d.ts +126 -67
  62. package/dist/esm/generated/abis/verifier.js +108 -54
  63. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  64. package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +1 -1
  65. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +87 -132
  66. package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +19 -25
  67. package/dist/esm/generated/lightning.d.ts +40 -32
  68. package/dist/esm/generated/lightning.js +43 -33
  69. package/dist/esm/generated/local-node.d.ts +11 -11
  70. package/dist/esm/generated/local-node.js +28 -12
  71. package/dist/esm/kms/client.d.ts +8 -4
  72. package/dist/esm/kms/client.js +8 -4
  73. package/dist/esm/kms/quorumClient.d.ts +58 -0
  74. package/dist/esm/kms/quorumClient.js +374 -0
  75. package/dist/esm/kms/thresholdPromises.d.ts +7 -0
  76. package/dist/esm/kms/thresholdPromises.js +49 -0
  77. package/dist/esm/lite/deployments.d.ts +20 -2
  78. package/dist/esm/lite/deployments.js +1 -1
  79. package/dist/esm/lite/index.d.ts +1 -2
  80. package/dist/esm/lite/index.js +1 -2
  81. package/dist/esm/lite/lightning.d.ts +109 -77
  82. package/dist/esm/lite/lightning.js +278 -111
  83. package/dist/esm/local/local-node.d.ts +1 -2
  84. package/dist/esm/local/local-node.js +2 -3
  85. package/dist/esm/test/mocks.d.ts +15 -0
  86. package/dist/esm/test/mocks.js +39 -0
  87. package/dist/esm/viem.d.ts +1 -1
  88. package/dist/types/advancedacl/session-key.d.ts +39 -19
  89. package/dist/types/attestedcompute/attested-compute.d.ts +6 -6
  90. package/dist/types/attesteddecrypt/attested-decrypt.d.ts +68 -16
  91. package/dist/types/attesteddecrypt/types.d.ts +8 -3
  92. package/dist/types/encryption/encryption.d.ts +8 -10
  93. package/dist/types/generated/abis/add-two.d.ts +1 -1
  94. package/dist/types/generated/abis/lightning-preview.d.ts +40 -0
  95. package/dist/types/generated/abis/lightning.d.ts +1 -1
  96. package/dist/types/generated/abis/verifier.d.ts +126 -67
  97. package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +15 -1
  98. package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +87 -132
  99. package/dist/types/generated/lightning.d.ts +40 -32
  100. package/dist/types/generated/local-node.d.ts +11 -11
  101. package/dist/types/kms/client.d.ts +8 -4
  102. package/dist/types/kms/quorumClient.d.ts +58 -0
  103. package/dist/types/kms/thresholdPromises.d.ts +7 -0
  104. package/dist/types/lite/deployments.d.ts +20 -2
  105. package/dist/types/lite/index.d.ts +1 -2
  106. package/dist/types/lite/lightning.d.ts +109 -77
  107. package/dist/types/local/local-node.d.ts +1 -2
  108. package/dist/types/test/mocks.d.ts +15 -0
  109. package/dist/types/viem.d.ts +1 -1
  110. package/package.json +3 -3
  111. package/dist/cjs/attestedreveal/attested-reveal.d.ts +0 -21
  112. package/dist/cjs/attestedreveal/attested-reveal.js +0 -67
  113. package/dist/cjs/attestedreveal/index.d.ts +0 -1
  114. package/dist/cjs/attestedreveal/index.js +0 -18
  115. package/dist/cjs/attestedreveal/types.d.ts +0 -7
  116. package/dist/cjs/attestedreveal/types.js +0 -16
  117. package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  118. package/dist/cjs/generated/es/cosmos_proto/cosmos_pb.js +0 -118
  119. package/dist/cjs/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  120. package/dist/cjs/generated/es/inco/fhe/v1/types_pb.js +0 -136
  121. package/dist/cjs/lite/reencrypt.d.ts +0 -23
  122. package/dist/cjs/lite/reencrypt.js +0 -131
  123. package/dist/esm/attestedreveal/attested-reveal.d.ts +0 -21
  124. package/dist/esm/attestedreveal/attested-reveal.js +0 -64
  125. package/dist/esm/attestedreveal/index.d.ts +0 -1
  126. package/dist/esm/attestedreveal/index.js +0 -2
  127. package/dist/esm/attestedreveal/types.d.ts +0 -7
  128. package/dist/esm/attestedreveal/types.js +0 -12
  129. package/dist/esm/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  130. package/dist/esm/generated/es/cosmos_proto/cosmos_pb.js +0 -115
  131. package/dist/esm/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  132. package/dist/esm/generated/es/inco/fhe/v1/types_pb.js +0 -133
  133. package/dist/esm/lite/reencrypt.d.ts +0 -23
  134. package/dist/esm/lite/reencrypt.js +0 -122
  135. package/dist/types/attestedreveal/attested-reveal.d.ts +0 -21
  136. package/dist/types/attestedreveal/index.d.ts +0 -1
  137. package/dist/types/attestedreveal/types.d.ts +0 -7
  138. package/dist/types/generated/es/cosmos_proto/cosmos_pb.d.ts +0 -174
  139. package/dist/types/generated/es/inco/fhe/v1/types_pb.d.ts +0 -419
  140. package/dist/types/lite/reencrypt.d.ts +0 -23
@@ -0,0 +1,15 @@
1
+ import { Account, Chain, Transport, WalletClient } from 'viem';
2
+ import { vi } from 'vitest';
3
+ import { KmsClient } from '../kms/client.js';
4
+ import { KmsQuorumClient } from '../kms/quorumClient.js';
5
+ interface MinimalKmsClient {
6
+ attestedCompute: ReturnType<typeof vi.fn>;
7
+ attestedDecrypt: ReturnType<typeof vi.fn>;
8
+ key: ReturnType<typeof vi.fn>;
9
+ reencrypt: ReturnType<typeof vi.fn>;
10
+ }
11
+ export declare function createMockKmsClient(): MinimalKmsClient & KmsClient;
12
+ export declare function createMockQuorumClient(): KmsQuorumClient;
13
+ export declare function setupMockInQuorumClient(quorumClient: KmsQuorumClient, mockKmsClient: MinimalKmsClient & KmsClient): void;
14
+ export declare function createTestWalletClient(): WalletClient<Transport, Chain, Account>;
15
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMockKmsClient = createMockKmsClient;
4
+ exports.createMockQuorumClient = createMockQuorumClient;
5
+ exports.setupMockInQuorumClient = setupMockInQuorumClient;
6
+ exports.createTestWalletClient = createTestWalletClient;
7
+ const viem_1 = require("viem");
8
+ const accounts_1 = require("viem/accounts");
9
+ const chains_1 = require("viem/chains");
10
+ const vitest_1 = require("vitest");
11
+ const client_js_1 = require("../kms/client.js");
12
+ const quorumClient_js_1 = require("../kms/quorumClient.js");
13
+ // Create a mock that satisfies our minimal interface
14
+ function createMockKmsClient() {
15
+ return {
16
+ attestedCompute: vitest_1.vi.fn(),
17
+ attestedDecrypt: vitest_1.vi.fn(),
18
+ key: vitest_1.vi.fn(),
19
+ reencrypt: vitest_1.vi.fn(),
20
+ };
21
+ }
22
+ // Create a mock KmsQuorumClient from a mock KmsClient for testing
23
+ function createMockQuorumClient() {
24
+ // Use the private constructor via type casting (similar to quorumClient.test.ts)
25
+ const AnyClass = quorumClient_js_1.KmsQuorumClient;
26
+ return new AnyClass([{ url: 'https://mock-kms', signer: client_js_1.DEFAULT_COVALIDATOR_SIGNER }], 1);
27
+ }
28
+ // Helper to set up the mock client inside the quorum client
29
+ function setupMockInQuorumClient(quorumClient, mockKmsClient) {
30
+ // Access private kmss array and replace the client
31
+ const anyQuorumClient = quorumClient;
32
+ if (anyQuorumClient.kmss && anyQuorumClient.kmss.length > 0) {
33
+ anyQuorumClient.kmss[0].client = mockKmsClient;
34
+ }
35
+ }
36
+ // Create a real wallet client for testing
37
+ function createTestWalletClient() {
38
+ const account = (0, accounts_1.privateKeyToAccount)((0, accounts_1.generatePrivateKey)());
39
+ return (0, viem_1.createWalletClient)({
40
+ chain: chains_1.sepolia, // Arbitrary chain, not relevant to test
41
+ transport: (0, viem_1.http)('UNUSED IN TEST'),
42
+ account,
43
+ });
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXdCQSxrREFPQztBQUdELHdEQU9DO0FBR0QsMERBU0M7QUFHRCx3REFXQztBQW5FRCwrQkFPYztBQUNkLDRDQUF3RTtBQUN4RSx3Q0FBc0M7QUFDdEMsbUNBQTRCO0FBQzVCLGdEQUF5RTtBQUN6RSw0REFBeUQ7QUFXekQscURBQXFEO0FBQ3JELFNBQWdCLG1CQUFtQjtJQUNqQyxPQUFPO1FBQ0wsZUFBZSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsZUFBZSxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEIsR0FBRyxFQUFFLFdBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsV0FBRSxDQUFDLEVBQUUsRUFBRTtLQUNhLENBQUM7QUFDcEMsQ0FBQztBQUVELGtFQUFrRTtBQUNsRSxTQUFnQixzQkFBc0I7SUFDcEMsaUZBQWlGO0lBQ2pGLE1BQU0sUUFBUSxHQUFRLGlDQUFlLENBQUM7SUFDdEMsT0FBTyxJQUFJLFFBQVEsQ0FDakIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsc0NBQTBCLEVBQUUsQ0FBQyxFQUNqRSxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsU0FBZ0IsdUJBQXVCLENBQ3JDLFlBQTZCLEVBQzdCLGFBQTJDO0lBRTNDLG1EQUFtRDtJQUNuRCxNQUFNLGVBQWUsR0FBRyxZQUFtQixDQUFDO0lBQzVDLElBQUksZUFBZSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRCwwQ0FBMEM7QUFDMUMsU0FBZ0Isc0JBQXNCO0lBS3BDLE1BQU0sT0FBTyxHQUFHLElBQUEsOEJBQW1CLEVBQUMsSUFBQSw2QkFBa0IsR0FBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxJQUFBLHlCQUFrQixFQUFDO1FBQ3hCLEtBQUssRUFBRSxnQkFBTyxFQUFFLHdDQUF3QztRQUN4RCxTQUFTLEVBQUUsSUFBQSxXQUFJLEVBQUMsZ0JBQWdCLENBQUM7UUFDakMsT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -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;
@@ -1,14 +1,13 @@
1
- import type { Client } from '@connectrpc/connect';
2
1
  import { type Account, type Address, type Chain, type Hex, type Transport, type WalletClient } from 'viem';
3
- import { DecryptionAttestation } from '../attesteddecrypt/index.js';
2
+ import { DecryptionAttestation, EncryptedDecryptionAttestation } from '../attesteddecrypt/index.js';
4
3
  import { SupportedChainId } from '../chain.js';
5
4
  import { type EciesScheme, SupportedFheType } from '../encryption/encryption.js';
6
5
  import { HexString } from '../index.js';
7
- import type { KmsService, Secp256k1Keypair } from '../lite/index.js';
8
- import { type ReencryptFnArgs } from '../reencryption/index.js';
6
+ import type { Secp256k1Keypair } from '../lite/index.js';
9
7
  import { BackoffConfig } from '../retry.js';
10
8
  import type { AllowanceVoucher, AllowanceVoucherWithSig } from './types.js';
11
9
  import { AttestedComputeOP } from '../attestedcompute/types.js';
10
+ import { KmsQuorumClient } from '../kms/quorumClient.js';
12
11
  export interface Session {
13
12
  decrypter: Address;
14
13
  expiresAt: bigint;
@@ -23,35 +22,56 @@ export interface GrantSessionKeyArgs {
23
22
  expiresAt: Date;
24
23
  }
25
24
  export declare function grantSessionKey({ chainId, incoLiteAddress, sessionVerifierContractAddress, granteeAddress, sharerWalletClient, expiresAt, }: GrantSessionKeyArgs): Promise<AllowanceVoucherWithSig>;
26
- export interface SessionKeyReencryptorArgs {
27
- chainId: bigint;
28
- ephemeralKeypair: Secp256k1Keypair;
29
- kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>;
30
- allowanceVoucherWithSig: AllowanceVoucherWithSig;
31
- }
32
- 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
25
  export declare function updateActiveVouchersSessionNonce(incoLiteAddress: Address, sharerWalletClient: WalletClient<Transport, Chain, Account>): Promise<`0x${string}`>;
34
26
  export interface SessionKeyAttestedComputeArgs {
35
27
  chainId: SupportedChainId;
36
28
  ephemeralKeypair: Secp256k1Keypair;
37
- kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>;
29
+ kmsQuorumClient: KmsQuorumClient;
38
30
  allowanceVoucherWithSig: AllowanceVoucherWithSig;
39
31
  lhsHandle: HexString;
40
32
  op: AttestedComputeOP;
41
33
  rhsPlaintext: bigint | boolean;
42
34
  backoffConfig?: Partial<BackoffConfig> | undefined;
43
35
  }
44
- export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyAttestedComputeArgs): Promise<{
45
- handle: HexString;
46
- plaintext: import("../encryption/encryption.js").PlaintextOf<1, T>;
47
- covalidatorSignature: Uint8Array<ArrayBufferLike>;
48
- }>;
36
+ export declare function sessionKeyAttestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, }: SessionKeyAttestedComputeArgs): Promise<DecryptionAttestation<EciesScheme, SupportedFheType>>;
49
37
  export interface SessionKeyAttestedDecryptArgs {
50
38
  chainId: SupportedChainId;
51
39
  ephemeralKeypair: Secp256k1Keypair;
52
- kmsConnectRpcEndpointOrClient: string | Client<typeof KmsService>;
40
+ kmsQuorumClient: KmsQuorumClient;
53
41
  allowanceVoucherWithSig: AllowanceVoucherWithSig;
54
42
  handles: HexString[];
55
43
  backoffConfig?: Partial<BackoffConfig> | undefined;
44
+ reencryptPubKey?: Uint8Array | undefined;
45
+ reencryptKeypair?: Secp256k1Keypair | undefined;
56
46
  }
57
- export declare function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType>>>;
47
+ /**
48
+ * Performs attested decrypts using a voucher-backed session key.
49
+ *
50
+ * @example Plaintext results
51
+ * ```ts
52
+ * const attestations = await sessionKeyAttestedDecrypt({
53
+ * chainId,
54
+ * kmsConnectRpcEndpointOrClient: covalidatorUrl,
55
+ * allowanceVoucherWithSig: voucher,
56
+ * ephemeralKeypair,
57
+ * handles,
58
+ * });
59
+ * console.log(attestations[0].plaintext.value);
60
+ * ```
61
+ *
62
+ * @example Encrypted results
63
+ * ```ts
64
+ * const encryptedResults = await sessionKeyAttestedDecrypt({
65
+ * chainId,
66
+ * kmsConnectRpcEndpointOrClient: covalidatorUrl,
67
+ * allowanceVoucherWithSig: voucher,
68
+ * ephemeralKeypair,
69
+ * handles,
70
+ * reencryptPubKey: recipientPubKey,
71
+ * });
72
+ * console.log(
73
+ * encryptedResults[0].encryptedPlaintext.ciphertext.value,
74
+ * );
75
+ * ```
76
+ */
77
+ export declare function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }: SessionKeyAttestedDecryptArgs): Promise<Array<DecryptionAttestation<EciesScheme, SupportedFheType> | EncryptedDecryptionAttestation<EciesScheme, SupportedFheType>>>;
@@ -1,17 +1,15 @@
1
1
  import { create } from '@bufbuild/protobuf';
2
- import { encodeAbiParameters, getContract, hexToBytes, toFunctionSelector, } from 'viem';
2
+ import { bytesToHex, encodeAbiParameters, getContract, hexToBytes, toFunctionSelector, } from 'viem';
3
3
  import { privateKeyToAccount } from 'viem/accounts';
4
- import { AttestedDecryptError, } from '../attesteddecrypt/index.js';
5
- import { getSupportedChain } from '../chain.js';
6
4
  import { bigintToPlaintext, encryptionSchemes, } from '../encryption/encryption.js';
7
5
  import { abiHelperAbi, advancedAccessControlAbi, } from '../generated/abis/lightning-preview.js';
8
6
  import { incoLightningAbi, sessionVerifierAbi, } from '../generated/abis/lightning.js';
9
7
  import { incoVerifierAbi } from '../generated/abis/verifier.js';
10
- import { bigintToBytes32, bytesToBigInt, getHandleType, } from '../index.js';
11
- import { ATTESTED_COMPUTE_DOMAIN_NAME, ATTESTED_COMPUTE_DOMAIN_VERSION, ATTESTED_DECRYPT_DOMAIN_NAME, ATTESTED_DECRYPT_DOMAIN_VERSION, decryptGrpcResponse, defaultCovalidatorGrpc, getKmsClient, reencryptEIP712, } from '../lite/index.js';
12
- import { createEIP712Payload, } from '../reencryption/index.js';
13
- import { retryWithBackoff } from '../retry.js';
14
- import { AttestedComputeRequestSchema, AttestedDecryptRequestSchema, ReencryptRequestSchema, } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
8
+ import { bigintToBytes32, getHandleType } from '../index.js';
9
+ import { ATTESTED_COMPUTE_DOMAIN_NAME, ATTESTED_COMPUTE_DOMAIN_VERSION, ATTESTED_DECRYPT_DOMAIN_NAME, ATTESTED_DECRYPT_DOMAIN_VERSION, } from '../lite/index.js';
10
+ import { createEIP712Payload } from '../reencryption/index.js';
11
+ import { decryptEncryptedAttestations } from '../attesteddecrypt/attested-decrypt.js';
12
+ import { AttestedComputeRequestSchema, AttestedDecryptRequestSchema, } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
15
13
  import { AllowanceProofSchema, AllowanceVoucherSchema, HandleWithProofSchema, IncoLiteAdvancedACLProofSchema, } from '../generated/es/inco/kms/lite/v1/types_pb.js';
16
14
  // Given a sharer's wallet client, an incoLite contract address, and a
17
15
  // (verifyingContract, callFunction, sharerArgData) tuple, this function
@@ -76,52 +74,6 @@ export async function grantSessionKey({ chainId, incoLiteAddress, sessionVerifie
76
74
  voucherSignature,
77
75
  };
78
76
  }
79
- // The sessionKeyReencryptor function is a reencryptor that uses a session key
80
- // to reencrypt data.
81
- export async function sessionKeyReencryptor({ chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }) {
82
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient ||
83
- defaultCovalidatorGrpc(getSupportedChain(chainId)));
84
- const requesterAccount = privateKeyToAccount(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
85
- const ephemeralPubKey = ephemeralKeypair.encodePublicKey();
86
- // Sign the EIP712 attesting that the requester has access to the private key
87
- // corresponding to the ephemeral public key.
88
- const eip712Payload = reencryptEIP712(chainId, ephemeralPubKey);
89
- // Since the account is an ephemeral keypair stored in memory (not in Metamask),
90
- // this step will NOT prompt the user with a pop-up.
91
- const eip712Signature = await requesterAccount.signTypedData(eip712Payload);
92
- return async function reencrypt({ handle, }) {
93
- const reencryptRequest = create(ReencryptRequestSchema, {
94
- userAddress: requesterAccount.address,
95
- ephemeralPubKey,
96
- eip712Signature: hexToBytes(eip712Signature),
97
- handlesWithProofs: [
98
- create(HandleWithProofSchema, {
99
- handle,
100
- aclProof: {
101
- proof: {
102
- case: 'incoLiteAdvancedAclProof',
103
- value: create(IncoLiteAdvancedACLProofSchema, {
104
- allowanceProof: create(AllowanceProofSchema, {
105
- sharer: allowanceVoucherWithSig.sharer,
106
- voucher: create(AllowanceVoucherSchema, {
107
- sessionNonce: hexToBytes(allowanceVoucherWithSig.voucher.sessionNonce),
108
- verifyingContract: allowanceVoucherWithSig.voucher.verifyingContract,
109
- callFunction: hexToBytes(allowanceVoucherWithSig.voucher.callFunction),
110
- sharerArgData: hexToBytes(allowanceVoucherWithSig.voucher.sharerArgData),
111
- }),
112
- voucherSignature: hexToBytes(allowanceVoucherWithSig.voucherSignature),
113
- requesterArgData: new Uint8Array(),
114
- }),
115
- }),
116
- },
117
- },
118
- }),
119
- ],
120
- });
121
- const response = await kmsClient.reencrypt(reencryptRequest);
122
- return decryptGrpcResponse(response, ephemeralKeypair, handle);
123
- };
124
- }
125
77
  export async function updateActiveVouchersSessionNonce(incoLiteAddress, sharerWalletClient) {
126
78
  const verifier = await getIncoVerifier(incoLiteAddress, sharerWalletClient);
127
79
  const txHash = await verifier.write.updateActiveVouchersSessionNonce();
@@ -129,9 +81,7 @@ export async function updateActiveVouchersSessionNonce(incoLiteAddress, sharerWa
129
81
  }
130
82
  // The sessionKeyAttestedCompute function is a decryptor that uses a session key
131
83
  // to compute on a handle.
132
- export async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsConnectRpcEndpointOrClient, ephemeralKeypair, allowanceVoucherWithSig, }) {
133
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient ||
134
- defaultCovalidatorGrpc(getSupportedChain(chainId)));
84
+ export async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, chainId, kmsQuorumClient, ephemeralKeypair, allowanceVoucherWithSig, }) {
135
85
  const requesterAccount = privateKeyToAccount(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
136
86
  const rhsPlaintextBig = BigInt(rhsPlaintext);
137
87
  const rhsValueBytes = bigintToPlaintext(encryptionSchemes.ecies, getHandleType(lhsHandle), rhsPlaintextBig);
@@ -182,37 +132,53 @@ export async function sessionKeyAttestedCompute({ lhsHandle, op, rhsPlaintext, b
182
132
  },
183
133
  },
184
134
  });
185
- const response = await retryWithBackoff(async () => {
186
- return await kmsClient.attestedCompute(attestedComputeRequest);
187
- }, backoffConfig);
188
- if (!response.decryptionAttestation) {
189
- throw new Error('Failed to get decryption attestation from attested compute');
190
- }
191
- const decryptionAttestation = response.decryptionAttestation;
192
- if (decryptionAttestation.plaintext === undefined) {
193
- throw new Error('No plaintext in compute response');
194
- }
195
- const bigIntValue = bytesToBigInt(decryptionAttestation.plaintext);
196
- return {
197
- handle: decryptionAttestation.handle,
198
- plaintext: bigintToPlaintext(encryptionSchemes.ecies, getHandleType(lhsHandle), bigIntValue),
199
- covalidatorSignature: decryptionAttestation.signature,
200
- };
135
+ let response = await kmsQuorumClient.attestedCompute(attestedComputeRequest, backoffConfig);
136
+ return response;
201
137
  }
202
- // The sessionKeyAttestedDecrypt function is a decryptor that uses a session key
203
- // to decrypt data.
204
- export async function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpointOrClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, }) {
205
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient ||
206
- defaultCovalidatorGrpc(getSupportedChain(chainId)));
138
+ /**
139
+ * Performs attested decrypts using a voucher-backed session key.
140
+ *
141
+ * @example Plaintext results
142
+ * ```ts
143
+ * const attestations = await sessionKeyAttestedDecrypt({
144
+ * chainId,
145
+ * kmsConnectRpcEndpointOrClient: covalidatorUrl,
146
+ * allowanceVoucherWithSig: voucher,
147
+ * ephemeralKeypair,
148
+ * handles,
149
+ * });
150
+ * console.log(attestations[0].plaintext.value);
151
+ * ```
152
+ *
153
+ * @example Encrypted results
154
+ * ```ts
155
+ * const encryptedResults = await sessionKeyAttestedDecrypt({
156
+ * chainId,
157
+ * kmsConnectRpcEndpointOrClient: covalidatorUrl,
158
+ * allowanceVoucherWithSig: voucher,
159
+ * ephemeralKeypair,
160
+ * handles,
161
+ * reencryptPubKey: recipientPubKey,
162
+ * });
163
+ * console.log(
164
+ * encryptedResults[0].encryptedPlaintext.ciphertext.value,
165
+ * );
166
+ * ```
167
+ */
168
+ export async function sessionKeyAttestedDecrypt({ chainId, kmsQuorumClient, handles, ephemeralKeypair, allowanceVoucherWithSig, backoffConfig, reencryptPubKey, reencryptKeypair, }) {
207
169
  const requesterAccount = privateKeyToAccount(`0x${ephemeralKeypair.kp.getPrivate('hex')}`);
208
170
  // Sign the EIP712 attesting that the requester has access to the private key
209
171
  // corresponding to the ephemeral public key.
210
172
  const eip712Payload = createEIP712Payload({
211
173
  chainId: BigInt(chainId),
212
174
  primaryType: 'AttestedDecryptRequest',
213
- primaryTypeFields: [{ name: 'handles', type: 'bytes32[]' }],
175
+ primaryTypeFields: [
176
+ { name: 'handles', type: 'bytes32[]' },
177
+ { name: 'publicKey', type: 'bytes' },
178
+ ],
214
179
  message: {
215
180
  handles: handles,
181
+ publicKey: bytesToHex(reencryptPubKey ? reencryptPubKey : Uint8Array.from([])),
216
182
  },
217
183
  domainName: ATTESTED_DECRYPT_DOMAIN_NAME,
218
184
  domainVersion: ATTESTED_DECRYPT_DOMAIN_VERSION,
@@ -247,28 +213,14 @@ export async function sessionKeyAttestedDecrypt({ chainId, kmsConnectRpcEndpoint
247
213
  userAddress: requesterAccount.address,
248
214
  handlesWithProofs: handlesWithProofs,
249
215
  eip712Signature: hexToBytes(eip712Signature),
216
+ reencryptPubKey: reencryptPubKey ? reencryptPubKey : Uint8Array.from([]),
250
217
  });
251
- const response = await retryWithBackoff(async () => {
252
- return await kmsClient.attestedDecrypt(attestedDecryptRequest);
253
- }, backoffConfig);
254
- if (!response.decryptionAttestations ||
255
- response.decryptionAttestations.length === 0) {
256
- throw new AttestedDecryptError('No decryption attestations in response');
218
+ let response = await kmsQuorumClient.attestedDecrypt(attestedDecryptRequest, backoffConfig);
219
+ // If reencryptPubKey is provided with a keypair, decrypt the encrypted attestations
220
+ if (reencryptPubKey !== undefined && reencryptKeypair) {
221
+ response = await decryptEncryptedAttestations(response, reencryptKeypair);
257
222
  }
258
- const results = response.decryptionAttestations.map((att) => {
259
- if (att.plaintext === undefined) {
260
- throw new AttestedDecryptError('No plaintext in attestation');
261
- }
262
- const h = att.handle;
263
- const handleType = getHandleType(h);
264
- const bigIntValue = bytesToBigInt(att.plaintext);
265
- return {
266
- handle: h,
267
- plaintext: bigintToPlaintext(encryptionSchemes.ecies, handleType, bigIntValue),
268
- covalidatorSignature: att.signature,
269
- };
270
- });
271
- return results;
223
+ return response;
272
224
  }
273
225
  // Below are helpers to get ABIs of functions/structs from the SessionVerifier
274
226
  // contract.
@@ -333,4 +285,4 @@ async function getIncoVerifier(incoLiteAddress, walletClient) {
333
285
  client: walletClient,
334
286
  });
335
287
  }
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWR2YW5jZWRhY2wvc2Vzc2lvbi1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsV0FBVyxFQUVYLFVBQVUsRUFDVixrQkFBa0IsR0FHbkIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUNMLG9CQUFvQixHQUVyQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFDbEUsT0FBTyxFQUNMLGlCQUFpQixFQUVqQixpQkFBaUIsR0FFbEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLHdCQUF3QixHQUN6QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEdBQ25CLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLGFBQWEsR0FFZCxNQUFNLGFBQWEsQ0FBQztBQVNyQixPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw0QkFBNEIsRUFDNUIsK0JBQStCLEVBQy9CLG1CQUFtQixFQUNuQixzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLGVBQWUsR0FDaEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFpQixnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUk5RCxPQUFPLEVBQ0wsNEJB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
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Vzc2lvbi1rZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWR2YW5jZWRhY2wvc2Vzc2lvbi1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFHTCxVQUFVLEVBRVYsbUJBQW1CLEVBQ25CLFdBQVcsRUFFWCxVQUFVLEVBQ1Ysa0JBQWtCLEdBR25CLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTXBELE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsaUJBQWlCLEdBRWxCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUNMLFlBQVksRUFDWix3QkFBd0IsR0FDekIsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGtCQUFrQixHQUNuQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYSxNQUFNLGFBQWEsQ0FBQztBQU94RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQiw0QkFBNEIsRUFDNUIsK0JBQStCLEdBQ2hDLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFLL0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDdEYsT0FBTyxFQUNMLDRCQUE0QixFQUM1Qiw0QkFBNEIsR0FDN0IsTUFBTSxvREFBb0QsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsOEJBQThCLEdBQy9CLE1BQU0sOENBQThDLENBQUM7QUFrQnRELHNFQUFzRTtBQUN0RSx3RUFBd0U7QUFDeEUsK0JBQStCO0FBQy9CLE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLGVBQXdCLEVBQ3hCLGtCQUEyRCxFQUMzRCxpQkFBMEIsRUFDMUIsWUFBaUIsRUFDakIsYUFBa0I7SUFFbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFNUUsMEVBQTBFO0lBQzFFLHdDQUF3QztJQUN4QyxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUM7UUFDckUsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE9BQU87S0FDbkMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFlBQVk7UUFDWixpQkFBaUI7UUFDakIsWUFBWTtRQUNaLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQztBQXVCRCxtREFBbUQ7QUFDbkQsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsRUFDcEMsT0FBTyxFQUNQLGVBQWUsRUFDZiw4QkFBOEIsRUFDOUIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixTQUFTLEdBQ1c7SUFDcEIsTUFBTSxPQUFPLEdBQUc7UUFDZCxTQUFTLEVBQUUsY0FBYztRQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQy9DLENBQUM7SUFDYixNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsRUFBRTtRQUN6RCxPQUFPLENBQUMsU0FBUztRQUNqQixPQUFPLENBQUMsU0FBUztLQUNsQixDQUFDLENBQUM7SUFFSCxNQUFNLFlBQVksR0FBRyxNQUFNLGVBQWUsQ0FDeEMsZUFBZSxFQUNmLGtCQUFrQixDQUNuQixDQUFDO0lBRUYsbUNBQW1DO0lBQ25DLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQiw2QkFBNkI7SUFDN0IsZ0JBQWdCO0lBQ2hCLDhCQUE4QjtJQUM5QixNQUFNLGNBQWMsR0FBRyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBVyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxtQkFBbUIsR0FBVyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxzQkFBc0IsQ0FDMUMsZUFBZSxFQUNmLGtCQUFrQjtJQUNsQiw0RUFBNEU7SUFDNUUsNkJBQTZCO0lBQzdCLDhCQUE4QixFQUM5QixrQkFBa0IsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEVBQ3pDLGFBQWEsQ0FDZCxDQUFDO0lBQ0YsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7UUFDeEMsT0FBTztRQUNQLFdBQVcsRUFBRSxrQkFBa0I7UUFDL0IsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUU7UUFDM0MsT0FBTyxFQUFFLE9BQU87UUFDaEIsd0VBQXdFO1FBQ3hFLGdFQUFnRTtRQUNoRSxpQkFBaUIsRUFBRSxZQUFZLENBQUMsT0FBTztRQUN2QyxVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLGFBQWEsRUFBRSxtQkFBbUI7S0FDbkMsQ0FBQyxDQUFDO0lBRUgsdUVBQXVFO0lBQ3ZFLFdBQVc7SUFDWCxNQUFNLGdCQUFnQixHQUNwQixNQUFNLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUV4RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxPQUFPO1FBQzFDLE9BQU87UUFDUCxnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGdDQUFnQyxDQUNwRCxlQUF3QixFQUN4QixrQkFBMkQ7SUFFM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDdkUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXdCRCxnRkFBZ0Y7QUFDaEYsMEJBQTBCO0FBQzFCLE1BQU0sQ0FBQyxLQUFLLFVBQVUseUJBQXlCLENBQTZCLEVBQzFFLFNBQVMsRUFDVCxFQUFFLEVBQ0YsWUFBWSxFQUNaLGFBQWEsRUFDYixPQUFPLEVBQ1AsZUFBZSxFQUNmLGdCQUFnQixFQUNoQix1QkFBdUIsR0FDTztJQUc5QixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUMxQyxLQUFLLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDN0MsQ0FBQztJQUNGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QyxNQUFNLGFBQWEsR0FBRyxpQkFBaUIsQ0FDckMsaUJBQWlCLENBQUMsS0FBSyxFQUN2QixhQUFhLENBQUMsU0FBUyxDQUFNLEVBQzdCLGVBQWUsQ0FDaEIsQ0FBQztJQUVGLDZFQUE2RTtJQUM3RSw2Q0FBNkM7SUFDN0MsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7UUFDeEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDeEIsV0FBVyxFQUFFLHdCQUF3QjtRQUNyQyxpQkFBaUIsRUFBRTtZQUNqQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUM3QixFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUN0QyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtTQUMxQztRQUNELE9BQU8sRUFBRTtZQUNQLEVBQUUsRUFBRSxFQUFFO1lBQ04sU0FBUyxFQUFFLFNBQVM7WUFDcEIsWUFBWSxFQUFFLGVBQWUsQ0FBQyxlQUFlLENBQUM7U0FDL0M7UUFDRCxVQUFVLEVBQUUsNEJBQTRCO1FBQ3hDLGFBQWEsRUFBRSwrQkFBK0I7S0FDL0MsQ0FBQyxDQUFDO0lBQ0gsZ0ZBQWdGO0lBQ2hGLG9EQUFvRDtJQUNwRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUU1RSxNQUFNLHNCQUFzQixHQUEyQixNQUFNLENBQzNELDRCQUE0QixFQUM1QjtRQUNFLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPO1FBQ3JDLEVBQUUsRUFBRSxFQUFFO1FBQ04sU0FBUyxFQUFFLFNBQVM7UUFDcEIsWUFBWSxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUM1QyxRQUFRLEVBQUU7WUFDUixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyw4QkFBOEIsRUFBRTtvQkFDNUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRTt3QkFDM0MsTUFBTSxFQUFFLHVCQUF1QixDQUFDLE1BQU07d0JBQ3RDLE9BQU8sRUFBRSxNQUFNLENBQUMsc0JBQXNCLEVBQUU7NEJBQ3RDLFlBQVksRUFBRSxVQUFVLENBQ3RCLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQzdDOzRCQUNELGlCQUFpQixFQUNmLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxpQkFBaUI7NEJBQ25ELFlBQVksRUFBRSxVQUFVLENBQ3RCLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQzdDOzRCQUNELGFBQWEsRUFBRSxVQUFVLENBQ3ZCLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQzlDO3lCQUNGLENBQUM7d0JBQ0YsZ0JBQWdCLEVBQUUsVUFBVSxDQUMxQix1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FDekM7d0JBQ0Qsc0RBQXNEO3dCQUN0RCxnQkFBZ0IsRUFBRSxJQUFJLFVBQVUsRUFBRTtxQkFDbkMsQ0FBQztpQkFDSCxDQUFDO2FBQ0g7U0FDRjtLQUNGLENBQ0YsQ0FBQztJQUVGLElBQUksUUFBUSxHQUFHLE1BQU0sZUFBZSxDQUFDLGVBQWUsQ0FDbEQsc0JBQXNCLEVBQ3RCLGFBQWEsQ0FDZCxDQUFDO0lBRUYsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQXlCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUFDLEVBQzlDLE9BQU8sRUFDUCxlQUFlLEVBQ2YsT0FBTyxFQUNQLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLGVBQWUsRUFDZixnQkFBZ0IsR0FDYztJQU05QixNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUMxQyxLQUFLLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDN0MsQ0FBQztJQUVGLDZFQUE2RTtJQUM3RSw2Q0FBNkM7SUFDN0MsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7UUFDeEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDeEIsV0FBVyxFQUFFLHdCQUF3QjtRQUNyQyxpQkFBaUIsRUFBRTtZQUNqQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUN0QyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtTQUNyQztRQUNELE9BQU8sRUFBRTtZQUNQLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxVQUFVLENBQ25CLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUN4RDtTQUNGO1FBQ0QsVUFBVSxFQUFFLDRCQUE0QjtRQUN4QyxhQUFhLEVBQUUsK0JBQStCO0tBQy9DLENBQUMsQ0FBQztJQUNILGdGQUFnRjtJQUNoRixvREFBb0Q7SUFDcEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDNUUsTUFBTSxpQkFBaUIsR0FBMkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3ZFLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixFQUFFO1lBQ25DLE1BQU0sRUFBRSxNQUFNO1lBQ2QsUUFBUSxFQUFFO2dCQUNSLEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxLQUFLLEVBQUUsTUFBTSxDQUFDLDhCQUE4QixFQUFFO3dCQUM1QyxjQUFjLEVBQUUsTUFBTSxDQUFDLG9CQUFvQixFQUFFOzRCQUMzQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs0QkFDdEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTtnQ0FDdEMsWUFBWSxFQUFFLFVBQVUsQ0FDdEIsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FDN0M7Z0NBQ0QsaUJBQWlCLEVBQ2YsdUJBQXVCLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtnQ0FDbkQsWUFBWSxFQUFFLFVBQVUsQ0FDdEIsdUJBQXVCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FDN0M7Z0NBQ0QsYUFBYSxFQUFFLFVBQVUsQ0FDdkIsdUJBQXVCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FDOUM7NkJBQ0YsQ0FBQzs0QkFDRixnQkFBZ0IsRUFBRSxVQUFVLENBQzFCLHVCQUF1QixDQUFDLGdCQUFnQixDQUN6Qzs0QkFDRCxnQkFBZ0IsRUFBRSxJQUFJLFVBQVUsRUFBRTt5QkFDbkMsQ0FBQztxQkFDSCxDQUFDO2lCQUNIO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sc0JBQXNCLEdBQTJCLE1BQU0sQ0FDM0QsNEJBQTRCLEVBQzVCO1FBQ0UsV0FBVyxFQUFFLGdCQUFnQixDQUFDLE9BQU87UUFDckMsaUJBQWlCLEVBQUUsaUJBQWlCO1FBQ3BDLGVBQWUsRUFBRSxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQzVDLGVBQWUsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7S0FDekUsQ0FDRixDQUFDO0lBRUYsSUFBSSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsZUFBZSxDQUNsRCxzQkFBc0IsRUFDdEIsYUFBYSxDQUNkLENBQUM7SUFFRixvRkFBb0Y7SUFDcEYsSUFBSSxlQUFlLEtBQUssU0FBUyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdEQsUUFBUSxHQUFHLE1BQU0sNEJBQTRCLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsWUFBWTtBQUVaLGdEQUFnRDtBQUNoRCxTQUFTLHNCQUFzQjtJQUM3QiwyRUFBMkU7SUFDM0Usb0JBQW9CO0lBQ3BCLE1BQU0sc0JBQXNCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUMxRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyx3QkFBd0IsQ0FDakQsQ0FBQztJQUNGLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLE1BQU0scUJBQXFCLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDOUQsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLEtBQUsseUJBQXlCLENBQzVELENBQUM7SUFDRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8scUJBQXFCLENBQUMsVUFBVSxDQUFDO0FBQzFDLENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSw0Q0FBNEM7QUFDNUMsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQ2xDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUN2RCxDQUFDO0lBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM1QixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsbUJBQW1CO0lBQzFCLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FDM0MsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxlQUFlLENBQzFELENBQUM7SUFDRixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQ3JCLG1CQUE0QixFQUM1QixrQkFBMkQ7SUFFM0QsT0FBTyxXQUFXLENBQUM7UUFDakIsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixHQUFHLEVBQUUsd0JBQXdCO1FBQzdCLE1BQU0sRUFBRSxrQkFBa0I7S0FDM0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQ3ZCLGVBQXdCLEVBQ3hCLFlBQXFEO0lBRXJELE9BQU8sV0FBVyxDQUFDO1FBQ2pCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEdBQUcsRUFBRSxnQkFBZ0I7UUFDckIsTUFBTSxFQUFFLFlBQVk7S0FDckIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxlQUFlLENBQzVCLGVBQXdCLEVBQ3hCLFlBQXFEO0lBRXJELE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqRSxNQUFNLG1CQUFtQixHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvRCxPQUFPLFdBQVcsQ0FBQztRQUNqQixPQUFPLEVBQUUsbUJBQW1CO1FBQzVCLEdBQUcsRUFBRSxlQUFlO1FBQ3BCLE1BQU0sRUFBRSxZQUFZO0tBQ3JCLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -3,19 +3,19 @@ import { DecryptionAttestation } from '../attesteddecrypt/types.js';
3
3
  import { HexString } from '../binary.js';
4
4
  import { SupportedChainId } from '../chain.js';
5
5
  import { EciesScheme, SupportedFheType } from '../encryption/encryption.js';
6
- import type { KmsClient } from '../kms/client.js';
6
+ import { KmsQuorumClient } from '../kms/quorumClient.js';
7
7
  import type { BackoffConfig } from '../retry.js';
8
8
  import { AttestedComputeOP } from './types.js';
9
9
  export declare const ATTESTED_COMPUTE_DOMAIN_NAME = "IncoAttestedCompute";
10
- export declare const ATTESTED_COMPUTE_DOMAIN_VERSION = "0.1.0";
10
+ export declare const ATTESTED_COMPUTE_DOMAIN_VERSION = "1";
11
11
  /**
12
12
  * Arguments for creating an attested compute.
13
13
  */
14
14
  export interface IncoLiteAttestedComputeArgs {
15
15
  /** The wallet used to interact with the blockchain and sign the compute request */
16
16
  walletClient: WalletClient<Transport, Chain, Account>;
17
- /** The KMS connect RPC endpoint or client instance */
18
- kmsConnectRpcEndpointOrClient?: string | KmsClient;
17
+ /** The KMS quorum client instance */
18
+ kmsQuorumClient: KmsQuorumClient;
19
19
  /** The chain ID to use */
20
20
  chainId: SupportedChainId;
21
21
  }
@@ -27,12 +27,12 @@ export interface IncoLiteAttestedComputeArgs {
27
27
  *
28
28
  * @todo Support multiple operations in a single request.
29
29
  */
30
- export declare function attestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsConnectRpcEndpointOrClient, chainId, }: {
30
+ export declare function attestedCompute<T extends SupportedFheType>({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsQuorumClient, chainId, }: {
31
31
  lhsHandle: HexString;
32
32
  op: AttestedComputeOP;
33
33
  rhsPlaintext: bigint | boolean;
34
34
  backoffConfig?: Partial<BackoffConfig> | undefined;
35
35
  walletClient: WalletClient<Transport, Chain, Account>;
36
- kmsConnectRpcEndpointOrClient?: string | KmsClient;
36
+ kmsQuorumClient: KmsQuorumClient;
37
37
  chainId: SupportedChainId;
38
38
  }): Promise<DecryptionAttestation<EciesScheme, T>>;
@@ -1,17 +1,12 @@
1
1
  import { create } from '@bufbuild/protobuf';
2
2
  import { hexToBytes } from 'viem';
3
3
  import { validateHandle } from '../attesteddecrypt/attested-decrypt.js';
4
- import { bigintToBytes32, bytesToBigInt } from '../binary.js';
5
- import { getSupportedChain } from '../chain.js';
6
- import { bigintToPlaintext, encryptionSchemes, } from '../encryption/encryption.js';
4
+ import { bigintToBytes32 } from '../binary.js';
7
5
  import { AttestedComputeRequestSchema, } from '../generated/es/inco/kms/lite/v1/kms_service_pb.js';
8
- import { getHandleType } from '../handle.js';
9
- import { defaultCovalidatorGrpc, getKmsClient } from '../kms/client.js';
10
6
  import { createEIP712Payload } from '../reencryption/eip712.js';
11
- import { retryWithBackoff } from '../retry.js';
12
7
  import { AttestedComputeError } from './types.js';
13
8
  export const ATTESTED_COMPUTE_DOMAIN_NAME = 'IncoAttestedCompute';
14
- export const ATTESTED_COMPUTE_DOMAIN_VERSION = '0.1.0';
9
+ export const ATTESTED_COMPUTE_DOMAIN_VERSION = '1';
15
10
  /**
16
11
  * Creates an attested compute function that can decrypt handles with an attached attestation from the covalidator.
17
12
  * @param args - The arguments for creating the attested compute function
@@ -20,10 +15,8 @@ export const ATTESTED_COMPUTE_DOMAIN_VERSION = '0.1.0';
20
15
  *
21
16
  * @todo Support multiple operations in a single request.
22
17
  */
23
- export async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsConnectRpcEndpointOrClient, chainId, }) {
18
+ export async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConfig, walletClient, kmsQuorumClient, chainId, }) {
24
19
  try {
25
- const kmsClient = getKmsClient(kmsConnectRpcEndpointOrClient ||
26
- defaultCovalidatorGrpc(getSupportedChain(chainId)));
27
20
  validateHandle(lhsHandle);
28
21
  const rhsPlaintextBig = typeof rhsPlaintext === 'boolean'
29
22
  ? rhsPlaintext
@@ -62,24 +55,8 @@ export async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConf
62
55
  },
63
56
  },
64
57
  });
65
- const response = await retryWithBackoff(async () => {
66
- return await kmsClient.attestedCompute(attestedComputeRequest);
67
- }, backoffConfig);
68
- const decryptionAttestation = response.decryptionAttestation;
69
- if (decryptionAttestation?.plaintext === undefined) {
70
- throw new AttestedComputeError('No plaintext in compute response');
71
- }
72
- const computeResultHandle = response.decryptionAttestation?.handle;
73
- if (!computeResultHandle) {
74
- throw new AttestedComputeError('No compute result handle in response');
75
- }
76
- const handleType = getHandleType(computeResultHandle);
77
- const bigIntValue = bytesToBigInt(decryptionAttestation.plaintext);
78
- return {
79
- handle: computeResultHandle,
80
- plaintext: bigintToPlaintext(encryptionSchemes.ecies, handleType, bigIntValue),
81
- covalidatorSignature: decryptionAttestation.signature,
82
- };
58
+ let decryptionAttestation = await kmsQuorumClient.attestedCompute(attestedComputeRequest, backoffConfig);
59
+ return decryptionAttestation;
83
60
  }
84
61
  catch (error) {
85
62
  if (error instanceof AttestedComputeError) {
@@ -88,4 +65,4 @@ export async function attestedCompute({ lhsHandle, op, rhsPlaintext, backoffConf
88
65
  throw new AttestedComputeError('Failed to perform attested compute', error);
89
66
  }
90
67
  }
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGNvbXB1dGUvYXR0ZXN0ZWQtY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWEsTUFBTSxjQUFjLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLGlCQUFpQixHQUVsQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFFTCw0QkFBNEIsR0FDN0IsTUFBTSxvREFBb0QsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFxQixNQUFNLFlBQVksQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxxQkFBcUIsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxPQUFPLENBQUM7QUFjdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUE2QixFQUNoRSxTQUFTLEVBQ1QsRUFBRSxFQUNGLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLDZCQUE2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
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZXN0ZWQtY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRlc3RlZGNvbXB1dGUvYXR0ZXN0ZWQtY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFFLGVBQWUsRUFBYSxNQUFNLGNBQWMsQ0FBQztBQUcxRCxPQUFPLEVBRUwsNEJBQTRCLEdBQzdCLE1BQU0sb0RBQW9ELENBQUM7QUFFNUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFxQixNQUFNLFlBQVksQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxxQkFBcUIsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxHQUFHLENBQUM7QUFjbkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUE2QixFQUNoRSxTQUFTLEVBQ1QsRUFBRSxFQUNGLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLGVBQWUsRUFDZixPQUFPLEdBU1I7SUFDQyxJQUFJLENBQUM7UUFDSCxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUIsTUFBTSxlQUFlLEdBQ25CLE9BQU8sWUFBWSxLQUFLLFNBQVM7WUFDL0IsQ0FBQyxDQUFDLFlBQVk7Z0JBQ1osQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLEVBQUU7WUFDTixDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNCLHVEQUF1RDtRQUN2RCxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztZQUN4QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUN4QixXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLGlCQUFpQixFQUFFO2dCQUNqQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtnQkFDN0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7Z0JBQ3RDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2FBQzFDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEVBQUUsRUFBRSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixZQUFZLEVBQUUsZUFBZSxDQUFDLGVBQWUsQ0FBQzthQUMvQztZQUNELFVBQVUsRUFBRSw0QkFBNEI7WUFDeEMsYUFBYSxFQUFFLCtCQUErQjtTQUMvQyxDQUFDLENBQUM7UUFFSCwwQkFBMEI7UUFDMUIsTUFBTSxlQUFlLEdBQUcsTUFBTSxZQUFZLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sc0JBQXNCLEdBQTJCLE1BQU0sQ0FDM0QsNEJBQTRCLEVBQzVCO1lBQ0UsV0FBVyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTztZQUN6QyxFQUFFLEVBQUUsRUFBRTtZQUNOLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFlBQVksRUFBRSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxlQUFlLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUM1QyxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLEtBQUssRUFBRSxFQUFFO2lCQUNWO2FBQ0Y7U0FDRixDQUNGLENBQUM7UUFFRixJQUFJLHFCQUFxQixHQUFHLE1BQU0sZUFBZSxDQUFDLGVBQWUsQ0FDL0Qsc0JBQXNCLEVBQ3RCLGFBQWEsQ0FDZCxDQUFDO1FBRUYsT0FBTyxxQkFBOEQsQ0FBQztJQUN4RSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxZQUFZLG9CQUFvQixFQUFFLENBQUM7WUFDMUMsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxJQUFJLG9CQUFvQixDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlFLENBQUM7QUFDSCxDQUFDIn0=