@bananapus/nana-sdk-core 3.5.2 → 4.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.
Files changed (292) hide show
  1. package/bin/wallet-check.mjs +489 -0
  2. package/dist/cjs/actions/suckerPairs.d.ts +5 -3
  3. package/dist/cjs/actions/suckerPairs.d.ts.map +1 -1
  4. package/dist/cjs/actions/suckerPairs.js +6 -26
  5. package/dist/cjs/actions/suckerPairs.js.map +1 -1
  6. package/dist/cjs/pause.d.ts +2 -0
  7. package/dist/cjs/pause.d.ts.map +1 -1
  8. package/dist/cjs/pause.js +17 -0
  9. package/dist/cjs/pause.js.map +1 -1
  10. package/dist/cjs/review/confirm.d.ts +52 -0
  11. package/dist/cjs/review/confirm.d.ts.map +1 -0
  12. package/dist/cjs/review/confirm.js +88 -0
  13. package/dist/cjs/review/confirm.js.map +1 -0
  14. package/dist/cjs/review/contractWrite.d.ts +5 -3
  15. package/dist/cjs/review/contractWrite.d.ts.map +1 -1
  16. package/dist/cjs/review/contractWrite.js +8 -7
  17. package/dist/cjs/review/contractWrite.js.map +1 -1
  18. package/dist/cjs/review/decode.d.ts +19 -1
  19. package/dist/cjs/review/decode.d.ts.map +1 -1
  20. package/dist/cjs/review/decode.js +30 -11
  21. package/dist/cjs/review/decode.js.map +1 -1
  22. package/dist/cjs/review/decodeCall.d.ts +21 -0
  23. package/dist/cjs/review/decodeCall.d.ts.map +1 -0
  24. package/dist/cjs/review/decodeCall.js +183 -0
  25. package/dist/cjs/review/decodeCall.js.map +1 -0
  26. package/dist/cjs/review/heldWrite.d.ts.map +1 -1
  27. package/dist/cjs/review/heldWrite.js +5 -4
  28. package/dist/cjs/review/heldWrite.js.map +1 -1
  29. package/dist/cjs/review/index.d.ts +11 -0
  30. package/dist/cjs/review/index.d.ts.map +1 -1
  31. package/dist/cjs/review/index.js +24 -0
  32. package/dist/cjs/review/index.js.map +1 -1
  33. package/dist/cjs/review/intents.d.ts +10 -0
  34. package/dist/cjs/review/intents.d.ts.map +1 -1
  35. package/dist/cjs/review/intents.js +13 -0
  36. package/dist/cjs/review/intents.js.map +1 -1
  37. package/dist/cjs/review/lineError.d.ts +34 -0
  38. package/dist/cjs/review/lineError.d.ts.map +1 -0
  39. package/dist/cjs/review/lineError.js +42 -0
  40. package/dist/cjs/review/lineError.js.map +1 -0
  41. package/dist/cjs/review/messages.d.ts +15 -3
  42. package/dist/cjs/review/messages.d.ts.map +1 -1
  43. package/dist/cjs/review/messages.js +16 -4
  44. package/dist/cjs/review/messages.js.map +1 -1
  45. package/dist/cjs/review/model.d.ts +149 -0
  46. package/dist/cjs/review/model.d.ts.map +1 -0
  47. package/dist/cjs/review/model.js +750 -0
  48. package/dist/cjs/review/model.js.map +1 -0
  49. package/dist/cjs/review/plan.d.ts +63 -0
  50. package/dist/cjs/review/plan.d.ts.map +1 -0
  51. package/dist/cjs/review/plan.js +149 -0
  52. package/dist/cjs/review/plan.js.map +1 -0
  53. package/dist/cjs/review/react/index.d.ts +1 -0
  54. package/dist/cjs/review/react/index.d.ts.map +1 -1
  55. package/dist/cjs/review/react/index.js +1 -0
  56. package/dist/cjs/review/react/index.js.map +1 -1
  57. package/dist/cjs/review/react/useReviewedRun.d.ts +96 -0
  58. package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -0
  59. package/dist/cjs/review/react/useReviewedRun.js +261 -0
  60. package/dist/cjs/review/react/useReviewedRun.js.map +1 -0
  61. package/dist/cjs/review/receipt.d.ts +4 -1
  62. package/dist/cjs/review/receipt.d.ts.map +1 -1
  63. package/dist/cjs/review/receipt.js +7 -3
  64. package/dist/cjs/review/receipt.js.map +1 -1
  65. package/dist/cjs/review/relayr.d.ts +13 -4
  66. package/dist/cjs/review/relayr.d.ts.map +1 -1
  67. package/dist/cjs/review/relayr.js +51 -8
  68. package/dist/cjs/review/relayr.js.map +1 -1
  69. package/dist/cjs/review/relayrSend.d.ts +135 -0
  70. package/dist/cjs/review/relayrSend.d.ts.map +1 -0
  71. package/dist/cjs/review/relayrSend.js +943 -0
  72. package/dist/cjs/review/relayrSend.js.map +1 -0
  73. package/dist/cjs/review/reviewQueue.d.ts +10 -9
  74. package/dist/cjs/review/reviewQueue.d.ts.map +1 -1
  75. package/dist/cjs/review/reviewQueue.js +19 -29
  76. package/dist/cjs/review/reviewQueue.js.map +1 -1
  77. package/dist/cjs/review/reviewRequests.d.ts +86 -0
  78. package/dist/cjs/review/reviewRequests.d.ts.map +1 -0
  79. package/dist/cjs/review/reviewRequests.js +266 -0
  80. package/dist/cjs/review/reviewRequests.js.map +1 -0
  81. package/dist/cjs/review/safeRelayr.d.ts +3 -1
  82. package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
  83. package/dist/cjs/review/safeRelayr.js +5 -1
  84. package/dist/cjs/review/safeRelayr.js.map +1 -1
  85. package/dist/cjs/review/safeSend.d.ts +69 -0
  86. package/dist/cjs/review/safeSend.d.ts.map +1 -0
  87. package/dist/cjs/review/safeSend.js +308 -0
  88. package/dist/cjs/review/safeSend.js.map +1 -0
  89. package/dist/cjs/review/send.d.ts +241 -0
  90. package/dist/cjs/review/send.d.ts.map +1 -0
  91. package/dist/cjs/review/send.js +1017 -0
  92. package/dist/cjs/review/send.js.map +1 -0
  93. package/dist/cjs/review/sequence.d.ts +77 -0
  94. package/dist/cjs/review/sequence.d.ts.map +1 -0
  95. package/dist/cjs/review/sequence.js +232 -0
  96. package/dist/cjs/review/sequence.js.map +1 -0
  97. package/dist/cjs/review/sign.d.ts +109 -0
  98. package/dist/cjs/review/sign.d.ts.map +1 -0
  99. package/dist/cjs/review/sign.js +374 -0
  100. package/dist/cjs/review/sign.js.map +1 -0
  101. package/dist/cjs/review/simulation.d.ts +41 -2
  102. package/dist/cjs/review/simulation.d.ts.map +1 -1
  103. package/dist/cjs/review/simulation.js +99 -29
  104. package/dist/cjs/review/simulation.js.map +1 -1
  105. package/dist/cjs/review/transaction-message.d.ts +13 -0
  106. package/dist/cjs/review/transaction-message.d.ts.map +1 -1
  107. package/dist/cjs/review/transaction-message.js +25 -0
  108. package/dist/cjs/review/transaction-message.js.map +1 -1
  109. package/dist/cjs/review/transactionReview.d.ts +27 -19
  110. package/dist/cjs/review/transactionReview.d.ts.map +1 -1
  111. package/dist/cjs/review/transactionReview.js +22 -63
  112. package/dist/cjs/review/transactionReview.js.map +1 -1
  113. package/dist/cjs/review/wallet.d.ts +82 -0
  114. package/dist/cjs/review/wallet.d.ts.map +1 -0
  115. package/dist/cjs/review/wallet.js +157 -0
  116. package/dist/cjs/review/wallet.js.map +1 -0
  117. package/dist/cjs/review/writeHold.d.ts +100 -12
  118. package/dist/cjs/review/writeHold.d.ts.map +1 -1
  119. package/dist/cjs/review/writeHold.js +61 -13
  120. package/dist/cjs/review/writeHold.js.map +1 -1
  121. package/dist/cjs/review/writeRecovery.d.ts +6 -1
  122. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  123. package/dist/cjs/review/writeRecovery.js +108 -40
  124. package/dist/cjs/review/writeRecovery.js.map +1 -1
  125. package/dist/cjs/safeService.d.ts +27 -4
  126. package/dist/cjs/safeService.d.ts.map +1 -1
  127. package/dist/cjs/safeService.js +120 -3
  128. package/dist/cjs/safeService.js.map +1 -1
  129. package/dist/cjs/testing.d.ts +24 -0
  130. package/dist/cjs/testing.d.ts.map +1 -1
  131. package/dist/cjs/testing.js +26 -1
  132. package/dist/cjs/testing.js.map +1 -1
  133. package/dist/cjs/v6/defifa.d.ts.map +1 -1
  134. package/dist/cjs/v6/defifa.js +24 -23
  135. package/dist/cjs/v6/defifa.js.map +1 -1
  136. package/dist/cjs/v6/executionErrors.d.ts.map +1 -1
  137. package/dist/cjs/v6/executionErrors.js +3 -2
  138. package/dist/cjs/v6/executionErrors.js.map +1 -1
  139. package/dist/cjs/v6/pay.d.ts +25 -8
  140. package/dist/cjs/v6/pay.d.ts.map +1 -1
  141. package/dist/cjs/v6/pay.js +117 -23
  142. package/dist/cjs/v6/pay.js.map +1 -1
  143. package/dist/cjs/v6/suckers.d.ts +30 -0
  144. package/dist/cjs/v6/suckers.d.ts.map +1 -1
  145. package/dist/cjs/v6/suckers.js +69 -5
  146. package/dist/cjs/v6/suckers.js.map +1 -1
  147. package/dist/esm/actions/suckerPairs.d.ts +5 -3
  148. package/dist/esm/actions/suckerPairs.d.ts.map +1 -1
  149. package/dist/esm/actions/suckerPairs.js +7 -27
  150. package/dist/esm/actions/suckerPairs.js.map +1 -1
  151. package/dist/esm/pause.d.ts +2 -0
  152. package/dist/esm/pause.d.ts.map +1 -1
  153. package/dist/esm/pause.js +16 -0
  154. package/dist/esm/pause.js.map +1 -1
  155. package/dist/esm/review/confirm.d.ts +52 -0
  156. package/dist/esm/review/confirm.d.ts.map +1 -0
  157. package/dist/esm/review/confirm.js +83 -0
  158. package/dist/esm/review/confirm.js.map +1 -0
  159. package/dist/esm/review/contractWrite.d.ts +5 -3
  160. package/dist/esm/review/contractWrite.d.ts.map +1 -1
  161. package/dist/esm/review/contractWrite.js +8 -7
  162. package/dist/esm/review/contractWrite.js.map +1 -1
  163. package/dist/esm/review/decode.d.ts +19 -1
  164. package/dist/esm/review/decode.d.ts.map +1 -1
  165. package/dist/esm/review/decode.js +29 -14
  166. package/dist/esm/review/decode.js.map +1 -1
  167. package/dist/esm/review/decodeCall.d.ts +21 -0
  168. package/dist/esm/review/decodeCall.d.ts.map +1 -0
  169. package/dist/esm/review/decodeCall.js +180 -0
  170. package/dist/esm/review/decodeCall.js.map +1 -0
  171. package/dist/esm/review/heldWrite.d.ts.map +1 -1
  172. package/dist/esm/review/heldWrite.js +5 -4
  173. package/dist/esm/review/heldWrite.js.map +1 -1
  174. package/dist/esm/review/index.d.ts +11 -0
  175. package/dist/esm/review/index.d.ts.map +1 -1
  176. package/dist/esm/review/index.js +11 -0
  177. package/dist/esm/review/index.js.map +1 -1
  178. package/dist/esm/review/intents.d.ts +10 -0
  179. package/dist/esm/review/intents.d.ts.map +1 -1
  180. package/dist/esm/review/intents.js +12 -0
  181. package/dist/esm/review/intents.js.map +1 -1
  182. package/dist/esm/review/lineError.d.ts +34 -0
  183. package/dist/esm/review/lineError.d.ts.map +1 -0
  184. package/dist/esm/review/lineError.js +36 -0
  185. package/dist/esm/review/lineError.js.map +1 -0
  186. package/dist/esm/review/messages.d.ts +15 -3
  187. package/dist/esm/review/messages.d.ts.map +1 -1
  188. package/dist/esm/review/messages.js +15 -3
  189. package/dist/esm/review/messages.js.map +1 -1
  190. package/dist/esm/review/model.d.ts +149 -0
  191. package/dist/esm/review/model.d.ts.map +1 -0
  192. package/dist/esm/review/model.js +746 -0
  193. package/dist/esm/review/model.js.map +1 -0
  194. package/dist/esm/review/plan.d.ts +63 -0
  195. package/dist/esm/review/plan.d.ts.map +1 -0
  196. package/dist/esm/review/plan.js +141 -0
  197. package/dist/esm/review/plan.js.map +1 -0
  198. package/dist/esm/review/react/index.d.ts +1 -0
  199. package/dist/esm/review/react/index.d.ts.map +1 -1
  200. package/dist/esm/review/react/index.js +1 -0
  201. package/dist/esm/review/react/index.js.map +1 -1
  202. package/dist/esm/review/react/useReviewedRun.d.ts +96 -0
  203. package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -0
  204. package/dist/esm/review/react/useReviewedRun.js +257 -0
  205. package/dist/esm/review/react/useReviewedRun.js.map +1 -0
  206. package/dist/esm/review/receipt.d.ts +4 -1
  207. package/dist/esm/review/receipt.d.ts.map +1 -1
  208. package/dist/esm/review/receipt.js +6 -2
  209. package/dist/esm/review/receipt.js.map +1 -1
  210. package/dist/esm/review/relayr.d.ts +13 -4
  211. package/dist/esm/review/relayr.d.ts.map +1 -1
  212. package/dist/esm/review/relayr.js +50 -8
  213. package/dist/esm/review/relayr.js.map +1 -1
  214. package/dist/esm/review/relayrSend.d.ts +135 -0
  215. package/dist/esm/review/relayrSend.d.ts.map +1 -0
  216. package/dist/esm/review/relayrSend.js +934 -0
  217. package/dist/esm/review/relayrSend.js.map +1 -0
  218. package/dist/esm/review/reviewQueue.d.ts +10 -9
  219. package/dist/esm/review/reviewQueue.d.ts.map +1 -1
  220. package/dist/esm/review/reviewQueue.js +17 -26
  221. package/dist/esm/review/reviewQueue.js.map +1 -1
  222. package/dist/esm/review/reviewRequests.d.ts +86 -0
  223. package/dist/esm/review/reviewRequests.d.ts.map +1 -0
  224. package/dist/esm/review/reviewRequests.js +263 -0
  225. package/dist/esm/review/reviewRequests.js.map +1 -0
  226. package/dist/esm/review/safeRelayr.d.ts +3 -1
  227. package/dist/esm/review/safeRelayr.d.ts.map +1 -1
  228. package/dist/esm/review/safeRelayr.js +5 -1
  229. package/dist/esm/review/safeRelayr.js.map +1 -1
  230. package/dist/esm/review/safeSend.d.ts +69 -0
  231. package/dist/esm/review/safeSend.d.ts.map +1 -0
  232. package/dist/esm/review/safeSend.js +303 -0
  233. package/dist/esm/review/safeSend.js.map +1 -0
  234. package/dist/esm/review/send.d.ts +241 -0
  235. package/dist/esm/review/send.d.ts.map +1 -0
  236. package/dist/esm/review/send.js +1011 -0
  237. package/dist/esm/review/send.js.map +1 -0
  238. package/dist/esm/review/sequence.d.ts +77 -0
  239. package/dist/esm/review/sequence.d.ts.map +1 -0
  240. package/dist/esm/review/sequence.js +223 -0
  241. package/dist/esm/review/sequence.js.map +1 -0
  242. package/dist/esm/review/sign.d.ts +109 -0
  243. package/dist/esm/review/sign.d.ts.map +1 -0
  244. package/dist/esm/review/sign.js +368 -0
  245. package/dist/esm/review/sign.js.map +1 -0
  246. package/dist/esm/review/simulation.d.ts +41 -2
  247. package/dist/esm/review/simulation.d.ts.map +1 -1
  248. package/dist/esm/review/simulation.js +95 -29
  249. package/dist/esm/review/simulation.js.map +1 -1
  250. package/dist/esm/review/transaction-message.d.ts +13 -0
  251. package/dist/esm/review/transaction-message.d.ts.map +1 -1
  252. package/dist/esm/review/transaction-message.js +23 -0
  253. package/dist/esm/review/transaction-message.js.map +1 -1
  254. package/dist/esm/review/transactionReview.d.ts +27 -19
  255. package/dist/esm/review/transactionReview.d.ts.map +1 -1
  256. package/dist/esm/review/transactionReview.js +19 -56
  257. package/dist/esm/review/transactionReview.js.map +1 -1
  258. package/dist/esm/review/wallet.d.ts +82 -0
  259. package/dist/esm/review/wallet.d.ts.map +1 -0
  260. package/dist/esm/review/wallet.js +150 -0
  261. package/dist/esm/review/wallet.js.map +1 -0
  262. package/dist/esm/review/writeHold.d.ts +100 -12
  263. package/dist/esm/review/writeHold.d.ts.map +1 -1
  264. package/dist/esm/review/writeHold.js +59 -13
  265. package/dist/esm/review/writeHold.js.map +1 -1
  266. package/dist/esm/review/writeRecovery.d.ts +6 -1
  267. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  268. package/dist/esm/review/writeRecovery.js +111 -43
  269. package/dist/esm/review/writeRecovery.js.map +1 -1
  270. package/dist/esm/safeService.d.ts +27 -4
  271. package/dist/esm/safeService.d.ts.map +1 -1
  272. package/dist/esm/safeService.js +119 -4
  273. package/dist/esm/safeService.js.map +1 -1
  274. package/dist/esm/testing.d.ts +24 -0
  275. package/dist/esm/testing.d.ts.map +1 -1
  276. package/dist/esm/testing.js +23 -1
  277. package/dist/esm/testing.js.map +1 -1
  278. package/dist/esm/v6/defifa.d.ts.map +1 -1
  279. package/dist/esm/v6/defifa.js +24 -23
  280. package/dist/esm/v6/defifa.js.map +1 -1
  281. package/dist/esm/v6/executionErrors.d.ts.map +1 -1
  282. package/dist/esm/v6/executionErrors.js +3 -2
  283. package/dist/esm/v6/executionErrors.js.map +1 -1
  284. package/dist/esm/v6/pay.d.ts +25 -8
  285. package/dist/esm/v6/pay.d.ts.map +1 -1
  286. package/dist/esm/v6/pay.js +115 -22
  287. package/dist/esm/v6/pay.js.map +1 -1
  288. package/dist/esm/v6/suckers.d.ts +30 -0
  289. package/dist/esm/v6/suckers.d.ts.map +1 -1
  290. package/dist/esm/v6/suckers.js +67 -5
  291. package/dist/esm/v6/suckers.js.map +1 -1
  292. package/package.json +11 -2
@@ -16,6 +16,7 @@ exports.heldSafeProposal = heldSafeProposal;
16
16
  exports.safeProposalIsHeldCall = safeProposalIsHeldCall;
17
17
  exports.verifyReviewedWriteReceipt = verifyReviewedWriteReceipt;
18
18
  exports.verifyReviewedWriteExpiry = verifyReviewedWriteExpiry;
19
+ const lineError_js_1 = require("./lineError.js");
19
20
  const viem_1 = require("viem");
20
21
  const safeService_js_1 = require("../safeService.js");
21
22
  const safe_js_1 = require("../safe.js");
@@ -29,7 +30,7 @@ const TAB_SEEN = tabState_js_1.TAB.seen;
29
30
  // failed. It is visible only while the exact durable reservation still exists.
30
31
  const unpersistedSubmissions = new WeakMap();
31
32
  /** The wallet returned this identity, but storing it failed. Keep it in memory and retry submitted(hash, record). */
32
- class SubmittedWritePersistenceError extends Error {
33
+ class SubmittedWritePersistenceError extends lineError_js_1.ReviewLineError {
33
34
  constructor(record, cause) {
34
35
  super("The wallet returned a transaction identity, but recovery storage is unavailable. Keep this transaction pending.");
35
36
  this.name = "SubmittedWritePersistenceError";
@@ -42,7 +43,7 @@ function normalizedIdentity(input) {
42
43
  if (!Number.isSafeInteger(input?.chainId) ||
43
44
  input.chainId <= 0 ||
44
45
  !(0, viem_1.isAddress)(input?.account, { strict: false }))
45
- throw new Error("Invalid reviewed write recovery evidence.");
46
+ throw new lineError_js_1.ReviewLineError("Invalid reviewed write recovery evidence.");
46
47
  return {
47
48
  chainId: input.chainId,
48
49
  account: input.account.toLowerCase(),
@@ -55,7 +56,7 @@ function normalized(input) {
55
56
  !(0, viem_1.isAddress)(input?.call?.to, { strict: false }) ||
56
57
  !(0, untrusted_js_1.isHexBytes)(input?.call?.data) ||
57
58
  value === null)
58
- throw new Error("Invalid reviewed write recovery evidence.");
59
+ throw new lineError_js_1.ReviewLineError("Invalid reviewed write recovery evidence.");
59
60
  return {
60
61
  ...normalizedIdentity(input),
61
62
  safe: input.safe,
@@ -99,7 +100,7 @@ function recordOf(value) {
99
100
  (record.executed !== undefined && record.executed !== true) ||
100
101
  (record.executionHash !== undefined &&
101
102
  (record.executed !== true || !(0, untrusted_js_1.isBytes32)(record.executionHash))))
102
- throw new Error("Invalid saved write recovery record. Keep this action pending.");
103
+ throw new lineError_js_1.ReviewLineError("Invalid saved write recovery record. Keep this action pending.");
103
104
  return {
104
105
  version: 1,
105
106
  id: record.id,
@@ -174,7 +175,7 @@ function namespaceOf(value) {
174
175
  return undefined;
175
176
  if (typeof value !== "string" ||
176
177
  !/^[a-z0-9][a-z0-9:._/-]{0,127}$/.test(value))
177
- throw new Error("Invalid write recovery namespace.");
178
+ throw new lineError_js_1.ReviewLineError("Invalid write recovery namespace.");
178
179
  return value;
179
180
  }
180
181
  function namespaceScope(input) {
@@ -188,7 +189,7 @@ function scope(input) {
188
189
  function recoveryStorage(store) {
189
190
  const result = store ?? globalThis.localStorage;
190
191
  if (!result)
191
- throw new Error("Write recovery storage is unavailable.");
192
+ throw new lineError_js_1.ReviewLineError("Write recovery storage is unavailable.");
192
193
  return result;
193
194
  }
194
195
  /** Every key `store` holds: its own `keys()`, or Web Storage's `length` and `key()`. */
@@ -380,7 +381,7 @@ function findReviewedWrites(input, options = {}) {
380
381
  const identity = normalizedIdentity(input);
381
382
  if (!(0, viem_1.isAddress)(input.to, { strict: false }) ||
382
383
  !/^0x[0-9a-fA-F]{8}$/.test(input.selector))
383
- throw new Error("Invalid write hold match.");
384
+ throw new lineError_js_1.ReviewLineError("Invalid write hold match.");
384
385
  const to = input.to.toLowerCase();
385
386
  const selector = input.selector.toLowerCase();
386
387
  const store = recoveryStorage(options.storage);
@@ -418,7 +419,7 @@ function foundAt(input, at) {
418
419
  (at.startsWith(prefix) &&
419
420
  /^\d+:0x[0-9a-f]{64}$/.test(at.slice(prefix.length)))))
420
421
  return at;
421
- throw new Error("Invalid write recovery key.");
422
+ throw new lineError_js_1.ReviewLineError("Invalid write recovery key.");
422
423
  }
423
424
  /**
424
425
  * Every unresolved write saved for `account` on `chainId`, with the key it
@@ -466,7 +467,7 @@ function readBrowserWriteRecovery(input, options = {}) {
466
467
  const identity = normalizedIdentity(input);
467
468
  const namespace = namespaceOf(input?.namespace);
468
469
  if (namespace === undefined)
469
- throw new Error("Provide a write recovery namespace.");
470
+ throw new lineError_js_1.ReviewLineError("Provide a write recovery namespace.");
470
471
  return readRecovery(recoveryStorage(options.storage), namespaceScope({ ...identity, namespace }));
471
472
  }
472
473
  /**
@@ -477,12 +478,20 @@ function readBrowserWriteRecovery(input, options = {}) {
477
478
  function releasedKey(key, id) {
478
479
  return `${key}:released:${id}`;
479
480
  }
481
+ /**
482
+ * The key that marks the record `id` saved at `key` as ended by the user's
483
+ * exit or as never sent, never by a settlement's cleanup: only it lets a
484
+ * saved sequence send that step again.
485
+ */
486
+ function exitedKey(key, id) {
487
+ return `${key}:exited:${id}`;
488
+ }
480
489
  function readStored(raw, key, scopeOf = scope, store) {
481
490
  if (raw === null)
482
491
  return null;
483
492
  const record = recordOf(JSON.parse(raw));
484
493
  if (scopeOf(record) !== key)
485
- throw new Error("Saved write recovery scope does not match.");
494
+ throw new lineError_js_1.ReviewLineError("Saved write recovery scope does not match.");
486
495
  if (store && store.getItem(releasedKey(key, record.id)) !== null)
487
496
  return null;
488
497
  return record;
@@ -707,7 +716,7 @@ function createBrowserWriteRecovery(input, options = {}) {
707
716
  }
708
717
  function requireLock() {
709
718
  if (!locked)
710
- throw new Error("Write recovery changes require the browser lock.");
719
+ throw new lineError_js_1.ReviewLineError("Write recovery changes require the browser lock.");
711
720
  }
712
721
  function read() {
713
722
  const store = storage();
@@ -719,7 +728,7 @@ function createBrowserWriteRecovery(input, options = {}) {
719
728
  const store = storage();
720
729
  store.setItem(at, raw);
721
730
  if (store.getItem(at) !== raw)
722
- throw new Error("Write recovery storage did not retain the action.");
731
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not retain the action.");
723
732
  }
724
733
  function clear(expected) {
725
734
  requireLock();
@@ -735,7 +744,7 @@ function createBrowserWriteRecovery(input, options = {}) {
735
744
  if (!current)
736
745
  return;
737
746
  if (JSON.stringify(current) !== JSON.stringify(recordOf(expected))) {
738
- throw new Error("Write recovery changed. Keep the current action pending.");
747
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
739
748
  }
740
749
  // The last record of an attempt goes only once its generation is the
741
750
  // committed latest marker; otherwise it stays, released, and carries it.
@@ -743,13 +752,13 @@ function createBrowserWriteRecovery(input, options = {}) {
743
752
  const marker = releasedKey(at, current.id);
744
753
  store.setItem(marker, "1");
745
754
  if (store.getItem(marker) !== "1")
746
- throw new Error("Write recovery storage did not clear the action.");
755
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
747
756
  unpersistedSubmissions.get(store)?.delete(at);
748
757
  return;
749
758
  }
750
759
  store.removeItem(at);
751
760
  if (store.getItem(at) !== null)
752
- throw new Error("Write recovery storage did not clear the action.");
761
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
753
762
  unpersistedSubmissions.get(store)?.delete(at);
754
763
  }
755
764
  /** Add `fields` to exactly `expected`, a hashed record `when` allows; extra evidence only. */
@@ -777,6 +786,12 @@ function createBrowserWriteRecovery(input, options = {}) {
777
786
  const current = read();
778
787
  if (current?.id === owned.id && current.hash)
779
788
  return;
789
+ try {
790
+ storage().setItem(exitedKey(locate(storage()).at, owned.id), "1");
791
+ }
792
+ catch {
793
+ /* Unsaved, a sequence resumed over it asks for the user's check. */
794
+ }
780
795
  // Removing the record must not uncover a settlement of an earlier
781
796
  // attempt: unless this reservation is the verified latest, it stays as
782
797
  // released instead, which still invalidates that settlement.
@@ -832,13 +847,13 @@ function createBrowserWriteRecovery(input, options = {}) {
832
847
  function record(hash, expected, replace) {
833
848
  requireLock();
834
849
  if (!(0, untrusted_js_1.isBytes32)(hash))
835
- throw new Error("The wallet returned an invalid transaction identity.");
850
+ throw new lineError_js_1.ReviewLineError("The wallet returned an invalid transaction identity.");
836
851
  const previous = expected && recordOf(expected);
837
852
  const submittedHash = hash.toLowerCase();
838
853
  if (!previous ||
839
854
  keyOf(previous) !== key ||
840
855
  (!replace && previous.hash && previous.hash !== submittedHash)) {
841
- throw new Error("Write recovery changed before submission was recorded.");
856
+ throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
842
857
  }
843
858
  // A hash the wallet returns now starts its clock; a speed-up found at its nonce keeps it.
844
859
  const submittedAt = replace || previous.hash === submittedHash
@@ -875,7 +890,7 @@ function createBrowserWriteRecovery(input, options = {}) {
875
890
  submittedAt: undefined,
876
891
  }) ||
877
892
  (!replace && current.hash && current.hash !== submittedHash)) {
878
- throw new Error("Write recovery changed before submission was recorded.");
893
+ throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
879
894
  }
880
895
  owned = recordOf(submitted);
881
896
  if (current.hash !== submittedHash) {
@@ -909,15 +924,15 @@ function createBrowserWriteRecovery(input, options = {}) {
909
924
  ? normalized({ ...reviewed, call: actualCall })
910
925
  : reviewed;
911
926
  if (legacyScope(actual) !== legacyScope(reviewed))
912
- throw new Error("The adopted write has a different recovery scope.");
927
+ throw new lineError_js_1.ReviewLineError("The adopted write has a different recovery scope.");
913
928
  const nonce = evidence && (0, untrusted_js_1.uint256)(evidence.nonce);
914
929
  const fromBlock = evidence && (0, untrusted_js_1.uint256)(evidence.blockNumber);
915
930
  if (evidence && (nonce === null || fromBlock === null))
916
- throw new Error("Invalid write recovery nonce evidence.");
931
+ throw new lineError_js_1.ReviewLineError("Invalid write recovery nonce evidence.");
917
932
  const store = storage();
918
933
  const { at, raw } = locate(store);
919
934
  if (readRecovery(store, at, raw, scopeAt(at)))
920
- throw new Error("An earlier wallet write is still unresolved. Check it before trying again.");
935
+ throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
921
936
  // The record this one replaces, if the user released it: its marker goes too.
922
937
  let replaced;
923
938
  try {
@@ -956,6 +971,7 @@ function createBrowserWriteRecovery(input, options = {}) {
956
971
  if (typeof replaced === "string" && replaced !== record.id)
957
972
  try {
958
973
  store.removeItem(releasedKey(key, replaced));
974
+ store.removeItem(exitedKey(key, replaced));
959
975
  }
960
976
  catch {
961
977
  /* A leftover marker names only the old record. */
@@ -988,7 +1004,7 @@ function createBrowserWriteRecovery(input, options = {}) {
988
1004
  requireLock();
989
1005
  const current = read();
990
1006
  if (current && current.mirrorOf !== of)
991
- throw new Error("An earlier wallet write is still unresolved. Check it before trying again.");
1007
+ throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
992
1008
  const mirrored = recordOf({
993
1009
  version: 1,
994
1010
  id: source.id,
@@ -1028,6 +1044,16 @@ function createBrowserWriteRecovery(input, options = {}) {
1028
1044
  return undefined;
1029
1045
  }
1030
1046
  },
1047
+ /** Whether the record `id` ended by the user's exit, or because nothing was sent. */
1048
+ released(id) {
1049
+ try {
1050
+ const store = storage();
1051
+ return store.getItem(exitedKey(locate(store).at, id)) !== null;
1052
+ }
1053
+ catch {
1054
+ return false;
1055
+ }
1056
+ },
1031
1057
  /**
1032
1058
  * The call's latest reservation id: the record saved at the key (held,
1033
1059
  * or released by its exit), or else the saved latest marker.
@@ -1288,7 +1314,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1288
1314
  executed(expected, executionHash) {
1289
1315
  requireLock();
1290
1316
  if (executionHash !== undefined && !(0, untrusted_js_1.isBytes32)(executionHash))
1291
- throw new Error("Invalid execution transaction identity.");
1317
+ throw new lineError_js_1.ReviewLineError("Invalid execution transaction identity.");
1292
1318
  const store = storage();
1293
1319
  const { at, raw } = locate(store);
1294
1320
  const current = readRecovery(store, at, raw, scopeAt(at));
@@ -1296,7 +1322,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1296
1322
  if (!current?.hash ||
1297
1323
  current.id !== wanted.id ||
1298
1324
  current.hash !== wanted.hash)
1299
- throw new Error("Write recovery changed. Keep the current action pending.");
1325
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
1300
1326
  const next = recordOf({
1301
1327
  ...current,
1302
1328
  executed: true,
@@ -1335,7 +1361,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1335
1361
  */
1336
1362
  abandon(expected, acknowledgement) {
1337
1363
  if (acknowledgement?.checkedWallet !== true)
1338
- throw new Error("Release a held write only after the user confirms they checked their wallet.");
1364
+ throw new lineError_js_1.ReviewLineError("Release a held write only after the user confirms they checked their wallet.");
1339
1365
  const wanted = JSON.stringify(recordOf(expected));
1340
1366
  const store = storage();
1341
1367
  const { at, raw } = locate(store);
@@ -1343,15 +1369,21 @@ function createBrowserWriteRecovery(input, options = {}) {
1343
1369
  if (!durable)
1344
1370
  return;
1345
1371
  if (durable.executed)
1346
- throw new Error("This write ran onchain. Keep it held until its result is known.");
1372
+ throw new lineError_js_1.ReviewLineError("This write ran onchain. Keep it held until its result is known.");
1347
1373
  const shown = readRecovery(store, at, raw, scopeAt(at));
1348
1374
  if (JSON.stringify(durable) !== wanted &&
1349
1375
  JSON.stringify(shown) !== wanted)
1350
- throw new Error("Write recovery changed. Keep the current action pending.");
1376
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
1351
1377
  const marker = releasedKey(at, durable.id);
1378
+ try {
1379
+ store.setItem(exitedKey(at, durable.id), "1");
1380
+ }
1381
+ catch {
1382
+ /* Unsaved, a sequence resumed over it asks for the user's check. */
1383
+ }
1352
1384
  store.setItem(marker, "1");
1353
1385
  if (store.getItem(marker) !== "1")
1354
- throw new Error("Write recovery storage did not release the action.");
1386
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not release the action.");
1355
1387
  const memory = unpersistedSubmissions.get(store);
1356
1388
  if (memory?.get(at)?.id === durable.id)
1357
1389
  memory.delete(at);
@@ -1362,7 +1394,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1362
1394
  const locks = options.locks ?? browserLocks();
1363
1395
  return locks.request(key, { mode: "exclusive", ...(!wait && { ifAvailable: true }) }, async (lock) => {
1364
1396
  if (!lock)
1365
- throw new Error("This wallet action is already open in another tab.");
1397
+ throw new lineError_js_1.ReviewLineError("This wallet action is already open in another tab.");
1366
1398
  locked = true;
1367
1399
  try {
1368
1400
  return await work();
@@ -1520,7 +1552,13 @@ function heldBatch(record) {
1520
1552
  : null;
1521
1553
  return inner && inner.map((call) => normalized({ ...record, call }).call);
1522
1554
  }
1523
- /** Whether `transaction` is the Safe's execTransaction of exactly the held batch: its MultiSend target, calldata, zero value and DELEGATECALL. */
1555
+ /**
1556
+ * The MultiSend targets a held batch may run through: a Safe app folds the
1557
+ * same calls into its own version's MultiSendCallOnly, so any recognized
1558
+ * deployment carries exactly the held calldata.
1559
+ */
1560
+ const BATCH_TARGETS = safe_js_1.MULTI_SEND_CALL_ONLY_DEPLOYMENTS.map((to) => to.toLowerCase());
1561
+ /** Whether `transaction` is the Safe's execTransaction of exactly the held batch: a recognized MultiSendCallOnly, its calldata, zero value and DELEGATECALL. */
1524
1562
  function runsHeldBatch(transaction, record) {
1525
1563
  try {
1526
1564
  const { functionName, args } = (0, viem_1.decodeFunctionData)({
@@ -1530,7 +1568,7 @@ function runsHeldBatch(transaction, record) {
1530
1568
  if (functionName !== "execTransaction")
1531
1569
  return false;
1532
1570
  const [to, value, data, operation] = args;
1533
- return (to.toLowerCase() === record.call.to &&
1571
+ return (BATCH_TARGETS.includes(to.toLowerCase()) &&
1534
1572
  value === 0n &&
1535
1573
  data.toLowerCase() === record.call.data &&
1536
1574
  operation === 1);
@@ -1556,13 +1594,14 @@ function heldSafeProposal(input, nonce) {
1556
1594
  */
1557
1595
  function safeProposalIsHeldCall(proposal, input) {
1558
1596
  const record = normalized(input);
1559
- return (0, safeService_js_1.safeTransactionMatchesCall)(proposal, {
1560
- ...record.call,
1561
- value: BigInt(record.call.value),
1562
- ...(heldBatch({ ...record, version: 1, id: "" })
1563
- ? { operation: 1 }
1564
- : {}),
1565
- });
1597
+ const call = { ...record.call, value: BigInt(record.call.value) };
1598
+ return heldBatch({ ...record, version: 1, id: "" })
1599
+ ? BATCH_TARGETS.some((to) => (0, safeService_js_1.safeTransactionMatchesCall)(proposal, {
1600
+ ...call,
1601
+ to: to,
1602
+ operation: 1,
1603
+ }))
1604
+ : (0, safeService_js_1.safeTransactionMatchesCall)(proposal, call);
1566
1605
  }
1567
1606
  /**
1568
1607
  * Authenticate the saved wallet identity, canonical inclusion and Safe effect.
@@ -1576,7 +1615,7 @@ function safeProposalIsHeldCall(proposal, input) {
1576
1615
  */
1577
1616
  async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { finality = true } = {}) {
1578
1617
  const record = recordOf(saved);
1579
- const pending = () => new Error("The saved wallet write is not yet proven. Keep this action pending.");
1618
+ const pending = () => new lineError_js_1.ReviewLineError("The saved wallet write is not yet proven. Keep this action pending.");
1580
1619
  // A batch hold's call is its MultiSend: its proof is the calls it encodes.
1581
1620
  const batch = heldBatch(record);
1582
1621
  let calls = batch ?? [record.call];
@@ -1663,6 +1702,35 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
1663
1702
  throw pending();
1664
1703
  status = result.status;
1665
1704
  }
1705
+ else if (status === "success" && (0, safeService_js_1.isSafeExecTransaction)(record.call.data)) {
1706
+ // A Safe's execTransaction succeeds only with the Safe's own
1707
+ // ExecutionSuccess for its exact hash: an ExecutionFailure, or no event
1708
+ // for it, is a failure whatever the receipt's status. A call that only
1709
+ // shares the selector, to anything but a Safe, is decided as any other.
1710
+ if (!client.request)
1711
+ throw pending();
1712
+ const { request } = client;
1713
+ const at = (blockNumber) => blockNumber === undefined ? "latest" : (0, viem_1.numberToHex)(blockNumber);
1714
+ // Every read through the one `request` the receipt client has.
1715
+ const identity = await (0, safe_js_1.readAuthorityIdentity)({
1716
+ request,
1717
+ getCode: ({ address, blockNumber }) => request({
1718
+ method: "eth_getCode",
1719
+ params: [address, at(blockNumber)],
1720
+ }),
1721
+ getStorageAt: ({ address, slot, blockNumber }) => request({
1722
+ method: "eth_getStorageAt",
1723
+ params: [address, slot, at(blockNumber)],
1724
+ }),
1725
+ }, record.call.to, { blockNumber: canonical.blockNumber });
1726
+ if (!identity)
1727
+ throw pending();
1728
+ if (identity.kind === "safe") {
1729
+ const execution = await (0, safeService_js_1.safeExecTransactionResult)({ request: client.request }, record.chainId, record.call.to, record.call.data, canonical);
1730
+ if (execution?.status !== "success")
1731
+ status = "failed";
1732
+ }
1733
+ }
1666
1734
  const isCanonical = async () => {
1667
1735
  const block = await client.getBlock({ blockNumber: canonical.blockNumber });
1668
1736
  return (block.number === canonical.blockNumber &&
@@ -1683,7 +1751,7 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
1683
1751
  */
1684
1752
  async function verifyReviewedWriteExpiry(client, saved, service) {
1685
1753
  const record = recordOf(saved);
1686
- const pending = () => new Error("The saved Safe proposal is not proven expired. Keep this action pending.");
1754
+ const pending = () => new lineError_js_1.ReviewLineError("The saved Safe proposal is not proven expired. Keep this action pending.");
1687
1755
  if (!record.safe ||
1688
1756
  !record.hash ||
1689
1757
  (await client.getChainId()) !== record.chainId)