@bananapus/nana-sdk-core 3.5.2 → 5.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 (304) hide show
  1. package/bin/wallet-check.mjs +495 -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 +56 -0
  11. package/dist/cjs/review/confirm.d.ts.map +1 -0
  12. package/dist/cjs/review/confirm.js +99 -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 +10 -8
  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 +4 -0
  27. package/dist/cjs/review/heldWrite.d.ts.map +1 -1
  28. package/dist/cjs/review/heldWrite.js +35 -31
  29. package/dist/cjs/review/heldWrite.js.map +1 -1
  30. package/dist/cjs/review/index.d.ts +12 -1
  31. package/dist/cjs/review/index.d.ts.map +1 -1
  32. package/dist/cjs/review/index.js +29 -1
  33. package/dist/cjs/review/index.js.map +1 -1
  34. package/dist/cjs/review/intents.d.ts +10 -0
  35. package/dist/cjs/review/intents.d.ts.map +1 -1
  36. package/dist/cjs/review/intents.js +13 -0
  37. package/dist/cjs/review/intents.js.map +1 -1
  38. package/dist/cjs/review/lineError.d.ts +72 -0
  39. package/dist/cjs/review/lineError.d.ts.map +1 -0
  40. package/dist/cjs/review/lineError.js +76 -0
  41. package/dist/cjs/review/lineError.js.map +1 -0
  42. package/dist/cjs/review/messages.d.ts +15 -3
  43. package/dist/cjs/review/messages.d.ts.map +1 -1
  44. package/dist/cjs/review/messages.js +16 -4
  45. package/dist/cjs/review/messages.js.map +1 -1
  46. package/dist/cjs/review/model.d.ts +149 -0
  47. package/dist/cjs/review/model.d.ts.map +1 -0
  48. package/dist/cjs/review/model.js +750 -0
  49. package/dist/cjs/review/model.js.map +1 -0
  50. package/dist/cjs/review/plan.d.ts +61 -0
  51. package/dist/cjs/review/plan.d.ts.map +1 -0
  52. package/dist/cjs/review/plan.js +143 -0
  53. package/dist/cjs/review/plan.js.map +1 -0
  54. package/dist/cjs/review/react/index.d.ts +1 -0
  55. package/dist/cjs/review/react/index.d.ts.map +1 -1
  56. package/dist/cjs/review/react/index.js +1 -0
  57. package/dist/cjs/review/react/index.js.map +1 -1
  58. package/dist/cjs/review/react/useHeldSend.js +3 -4
  59. package/dist/cjs/review/react/useHeldSend.js.map +1 -1
  60. package/dist/cjs/review/react/useHeldWrite.d.ts.map +1 -1
  61. package/dist/cjs/review/react/useHeldWrite.js +2 -1
  62. package/dist/cjs/review/react/useHeldWrite.js.map +1 -1
  63. package/dist/cjs/review/react/useReviewedRun.d.ts +122 -0
  64. package/dist/cjs/review/react/useReviewedRun.d.ts.map +1 -0
  65. package/dist/cjs/review/react/useReviewedRun.js +443 -0
  66. package/dist/cjs/review/react/useReviewedRun.js.map +1 -0
  67. package/dist/cjs/review/receipt.d.ts +37 -1
  68. package/dist/cjs/review/receipt.d.ts.map +1 -1
  69. package/dist/cjs/review/receipt.js +76 -3
  70. package/dist/cjs/review/receipt.js.map +1 -1
  71. package/dist/cjs/review/relayr.d.ts +13 -4
  72. package/dist/cjs/review/relayr.d.ts.map +1 -1
  73. package/dist/cjs/review/relayr.js +52 -8
  74. package/dist/cjs/review/relayr.js.map +1 -1
  75. package/dist/cjs/review/relayrSend.d.ts +106 -0
  76. package/dist/cjs/review/relayrSend.d.ts.map +1 -0
  77. package/dist/cjs/review/relayrSend.js +795 -0
  78. package/dist/cjs/review/relayrSend.js.map +1 -0
  79. package/dist/cjs/review/reviewQueue.d.ts +10 -9
  80. package/dist/cjs/review/reviewQueue.d.ts.map +1 -1
  81. package/dist/cjs/review/reviewQueue.js +19 -29
  82. package/dist/cjs/review/reviewQueue.js.map +1 -1
  83. package/dist/cjs/review/reviewRequests.d.ts +86 -0
  84. package/dist/cjs/review/reviewRequests.d.ts.map +1 -0
  85. package/dist/cjs/review/reviewRequests.js +266 -0
  86. package/dist/cjs/review/reviewRequests.js.map +1 -0
  87. package/dist/cjs/review/safeRelayr.d.ts +3 -1
  88. package/dist/cjs/review/safeRelayr.d.ts.map +1 -1
  89. package/dist/cjs/review/safeRelayr.js +9 -9
  90. package/dist/cjs/review/safeRelayr.js.map +1 -1
  91. package/dist/cjs/review/safeSend.d.ts +69 -0
  92. package/dist/cjs/review/safeSend.d.ts.map +1 -0
  93. package/dist/cjs/review/safeSend.js +306 -0
  94. package/dist/cjs/review/safeSend.js.map +1 -0
  95. package/dist/cjs/review/send.d.ts +272 -0
  96. package/dist/cjs/review/send.d.ts.map +1 -0
  97. package/dist/cjs/review/send.js +1163 -0
  98. package/dist/cjs/review/send.js.map +1 -0
  99. package/dist/cjs/review/sequence.d.ts +77 -0
  100. package/dist/cjs/review/sequence.d.ts.map +1 -0
  101. package/dist/cjs/review/sequence.js +232 -0
  102. package/dist/cjs/review/sequence.js.map +1 -0
  103. package/dist/cjs/review/sign.d.ts +111 -0
  104. package/dist/cjs/review/sign.d.ts.map +1 -0
  105. package/dist/cjs/review/sign.js +378 -0
  106. package/dist/cjs/review/sign.js.map +1 -0
  107. package/dist/cjs/review/simulation.d.ts +41 -2
  108. package/dist/cjs/review/simulation.d.ts.map +1 -1
  109. package/dist/cjs/review/simulation.js +99 -29
  110. package/dist/cjs/review/simulation.js.map +1 -1
  111. package/dist/cjs/review/transaction-message.d.ts +13 -0
  112. package/dist/cjs/review/transaction-message.d.ts.map +1 -1
  113. package/dist/cjs/review/transaction-message.js +25 -0
  114. package/dist/cjs/review/transaction-message.js.map +1 -1
  115. package/dist/cjs/review/transactionReview.d.ts +27 -19
  116. package/dist/cjs/review/transactionReview.d.ts.map +1 -1
  117. package/dist/cjs/review/transactionReview.js +22 -63
  118. package/dist/cjs/review/transactionReview.js.map +1 -1
  119. package/dist/cjs/review/wallet.d.ts +98 -0
  120. package/dist/cjs/review/wallet.d.ts.map +1 -0
  121. package/dist/cjs/review/wallet.js +234 -0
  122. package/dist/cjs/review/wallet.js.map +1 -0
  123. package/dist/cjs/review/writeHold.d.ts +138 -13
  124. package/dist/cjs/review/writeHold.d.ts.map +1 -1
  125. package/dist/cjs/review/writeHold.js +98 -18
  126. package/dist/cjs/review/writeHold.js.map +1 -1
  127. package/dist/cjs/review/writeRecovery.d.ts +17 -1
  128. package/dist/cjs/review/writeRecovery.d.ts.map +1 -1
  129. package/dist/cjs/review/writeRecovery.js +146 -45
  130. package/dist/cjs/review/writeRecovery.js.map +1 -1
  131. package/dist/cjs/safeService.d.ts +27 -4
  132. package/dist/cjs/safeService.d.ts.map +1 -1
  133. package/dist/cjs/safeService.js +120 -3
  134. package/dist/cjs/safeService.js.map +1 -1
  135. package/dist/cjs/testing.d.ts +24 -0
  136. package/dist/cjs/testing.d.ts.map +1 -1
  137. package/dist/cjs/testing.js +26 -1
  138. package/dist/cjs/testing.js.map +1 -1
  139. package/dist/cjs/v6/defifa.d.ts.map +1 -1
  140. package/dist/cjs/v6/defifa.js +24 -23
  141. package/dist/cjs/v6/defifa.js.map +1 -1
  142. package/dist/cjs/v6/executionErrors.d.ts.map +1 -1
  143. package/dist/cjs/v6/executionErrors.js +3 -2
  144. package/dist/cjs/v6/executionErrors.js.map +1 -1
  145. package/dist/cjs/v6/pay.d.ts +25 -8
  146. package/dist/cjs/v6/pay.d.ts.map +1 -1
  147. package/dist/cjs/v6/pay.js +117 -23
  148. package/dist/cjs/v6/pay.js.map +1 -1
  149. package/dist/cjs/v6/suckers.d.ts +30 -0
  150. package/dist/cjs/v6/suckers.d.ts.map +1 -1
  151. package/dist/cjs/v6/suckers.js +69 -5
  152. package/dist/cjs/v6/suckers.js.map +1 -1
  153. package/dist/esm/actions/suckerPairs.d.ts +5 -3
  154. package/dist/esm/actions/suckerPairs.d.ts.map +1 -1
  155. package/dist/esm/actions/suckerPairs.js +7 -27
  156. package/dist/esm/actions/suckerPairs.js.map +1 -1
  157. package/dist/esm/pause.d.ts +2 -0
  158. package/dist/esm/pause.d.ts.map +1 -1
  159. package/dist/esm/pause.js +16 -0
  160. package/dist/esm/pause.js.map +1 -1
  161. package/dist/esm/review/confirm.d.ts +56 -0
  162. package/dist/esm/review/confirm.d.ts.map +1 -0
  163. package/dist/esm/review/confirm.js +93 -0
  164. package/dist/esm/review/confirm.js.map +1 -0
  165. package/dist/esm/review/contractWrite.d.ts +5 -3
  166. package/dist/esm/review/contractWrite.d.ts.map +1 -1
  167. package/dist/esm/review/contractWrite.js +10 -8
  168. package/dist/esm/review/contractWrite.js.map +1 -1
  169. package/dist/esm/review/decode.d.ts +19 -1
  170. package/dist/esm/review/decode.d.ts.map +1 -1
  171. package/dist/esm/review/decode.js +29 -14
  172. package/dist/esm/review/decode.js.map +1 -1
  173. package/dist/esm/review/decodeCall.d.ts +21 -0
  174. package/dist/esm/review/decodeCall.d.ts.map +1 -0
  175. package/dist/esm/review/decodeCall.js +180 -0
  176. package/dist/esm/review/decodeCall.js.map +1 -0
  177. package/dist/esm/review/heldWrite.d.ts +4 -0
  178. package/dist/esm/review/heldWrite.d.ts.map +1 -1
  179. package/dist/esm/review/heldWrite.js +34 -30
  180. package/dist/esm/review/heldWrite.js.map +1 -1
  181. package/dist/esm/review/index.d.ts +12 -1
  182. package/dist/esm/review/index.d.ts.map +1 -1
  183. package/dist/esm/review/index.js +12 -1
  184. package/dist/esm/review/index.js.map +1 -1
  185. package/dist/esm/review/intents.d.ts +10 -0
  186. package/dist/esm/review/intents.d.ts.map +1 -1
  187. package/dist/esm/review/intents.js +12 -0
  188. package/dist/esm/review/intents.js.map +1 -1
  189. package/dist/esm/review/lineError.d.ts +72 -0
  190. package/dist/esm/review/lineError.d.ts.map +1 -0
  191. package/dist/esm/review/lineError.js +68 -0
  192. package/dist/esm/review/lineError.js.map +1 -0
  193. package/dist/esm/review/messages.d.ts +15 -3
  194. package/dist/esm/review/messages.d.ts.map +1 -1
  195. package/dist/esm/review/messages.js +15 -3
  196. package/dist/esm/review/messages.js.map +1 -1
  197. package/dist/esm/review/model.d.ts +149 -0
  198. package/dist/esm/review/model.d.ts.map +1 -0
  199. package/dist/esm/review/model.js +746 -0
  200. package/dist/esm/review/model.js.map +1 -0
  201. package/dist/esm/review/plan.d.ts +61 -0
  202. package/dist/esm/review/plan.d.ts.map +1 -0
  203. package/dist/esm/review/plan.js +136 -0
  204. package/dist/esm/review/plan.js.map +1 -0
  205. package/dist/esm/review/react/index.d.ts +1 -0
  206. package/dist/esm/review/react/index.d.ts.map +1 -1
  207. package/dist/esm/review/react/index.js +1 -0
  208. package/dist/esm/review/react/index.js.map +1 -1
  209. package/dist/esm/review/react/useHeldSend.js +3 -4
  210. package/dist/esm/review/react/useHeldSend.js.map +1 -1
  211. package/dist/esm/review/react/useHeldWrite.d.ts.map +1 -1
  212. package/dist/esm/review/react/useHeldWrite.js +2 -1
  213. package/dist/esm/review/react/useHeldWrite.js.map +1 -1
  214. package/dist/esm/review/react/useReviewedRun.d.ts +122 -0
  215. package/dist/esm/review/react/useReviewedRun.d.ts.map +1 -0
  216. package/dist/esm/review/react/useReviewedRun.js +439 -0
  217. package/dist/esm/review/react/useReviewedRun.js.map +1 -0
  218. package/dist/esm/review/receipt.d.ts +37 -1
  219. package/dist/esm/review/receipt.d.ts.map +1 -1
  220. package/dist/esm/review/receipt.js +72 -2
  221. package/dist/esm/review/receipt.js.map +1 -1
  222. package/dist/esm/review/relayr.d.ts +13 -4
  223. package/dist/esm/review/relayr.d.ts.map +1 -1
  224. package/dist/esm/review/relayr.js +51 -8
  225. package/dist/esm/review/relayr.js.map +1 -1
  226. package/dist/esm/review/relayrSend.d.ts +106 -0
  227. package/dist/esm/review/relayrSend.d.ts.map +1 -0
  228. package/dist/esm/review/relayrSend.js +787 -0
  229. package/dist/esm/review/relayrSend.js.map +1 -0
  230. package/dist/esm/review/reviewQueue.d.ts +10 -9
  231. package/dist/esm/review/reviewQueue.d.ts.map +1 -1
  232. package/dist/esm/review/reviewQueue.js +17 -26
  233. package/dist/esm/review/reviewQueue.js.map +1 -1
  234. package/dist/esm/review/reviewRequests.d.ts +86 -0
  235. package/dist/esm/review/reviewRequests.d.ts.map +1 -0
  236. package/dist/esm/review/reviewRequests.js +263 -0
  237. package/dist/esm/review/reviewRequests.js.map +1 -0
  238. package/dist/esm/review/safeRelayr.d.ts +3 -1
  239. package/dist/esm/review/safeRelayr.d.ts.map +1 -1
  240. package/dist/esm/review/safeRelayr.js +9 -9
  241. package/dist/esm/review/safeRelayr.js.map +1 -1
  242. package/dist/esm/review/safeSend.d.ts +69 -0
  243. package/dist/esm/review/safeSend.d.ts.map +1 -0
  244. package/dist/esm/review/safeSend.js +301 -0
  245. package/dist/esm/review/safeSend.js.map +1 -0
  246. package/dist/esm/review/send.d.ts +272 -0
  247. package/dist/esm/review/send.d.ts.map +1 -0
  248. package/dist/esm/review/send.js +1156 -0
  249. package/dist/esm/review/send.js.map +1 -0
  250. package/dist/esm/review/sequence.d.ts +77 -0
  251. package/dist/esm/review/sequence.d.ts.map +1 -0
  252. package/dist/esm/review/sequence.js +223 -0
  253. package/dist/esm/review/sequence.js.map +1 -0
  254. package/dist/esm/review/sign.d.ts +111 -0
  255. package/dist/esm/review/sign.d.ts.map +1 -0
  256. package/dist/esm/review/sign.js +372 -0
  257. package/dist/esm/review/sign.js.map +1 -0
  258. package/dist/esm/review/simulation.d.ts +41 -2
  259. package/dist/esm/review/simulation.d.ts.map +1 -1
  260. package/dist/esm/review/simulation.js +95 -29
  261. package/dist/esm/review/simulation.js.map +1 -1
  262. package/dist/esm/review/transaction-message.d.ts +13 -0
  263. package/dist/esm/review/transaction-message.d.ts.map +1 -1
  264. package/dist/esm/review/transaction-message.js +23 -0
  265. package/dist/esm/review/transaction-message.js.map +1 -1
  266. package/dist/esm/review/transactionReview.d.ts +27 -19
  267. package/dist/esm/review/transactionReview.d.ts.map +1 -1
  268. package/dist/esm/review/transactionReview.js +19 -56
  269. package/dist/esm/review/transactionReview.js.map +1 -1
  270. package/dist/esm/review/wallet.d.ts +98 -0
  271. package/dist/esm/review/wallet.d.ts.map +1 -0
  272. package/dist/esm/review/wallet.js +227 -0
  273. package/dist/esm/review/wallet.js.map +1 -0
  274. package/dist/esm/review/writeHold.d.ts +138 -13
  275. package/dist/esm/review/writeHold.d.ts.map +1 -1
  276. package/dist/esm/review/writeHold.js +96 -19
  277. package/dist/esm/review/writeHold.js.map +1 -1
  278. package/dist/esm/review/writeRecovery.d.ts +17 -1
  279. package/dist/esm/review/writeRecovery.d.ts.map +1 -1
  280. package/dist/esm/review/writeRecovery.js +149 -48
  281. package/dist/esm/review/writeRecovery.js.map +1 -1
  282. package/dist/esm/safeService.d.ts +27 -4
  283. package/dist/esm/safeService.d.ts.map +1 -1
  284. package/dist/esm/safeService.js +119 -4
  285. package/dist/esm/safeService.js.map +1 -1
  286. package/dist/esm/testing.d.ts +24 -0
  287. package/dist/esm/testing.d.ts.map +1 -1
  288. package/dist/esm/testing.js +23 -1
  289. package/dist/esm/testing.js.map +1 -1
  290. package/dist/esm/v6/defifa.d.ts.map +1 -1
  291. package/dist/esm/v6/defifa.js +24 -23
  292. package/dist/esm/v6/defifa.js.map +1 -1
  293. package/dist/esm/v6/executionErrors.d.ts.map +1 -1
  294. package/dist/esm/v6/executionErrors.js +3 -2
  295. package/dist/esm/v6/executionErrors.js.map +1 -1
  296. package/dist/esm/v6/pay.d.ts +25 -8
  297. package/dist/esm/v6/pay.d.ts.map +1 -1
  298. package/dist/esm/v6/pay.js +115 -22
  299. package/dist/esm/v6/pay.js.map +1 -1
  300. package/dist/esm/v6/suckers.d.ts +30 -0
  301. package/dist/esm/v6/suckers.d.ts.map +1 -1
  302. package/dist/esm/v6/suckers.js +67 -5
  303. package/dist/esm/v6/suckers.js.map +1 -1
  304. 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;
@@ -686,6 +695,19 @@ function createBrowserWriteRecovery(input, options = {}) {
686
695
  function scopeAt(at) {
687
696
  return at === key ? keyOf : legacyScope;
688
697
  }
698
+ /**
699
+ * Set `flag` on the saved settlement with this (lowercase) hash: false when
700
+ * it was already set, true otherwise (another settlement stays as it is).
701
+ */
702
+ function flagSettled(store, hash, flag) {
703
+ const saved = JSON.parse(store.getItem(settledKey) ?? "null");
704
+ if (saved?.hash !== hash)
705
+ return true;
706
+ if (saved[flag] === true)
707
+ return false;
708
+ store.setItem(settledKey, JSON.stringify({ ...saved, [flag]: true }));
709
+ return true;
710
+ }
689
711
  function storage() {
690
712
  const store = recoveryStorage(options.storage);
691
713
  lastStorage = store;
@@ -707,7 +729,7 @@ function createBrowserWriteRecovery(input, options = {}) {
707
729
  }
708
730
  function requireLock() {
709
731
  if (!locked)
710
- throw new Error("Write recovery changes require the browser lock.");
732
+ throw new lineError_js_1.ReviewLineError("Write recovery changes require the browser lock.");
711
733
  }
712
734
  function read() {
713
735
  const store = storage();
@@ -719,7 +741,7 @@ function createBrowserWriteRecovery(input, options = {}) {
719
741
  const store = storage();
720
742
  store.setItem(at, raw);
721
743
  if (store.getItem(at) !== raw)
722
- throw new Error("Write recovery storage did not retain the action.");
744
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not retain the action.");
723
745
  }
724
746
  function clear(expected) {
725
747
  requireLock();
@@ -735,7 +757,7 @@ function createBrowserWriteRecovery(input, options = {}) {
735
757
  if (!current)
736
758
  return;
737
759
  if (JSON.stringify(current) !== JSON.stringify(recordOf(expected))) {
738
- throw new Error("Write recovery changed. Keep the current action pending.");
760
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
739
761
  }
740
762
  // The last record of an attempt goes only once its generation is the
741
763
  // committed latest marker; otherwise it stays, released, and carries it.
@@ -743,13 +765,13 @@ function createBrowserWriteRecovery(input, options = {}) {
743
765
  const marker = releasedKey(at, current.id);
744
766
  store.setItem(marker, "1");
745
767
  if (store.getItem(marker) !== "1")
746
- throw new Error("Write recovery storage did not clear the action.");
768
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
747
769
  unpersistedSubmissions.get(store)?.delete(at);
748
770
  return;
749
771
  }
750
772
  store.removeItem(at);
751
773
  if (store.getItem(at) !== null)
752
- throw new Error("Write recovery storage did not clear the action.");
774
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not clear the action.");
753
775
  unpersistedSubmissions.get(store)?.delete(at);
754
776
  }
755
777
  /** Add `fields` to exactly `expected`, a hashed record `when` allows; extra evidence only. */
@@ -777,6 +799,12 @@ function createBrowserWriteRecovery(input, options = {}) {
777
799
  const current = read();
778
800
  if (current?.id === owned.id && current.hash)
779
801
  return;
802
+ try {
803
+ storage().setItem(exitedKey(locate(storage()).at, owned.id), "1");
804
+ }
805
+ catch {
806
+ /* Unsaved, a sequence resumed over it asks for the user's check. */
807
+ }
780
808
  // Removing the record must not uncover a settlement of an earlier
781
809
  // attempt: unless this reservation is the verified latest, it stays as
782
810
  // released instead, which still invalidates that settlement.
@@ -832,13 +860,13 @@ function createBrowserWriteRecovery(input, options = {}) {
832
860
  function record(hash, expected, replace) {
833
861
  requireLock();
834
862
  if (!(0, untrusted_js_1.isBytes32)(hash))
835
- throw new Error("The wallet returned an invalid transaction identity.");
863
+ throw new lineError_js_1.ReviewLineError("The wallet returned an invalid transaction identity.");
836
864
  const previous = expected && recordOf(expected);
837
865
  const submittedHash = hash.toLowerCase();
838
866
  if (!previous ||
839
867
  keyOf(previous) !== key ||
840
868
  (!replace && previous.hash && previous.hash !== submittedHash)) {
841
- throw new Error("Write recovery changed before submission was recorded.");
869
+ throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
842
870
  }
843
871
  // A hash the wallet returns now starts its clock; a speed-up found at its nonce keeps it.
844
872
  const submittedAt = replace || previous.hash === submittedHash
@@ -875,7 +903,7 @@ function createBrowserWriteRecovery(input, options = {}) {
875
903
  submittedAt: undefined,
876
904
  }) ||
877
905
  (!replace && current.hash && current.hash !== submittedHash)) {
878
- throw new Error("Write recovery changed before submission was recorded.");
906
+ throw new lineError_js_1.ReviewLineError("Write recovery changed before submission was recorded.");
879
907
  }
880
908
  owned = recordOf(submitted);
881
909
  if (current.hash !== submittedHash) {
@@ -909,15 +937,15 @@ function createBrowserWriteRecovery(input, options = {}) {
909
937
  ? normalized({ ...reviewed, call: actualCall })
910
938
  : reviewed;
911
939
  if (legacyScope(actual) !== legacyScope(reviewed))
912
- throw new Error("The adopted write has a different recovery scope.");
940
+ throw new lineError_js_1.ReviewLineError("The adopted write has a different recovery scope.");
913
941
  const nonce = evidence && (0, untrusted_js_1.uint256)(evidence.nonce);
914
942
  const fromBlock = evidence && (0, untrusted_js_1.uint256)(evidence.blockNumber);
915
943
  if (evidence && (nonce === null || fromBlock === null))
916
- throw new Error("Invalid write recovery nonce evidence.");
944
+ throw new lineError_js_1.ReviewLineError("Invalid write recovery nonce evidence.");
917
945
  const store = storage();
918
946
  const { at, raw } = locate(store);
919
947
  if (readRecovery(store, at, raw, scopeAt(at)))
920
- throw new Error("An earlier wallet write is still unresolved. Check it before trying again.");
948
+ throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
921
949
  // The record this one replaces, if the user released it: its marker goes too.
922
950
  let replaced;
923
951
  try {
@@ -956,6 +984,7 @@ function createBrowserWriteRecovery(input, options = {}) {
956
984
  if (typeof replaced === "string" && replaced !== record.id)
957
985
  try {
958
986
  store.removeItem(releasedKey(key, replaced));
987
+ store.removeItem(exitedKey(key, replaced));
959
988
  }
960
989
  catch {
961
990
  /* A leftover marker names only the old record. */
@@ -988,7 +1017,7 @@ function createBrowserWriteRecovery(input, options = {}) {
988
1017
  requireLock();
989
1018
  const current = read();
990
1019
  if (current && current.mirrorOf !== of)
991
- throw new Error("An earlier wallet write is still unresolved. Check it before trying again.");
1020
+ throw new lineError_js_1.ReviewLineError("An earlier wallet write is still unresolved. Check it before trying again.");
992
1021
  const mirrored = recordOf({
993
1022
  version: 1,
994
1023
  id: source.id,
@@ -1028,6 +1057,16 @@ function createBrowserWriteRecovery(input, options = {}) {
1028
1057
  return undefined;
1029
1058
  }
1030
1059
  },
1060
+ /** Whether the record `id` ended by the user's exit, or because nothing was sent. */
1061
+ released(id) {
1062
+ try {
1063
+ const store = storage();
1064
+ return store.getItem(exitedKey(locate(store).at, id)) !== null;
1065
+ }
1066
+ catch {
1067
+ return false;
1068
+ }
1069
+ },
1031
1070
  /**
1032
1071
  * The call's latest reservation id: the record saved at the key (held,
1033
1072
  * or released by its exit), or else the saved latest marker.
@@ -1091,6 +1130,10 @@ function createBrowserWriteRecovery(input, options = {}) {
1091
1130
  id: expected.id,
1092
1131
  result: settlement.result,
1093
1132
  hash: settlement.hash.toLowerCase(),
1133
+ ...(settlement.blockHash
1134
+ ? { blockHash: settlement.blockHash.toLowerCase() }
1135
+ : {}),
1136
+ ...(settlement.safe ? { safe: true } : {}),
1094
1137
  at: Date.now(),
1095
1138
  }));
1096
1139
  }
@@ -1104,17 +1147,29 @@ function createBrowserWriteRecovery(input, options = {}) {
1104
1147
  */
1105
1148
  acknowledgeSettled(settled) {
1106
1149
  requireLock();
1107
- const store = storage();
1108
1150
  try {
1109
- const raw = store.getItem(settledKey);
1110
- const saved = JSON.parse(raw ?? "null");
1111
- if (saved?.hash === settled.hash.toLowerCase())
1112
- store.setItem(settledKey, JSON.stringify({ ...saved, acknowledged: true }));
1151
+ flagSettled(storage(), settled.hash.toLowerCase(), "acknowledged");
1113
1152
  }
1114
1153
  catch {
1115
1154
  /* An unreadable settlement names none; a refused write keeps it unacknowledged. */
1116
1155
  }
1117
1156
  },
1157
+ /**
1158
+ * Claim the one `onConfirmed` notice of the saved settlement `settled`
1159
+ * names (its hash): true for the first claim in any tab or run, false
1160
+ * after. A settlement no longer saved there can't be marked, so every
1161
+ * claim of it is true: a repeated notice over a lost one.
1162
+ */
1163
+ claimConfirmedSettled(settled) {
1164
+ requireLock();
1165
+ try {
1166
+ return flagSettled(storage(), settled.hash.toLowerCase(), "confirmed");
1167
+ }
1168
+ catch {
1169
+ // Storage unavailable: told rather than lost.
1170
+ return true;
1171
+ }
1172
+ },
1118
1173
  /**
1119
1174
  * How the call's last write ended, if {@link markSettled} saved it for
1120
1175
  * the call's latest reservation; a settlement of an earlier one reads as
@@ -1138,6 +1193,10 @@ function createBrowserWriteRecovery(input, options = {}) {
1138
1193
  ? {
1139
1194
  result: saved.result,
1140
1195
  hash: saved.hash,
1196
+ ...((0, untrusted_js_1.isBytes32)(saved.blockHash)
1197
+ ? { blockHash: saved.blockHash }
1198
+ : {}),
1199
+ ...(saved.safe === true ? { safe: true } : {}),
1141
1200
  // Saved before 2.39 (a latest marker with no time): the user
1142
1201
  // saw it then, so it reads as acknowledged.
1143
1202
  ...(saved.acknowledged === true || typeof latest.at !== "number"
@@ -1288,7 +1347,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1288
1347
  executed(expected, executionHash) {
1289
1348
  requireLock();
1290
1349
  if (executionHash !== undefined && !(0, untrusted_js_1.isBytes32)(executionHash))
1291
- throw new Error("Invalid execution transaction identity.");
1350
+ throw new lineError_js_1.ReviewLineError("Invalid execution transaction identity.");
1292
1351
  const store = storage();
1293
1352
  const { at, raw } = locate(store);
1294
1353
  const current = readRecovery(store, at, raw, scopeAt(at));
@@ -1296,7 +1355,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1296
1355
  if (!current?.hash ||
1297
1356
  current.id !== wanted.id ||
1298
1357
  current.hash !== wanted.hash)
1299
- throw new Error("Write recovery changed. Keep the current action pending.");
1358
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
1300
1359
  const next = recordOf({
1301
1360
  ...current,
1302
1361
  executed: true,
@@ -1335,7 +1394,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1335
1394
  */
1336
1395
  abandon(expected, acknowledgement) {
1337
1396
  if (acknowledgement?.checkedWallet !== true)
1338
- throw new Error("Release a held write only after the user confirms they checked their wallet.");
1397
+ throw new lineError_js_1.ReviewLineError("Release a held write only after the user confirms they checked their wallet.");
1339
1398
  const wanted = JSON.stringify(recordOf(expected));
1340
1399
  const store = storage();
1341
1400
  const { at, raw } = locate(store);
@@ -1343,15 +1402,21 @@ function createBrowserWriteRecovery(input, options = {}) {
1343
1402
  if (!durable)
1344
1403
  return;
1345
1404
  if (durable.executed)
1346
- throw new Error("This write ran onchain. Keep it held until its result is known.");
1405
+ throw new lineError_js_1.ReviewLineError("This write ran onchain. Keep it held until its result is known.");
1347
1406
  const shown = readRecovery(store, at, raw, scopeAt(at));
1348
1407
  if (JSON.stringify(durable) !== wanted &&
1349
1408
  JSON.stringify(shown) !== wanted)
1350
- throw new Error("Write recovery changed. Keep the current action pending.");
1409
+ throw new lineError_js_1.ReviewLineError("Write recovery changed. Keep the current action pending.");
1351
1410
  const marker = releasedKey(at, durable.id);
1411
+ try {
1412
+ store.setItem(exitedKey(at, durable.id), "1");
1413
+ }
1414
+ catch {
1415
+ /* Unsaved, a sequence resumed over it asks for the user's check. */
1416
+ }
1352
1417
  store.setItem(marker, "1");
1353
1418
  if (store.getItem(marker) !== "1")
1354
- throw new Error("Write recovery storage did not release the action.");
1419
+ throw new lineError_js_1.ReviewLineError("Write recovery storage did not release the action.");
1355
1420
  const memory = unpersistedSubmissions.get(store);
1356
1421
  if (memory?.get(at)?.id === durable.id)
1357
1422
  memory.delete(at);
@@ -1362,7 +1427,7 @@ function createBrowserWriteRecovery(input, options = {}) {
1362
1427
  const locks = options.locks ?? browserLocks();
1363
1428
  return locks.request(key, { mode: "exclusive", ...(!wait && { ifAvailable: true }) }, async (lock) => {
1364
1429
  if (!lock)
1365
- throw new Error("This wallet action is already open in another tab.");
1430
+ throw new lineError_js_1.ReviewLineError("This wallet action is already open in another tab.");
1366
1431
  locked = true;
1367
1432
  try {
1368
1433
  return await work();
@@ -1520,7 +1585,13 @@ function heldBatch(record) {
1520
1585
  : null;
1521
1586
  return inner && inner.map((call) => normalized({ ...record, call }).call);
1522
1587
  }
1523
- /** Whether `transaction` is the Safe's execTransaction of exactly the held batch: its MultiSend target, calldata, zero value and DELEGATECALL. */
1588
+ /**
1589
+ * The MultiSend targets a held batch may run through: a Safe app folds the
1590
+ * same calls into its own version's MultiSendCallOnly, so any recognized
1591
+ * deployment carries exactly the held calldata.
1592
+ */
1593
+ const BATCH_TARGETS = safe_js_1.MULTI_SEND_CALL_ONLY_DEPLOYMENTS.map((to) => to.toLowerCase());
1594
+ /** Whether `transaction` is the Safe's execTransaction of exactly the held batch: a recognized MultiSendCallOnly, its calldata, zero value and DELEGATECALL. */
1524
1595
  function runsHeldBatch(transaction, record) {
1525
1596
  try {
1526
1597
  const { functionName, args } = (0, viem_1.decodeFunctionData)({
@@ -1530,7 +1601,7 @@ function runsHeldBatch(transaction, record) {
1530
1601
  if (functionName !== "execTransaction")
1531
1602
  return false;
1532
1603
  const [to, value, data, operation] = args;
1533
- return (to.toLowerCase() === record.call.to &&
1604
+ return (BATCH_TARGETS.includes(to.toLowerCase()) &&
1534
1605
  value === 0n &&
1535
1606
  data.toLowerCase() === record.call.data &&
1536
1607
  operation === 1);
@@ -1556,13 +1627,14 @@ function heldSafeProposal(input, nonce) {
1556
1627
  */
1557
1628
  function safeProposalIsHeldCall(proposal, input) {
1558
1629
  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
- });
1630
+ const call = { ...record.call, value: BigInt(record.call.value) };
1631
+ return heldBatch({ ...record, version: 1, id: "" })
1632
+ ? BATCH_TARGETS.some((to) => (0, safeService_js_1.safeTransactionMatchesCall)(proposal, {
1633
+ ...call,
1634
+ to: to,
1635
+ operation: 1,
1636
+ }))
1637
+ : (0, safeService_js_1.safeTransactionMatchesCall)(proposal, call);
1566
1638
  }
1567
1639
  /**
1568
1640
  * Authenticate the saved wallet identity, canonical inclusion and Safe effect.
@@ -1576,7 +1648,7 @@ function safeProposalIsHeldCall(proposal, input) {
1576
1648
  */
1577
1649
  async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { finality = true } = {}) {
1578
1650
  const record = recordOf(saved);
1579
- const pending = () => new Error("The saved wallet write is not yet proven. Keep this action pending.");
1651
+ const pending = () => new lineError_js_1.ReviewLineError("The saved wallet write is not yet proven. Keep this action pending.");
1580
1652
  // A batch hold's call is its MultiSend: its proof is the calls it encodes.
1581
1653
  const batch = heldBatch(record);
1582
1654
  let calls = batch ?? [record.call];
@@ -1663,6 +1735,35 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
1663
1735
  throw pending();
1664
1736
  status = result.status;
1665
1737
  }
1738
+ else if (status === "success" && (0, safeService_js_1.isSafeExecTransaction)(record.call.data)) {
1739
+ // A Safe's execTransaction succeeds only with the Safe's own
1740
+ // ExecutionSuccess for its exact hash: an ExecutionFailure, or no event
1741
+ // for it, is a failure whatever the receipt's status. A call that only
1742
+ // shares the selector, to anything but a Safe, is decided as any other.
1743
+ if (!client.request)
1744
+ throw pending();
1745
+ const { request } = client;
1746
+ const at = (blockNumber) => blockNumber === undefined ? "latest" : (0, viem_1.numberToHex)(blockNumber);
1747
+ // Every read through the one `request` the receipt client has.
1748
+ const identity = await (0, safe_js_1.readAuthorityIdentity)({
1749
+ request,
1750
+ getCode: ({ address, blockNumber }) => request({
1751
+ method: "eth_getCode",
1752
+ params: [address, at(blockNumber)],
1753
+ }),
1754
+ getStorageAt: ({ address, slot, blockNumber }) => request({
1755
+ method: "eth_getStorageAt",
1756
+ params: [address, slot, at(blockNumber)],
1757
+ }),
1758
+ }, record.call.to, { blockNumber: canonical.blockNumber });
1759
+ if (!identity)
1760
+ throw pending();
1761
+ if (identity.kind === "safe") {
1762
+ const execution = await (0, safeService_js_1.safeExecTransactionResult)({ request: client.request }, record.chainId, record.call.to, record.call.data, canonical);
1763
+ if (execution?.status !== "success")
1764
+ status = "failed";
1765
+ }
1766
+ }
1666
1767
  const isCanonical = async () => {
1667
1768
  const block = await client.getBlock({ blockNumber: canonical.blockNumber });
1668
1769
  return (block.number === canonical.blockNumber &&
@@ -1683,7 +1784,7 @@ async function verifyReviewedWriteReceipt(client, saved, receipt, proof, { final
1683
1784
  */
1684
1785
  async function verifyReviewedWriteExpiry(client, saved, service) {
1685
1786
  const record = recordOf(saved);
1686
- const pending = () => new Error("The saved Safe proposal is not proven expired. Keep this action pending.");
1787
+ const pending = () => new lineError_js_1.ReviewLineError("The saved Safe proposal is not proven expired. Keep this action pending.");
1687
1788
  if (!record.safe ||
1688
1789
  !record.hash ||
1689
1790
  (await client.getChainId()) !== record.chainId)