@prb/effect-evm-safe 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -12,6 +12,15 @@ The format is based on [Common Changelog](https://common-changelog.org/).
|
|
|
12
12
|
[2.0.1]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%402.0.1
|
|
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
|
+
[3.0.0]: https://github.com/PaulRBerg/prb-effect/releases/tag/%40prb%2Feffect-evm-safe%403.0.0
|
|
16
|
+
|
|
17
|
+
## [3.0.0] - 2026-02-20
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- Map Safe `queued` and `cancelled` outcomes to pipeline terminal unions instead of coercing to `TxFailedError`
|
|
22
|
+
- Emit `TxState` `queued` / `cancelled` statuses from `SafeWriteExecutionAdapterLive`
|
|
23
|
+
- Align adapter execution API with `WriteAndTrackExecution.terminal` in `@prb/effect-evm@^2`
|
|
15
24
|
|
|
16
25
|
## [2.1.0] - 2026-02-18
|
|
17
26
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-adapter.d.ts","sourceRoot":"","sources":["../../src/safe/pipeline-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline-adapter.d.ts","sourceRoot":"","sources":["../../src/safe/pipeline-adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,OAAO,EAAkB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAU,KAAK,EAA2B,MAAM,QAAQ,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAwE/C,eAAO,MAAM,6BAA6B,wEAiJzC,CAAC"}
|
|
@@ -22,12 +22,22 @@ function mapSafeStateToTxState(state) {
|
|
|
22
22
|
case "awaiting_confirmations":
|
|
23
23
|
case "awaiting_execution":
|
|
24
24
|
case "pending":
|
|
25
|
-
case "queued":
|
|
26
25
|
return {
|
|
27
26
|
confirmations: state.confirmations ?? 0,
|
|
28
27
|
hash: state.safeTxHash,
|
|
29
28
|
status: "pending",
|
|
30
29
|
};
|
|
30
|
+
case "queued":
|
|
31
|
+
return {
|
|
32
|
+
details: {
|
|
33
|
+
confirmations: state.confirmations,
|
|
34
|
+
confirmationsRequired: state.confirmationsRequired,
|
|
35
|
+
lastStatus: state.lastStatus,
|
|
36
|
+
},
|
|
37
|
+
reason: "awaiting-safe-confirmations",
|
|
38
|
+
reference: state.safeTxHash,
|
|
39
|
+
status: "queued",
|
|
40
|
+
};
|
|
31
41
|
case "success":
|
|
32
42
|
return {
|
|
33
43
|
hash: state.onchainHash,
|
|
@@ -35,7 +45,11 @@ function mapSafeStateToTxState(state) {
|
|
|
35
45
|
status: "mined",
|
|
36
46
|
};
|
|
37
47
|
case "cancelled":
|
|
38
|
-
return
|
|
48
|
+
return {
|
|
49
|
+
reason: "safe-cancelled",
|
|
50
|
+
reference: state.safeTxHash,
|
|
51
|
+
status: "cancelled",
|
|
52
|
+
};
|
|
39
53
|
case "failed":
|
|
40
54
|
return toFailedState(state.safeTxHash ?? "unknown", state.error ?? "Safe transaction failed");
|
|
41
55
|
}
|
|
@@ -78,8 +92,8 @@ export const SafeWriteExecutionAdapterLive = Layer.effect(WriteExecutionAdapter,
|
|
|
78
92
|
cancel: () => Effect.fail(encodedData.left),
|
|
79
93
|
speedup: () => Effect.fail(encodedData.left),
|
|
80
94
|
},
|
|
81
|
-
result: Effect.fail(encodedData.left),
|
|
82
95
|
stateRef,
|
|
96
|
+
terminal: Effect.fail(encodedData.left),
|
|
83
97
|
};
|
|
84
98
|
}
|
|
85
99
|
const safeTx = {
|
|
@@ -93,28 +107,36 @@ export const SafeWriteExecutionAdapterLive = Layer.effect(WriteExecutionAdapter,
|
|
|
93
107
|
}).pipe(Effect.provideService(SafeAppsService, safeApps), Effect.provideService(TxManager, txManager));
|
|
94
108
|
const stateRef = yield* SubscriptionRef.make(initialTxState);
|
|
95
109
|
yield* Effect.forkScoped(Stream.runForEach(safeExecution.stateRef.changes, (safeState) => SubscriptionRef.set(stateRef, mapSafeStateToTxState(safeState))));
|
|
96
|
-
const
|
|
97
|
-
switch (
|
|
110
|
+
const terminal = safeExecution.result.pipe(Effect.mapError(toTxFailedSafeError), Effect.flatMap((safeTerminal) => {
|
|
111
|
+
switch (safeTerminal._tag) {
|
|
98
112
|
case "success":
|
|
99
113
|
return Effect.succeed({
|
|
114
|
+
_tag: "success",
|
|
100
115
|
events: [],
|
|
101
|
-
hash:
|
|
102
|
-
receipt:
|
|
116
|
+
hash: safeTerminal.onchainHash,
|
|
117
|
+
receipt: safeTerminal.receipt,
|
|
103
118
|
});
|
|
104
119
|
case "queued":
|
|
105
|
-
return Effect.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
120
|
+
return Effect.succeed({
|
|
121
|
+
_tag: "queued",
|
|
122
|
+
details: {
|
|
123
|
+
confirmations: safeTerminal.confirmations,
|
|
124
|
+
confirmationsRequired: safeTerminal.confirmationsRequired,
|
|
125
|
+
lastStatus: safeTerminal.lastStatus,
|
|
126
|
+
},
|
|
127
|
+
reason: "awaiting-safe-confirmations",
|
|
128
|
+
reference: safeTerminal.safeTxHash,
|
|
129
|
+
});
|
|
109
130
|
case "cancelled":
|
|
110
|
-
return Effect.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
131
|
+
return Effect.succeed({
|
|
132
|
+
_tag: "cancelled",
|
|
133
|
+
reason: "safe-cancelled",
|
|
134
|
+
reference: safeTerminal.safeTxHash,
|
|
135
|
+
});
|
|
114
136
|
case "failed":
|
|
115
137
|
return Effect.fail(new TxFailedError({
|
|
116
|
-
hash:
|
|
117
|
-
message:
|
|
138
|
+
hash: safeTerminal.safeTxHash,
|
|
139
|
+
message: safeTerminal.error,
|
|
118
140
|
}));
|
|
119
141
|
default:
|
|
120
142
|
return Effect.fail(new TxFailedError({
|
|
@@ -134,8 +156,8 @@ export const SafeWriteExecutionAdapterLive = Layer.effect(WriteExecutionAdapter,
|
|
|
134
156
|
message: "Speedup is not supported for Safe multisig execution",
|
|
135
157
|
})),
|
|
136
158
|
},
|
|
137
|
-
result,
|
|
138
159
|
stateRef,
|
|
160
|
+
terminal,
|
|
139
161
|
};
|
|
140
162
|
}),
|
|
141
163
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline-adapter.js","sourceRoot":"","sources":["../../src/safe/pipeline-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n WriteAndTrackExecution,\n WriteAndTrackParams,\n} from \"@prb/effect-evm/contract/pipeline\";\nimport { WriteExecutionAdapter } from \"@prb/effect-evm/contract/pipeline\";\nimport { TxFailedError } from \"@prb/effect-evm/core/errors\";\nimport type { TxState } from \"@prb/effect-evm/tx\";\nimport { initialTxState, TxManager } from \"@prb/effect-evm/tx\";\nimport type { ContractFunctionName } from \"@prb/effect-evm/types\";\nimport { Effect, Layer, Stream, SubscriptionRef } from \"effect\";\nimport type { Abi } from \"viem\";\nimport { encodeFunctionData } from \"viem\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { SafeWriteAndTrackState } from \"./write-and-track.js\";\nimport { safeWriteAndTrack } from \"./write-and-track.js\";\n\nfunction toFailedState(hash: string, message: string): TxState {\n return {\n error: new TxFailedError({\n hash,\n message,\n }),\n phase: \"receipt\",\n status: \"failed\",\n };\n}\n\nfunction mapSafeStateToTxState(state: SafeWriteAndTrackState): TxState {\n switch (state.status) {\n case \"submitting\":\n return { status: \"signing\" };\n case \"awaiting_confirmations\":\n case \"awaiting_execution\":\n case \"pending\":\n case \"queued\":\n return {\n confirmations: state.confirmations ?? 0,\n hash: state.safeTxHash,\n status: \"pending\",\n };\n case \"success\":\n return {\n hash: state.onchainHash,\n receipt: state.receipt,\n status: \"mined\",\n };\n case \"cancelled\":\n return toFailedState(state.safeTxHash, \"Safe transaction was cancelled\");\n case \"failed\":\n return toFailedState(state.safeTxHash ?? \"unknown\", state.error ?? \"Safe transaction failed\");\n }\n}\n\nfunction toTxFailedSafeError(error: unknown): TxFailedError {\n const hash =\n typeof error === \"object\" && error !== null && \"safeTxHash\" in error\n ? String((error as { safeTxHash: unknown }).safeTxHash)\n : \"unknown\";\n const message =\n typeof error === \"object\" && error !== null && \"message\" in error\n ? String((error as { message: unknown }).message)\n : \"Safe multisig write failed\";\n\n return new TxFailedError({\n cause: error,\n hash,\n message,\n });\n}\n\nexport const SafeWriteExecutionAdapterLive = Layer.effect(\n WriteExecutionAdapter,\n Effect.gen(function* () {\n const safeApps = yield* SafeAppsService;\n const txManager = yield* TxManager;\n\n return WriteExecutionAdapter.of({\n canHandle: (params) =>\n safeApps.getInfo().pipe(\n Effect.map((info) => (params.chainId == null ? true : info.chainId === params.chainId)),\n Effect.catchAll(() => Effect.succeed(false))\n ),\n writeAndTrack: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(\n params: WriteAndTrackParams<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const encodedData = yield* Effect.try({\n catch: (cause) =>\n new TxFailedError({\n cause,\n hash: \"unknown\",\n message: \"Failed to encode Safe transaction calldata\",\n }),\n try: () =>\n encodeFunctionData({\n abi: params.abi as Abi,\n args: params.args as readonly unknown[] | undefined,\n functionName: params.functionName as string,\n }),\n }).pipe(Effect.either);\n\n if (encodedData._tag === \"Left\") {\n const stateRef = yield* SubscriptionRef.make<TxState>(\n toFailedState(\"unknown\", encodedData.left.message)\n );\n\n return {\n actions: {\n cancel: () => Effect.fail(encodedData.left),\n speedup: () => Effect.fail(encodedData.left),\n },\n result: Effect.fail(encodedData.left),\n stateRef,\n } satisfies WriteAndTrackExecution<TAbi>;\n }\n\n const safeTx = {\n data: encodedData.right,\n to: params.address,\n value: params.value ?? 0n,\n };\n\n const safeExecution = yield* safeWriteAndTrack({\n chainId: params.chainId,\n transactions: [safeTx],\n }).pipe(\n Effect.provideService(SafeAppsService, safeApps),\n Effect.provideService(TxManager, txManager)\n );\n\n const stateRef = yield* SubscriptionRef.make<TxState>(initialTxState);\n\n yield* Effect.forkScoped(\n Stream.runForEach(safeExecution.stateRef.changes, (safeState) =>\n SubscriptionRef.set(stateRef, mapSafeStateToTxState(safeState))\n )\n );\n\n const result = safeExecution.result.pipe(\n Effect.mapError(toTxFailedSafeError),\n Effect.flatMap((terminal) => {\n switch (terminal._tag) {\n case \"success\":\n return Effect.succeed({\n events: [],\n hash: terminal.onchainHash,\n receipt: terminal.receipt,\n });\n case \"queued\":\n return Effect.fail(\n new TxFailedError({\n hash: terminal.safeTxHash,\n message: \"Safe transaction is queued and awaiting more confirmations\",\n })\n );\n case \"cancelled\":\n return Effect.fail(\n new TxFailedError({\n hash: terminal.safeTxHash,\n message: \"Safe transaction was cancelled\",\n })\n );\n case \"failed\":\n return Effect.fail(\n new TxFailedError({\n hash: terminal.safeTxHash,\n message: terminal.error,\n })\n );\n default:\n return Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Unexpected Safe terminal state\",\n })\n );\n }\n })\n );\n\n return {\n actions: {\n cancel: () =>\n Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Cancel is not supported for Safe multisig execution\",\n })\n ),\n speedup: () =>\n Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Speedup is not supported for Safe multisig execution\",\n })\n ),\n },\n result,\n stateRef,\n } satisfies WriteAndTrackExecution<TAbi>;\n }),\n });\n })\n);\n"]}
|
|
1
|
+
{"version":3,"file":"pipeline-adapter.js","sourceRoot":"","sources":["../../src/safe/pipeline-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n WriteAndTrackExecution,\n WriteAndTrackParams,\n WriteAndTrackTerminal,\n} from \"@prb/effect-evm/contract/pipeline\";\nimport { WriteExecutionAdapter } from \"@prb/effect-evm/contract/pipeline\";\nimport { TxFailedError } from \"@prb/effect-evm/core/errors\";\nimport type { TxState } from \"@prb/effect-evm/tx\";\nimport { initialTxState, TxManager } from \"@prb/effect-evm/tx\";\nimport type { ContractFunctionName } from \"@prb/effect-evm/types\";\nimport { Effect, Layer, Stream, SubscriptionRef } from \"effect\";\nimport type { Abi } from \"viem\";\nimport { encodeFunctionData } from \"viem\";\nimport { SafeAppsService } from \"./service.js\";\nimport type { SafeWriteAndTrackState } from \"./write-and-track.js\";\nimport { safeWriteAndTrack } from \"./write-and-track.js\";\n\nfunction toFailedState(hash: string, message: string): TxState {\n return {\n error: new TxFailedError({\n hash,\n message,\n }),\n phase: \"receipt\",\n status: \"failed\",\n };\n}\n\nfunction mapSafeStateToTxState(state: SafeWriteAndTrackState): TxState {\n switch (state.status) {\n case \"submitting\":\n return { status: \"signing\" };\n case \"awaiting_confirmations\":\n case \"awaiting_execution\":\n case \"pending\":\n return {\n confirmations: state.confirmations ?? 0,\n hash: state.safeTxHash,\n status: \"pending\",\n };\n case \"queued\":\n return {\n details: {\n confirmations: state.confirmations,\n confirmationsRequired: state.confirmationsRequired,\n lastStatus: state.lastStatus,\n },\n reason: \"awaiting-safe-confirmations\",\n reference: state.safeTxHash,\n status: \"queued\",\n };\n case \"success\":\n return {\n hash: state.onchainHash,\n receipt: state.receipt,\n status: \"mined\",\n };\n case \"cancelled\":\n return {\n reason: \"safe-cancelled\",\n reference: state.safeTxHash,\n status: \"cancelled\",\n };\n case \"failed\":\n return toFailedState(state.safeTxHash ?? \"unknown\", state.error ?? \"Safe transaction failed\");\n }\n}\n\nfunction toTxFailedSafeError(error: unknown): TxFailedError {\n const hash =\n typeof error === \"object\" && error !== null && \"safeTxHash\" in error\n ? String((error as { safeTxHash: unknown }).safeTxHash)\n : \"unknown\";\n const message =\n typeof error === \"object\" && error !== null && \"message\" in error\n ? String((error as { message: unknown }).message)\n : \"Safe multisig write failed\";\n\n return new TxFailedError({\n cause: error,\n hash,\n message,\n });\n}\n\nexport const SafeWriteExecutionAdapterLive = Layer.effect(\n WriteExecutionAdapter,\n Effect.gen(function* () {\n const safeApps = yield* SafeAppsService;\n const txManager = yield* TxManager;\n\n return WriteExecutionAdapter.of({\n canHandle: (params) =>\n safeApps.getInfo().pipe(\n Effect.map((info) => (params.chainId == null ? true : info.chainId === params.chainId)),\n Effect.catchAll(() => Effect.succeed(false))\n ),\n writeAndTrack: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(\n params: WriteAndTrackParams<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const encodedData = yield* Effect.try({\n catch: (cause) =>\n new TxFailedError({\n cause,\n hash: \"unknown\",\n message: \"Failed to encode Safe transaction calldata\",\n }),\n try: () =>\n encodeFunctionData({\n abi: params.abi as Abi,\n args: params.args as readonly unknown[] | undefined,\n functionName: params.functionName as string,\n }),\n }).pipe(Effect.either);\n\n if (encodedData._tag === \"Left\") {\n const stateRef = yield* SubscriptionRef.make<TxState>(\n toFailedState(\"unknown\", encodedData.left.message)\n );\n\n return {\n actions: {\n cancel: () => Effect.fail(encodedData.left),\n speedup: () => Effect.fail(encodedData.left),\n },\n stateRef,\n terminal: Effect.fail(encodedData.left),\n } satisfies WriteAndTrackExecution<TAbi>;\n }\n\n const safeTx = {\n data: encodedData.right,\n to: params.address,\n value: params.value ?? 0n,\n };\n\n const safeExecution = yield* safeWriteAndTrack({\n chainId: params.chainId,\n transactions: [safeTx],\n }).pipe(\n Effect.provideService(SafeAppsService, safeApps),\n Effect.provideService(TxManager, txManager)\n );\n\n const stateRef = yield* SubscriptionRef.make<TxState>(initialTxState);\n\n yield* Effect.forkScoped(\n Stream.runForEach(safeExecution.stateRef.changes, (safeState) =>\n SubscriptionRef.set(stateRef, mapSafeStateToTxState(safeState))\n )\n );\n\n const terminal: Effect.Effect<\n WriteAndTrackTerminal<TAbi>,\n TxFailedError\n > = safeExecution.result.pipe(\n Effect.mapError(toTxFailedSafeError),\n Effect.flatMap(\n (safeTerminal): Effect.Effect<WriteAndTrackTerminal<TAbi>, TxFailedError> => {\n switch (safeTerminal._tag) {\n case \"success\":\n return Effect.succeed({\n _tag: \"success\",\n events: [],\n hash: safeTerminal.onchainHash,\n receipt: safeTerminal.receipt,\n } satisfies WriteAndTrackTerminal<TAbi>);\n case \"queued\":\n return Effect.succeed({\n _tag: \"queued\",\n details: {\n confirmations: safeTerminal.confirmations,\n confirmationsRequired: safeTerminal.confirmationsRequired,\n lastStatus: safeTerminal.lastStatus,\n },\n reason: \"awaiting-safe-confirmations\",\n reference: safeTerminal.safeTxHash,\n } satisfies WriteAndTrackTerminal<TAbi>);\n case \"cancelled\":\n return Effect.succeed({\n _tag: \"cancelled\",\n reason: \"safe-cancelled\",\n reference: safeTerminal.safeTxHash,\n } satisfies WriteAndTrackTerminal<TAbi>);\n case \"failed\":\n return Effect.fail(\n new TxFailedError({\n hash: safeTerminal.safeTxHash,\n message: safeTerminal.error,\n })\n );\n default:\n return Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Unexpected Safe terminal state\",\n })\n );\n }\n }\n )\n );\n\n return {\n actions: {\n cancel: () =>\n Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Cancel is not supported for Safe multisig execution\",\n })\n ),\n speedup: () =>\n Effect.fail(\n new TxFailedError({\n hash: \"unknown\",\n message: \"Speedup is not supported for Safe multisig execution\",\n })\n ),\n },\n stateRef,\n terminal,\n } satisfies WriteAndTrackExecution<TAbi>;\n }),\n });\n })\n);\n"]}
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"type": "module",
|
|
8
8
|
"types": "./dist/index.d.ts",
|
|
9
|
-
"version": "
|
|
9
|
+
"version": "3.0.0",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "just build",
|
|
12
12
|
"prepack": "bun install --frozen-lockfile && just build"
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
],
|
|
76
76
|
"peerDependencies": {
|
|
77
77
|
"@effect/platform": "catalog:peers",
|
|
78
|
-
"@prb/effect-evm": "^
|
|
78
|
+
"@prb/effect-evm": "^2.0.0",
|
|
79
79
|
"@safe-global/safe-apps-sdk": "catalog:peers",
|
|
80
80
|
"@wagmi/core": "catalog:peers",
|
|
81
81
|
"effect": "catalog:peers",
|