@prb/effect-evm 1.0.0-beta.5 → 1.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/constants/index.d.ts +0 -4
  2. package/dist/constants/index.d.ts.map +1 -1
  3. package/dist/constants/index.js +0 -4
  4. package/dist/constants/index.js.map +1 -1
  5. package/dist/contract/pipeline/internal/core.d.ts +2 -2
  6. package/dist/contract/pipeline/internal/core.d.ts.map +1 -1
  7. package/dist/contract/pipeline/internal/core.js.map +1 -1
  8. package/dist/contract/pipeline/internal/receipt.d.ts +2 -2
  9. package/dist/contract/pipeline/internal/receipt.d.ts.map +1 -1
  10. package/dist/contract/pipeline/internal/receipt.js +1 -1
  11. package/dist/contract/pipeline/internal/receipt.js.map +1 -1
  12. package/dist/contract/pipeline/service.d.ts +3 -3
  13. package/dist/contract/pipeline/service.d.ts.map +1 -1
  14. package/dist/contract/pipeline/service.js.map +1 -1
  15. package/dist/contract/pipeline/types.d.ts +2 -2
  16. package/dist/contract/pipeline/types.d.ts.map +1 -1
  17. package/dist/contract/pipeline/types.js.map +1 -1
  18. package/dist/contract/pipeline/write-and-track.js +1 -1
  19. package/dist/contract/pipeline/write-and-track.js.map +1 -1
  20. package/dist/contract/pipeline/write-and-wait.d.ts +1 -1
  21. package/dist/contract/pipeline/write-and-wait.d.ts.map +1 -1
  22. package/dist/core/errors/transaction.d.ts +7 -7
  23. package/dist/core/errors/transaction.d.ts.map +1 -1
  24. package/dist/core/errors/transaction.js +2 -2
  25. package/dist/core/errors/transaction.js.map +1 -1
  26. package/dist/core/errors/viem-mapper.d.ts +3 -3
  27. package/dist/core/errors/viem-mapper.d.ts.map +1 -1
  28. package/dist/core/errors/viem-mapper.js +3 -3
  29. package/dist/core/errors/viem-mapper.js.map +1 -1
  30. package/dist/deploy/service.d.ts +3 -3
  31. package/dist/deploy/service.d.ts.map +1 -1
  32. package/dist/deploy/service.js.map +1 -1
  33. package/dist/eip7702/errors.d.ts +3 -3
  34. package/dist/eip7702/errors.d.ts.map +1 -1
  35. package/dist/eip7702/errors.js +1 -1
  36. package/dist/eip7702/errors.js.map +1 -1
  37. package/dist/eip7702/service.d.ts +8 -8
  38. package/dist/eip7702/service.d.ts.map +1 -1
  39. package/dist/eip7702/service.js +2 -2
  40. package/dist/eip7702/service.js.map +1 -1
  41. package/dist/react-hooks/index.d.ts +0 -4
  42. package/dist/react-hooks/index.d.ts.map +1 -1
  43. package/dist/react-hooks/index.js +0 -4
  44. package/dist/react-hooks/index.js.map +1 -1
  45. package/dist/subscriptions/pending-tx.d.ts +1 -1
  46. package/dist/subscriptions/pending-tx.d.ts.map +1 -1
  47. package/dist/subscriptions/pending-tx.js +1 -1
  48. package/dist/subscriptions/pending-tx.js.map +1 -1
  49. package/dist/subscriptions/service.d.ts +2 -2
  50. package/dist/subscriptions/service.d.ts.map +1 -1
  51. package/dist/subscriptions/service.js +4 -4
  52. package/dist/subscriptions/service.js.map +1 -1
  53. package/dist/testing-kit/mock-subscription-service.d.ts +2 -2
  54. package/dist/testing-kit/mock-subscription-service.d.ts.map +1 -1
  55. package/dist/testing-kit/mock-subscription-service.js +5 -5
  56. package/dist/testing-kit/mock-subscription-service.js.map +1 -1
  57. package/dist/testing-kit/mock-transfer-service.d.ts +3 -3
  58. package/dist/testing-kit/mock-transfer-service.d.ts.map +1 -1
  59. package/dist/testing-kit/mock-transfer-service.js.map +1 -1
  60. package/dist/transfer/service.d.ts +3 -3
  61. package/dist/transfer/service.d.ts.map +1 -1
  62. package/dist/transfer/service.js +3 -3
  63. package/dist/transfer/service.js.map +1 -1
  64. package/dist/tx/manager.d.ts +2 -2
  65. package/dist/tx/manager.d.ts.map +1 -1
  66. package/dist/tx/manager.js +5 -5
  67. package/dist/tx/manager.js.map +1 -1
  68. package/dist/tx/manager.test.integration.js +4 -4
  69. package/dist/tx/manager.test.integration.js.map +1 -1
  70. package/dist/tx/replacement.d.ts +3 -3
  71. package/dist/tx/replacement.d.ts.map +1 -1
  72. package/dist/tx/replacement.js +3 -3
  73. package/dist/tx/replacement.js.map +1 -1
  74. package/dist/tx/tracker.d.ts +6 -6
  75. package/dist/tx/tracker.d.ts.map +1 -1
  76. package/dist/tx/tracker.js +9 -9
  77. package/dist/tx/tracker.js.map +1 -1
  78. package/dist/types/params.d.ts +1 -1
  79. package/dist/types/params.d.ts.map +1 -1
  80. package/dist/types/params.js.map +1 -1
  81. package/dist/wallet/errors.d.ts +3 -3
  82. package/dist/wallet/errors.d.ts.map +1 -1
  83. package/dist/wallet/errors.js +1 -1
  84. package/dist/wallet/errors.js.map +1 -1
  85. package/dist/wallet/operations.d.ts +2 -2
  86. package/dist/wallet/operations.d.ts.map +1 -1
  87. package/dist/wallet/operations.js +2 -2
  88. package/dist/wallet/operations.js.map +1 -1
  89. package/dist/wallet/service.d.ts +2 -2
  90. package/dist/wallet/service.d.ts.map +1 -1
  91. package/dist/wallet/service.js.map +1 -1
  92. package/package.json +1 -6
  93. package/dist/react-hooks/safe-app-origins.d.ts +0 -8
  94. package/dist/react-hooks/safe-app-origins.d.ts.map +0 -1
  95. package/dist/react-hooks/safe-app-origins.js +0 -124
  96. package/dist/react-hooks/safe-app-origins.js.map +0 -1
  97. package/dist/react-hooks/use-is-host-safe-app.d.ts +0 -2
  98. package/dist/react-hooks/use-is-host-safe-app.d.ts.map +0 -1
  99. package/dist/react-hooks/use-is-host-safe-app.js +0 -16
  100. package/dist/react-hooks/use-is-host-safe-app.js.map +0 -1
  101. package/dist/react-hooks/use-is-safe-app-context.d.ts +0 -2
  102. package/dist/react-hooks/use-is-safe-app-context.d.ts.map +0 -1
  103. package/dist/react-hooks/use-is-safe-app-context.js +0 -41
  104. package/dist/react-hooks/use-is-safe-app-context.js.map +0 -1
  105. package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts +0 -2
  106. package/dist/react-hooks/use-is-safe-multisig-wallet.d.ts.map +0 -1
  107. package/dist/react-hooks/use-is-safe-multisig-wallet.js +0 -24
  108. package/dist/react-hooks/use-is-safe-multisig-wallet.js.map +0 -1
  109. package/dist/safe/adapter.d.ts +0 -9
  110. package/dist/safe/adapter.d.ts.map +0 -1
  111. package/dist/safe/adapter.js +0 -13
  112. package/dist/safe/adapter.js.map +0 -1
  113. package/dist/safe/detection.d.ts +0 -26
  114. package/dist/safe/detection.d.ts.map +0 -1
  115. package/dist/safe/detection.js +0 -102
  116. package/dist/safe/detection.js.map +0 -1
  117. package/dist/safe/detection.test.integration.d.ts +0 -2
  118. package/dist/safe/detection.test.integration.d.ts.map +0 -1
  119. package/dist/safe/detection.test.integration.js +0 -92
  120. package/dist/safe/detection.test.integration.js.map +0 -1
  121. package/dist/safe/errors.d.ts +0 -79
  122. package/dist/safe/errors.d.ts.map +0 -1
  123. package/dist/safe/errors.js +0 -34
  124. package/dist/safe/errors.js.map +0 -1
  125. package/dist/safe/index.d.ts +0 -8
  126. package/dist/safe/index.d.ts.map +0 -1
  127. package/dist/safe/index.js +0 -6
  128. package/dist/safe/index.js.map +0 -1
  129. package/dist/safe/live.d.ts +0 -8
  130. package/dist/safe/live.d.ts.map +0 -1
  131. package/dist/safe/live.js +0 -250
  132. package/dist/safe/live.js.map +0 -1
  133. package/dist/safe/service.d.ts +0 -26
  134. package/dist/safe/service.d.ts.map +0 -1
  135. package/dist/safe/service.js +0 -4
  136. package/dist/safe/service.js.map +0 -1
  137. package/dist/safe/service.test.integration.d.ts +0 -2
  138. package/dist/safe/service.test.integration.d.ts.map +0 -1
  139. package/dist/safe/service.test.integration.js +0 -171
  140. package/dist/safe/service.test.integration.js.map +0 -1
  141. package/dist/safe/simulation/abis.d.ts +0 -73
  142. package/dist/safe/simulation/abis.d.ts.map +0 -1
  143. package/dist/safe/simulation/abis.js +0 -61
  144. package/dist/safe/simulation/abis.js.map +0 -1
  145. package/dist/safe/simulation/addresses.d.ts +0 -4
  146. package/dist/safe/simulation/addresses.d.ts.map +0 -1
  147. package/dist/safe/simulation/addresses.js +0 -54
  148. package/dist/safe/simulation/addresses.js.map +0 -1
  149. package/dist/safe/simulation/encoding.d.ts +0 -16
  150. package/dist/safe/simulation/encoding.d.ts.map +0 -1
  151. package/dist/safe/simulation/encoding.js +0 -36
  152. package/dist/safe/simulation/encoding.js.map +0 -1
  153. package/dist/safe/simulation/errors.d.ts +0 -56
  154. package/dist/safe/simulation/errors.d.ts.map +0 -1
  155. package/dist/safe/simulation/errors.js +0 -37
  156. package/dist/safe/simulation/errors.js.map +0 -1
  157. package/dist/safe/simulation/index.d.ts +0 -7
  158. package/dist/safe/simulation/index.d.ts.map +0 -1
  159. package/dist/safe/simulation/index.js +0 -6
  160. package/dist/safe/simulation/index.js.map +0 -1
  161. package/dist/safe/simulation/internal/calldata/calldata.d.ts +0 -5
  162. package/dist/safe/simulation/internal/calldata/calldata.d.ts.map +0 -1
  163. package/dist/safe/simulation/internal/calldata/calldata.js +0 -17
  164. package/dist/safe/simulation/internal/calldata/calldata.js.map +0 -1
  165. package/dist/safe/simulation/internal/calldata/index.d.ts +0 -2
  166. package/dist/safe/simulation/internal/calldata/index.d.ts.map +0 -1
  167. package/dist/safe/simulation/internal/calldata/index.js +0 -2
  168. package/dist/safe/simulation/internal/calldata/index.js.map +0 -1
  169. package/dist/safe/simulation/internal/contracts/contracts.d.ts +0 -5
  170. package/dist/safe/simulation/internal/contracts/contracts.d.ts.map +0 -1
  171. package/dist/safe/simulation/internal/contracts/contracts.js +0 -25
  172. package/dist/safe/simulation/internal/contracts/contracts.js.map +0 -1
  173. package/dist/safe/simulation/internal/contracts/index.d.ts +0 -2
  174. package/dist/safe/simulation/internal/contracts/index.d.ts.map +0 -1
  175. package/dist/safe/simulation/internal/contracts/index.js +0 -2
  176. package/dist/safe/simulation/internal/contracts/index.js.map +0 -1
  177. package/dist/safe/simulation/internal/evaluation/evaluation.d.ts +0 -6
  178. package/dist/safe/simulation/internal/evaluation/evaluation.d.ts.map +0 -1
  179. package/dist/safe/simulation/internal/evaluation/evaluation.js +0 -20
  180. package/dist/safe/simulation/internal/evaluation/evaluation.js.map +0 -1
  181. package/dist/safe/simulation/internal/evaluation/index.d.ts +0 -2
  182. package/dist/safe/simulation/internal/evaluation/index.d.ts.map +0 -1
  183. package/dist/safe/simulation/internal/evaluation/index.js +0 -2
  184. package/dist/safe/simulation/internal/evaluation/index.js.map +0 -1
  185. package/dist/safe/simulation/internal/execution/execution.d.ts +0 -9
  186. package/dist/safe/simulation/internal/execution/execution.d.ts.map +0 -1
  187. package/dist/safe/simulation/internal/execution/execution.js +0 -65
  188. package/dist/safe/simulation/internal/execution/execution.js.map +0 -1
  189. package/dist/safe/simulation/internal/execution/index.d.ts +0 -2
  190. package/dist/safe/simulation/internal/execution/index.d.ts.map +0 -1
  191. package/dist/safe/simulation/internal/execution/index.js +0 -2
  192. package/dist/safe/simulation/internal/execution/index.js.map +0 -1
  193. package/dist/safe/simulation/internal/limits/index.d.ts +0 -2
  194. package/dist/safe/simulation/internal/limits/index.d.ts.map +0 -1
  195. package/dist/safe/simulation/internal/limits/index.js +0 -2
  196. package/dist/safe/simulation/internal/limits/index.js.map +0 -1
  197. package/dist/safe/simulation/internal/limits/limits.d.ts +0 -5
  198. package/dist/safe/simulation/internal/limits/limits.d.ts.map +0 -1
  199. package/dist/safe/simulation/internal/limits/limits.js +0 -18
  200. package/dist/safe/simulation/internal/limits/limits.js.map +0 -1
  201. package/dist/safe/simulation/internal/types/index.d.ts +0 -2
  202. package/dist/safe/simulation/internal/types/index.d.ts.map +0 -1
  203. package/dist/safe/simulation/internal/types/index.js +0 -2
  204. package/dist/safe/simulation/internal/types/index.js.map +0 -1
  205. package/dist/safe/simulation/internal/types/types.d.ts +0 -11
  206. package/dist/safe/simulation/internal/types/types.d.ts.map +0 -1
  207. package/dist/safe/simulation/internal/types/types.js +0 -2
  208. package/dist/safe/simulation/internal/types/types.js.map +0 -1
  209. package/dist/safe/simulation/internal/validation/index.d.ts +0 -2
  210. package/dist/safe/simulation/internal/validation/index.d.ts.map +0 -1
  211. package/dist/safe/simulation/internal/validation/index.js +0 -2
  212. package/dist/safe/simulation/internal/validation/index.js.map +0 -1
  213. package/dist/safe/simulation/internal/validation/validation.d.ts +0 -5
  214. package/dist/safe/simulation/internal/validation/validation.d.ts.map +0 -1
  215. package/dist/safe/simulation/internal/validation/validation.js +0 -27
  216. package/dist/safe/simulation/internal/validation/validation.js.map +0 -1
  217. package/dist/safe/simulation/service.d.ts +0 -14
  218. package/dist/safe/simulation/service.d.ts.map +0 -1
  219. package/dist/safe/simulation/service.js +0 -25
  220. package/dist/safe/simulation/service.js.map +0 -1
  221. package/dist/safe/simulation/types.d.ts +0 -20
  222. package/dist/safe/simulation/types.d.ts.map +0 -1
  223. package/dist/safe/simulation/types.js +0 -2
  224. package/dist/safe/simulation/types.js.map +0 -1
  225. package/dist/safe/types.d.ts +0 -61
  226. package/dist/safe/types.d.ts.map +0 -1
  227. package/dist/safe/types.js +0 -2
  228. package/dist/safe/types.js.map +0 -1
@@ -1,13 +0,0 @@
1
- import { Effect } from "effect";
2
- import { SafeSdkUnavailableError } from "./errors.js";
3
- export const loadSafeSdk = (config) => Effect.tryPromise({
4
- catch: (cause) => new SafeSdkUnavailableError({
5
- cause,
6
- message: "Failed to load @safe-global/safe-apps-sdk. Ensure it is installed: bun add @safe-global/safe-apps-sdk",
7
- }),
8
- try: async () => {
9
- const { default: SafeAppsSDK } = await import("@safe-global/safe-apps-sdk");
10
- return new SafeAppsSDK(config);
11
- },
12
- });
13
- //# sourceMappingURL=adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/safe/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAStD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAA0B,EAAE,EAAE,CACxD,MAAM,CAAC,UAAU,CAAC;IAChB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,IAAI,uBAAuB,CAAC;QAC1B,KAAK;QACL,OAAO,EACL,uGAAuG;KAC1G,CAAC;IACJ,GAAG,EAAE,KAAK,IAAI,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC5E,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport { SafeSdkUnavailableError } from \"./errors.js\";\n\n/** Configuration for SDK initialization */\nexport type SafeAppsSdkConfig = {\n allowedDomains?: RegExp[];\n debug?: boolean;\n};\n\n/** Load SDK dynamically - keeps the dependency optional at runtime */\nexport const loadSafeSdk = (config?: SafeAppsSdkConfig) =>\n Effect.tryPromise({\n catch: (cause) =>\n new SafeSdkUnavailableError({\n cause,\n message:\n \"Failed to load @safe-global/safe-apps-sdk. Ensure it is installed: bun add @safe-global/safe-apps-sdk\",\n }),\n try: async () => {\n const { default: SafeAppsSDK } = await import(\"@safe-global/safe-apps-sdk\");\n return new SafeAppsSDK(config);\n },\n });\n\n/** Type for the loaded SDK instance - uses any due to optional SDK dependency */\n// biome-ignore lint/suspicious/noExplicitAny: SDK is optional dependency\nexport type SafeAppsSDKInstance = any;\n"]}
@@ -1,26 +0,0 @@
1
- import { Effect, Schema } from "effect";
2
- import type { Address, Hex } from "viem";
3
- import type { ClientNotFoundError } from "../core/index.js";
4
- import { PublicClientService } from "../core/index.js";
5
- declare const SafeDetectionError_base: Schema.TaggedErrorClass<SafeDetectionError, "SafeDetectionError", {
6
- readonly _tag: Schema.tag<"SafeDetectionError">;
7
- } & {
8
- address: typeof Schema.String;
9
- cause: Schema.optional<typeof Schema.Unknown>;
10
- message: typeof Schema.String;
11
- }>;
12
- export declare class SafeDetectionError extends SafeDetectionError_base {
13
- }
14
- export type SafeDetectionParams = {
15
- address: Address;
16
- chainId: number;
17
- };
18
- export type SafeDetectionResult = {
19
- isSafe: boolean;
20
- proxyHash: Hex | undefined;
21
- singletonAddress: Address | undefined;
22
- singletonHash: Hex | undefined;
23
- };
24
- export declare function isSafeMultisig(params: SafeDetectionParams): Effect.Effect<SafeDetectionResult, SafeDetectionError | ClientNotFoundError, PublicClientService>;
25
- export {};
26
- //# sourceMappingURL=detection.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../src/safe/detection.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;;;;;;;;AAuD1D,qBAAa,kBAAmB,SAAQ,uBAOvC;CAAG;AAoBJ,MAAM,MAAM,mBAAmB,GAAG;IAEhC,OAAO,EAAE,OAAO,CAAC;IAEjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,MAAM,EAAE,OAAO,CAAC;IAEhB,SAAS,EAAE,GAAG,GAAG,SAAS,CAAC;IAE3B,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IAEtC,aAAa,EAAE,GAAG,GAAG,SAAS,CAAC;CAChC,CAAC;AA8BF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,MAAM,CACd,mBAAmB,EACnB,kBAAkB,GAAG,mBAAmB,EACxC,mBAAmB,CACpB,CAuFA"}
@@ -1,102 +0,0 @@
1
- import { Effect, Schema } from "effect";
2
- import { keccak256 } from "viem";
3
- import { PublicClientService } from "../core/index.js";
4
- const KNOWN_SAFE_PROXY_HASHES = new Set([
5
- "0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000",
6
- "0xd7d408ebcd99b2b70be43e20253d6d92a8ea8fab29bd3be7f55b10032331fb4c",
7
- ]);
8
- const KNOWN_SAFE_SINGLETON_HASHES = new Set([
9
- "0xe1f1593df76e69abc2d692792c80f329457551d5e83dde597546a1d58764da80",
10
- "0x56b8be58b5ad629a621593a2e5e5e8e9a28408dc06e95597497b303902772e45",
11
- "0x2ae2d1231f0d754a7fa4f5e5d0e5554085e1b500d8e09f95aaaaa3f49c0db922",
12
- "0xbba688fbdb21ad2bb58bc320638b43d94e7d100f6f3ebaab0a4e4de6304b1c2e",
13
- "0x21842597390c4c6e3c1239e434a682b054bd9548eee5e9b1d6a4482731023c0f",
14
- "0x1fe2df852ba3299d6534ef416eefa406e56ced995bca886ab7a553e6d0c5e1c4",
15
- "0xb1f926978a0f44a2c0ec8fe822418ae969bd8c3f18d61e5103100339894f81ff",
16
- "0xdda019cbd7c867a533a2a86e5c53434fdc50b13122b5a5ddb4a8df61b31c20f2",
17
- "0x180193227186ccb85316c94db1f0d156ed932b14712cfaac78901899178572dc",
18
- ]);
19
- export class SafeDetectionError extends Schema.TaggedError()("SafeDetectionError", {
20
- address: Schema.String,
21
- cause: Schema.optional(Schema.Unknown),
22
- message: Schema.String,
23
- }) {
24
- }
25
- const masterCopyAbi = [
26
- {
27
- inputs: [],
28
- name: "masterCopy",
29
- outputs: [{ name: "", type: "address" }],
30
- stateMutability: "view",
31
- type: "function",
32
- },
33
- ];
34
- export function isSafeMultisig(params) {
35
- return Effect.gen(function* () {
36
- const { address, chainId } = params;
37
- const publicClientService = yield* PublicClientService;
38
- const client = yield* publicClientService.get(chainId);
39
- const proxyBytecode = yield* Effect.tryPromise({
40
- catch: (cause) => new SafeDetectionError({
41
- address,
42
- cause,
43
- message: `Failed to get bytecode for ${address}`,
44
- }),
45
- try: () => client.getCode({ address }),
46
- });
47
- if (!proxyBytecode || proxyBytecode === "0x") {
48
- return {
49
- isSafe: false,
50
- proxyHash: undefined,
51
- singletonAddress: undefined,
52
- singletonHash: undefined,
53
- };
54
- }
55
- const proxyHash = keccak256(proxyBytecode);
56
- if (!KNOWN_SAFE_PROXY_HASHES.has(proxyHash)) {
57
- return {
58
- isSafe: false,
59
- proxyHash,
60
- singletonAddress: undefined,
61
- singletonHash: undefined,
62
- };
63
- }
64
- const singletonAddress = yield* Effect.tryPromise({
65
- catch: (cause) => new SafeDetectionError({
66
- address,
67
- cause,
68
- message: `Failed to call masterCopy() on ${address}`,
69
- }),
70
- try: () => client.readContract({
71
- abi: masterCopyAbi,
72
- address,
73
- functionName: "masterCopy",
74
- }),
75
- });
76
- const singletonBytecode = yield* Effect.tryPromise({
77
- catch: (cause) => new SafeDetectionError({
78
- address,
79
- cause,
80
- message: `Failed to get bytecode for singleton ${singletonAddress}`,
81
- }),
82
- try: () => client.getCode({ address: singletonAddress }),
83
- });
84
- if (!singletonBytecode || singletonBytecode === "0x") {
85
- return {
86
- isSafe: false,
87
- proxyHash,
88
- singletonAddress,
89
- singletonHash: undefined,
90
- };
91
- }
92
- const singletonHash = keccak256(singletonBytecode);
93
- const isSafe = KNOWN_SAFE_SINGLETON_HASHES.has(singletonHash);
94
- return {
95
- isSafe,
96
- proxyHash,
97
- singletonAddress,
98
- singletonHash,
99
- };
100
- });
101
- }
102
- //# sourceMappingURL=detection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../src/safe/detection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Safe multisig detection using EXTCODEHASH comparisons.\n *\n * Determines if an address is a Safe multisig by comparing bytecode hashes\n * against known Safe proxy and singleton hashes.\n *\n * @see https://github.com/safe-fndn/safe-smart-account/issues/714\n */\n\nimport { Effect, Schema } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { keccak256 } from \"viem\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport { PublicClientService } from \"@/src/core/index.js\";\n\n// -----------------------------------------------------------------------------\n// Known Safe bytecode hashes\n// -----------------------------------------------------------------------------\n\n/**\n * Known Safe proxy bytecode hashes (keccak256 of deployed bytecode).\n *\n * These are the proxy contracts that delegate to Safe singletons.\n * All Safe accounts use one of these proxy implementations.\n *\n * @see https://github.com/safe-global/safe-deployments\n */\nconst KNOWN_SAFE_PROXY_HASHES: ReadonlySet<Hex> = new Set([\n // SafeProxy v1.3.0\n \"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000\",\n // SafeProxy v1.4.1\n \"0xd7d408ebcd99b2b70be43e20253d6d92a8ea8fab29bd3be7f55b10032331fb4c\",\n] as Hex[]);\n\n/**\n * Known Safe singleton (implementation) bytecode hashes.\n *\n * These are the actual Safe contract implementations that proxies delegate to.\n *\n * Derivation: `cast keccak $(cast code <address> --rpc-url <mainnet>)`\n *\n * @see https://github.com/safe-global/safe-deployments\n */\nconst KNOWN_SAFE_SINGLETON_HASHES: ReadonlySet<Hex> = new Set([\n // Safe v1.0.0\n \"0xe1f1593df76e69abc2d692792c80f329457551d5e83dde597546a1d58764da80\",\n // Safe v1.1.1\n \"0x56b8be58b5ad629a621593a2e5e5e8e9a28408dc06e95597497b303902772e45\",\n // Safe v1.2.0\n \"0x2ae2d1231f0d754a7fa4f5e5d0e5554085e1b500d8e09f95aaaaa3f49c0db922\",\n // Safe v1.3.0\n \"0xbba688fbdb21ad2bb58bc320638b43d94e7d100f6f3ebaab0a4e4de6304b1c2e\",\n // Safe v1.3.0 L2\n \"0x21842597390c4c6e3c1239e434a682b054bd9548eee5e9b1d6a4482731023c0f\",\n // Safe v1.4.1\n \"0x1fe2df852ba3299d6534ef416eefa406e56ced995bca886ab7a553e6d0c5e1c4\",\n // Safe v1.4.1 L2\n \"0xb1f926978a0f44a2c0ec8fe822418ae969bd8c3f18d61e5103100339894f81ff\",\n // Safe v1.5.0\n \"0xdda019cbd7c867a533a2a86e5c53434fdc50b13122b5a5ddb4a8df61b31c20f2\",\n // Safe v1.5.0 L2\n \"0x180193227186ccb85316c94db1f0d156ed932b14712cfaac78901899178572dc\",\n] as Hex[]);\n\n// -----------------------------------------------------------------------------\n// Errors\n// -----------------------------------------------------------------------------\n\nexport class SafeDetectionError extends Schema.TaggedError<SafeDetectionError>()(\n \"SafeDetectionError\",\n {\n address: Schema.String,\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n }\n) {}\n\n// -----------------------------------------------------------------------------\n// ABI for masterCopy() call\n// -----------------------------------------------------------------------------\n\nconst masterCopyAbi = [\n {\n inputs: [],\n name: \"masterCopy\",\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n// -----------------------------------------------------------------------------\n// Detection function\n// -----------------------------------------------------------------------------\n\nexport type SafeDetectionParams = {\n /** The address to check */\n address: Address;\n /** The chain ID to query */\n chainId: number;\n};\n\nexport type SafeDetectionResult = {\n /** Whether the address appears to be a Safe multisig */\n isSafe: boolean;\n /** The proxy bytecode hash (if contract exists) */\n proxyHash: Hex | undefined;\n /** The singleton address (if Safe proxy detected) */\n singletonAddress: Address | undefined;\n /** The singleton bytecode hash (if singleton found) */\n singletonHash: Hex | undefined;\n};\n\n/**\n * Check if an address is a Safe multisig by comparing EXTCODEHASH values.\n *\n * This function:\n * 1. Gets the bytecode of the target address and computes its hash\n * 2. Checks if the hash matches a known Safe proxy\n * 3. If proxy matches, calls `masterCopy()` to get the singleton address\n * 4. Verifies the singleton's bytecode hash matches a known Safe singleton\n *\n * @example\n * ```typescript\n * const result = yield* isSafeMultisig({\n * address: \"0x...\",\n * chainId: 1,\n * });\n *\n * if (result.isSafe) {\n * console.log(\"This is a Safe multisig!\");\n * }\n * ```\n *\n * @remarks\n * This is a heuristic check, not a guarantee. Any contract can technically\n * deploy bytecode that matches Safe's, though this is extremely unlikely\n * in practice. For most use cases, this provides sufficient confidence.\n *\n * @see https://github.com/safe-fndn/safe-smart-account/issues/714\n */\nexport function isSafeMultisig(\n params: SafeDetectionParams\n): Effect.Effect<\n SafeDetectionResult,\n SafeDetectionError | ClientNotFoundError,\n PublicClientService\n> {\n return Effect.gen(function* () {\n const { address, chainId } = params;\n const publicClientService = yield* PublicClientService;\n const client = yield* publicClientService.get(chainId);\n\n // 1. Get proxy bytecode\n const proxyBytecode = yield* Effect.tryPromise({\n catch: (cause) =>\n new SafeDetectionError({\n address,\n cause,\n message: `Failed to get bytecode for ${address}`,\n }),\n try: () => client.getCode({ address }),\n });\n\n // No bytecode = EOA or empty contract\n if (!proxyBytecode || proxyBytecode === \"0x\") {\n return {\n isSafe: false,\n proxyHash: undefined,\n singletonAddress: undefined,\n singletonHash: undefined,\n };\n }\n\n // 2. Compute proxy hash\n const proxyHash = keccak256(proxyBytecode);\n\n // 3. Check if proxy hash matches known Safe proxies\n if (!KNOWN_SAFE_PROXY_HASHES.has(proxyHash)) {\n return {\n isSafe: false,\n proxyHash,\n singletonAddress: undefined,\n singletonHash: undefined,\n };\n }\n\n // 4. Call masterCopy() to get singleton address\n const singletonAddress = yield* Effect.tryPromise({\n catch: (cause) =>\n new SafeDetectionError({\n address,\n cause,\n message: `Failed to call masterCopy() on ${address}`,\n }),\n try: () =>\n client.readContract({\n abi: masterCopyAbi,\n address,\n functionName: \"masterCopy\",\n }),\n });\n\n // 5. Get singleton bytecode\n const singletonBytecode = yield* Effect.tryPromise({\n catch: (cause) =>\n new SafeDetectionError({\n address,\n cause,\n message: `Failed to get bytecode for singleton ${singletonAddress}`,\n }),\n try: () => client.getCode({ address: singletonAddress }),\n });\n\n if (!singletonBytecode || singletonBytecode === \"0x\") {\n return {\n isSafe: false,\n proxyHash,\n singletonAddress,\n singletonHash: undefined,\n };\n }\n\n // 6. Compute and check singleton hash\n const singletonHash = keccak256(singletonBytecode);\n const isSafe = KNOWN_SAFE_SINGLETON_HASHES.has(singletonHash);\n\n return {\n isSafe,\n proxyHash,\n singletonAddress,\n singletonHash,\n };\n });\n}\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=detection.test.integration.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detection.test.integration.d.ts","sourceRoot":"","sources":["../../src/safe/detection.test.integration.ts"],"names":[],"mappings":""}
@@ -1,92 +0,0 @@
1
- import { describe, expect, it } from "@effect/vitest";
2
- import { Effect } from "effect";
3
- import { mainnet } from "viem/chains";
4
- import { makePublicClientLayer } from "../presets/index.js";
5
- import { isSafeMultisig } from "./detection.js";
6
- const SAFE_V1_3_0_SINGLETON = "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552";
7
- const SAFE_V1_4_1_SINGLETON = "0x41675C099F32341bf84BFc5382aF534df5C7461a";
8
- const testLayer = makePublicClientLayer([
9
- {
10
- chain: mainnet,
11
- chainId: 1,
12
- rpcUrls: ["https://eth.llamarpc.com"],
13
- },
14
- ]);
15
- describe("isSafeMultisig", () => {
16
- describe("Positive Cases - Known Safe Wallets", () => {
17
- it.effect("detects CoW DAO Safe (v1.3.0)", () => Effect.gen(function* () {
18
- const result = yield* isSafeMultisig({
19
- address: "0xcA771eda0c70aA7d053aB1B25004559B918FE662",
20
- chainId: 1,
21
- });
22
- expect(result.isSafe).toBe(true);
23
- expect(result.proxyHash).toBeDefined();
24
- expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);
25
- expect(result.singletonHash).toBeDefined();
26
- }).pipe(Effect.provide(testLayer)));
27
- it.effect("detects Gnosis DAO Safe (v1.3.0)", () => Effect.gen(function* () {
28
- const result = yield* isSafeMultisig({
29
- address: "0x849D52316331967b6fF1198e5E32A0eB168D039d",
30
- chainId: 1,
31
- });
32
- expect(result.isSafe).toBe(true);
33
- expect(result.proxyHash).toBeDefined();
34
- expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);
35
- expect(result.singletonHash).toBeDefined();
36
- }).pipe(Effect.provide(testLayer)));
37
- it.effect("detects v1.4.1 Safe", () => Effect.gen(function* () {
38
- const result = yield* isSafeMultisig({
39
- address: "0x843ed9137c60772b30a71a7fbdb7f302f336ace7",
40
- chainId: 1,
41
- });
42
- expect(result.isSafe).toBe(true);
43
- expect(result.proxyHash).toBeDefined();
44
- expect(result.singletonAddress).toBe(SAFE_V1_4_1_SINGLETON);
45
- expect(result.singletonHash).toBeDefined();
46
- }).pipe(Effect.provide(testLayer)));
47
- });
48
- describe("Negative Cases - Non-Safe Contracts", () => {
49
- it.effect("identifies non-Safe contract (vitalik.eth with EIP-7702) as non-Safe", () => Effect.gen(function* () {
50
- const result = yield* isSafeMultisig({
51
- address: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
52
- chainId: 1,
53
- });
54
- expect(result.isSafe).toBe(false);
55
- expect(result.singletonAddress).toBeUndefined();
56
- expect(result.singletonHash).toBeUndefined();
57
- }).pipe(Effect.provide(testLayer)));
58
- it.effect("identifies Uniswap V2 Router as non-Safe", () => Effect.gen(function* () {
59
- const result = yield* isSafeMultisig({
60
- address: "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D",
61
- chainId: 1,
62
- });
63
- expect(result.isSafe).toBe(false);
64
- expect(result.proxyHash).toBeDefined();
65
- expect(result.singletonAddress).toBeUndefined();
66
- expect(result.singletonHash).toBeUndefined();
67
- }).pipe(Effect.provide(testLayer)));
68
- it.effect("identifies USDC as non-Safe", () => Effect.gen(function* () {
69
- const result = yield* isSafeMultisig({
70
- address: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
71
- chainId: 1,
72
- });
73
- expect(result.isSafe).toBe(false);
74
- expect(result.proxyHash).toBeDefined();
75
- expect(result.singletonAddress).toBeUndefined();
76
- expect(result.singletonHash).toBeUndefined();
77
- }).pipe(Effect.provide(testLayer)));
78
- });
79
- describe("Edge Cases", () => {
80
- it.effect("handles precompile address gracefully", () => Effect.gen(function* () {
81
- const result = yield* isSafeMultisig({
82
- address: "0x0000000000000000000000000000000000000001",
83
- chainId: 1,
84
- });
85
- expect(result.isSafe).toBe(false);
86
- expect(result.proxyHash).toBeUndefined();
87
- expect(result.singletonAddress).toBeUndefined();
88
- expect(result.singletonHash).toBeUndefined();
89
- }).pipe(Effect.provide(testLayer)));
90
- });
91
- });
92
- //# sourceMappingURL=detection.test.integration.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detection.test.integration.js","sourceRoot":"","sources":["../../src/safe/detection.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Effect } from \"effect\";\nimport type { Address } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport { makePublicClientLayer } from \"@/src/presets/index.js\";\nimport { isSafeMultisig } from \"./detection.js\";\n\n// Known Safe singleton hashes for verification\nconst SAFE_V1_3_0_SINGLETON = \"0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552\" as Address;\nconst SAFE_V1_4_1_SINGLETON = \"0x41675C099F32341bf84BFc5382aF534df5C7461a\" as Address;\n\n// Test layer with Ethereum mainnet RPC\nconst testLayer = makePublicClientLayer([\n {\n chain: mainnet,\n chainId: 1,\n rpcUrls: [\"https://eth.llamarpc.com\"],\n },\n]);\n\ndescribe(\"isSafeMultisig\", () => {\n describe(\"Positive Cases - Known Safe Wallets\", () => {\n it.effect(\"detects CoW DAO Safe (v1.3.0)\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0xcA771eda0c70aA7d053aB1B25004559B918FE662\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(true);\n expect(result.proxyHash).toBeDefined();\n expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);\n expect(result.singletonHash).toBeDefined();\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"detects Gnosis DAO Safe (v1.3.0)\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0x849D52316331967b6fF1198e5E32A0eB168D039d\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(true);\n expect(result.proxyHash).toBeDefined();\n expect(result.singletonAddress).toBe(SAFE_V1_3_0_SINGLETON);\n expect(result.singletonHash).toBeDefined();\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"detects v1.4.1 Safe\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0x843ed9137c60772b30a71a7fbdb7f302f336ace7\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(true);\n expect(result.proxyHash).toBeDefined();\n expect(result.singletonAddress).toBe(SAFE_V1_4_1_SINGLETON);\n expect(result.singletonHash).toBeDefined();\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"Negative Cases - Non-Safe Contracts\", () => {\n it.effect(\"identifies non-Safe contract (vitalik.eth with EIP-7702) as non-Safe\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\",\n chainId: 1,\n });\n\n // vitalik.eth address has bytecode (EIP-7702 delegation) but is not a Safe multisig\n expect(result.isSafe).toBe(false);\n expect(result.singletonAddress).toBeUndefined();\n expect(result.singletonHash).toBeUndefined();\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"identifies Uniswap V2 Router as non-Safe\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(false);\n expect(result.proxyHash).toBeDefined();\n expect(result.singletonAddress).toBeUndefined();\n expect(result.singletonHash).toBeUndefined();\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"identifies USDC as non-Safe\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(false);\n expect(result.proxyHash).toBeDefined();\n expect(result.singletonAddress).toBeUndefined();\n expect(result.singletonHash).toBeUndefined();\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"Edge Cases\", () => {\n it.effect(\"handles precompile address gracefully\", () =>\n Effect.gen(function* () {\n const result = yield* isSafeMultisig({\n address: \"0x0000000000000000000000000000000000000001\",\n chainId: 1,\n });\n\n expect(result.isSafe).toBe(false);\n expect(result.proxyHash).toBeUndefined();\n expect(result.singletonAddress).toBeUndefined();\n expect(result.singletonHash).toBeUndefined();\n }).pipe(Effect.provide(testLayer))\n );\n });\n});\n"]}
@@ -1,79 +0,0 @@
1
- import { Schema } from "effect";
2
- declare const SafeSdkUnavailableError_base: Schema.TaggedErrorClass<SafeSdkUnavailableError, "SafeSdkUnavailableError", {
3
- readonly _tag: Schema.tag<"SafeSdkUnavailableError">;
4
- } & {
5
- cause: Schema.optional<typeof Schema.Unknown>;
6
- message: typeof Schema.String;
7
- }>;
8
- export declare class SafeSdkUnavailableError extends SafeSdkUnavailableError_base {
9
- }
10
- declare const NotInSafeAppContextError_base: Schema.TaggedErrorClass<NotInSafeAppContextError, "NotInSafeAppContextError", {
11
- readonly _tag: Schema.tag<"NotInSafeAppContextError">;
12
- } & {
13
- message: typeof Schema.String;
14
- }>;
15
- export declare class NotInSafeAppContextError extends NotInSafeAppContextError_base {
16
- }
17
- declare const SafeInfoUnavailableError_base: Schema.TaggedErrorClass<SafeInfoUnavailableError, "SafeInfoUnavailableError", {
18
- readonly _tag: Schema.tag<"SafeInfoUnavailableError">;
19
- } & {
20
- cause: Schema.optional<typeof Schema.Unknown>;
21
- message: typeof Schema.String;
22
- }>;
23
- export declare class SafeInfoUnavailableError extends SafeInfoUnavailableError_base {
24
- }
25
- declare const SafeSettingsError_base: Schema.TaggedErrorClass<SafeSettingsError, "SafeSettingsError", {
26
- readonly _tag: Schema.tag<"SafeSettingsError">;
27
- } & {
28
- cause: Schema.optional<typeof Schema.Unknown>;
29
- message: typeof Schema.String;
30
- }>;
31
- export declare class SafeSettingsError extends SafeSettingsError_base {
32
- }
33
- declare const SafeTxSubmissionError_base: Schema.TaggedErrorClass<SafeTxSubmissionError, "SafeTxSubmissionError", {
34
- readonly _tag: Schema.tag<"SafeTxSubmissionError">;
35
- } & {
36
- cause: Schema.optional<typeof Schema.Unknown>;
37
- message: typeof Schema.String;
38
- }>;
39
- export declare class SafeTxSubmissionError extends SafeTxSubmissionError_base {
40
- }
41
- declare const SafeTxLookupError_base: Schema.TaggedErrorClass<SafeTxLookupError, "SafeTxLookupError", {
42
- readonly _tag: Schema.tag<"SafeTxLookupError">;
43
- } & {
44
- cause: Schema.optional<typeof Schema.Unknown>;
45
- message: typeof Schema.String;
46
- retryable: typeof Schema.Boolean;
47
- safeTxHash: typeof Schema.String;
48
- }>;
49
- export declare class SafeTxLookupError extends SafeTxLookupError_base {
50
- }
51
- declare const SafeTxExecutionTimeoutError_base: Schema.TaggedErrorClass<SafeTxExecutionTimeoutError, "SafeTxExecutionTimeoutError", {
52
- readonly _tag: Schema.tag<"SafeTxExecutionTimeoutError">;
53
- } & {
54
- lastStatus: Schema.optional<typeof Schema.String>;
55
- message: typeof Schema.String;
56
- safeTxHash: typeof Schema.String;
57
- timeout: typeof Schema.Number;
58
- }>;
59
- export declare class SafeTxExecutionTimeoutError extends SafeTxExecutionTimeoutError_base {
60
- }
61
- declare const SignTypedDataError_base: Schema.TaggedErrorClass<SignTypedDataError, "SignTypedDataError", {
62
- readonly _tag: Schema.tag<"SignTypedDataError">;
63
- } & {
64
- cause: Schema.optional<typeof Schema.Unknown>;
65
- message: typeof Schema.String;
66
- }>;
67
- export declare class SignTypedDataError extends SignTypedDataError_base {
68
- }
69
- declare const OffchainSignatureTimeoutError_base: Schema.TaggedErrorClass<OffchainSignatureTimeoutError, "OffchainSignatureTimeoutError", {
70
- readonly _tag: Schema.tag<"OffchainSignatureTimeoutError">;
71
- } & {
72
- message: typeof Schema.String;
73
- messageHash: typeof Schema.String;
74
- timeout: typeof Schema.Number;
75
- }>;
76
- export declare class OffchainSignatureTimeoutError extends OffchainSignatureTimeoutError_base {
77
- }
78
- export {};
79
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
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,uBAAwB,SAAQ,4BAG5C;CAAG;;;;;;AAEJ,qBAAa,wBAAyB,SAAQ,6BAG7C;CAAG;;;;;;;AAGJ,qBAAa,wBAAyB,SAAQ,6BAG7C;CAAG;;;;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAGtC;CAAG;;;;;;;AAEJ,qBAAa,qBAAsB,SAAQ,0BAG1C;CAAG;;;;;;;;;AAEJ,qBAAa,iBAAkB,SAAQ,sBAQtC;CAAG;;;;;;;;;AAEJ,qBAAa,2BAA4B,SAAQ,gCAQhD;CAAG;;;;;;;AAGJ,qBAAa,kBAAmB,SAAQ,uBAGvC;CAAG;;;;;;;;AAEJ,qBAAa,6BAA8B,SAAQ,kCAOlD;CAAG"}
@@ -1,34 +0,0 @@
1
- import { Schema } from "effect";
2
- export class SafeSdkUnavailableError extends Schema.TaggedError()("SafeSdkUnavailableError", { cause: Schema.optional(Schema.Unknown), message: Schema.String }) {
3
- }
4
- export class NotInSafeAppContextError extends Schema.TaggedError()("NotInSafeAppContextError", { message: Schema.String }) {
5
- }
6
- export class SafeInfoUnavailableError extends Schema.TaggedError()("SafeInfoUnavailableError", { cause: Schema.optional(Schema.Unknown), message: Schema.String }) {
7
- }
8
- export class SafeSettingsError extends Schema.TaggedError()("SafeSettingsError", { cause: Schema.optional(Schema.Unknown), message: Schema.String }) {
9
- }
10
- export class SafeTxSubmissionError extends Schema.TaggedError()("SafeTxSubmissionError", { cause: Schema.optional(Schema.Unknown), message: Schema.String }) {
11
- }
12
- export class SafeTxLookupError extends Schema.TaggedError()("SafeTxLookupError", {
13
- cause: Schema.optional(Schema.Unknown),
14
- message: Schema.String,
15
- retryable: Schema.Boolean,
16
- safeTxHash: Schema.String,
17
- }) {
18
- }
19
- export class SafeTxExecutionTimeoutError extends Schema.TaggedError()("SafeTxExecutionTimeoutError", {
20
- lastStatus: Schema.optional(Schema.String),
21
- message: Schema.String,
22
- safeTxHash: Schema.String,
23
- timeout: Schema.Number,
24
- }) {
25
- }
26
- export class SignTypedDataError extends Schema.TaggedError()("SignTypedDataError", { cause: Schema.optional(Schema.Unknown), message: Schema.String }) {
27
- }
28
- export class OffchainSignatureTimeoutError extends Schema.TaggedError()("OffchainSignatureTimeoutError", {
29
- message: Schema.String,
30
- messageHash: Schema.String,
31
- timeout: Schema.Number,
32
- }) {
33
- }
34
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/safe/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,MAAM,OAAO,uBAAwB,SAAQ,MAAM,CAAC,WAAW,EAA2B,CACxF,yBAAyB,EACzB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE;CAAG;AAEJ,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,WAAW,EAA4B,CAC1F,0BAA0B,EAC1B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAC3B;CAAG;AAGJ,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,WAAW,EAA4B,CAC1F,0BAA0B,EAC1B,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE;CAAG;AAEJ,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CACpF,uBAAuB,EACvB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,SAAS,EAAE,MAAM,CAAC,OAAO;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM;CAC1B,CACF;CAAG;AAEJ,MAAM,OAAO,2BAA4B,SAAQ,MAAM,CAAC,WAAW,EAA+B,CAChG,6BAA6B,EAC7B;IACE,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAGJ,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CACnE;CAAG;AAEJ,MAAM,OAAO,6BAA8B,SAAQ,MAAM,CAAC,WAAW,EAAiC,CACpG,+BAA+B,EAC/B;IACE,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,WAAW,EAAE,MAAM,CAAC,MAAM;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG","sourcesContent":["import { Schema } from \"effect\";\n\n// SDK availability errors\nexport class SafeSdkUnavailableError extends Schema.TaggedError<SafeSdkUnavailableError>()(\n \"SafeSdkUnavailableError\",\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 SafeInfoUnavailableError extends Schema.TaggedError<SafeInfoUnavailableError>()(\n \"SafeInfoUnavailableError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeSettingsError extends Schema.TaggedError<SafeSettingsError>()(\n \"SafeSettingsError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeTxSubmissionError extends Schema.TaggedError<SafeTxSubmissionError>()(\n \"SafeTxSubmissionError\",\n { cause: Schema.optional(Schema.Unknown), message: Schema.String }\n) {}\n\nexport class SafeTxLookupError extends Schema.TaggedError<SafeTxLookupError>()(\n \"SafeTxLookupError\",\n {\n cause: Schema.optional(Schema.Unknown),\n message: Schema.String,\n retryable: Schema.Boolean,\n safeTxHash: Schema.String,\n }\n) {}\n\nexport class SafeTxExecutionTimeoutError extends Schema.TaggedError<SafeTxExecutionTimeoutError>()(\n \"SafeTxExecutionTimeoutError\",\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"]}
@@ -1,8 +0,0 @@
1
- export type { SafeDetectionParams, SafeDetectionResult } from "./detection.js";
2
- export { isSafeMultisig, SafeDetectionError } from "./detection.js";
3
- export { NotInSafeAppContextError, OffchainSignatureTimeoutError, SafeInfoUnavailableError, SafeSdkUnavailableError, SafeSettingsError, SafeTxExecutionTimeoutError, SafeTxLookupError, SafeTxSubmissionError, SignTypedDataError, } from "./errors.js";
4
- export { type SafeAppsServiceConfig, SafeAppsServiceLive } from "./live.js";
5
- export { SafeAppsService, type SafeAppsServiceShape } from "./service.js";
6
- export * from "./simulation/index.js";
7
- export type { EIP712TypedData, OffchainSignaturePolicy, OffchainSignatureResult, SafeInfo, SafeMultisigTx, SafeTxResult, SafeTxSubmission, SafeWaitPolicy, SignTypedDataResult, } from "./types.js";
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,KAAK,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE1E,cAAc,uBAAuB,CAAC;AAEtC,YAAY,EACV,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -1,6 +0,0 @@
1
- export { isSafeMultisig, SafeDetectionError } from "./detection.js";
2
- export { NotInSafeAppContextError, OffchainSignatureTimeoutError, SafeInfoUnavailableError, SafeSdkUnavailableError, SafeSettingsError, SafeTxExecutionTimeoutError, SafeTxLookupError, SafeTxSubmissionError, SignTypedDataError, } from "./errors.js";
3
- export { SafeAppsServiceLive } from "./live.js";
4
- export { SafeAppsService } from "./service.js";
5
- export * from "./simulation/index.js";
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/safe/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpE,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAA8B,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,eAAe,EAA6B,MAAM,cAAc,CAAC;AAE1E,cAAc,uBAAuB,CAAC","sourcesContent":["// Service and layer\n\nexport type { SafeDetectionParams, SafeDetectionResult } from \"./detection.js\";\n// Detection\nexport { isSafeMultisig, SafeDetectionError } from \"./detection.js\";\n\n// Errors\nexport {\n NotInSafeAppContextError,\n OffchainSignatureTimeoutError,\n SafeInfoUnavailableError,\n SafeSdkUnavailableError,\n SafeSettingsError,\n SafeTxExecutionTimeoutError,\n SafeTxLookupError,\n SafeTxSubmissionError,\n SignTypedDataError,\n} from \"./errors.js\";\nexport { type SafeAppsServiceConfig, SafeAppsServiceLive } from \"./live.js\";\nexport { SafeAppsService, type SafeAppsServiceShape } from \"./service.js\";\n// Simulation\nexport * from \"./simulation/index.js\";\n// Types\nexport type {\n EIP712TypedData,\n OffchainSignaturePolicy,\n OffchainSignatureResult,\n SafeInfo,\n SafeMultisigTx,\n SafeTxResult,\n SafeTxSubmission,\n SafeWaitPolicy,\n SignTypedDataResult,\n} from \"./types.js\";\n"]}
@@ -1,8 +0,0 @@
1
- import { Layer } from "effect";
2
- import { TxManager } from "../tx/index.js";
3
- import type { SafeAppsSdkConfig } from "./adapter.js";
4
- import { NotInSafeAppContextError } from "./errors.js";
5
- import { SafeAppsService } from "./service.js";
6
- export type SafeAppsServiceConfig = SafeAppsSdkConfig;
7
- export declare const SafeAppsServiceLive: (config?: SafeAppsServiceConfig) => Layer.Layer<SafeAppsService, import("./errors.js").SafeSdkUnavailableError | NotInSafeAppContextError, TxManager>;
8
- //# sourceMappingURL=live.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,EAAe,MAAM,QAAQ,CAAC;AAU9D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EACL,wBAAwB,EAQzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AA+CtD,eAAO,MAAM,mBAAmB,GAAI,SAAS,qBAAqB,sHA6W/D,CAAC"}