@prb/effect-evm-safe 3.0.0 → 3.0.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 +9 -0
- package/dist/safe/live.d.ts.map +1 -1
- package/dist/safe/live.js +13 -1
- package/dist/safe/live.js.map +1 -1
- package/dist/safe/service.d.ts +3 -3
- package/dist/safe/service.d.ts.map +1 -1
- package/dist/safe/service.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,6 +13,15 @@ The format is based on [Common Changelog](https://common-changelog.org/).
|
|
|
13
13
|
[2.0.2]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%402.0.2
|
|
14
14
|
[2.1.0]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%402.1.0
|
|
15
15
|
[3.0.0]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%403.0.0
|
|
16
|
+
[3.0.1]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%403.0.1
|
|
17
|
+
|
|
18
|
+
## [3.0.1] - 2026-02-25
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- Propagate user rejection as `UserRejectedError` in `sendTxs` and `signTypedData` instead of collapsing to generic
|
|
23
|
+
`SafeMultisigTxSubmissionError` / `SignTypedDataError`
|
|
24
|
+
([`5655f12`](https://github.com/PaulRBerg/prb-effect/commit/5655f12))
|
|
16
25
|
|
|
17
26
|
## [3.0.0] - 2026-02-20
|
|
18
27
|
|
package/dist/safe/live.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../../src/safe/live.ts"],"names":[],"mappings":"AACA,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;AAgB3E,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AA4CtD,eAAO,MAAM,mBAAmB,GAAI,SAAS,qBAAqB,mDAyU/D,CAAC"}
|
package/dist/safe/live.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isUserRejectedError, UserRejectedError } from "@prb/effect-evm/core/errors";
|
|
1
2
|
import { TxManager } from "@prb/effect-evm/tx";
|
|
2
3
|
import { Effect, Layer, Option, Ref } from "effect";
|
|
3
4
|
import { isAddress, isHash, isHex } from "viem";
|
|
@@ -68,6 +69,9 @@ export const SafeAppsServiceLive = (config) => Layer.scoped(SafeAppsService, Eff
|
|
|
68
69
|
}));
|
|
69
70
|
const result = yield* withSdk(getSdk, (s) => Effect.tryPromise({
|
|
70
71
|
catch: (cause) => {
|
|
72
|
+
if (isUserRejectedError(cause)) {
|
|
73
|
+
return new UserRejectedError({ message: "User rejected the Safe transaction" });
|
|
74
|
+
}
|
|
71
75
|
const detail = getSafeErrorMessage(cause);
|
|
72
76
|
return new SafeMultisigTxSubmissionError({
|
|
73
77
|
cause,
|
|
@@ -132,7 +136,15 @@ export const SafeAppsServiceLive = (config) => Layer.scoped(SafeAppsService, Eff
|
|
|
132
136
|
});
|
|
133
137
|
const signTypedData = Effect.fn("SafeAppsService.signTypedData")(function* (typedData) {
|
|
134
138
|
const result = yield* withSdk(getSdk, (s) => Effect.tryPromise({
|
|
135
|
-
catch: (cause) =>
|
|
139
|
+
catch: (cause) => {
|
|
140
|
+
if (isUserRejectedError(cause)) {
|
|
141
|
+
return new UserRejectedError({ message: "User rejected Safe signature" });
|
|
142
|
+
}
|
|
143
|
+
return new SignTypedDataError({
|
|
144
|
+
cause,
|
|
145
|
+
message: "Failed to sign typed data via Safe",
|
|
146
|
+
});
|
|
147
|
+
},
|
|
136
148
|
try: () => s.txs.signTypedMessage(typedData),
|
|
137
149
|
}), (e) => new SignTypedDataError({ cause: e, message: e.message }));
|
|
138
150
|
if ("messageHash" in result) {
|
package/dist/safe/live.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,EAClB,2BAA2B,GAC5B,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,CAAC,2BAA2B,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC;YACtE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC;SAC7C,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,UAAU,EAAE,CAAC,EAAE,KAAK,CAAC,CACzD,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;QAC1E,MAAM,aAAa,GAAG,EAAE,CAAC,qBAAqB,CAAC;QAC/C,MAAM,wBAAwB,GAC5B,aAAa,KAAK,SAAS;YAC3B,aAAa,KAAK,IAAI;YACtB,aAAa,CAAC,IAAI,KAAK,UAAU,CAAC;QAEpC,OAAO;YACL,aAAa,EAAE,wBAAwB,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;YACnF,qBAAqB,EAAE,wBAAwB;gBAC7C,CAAC,CAAC,aAAa,CAAC,qBAAqB;gBACrC,CAAC,CAAC,IAAI;YACR,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAQ;YAC/D,MAAM,EAAE,EAAE,CAAC,QAAQ,IAAI,wBAAwB;SAChD,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,CAAC,2BAA2B,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAClE,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,WAAW,CAAC;QACxB,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,CAAC,2BAA2B,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CACnE,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,CAAC,2BAA2B,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC;YACvE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;SACpD,CAAC,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,2BAA2B,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAC1D,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 toSafeMultisigTxLookupError,\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) => toSafeMultisigTxLookupError(safeTxHash, cause, true),\n try: () => s.txs.getBySafeTxHash(safeTxHash),\n }),\n (e) => toSafeMultisigTxLookupError(safeTxHash, e, false)\n );\n\n const txHash = tx.txHash ? yield* validateHash(tx.txHash, \"getTx\") : null;\n const executionInfo = tx.detailedExecutionInfo;\n const hasMultisigExecutionInfo =\n executionInfo !== undefined &&\n executionInfo !== null &&\n executionInfo.type === \"MULTISIG\";\n\n return {\n confirmations: hasMultisigExecutionInfo ? executionInfo.confirmations.length : null,\n confirmationsRequired: hasMultisigExecutionInfo\n ? executionInfo.confirmationsRequired\n : null,\n onchainHash: txHash ? Option.some(txHash) : Option.none<Hash>(),\n status: tx.txStatus ?? \"AWAITING_CONFIRMATIONS\",\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(toSafeMultisigTxLookupError(safeTxHash, error, true))\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.onchainHash;\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(toSafeMultisigTxLookupError(safeTxHash, error, false))\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) => toSafeMultisigTxLookupError(messageHash, cause, true),\n try: () => s.safe.getOffChainSignature(messageHash),\n }),\n (e) => toSafeMultisigTxLookupError(messageHash, e, false)\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":"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","sourcesContent":["import { isUserRejectedError, UserRejectedError } from \"@prb/effect-evm/core/errors\";\nimport { 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 toSafeMultisigTxLookupError,\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 if (isUserRejectedError(cause)) {\n return new UserRejectedError({ message: \"User rejected the Safe transaction\" });\n }\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) => toSafeMultisigTxLookupError(safeTxHash, cause, true),\n try: () => s.txs.getBySafeTxHash(safeTxHash),\n }),\n (e) => toSafeMultisigTxLookupError(safeTxHash, e, false)\n );\n\n const txHash = tx.txHash ? yield* validateHash(tx.txHash, \"getTx\") : null;\n const executionInfo = tx.detailedExecutionInfo;\n const hasMultisigExecutionInfo =\n executionInfo !== undefined &&\n executionInfo !== null &&\n executionInfo.type === \"MULTISIG\";\n\n return {\n confirmations: hasMultisigExecutionInfo ? executionInfo.confirmations.length : null,\n confirmationsRequired: hasMultisigExecutionInfo\n ? executionInfo.confirmationsRequired\n : null,\n onchainHash: txHash ? Option.some(txHash) : Option.none<Hash>(),\n status: tx.txStatus ?? \"AWAITING_CONFIRMATIONS\",\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(toSafeMultisigTxLookupError(safeTxHash, error, true))\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.onchainHash;\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(toSafeMultisigTxLookupError(safeTxHash, error, false))\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 if (isUserRejectedError(cause)) {\n return new UserRejectedError({ message: \"User rejected Safe signature\" });\n }\n return new SignTypedDataError({\n cause,\n message: \"Failed to sign typed data via Safe\",\n });\n },\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) => toSafeMultisigTxLookupError(messageHash, cause, true),\n try: () => s.safe.getOffChainSignature(messageHash),\n }),\n (e) => toSafeMultisigTxLookupError(messageHash, e, false)\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/dist/safe/service.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ClientNotFoundError, ReceiptTimeoutError, TxFailedError } from "@prb/effect-evm/core/errors";
|
|
1
|
+
import type { ClientNotFoundError, ReceiptTimeoutError, TxFailedError, UserRejectedError } from "@prb/effect-evm/core/errors";
|
|
2
2
|
import type { Effect, Option } from "effect";
|
|
3
3
|
import { Context } from "effect";
|
|
4
4
|
import type { Hash, Hex } from "viem";
|
|
@@ -8,10 +8,10 @@ export type SafeAppsServiceShape = {
|
|
|
8
8
|
readonly getInfo: () => Effect.Effect<SafeMultisigInfo, SafeMultisigInfoUnavailableError>;
|
|
9
9
|
readonly sendTxs: (txs: readonly SafeMultisigTx[], params?: {
|
|
10
10
|
safeTxGas?: number;
|
|
11
|
-
}) => Effect.Effect<SafeMultisigTxSubmission, SafeMultisigTxSubmissionError>;
|
|
11
|
+
}) => Effect.Effect<SafeMultisigTxSubmission, SafeMultisigTxSubmissionError | UserRejectedError>;
|
|
12
12
|
readonly getTx: (safeTxHash: Hash) => Effect.Effect<SafeMultisigTxInfo, SafeMultisigTxLookupError>;
|
|
13
13
|
readonly waitForTxReceipt: (safeTxHash: Hash, policy?: SafeWaitPolicy) => Effect.Effect<SafeMultisigTxResult, SafeMultisigTxExecutionTimeoutError | SafeMultisigTxLookupError | TxFailedError | ReceiptTimeoutError | ClientNotFoundError>;
|
|
14
|
-
readonly signTypedData: (typedData: EIP712TypedData) => Effect.Effect<SignTypedDataResult, SignTypedDataError>;
|
|
14
|
+
readonly signTypedData: (typedData: EIP712TypedData) => Effect.Effect<SignTypedDataResult, SignTypedDataError | UserRejectedError>;
|
|
15
15
|
readonly getOffchainSignature: (messageHash: Hex) => Effect.Effect<Option.Option<Hex>, SafeMultisigTxLookupError>;
|
|
16
16
|
readonly pollOffchainSignature: (messageHash: Hex, policy?: OffchainSignaturePolicy) => Effect.Effect<OffchainSignatureResult, OffchainSignatureTimeoutError | SafeMultisigTxLookupError>;
|
|
17
17
|
readonly enableOffchainSigning: () => Effect.Effect<void, SafeMultisigSettingsError>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/safe/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/safe/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,iBAAiB,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,EACV,6BAA6B,EAC7B,gCAAgC,EAChC,yBAAyB,EACzB,mCAAmC,EACnC,yBAAyB,EACzB,6BAA6B,EAC7B,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACd,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,oBAAoB,GAAG;IAEjC,QAAQ,CAAC,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;IAG1F,QAAQ,CAAC,OAAO,EAAE,CAChB,GAAG,EAAE,SAAS,cAAc,EAAE,EAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5B,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,6BAA6B,GAAG,iBAAiB,CAAC,CAAC;IAGhG,QAAQ,CAAC,KAAK,EAAE,CACd,UAAU,EAAE,IAAI,KACb,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;IAGlE,QAAQ,CAAC,gBAAgB,EAAE,CACzB,UAAU,EAAE,IAAI,EAChB,MAAM,CAAC,EAAE,cAAc,KACpB,MAAM,CAAC,MAAM,CAChB,oBAAoB,EAClB,mCAAmC,GACnC,yBAAyB,GACzB,aAAa,GACb,mBAAmB,GACnB,mBAAmB,CACtB,CAAC;IAGF,QAAQ,CAAC,aAAa,EAAE,CACtB,SAAS,EAAE,eAAe,KACvB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,GAAG,iBAAiB,CAAC,CAAC;IAGhF,QAAQ,CAAC,oBAAoB,EAAE,CAC7B,WAAW,EAAE,GAAG,KACb,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAGlE,QAAQ,CAAC,qBAAqB,EAAE,CAC9B,WAAW,EAAE,GAAG,EAChB,MAAM,CAAC,EAAE,uBAAuB,KAC7B,MAAM,CAAC,MAAM,CAChB,uBAAuB,EACvB,6BAA6B,GAAG,yBAAyB,CAC1D,CAAC;IAGF,QAAQ,CAAC,qBAAqB,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;CACtF,CAAC;;AAEF,qBAAa,eAAgB,SAAQ,oBAGlC;CAAG"}
|
package/dist/safe/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/safe/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/safe/service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AA2EjC,MAAM,OAAO,eAAgB,SAAQ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAG7D;CAAG","sourcesContent":["import type {\n ClientNotFoundError,\n ReceiptTimeoutError,\n TxFailedError,\n UserRejectedError,\n} from \"@prb/effect-evm/core/errors\";\nimport type { Effect, Option } from \"effect\";\nimport { Context } from \"effect\";\nimport type { Hash, Hex } from \"viem\";\nimport type {\n OffchainSignatureTimeoutError,\n SafeMultisigInfoUnavailableError,\n SafeMultisigSettingsError,\n SafeMultisigTxExecutionTimeoutError,\n SafeMultisigTxLookupError,\n SafeMultisigTxSubmissionError,\n SignTypedDataError,\n} from \"./errors.js\";\nimport type {\n EIP712TypedData,\n OffchainSignaturePolicy,\n OffchainSignatureResult,\n SafeMultisigInfo,\n SafeMultisigTx,\n SafeMultisigTxInfo,\n SafeMultisigTxResult,\n SafeMultisigTxSubmission,\n SafeWaitPolicy,\n SignTypedDataResult,\n} from \"./types.js\";\n\nexport type SafeAppsServiceShape = {\n /** Get Safe info (cached after first call) */\n readonly getInfo: () => Effect.Effect<SafeMultisigInfo, SafeMultisigInfoUnavailableError>;\n\n /** Send txs to Safe for execution */\n readonly sendTxs: (\n txs: readonly SafeMultisigTx[],\n params?: { safeTxGas?: number }\n ) => Effect.Effect<SafeMultisigTxSubmission, SafeMultisigTxSubmissionError | UserRejectedError>;\n\n /** Get Safe tx details by safeTxHash (status, onchain hash, confirmations metadata) */\n readonly getTx: (\n safeTxHash: Hash\n ) => Effect.Effect<SafeMultisigTxInfo, SafeMultisigTxLookupError>;\n\n /** Wait for Safe tx to execute and return receipt */\n readonly waitForTxReceipt: (\n safeTxHash: Hash,\n policy?: SafeWaitPolicy\n ) => Effect.Effect<\n SafeMultisigTxResult,\n | SafeMultisigTxExecutionTimeoutError\n | SafeMultisigTxLookupError\n | TxFailedError\n | ReceiptTimeoutError\n | ClientNotFoundError\n >;\n\n /** Sign typed data (returns discriminated union based on Safe settings) */\n readonly signTypedData: (\n typedData: EIP712TypedData\n ) => Effect.Effect<SignTypedDataResult, SignTypedDataError | UserRejectedError>;\n\n /** Get off-chain signature (returns Option.none if not yet available) */\n readonly getOffchainSignature: (\n messageHash: Hex\n ) => Effect.Effect<Option.Option<Hex>, SafeMultisigTxLookupError>;\n\n /** Poll for off-chain signature until available or timeout */\n readonly pollOffchainSignature: (\n messageHash: Hex,\n policy?: OffchainSignaturePolicy\n ) => Effect.Effect<\n OffchainSignatureResult,\n OffchainSignatureTimeoutError | SafeMultisigTxLookupError\n >;\n\n /** Enable off-chain signing mode */\n readonly enableOffchainSigning: () => Effect.Effect<void, SafeMultisigSettingsError>;\n};\n\nexport class SafeAppsService extends Context.Tag(\"ew3/SafeApps\")<\n SafeAppsService,\n SafeAppsServiceShape\n>() {}\n"]}
|