@inco/lightning-js 0.0.0-bootstrap.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.
- package/LICENSE +201 -0
- package/README.md +587 -0
- package/dist/cjs/advancedacl/index.d.ts +2 -0
- package/dist/cjs/advancedacl/index.js +19 -0
- package/dist/cjs/advancedacl/session-key.d.ts +95 -0
- package/dist/cjs/advancedacl/session-key.js +376 -0
- package/dist/cjs/advancedacl/types.d.ts +16 -0
- package/dist/cjs/advancedacl/types.js +3 -0
- package/dist/cjs/attestedcompute/attested-compute.d.ts +65 -0
- package/dist/cjs/attestedcompute/attested-compute.js +80 -0
- package/dist/cjs/attestedcompute/types.d.ts +35 -0
- package/dist/cjs/attestedcompute/types.js +46 -0
- package/dist/cjs/attesteddecrypt/attested-decrypt.d.ts +61 -0
- package/dist/cjs/attesteddecrypt/attested-decrypt.js +118 -0
- package/dist/cjs/attesteddecrypt/index.d.ts +1 -0
- package/dist/cjs/attesteddecrypt/index.js +18 -0
- package/dist/cjs/attesteddecrypt/types.d.ts +27 -0
- package/dist/cjs/attesteddecrypt/types.js +16 -0
- package/dist/cjs/attestedreveal/attested-reveal.d.ts +21 -0
- package/dist/cjs/attestedreveal/attested-reveal.js +31 -0
- package/dist/cjs/attestedreveal/index.d.ts +2 -0
- package/dist/cjs/attestedreveal/index.js +21 -0
- package/dist/cjs/attestedreveal/types.d.ts +4 -0
- package/dist/cjs/attestedreveal/types.js +13 -0
- package/dist/cjs/binary.d.ts +104 -0
- package/dist/cjs/binary.js +171 -0
- package/dist/cjs/chain.d.ts +50 -0
- package/dist/cjs/chain.js +62 -0
- package/dist/cjs/eip712/eip712.d.ts +18 -0
- package/dist/cjs/eip712/eip712.js +51 -0
- package/dist/cjs/eip712/index.d.ts +1 -0
- package/dist/cjs/eip712/index.js +8 -0
- package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
- package/dist/cjs/elistattesteddecrypt/elist-attested-decrypt.js +94 -0
- package/dist/cjs/elistattesteddecrypt/index.d.ts +2 -0
- package/dist/cjs/elistattesteddecrypt/index.js +22 -0
- package/dist/cjs/elistattesteddecrypt/types.d.ts +31 -0
- package/dist/cjs/elistattesteddecrypt/types.js +16 -0
- package/dist/cjs/encryption/encryption.d.ts +235 -0
- package/dist/cjs/encryption/encryption.js +226 -0
- package/dist/cjs/encryption/index.d.ts +1 -0
- package/dist/cjs/encryption/index.js +19 -0
- package/dist/cjs/generated/abis/add-two.d.ts +117 -0
- package/dist/cjs/generated/abis/add-two.js +80 -0
- package/dist/cjs/generated/abis/lightning.d.ts +3362 -0
- package/dist/cjs/generated/abis/lightning.js +2445 -0
- package/dist/cjs/generated/abis/test-elist.d.ts +276 -0
- package/dist/cjs/generated/abis/test-elist.js +168 -0
- package/dist/cjs/generated/abis/verifier.d.ts +1353 -0
- package/dist/cjs/generated/abis/verifier.js +954 -0
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/server_pb.js +395 -0
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
- package/dist/cjs/generated/es/inco/covalidator/compute/v1/types_pb.js +80 -0
- package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
- package/dist/cjs/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +28 -0
- package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
- package/dist/cjs/generated/es/inco/kms/lite/v1/kms_service_pb.js +100 -0
- package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
- package/dist/cjs/generated/es/inco/kms/lite/v1/types_pb.js +136 -0
- package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
- package/dist/cjs/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +88 -0
- package/dist/cjs/generated/lightning.d.ts +830 -0
- package/dist/cjs/generated/lightning.js +872 -0
- package/dist/cjs/generated/local-node.d.ts +50 -0
- package/dist/cjs/generated/local-node.js +107 -0
- package/dist/cjs/handle.d.ts +123 -0
- package/dist/cjs/handle.js +221 -0
- package/dist/cjs/index.d.ts +5 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/kms/client.d.ts +12 -0
- package/dist/cjs/kms/client.js +47 -0
- package/dist/cjs/kms/quorumClient.d.ts +65 -0
- package/dist/cjs/kms/quorumClient.js +463 -0
- package/dist/cjs/kms/quorumConsistency.d.ts +82 -0
- package/dist/cjs/kms/quorumConsistency.js +269 -0
- package/dist/cjs/kms/signatureVerification.d.ts +35 -0
- package/dist/cjs/kms/signatureVerification.js +88 -0
- package/dist/cjs/kms/thresholdPromises.d.ts +8 -0
- package/dist/cjs/kms/thresholdPromises.js +62 -0
- package/dist/cjs/lite/attested-compute.d.ts +6 -0
- package/dist/cjs/lite/attested-compute.js +8 -0
- package/dist/cjs/lite/attested-decrypt.d.ts +4 -0
- package/dist/cjs/lite/attested-decrypt.js +6 -0
- package/dist/cjs/lite/deployments.d.ts +24 -0
- package/dist/cjs/lite/deployments.js +21 -0
- package/dist/cjs/lite/hadu.d.ts +4 -0
- package/dist/cjs/lite/hadu.js +28 -0
- package/dist/cjs/lite/index.d.ts +13 -0
- package/dist/cjs/lite/index.js +31 -0
- package/dist/cjs/lite/lightning.d.ts +459 -0
- package/dist/cjs/lite/lightning.js +696 -0
- package/dist/cjs/lite/types.d.ts +47 -0
- package/dist/cjs/lite/types.js +3 -0
- package/dist/cjs/lite/xwing.d.ts +154 -0
- package/dist/cjs/lite/xwing.js +326 -0
- package/dist/cjs/local/index.d.ts +1 -0
- package/dist/cjs/local/index.js +18 -0
- package/dist/cjs/local/local-node.d.ts +37 -0
- package/dist/cjs/local/local-node.js +80 -0
- package/dist/cjs/reencryption/eip712.d.ts +56 -0
- package/dist/cjs/reencryption/eip712.js +90 -0
- package/dist/cjs/reencryption/index.d.ts +2 -0
- package/dist/cjs/reencryption/index.js +19 -0
- package/dist/cjs/reencryption/types.d.ts +48 -0
- package/dist/cjs/reencryption/types.js +3 -0
- package/dist/cjs/retry.d.ts +30 -0
- package/dist/cjs/retry.js +87 -0
- package/dist/cjs/schema.d.ts +4 -0
- package/dist/cjs/schema.js +19 -0
- package/dist/cjs/test/mocks.d.ts +20 -0
- package/dist/cjs/test/mocks.js +72 -0
- package/dist/cjs/viem.d.ts +1141 -0
- package/dist/cjs/viem.js +36 -0
- package/dist/esm/advancedacl/index.d.ts +2 -0
- package/dist/esm/advancedacl/index.js +3 -0
- package/dist/esm/advancedacl/session-key.d.ts +95 -0
- package/dist/esm/advancedacl/session-key.js +367 -0
- package/dist/esm/advancedacl/types.d.ts +16 -0
- package/dist/esm/advancedacl/types.js +2 -0
- package/dist/esm/attestedcompute/attested-compute.d.ts +65 -0
- package/dist/esm/attestedcompute/attested-compute.js +76 -0
- package/dist/esm/attestedcompute/types.d.ts +35 -0
- package/dist/esm/attestedcompute/types.js +42 -0
- package/dist/esm/attesteddecrypt/attested-decrypt.d.ts +61 -0
- package/dist/esm/attesteddecrypt/attested-decrypt.js +112 -0
- package/dist/esm/attesteddecrypt/index.d.ts +1 -0
- package/dist/esm/attesteddecrypt/index.js +2 -0
- package/dist/esm/attesteddecrypt/types.d.ts +27 -0
- package/dist/esm/attesteddecrypt/types.js +12 -0
- package/dist/esm/attestedreveal/attested-reveal.d.ts +21 -0
- package/dist/esm/attestedreveal/attested-reveal.js +28 -0
- package/dist/esm/attestedreveal/index.d.ts +2 -0
- package/dist/esm/attestedreveal/index.js +3 -0
- package/dist/esm/attestedreveal/types.d.ts +4 -0
- package/dist/esm/attestedreveal/types.js +9 -0
- package/dist/esm/binary.d.ts +104 -0
- package/dist/esm/binary.js +155 -0
- package/dist/esm/chain.d.ts +50 -0
- package/dist/esm/chain.js +58 -0
- package/dist/esm/eip712/eip712.d.ts +18 -0
- package/dist/esm/eip712/eip712.js +46 -0
- package/dist/esm/eip712/index.d.ts +1 -0
- package/dist/esm/eip712/index.js +2 -0
- package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
- package/dist/esm/elistattesteddecrypt/elist-attested-decrypt.js +89 -0
- package/dist/esm/elistattesteddecrypt/index.d.ts +2 -0
- package/dist/esm/elistattesteddecrypt/index.js +3 -0
- package/dist/esm/elistattesteddecrypt/types.d.ts +31 -0
- package/dist/esm/elistattesteddecrypt/types.js +12 -0
- package/dist/esm/encryption/encryption.d.ts +235 -0
- package/dist/esm/encryption/encryption.js +214 -0
- package/dist/esm/encryption/index.d.ts +1 -0
- package/dist/esm/encryption/index.js +2 -0
- package/dist/esm/generated/abis/add-two.d.ts +117 -0
- package/dist/esm/generated/abis/add-two.js +77 -0
- package/dist/esm/generated/abis/lightning.d.ts +3362 -0
- package/dist/esm/generated/abis/lightning.js +2442 -0
- package/dist/esm/generated/abis/test-elist.d.ts +276 -0
- package/dist/esm/generated/abis/test-elist.js +165 -0
- package/dist/esm/generated/abis/verifier.d.ts +1353 -0
- package/dist/esm/generated/abis/verifier.js +951 -0
- package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
- package/dist/esm/generated/es/inco/covalidator/compute/v1/server_pb.js +392 -0
- package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
- package/dist/esm/generated/es/inco/covalidator/compute/v1/types_pb.js +77 -0
- package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
- package/dist/esm/generated/es/inco/helioswrapper/v1/helioswrapper_pb.js +25 -0
- package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
- package/dist/esm/generated/es/inco/kms/lite/v1/kms_service_pb.js +97 -0
- package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
- package/dist/esm/generated/es/inco/kms/lite/v1/types_pb.js +133 -0
- package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
- package/dist/esm/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.js +85 -0
- package/dist/esm/generated/lightning.d.ts +830 -0
- package/dist/esm/generated/lightning.js +869 -0
- package/dist/esm/generated/local-node.d.ts +50 -0
- package/dist/esm/generated/local-node.js +104 -0
- package/dist/esm/handle.d.ts +123 -0
- package/dist/esm/handle.js +212 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/kms/client.d.ts +12 -0
- package/dist/esm/kms/client.js +40 -0
- package/dist/esm/kms/quorumClient.d.ts +65 -0
- package/dist/esm/kms/quorumClient.js +459 -0
- package/dist/esm/kms/quorumConsistency.d.ts +82 -0
- package/dist/esm/kms/quorumConsistency.js +260 -0
- package/dist/esm/kms/signatureVerification.d.ts +35 -0
- package/dist/esm/kms/signatureVerification.js +84 -0
- package/dist/esm/kms/thresholdPromises.d.ts +8 -0
- package/dist/esm/kms/thresholdPromises.js +59 -0
- package/dist/esm/lite/attested-compute.d.ts +6 -0
- package/dist/esm/lite/attested-compute.js +4 -0
- package/dist/esm/lite/attested-decrypt.d.ts +4 -0
- package/dist/esm/lite/attested-decrypt.js +3 -0
- package/dist/esm/lite/deployments.d.ts +24 -0
- package/dist/esm/lite/deployments.js +17 -0
- package/dist/esm/lite/hadu.d.ts +4 -0
- package/dist/esm/lite/hadu.js +24 -0
- package/dist/esm/lite/index.d.ts +13 -0
- package/dist/esm/lite/index.js +10 -0
- package/dist/esm/lite/lightning.d.ts +459 -0
- package/dist/esm/lite/lightning.js +692 -0
- package/dist/esm/lite/types.d.ts +47 -0
- package/dist/esm/lite/types.js +2 -0
- package/dist/esm/lite/xwing.d.ts +154 -0
- package/dist/esm/lite/xwing.js +311 -0
- package/dist/esm/local/index.d.ts +1 -0
- package/dist/esm/local/index.js +2 -0
- package/dist/esm/local/local-node.d.ts +37 -0
- package/dist/esm/local/local-node.js +76 -0
- package/dist/esm/reencryption/eip712.d.ts +56 -0
- package/dist/esm/reencryption/eip712.js +87 -0
- package/dist/esm/reencryption/index.d.ts +2 -0
- package/dist/esm/reencryption/index.js +3 -0
- package/dist/esm/reencryption/types.d.ts +48 -0
- package/dist/esm/reencryption/types.js +2 -0
- package/dist/esm/retry.d.ts +30 -0
- package/dist/esm/retry.js +82 -0
- package/dist/esm/schema.d.ts +4 -0
- package/dist/esm/schema.js +15 -0
- package/dist/esm/test/mocks.d.ts +20 -0
- package/dist/esm/test/mocks.js +64 -0
- package/dist/esm/viem.d.ts +1141 -0
- package/dist/esm/viem.js +32 -0
- package/dist/types/advancedacl/index.d.ts +2 -0
- package/dist/types/advancedacl/session-key.d.ts +95 -0
- package/dist/types/advancedacl/types.d.ts +16 -0
- package/dist/types/attestedcompute/attested-compute.d.ts +65 -0
- package/dist/types/attestedcompute/types.d.ts +35 -0
- package/dist/types/attesteddecrypt/attested-decrypt.d.ts +61 -0
- package/dist/types/attesteddecrypt/index.d.ts +1 -0
- package/dist/types/attesteddecrypt/types.d.ts +27 -0
- package/dist/types/attestedreveal/attested-reveal.d.ts +21 -0
- package/dist/types/attestedreveal/index.d.ts +2 -0
- package/dist/types/attestedreveal/types.d.ts +4 -0
- package/dist/types/binary.d.ts +104 -0
- package/dist/types/chain.d.ts +50 -0
- package/dist/types/eip712/eip712.d.ts +18 -0
- package/dist/types/eip712/index.d.ts +1 -0
- package/dist/types/elistattesteddecrypt/elist-attested-decrypt.d.ts +51 -0
- package/dist/types/elistattesteddecrypt/index.d.ts +2 -0
- package/dist/types/elistattesteddecrypt/types.d.ts +31 -0
- package/dist/types/encryption/encryption.d.ts +235 -0
- package/dist/types/encryption/index.d.ts +1 -0
- package/dist/types/generated/abis/add-two.d.ts +117 -0
- package/dist/types/generated/abis/lightning.d.ts +3362 -0
- package/dist/types/generated/abis/test-elist.d.ts +276 -0
- package/dist/types/generated/abis/verifier.d.ts +1353 -0
- package/dist/types/generated/es/inco/covalidator/compute/v1/server_pb.d.ts +1494 -0
- package/dist/types/generated/es/inco/covalidator/compute/v1/types_pb.d.ts +247 -0
- package/dist/types/generated/es/inco/helioswrapper/v1/helioswrapper_pb.d.ts +77 -0
- package/dist/types/generated/es/inco/kms/lite/v1/kms_service_pb.d.ts +685 -0
- package/dist/types/generated/es/inco/kms/lite/v1/types_pb.d.ts +289 -0
- package/dist/types/generated/es/inco/sealingfetcher/v1/sealingfetcher_pb.d.ts +371 -0
- package/dist/types/generated/lightning.d.ts +830 -0
- package/dist/types/generated/local-node.d.ts +50 -0
- package/dist/types/handle.d.ts +123 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/kms/client.d.ts +12 -0
- package/dist/types/kms/quorumClient.d.ts +65 -0
- package/dist/types/kms/quorumConsistency.d.ts +82 -0
- package/dist/types/kms/signatureVerification.d.ts +35 -0
- package/dist/types/kms/thresholdPromises.d.ts +8 -0
- package/dist/types/lite/attested-compute.d.ts +6 -0
- package/dist/types/lite/attested-decrypt.d.ts +4 -0
- package/dist/types/lite/deployments.d.ts +24 -0
- package/dist/types/lite/hadu.d.ts +4 -0
- package/dist/types/lite/index.d.ts +13 -0
- package/dist/types/lite/lightning.d.ts +459 -0
- package/dist/types/lite/types.d.ts +47 -0
- package/dist/types/lite/xwing.d.ts +154 -0
- package/dist/types/local/index.d.ts +1 -0
- package/dist/types/local/local-node.d.ts +37 -0
- package/dist/types/reencryption/eip712.d.ts +56 -0
- package/dist/types/reencryption/index.d.ts +2 -0
- package/dist/types/reencryption/types.d.ts +48 -0
- package/dist/types/retry.d.ts +30 -0
- package/dist/types/schema.d.ts +4 -0
- package/dist/types/test/mocks.d.ts +20 -0
- package/dist/types/viem.d.ts +1141 -0
- package/package.json +129 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
import { Address, HexString } from '../binary.js';
|
|
3
|
+
/**
|
|
4
|
+
* Schema for the environment variables required to connect to a local Inco node.
|
|
5
|
+
*
|
|
6
|
+
* Includes executor/sender addresses, keys, covalidator settings, and optional
|
|
7
|
+
* remote compute-server overrides. Typically populated from a `.env` file.
|
|
8
|
+
*/
|
|
9
|
+
export const LocalNodeEnv = Schema.Struct({
|
|
10
|
+
DEPLOYER_ADDRESS: Address,
|
|
11
|
+
STATE_DUMP: Schema.String,
|
|
12
|
+
EXECUTOR_ADDRESS: Address,
|
|
13
|
+
// Empty if compute-server is remote
|
|
14
|
+
NETWORK_PUBKEY: Schema.optional(HexString),
|
|
15
|
+
SENDER_ADDRESS: Address,
|
|
16
|
+
SENDER_PRIVATE_KEY: HexString,
|
|
17
|
+
// Empty if compute-server is remote
|
|
18
|
+
EIP712_SIGNER_ADDRESS: Schema.optional(HexString),
|
|
19
|
+
PEPPER: Schema.String,
|
|
20
|
+
// Empty if compute-server is remote
|
|
21
|
+
COVALIDATOR_NETWORK_PRIVATE_KEY: Schema.optional(HexString),
|
|
22
|
+
// Empty if compute-server is remote
|
|
23
|
+
COVALIDATOR_EIP712_PRIVATE_SIGNING_KEY: Schema.optional(HexString),
|
|
24
|
+
COVALIDATOR_INCO_EXECUTOR_ADDR: Address,
|
|
25
|
+
COVALIDATOR_HOST_CHAIN_ID: Schema.optional(Schema.String),
|
|
26
|
+
COVALIDATOR_URL: Schema.optional(Schema.String),
|
|
27
|
+
COVALIDATOR_HOST_CHAIN_RPC_URL: Schema.optional(Schema.String),
|
|
28
|
+
COVALIDATOR_COMPUTE_TYPE: Schema.optional(Schema.String),
|
|
29
|
+
COVALIDATOR_STORAGE_KEY: Schema.optional(HexString),
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Parses a dotenv-formatted string or `Buffer` into a validated {@link LocalNodeEnv}.
|
|
33
|
+
*
|
|
34
|
+
* Falls back to `process.env` when no argument is provided.
|
|
35
|
+
*
|
|
36
|
+
* @param envFileOrObj - A dotenv-formatted string, `Buffer`, or `undefined` to use `process.env`.
|
|
37
|
+
* @returns A validated `LocalNodeEnv` object.
|
|
38
|
+
* @throws If required environment variables are missing or invalid.
|
|
39
|
+
*/
|
|
40
|
+
export function parseLocalEnv(envFileOrObj) {
|
|
41
|
+
const envObj = envFileOrObj ? readEnv(envFileOrObj) : process.env;
|
|
42
|
+
return Schema.decodeUnknownSync(LocalNodeEnv)(envObj);
|
|
43
|
+
}
|
|
44
|
+
function readEnv(envContent) {
|
|
45
|
+
return parseEnv(envContent.toString());
|
|
46
|
+
}
|
|
47
|
+
// Parse environment variables with support for variable substitutions and comments
|
|
48
|
+
function parseEnv(envContent) {
|
|
49
|
+
let env = {};
|
|
50
|
+
const lines = envContent.split('\n');
|
|
51
|
+
// First pass: collect raw values
|
|
52
|
+
for (const line of lines) {
|
|
53
|
+
const trimmedLine = line.trim();
|
|
54
|
+
if (trimmedLine && !trimmedLine.startsWith('#')) {
|
|
55
|
+
const equalIndex = trimmedLine.indexOf('=');
|
|
56
|
+
if (equalIndex !== -1) {
|
|
57
|
+
const key = trimmedLine.substring(0, equalIndex).trim();
|
|
58
|
+
let value = trimmedLine.substring(equalIndex + 1).trim();
|
|
59
|
+
// Handle quoted values
|
|
60
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
61
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
62
|
+
value = value.substring(1, value.length - 1);
|
|
63
|
+
}
|
|
64
|
+
env[key] = value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Second pass: resolve substitutions like $VAR or ${VAR}
|
|
69
|
+
for (const [key, value] of Object.entries(env)) {
|
|
70
|
+
env[key] = value.replace(/\${?(\w+)}?/g, (_, varName) => {
|
|
71
|
+
return env[varName] ?? '';
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return env;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtbm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sb2NhbC9sb2NhbC1ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFbEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN4QyxnQkFBZ0IsRUFBRSxPQUFPO0lBQ3pCLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTTtJQUN6QixnQkFBZ0IsRUFBRSxPQUFPO0lBQ3pCLG9DQUFvQztJQUNwQyxjQUFjLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDMUMsY0FBYyxFQUFFLE9BQU87SUFDdkIsa0JBQWtCLEVBQUUsU0FBUztJQUM3QixvQ0FBb0M7SUFDcEMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDakQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0lBQ3JCLG9DQUFvQztJQUNwQywrQkFBK0IsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUMzRCxvQ0FBb0M7SUFDcEMsc0NBQXNDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7SUFDbEUsOEJBQThCLEVBQUUsT0FBTztJQUN2Qyx5QkFBeUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDekQsZUFBZSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMvQyw4QkFBOEIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUQsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLFFBQVEs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
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
import { Address } from 'viem';
|
|
3
|
+
declare const baseEIP712: Schema.Struct<{
|
|
4
|
+
domain: Schema.Struct<{
|
|
5
|
+
chainId: typeof Schema.BigInt;
|
|
6
|
+
name: typeof Schema.String;
|
|
7
|
+
version: typeof Schema.String;
|
|
8
|
+
verifyingContract: Schema.optional<Schema.TemplateLiteral<`0x${string}`>>;
|
|
9
|
+
}>;
|
|
10
|
+
primaryType: typeof Schema.String;
|
|
11
|
+
types: Schema.Record$<typeof Schema.String, Schema.Array$<Schema.Struct<{
|
|
12
|
+
name: typeof Schema.String;
|
|
13
|
+
type: typeof Schema.String;
|
|
14
|
+
}>>>;
|
|
15
|
+
}>;
|
|
16
|
+
type BaseEIP712 = typeof baseEIP712.Type;
|
|
17
|
+
/**
|
|
18
|
+
* An EIP-712 typed data payload with a generic `message` field.
|
|
19
|
+
*
|
|
20
|
+
* Extends the base EIP-712 structure (domain, primaryType, types) with
|
|
21
|
+
* a strongly-typed `message` object for signing.
|
|
22
|
+
*
|
|
23
|
+
* @typeParam Message - The shape of the application-specific message to sign.
|
|
24
|
+
*/
|
|
25
|
+
export interface EIP712<Message extends object> extends BaseEIP712 {
|
|
26
|
+
message: Message;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Creates an EIP-712 typed data payload for user signing.
|
|
30
|
+
*
|
|
31
|
+
* Used to verify the user controls the private key corresponding to the ephemeral
|
|
32
|
+
* public key embedded in the payload. The `message` keys must exactly match the
|
|
33
|
+
* `name` values in `primaryTypeFields`.
|
|
34
|
+
*
|
|
35
|
+
* @typeParam PrimaryType - The EIP-712 primary type name.
|
|
36
|
+
* @typeParam Message - The shape of the message to sign.
|
|
37
|
+
* @param params.chainId - The chain ID for the EIP-712 domain.
|
|
38
|
+
* @param params.primaryType - The primary type name (e.g. `"Reencrypt"`).
|
|
39
|
+
* @param params.primaryTypeFields - The field definitions for the primary type.
|
|
40
|
+
* @param params.message - The message object to sign (must match `primaryTypeFields`).
|
|
41
|
+
* @param params.verifyingContract - Optional verifying contract address for the domain.
|
|
42
|
+
* @param params.domainName - Human-readable name for the EIP-712 domain.
|
|
43
|
+
* @param params.domainVersion - Version string for the EIP-712 domain.
|
|
44
|
+
* @returns A complete {@link EIP712} payload ready for signing.
|
|
45
|
+
* @throws If message keys do not match `primaryTypeFields` names.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createEIP712Payload<PrimaryType extends string, Message extends object>({ chainId, primaryType, primaryTypeFields, message, verifyingContract, domainName, domainVersion, }: {
|
|
48
|
+
chainId: bigint;
|
|
49
|
+
primaryType: PrimaryType;
|
|
50
|
+
primaryTypeFields: BaseEIP712['types'][PrimaryType];
|
|
51
|
+
message: Message;
|
|
52
|
+
verifyingContract?: Address;
|
|
53
|
+
domainName: string;
|
|
54
|
+
domainVersion: string;
|
|
55
|
+
}): EIP712<Message>;
|
|
56
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
import { HexString } from '../binary.js';
|
|
3
|
+
// An effect Schema representing a base EIP712 typed message, without any
|
|
4
|
+
// custom message types, as defined in EIP-712.
|
|
5
|
+
const baseEIP712 = Schema.Struct({
|
|
6
|
+
domain: Schema.Struct({
|
|
7
|
+
chainId: Schema.BigInt,
|
|
8
|
+
name: Schema.String,
|
|
9
|
+
version: Schema.String,
|
|
10
|
+
verifyingContract: Schema.optional(HexString),
|
|
11
|
+
// If salt is needed, it can be added here. Currently, none of the Incolite
|
|
12
|
+
// features need this.
|
|
13
|
+
}),
|
|
14
|
+
primaryType: Schema.String,
|
|
15
|
+
types: Schema.Record({
|
|
16
|
+
key: Schema.String,
|
|
17
|
+
value: Schema.Array(Schema.Struct({
|
|
18
|
+
name: Schema.String,
|
|
19
|
+
type: Schema.String,
|
|
20
|
+
})),
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Creates an EIP-712 typed data payload for user signing.
|
|
25
|
+
*
|
|
26
|
+
* Used to verify the user controls the private key corresponding to the ephemeral
|
|
27
|
+
* public key embedded in the payload. The `message` keys must exactly match the
|
|
28
|
+
* `name` values in `primaryTypeFields`.
|
|
29
|
+
*
|
|
30
|
+
* @typeParam PrimaryType - The EIP-712 primary type name.
|
|
31
|
+
* @typeParam Message - The shape of the message to sign.
|
|
32
|
+
* @param params.chainId - The chain ID for the EIP-712 domain.
|
|
33
|
+
* @param params.primaryType - The primary type name (e.g. `"Reencrypt"`).
|
|
34
|
+
* @param params.primaryTypeFields - The field definitions for the primary type.
|
|
35
|
+
* @param params.message - The message object to sign (must match `primaryTypeFields`).
|
|
36
|
+
* @param params.verifyingContract - Optional verifying contract address for the domain.
|
|
37
|
+
* @param params.domainName - Human-readable name for the EIP-712 domain.
|
|
38
|
+
* @param params.domainVersion - Version string for the EIP-712 domain.
|
|
39
|
+
* @returns A complete {@link EIP712} payload ready for signing.
|
|
40
|
+
* @throws If message keys do not match `primaryTypeFields` names.
|
|
41
|
+
*/
|
|
42
|
+
export function createEIP712Payload({ chainId, primaryType, primaryTypeFields, message, verifyingContract, domainName, domainVersion, }) {
|
|
43
|
+
const types = {
|
|
44
|
+
// This refers to the domain the contract is hosted on.
|
|
45
|
+
EIP712Domain: [
|
|
46
|
+
{ name: 'name', type: 'string' },
|
|
47
|
+
{ name: 'version', type: 'string' },
|
|
48
|
+
{ name: 'chainId', type: 'uint256' },
|
|
49
|
+
],
|
|
50
|
+
// Refer to primaryType.
|
|
51
|
+
[primaryType]: primaryTypeFields,
|
|
52
|
+
};
|
|
53
|
+
if (verifyingContract) {
|
|
54
|
+
types.EIP712Domain.push({ name: 'verifyingContract', type: 'address' });
|
|
55
|
+
}
|
|
56
|
+
// Check that the message has the same keys as the primaryTypeFields.
|
|
57
|
+
const messageKeys = Object.keys(message);
|
|
58
|
+
const primaryTypeFieldsKeys = primaryTypeFields.map((field) => field.name);
|
|
59
|
+
if (messageKeys.length !== primaryTypeFieldsKeys.length) {
|
|
60
|
+
throw new Error('Message keys do not match primaryTypeFields keys');
|
|
61
|
+
}
|
|
62
|
+
for (const key of messageKeys) {
|
|
63
|
+
if (!primaryTypeFieldsKeys.includes(key)) {
|
|
64
|
+
throw new Error(`Message key ${key} does not match primaryTypeFields key`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const msgParams = {
|
|
68
|
+
types,
|
|
69
|
+
// This defines the message you're proposing the user to sign, is dapp-specific, and contains
|
|
70
|
+
// anything you want. There are no required fields. Be as explicit as possible when building out
|
|
71
|
+
// the message schema.
|
|
72
|
+
// This refers to the keys of the following types object.
|
|
73
|
+
primaryType,
|
|
74
|
+
domain: {
|
|
75
|
+
// Give a user-friendly name to the specific contract you're signing for.
|
|
76
|
+
name: domainName,
|
|
77
|
+
// This identifies the latest version.
|
|
78
|
+
version: domainVersion,
|
|
79
|
+
// This defines the network, in this case, Mainnet.
|
|
80
|
+
chainId,
|
|
81
|
+
verifyingContract,
|
|
82
|
+
},
|
|
83
|
+
message,
|
|
84
|
+
};
|
|
85
|
+
return msgParams;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWlwNzEyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlZW5jcnlwdGlvbi9laXA3MTIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpDLHlFQUF5RTtBQUN6RSwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDdEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ25CLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUN0QixpQkFBaUIsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUM3QywyRUFBMkU7UUFDM0Usc0JBQXNCO0tBQ3ZCLENBQUM7SUFDRixXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU07SUFDMUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDO1lBQ1osSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ25CLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTTtTQUNwQixDQUFDLENBQ0g7S0FDRixDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBZ0JIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBR2pDLEVBQ0EsT0FBTyxFQUNQLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsT0FBTyxFQUNQLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsYUFBYSxHQVNkO0lBQ0MsTUFBTSxLQUFLLEdBQUc7UUFDWix1REFBdUQ7UUFDdkQsWUFBWSxFQUFFO1lBQ1osRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDaEMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7WUFDbkMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7U0FDckM7UUFDRCx3QkFBd0I7UUFDeEIsQ0FBQyxXQUFXLENBQUMsRUFBRSxpQkFBaUI7S0FDakMsQ0FBQztJQUVGLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUN0QixLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxxQkFBcUIsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUsscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUNiLGVBQWUsR0FBRyx1Q0FBdUMsQ0FDMUQsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUc7UUFDaEIsS0FBSztRQUNMLDZGQUE2RjtRQUM3RixnR0FBZ0c7UUFDaEcsc0JBQXNCO1FBQ3RCLHlEQUF5RDtRQUN6RCxXQUFXO1FBQ1gsTUFBTSxFQUFFO1lBQ04seUVBQXlFO1lBQ3pFLElBQUksRUFBRSxVQUFVO1lBQ2hCLHNDQUFzQztZQUN0QyxPQUFPLEVBQUUsYUFBYTtZQUN0QixtREFBbUQ7WUFDbkQsT0FBTztZQUNQLGlCQUFpQjtTQUNsQjtRQUNELE9BQU87S0FDUixDQUFDO0lBRUYsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyJ9
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './eip712.js';
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVlbmNyeXB0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsWUFBWSxDQUFDIn0=
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Address } from 'viem';
|
|
2
|
+
import { HexString } from '../binary.js';
|
|
3
|
+
import { CiphertextOf, EncryptionScheme, PlaintextOf, SupportedTeeType } from '../encryption/encryption.js';
|
|
4
|
+
import { Handle } from '../handle.js';
|
|
5
|
+
import type { XwingKeypair } from '../lite/xwing.js';
|
|
6
|
+
import type { BackoffConfig } from '../retry.js';
|
|
7
|
+
/**
|
|
8
|
+
* The core reencryption function type. Takes a handle (and optional ciphertext) and returns
|
|
9
|
+
* the decrypted plaintext. Supports retry configuration for handles that are not yet available.
|
|
10
|
+
*
|
|
11
|
+
* @typeParam S - The encryption scheme (e.g. X-Wing).
|
|
12
|
+
*/
|
|
13
|
+
export type Reencryptor<S extends EncryptionScheme> = <T extends SupportedTeeType>(args: ReencryptFnArgs<S, T>, backoffConfig?: Partial<BackoffConfig>) => Promise<PlaintextOf<S, T>>;
|
|
14
|
+
/** Arguments required to construct a {@link Reencryptor}. */
|
|
15
|
+
export interface ReencryptorArgs {
|
|
16
|
+
chainId: bigint;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Arguments for a single reencryption call.
|
|
20
|
+
*
|
|
21
|
+
* @typeParam S - The encryption scheme.
|
|
22
|
+
* @typeParam T - The ENCRYPTION type of the ciphertext.
|
|
23
|
+
*/
|
|
24
|
+
export type ReencryptFnArgs<S extends EncryptionScheme, T extends SupportedTeeType> = {
|
|
25
|
+
handle: Handle;
|
|
26
|
+
/**
|
|
27
|
+
* Optional ciphertext hint. If provided, the reencrypt endpoint may use it directly
|
|
28
|
+
* instead of fetching from the covalidators.
|
|
29
|
+
*/
|
|
30
|
+
ciphertext?: CiphertextOf<S, T>;
|
|
31
|
+
};
|
|
32
|
+
/** Union of supported ephemeral keypair types for reencryption (currently X-Wing only). */
|
|
33
|
+
export type SupportedEphemeralKeypairs = XwingKeypair;
|
|
34
|
+
/** An object whose public key can be serialized to a `Uint8Array`. */
|
|
35
|
+
export interface PubKeyEncodable {
|
|
36
|
+
encodePublicKey(): Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A reencryption request to be sent to a reencrypt endpoint.
|
|
40
|
+
*
|
|
41
|
+
* @typeParam EKP - The type of ephemeral keypair used for the reencryption session.
|
|
42
|
+
*/
|
|
43
|
+
export interface ReencryptEndpointRequest<EKP extends SupportedEphemeralKeypairs> {
|
|
44
|
+
userAddress: Address;
|
|
45
|
+
handle: Handle;
|
|
46
|
+
eip712Signature: HexString;
|
|
47
|
+
ephemeralKeypair: EKP;
|
|
48
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for exponential backoff retry logic.
|
|
3
|
+
*/
|
|
4
|
+
export type BackoffConfig = {
|
|
5
|
+
maxRetries: number;
|
|
6
|
+
baseDelayInMs: number;
|
|
7
|
+
backoffFactor: number;
|
|
8
|
+
errHandler?: (error: Error, attempt: number) => 'stop' | 'continue';
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Checks if an error is safe to retry.
|
|
12
|
+
* Only transient errors matching the allowlist should return true.
|
|
13
|
+
* All other errors fail fast to avoid masking security-critical failures.
|
|
14
|
+
*
|
|
15
|
+
* @param error - The error to check
|
|
16
|
+
* @returns true if the error is transient and safe to retry, false otherwise
|
|
17
|
+
*/
|
|
18
|
+
export declare function isRetryableError(error: Error): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Default error handler that only retries known transient errors.
|
|
21
|
+
* Security-critical errors will fail fast.
|
|
22
|
+
*/
|
|
23
|
+
export declare function defaultRetryErrorHandler(error: Error): 'stop' | 'continue';
|
|
24
|
+
/**
|
|
25
|
+
* Helper function to implement exponential backoff retry logic.
|
|
26
|
+
* @param fn - The function to retry
|
|
27
|
+
* @param config - Optional backoff configuration
|
|
28
|
+
* @returns Promise that resolves with the result of the function
|
|
29
|
+
*/
|
|
30
|
+
export declare function retryWithBackoff<T>(fn: () => Promise<T>, { maxRetries, baseDelayInMs, backoffFactor, errHandler, }?: Partial<BackoffConfig>): Promise<T>;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Allowlist of transient error patterns that are safe to retry.
|
|
3
|
+
* Each pattern includes a substring to match (case-insensitive) and a description.
|
|
4
|
+
*
|
|
5
|
+
* SECURITY: Only add patterns here for genuinely transient errors.
|
|
6
|
+
* Do NOT add patterns that could mask security-critical errors like:
|
|
7
|
+
* - Authentication failures
|
|
8
|
+
* - Permission denied
|
|
9
|
+
* - Signature validation errors
|
|
10
|
+
* - Invalid input/format errors
|
|
11
|
+
*/
|
|
12
|
+
const RETRYABLE_ERROR_PATTERNS = [
|
|
13
|
+
// Explicit retry suggestions from the server
|
|
14
|
+
{
|
|
15
|
+
pattern: 'try again later',
|
|
16
|
+
description: 'Server explicitly suggests retry',
|
|
17
|
+
},
|
|
18
|
+
// Network/connectivity issues
|
|
19
|
+
{ pattern: 'timeout', description: 'Request timeout' },
|
|
20
|
+
{ pattern: 'etimedout', description: 'Connection timeout' },
|
|
21
|
+
{ pattern: 'econnreset', description: 'Connection reset' },
|
|
22
|
+
{ pattern: 'econnrefused', description: 'Connection refused' },
|
|
23
|
+
// Service availability
|
|
24
|
+
{ pattern: '503', description: 'Service unavailable (503)' },
|
|
25
|
+
{ pattern: 'service unavailable', description: 'Service unavailable' },
|
|
26
|
+
// Data propagation delays (eventual consistency)
|
|
27
|
+
{
|
|
28
|
+
pattern: 'ciphertext too short',
|
|
29
|
+
description: 'Ciphertext not yet propagated to covalidator',
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Checks if an error is safe to retry.
|
|
34
|
+
* Only transient errors matching the allowlist should return true.
|
|
35
|
+
* All other errors fail fast to avoid masking security-critical failures.
|
|
36
|
+
*
|
|
37
|
+
* @param error - The error to check
|
|
38
|
+
* @returns true if the error is transient and safe to retry, false otherwise
|
|
39
|
+
*/
|
|
40
|
+
export function isRetryableError(error) {
|
|
41
|
+
const message = error.message?.toLowerCase() ?? '';
|
|
42
|
+
return RETRYABLE_ERROR_PATTERNS.some(({ pattern }) => message.includes(pattern));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Default error handler that only retries known transient errors.
|
|
46
|
+
* Security-critical errors will fail fast.
|
|
47
|
+
*/
|
|
48
|
+
export function defaultRetryErrorHandler(error) {
|
|
49
|
+
if (isRetryableError(error)) {
|
|
50
|
+
console.warn(`Retrying after transient error: ${error.message}`);
|
|
51
|
+
return 'continue';
|
|
52
|
+
}
|
|
53
|
+
return 'stop';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Helper function to implement exponential backoff retry logic.
|
|
57
|
+
* @param fn - The function to retry
|
|
58
|
+
* @param config - Optional backoff configuration
|
|
59
|
+
* @returns Promise that resolves with the result of the function
|
|
60
|
+
*/
|
|
61
|
+
export async function retryWithBackoff(fn, {
|
|
62
|
+
// These default values will make it return an error after ~10s if the fn response is fast.
|
|
63
|
+
maxRetries = 5, baseDelayInMs = 1000, backoffFactor = 1.5, errHandler = defaultRetryErrorHandler, } = {}) {
|
|
64
|
+
let lastError;
|
|
65
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
66
|
+
try {
|
|
67
|
+
return await fn();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
lastError = error;
|
|
71
|
+
if (errHandler(lastError, attempt) !== 'continue' ||
|
|
72
|
+
attempt === maxRetries - 1) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
const delay = baseDelayInMs * Math.pow(backoffFactor, attempt);
|
|
76
|
+
const jitter = delay * (0.8 + Math.random() * 0.4); // random jitter, 80% to 120% of the delay
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, jitter));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
throw lastError;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUE7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sd0JBQXdCLEdBR3pCO0lBQ0gsNkNBQTZDO0lBQzdDO1FBQ0UsT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixXQUFXLEVBQUUsa0NBQWtDO0tBQ2hEO0lBRUQsOEJBQThCO0lBQzlCLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUU7SUFDdEQsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBRTtJQUMzRCxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFO0lBQzFELEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUU7SUFFOUQsdUJBQXVCO0lBQ3ZCLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsMkJBQTJCLEVBQUU7SUFDNUQsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFO0lBRXRFLGlEQUFpRDtJQUNqRDtRQUNFLE9BQU8sRUFBRSxzQkFBc0I7UUFDL0IsV0FBVyxFQUFFLDhDQUE4QztLQUM1RDtDQUNGLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQVk7SUFDM0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFFbkQsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FDbkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsS0FBWTtJQUNuRCxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEVBQW9CLEVBQ3BCO0FBQ0UsMkZBQTJGO0FBQzNGLFVBQVUsR0FBRyxDQUFDLEVBQ2QsYUFBYSxHQUFHLElBQUksRUFDcEIsYUFBYSxHQUFHLEdBQUcsRUFDbkIsVUFBVSxHQUFHLHdCQUF3QixNQUNYLEVBQUU7SUFFOUIsSUFBSSxTQUE0QixDQUFDO0lBRWpDLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDcEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixTQUFTLEdBQUcsS0FBYyxDQUFDO1lBQzNCLElBQ0UsVUFBVSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxVQUFVO2dCQUM3QyxPQUFPLEtBQUssVUFBVSxHQUFHLENBQUMsRUFDMUIsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUMvRCxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQTBDO1lBQzlGLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sU0FBUyxDQUFDO0FBQ2xCLENBQUMifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
import { ParseOptions } from 'effect/SchemaAST';
|
|
3
|
+
export declare function parse<A, I>(schema: Schema.Schema<A, I>, obj: unknown, options?: ParseOptions): A;
|
|
4
|
+
export declare function parseJson<A, I>(schema: Schema.Schema<A, I>, json: string | Uint8Array, options?: ParseOptions): A;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Schema } from 'effect';
|
|
2
|
+
// parse takes an effect Schema object and parses an unknown value into that schema, if parsing fails an error is thrown
|
|
3
|
+
// only fields specified in the schema will be present in the parsed object.
|
|
4
|
+
export function parse(schema, obj, options) {
|
|
5
|
+
return Schema.decodeUnknownSync(schema)(obj, options);
|
|
6
|
+
}
|
|
7
|
+
// parseJson takes an effect Schema object and parses a JSON string into that schema, if parsing fails an error is thrown
|
|
8
|
+
// only fields specified in the schema will be present in the parsed object.
|
|
9
|
+
export function parseJson(schema, json, options) {
|
|
10
|
+
if (typeof json !== 'string') {
|
|
11
|
+
json = json.toString();
|
|
12
|
+
}
|
|
13
|
+
return Schema.decodeUnknownSync(Schema.parseJson(schema))(json, options);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBR2hDLHdIQUF3SDtBQUN4SCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLEtBQUssQ0FDbkIsTUFBMkIsRUFDM0IsR0FBWSxFQUNaLE9BQXNCO0lBRXRCLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQseUhBQXlIO0FBQ3pILDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsU0FBUyxDQUN2QixNQUEyQixFQUMzQixJQUF5QixFQUN6QixPQUFzQjtJQUV0QixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0UsQ0FBQyJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Account, Chain, PublicClient, 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
|
+
attestedReveal: ReturnType<typeof vi.fn>;
|
|
9
|
+
eListAttestedDecrypt: ReturnType<typeof vi.fn>;
|
|
10
|
+
eListAttestedReveal: ReturnType<typeof vi.fn>;
|
|
11
|
+
key: ReturnType<typeof vi.fn>;
|
|
12
|
+
reencrypt: ReturnType<typeof vi.fn>;
|
|
13
|
+
}
|
|
14
|
+
export declare function createMockKmsClient(): MinimalKmsClient & KmsClient;
|
|
15
|
+
export declare function createMockQuorumClient(): KmsQuorumClient;
|
|
16
|
+
export declare function setupMockInQuorumClient(quorumClient: KmsQuorumClient, mockKmsClient: MinimalKmsClient & KmsClient): void;
|
|
17
|
+
export declare function createMockPublicClient(): PublicClient<Transport, Chain>;
|
|
18
|
+
export declare function createTestWalletClient(): WalletClient<Transport, Chain, Account>;
|
|
19
|
+
export declare function createFallbackWalletClient(): WalletClient<Transport, Chain, Account>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createPublicClient, createWalletClient, fallback, http, } from 'viem';
|
|
2
|
+
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
3
|
+
import { sepolia } from 'viem/chains';
|
|
4
|
+
import { vi } from 'vitest';
|
|
5
|
+
import { TEST_DEFAULT_COVALIDATOR_SIGNER } from '../kms/client.js';
|
|
6
|
+
import { KmsQuorumClient } from '../kms/quorumClient.js';
|
|
7
|
+
// Create a mock that satisfies our minimal interface
|
|
8
|
+
export function createMockKmsClient() {
|
|
9
|
+
return {
|
|
10
|
+
attestedCompute: vi.fn(),
|
|
11
|
+
attestedDecrypt: vi.fn(),
|
|
12
|
+
attestedReveal: vi.fn(),
|
|
13
|
+
eListAttestedDecrypt: vi.fn(),
|
|
14
|
+
eListAttestedReveal: vi.fn(),
|
|
15
|
+
key: vi.fn(),
|
|
16
|
+
reencrypt: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Create a mock KmsQuorumClient from a mock KmsClient for testing
|
|
20
|
+
export function createMockQuorumClient() {
|
|
21
|
+
// Use the private constructor via type casting (similar to quorumClient.test.ts)
|
|
22
|
+
const AnyClass = KmsQuorumClient;
|
|
23
|
+
return new AnyClass([{ url: 'https://mock-kms', signer: TEST_DEFAULT_COVALIDATOR_SIGNER }], 1);
|
|
24
|
+
}
|
|
25
|
+
// Helper to set up the mock client inside the quorum client
|
|
26
|
+
export function setupMockInQuorumClient(quorumClient, mockKmsClient) {
|
|
27
|
+
// Access private kmss array and replace the client
|
|
28
|
+
const anyQuorumClient = quorumClient;
|
|
29
|
+
if (anyQuorumClient.kmss && anyQuorumClient.kmss.length > 0) {
|
|
30
|
+
anyQuorumClient.kmss[0].client = mockKmsClient;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Create a public client for testing (transport URL is never actually called;
|
|
34
|
+
// publicClient is required by attestedDecrypt/attestedCompute but KMS is mocked in tests)
|
|
35
|
+
export function createMockPublicClient() {
|
|
36
|
+
return createPublicClient({
|
|
37
|
+
chain: sepolia,
|
|
38
|
+
transport: http('http://localhost:8567'),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Create a wallet client for testing (transport URL is never actually called;
|
|
42
|
+
// signing with a local key account does not require an RPC connection)
|
|
43
|
+
export function createTestWalletClient() {
|
|
44
|
+
const account = privateKeyToAccount(generatePrivateKey());
|
|
45
|
+
return createWalletClient({
|
|
46
|
+
chain: sepolia, // Arbitrary chain, not relevant to test
|
|
47
|
+
transport: http('http://localhost:8567'),
|
|
48
|
+
account,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Create a wallet client with a fallback() transport for testing that code
|
|
52
|
+
// handles non-http transports correctly (fallback has no .url property)
|
|
53
|
+
export function createFallbackWalletClient() {
|
|
54
|
+
const account = privateKeyToAccount(generatePrivateKey());
|
|
55
|
+
return createWalletClient({
|
|
56
|
+
chain: sepolia,
|
|
57
|
+
transport: fallback([
|
|
58
|
+
http('http://localhost:8567'),
|
|
59
|
+
http('http://localhost:8568'),
|
|
60
|
+
]),
|
|
61
|
+
account,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVzdC9tb2Nrcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsSUFBSSxHQUlMLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQWEsK0JBQStCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFjekQscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsT0FBTztRQUNMLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLGVBQWUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLGNBQWMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZCLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0IsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNaLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO0tBQ2EsQ0FBQztBQUNwQyxDQUFDO0FBRUQsa0VBQWtFO0FBQ2xFLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsaUZBQWlGO0lBQ2pGLE1BQU0sUUFBUSxHQUFRLGVBQWUsQ0FBQztJQUN0QyxPQUFPLElBQUksUUFBUSxDQUNqQixDQUFDLEVBQUUsR0FBRyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxDQUFDLEVBQ3RFLENBQUMsQ0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLFlBQTZCLEVBQzdCLGFBQTJDO0lBRTNDLG1EQUFtRDtJQUNuRCxNQUFNLGVBQWUsR0FBRyxZQUFtQixDQUFDO0lBQzVDLElBQUksZUFBZSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7SUFDakQsQ0FBQztBQUNILENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsMEZBQTBGO0FBQzFGLE1BQU0sVUFBVSxzQkFBc0I7SUFDcEMsT0FBTyxrQkFBa0IsQ0FBQztRQUN4QixLQUFLLEVBQUUsT0FBTztRQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUM7S0FDekMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLHNCQUFzQjtJQUtwQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDMUQsT0FBTyxrQkFBa0IsQ0FBQztRQUN4QixLQUFLLEVBQUUsT0FBTyxFQUFFLHdDQUF3QztRQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQ3hDLE9BQU87S0FDUixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsMEJBQTBCO0lBS3hDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUMxRCxPQUFPLGtCQUFrQixDQUFDO1FBQ3hCLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUNsQixJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1NBQzlCLENBQUM7UUFDRixPQUFPO0tBQ1IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|