@prb/effect-evm-safe 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ The format is based on [Common Changelog](https://common-changelog.org/).
7
7
  [1.0.0]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%401.0.0
8
8
  [1.0.1]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%401.0.1
9
9
  [1.1.0]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%401.1.0
10
+ [1.1.1]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%401.1.1
11
+
12
+ ## [1.1.1] - 2026-02-10
13
+
14
+ ### Changed
15
+
16
+ - Preserve Safe SDK submission cause details (including nested `cause` and user-rejection `4001`) so
17
+ `SafeMultisigTxSubmissionError` and batch write failures no longer collapse to generic messages
10
18
 
11
19
  ## [1.1.0] - 2026-02-10
12
20
 
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/safe/batch.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWjD,eAAO,MAAM,sBAAsB,8MAqBjC,CAAC"}
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/safe/batch.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAGL,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWjD,eAAO,MAAM,sBAAsB,8MA2BjC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { Effect } from "effect";
2
- import { isMultiSendUnavailableError, SafeMultiSendUnavailableError, SafeMultisigTxSubmissionError, } from "./errors.js";
2
+ import { getSafeErrorMessage, isMultiSendUnavailableError, SafeMultiSendUnavailableError, SafeMultisigTxSubmissionError, } from "./errors.js";
3
3
  import { SafeAppsService } from "./service.js";
4
4
  export const safeMultisigBatchWrite = Effect.fn("safeMultisigBatchWrite")(function* (transactions, chainId) {
5
5
  const safeApps = yield* SafeAppsService;
@@ -11,9 +11,13 @@ export const safeMultisigBatchWrite = Effect.fn("safeMultisigBatchWrite")(functi
11
11
  message: `MultiSend contract not available on chain ${chainId ?? "unknown"}`,
12
12
  });
13
13
  }
14
+ if (error instanceof SafeMultisigTxSubmissionError) {
15
+ return error;
16
+ }
17
+ const detail = getSafeErrorMessage(error);
14
18
  return new SafeMultisigTxSubmissionError({
15
19
  cause: error,
16
- message: `Safe batch write failed: ${error.message}`,
20
+ message: detail ? `Safe batch write failed: ${detail}` : "Safe batch write failed",
17
21
  });
18
22
  }));
19
23
  return result.safeTxHash;
@@ -1 +1 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/safe/batch.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAY/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EACjF,YAA4D,EAC5D,OAAgB;IAEhB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QACxB,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,6BAA6B,CAAC;gBACvC,KAAK,EAAE,KAAK;gBACZ,OAAO;gBACP,OAAO,EAAE,6CAA6C,OAAO,IAAI,SAAS,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,6BAA6B,CAAC;YACvC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,4BAA4B,KAAK,CAAC,OAAO,EAAE;SACrD,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;IACF,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Safe multisig batch transaction operations.\n *\n * Send multiple transactions as an atomic Safe batch using SafeAppsSDK.\n * Detects MultiSend contract unavailability and surfaces it as a typed error.\n *\n * @module safe/batch\n */\n\nimport { Effect } from \"effect\";\nimport {\n isMultiSendUnavailableError,\n SafeMultiSendUnavailableError,\n SafeMultisigTxSubmissionError,\n} from \"./errors.js\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { SafeMultisigTx } from \"./types.js\";\n\n/**\n * Send multiple transactions as a single Safe multisig batch.\n *\n * Uses SafeAppsService to atomically execute all transactions via MultiSend.\n * On chains where MultiSend is not deployed, fails with `SafeMultiSendUnavailableError`.\n *\n * @param transactions - Array of transactions to batch\n * @param chainId - Optional chain ID for error context\n */\nexport const safeMultisigBatchWrite = Effect.fn(\"safeMultisigBatchWrite\")(function* (\n transactions: readonly [SafeMultisigTx, ...SafeMultisigTx[]],\n chainId?: number\n) {\n const safeApps = yield* SafeAppsService;\n const result = yield* safeApps.sendTxs(transactions).pipe(\n Effect.mapError((error) => {\n if (isMultiSendUnavailableError(error)) {\n return new SafeMultiSendUnavailableError({\n cause: error,\n chainId,\n message: `MultiSend contract not available on chain ${chainId ?? \"unknown\"}`,\n });\n }\n return new SafeMultisigTxSubmissionError({\n cause: error,\n message: `Safe batch write failed: ${error.message}`,\n });\n })\n );\n return result.safeTxHash;\n});\n"]}
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/safe/batch.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAY/C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,QAAQ,CAAC,EACjF,YAA4D,EAC5D,OAAgB;IAEhB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QACxB,IAAI,2BAA2B,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,6BAA6B,CAAC;gBACvC,KAAK,EAAE,KAAK;gBACZ,OAAO;gBACP,OAAO,EAAE,6CAA6C,OAAO,IAAI,SAAS,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,YAAY,6BAA6B,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,IAAI,6BAA6B,CAAC;YACvC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC,CAAC,yBAAyB;SACnF,CAAC,CAAC;IACL,CAAC,CAAC,CACH,CAAC;IACF,OAAO,MAAM,CAAC,UAAU,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["/**\n * Safe multisig batch transaction operations.\n *\n * Send multiple transactions as an atomic Safe batch using SafeAppsSDK.\n * Detects MultiSend contract unavailability and surfaces it as a typed error.\n *\n * @module safe/batch\n */\n\nimport { Effect } from \"effect\";\nimport {\n getSafeErrorMessage,\n isMultiSendUnavailableError,\n SafeMultiSendUnavailableError,\n SafeMultisigTxSubmissionError,\n} from \"./errors.js\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { SafeMultisigTx } from \"./types.js\";\n\n/**\n * Send multiple transactions as a single Safe multisig batch.\n *\n * Uses SafeAppsService to atomically execute all transactions via MultiSend.\n * On chains where MultiSend is not deployed, fails with `SafeMultiSendUnavailableError`.\n *\n * @param transactions - Array of transactions to batch\n * @param chainId - Optional chain ID for error context\n */\nexport const safeMultisigBatchWrite = Effect.fn(\"safeMultisigBatchWrite\")(function* (\n transactions: readonly [SafeMultisigTx, ...SafeMultisigTx[]],\n chainId?: number\n) {\n const safeApps = yield* SafeAppsService;\n const result = yield* safeApps.sendTxs(transactions).pipe(\n Effect.mapError((error) => {\n if (isMultiSendUnavailableError(error)) {\n return new SafeMultiSendUnavailableError({\n cause: error,\n chainId,\n message: `MultiSend contract not available on chain ${chainId ?? \"unknown\"}`,\n });\n }\n\n if (error instanceof SafeMultisigTxSubmissionError) {\n return error;\n }\n\n const detail = getSafeErrorMessage(error);\n return new SafeMultisigTxSubmissionError({\n cause: error,\n message: detail ? `Safe batch write failed: ${detail}` : \"Safe batch write failed\",\n });\n })\n );\n return result.safeTxHash;\n});\n"]}
@@ -84,6 +84,7 @@ declare const SafeMultiSendUnavailableError_base: Schema.TaggedErrorClass<SafeMu
84
84
  }>;
85
85
  export declare class SafeMultiSendUnavailableError extends SafeMultiSendUnavailableError_base {
86
86
  }
87
+ export declare function getSafeErrorMessage(error: unknown): string | undefined;
87
88
  export declare function isMultiSendUnavailableError(error: unknown): boolean;
88
89
  export {};
89
90
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/safe/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;AAGhC,qBAAa,2BAA4B,SAAQ,gCAGhD;CAAG;;;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAG7C;CAAG;;;;;;;AAGJ,qBAAa,gCAAiC,SAAQ,qCAGrD;CAAG;;;;;;;AAEJ,qBAAa,yBAA0B,SAAQ,8BAG9C;CAAG;;;;;;;AAEJ,qBAAa,6BAA8B,SAAQ,kCAGlD;CAAG;;;;;;;;;AAEJ,qBAAa,yBAA0B,SAAQ,8BAQ9C;CAAG;;;;;;;;;AAEJ,qBAAa,mCAAoC,SAAQ,wCAQxD;CAAG;;;;;;;AAGJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;;;;;AAEJ,qBAAa,6BAA8B,SAAQ,kCAOlD;CAAG;;;;;;;;AAIJ,qBAAa,6BAA8B,SAAQ,kCAOlD;CAAG;AAWJ,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/safe/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;;;AAGhC,qBAAa,2BAA4B,SAAQ,gCAGhD;CAAG;;;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAG7C;CAAG;;;;;;;AAGJ,qBAAa,gCAAiC,SAAQ,qCAGrD;CAAG;;;;;;;AAEJ,qBAAa,yBAA0B,SAAQ,8BAG9C;CAAG;;;;;;;AAEJ,qBAAa,6BAA8B,SAAQ,kCAGlD;CAAG;;;;;;;;;AAEJ,qBAAa,yBAA0B,SAAQ,8BAQ9C;CAAG;;;;;;;;;AAEJ,qBAAa,mCAAoC,SAAQ,wCAQxD;CAAG;;;;;;;AAGJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;;;;;AAEJ,qBAAa,6BAA8B,SAAQ,kCAOlD;CAAG;;;;;;;;AAIJ,qBAAa,6BAA8B,SAAQ,kCAOlD;CAAG;AA0GJ,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEtE;AAMD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEnE"}
@@ -39,6 +39,76 @@ export class SafeMultiSendUnavailableError extends Schema.TaggedError()("SafeMul
39
39
  }
40
40
  const MULTISEND_ERROR_PATTERN = /MultiSend contract not deployed|MultiSend call failed/i;
41
41
  const MAX_ERROR_DEPTH = 10;
42
+ const USER_REJECTION_CODE = 4001;
43
+ const MAX_ERROR_MESSAGE_DEPTH = 10;
44
+ function toNonEmptyString(value) {
45
+ if (typeof value !== "string") {
46
+ return undefined;
47
+ }
48
+ const normalized = value.trim();
49
+ return normalized.length > 0 ? normalized : undefined;
50
+ }
51
+ function isUserRejectionCode(code) {
52
+ return code === USER_REJECTION_CODE || code === `${USER_REJECTION_CODE}`;
53
+ }
54
+ function getSafeErrorMessageInternal(error, depth) {
55
+ if (!error || depth >= MAX_ERROR_MESSAGE_DEPTH) {
56
+ return undefined;
57
+ }
58
+ if (typeof error === "string") {
59
+ return toNonEmptyString(error);
60
+ }
61
+ if (error instanceof Error) {
62
+ if (isUserRejectionCode(error.code)) {
63
+ return "User rejected the request";
64
+ }
65
+ const shortMessage = toNonEmptyString(error.shortMessage);
66
+ if (shortMessage) {
67
+ return shortMessage;
68
+ }
69
+ const message = toNonEmptyString(error.message);
70
+ if (message) {
71
+ return message;
72
+ }
73
+ return getSafeErrorMessageInternal(error.cause, depth + 1);
74
+ }
75
+ if (typeof error !== "object") {
76
+ return undefined;
77
+ }
78
+ const typedError = error;
79
+ if (isUserRejectionCode(typedError.code)) {
80
+ return "User rejected the request";
81
+ }
82
+ const shortMessage = toNonEmptyString(typedError.shortMessage);
83
+ if (shortMessage) {
84
+ return shortMessage;
85
+ }
86
+ const message = toNonEmptyString(typedError.message);
87
+ if (message) {
88
+ return message;
89
+ }
90
+ const causeMessage = getSafeErrorMessageInternal(typedError.cause, depth + 1);
91
+ if (causeMessage) {
92
+ return causeMessage;
93
+ }
94
+ const nestedErrorMessage = getSafeErrorMessageInternal(typedError.error, depth + 1);
95
+ if (nestedErrorMessage) {
96
+ return nestedErrorMessage;
97
+ }
98
+ if (!Array.isArray(typedError.errors)) {
99
+ return undefined;
100
+ }
101
+ for (const nestedError of typedError.errors) {
102
+ const nestedMessage = getSafeErrorMessageInternal(nestedError, depth + 1);
103
+ if (nestedMessage) {
104
+ return nestedMessage;
105
+ }
106
+ }
107
+ return undefined;
108
+ }
109
+ export function getSafeErrorMessage(error) {
110
+ return getSafeErrorMessageInternal(error, 0);
111
+ }
42
112
  export function isMultiSendUnavailableError(error) {
43
113
  return checkMultiSendError(error, 0);
44
114
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/safe/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema } from \"effect\";\n\n// SDK availability errors\nexport class SafeAppsSdkUnavailableError extends Schema.TaggedError<SafeAppsSdkUnavailableError>()(\n \"SafeAppsSdkUnavailableError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class NotInSafeAppContextError extends Schema.TaggedError<NotInSafeAppContextError>()(\n \"NotInSafeAppContextError\",\n { message: Schema.String }\n) {}\n\n// Safe operation errors\nexport class SafeMultisigInfoUnavailableError extends Schema.TaggedError<SafeMultisigInfoUnavailableError>()(\n \"SafeMultisigInfoUnavailableError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigSettingsError extends Schema.TaggedError<SafeMultisigSettingsError>()(\n \"SafeMultisigSettingsError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigTxSubmissionError extends Schema.TaggedError<SafeMultisigTxSubmissionError>()(\n \"SafeMultisigTxSubmissionError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigTxLookupError extends Schema.TaggedError<SafeMultisigTxLookupError>()(\n \"SafeMultisigTxLookupError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n retryable: Schema.Boolean,\n safeTxHash: Schema.String,\n }\n) {}\n\nexport class SafeMultisigTxExecutionTimeoutError extends Schema.TaggedError<SafeMultisigTxExecutionTimeoutError>()(\n \"SafeMultisigTxExecutionTimeoutError\",\n {\n lastStatus: Schema.optional(Schema.String),\n message: Schema.String,\n safeTxHash: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n\n// Signing errors\nexport class SignTypedDataError extends Schema.TaggedError<SignTypedDataError>()(\n \"SignTypedDataError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class OffchainSignatureTimeoutError extends Schema.TaggedError<OffchainSignatureTimeoutError>()(\n \"OffchainSignatureTimeoutError\",\n {\n message: Schema.String,\n messageHash: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n\n// MultiSend errors\n\nexport class SafeMultiSendUnavailableError extends Schema.TaggedError<SafeMultiSendUnavailableError>()(\n \"SafeMultiSendUnavailableError\",\n {\n cause: Schema.optional(Schema.Unknown),\n chainId: Schema.optional(Schema.Number),\n message: Schema.String,\n }\n) {}\n\n// MultiSend error detection\n\nconst MULTISEND_ERROR_PATTERN = /MultiSend contract not deployed|MultiSend call failed/i;\nconst MAX_ERROR_DEPTH = 10;\n\n/**\n * Check if an error is caused by MultiSend contract unavailability.\n * Recursively checks error messages and causes for MultiSend-related strings.\n */\nexport function isMultiSendUnavailableError(error: unknown): boolean {\n return checkMultiSendError(error, 0);\n}\n\nfunction checkMultiSendError(error: unknown, depth: number): boolean {\n if (depth >= MAX_ERROR_DEPTH) {\n return false;\n }\n\n if (typeof error === \"string\") {\n return MULTISEND_ERROR_PATTERN.test(error);\n }\n\n if (typeof error === \"object\" && error !== null) {\n const { message, cause } = error as { message?: unknown; cause?: unknown };\n\n if (typeof message === \"string\" && MULTISEND_ERROR_PATTERN.test(message)) {\n return true;\n }\n\n if (cause) {\n return checkMultiSendError(cause, depth + 1);\n }\n }\n\n return false;\n}\n"]}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/safe/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Schema } from \"effect\";\n\n// SDK availability errors\nexport class SafeAppsSdkUnavailableError extends Schema.TaggedError<SafeAppsSdkUnavailableError>()(\n \"SafeAppsSdkUnavailableError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class NotInSafeAppContextError extends Schema.TaggedError<NotInSafeAppContextError>()(\n \"NotInSafeAppContextError\",\n { message: Schema.String }\n) {}\n\n// Safe operation errors\nexport class SafeMultisigInfoUnavailableError extends Schema.TaggedError<SafeMultisigInfoUnavailableError>()(\n \"SafeMultisigInfoUnavailableError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigSettingsError extends Schema.TaggedError<SafeMultisigSettingsError>()(\n \"SafeMultisigSettingsError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigTxSubmissionError extends Schema.TaggedError<SafeMultisigTxSubmissionError>()(\n \"SafeMultisigTxSubmissionError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeMultisigTxLookupError extends Schema.TaggedError<SafeMultisigTxLookupError>()(\n \"SafeMultisigTxLookupError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n retryable: Schema.Boolean,\n safeTxHash: Schema.String,\n }\n) {}\n\nexport class SafeMultisigTxExecutionTimeoutError extends Schema.TaggedError<SafeMultisigTxExecutionTimeoutError>()(\n \"SafeMultisigTxExecutionTimeoutError\",\n {\n lastStatus: Schema.optional(Schema.String),\n message: Schema.String,\n safeTxHash: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n\n// Signing errors\nexport class SignTypedDataError extends Schema.TaggedError<SignTypedDataError>()(\n \"SignTypedDataError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class OffchainSignatureTimeoutError extends Schema.TaggedError<OffchainSignatureTimeoutError>()(\n \"OffchainSignatureTimeoutError\",\n {\n message: Schema.String,\n messageHash: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n\n// MultiSend errors\n\nexport class SafeMultiSendUnavailableError extends Schema.TaggedError<SafeMultiSendUnavailableError>()(\n \"SafeMultiSendUnavailableError\",\n {\n cause: Schema.optional(Schema.Unknown),\n chainId: Schema.optional(Schema.Number),\n message: Schema.String,\n }\n) {}\n\n// MultiSend error detection\n\nconst MULTISEND_ERROR_PATTERN = /MultiSend contract not deployed|MultiSend call failed/i;\nconst MAX_ERROR_DEPTH = 10;\nconst USER_REJECTION_CODE = 4001;\nconst MAX_ERROR_MESSAGE_DEPTH = 10;\n\ntype ErrorMessageShape = {\n readonly cause?: unknown;\n readonly code?: unknown;\n readonly error?: unknown;\n readonly errors?: unknown;\n readonly message?: unknown;\n readonly shortMessage?: unknown;\n};\n\nfunction toNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const normalized = value.trim();\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction isUserRejectionCode(code: unknown): boolean {\n return code === USER_REJECTION_CODE || code === `${USER_REJECTION_CODE}`;\n}\n\nfunction getSafeErrorMessageInternal(error: unknown, depth: number): string | undefined {\n if (!error || depth >= MAX_ERROR_MESSAGE_DEPTH) {\n return undefined;\n }\n\n if (typeof error === \"string\") {\n return toNonEmptyString(error);\n }\n\n if (error instanceof Error) {\n if (isUserRejectionCode((error as { code?: unknown }).code)) {\n return \"User rejected the request\";\n }\n\n const shortMessage = toNonEmptyString((error as { shortMessage?: unknown }).shortMessage);\n if (shortMessage) {\n return shortMessage;\n }\n\n const message = toNonEmptyString(error.message);\n if (message) {\n return message;\n }\n\n return getSafeErrorMessageInternal((error as { cause?: unknown }).cause, depth + 1);\n }\n\n if (typeof error !== \"object\") {\n return undefined;\n }\n\n const typedError = error as ErrorMessageShape;\n\n if (isUserRejectionCode(typedError.code)) {\n return \"User rejected the request\";\n }\n\n const shortMessage = toNonEmptyString(typedError.shortMessage);\n if (shortMessage) {\n return shortMessage;\n }\n\n const message = toNonEmptyString(typedError.message);\n if (message) {\n return message;\n }\n\n const causeMessage = getSafeErrorMessageInternal(typedError.cause, depth + 1);\n if (causeMessage) {\n return causeMessage;\n }\n\n const nestedErrorMessage = getSafeErrorMessageInternal(typedError.error, depth + 1);\n if (nestedErrorMessage) {\n return nestedErrorMessage;\n }\n\n if (!Array.isArray(typedError.errors)) {\n return undefined;\n }\n\n for (const nestedError of typedError.errors) {\n const nestedMessage = getSafeErrorMessageInternal(nestedError, depth + 1);\n if (nestedMessage) {\n return nestedMessage;\n }\n }\n\n return undefined;\n}\n\n/**\n * Best-effort extraction of a human-readable Safe SDK error message.\n * Preserves nested `cause` / `error` chains and handles EIP-1193 user rejection codes.\n */\nexport function getSafeErrorMessage(error: unknown): string | undefined {\n return getSafeErrorMessageInternal(error, 0);\n}\n\n/**\n * Check if an error is caused by MultiSend contract unavailability.\n * Recursively checks error messages and causes for MultiSend-related strings.\n */\nexport function isMultiSendUnavailableError(error: unknown): boolean {\n return checkMultiSendError(error, 0);\n}\n\nfunction checkMultiSendError(error: unknown, depth: number): boolean {\n if (depth >= MAX_ERROR_DEPTH) {\n return false;\n }\n\n if (typeof error === \"string\") {\n return MULTISEND_ERROR_PATTERN.test(error);\n }\n\n if (typeof error === \"object\" && error !== null) {\n const { message, cause } = error as { message?: unknown; cause?: unknown };\n\n if (typeof message === \"string\" && MULTISEND_ERROR_PATTERN.test(message)) {\n return true;\n }\n\n if (cause) {\n return checkMultiSendError(cause, depth + 1);\n }\n }\n\n return false;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAU,KAAK,EAAe,MAAM,QAAQ,CAAC;AASpD,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAc3E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AA4CtD,eAAO,MAAM,mBAAmB,GAAI,SAAS,qBAAqB,mDAwV/D,CAAC"}
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAU,KAAK,EAAe,MAAM,QAAQ,CAAC;AASpD,OAAO,KAAK,EAAuB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAe3E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AA4CtD,eAAO,MAAM,mBAAmB,GAAI,SAAS,qBAAqB,mDA4V/D,CAAC"}
package/dist/safe/live.js CHANGED
@@ -3,7 +3,7 @@ import { Effect, Layer, Option, Ref } from "effect";
3
3
  import { isAddress, isHash, isHex } from "viem";
4
4
  import { SAFE_EXECUTION_TIMEOUT, SAFE_POLL_INTERVAL, SAFE_SIGNATURE_POLL_INTERVAL, SAFE_SIGNATURE_TIMEOUT, } from "#src/constants/index.js";
5
5
  import { loadSafeSdk } from "./adapter.js";
6
- import { NotInSafeAppContextError, OffchainSignatureTimeoutError, SafeMultisigInfoUnavailableError, SafeMultisigSettingsError, SafeMultisigTxExecutionTimeoutError, SafeMultisigTxLookupError, SafeMultisigTxSubmissionError, SignTypedDataError, } from "./errors.js";
6
+ import { getSafeErrorMessage, NotInSafeAppContextError, OffchainSignatureTimeoutError, SafeMultisigInfoUnavailableError, SafeMultisigSettingsError, SafeMultisigTxExecutionTimeoutError, SafeMultisigTxLookupError, SafeMultisigTxSubmissionError, SignTypedDataError, } from "./errors.js";
7
7
  import { pollUntil } from "./internal/poll.js";
8
8
  import { SafeAppsService } from "./service.js";
9
9
  const makeValidator = (predicate, label) => (value, context) => predicate(value)
@@ -67,10 +67,15 @@ export const SafeAppsServiceLive = (config) => Layer.scoped(SafeAppsService, Eff
67
67
  value: tx.value?.toString() ?? "0",
68
68
  }));
69
69
  const result = yield* withSdk(getSdk, (s) => Effect.tryPromise({
70
- catch: (cause) => new SafeMultisigTxSubmissionError({
71
- cause,
72
- message: "Failed to submit txs to Safe",
73
- }),
70
+ catch: (cause) => {
71
+ const detail = getSafeErrorMessage(cause);
72
+ return new SafeMultisigTxSubmissionError({
73
+ cause,
74
+ message: detail
75
+ ? `Failed to submit txs to Safe: ${detail}`
76
+ : "Failed to submit txs to Safe",
77
+ });
78
+ },
74
79
  try: () => s.txs.send({ params, txs: sdkTxs }),
75
80
  }), (e) => new SafeMultisigTxSubmissionError({ cause: e, message: e.message }));
76
81
  const safeTxHash = yield* validateHash(result.safeTxHash, "sendTxs").pipe(Effect.catchTag("SafeMultisigTxLookupError", (e) => Effect.fail(new SafeMultisigTxSubmissionError({ cause: e, message: e.message }))));
@@ -1 +1 @@
1
- {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"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","sourcesContent":["import { TxManager } from \"@prb/effect-evm/tx\";\nimport { Effect, Layer, Option, Ref } from \"effect\";\nimport type { Hash, Hex } from \"viem\";\nimport { isAddress, isHash, isHex } from \"viem\";\nimport {\n SAFE_EXECUTION_TIMEOUT,\n SAFE_POLL_INTERVAL,\n SAFE_SIGNATURE_POLL_INTERVAL,\n SAFE_SIGNATURE_TIMEOUT,\n} from \"#src/constants/index.js\";\nimport type { SafeAppsSDKInstance, SafeAppsSdkConfig } from \"./adapter.js\";\nimport { loadSafeSdk } from \"./adapter.js\";\nimport type { SafeAppsSdkUnavailableError } from \"./errors.js\";\nimport {\n NotInSafeAppContextError,\n OffchainSignatureTimeoutError,\n SafeMultisigInfoUnavailableError,\n SafeMultisigSettingsError,\n SafeMultisigTxExecutionTimeoutError,\n SafeMultisigTxLookupError,\n SafeMultisigTxSubmissionError,\n SignTypedDataError,\n} from \"./errors.js\";\nimport { pollUntil } from \"./internal/poll.js\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { EIP712TypedData, SafeMultisigInfo, SafeMultisigTx } from \"./types.js\";\n\nexport type SafeAppsServiceConfig = SafeAppsSdkConfig;\n\n// --- Validation Factory ---\n\ntype Predicate<T extends string> = (value: string) => value is T;\n\nconst makeValidator =\n <T extends string>(predicate: Predicate<T>, label: string) =>\n (value: string, context: string): Effect.Effect<T, SafeMultisigTxLookupError> =>\n predicate(value)\n ? Effect.succeed(value)\n : Effect.fail(\n new SafeMultisigTxLookupError({\n message: `Invalid ${label} from SDK in ${context}: ${value}`,\n retryable: false,\n safeTxHash: \"\",\n })\n );\n\nconst validateAddress = makeValidator(isAddress, \"address\");\nconst validateHash = makeValidator(isHash, \"hash\");\nconst validateHex = makeValidator(isHex, \"hex\");\n\n// --- SDK State ---\n\n/** SDK availability error - either SSR environment or SDK load failure */\ntype SdkUnavailableError = NotInSafeAppContextError | SafeAppsSdkUnavailableError;\n\n/** Internal SDK state for lazy loading */\ntype SdkState<T> =\n | { readonly _tag: \"pending\" }\n | { readonly _tag: \"loaded\"; readonly sdk: T }\n | { readonly _tag: \"unavailable\"; readonly error: SdkUnavailableError };\n\n// --- SDK Wrapper Helper ---\n\nconst withSdk = <A, E>(\n getSdk: Effect.Effect<SafeAppsSDKInstance, SdkUnavailableError>,\n fn: (sdk: SafeAppsSDKInstance) => Effect.Effect<A, E>,\n mapError: (e: SdkUnavailableError) => E\n): Effect.Effect<A, E> => Effect.flatMap(Effect.mapError(getSdk, mapError), fn);\n\n// --- Service Implementation ---\n\nexport const SafeAppsServiceLive = (config?: SafeAppsServiceConfig) =>\n Layer.scoped(\n SafeAppsService,\n Effect.gen(function* () {\n // Cache Safe info after first fetch\n const infoRef = yield* Ref.make<SafeMultisigInfo | null>(null);\n\n // Get TxManager for receipt waiting\n const txManager = yield* TxManager;\n\n const sdkRef = yield* Ref.make<SdkState<SafeAppsSDKInstance>>({ _tag: \"pending\" });\n\n /** Get SDK, loading lazily on first call. Fails if not in Safe App context. */\n const getSdk: Effect.Effect<SafeAppsSDKInstance, SdkUnavailableError> = Effect.gen(\n function* () {\n const state = yield* Ref.get(sdkRef);\n\n if (state._tag === \"loaded\") {\n return state.sdk;\n }\n if (state._tag === \"unavailable\") {\n return yield* Effect.fail(state.error);\n }\n\n // First call - check environment and load SDK\n if (typeof window === \"undefined\") {\n const error = new NotInSafeAppContextError({\n message: \"Safe Apps SDK requires a browser environment (window is undefined)\",\n });\n yield* Ref.set(sdkRef, { _tag: \"unavailable\", error });\n return yield* Effect.fail(error);\n }\n\n // Try to load SDK - catch SDK unavailable error and store it\n const loadResult = yield* loadSafeSdk(config).pipe(\n Effect.map((sdk) => ({ _tag: \"loaded\" as const, sdk })),\n Effect.catchTag(\"SafeAppsSdkUnavailableError\", (error) =>\n Effect.succeed({ _tag: \"unavailable\" as const, error } as const)\n )\n );\n\n yield* Ref.set(sdkRef, loadResult);\n\n if (loadResult._tag === \"unavailable\") {\n return yield* Effect.fail(loadResult.error);\n }\n\n return loadResult.sdk;\n }\n );\n\n // --- Service Methods ---\n\n const getInfo = Effect.fn(\"SafeAppsService.getInfo\")(function* () {\n const cached = yield* Ref.get(infoRef);\n if (cached) {\n return cached;\n }\n\n const sdk = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigInfoUnavailableError({\n cause,\n message: \"Failed to get Safe info from SDK\",\n }),\n try: () => s.safe.getInfo(),\n }),\n (e) => new SafeMultisigInfoUnavailableError({ cause: e, message: e.message })\n );\n\n const safeAddress = yield* validateAddress(sdk.safeAddress, \"getInfo\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SafeMultisigInfoUnavailableError({ cause: e, message: e.message }))\n )\n );\n\n const safeInfo: SafeMultisigInfo = { chainId: sdk.chainId, safeAddress };\n yield* Ref.set(infoRef, safeInfo);\n return safeInfo;\n });\n\n const sendTxs = Effect.fn(\"SafeAppsService.sendTxs\")(function* (\n txs: readonly SafeMultisigTx[],\n params?: { safeTxGas?: number }\n ) {\n // Convert bigint values to strings (Safe SDK expects decimal strings)\n const sdkTxs = txs.map((tx) => ({\n data: tx.data,\n to: tx.to,\n value: tx.value?.toString() ?? \"0\",\n }));\n\n const result = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigTxSubmissionError({\n cause,\n message: \"Failed to submit txs to Safe\",\n }),\n try: () => s.txs.send({ params, txs: sdkTxs }),\n }),\n (e) => new SafeMultisigTxSubmissionError({ cause: e, message: e.message })\n );\n\n const safeTxHash = yield* validateHash(result.safeTxHash, \"sendTxs\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SafeMultisigTxSubmissionError({ cause: e, message: e.message }))\n )\n );\n\n const info = yield* getInfo().pipe(\n Effect.catchTag(\"SafeMultisigInfoUnavailableError\", (error) =>\n Effect.fail(\n new SafeMultisigTxSubmissionError({\n cause: error,\n message: \"Failed to get Safe info after tx submission\",\n })\n )\n )\n );\n\n return { chainId: info.chainId, safeAddress: info.safeAddress, safeTxHash };\n });\n\n const getTx = Effect.fn(\"SafeAppsService.getTx\")(function* (safeTxHash: Hash) {\n const tx = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigTxLookupError({\n cause,\n message: `Failed to lookup Safe tx ${safeTxHash}`,\n retryable: true,\n safeTxHash,\n }),\n try: () => s.txs.getBySafeTxHash(safeTxHash),\n }),\n (e) =>\n new SafeMultisigTxLookupError({\n cause: e,\n message: e.message,\n retryable: false,\n safeTxHash,\n })\n );\n\n const txHash = tx.txHash ? yield* validateHash(tx.txHash, \"getTx\") : null;\n\n return {\n status: tx.txStatus ?? \"AWAITING_CONFIRMATIONS\",\n txHash: txHash ? Option.some(txHash) : Option.none<Hash>(),\n };\n });\n\n const waitForTxReceipt = Effect.fn(\"SafeAppsService.waitForTxReceipt\")(function* (\n safeTxHash: Hash,\n policy: {\n pollInterval?: number;\n executionTimeout?: number;\n receiptPolicy?: { receiptTimeout?: number; pollingInterval?: number };\n } = {}\n ) {\n const info = yield* getInfo().pipe(\n Effect.catchTag(\"SafeMultisigInfoUnavailableError\", (error) =>\n Effect.fail(\n new SafeMultisigTxLookupError({\n cause: error,\n message: \"Failed to get Safe info for receipt waiting\",\n retryable: true,\n safeTxHash,\n })\n )\n )\n );\n\n const pollInterval = policy.pollInterval ?? SAFE_POLL_INTERVAL;\n const executionTimeout = policy.executionTimeout ?? SAFE_EXECUTION_TIMEOUT;\n\n // Track last status for timeout error message\n let lastStatus = \"AWAITING_CONFIRMATIONS\";\n\n const onchainHash = yield* pollUntil(\n Effect.gen(function* () {\n const tx = yield* getTx(safeTxHash);\n lastStatus = tx.status;\n return tx.txHash;\n }),\n { interval: pollInterval, timeout: executionTimeout },\n (timeout) =>\n new SafeMultisigTxExecutionTimeoutError({\n lastStatus,\n message: `Safe tx ${safeTxHash} not executed within ${timeout}ms (last status: ${lastStatus})`,\n safeTxHash,\n timeout,\n })\n );\n\n // Delegate to TxManager for on-chain receipt\n const receipt = yield* txManager\n .waitForReceipt(info.chainId, onchainHash, policy.receiptPolicy)\n .pipe(\n Effect.catchTag(\"TxReplacedError\", (error) =>\n Effect.fail(\n new SafeMultisigTxLookupError({\n cause: error,\n message: `Transaction was replaced: ${error.message}`,\n retryable: false,\n safeTxHash,\n })\n )\n )\n );\n\n return {\n chainId: info.chainId,\n onchainHash,\n receipt,\n safeAddress: info.safeAddress,\n safeTxHash,\n };\n });\n\n const signTypedData = Effect.fn(\"SafeAppsService.signTypedData\")(function* (\n typedData: EIP712TypedData\n ) {\n const result = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SignTypedDataError({ cause, message: \"Failed to sign typed data via Safe\" }),\n try: () => s.txs.signTypedMessage(typedData),\n }),\n (e) => new SignTypedDataError({ cause: e, message: e.message })\n );\n\n // SDK returns { safeTxHash } for on-chain or { messageHash } for off-chain\n if (\"messageHash\" in result) {\n const messageHash = yield* validateHex(result.messageHash ?? \"\", \"signTypedData\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SignTypedDataError({ cause: e, message: e.message }))\n )\n );\n return { _tag: \"Offchain\" as const, messageHash };\n }\n\n const safeTxHash = yield* validateHash(result.safeTxHash, \"signTypedData\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SignTypedDataError({ cause: e, message: e.message }))\n )\n );\n return { _tag: \"Onchain\" as const, safeTxHash };\n });\n\n const getOffchainSignature = Effect.fn(\"SafeAppsService.getOffchainSignature\")(function* (\n messageHash: Hex\n ) {\n const sig = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigTxLookupError({\n cause,\n message: `Failed to get off-chain signature for ${messageHash}`,\n retryable: true,\n safeTxHash: messageHash,\n }),\n try: () => s.safe.getOffChainSignature(messageHash),\n }),\n (e) =>\n new SafeMultisigTxLookupError({\n cause: e,\n message: e.message,\n retryable: false,\n safeTxHash: messageHash,\n })\n );\n\n // Empty string or \"0x\" means signature not yet available\n if (!sig || sig === \"\" || sig === \"0x\") {\n return Option.none<Hex>();\n }\n\n const validatedSig = yield* validateHex(sig, \"getOffchainSignature\");\n return Option.some(validatedSig);\n });\n\n const pollOffchainSignature = Effect.fn(\"SafeAppsService.pollOffchainSignature\")(function* (\n messageHash: Hex,\n policy: { pollInterval?: number; timeout?: number } = {}\n ) {\n const pollInterval = policy.pollInterval ?? SAFE_SIGNATURE_POLL_INTERVAL;\n const timeout = policy.timeout ?? SAFE_SIGNATURE_TIMEOUT;\n\n const signature = yield* pollUntil(\n getOffchainSignature(messageHash),\n { interval: pollInterval, timeout },\n (elapsed) =>\n new OffchainSignatureTimeoutError({\n message: `Off-chain signature for ${messageHash} not available within ${elapsed}ms`,\n messageHash,\n timeout: elapsed,\n })\n );\n\n return { messageHash, signature };\n });\n\n const enableOffchainSigning = Effect.fn(\"SafeAppsService.enableOffchainSigning\")(\n function* () {\n yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigSettingsError({\n cause,\n message: \"Failed to enable off-chain signing mode\",\n }),\n try: () => s.eth.setSafeSettings([{ offChainSigning: true }]),\n }),\n (e) => new SafeMultisigSettingsError({ cause: e, message: e.message })\n );\n }\n );\n\n return SafeAppsService.of({\n enableOffchainSigning,\n getInfo,\n getOffchainSignature,\n getTx,\n pollOffchainSignature,\n sendTxs,\n signTypedData,\n waitForTxReceipt,\n });\n })\n );\n"]}
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAS/C,MAAM,aAAa,GACjB,CAAmB,SAAuB,EAAE,KAAa,EAAE,EAAE,CAC7D,CAAC,KAAa,EAAE,OAAe,EAA+C,EAAE,CAC9E,SAAS,CAAC,KAAK,CAAC;IACd,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC,CAAC,MAAM,CAAC,IAAI,CACT,IAAI,yBAAyB,CAAC;QAC5B,OAAO,EAAE,WAAW,KAAK,gBAAgB,OAAO,KAAK,KAAK,EAAE;QAC5D,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,EAAE;KACf,CAAC,CACH,CAAC;AAEV,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAC5D,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnD,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAehD,MAAM,OAAO,GAAG,CACd,MAA+D,EAC/D,EAAqD,EACrD,QAAuC,EAClB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;AAIhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAA8B,EAAE,EAAE,CACpE,KAAK,CAAC,MAAM,CACV,eAAe,EACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAElB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAA0B,IAAI,CAAC,CAAC;IAG/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IAEnC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAgC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAGnF,MAAM,MAAM,GAA4D,MAAM,CAAC,GAAG,CAChF,QAAQ,CAAC;QACP,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,GAAG,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAGD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,wBAAwB,CAAC;gBACzC,OAAO,EAAE,oEAAoE;aAC9E,CAAC,CAAC;YACH,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAGD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAChD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,EACvD,MAAM,CAAC,QAAQ,CAAC,6BAA6B,EAAE,CAAC,KAAK,EAAE,EAAE,CACvD,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,KAAK,EAAW,CAAC,CACjE,CACF,CAAC;QAEF,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAEnC,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,UAAU,CAAC,GAAG,CAAC;IACxB,CAAC,CACF,CAAC;IAIF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC;QAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CACxB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,gCAAgC,CAAC;gBACnC,KAAK;gBACL,OAAO,EAAE,kCAAkC;aAC5C,CAAC;YACJ,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;SAC5B,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,gCAAgC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAC9E,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,IAAI,CACzE,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,IAAI,gCAAgC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACpF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAqB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QACzE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAC5D,GAA8B,EAC9B,MAA+B;QAG/B,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG;SACnC,CAAC,CAAC,CAAC;QAEJ,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAC3B,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAC1C,OAAO,IAAI,6BAA6B,CAAC;oBACvC,KAAK;oBACL,OAAO,EAAE,MAAM;wBACb,CAAC,CAAC,iCAAiC,MAAM,EAAE;wBAC3C,CAAC,CAAC,8BAA8B;iBACnC,CAAC,CAAC;YACL,CAAC;YACD,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;SAC/C,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,6BAA6B,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAC3E,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CACvE,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,IAAI,6BAA6B,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACjF,CACF,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAChC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,EAAE,CAC5D,MAAM,CAAC,IAAI,CACT,IAAI,6BAA6B,CAAC;YAChC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,6CAA6C;SACvD,CAAC,CACH,CACF,CACF,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAgB;QAC1E,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,OAAO,CACvB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,yBAAyB,CAAC;gBAC5B,KAAK;gBACL,OAAO,EAAE,4BAA4B,UAAU,EAAE;gBACjD,SAAS,EAAE,IAAI;gBACf,UAAU;aACX,CAAC;YACJ,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC;SAC7C,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,yBAAyB,CAAC;YAC5B,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,KAAK;YAChB,UAAU;SACX,CAAC,CACL,CAAC;QAEF,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAE1E,OAAO;YACL,MAAM,EAAE,EAAE,CAAC,QAAQ,IAAI,wBAAwB;YAC/C,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAQ;SAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EAC9E,UAAgB,EAChB,SAII,EAAE;QAEN,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAChC,MAAM,CAAC,QAAQ,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,EAAE,CAC5D,MAAM,CAAC,IAAI,CACT,IAAI,yBAAyB,CAAC;YAC5B,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,6CAA6C;YACtD,SAAS,EAAE,IAAI;YACf,UAAU;SACX,CAAC,CACH,CACF,CACF,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,kBAAkB,CAAC;QAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,sBAAsB,CAAC;QAG3E,IAAI,UAAU,GAAG,wBAAwB,CAAC;QAE1C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,SAAS,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACpC,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC;YACvB,OAAO,EAAE,CAAC,MAAM,CAAC;QACnB,CAAC,CAAC,EACF,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,EAAE,EACrD,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,mCAAmC,CAAC;YACtC,UAAU;YACV,OAAO,EAAE,WAAW,UAAU,wBAAwB,OAAO,oBAAoB,UAAU,GAAG;YAC9F,UAAU;YACV,OAAO;SACR,CAAC,CACL,CAAC;QAGF,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS;aAC7B,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC;aAC/D,IAAI,CACH,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC3C,MAAM,CAAC,IAAI,CACT,IAAI,yBAAyB,CAAC;YAC5B,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,6BAA6B,KAAK,CAAC,OAAO,EAAE;YACrD,SAAS,EAAE,KAAK;YAChB,UAAU;SACX,CAAC,CACH,CACF,CACF,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW;YACX,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU;SACX,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EACxE,SAA0B;QAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAC3B,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC;YAClF,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC;SAC7C,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAChE,CAAC;QAGF,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,eAAe,CAAC,CAAC,IAAI,CACpF,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACtE,CACF,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,UAAmB,EAAE,WAAW,EAAE,CAAC;QACpD,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,QAAQ,CAAC,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjD,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACtE,CACF,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,SAAkB,EAAE,UAAU,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,sCAAsC,CAAC,CAAC,QAAQ,CAAC,EACtF,WAAgB;QAEhB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,CACxB,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,yBAAyB,CAAC;gBAC5B,KAAK;gBACL,OAAO,EAAE,yCAAyC,WAAW,EAAE;gBAC/D,SAAS,EAAE,IAAI;gBACf,UAAU,EAAE,WAAW;aACxB,CAAC;YACJ,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;SACpD,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,yBAAyB,CAAC;YAC5B,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,WAAW;SACxB,CAAC,CACL,CAAC;QAGF,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,IAAI,EAAO,CAAC;QAC5B,CAAC;QAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,uCAAuC,CAAC,CAAC,QAAQ,CAAC,EACxF,WAAgB,EAChB,SAAsD,EAAE;QAExD,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,4BAA4B,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,sBAAsB,CAAC;QAEzD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAChC,oBAAoB,CAAC,WAAW,CAAC,EACjC,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,EACnC,CAAC,OAAO,EAAE,EAAE,CACV,IAAI,6BAA6B,CAAC;YAChC,OAAO,EAAE,2BAA2B,WAAW,yBAAyB,OAAO,IAAI;YACnF,WAAW;YACX,OAAO,EAAE,OAAO;SACjB,CAAC,CACL,CAAC;QAEF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,uCAAuC,CAAC,CAC9E,QAAQ,CAAC;QACP,KAAK,CAAC,CAAC,OAAO,CACZ,MAAM,EACN,CAAC,CAAC,EAAE,EAAE,CACJ,MAAM,CAAC,UAAU,CAAC;YAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,yBAAyB,CAAC;gBAC5B,KAAK;gBACL,OAAO,EAAE,yCAAyC;aACnD,CAAC;YACJ,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;SAC9D,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,yBAAyB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CACvE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,eAAe,CAAC,EAAE,CAAC;QACxB,qBAAqB;QACrB,OAAO;QACP,oBAAoB;QACpB,KAAK;QACL,qBAAqB;QACrB,OAAO;QACP,aAAa;QACb,gBAAgB;KACjB,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC","sourcesContent":["import { TxManager } from \"@prb/effect-evm/tx\";\nimport { Effect, Layer, Option, Ref } from \"effect\";\nimport type { Hash, Hex } from \"viem\";\nimport { isAddress, isHash, isHex } from \"viem\";\nimport {\n SAFE_EXECUTION_TIMEOUT,\n SAFE_POLL_INTERVAL,\n SAFE_SIGNATURE_POLL_INTERVAL,\n SAFE_SIGNATURE_TIMEOUT,\n} from \"#src/constants/index.js\";\nimport type { SafeAppsSDKInstance, SafeAppsSdkConfig } from \"./adapter.js\";\nimport { loadSafeSdk } from \"./adapter.js\";\nimport type { SafeAppsSdkUnavailableError } from \"./errors.js\";\nimport {\n getSafeErrorMessage,\n NotInSafeAppContextError,\n OffchainSignatureTimeoutError,\n SafeMultisigInfoUnavailableError,\n SafeMultisigSettingsError,\n SafeMultisigTxExecutionTimeoutError,\n SafeMultisigTxLookupError,\n SafeMultisigTxSubmissionError,\n SignTypedDataError,\n} from \"./errors.js\";\nimport { pollUntil } from \"./internal/poll.js\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { EIP712TypedData, SafeMultisigInfo, SafeMultisigTx } from \"./types.js\";\n\nexport type SafeAppsServiceConfig = SafeAppsSdkConfig;\n\n// --- Validation Factory ---\n\ntype Predicate<T extends string> = (value: string) => value is T;\n\nconst makeValidator =\n <T extends string>(predicate: Predicate<T>, label: string) =>\n (value: string, context: string): Effect.Effect<T, SafeMultisigTxLookupError> =>\n predicate(value)\n ? Effect.succeed(value)\n : Effect.fail(\n new SafeMultisigTxLookupError({\n message: `Invalid ${label} from SDK in ${context}: ${value}`,\n retryable: false,\n safeTxHash: \"\",\n })\n );\n\nconst validateAddress = makeValidator(isAddress, \"address\");\nconst validateHash = makeValidator(isHash, \"hash\");\nconst validateHex = makeValidator(isHex, \"hex\");\n\n// --- SDK State ---\n\n/** SDK availability error - either SSR environment or SDK load failure */\ntype SdkUnavailableError = NotInSafeAppContextError | SafeAppsSdkUnavailableError;\n\n/** Internal SDK state for lazy loading */\ntype SdkState<T> =\n | { readonly _tag: \"pending\" }\n | { readonly _tag: \"loaded\"; readonly sdk: T }\n | { readonly _tag: \"unavailable\"; readonly error: SdkUnavailableError };\n\n// --- SDK Wrapper Helper ---\n\nconst withSdk = <A, E>(\n getSdk: Effect.Effect<SafeAppsSDKInstance, SdkUnavailableError>,\n fn: (sdk: SafeAppsSDKInstance) => Effect.Effect<A, E>,\n mapError: (e: SdkUnavailableError) => E\n): Effect.Effect<A, E> => Effect.flatMap(Effect.mapError(getSdk, mapError), fn);\n\n// --- Service Implementation ---\n\nexport const SafeAppsServiceLive = (config?: SafeAppsServiceConfig) =>\n Layer.scoped(\n SafeAppsService,\n Effect.gen(function* () {\n // Cache Safe info after first fetch\n const infoRef = yield* Ref.make<SafeMultisigInfo | null>(null);\n\n // Get TxManager for receipt waiting\n const txManager = yield* TxManager;\n\n const sdkRef = yield* Ref.make<SdkState<SafeAppsSDKInstance>>({ _tag: \"pending\" });\n\n /** Get SDK, loading lazily on first call. Fails if not in Safe App context. */\n const getSdk: Effect.Effect<SafeAppsSDKInstance, SdkUnavailableError> = Effect.gen(\n function* () {\n const state = yield* Ref.get(sdkRef);\n\n if (state._tag === \"loaded\") {\n return state.sdk;\n }\n if (state._tag === \"unavailable\") {\n return yield* Effect.fail(state.error);\n }\n\n // First call - check environment and load SDK\n if (typeof window === \"undefined\") {\n const error = new NotInSafeAppContextError({\n message: \"Safe Apps SDK requires a browser environment (window is undefined)\",\n });\n yield* Ref.set(sdkRef, { _tag: \"unavailable\", error });\n return yield* Effect.fail(error);\n }\n\n // Try to load SDK - catch SDK unavailable error and store it\n const loadResult = yield* loadSafeSdk(config).pipe(\n Effect.map((sdk) => ({ _tag: \"loaded\" as const, sdk })),\n Effect.catchTag(\"SafeAppsSdkUnavailableError\", (error) =>\n Effect.succeed({ _tag: \"unavailable\" as const, error } as const)\n )\n );\n\n yield* Ref.set(sdkRef, loadResult);\n\n if (loadResult._tag === \"unavailable\") {\n return yield* Effect.fail(loadResult.error);\n }\n\n return loadResult.sdk;\n }\n );\n\n // --- Service Methods ---\n\n const getInfo = Effect.fn(\"SafeAppsService.getInfo\")(function* () {\n const cached = yield* Ref.get(infoRef);\n if (cached) {\n return cached;\n }\n\n const sdk = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigInfoUnavailableError({\n cause,\n message: \"Failed to get Safe info from SDK\",\n }),\n try: () => s.safe.getInfo(),\n }),\n (e) => new SafeMultisigInfoUnavailableError({ cause: e, message: e.message })\n );\n\n const safeAddress = yield* validateAddress(sdk.safeAddress, \"getInfo\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SafeMultisigInfoUnavailableError({ cause: e, message: e.message }))\n )\n );\n\n const safeInfo: SafeMultisigInfo = { chainId: sdk.chainId, safeAddress };\n yield* Ref.set(infoRef, safeInfo);\n return safeInfo;\n });\n\n const sendTxs = Effect.fn(\"SafeAppsService.sendTxs\")(function* (\n txs: readonly SafeMultisigTx[],\n params?: { safeTxGas?: number }\n ) {\n // Convert bigint values to strings (Safe SDK expects decimal strings)\n const sdkTxs = txs.map((tx) => ({\n data: tx.data,\n to: tx.to,\n value: tx.value?.toString() ?? \"0\",\n }));\n\n const result = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) => {\n const detail = getSafeErrorMessage(cause);\n return new SafeMultisigTxSubmissionError({\n cause,\n message: detail\n ? `Failed to submit txs to Safe: ${detail}`\n : \"Failed to submit txs to Safe\",\n });\n },\n try: () => s.txs.send({ params, txs: sdkTxs }),\n }),\n (e) => new SafeMultisigTxSubmissionError({ cause: e, message: e.message })\n );\n\n const safeTxHash = yield* validateHash(result.safeTxHash, \"sendTxs\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SafeMultisigTxSubmissionError({ cause: e, message: e.message }))\n )\n );\n\n const info = yield* getInfo().pipe(\n Effect.catchTag(\"SafeMultisigInfoUnavailableError\", (error) =>\n Effect.fail(\n new SafeMultisigTxSubmissionError({\n cause: error,\n message: \"Failed to get Safe info after tx submission\",\n })\n )\n )\n );\n\n return { chainId: info.chainId, safeAddress: info.safeAddress, safeTxHash };\n });\n\n const getTx = Effect.fn(\"SafeAppsService.getTx\")(function* (safeTxHash: Hash) {\n const tx = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigTxLookupError({\n cause,\n message: `Failed to lookup Safe tx ${safeTxHash}`,\n retryable: true,\n safeTxHash,\n }),\n try: () => s.txs.getBySafeTxHash(safeTxHash),\n }),\n (e) =>\n new SafeMultisigTxLookupError({\n cause: e,\n message: e.message,\n retryable: false,\n safeTxHash,\n })\n );\n\n const txHash = tx.txHash ? yield* validateHash(tx.txHash, \"getTx\") : null;\n\n return {\n status: tx.txStatus ?? \"AWAITING_CONFIRMATIONS\",\n txHash: txHash ? Option.some(txHash) : Option.none<Hash>(),\n };\n });\n\n const waitForTxReceipt = Effect.fn(\"SafeAppsService.waitForTxReceipt\")(function* (\n safeTxHash: Hash,\n policy: {\n pollInterval?: number;\n executionTimeout?: number;\n receiptPolicy?: { receiptTimeout?: number; pollingInterval?: number };\n } = {}\n ) {\n const info = yield* getInfo().pipe(\n Effect.catchTag(\"SafeMultisigInfoUnavailableError\", (error) =>\n Effect.fail(\n new SafeMultisigTxLookupError({\n cause: error,\n message: \"Failed to get Safe info for receipt waiting\",\n retryable: true,\n safeTxHash,\n })\n )\n )\n );\n\n const pollInterval = policy.pollInterval ?? SAFE_POLL_INTERVAL;\n const executionTimeout = policy.executionTimeout ?? SAFE_EXECUTION_TIMEOUT;\n\n // Track last status for timeout error message\n let lastStatus = \"AWAITING_CONFIRMATIONS\";\n\n const onchainHash = yield* pollUntil(\n Effect.gen(function* () {\n const tx = yield* getTx(safeTxHash);\n lastStatus = tx.status;\n return tx.txHash;\n }),\n { interval: pollInterval, timeout: executionTimeout },\n (timeout) =>\n new SafeMultisigTxExecutionTimeoutError({\n lastStatus,\n message: `Safe tx ${safeTxHash} not executed within ${timeout}ms (last status: ${lastStatus})`,\n safeTxHash,\n timeout,\n })\n );\n\n // Delegate to TxManager for on-chain receipt\n const receipt = yield* txManager\n .waitForReceipt(info.chainId, onchainHash, policy.receiptPolicy)\n .pipe(\n Effect.catchTag(\"TxReplacedError\", (error) =>\n Effect.fail(\n new SafeMultisigTxLookupError({\n cause: error,\n message: `Transaction was replaced: ${error.message}`,\n retryable: false,\n safeTxHash,\n })\n )\n )\n );\n\n return {\n chainId: info.chainId,\n onchainHash,\n receipt,\n safeAddress: info.safeAddress,\n safeTxHash,\n };\n });\n\n const signTypedData = Effect.fn(\"SafeAppsService.signTypedData\")(function* (\n typedData: EIP712TypedData\n ) {\n const result = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SignTypedDataError({ cause, message: \"Failed to sign typed data via Safe\" }),\n try: () => s.txs.signTypedMessage(typedData),\n }),\n (e) => new SignTypedDataError({ cause: e, message: e.message })\n );\n\n // SDK returns { safeTxHash } for on-chain or { messageHash } for off-chain\n if (\"messageHash\" in result) {\n const messageHash = yield* validateHex(result.messageHash ?? \"\", \"signTypedData\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SignTypedDataError({ cause: e, message: e.message }))\n )\n );\n return { _tag: \"Offchain\" as const, messageHash };\n }\n\n const safeTxHash = yield* validateHash(result.safeTxHash, \"signTypedData\").pipe(\n Effect.catchTag(\"SafeMultisigTxLookupError\", (e) =>\n Effect.fail(new SignTypedDataError({ cause: e, message: e.message }))\n )\n );\n return { _tag: \"Onchain\" as const, safeTxHash };\n });\n\n const getOffchainSignature = Effect.fn(\"SafeAppsService.getOffchainSignature\")(function* (\n messageHash: Hex\n ) {\n const sig = yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigTxLookupError({\n cause,\n message: `Failed to get off-chain signature for ${messageHash}`,\n retryable: true,\n safeTxHash: messageHash,\n }),\n try: () => s.safe.getOffChainSignature(messageHash),\n }),\n (e) =>\n new SafeMultisigTxLookupError({\n cause: e,\n message: e.message,\n retryable: false,\n safeTxHash: messageHash,\n })\n );\n\n // Empty string or \"0x\" means signature not yet available\n if (!sig || sig === \"\" || sig === \"0x\") {\n return Option.none<Hex>();\n }\n\n const validatedSig = yield* validateHex(sig, \"getOffchainSignature\");\n return Option.some(validatedSig);\n });\n\n const pollOffchainSignature = Effect.fn(\"SafeAppsService.pollOffchainSignature\")(function* (\n messageHash: Hex,\n policy: { pollInterval?: number; timeout?: number } = {}\n ) {\n const pollInterval = policy.pollInterval ?? SAFE_SIGNATURE_POLL_INTERVAL;\n const timeout = policy.timeout ?? SAFE_SIGNATURE_TIMEOUT;\n\n const signature = yield* pollUntil(\n getOffchainSignature(messageHash),\n { interval: pollInterval, timeout },\n (elapsed) =>\n new OffchainSignatureTimeoutError({\n message: `Off-chain signature for ${messageHash} not available within ${elapsed}ms`,\n messageHash,\n timeout: elapsed,\n })\n );\n\n return { messageHash, signature };\n });\n\n const enableOffchainSigning = Effect.fn(\"SafeAppsService.enableOffchainSigning\")(\n function* () {\n yield* withSdk(\n getSdk,\n (s) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeMultisigSettingsError({\n cause,\n message: \"Failed to enable off-chain signing mode\",\n }),\n try: () => s.eth.setSafeSettings([{ offChainSigning: true }]),\n }),\n (e) => new SafeMultisigSettingsError({ cause: e, message: e.message })\n );\n }\n );\n\n return SafeAppsService.of({\n enableOffchainSigning,\n getInfo,\n getOffchainSignature,\n getTx,\n pollOffchainSignature,\n sendTxs,\n signTypedData,\n waitForTxReceipt,\n });\n })\n );\n"]}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "sideEffects": false,
7
7
  "type": "module",
8
8
  "types": "./dist/index.d.ts",
9
- "version": "1.1.0",
9
+ "version": "1.1.1",
10
10
  "scripts": {
11
11
  "build": "just build",
12
12
  "prepack": "bun install --frozen-lockfile && just build"